MeUtils 2025.5.7.18.34.50__py3-none-any.whl → 2025.5.8.13.7.42__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,8 +18,10 @@ import oss2
18
18
  from meutils.pipe import *
19
19
  from meutils.hash_utils import md5
20
20
  from meutils.io.files_utils import to_bytes
21
- from meutils.schemas.hailuo_types import BASE_URL, FEISHU_URL, FEISHU_URL_OSS
22
- from meutils.schemas.hailuo_types import BASE_URL_ABROAD as BASE_URL, FEISHU_URL_ABROAD as FEISHU_URL
21
+ from meutils.jwt_utils import decode_jwt_token
22
+ from meutils.schemas.hailuo_types import BASE_URL, FEISHU_URL
23
+ # from meutils.schemas.hailuo_types import BASE_URL_ABROAD as BASE_URL, FEISHU_URL_ABROAD as FEISHU_URL
24
+ from meutils.schemas.hailuo_types import BASE_URL_ABROAD
23
25
 
24
26
  from meutils.schemas.hailuo_types import VideoRequest, VideoResponse
25
27
  from meutils.llm.check_utils import check_tokens
@@ -48,6 +50,16 @@ MODEL_MAPPING = {
48
50
  }
49
51
 
50
52
 
53
+ def get_base_url(token):
54
+ data = decode_jwt_token(token)
55
+ if "小螺帽" not in str(data):
56
+ logger.debug(data)
57
+
58
+ return BASE_URL_ABROAD
59
+ else:
60
+ return BASE_URL
61
+
62
+
51
63
  # minimax_video-01,minimax_video-01-live2d,,minimax_t2v-01,minimax_i2v-01,minimax_i2v-01-live,minimax_s2v-01
52
64
 
53
65
 
@@ -95,6 +107,8 @@ async def upload(file: bytes, token: str):
95
107
  'token': token
96
108
  }
97
109
  logger.debug(headers)
110
+
111
+ BASE_URL = get_base_url(token)
98
112
  async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=120) as client:
99
113
  response = await client.post("/v1/api/files/policy_callback", params=params, json=payload)
100
114
  response.raise_for_status()
@@ -116,6 +130,9 @@ async def upload(file: bytes, token: str):
116
130
  @alru_cache(ttl=1 * 24 * 60 * 60)
117
131
  @retrying()
118
132
  async def get_access_token(token: str):
133
+ BASE_URL = get_base_url(token)
134
+ logger.debug(BASE_URL)
135
+
119
136
  logger.debug(f"get_access_token:{token}")
120
137
 
121
138
  params = {
@@ -140,6 +157,7 @@ async def get_access_token(token: str):
140
157
  'token': token,
141
158
  'yy': get_yy(payload, params=params, url="/v1/api/user/renewal")
142
159
  }
160
+
143
161
  async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60) as client:
144
162
  response = await client.post("/v1/api/user/renewal", params=params, content=json.dumps(payload))
145
163
  response.raise_for_status()
@@ -171,6 +189,9 @@ async def get_request_policy(token):
171
189
  }
172
190
 
173
191
  logger.debug(headers)
192
+
193
+ BASE_URL = get_base_url(token)
194
+
174
195
  async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60) as client:
175
196
  response = await client.get("/v1/api/files/request_policy")
176
197
  response.raise_for_status()
@@ -187,9 +208,12 @@ async def get_request_policy(token):
187
208
 
188
209
  @retrying(predicate=lambda r: r.base_resp.status_code in {1000061, 1500009}) # 限流
189
210
  async def create_task(request: VideoRequest, token: Optional[str] = None):
211
+
212
+
190
213
  refresh_token = token or await get_next_token_for_polling(FEISHU_URL, from_redis=True, check_token=check_token)
