prxyasd commited on
Commit
e7f1495
Β·
verified Β·
1 Parent(s): 5249897

Update vertexLib.py

Browse files
Files changed (1) hide show
  1. vertexLib.py +74 -152
vertexLib.py CHANGED
@@ -2,186 +2,108 @@ import json
2
  import time
3
  import requests
4
  import jwt
5
- import asyncio
6
 
7
- # ─────────────────────────────────────────
8
- # 1. GCP μ„œλΉ„μŠ€κ³„μ • μ•‘μ„ΈμŠ€ 토큰
9
- # ─────────────────────────────────────────
10
  def get_access_token(client_email, private_key):
11
  current_time = int(time.time())
12
- expiration_time = current_time + 600 # 10 λΆ„
13
-
14
  claims = {
15
- "iss": client_email,
16
- "scope": "https://www.googleapis.com/auth/cloud-platform",
17
- "aud": "https://oauth2.googleapis.com/token",
18
- "exp": expiration_time,
19
- "iat": current_time,
20
  }
21
-
22
  try:
23
- signed_jwt = jwt.encode(claims, private_key, algorithm="RS256")
 
 
 
 
24
  except Exception as e:
25
- return False, str(e)
26
-
27
  response = requests.post(
28
- "https://oauth2.googleapis.com/token",
29
  data={
30
- "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
31
- "assertion": signed_jwt,
32
- },
33
  )
34
 
35
  if response.status_code == 200:
36
- return True, response.json()["access_token"]
37
- return False, response.text
 
38
 
39
-
40
- # ─────────────────────────────────────────
41
- # 2. GCP refresh-token μ•‘μ„ΈμŠ€ 토큰
42
- # ─────────────────────────────────────────
43
  def get_access_token_refresh(client_id, client_secret, refresh_token):
44
  token_url = "https://oauth2.googleapis.com/token"
 
45
  data = {
46
  "client_id": client_id,
47
  "client_secret": client_secret,
48
  "refresh_token": refresh_token,
49
- "grant_type": "refresh_token",
50
  }
51
- resp = requests.post(token_url, data=data)
52
- if resp.status_code == 200:
53
- return True, resp.json()["access_token"]
54
- return False, resp.text
55
 
 
56
 
57
- # ─────────────────────────────────────────
58
- # 3. Gemini λͺ¨λΈ λͺ©λ‘ (ν•„μš” μ‹œ 10κ°œκΉŒμ§€λ§Œ)
59
- # ─────────────────────────────────────────
60
- def get_gemini_models(key, max_return: int = 10):
61
- url = (
62
- "https://generativelanguage.googleapis.com/v1beta/models"
63
- f"?key={key}&pageSize=1000"
64
- )
65
- resp = requests.get(url)
66
- if resp.status_code != 200:
67
- return ""
68
- models = resp.json().get("models", [])
69
- names = [m["name"].split("/")[1] for m in models]
70
- if len(names) > max_return:
71
- return names[:max_return] + [f"...(+{len(names)-max_return})"]
72
- return names
73
-
74
 
75
- # ─────────────────────────────────────────
76
- # 4. Gemini ν‚€ 간단 μƒνƒœ 체크
77
- # ─────────────────────────────────────────
78
- def check_key_gemini_availability(key):
79
- """
80
- λ°˜ν™˜κ°’: (bool, str)
81
- β€’ True, 'ok' : 정상
82
- β€’ False, 'exceed' : μ‚¬μš©λŸ‰/μΏΌν„° 초과
83
- β€’ False, 'invalid' : 잘λͺ»λœ ν‚€/κΆŒν•œ μ—†μŒ
84
- β€’ False, 'error' : 기타 였λ₯˜
85
- """
86
- # 방법 1) λͺ¨λΈ λͺ©λ‘ μ‹œλ„
87
- model_list = get_gemini_models(key, 1)
88
- if model_list != "":
89
- return True, "ok"
90
 
