prxyasd commited on
Commit
16d445c
Β·
verified Β·
1 Parent(s): ced52ae

Update vertexLib.py

Browse files
Files changed (1) hide show
  1. vertexLib.py +116 -82
vertexLib.py CHANGED
@@ -2,108 +2,142 @@ import json
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()
 
2
  import time
3
  import requests
4
  import jwt
5
+ import aiohttp
6
 
7
+
8
+ # ─────────────────────────────────────────
9
+ # 곡톡: 응닡을 μ„Έ κ°€μ§€λ‘œ μΆ•μ•½ν•΄μ„œ ν‘œμ‹œ
10
+ # "True" β†’ 정상
11
+ # "exceed" β†’ μΏΌν„°β€§λ ˆμ΄νŠΈλ¦¬λ°‹ 초과
12
+ # "False" β†’ κ·Έ μ™Έ μ‹€νŒ¨
13
+ # ─────────────────────────────────────────
14
+ def _classify_response(resp: requests.Response) -> str:
15
+ if resp.status_code == 200:
16
+ return "True"
17
+
18
+ try:
19
+ err = resp.json().get("error", {})
20
+ code = err.get("code", 0)
21
+ msg = str(err.get("message", "")).lower()
22
+
23
+ if code == 429 or "quota" in msg or "rate" in msg or "exceed" in msg:
24
+ return "exceed"
25
+ except Exception:
26
+ pass
27
+
28
+ return "False"
29
+
30
+
31
+ def _classify_async_status(code: int, text: str) -> str:
32
+ if code == 200:
33
+ return "True"
34
+ if code == 429 or any(kw in text.lower() for kw in ("quota", "rate", "exceed")):
35
+ return "exceed"
36
+ return "False"
37
+
38
+
39
+ # ─────────────────────────────────────────
40
+ # 1) μ„œλΉ„μŠ€ 계정 β†’ μ•‘μ„ΈμŠ€ 토큰
41
+ # ─────────────────────────────────────────
42
  def get_access_token(client_email, private_key):
43
  current_time = int(time.time())
44
  expiration_time = current_time + 600
45
+
46
  claims = {
47
+ "iss": client_email,
48
+ "scope": "https://www.googleapis.com/auth/cloud-platform",
49
+ "aud": "https://oauth2.googleapis.com/token",
50
+ "exp": expiration_time,
51
+ "iat": current_time,
52
  }
53
+
54
  try:
55
+ signed_jwt = jwt.encode(claims, private_key, algorithm="RS256")
 
 
 
 
56
  except Exception as e:
57
+ return "False", f"JWT encode error: {e}"
58
+
59
+ resp = requests.post(
60
+ "https://oauth2.googleapis.com/token",
61
  data={
62
+ "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
63
+ "assertion": signed_jwt,
64
+ },
65
  )
66
 
67
+ return _classify_response(resp), resp.json().get("access_token", resp.text)
 
 
 
68
 
 
 
69
 
70
+ # ─────────────────────────────────────────
71
+ # 2) refresh_token β†’ μ•‘μ„ΈμŠ€ 토큰
72
+ # ─────────────────────────────────────────
73
+ def get_access_token_refresh(client_id, client_secret, refresh_token):
74
+ resp = requests.post(
75
+ "https://oauth2.googleapis.com/token",
76
+ data={
77
+ "client_id": client_id,
78
+ "client_secret": client_secret,
79
+ "refresh_token": refresh_token,
80
+ "grant_type": "refresh_token",
81
+ },
82
+ )
83
 
84
+ return _classify_response(resp), resp.json().get("access_token", resp.text)
85
 
 
 
 
 
86
 
87
+ # ─────────────────────────────────────────
88
+ # 3) Gemini λͺ¨λΈ λͺ©λ‘ (κ°„μ†Œν™”)
89
+ # 성곡 μ—¬λΆ€λ§Œ λ°˜ν™˜
90
+ # ─────────────────────────────────────────
91
  def get_gemini_models(key):
92
+ url = f"https://generativelanguage.googleapis.com/v1beta/models?key={key}&pageSize=1"
93
+ resp = requests.get(url)
94
+ return _classify_response(resp)
95
+
96
+
97
+ # ─────────────────────────────────────────
98
+ # 4) Gemini 더미 호좜 (μΏΌν„° 체크)
99
+ # ─────────────────────────────────────────
100
+ def send_fake_gemini_request(key, model="gemini-1.5-flash"):
101
+ url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={key}"
 
 
 
 
 
 
102
  payload = {
103
+ "contents": [{"role": "user", "parts": [{"text": ""}]}],
104
+ "generationConfig": {"maxOutputTokens": 0},
 
 
105
  }
106
+
107
  try:
108
+ resp = requests.post(url, headers={"Content-Type": "application/json"}, json=payload)
109
+ return _classify_response(resp)
110
+ except Exception:
111
+ return "False"
112
+
113
+
114
+ # ─────────────────────────────────────────
115
+ # 5) Gemini μ‹€μ œ 호좜 (μš”μ•½ μƒνƒœ λ°˜ν™˜)
116
+ # ─────────────────────────────────────────
117
+ def send_gemini_request(key, payload, model="gemini-1.5-flash"):
118
+ url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={key}"
119
+ resp = requests.post(url, headers={"Content-Type": "application/json"}, json=payload)
120
+ return _classify_response(resp), resp.json() if resp.status_code == 200 else resp.text
121
+
122
+
123
+ # ─────────────────────────────────────────
124
+ # 6) Vertex AI + Anthropic (streamRawPredict)
125
+ # μƒνƒœλ§Œ κ°„μ†Œν™”ν•΄ λ°˜ν™˜
126
+ # ─────────────────────────────────────────
127
+ async def send_gcp_request(
128
+ session: aiohttp.ClientSession,
129
+ project_id: str,
130
+ access_token: str,
131
+ payload: str,
132
+ region: str = "us-east5",
133
+ model: str = "claude-3-5-sonnet@20240620",
134
+ ):
135
+ url = f"https://{region}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{region}/publishers/anthropic/models/{model}:streamRawPredict"
136
  headers = {
137
+ "Authorization": f"Bearer {access_token}",
138
+ "Content-Type": "application/json; charset=utf-8",
139
  }
140
 
141
+ async with session.post(url, headers=headers, data=payload) as resp:
142
+ text = await resp.text()
143
+ return _classify_async_status(resp.status, text), text