191
214
  # refresh_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDA0NzA4NzgsInVzZXIiOnsiaWQiOiIzMjg2MDg4ODkzNTA4MTU3NDQiLCJuYW1lIjoiUm9idXN0IEdlcnRydWRlIiwiYXZhdGFyIjoiaHR0cHM6Ly9jZG4uaGFpbHVvYWkudmlkZW8vbW9zcy9wcm9kLzIwMjQtMTItMjgtMTYvdXNlci91c2VyX2F2YXRhci8xNzM1Mzc1OTI0OTkyMTcxMDY3LWF2YXRhcl8zMjg2MDg4ODkzNTA4MTU3NDQiLCJkZXZpY2VJRCI6IjMwMjgzMzc1OTUxMjc2NDQxNyIsImlzQW5vbnltb3VzIjpmYWxzZX19.dLNBSHjqnKutGl3ralS2g8A-RodHjOdos11vdpbkPwc"
192
215
 
216
+ BASE_URL = get_base_url(refresh_token)
193
217
  token = await get_access_token(refresh_token)
194
218
 
195
219
  payload = {
@@ -202,12 +226,12 @@ async def create_task(request: VideoRequest, token: Optional[str] = None):
202
226
 
203
227
  if request.first_frame_image:
204
228
  file = await to_bytes(request.first_frame_image)
205
- if request.first_frame_image.startswith("http"):
229
+ if request.first_frame_image.startswith("http") and BASE_URL.endswith(".video"):
206
230
  file_data = {
207
231
  # "id": data['data']['fileID'],
208
232
  # "name": "_.png",
209
233
  # "type": "png",
210
- "url": request.first_frame_image,
234
+ "url": request.first_frame_image, #######
211
235
  }
212
236
 
213
237
  # {"desc": "跳起来", "useOriginPrompt": false, "fileList": [{"id": "338311163211288581",
@@ -318,6 +342,8 @@ async def create_task(request: VideoRequest, token: Optional[str] = None):
318
342
 
319
343
  # 307134660730421250
320
344
  async def get_task(task_id: str, token: str):
345
+ BASE_URL = get_base_url(token)
346
+
321
347
  task_id = task_id.rsplit('-', 1)[-1]
322
348
 
323
349
  params = {
@@ -365,6 +391,8 @@ async def get_task(task_id: str, token: str):
365
391
  # https://hailuoai.video/v1/api/user/equity?device_platform=web&app_id=3001&version_code=22201&uuid=3de88ad0-8a38-48a9-8ed3-0d63f9c71296&lang=en&device_id=302833759512764417&os_name=Mac&browser_name=chrome&device_memory=8&cpu_core_num=10&browser_language=zh-CN&browser_platform=MacIntel&screen_width=1920&screen_height=1080&unix=1731571578000
366
392
  @alru_cache(ttl=3600)
367
393
  async def check_token(token, threshold: int = 30, **kwargs):
394
+ BASE_URL = get_base_url(token)
395
+
368
396
  if not isinstance(token, str):
369
397
  return await check_tokens(token, check_token)
370
398
 
@@ -381,7 +409,7 @@ async def check_token(token, threshold: int = 30, **kwargs):
381
409
 
382
410
  logger.debug(bjson(data))
383
411
 
384
- return "Unlimited" in str(data) # Unlimited
412
+ return "Unlimited" in str(data) or "高级会员" in str(data) # Unlimited
385
413
  except Exception as e:
386
414
  logger.error(e)
387
415
  logger.debug(token)
@@ -421,18 +449,21 @@ if __name__ == '__main__': # 304752356930580482
421
449
 
422
450
  token = None
423
451
  # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDQ3MDMwNzIsInVzZXIiOnsiaWQiOiIzMDI4MzM4Njc3NzE5NDkwNTgiLCJuYW1lIjoibWUgYmV0dGVyIiwiYXZhdGFyIjoiIiwiZGV2aWNlSUQiOiIzMDI4MzM3NTk1MTI3NjQ0MTciLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.Mjb64ZjkKyV9pj-_bXyLczU6kU729VLaKbYj9NmrK-4"
424
- # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzUxMTcwNzcsInVzZXIiOnsiaWQiOiIzMTEyOTUzMTkzMjc1NzYwNjQiLCJuYW1lIjoiVUdIUiBKVkJYIiwiYXZhdGFyIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jS3RuR2NjdGZsWV9fR2tiQ1MzdnhzSXdWSEFUX0ZmMFdyb3RvMnN4bFdWZW1KMm53PXM5Ni1jIiwiZGV2aWNlSUQiOiIzMTMzMTU5NTMxMDA0MTA4ODciLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.KsRcfnAoPAR08ygzq-GIiujkFbZ2CgLeww7EP9qcb9Q"
452
+ # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDg3Mzg4MTQsInVzZXIiOnsiaWQiOiIyMjkwODQ3NTA2MDEzODgwMzciLCJuYW1lIjoi5bCP6J665bi9ODAzNyIsImF2YXRhciI6Imh0dHBzOi8vY2RuLmhhaWx1b2FpLmNvbS9wcm9kL3VzZXJfYXZhdGFyLzE3MDYyNjc3MTEyODI3NzA4NzItMTczMTk0NTcwNjY4OTY1ODk2b3ZlcnNpemUucG5nIiwiZGV2aWNlSUQiOiIyNDM3MTMyNTI1NDU5ODY1NjIiLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.o0SoZMSTWkXNHxJjt3Ggby5MJWSfd-rnK_I95T_WMP8"
453
+ # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTAxMjg4NTIsInVzZXIiOnsiaWQiOiIzNzQwMTM3NzUyNzg4ODY5MTciLCJuYW1lIjoiTmFodWVsIE1vbGluYSIsImF2YXRhciI6IiIsImRldmljZUlEIjoiMzEzMzc0MTIyMjEyMjc4MjczIiwiaXNBbm9ueW1vdXMiOmZhbHNlfX0.uxTtDTcPT07piVA-x3N2ms2VrRN3JwcU99g_HJLwqLE"
425
454
  request = VideoRequest(
426
- model="I2V-01-live",
455
+ model="t2v-01",
427
456
  # model="S2V-01-live",
428
457
 
429
458
  # prompt="smile", # 307145017365086216
430
459
  prompt="动起来", # 307145017365086216
431
- first_frame_image="https://oss.ffire.cc/files/kling_watermark.png" # 307173162217783304
460
+ # first_frame_image="https://oss.ffire.cc/files/kling_watermark.png" # 307173162217783304
432
461
  )
433
462
 
434
463
  r = arun(create_task(request, token=token))
435
464
  # arun(get_task(task_id=r.task_id, token=r.system_fingerprint))
465
+
466
+ # arun(get_access_token(token))
436
467
  #
437
468
  #
438
469
  # data = {
@@ -450,4 +481,5 @@ if __name__ == '__main__': # 304752356930580482
450
481
  # arun(get_task("hailuoai-307495165395488768", token=token))
451
482
  # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzUwMTc3ODAsInVzZXIiOnsiaWQiOiIzMTEyOTUzMTkzMjc1NzYwNjQiLCJuYW1lIjoiVUdIUiBKVkJYIiwiYXZhdGFyIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jS3RuR2NjdGZsWV9fR2tiQ1MzdnhzSXdWSEFUX0ZmMFdyb3RvMnN4bFdWZW1KMm53PXM5Ni1jIiwiZGV2aWNlSUQiOiIzMTMzMTU5NTMxMDA0MTA4ODciLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.cyZifq4FQl46P5_acTNT04qu2GVDDeSBbwjw3J1vWPo"
452
483
  # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzUwMzQ1MjcsInVzZXIiOnsiaWQiOiIzMTMzODk5MjA0NjA5MzkyNjgiLCJuYW1lIjoiY2l4ZiB4YmNnIiwiYXZhdGFyIjoiIiwiZGV2aWNlSUQiOiIzMTM0MDgyMjg0NTEwOTg2MjYiLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.eOtAUe3MmarOGNk64j0bfaLNBZ4yxkqwIi1tUhOFD5c"
484
+ # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTAxMjg4NTIsInVzZXIiOnsiaWQiOiIzNzQwMTM3NzUyNzg4ODY5MTciLCJuYW1lIjoiTmFodWVsIE1vbGluYSIsImF2YXRhciI6IiIsImRldmljZUlEIjoiMzEzMzc0MTIyMjEyMjc4MjczIiwiaXNBbm9ueW1vdXMiOmZhbHNlfX0.uxTtDTcPT07piVA-x3N2ms2VrRN3JwcU99g_HJLwqLE"
453
485
  # arun(check_token(token))
@@ -11,7 +11,6 @@
11
11
  import execjs
12
12
 
13
13
  from meutils.pipe import *
14
- from meutils.schemas.hailuo_types import VideoRequest
15
14
 
16
15
  from urllib.parse import quote, urlencode
17
16
 
@@ -125,6 +125,8 @@ async def make_request_for_baidu(payload, token: Optional[str] = None, response_
125
125
  "proxy": await get_one_proxy(),
126
126
  }
127
127
 
128
+ logger.debug(request_kwargs)
129
+
128
130
  async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=60, **request_kwargs) as client:
129
131
  response = await client.post("/aigc/pccreate", data=payload) # pcEditTaskid
130
132
  response.raise_for_status()
@@ -217,8 +219,8 @@ if __name__ == '__main__':
217
219
  request = ImageProcess(
218
220
  # model="hunyuan-remove-watermark",
219
221
 
220
- model="remove-watermark",
221
- # model="clarity",
222
+ # model="remove-watermark",
223
+ model="clarity",
222
224
  # model="expand",
223
225
  # model="rmbg-2.0",
224
226
 
@@ -41,8 +41,8 @@ async def get_access_token(token: str):
41
41
  logger.debug(response.json())
42
42
  return response.json()["accessToken"]
43
43
 
44
-
45
- async def edit_image(image, task: Literal["vectorize", "super_resolution",] = "super_resolution"):
44
+ @retrying()
45
+ async def edit_image(image, task: Literal["vectorize", "super_resolution",] = "super_resolution", response_format: Literal["url", "base64"] = "url"):
46
46
  token = await get_next_token_for_polling(
47
47
  feishu_url=FEISHU_URL,
48
48
  check_token=check_token,
@@ -70,6 +70,9 @@ async def edit_image(image, task: Literal["vectorize", "super_resolution",] = "s
70
70
  params = {"raster_image_content_type": "image/png"}
71
71
  response = await client.get(f"""/image/{data["result"]["image_id"]}""", params=params)
72
72
  response.raise_for_status()
73
+
74
+ # if response_format == "url":
75
+
73
76
  url = await to_url(response.content, content_type="image/png")
74
77
  return {"image": {"url": url}}
75
78
 
@@ -194,11 +197,11 @@ if __name__ == '__main__':
194
197
  **data
195
198
  )
196
199
  token = None
197
- with timer():
198
- arun(generate(request, token=token))
199
-
200
200
  # with timer():
201
- # arun(edit_image("https://oss.ffire.cc/files/kling_watermark.png"))
201
+ # arun(generate(request, token=token))
202
+
203
+ with timer():
204
+ arun(edit_image("https://oss.ffire.cc/files/kling_watermark.png"))
202
205
  # tokens = [token]
203
206
  #
204
207
  # tokens = list(arun(aget_spreadsheet_values(feishu_url=FEISHU_URL, to_dataframe=True))[0]) | xfilter_
@@ -52,7 +52,7 @@ async def get_task(task_id: str, token: str = "916fed81175f5186a2c05375699ea40d"
52
52
  if video_urls := json_path(data, "$..video_url"): # 角色检测 create_realman_avatar
53
53
 
54
54
  task_data = dict(zip(["video"] * len(video_urls), video_urls))
55
- response = TaskResponse(task_id=task_id, data=task_data, metadata=data)
55
+ response = TaskResponse(task_id=task_id, data=task_data, metadata=data, status="success")
56
56
  return response
57
57
 
58
58
  else:
@@ -67,6 +67,7 @@ async def get_task(task_id: str, token: str = "916fed81175f5186a2c05375699ea40d"
67
67
 
68
68
  if video_urls := json_path(data, "$..[360p,480p,720p].video_url"):
69
69
  response.data = [{"video": _} for _ in video_urls]
70
+ response.status = "success"
70
71
 
71
72
  return response
72
73
 
@@ -48,7 +48,7 @@ async def edit_channel(models, token: Optional[str] = None):
48
48
  "auto_ban": 0,
49
49
  "other_info": "",
50
50
 
51
- "group": "default,openai,china,chatfire,enterprise", # ','.join(GROUP_RATIO),
51
+ "group": "default,openai,chatfire,enterprise", # ','.join(GROUP_RATIO),
52
52
  "groups": ['default']
53
53
  }
54
54
  headers = {
meutils/data/VERSION CHANGED
@@ -1 +1 @@
1
- 2025.05.07.18.34.50
1
+ 2025.05.08.13.07.42
@@ -8,4 +8,4 @@
8
8
  # @Software : PyCharm
9
9
  # @Description :
10
10
 
11
- from meutils.pipe import *
11
+ from meutils.jwt_utils.common import decode_jwt_token
@@ -13,34 +13,64 @@ from meutils.pipe import *
13
13
  import jwt
14
14
  import time
15
15
  import datetime
16
+ #
17
+ # # Header and payload
18
+ # header = {
19
+ # "alg": "HS512",
20
+ # "type": "JWT"
21
+ # }
22
+ #
23
+ #
24
+ # payload = {
25
+ # "jti": "80004477",
26
+ # "rol": "ROLE_REGISTER",
27
+ # "iss": "OpenXLab",
28
+ # "clientId": "lkzdx57nvy22jkpq9x2w",
29
+ # "phone": "",
30
+ # "uuid": "73a8d9b0-8bbf-4973-9b71-4b687ea23a78",
31
+ # "email": "313303303@qq.com",
32
+ #
33
+ # "iat": int(time.time()),
34
+ # "exp": int(time.time()) + 3600
35
+ # }
36
+ #
37
+ # # Your secret key
38
+ # secret = ""
39
+ #
40
+ # # Create the JWT
41
+ # token = jwt.encode(payload, secret, algorithm="HS512", headers=header)
42
+ #
43
+ # print(token)
16
44
 
17
- # Header and payload
18
- header = {
19
- "alg": "HS512",
20
- "type": "JWT"
21
- }
22
45
 
23
46
 
24
- payload = {
25
- "jti": "80004477",
26
- "rol": "ROLE_REGISTER",
27
- "iss": "OpenXLab",
28
- "clientId": "lkzdx57nvy22jkpq9x2w",
29
- "phone": "",
30
- "uuid": "73a8d9b0-8bbf-4973-9b71-4b687ea23a78",
31
- "email": "313303303@qq.com",
47
+ @lru_cache()
48
+ def decode_jwt_token(jwt_token):
49
+ # 提取 payload 部分
50
+ payload_part = jwt_token.split('.')[1]
32
51
 
33
- "iat": int(time.time()),
34
- "exp": int(time.time()) + 3600
35
- }
52
+ # 对 payload 进行 Base64 解码
53
+ try:
54
+ # 尝试标准 Base64 解码
55
+ decoded_payload = base64.b64decode(payload_part + '==', validate=True).decode('utf-8')
56
+ except base64.binascii.Error:
57
+ # 尝试 URL 安全的 Base64 解码
58
+ decoded_payload = base64.urlsafe_b64decode(payload_part + '==').decode('utf-8')
36
59
 
37
- # Your secret key
38
- secret = ""
60
+ # 解析 JSON 字符串
61
+ payload = json.loads(decoded_payload)
39
62
 
40
- # Create the JWT
41
- token = jwt.encode(payload, secret, algorithm="HS512", headers=header)
63
+ return payload
42
64
 
43
- print(token)
44
65
 
66
+ if __name__ == '__main__':
67
+ def get_base_url(token):
68
+ if "小螺帽" not in str(decode_jwt_token(token)):
69
+ return "BASE_URL_ABROAD"
70
+ else:
71
+ return "BASE_URL"
45
72
 
73
+ jwt_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDg3Mzg4MTQsInVzZXIiOnsiaWQiOiIyMjkwODQ3NTA2MDEzODgwMzciLCJuYW1lIjoi5bCP6J665bi9ODAzNyIsImF2YXRhciI6Imh0dHBzOi8vY2RuLmhhaWx1b2FpLmNvbS9wcm9kL3VzZXJfYXZhdGFyLzE3MDYyNjc3MTEyODI3NzA4NzItMTczMTk0NTcwNjY4OTY1ODk2b3ZlcnNpemUucG5nIiwiZGV2aWNlSUQiOiIyNDM3MTMyNTI1NDU5ODY1NjIiLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.o0SoZMSTWkXNHxJjt3Ggby5MJWSfd-rnK_I95T_WMP8"
46
74
 
75
+ # jwt_token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTAxMjg4NTIsInVzZXIiOnsiaWQiOiIzNzQwMTM3NzUyNzg4ODY5MTciLCJuYW1lIjoiTmFodWVsIE1vbGluYSIsImF2YXRhciI6IiIsImRldmljZUlEIjoiMzEzMzc0MTIyMjEyMjc4MjczIiwiaXNBbm9ueW1vdXMiOmZhbHNlfX0.uxTtDTcPT07piVA-x3N2ms2VrRN3JwcU99g_HJLwqLE"
76
+ print(get_base_url(jwt_token))
@@ -46,7 +46,9 @@ class Completions(object):
46
46
 
47
47
  if guess_mime_type(url).startswith("image"): # 图片问答
48
48
 
49
- request.model = "glm-4v-flash" if "image" not in request.model else request.model
49
+ if not any(i in request.model for i in {"image", "vl", "vision"}): ##
50
+ request.model = "glm-4v-flash"
51
+
50
52
  for i, message in enumerate(request.messages):
51
53
  if message.get("role") == "user":
52
54
  user_contents = message.get("content")
@@ -481,7 +481,7 @@ class ImageProcess(BaseModel):
481
481
  "expand",
482
482
  "rmbg-2.0"
483
483
  ]
484
- image: str
484
+ image: Union[str, bytes]
485
485
  mask: Optional[str] = None
486
486
 
487
487
  style: Optional[str] = None
@@ -106,6 +106,11 @@ MODEL_PRICE = {
106
106
  "official-api-hailuo-video": 0.5,
107
107
  "api-hailuo-video": 0.3,
108
108
 
109
+ "api-videos-seedream-3.0": 0.5,
110
+
111
+ "api-kling-video/v2/master/text-to-video": 5,
112
+ "api-kling-video/v2/master/image-to-video": 5,
113
+
109
114
  # delle3
110
115
  "api-images-kling": 0.04,
111
116
  "api-images-hunyuan": 0.04,
@@ -761,7 +766,7 @@ MODEL_RATIO = {
761
766
  "gemini-2.0-flash-thinking-exp-1219": 1,
762
767
  "gemini-2.0-flash-thinking-exp-01-21": 1,
763
768
 
764
- "gemini-2.5-flash-preview-04-17": 0.15,
769
+ "gemini-2.5-flash-preview-04-17": 0.075,
765
770
 
766
771
  "gemini-2.0-pro": 0.625,
767
772
  "gemini-2.0-pro-exp": 0.625,
@@ -781,7 +786,7 @@ MODEL_RATIO = {
781
786
  "gemini-pro-vision": 1,
782
787
  "gemini-ultra": 1,
783
788
 
784
- "gemini-2.5-flash-thinking": 0.15 * 2,
789
+ "gemini-2.5-flash-thinking": 0.15,
785
790
  "gemini-2.5-flash-preview-04-17-thinking": 0.15 * 2,
786
791
  "gemini-2.5-pro-thinking": 0.625 * 2,
787
792
  "gemini-2.5-pro-exp-03-25-thinking": 0.625 * 2,