91
- # 방법 2) 더미 μš”μ²­ μ‹œλ„
92
- url = (
93
- "https://generativelanguage.googleapis.com/v1beta/models/"
94
- "gemini-1.5-flash:generateContent"
95
- f"?key={key}"
96
- )
97
  payload = {
98
- "contents": [{"role": "user", "parts": [{"text": ""}]}],
99
- "generationConfig": {"maxOutputTokens": 0},
 
 
100
  }
101
  try:
102
- resp = requests.post(url, headers={"Content-Type": "application/json"}, json=payload)
103
- except Exception:
104
- return False, "error"
105
-
106
- if resp.status_code == 200:
107
- return True, "ok"
108
-
109
- err = resp.json().get("error", {})
110
- code = err.get("code", 0)
111
- status = err.get("status", "")
112
- if status == "INVALID_ARGUMENT":
113
- return True, "ok"
114
- if code == 429 or status == "RESOURCE_EXHAUSTED":
115
- return False, "exceed"
116
- if code in (401, 403) or status in ("PERMISSION_DENIED", "UNAUTHENTICATED"):
117
- return False, "invalid"
118
- return False, "error"
119
-
120
-
121
- # ─────────────────────────────────────────
122
- # 5. Gemini μ‹€μ œ μš”μ²­ (ν•„μš” μ‹œ)
123
- # ─────────────────────────────────────────
124
- def send_gemini_request(key, payload, model: str = "gemini-1.5-flash"):
125
- url = (
126
- "https://generativelanguage.googleapis.com/v1beta/models/"
127
- f"{model}:generateContent?key={key}"
128
- )
129
- resp = requests.post(url, headers={"Content-Type": "application/json"}, json=payload)
130
- if resp.status_code == 200:
131
- return True, resp.json()
132
- return False, resp.text
133
-
134
 
135
- # ─────────────────────────────────────────
136
- # 6. Vertex AI (Anthropic) 비동기 μš”μ²­
137
- # ─────────────────────────────────────────
138
- async def send_gcp_request(
139
- session,
140
- project_id,
141
- access_token,
142
- payload,
143
- region="us-east5",
144
- model="claude-3-5-sonnet@20240620",
145
- ):
146
- VERTEX_URL = (
147
- f"https://{region}-aiplatform.googleapis.com/v1/projects/"
148
- f"{project_id}/locations/{region}/publishers/anthropic/models/{model}:streamRawPredict"
149
- )
150
  headers = {
151
- "Authorization": f"Bearer {access_token}",
152
- "Content-Type": "application/json; charset=utf-8",
153
  }
154
- async with session.post(url=VERTEX_URL, headers=headers, data=payload) as resp:
155
- if resp.status != 200:
156
- return json.loads(await resp.text())
157
- return await resp.json()
158
-
159
-
160
- # ─────────────────────────────────────────
161
- # 7. 닀쀑 ν‚€ 간단 검사 μ˜ˆμ‹œ ν•¨μˆ˜
162
- # ─────────────────────────────────────────
163
- async def quick_check(keys: list[str]):
164
- """
165
- 인자둜 받은 킀듀을 Google Gemini 킀라고 κ°€μ •ν•˜κ³ 
166
- (key, availability, status) 3-ν•„λ“œ 리슀트 λ°˜ν™˜.
167
- ν•„μš”ν•˜λ‹€λ©΄ μ—¬κΈ°μ„œ λ‹€λ₯Έ ν΄λΌμš°λ“œ 체크 루틴을 ν˜ΈμΆœν•˜λ„λ‘ ν™•μž₯.
168
- """
169
- results = []
170
- for k in keys:
171
- ok, st = check_key_gemini_availability(k.strip())
172
- results.append({"key": k.strip(), "availability": ok, "status": st})
173
- return results
174
-
175
 
176
- # ─────────────────────────────────────────
177
- # 8. 단독 μ‹€ν–‰ ν…ŒμŠ€νŠΈ
178
- # ─────────────────────────────────────────
179
- if __name__ == "__main__":
180
- # μ˜ˆμ‹œ ν‚€ λͺ©λ‘ (각자 보유 ν‚€λ‘œ ꡐ체)
181
- test_keys = [
182
- "AIzaSyExampleINVALIDKEY_for_demo1",
183
- "AIzaSyExampleINVALIDKEY_for_demo2",
184
- ]
185
- # 동기 μ‹€ν–‰ μ˜ˆμ‹œ
186
- final = asyncio.run(quick_check(test_keys))
187
- print(json.dumps(final, indent=2, ensure_ascii=False))
 
