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

Update vertexLib.py

Browse files
Files changed (1) hide show
  1. vertexLib.py +85 -68
vertexLib.py CHANGED
@@ -2,6 +2,7 @@ import json
2
  import time
3
  import requests
4
  import jwt
 
5
 
6
  # ─────────────────────────────────────────
7
  # 1. GCP μ„œλΉ„μŠ€κ³„μ • μ•‘μ„ΈμŠ€ 토큰
@@ -21,7 +22,7 @@ def get_access_token(client_email, private_key):
21
  try:
22
  signed_jwt = jwt.encode(claims, private_key, algorithm="RS256")
23
  except Exception as e:
24
- return False, e
25
 
26
  response = requests.post(
27
  "https://oauth2.googleapis.com/token",
@@ -33,8 +34,7 @@ def get_access_token(client_email, private_key):
33
 
34
  if response.status_code == 200:
35
  return True, response.json()["access_token"]
36
- else:
37
- return False, response.text
38
 
39
 
40
  # ─────────────────────────────────────────
@@ -48,112 +48,100 @@ def get_access_token_refresh(client_id, client_secret, refresh_token):
48
  "refresh_token": refresh_token,
49
  "grant_type": "refresh_token",
50
  }
51
-
52
- response = requests.post(token_url, data=data)
53
-
54
- if response.status_code == 200:
55
- return True, response.json()["access_token"]
56
- else:
57
- return False, response.text
58
 
59
 
60
  # ─────────────────────────────────────────
61
- # 3. (선택) λͺ¨λΈ λͺ©λ‘ 쑰회 – μ΅œλŒ€ 10개만 λ°˜ν™˜
62
  # ─────────────────────────────────────────
63
- def get_gemini_models(key, max_return: int = 1):
64
- """
65
- λͺ¨λΈμ΄ λ„ˆλ¬΄ λ§Žμ•„ 가독성이 λ–¨μ–΄μ§€λ―€λ‘œ,
66
- 기본적으둜 10κ°œκΉŒμ§€λ§Œ λ°˜ν™˜ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” 개수둜 μš”μ•½.
67
- """
68
- url = f"https://generativelanguage.googleapis.com/v1beta/models?key={key}&pageSize=1000"
69
- response = requests.get(url)
70
-
71
- if response.status_code != 200:
72
  return ""
73
-
74
- models = response.json().get("models", [])
75
  names = [m["name"].split("/")[1] for m in models]
76
- #if len(names) > max_return:
77
- # return names[:max_return] + [f"...(+{len(names)-max_return})"]
78
- return None
79
 
80
 
81
  # ─────────────────────────────────────────
82
- # 4. β€œλ”λ―Έβ€ μš”μ²­μœΌλ‘œ ν‚€ μƒνƒœλ§Œ νŒλ³„
83
  # ─────────────────────────────────────────
84
- def send_fake_gemini_request(key, model: str = "gemini-1.5-flash"):
85
  """
86
- ν”„λ‘¬ν”„νŠΈλ₯Ό 빈 λ¬Έμžμ—΄λ‘œ 보내 κ°„λ‹¨νžˆ ν‚€ μœ νš¨μ„±μ„ 체크.
87
- λ°˜ν™˜κ°’: error dict | '' | None
 
 
 
88
  """
89
- url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={key}"
 
 
 
 
 
 
 
 
 
 
90
  payload = {
91
  "contents": [{"role": "user", "parts": [{"text": ""}]}],
92
  "generationConfig": {"maxOutputTokens": 0},
93
  }
94
  try:
95
  resp = requests.post(url, headers={"Content-Type": "application/json"}, json=payload)
96
- return resp.json().get("error", "")
97
  except Exception:
98
- return None
99
-
100
-
101
- def check_key_gemini_availability(key):
102
- """
103
- β–Ά λ°˜ν™˜: (bool, str)
104
- β€’ (True, 'ok') : ν‚€ 유효, μ‚¬μš© κ°€λŠ₯
105
- β€’ (False, 'exceed') : quota / rate-limit 초과
106
- β€’ (False, 'invalid') : 잘λͺ»λœ ν‚€ ν˜Ήμ€ κΆŒν•œ μ—†μŒ
107
- β€’ (False, 'error') : 기타 λ„€νŠΈμ›Œν¬/μ•Œ 수 μ—†λŠ” 였λ₯˜
108
- """
109
- err = send_fake_gemini_request(key)
110
-
111
- # λ„€νŠΈμ›Œν¬ μ‹€νŒ¨
112
- if err is None:
113
  return False, "error"
114
 
115
- # μ—λŸ¬ ν•„λ“œκ°€ μ—†μœΌλ©΄ 정상
116
- if err == "":
117
  return True, "ok"
118
 
119
- # μ—λŸ¬ 객체 뢄석
120
  code = err.get("code", 0)
121
  status = err.get("status", "")
122
-
123
- # 빈 ν”„λ‘¬ν”„νŠΈ λ•Œλ¬Έμ— INVALID_ARGUMENTκ°€ λœ¨λŠ” 경우 β†’ ν‚€λŠ” 정상
124
  if status == "INVALID_ARGUMENT":
125
  return True, "ok"
126
-
127
- # quota 초과
128
  if code == 429 or status == "RESOURCE_EXHAUSTED":
129
  return False, "exceed"
130
-
131
- # κΆŒν•œ/인증 문제
132
  if code in (401, 403) or status in ("PERMISSION_DENIED", "UNAUTHENTICATED"):
133
  return False, "invalid"
134
-
135
- # 기타
136
  return False, "error"
137
 
138
 
139
  # ─────────────────────────────────────────
140
- # 5. μ‹€μ œ Gemini μš”μ²­
141
  # ─────────────────────────────────────────
142
  def send_gemini_request(key, payload, model: str = "gemini-1.5-flash"):
143
- url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={key}"
 
 
 
144
  resp = requests.post(url, headers={"Content-Type": "application/json"}, json=payload)
145
-
146
  if resp.status_code == 200:
147
  return True, resp.json()
148
- else:
149
- return False, resp.text
150
 
151
 
152
  # ─────────────────────────────────────────
153
- # 6. Vertex AI (Anthropic) μš”μ²­ – 비동기
154
  # ─────────────────────────────────────────
155
  async def send_gcp_request(
156
- session, project_id, access_token, payload, region="us-east5", model="claude-3-5-sonnet@20240620"
 
 
 
 
 
157
  ):
158
  VERTEX_URL = (
159
  f"https://{region}-aiplatform.googleapis.com/v1/projects/"
@@ -163,8 +151,37 @@ async def send_gcp_request(
163
  "Authorization": f"Bearer {access_token}",
164
  "Content-Type": "application/json; charset=utf-8",
165
  }
 
 
 
 
166
 
167
- async with session.post(url=VERTEX_URL, headers=headers, data=payload) as response:
168
- if response.status != 200:
169
- return json.loads(await response.text())
170
- return await response.json()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  import time
3
  import requests
4
  import jwt
5
+ import asyncio
6
 
7
  # ─────────────────────────────────────────
8
  # 1. GCP μ„œλΉ„μŠ€κ³„μ • μ•‘μ„ΈμŠ€ 토큰
 
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",
 
34
 
35
  if response.status_code == 200:
36
  return True, response.json()["access_token"]
37
+ return False, response.text
 
38
 
39
 
40
  # ─────────────────────────────────────────
 
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/"
 
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))