2
  import time
3
  import requests
4
  import jwt
 
5
 
 
 
 
6
  def get_access_token(client_email, private_key):
7
  current_time = int(time.time())
8
+ expiration_time = current_time + 600
9
+
10
  claims = {
11
+ 'iss': client_email,
12
+ 'scope': 'https://www.googleapis.com/auth/cloud-platform',
13
+ 'aud': 'https://oauth2.googleapis.com/token',
14
+ 'exp': expiration_time,
15
+ 'iat': current_time
16
  }
17
+
18
  try:
19
+ signed_jwt = jwt.encode(
20
+ claims,
21
+ private_key,
22
+ algorithm='RS256'
23
+ )
24
  except Exception as e:
25
+ return False, e
26
+
27
  response = requests.post(
28
+ 'https://oauth2.googleapis.com/token',
29
  data={
30
+ 'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
31
+ 'assertion': signed_jwt
32
+ }
33
  )
34
 
35
  if response.status_code == 200:
36
+ return True, response.json()['access_token']
37
+ else:
38
+ return False, response.text
39
 
 
 
 
 
40
  def get_access_token_refresh(client_id, client_secret, refresh_token):
41
  token_url = "https://oauth2.googleapis.com/token"
42
+
43
  data = {
44
  "client_id": client_id,
45
  "client_secret": client_secret,
46
  "refresh_token": refresh_token,
47
+ "grant_type": "refresh_token"
48
  }
 
 
 
 
49
 
50
+ response = requests.post(token_url, data=data)
51
 
52
+ if response.status_code == 200:
53
+ return True, response.json()["access_token"]
54
+ else:
55
+ return False, response.text
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
+ def get_gemini_models(key):
58
+ url_getListModel = f"https://generativelanguage.googleapis.com/v1beta/models?key={key}&pageSize=1000"
59
+ response = requests.get(url_getListModel)
60
+
61
+ if response.status_code == 200:
62
+ models = response.json()
63
+ model_list = []
64
+ for model in models['models']:
65
+ #model_list[model['name'].split('/')[1]] = model['displayName']
66
+ model_name = f"{model['name'].split('/')[1]}" # ({model['displayName']})"
67
+ model_list.append(model_name)
68
+ return model_list
69
+ else:
70
+ return ""
 
71
 
72
+ def send_fake_gemini_request(key, model='gemini-1.5-flash'):
73
+ url = f'https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={key}'
 
 
 
 
74
  payload = {
75
+ "contents": [{ "role": "user", "parts": [{ "text": "" }] }],
76
+ "generationConfig": {
77
+ "maxOutputTokens": 0,
78
+ }
79
  }
80
  try:
81
+ response = requests.post(url=url, headers={'Content-Type': 'application/json'}, json=payload)
82
+ err_msg = response.json().get('error', '')
83
+ return err_msg
84
+ except:
85
+ return None
86
+
87
+ def send_gemini_request(key, payload, model='gemini-1.5-flash'):
88
+ url = f'https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={key}'
89
+
90
+ response = requests.post(url=url, headers={'Content-Type': 'application/json'}, json=payload)
91
+
92
+ if response.status_code == 200:
93
+ return True, response.json()
94
+ else:
95
+ return False, response.text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
+ async def send_gcp_request(session, project_id, access_token, payload, region='us-east5', model='claude-3-5-sonnet@20240620'):
98
+ VERTEX_URL = f'https://{region}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{region}/publishers/anthropic/models/{model}:streamRawPredict'
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  headers = {
100
+ 'Authorization': f'Bearer {access_token}',
101
+ 'Content-Type': 'application/json; charset=utf-8'
102
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
+ async with session.post(url=VERTEX_URL, headers=headers, data=payload) as response:
105
+ if response.status != 200:
106
+ response_data = await response.text()
107
+ return json.loads(response_data)
108
+
109
+ return await response.json()