aient 1.1.86__py3-none-any.whl → 1.1.88__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.
- aient/core/response.py +13 -3
- aient/core/utils.py +28 -1
- aient/models/chatgpt.py +3 -0
- {aient-1.1.86.dist-info → aient-1.1.88.dist-info}/METADATA +1 -1
- {aient-1.1.86.dist-info → aient-1.1.88.dist-info}/RECORD +8 -8
- {aient-1.1.86.dist-info → aient-1.1.88.dist-info}/WHEEL +0 -0
- {aient-1.1.86.dist-info → aient-1.1.88.dist-info}/licenses/LICENSE +0 -0
- {aient-1.1.86.dist-info → aient-1.1.88.dist-info}/top_level.txt +0 -0
aient/core/response.py
CHANGED
@@ -183,7 +183,7 @@ async def fetch_vertex_claude_response_stream(client, url, headers, payload, mod
|
|
183
183
|
function_call_id = function_call["id"]
|
184
184
|
sse_string = await generate_sse_response(timestamp, model, content=None, tools_id=function_call_id, function_call_name=function_call_name)
|
185
185
|
yield sse_string
|
186
|
-
function_full_response = json.dumps
|
186
|
+
function_full_response = await asyncio.to_thread(json.dumps, function_call["input"])
|
187
187
|
sse_string = await generate_sse_response(timestamp, model, content=None, tools_id=function_call_id, function_call_name=None, function_call_content=function_full_response)
|
188
188
|
yield sse_string
|
189
189
|
|
@@ -213,6 +213,9 @@ async def fetch_gpt_response_stream(client, url, headers, payload, timeout):
|
|
213
213
|
while "\n" in buffer:
|
214
214
|
line, buffer = buffer.split("\n", 1)
|
215
215
|
# logger.info("line: %s", repr(line))
|
216
|
+
if line.startswith(": keepalive"):
|
217
|
+
yield line + end_of_line
|
218
|
+
continue
|
216
219
|
if line and not line.startswith(":") and (result:=line.lstrip("data: ").strip()):
|
217
220
|
if result.strip() == "[DONE]":
|
218
221
|
break
|
@@ -272,6 +275,11 @@ async def fetch_gpt_response_stream(client, url, headers, payload, timeout):
|
|
272
275
|
|
273
276
|
no_stream_content = safe_get(line, "choices", 0, "message", "content", default=None)
|
274
277
|
openrouter_reasoning = safe_get(line, "choices", 0, "delta", "reasoning", default="")
|
278
|
+
openrouter_base64_image = safe_get(line, "choices", 0, "delta", "images", 0, "image_url", "url", default="")
|
279
|
+
if openrouter_base64_image:
|
280
|
+
sse_string = await generate_sse_response(timestamp, payload["model"], content=f"\n\n")
|
281
|
+
yield sse_string
|
282
|
+
continue
|
275
283
|
azure_databricks_claude_summary_content = safe_get(line, "choices", 0, "delta", "content", 0, "summary", 0, "text", default="")
|
276
284
|
azure_databricks_claude_signature_content = safe_get(line, "choices", 0, "delta", "content", 0, "summary", 0, "signature", default="")
|
277
285
|
# print("openrouter_reasoning", repr(openrouter_reasoning), openrouter_reasoning.endswith("\\\\"), openrouter_reasoning.endswith("\\"))
|
@@ -306,7 +314,8 @@ async def fetch_gpt_response_stream(client, url, headers, payload, timeout):
|
|
306
314
|
else:
|
307
315
|
if no_stream_content:
|
308
316
|
del line["choices"][0]["message"]
|
309
|
-
|
317
|
+
json_line = await asyncio.to_thread(json.dumps, line)
|
318
|
+
yield "data: " + json_line.strip() + end_of_line
|
310
319
|
yield "data: [DONE]" + end_of_line
|
311
320
|
|
312
321
|
async def fetch_azure_response_stream(client, url, headers, payload, timeout):
|
@@ -363,7 +372,8 @@ async def fetch_azure_response_stream(client, url, headers, payload, timeout):
|
|
363
372
|
else:
|
364
373
|
if no_stream_content:
|
365
374
|
del line["choices"][0]["message"]
|
366
|
-
|
375
|
+
json_line = await asyncio.to_thread(json.dumps, line)
|
376
|
+
yield "data: " + json_line.strip() + end_of_line
|
367
377
|
yield "data: [DONE]" + end_of_line
|
368
378
|
|
369
379
|
async def fetch_cloudflare_response_stream(client, url, headers, payload, model, timeout):
|
aient/core/utils.py
CHANGED
@@ -243,7 +243,8 @@ def parse_rate_limit(limit_string):
|
|
243
243
|
'h': 3600, 'hr': 3600, 'hour': 3600,
|
244
244
|
'd': 86400, 'day': 86400,
|
245
245
|
'mo': 2592000, 'month': 2592000,
|
246
|
-
'y': 31536000, 'year': 31536000
|
246
|
+
'y': 31536000, 'year': 31536000,
|
247
|
+
'tpr': -1,
|
247
248
|
}
|
248
249
|
|
249
250
|
# 处理多个限制条件
|
@@ -377,6 +378,32 @@ class ThreadSafeCircularList:
|
|
377
378
|
logger.warning(f"All API keys are rate limited!")
|
378
379
|
raise HTTPException(status_code=429, detail="Too many requests")
|
379
380
|
|
381
|
+
async def is_tpr_exceeded(self, model: str = None, tokens: int = 0) -> bool:
|
382
|
+
"""Checks if the request exceeds the TPR (Tokens Per Request) limit."""
|
383
|
+
if not tokens:
|
384
|
+
return False
|
385
|
+
|
386
|
+
async with self.lock:
|
387
|
+
rate_limit = None
|
388
|
+
model_key = model or "default"
|
389
|
+
if model and model_key in self.rate_limits:
|
390
|
+
rate_limit = self.rate_limits[model_key]
|
391
|
+
else:
|
392
|
+
# fuzzy match
|
393
|
+
for limit_model in self.rate_limits:
|
394
|
+
if limit_model != "default" and model and limit_model in model:
|
395
|
+
rate_limit = self.rate_limits[limit_model]
|
396
|
+
break
|
397
|
+
if rate_limit is None:
|
398
|
+
rate_limit = self.rate_limits.get("default", [])
|
399
|
+
|
400
|
+
for limit_count, limit_period in rate_limit:
|
401
|
+
if limit_period == -1: # TPR limit
|
402
|
+
if tokens > limit_count:
|
403
|
+
# logger.warning(f"API provider for model {model_key} exceeds TPR limit ({tokens}/{limit_count}).")
|
404
|
+
return True
|
405
|
+
return False
|
406
|
+
|
380
407
|
async def is_all_rate_limited(self, model: str = None) -> bool:
|
381
408
|
"""检查是否所有的items都被速率限制
|
382
409
|
|
aient/models/chatgpt.py
CHANGED
@@ -844,6 +844,9 @@ class chatgpt(BaseLLM):
|
|
844
844
|
except BadRequestError as e:
|
845
845
|
self.logger.error(f"Bad request error: {e}")
|
846
846
|
raise
|
847
|
+
except GeneratorExit:
|
848
|
+
self.logger.warning("GeneratorExit caught, closing stream.")
|
849
|
+
break
|
847
850
|
except ValidationError as e:
|
848
851
|
self.logger.warning(f"Validation failed: {e}. Retrying with corrective prompt.")
|
849
852
|
need_done_prompt = [
|
@@ -3,8 +3,8 @@ aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
|
|
3
3
|
aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
|
4
4
|
aient/core/models.py,sha256=KMlCRLjtq1wQHZTJGqnbWhPS2cHq6eLdnk7peKDrzR8,7490
|
5
5
|
aient/core/request.py,sha256=QnDhyrjzcJOEQU2oauMQi_HHMRR5NxdkrX7nn5JMwTc,76675
|
6
|
-
aient/core/response.py,sha256=
|
7
|
-
aient/core/utils.py,sha256=
|
6
|
+
aient/core/response.py,sha256=HcyOEfZXZEXeJaUBMCYE4LiLyB79XuUR5o0Gtwdyi-E,36309
|
7
|
+
aient/core/utils.py,sha256=sLmPHONYhIPq1zUYcbKOtIOpAVsLFk_5lNwH5-G2c4E,30013
|
8
8
|
aient/core/test/test_base_api.py,sha256=pWnycRJbuPSXKKU9AQjWrMAX1wiLC_014Qc9hh5C2Pw,524
|
9
9
|
aient/core/test/test_geminimask.py,sha256=HFX8jDbNg_FjjgPNxfYaR-0-roUrOO-ND-FVsuxSoiw,13254
|
10
10
|
aient/core/test/test_image.py,sha256=_T4peNGdXKBHHxyQNx12u-NTyFE8TlYI6NvvagsG2LE,319
|
@@ -12,7 +12,7 @@ aient/core/test/test_payload.py,sha256=8jBiJY1uidm1jzL-EiK0s6UGmW9XkdsuuKFGrwFhF
|
|
12
12
|
aient/models/__init__.py,sha256=ZTiZgbfBPTjIPSKURE7t6hlFBVLRS9lluGbmqc1WjxQ,43
|
13
13
|
aient/models/audio.py,sha256=kRd-8-WXzv4vwvsTGwnstK-WR8--vr9CdfCZzu8y9LA,1934
|
14
14
|
aient/models/base.py,sha256=-nnihYnx-vHZMqeVO9ljjt3k4FcD3n-iMk4tT-10nRQ,7232
|
15
|
-
aient/models/chatgpt.py,sha256
|
15
|
+
aient/models/chatgpt.py,sha256=R6qXgTbcshwYKx3nfSgh4uK2baQ6OZ37j8zV_wV8lLk,47189
|
16
16
|
aient/plugins/__init__.py,sha256=p3KO6Aa3Lupos4i2SjzLQw1hzQTigOAfEHngsldrsyk,986
|
17
17
|
aient/plugins/arXiv.py,sha256=yHjb6PS3GUWazpOYRMKMzghKJlxnZ5TX8z9F6UtUVow,1461
|
18
18
|
aient/plugins/config.py,sha256=TGgZ5SnNKZ8MmdznrZ-TEq7s2ulhAAwTSKH89bci3dA,7079
|
@@ -30,8 +30,8 @@ aient/plugins/write_file.py,sha256=Jt8fOEwqhYiSWpCbwfAr1xoi_BmFnx3076GMhuL06uI,3
|
|
30
30
|
aient/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
31
31
|
aient/utils/prompt.py,sha256=UcSzKkFE4-h_1b6NofI6xgk3GoleqALRKY8VBaXLjmI,11311
|
32
32
|
aient/utils/scripts.py,sha256=VqtK4RFEx7KxkmcqG3lFDS1DxoNlFFGErEjopVcc8IE,40974
|
33
|
-
aient-1.1.
|
34
|
-
aient-1.1.
|
35
|
-
aient-1.1.
|
36
|
-
aient-1.1.
|
37
|
-
aient-1.1.
|
33
|
+
aient-1.1.88.dist-info/licenses/LICENSE,sha256=XNdbcWldt0yaNXXWB_Bakoqnxb3OVhUft4MgMA_71ds,1051
|
34
|
+
aient-1.1.88.dist-info/METADATA,sha256=SUcULwPGR1But7X7FnMup7UueDC-WRKym1iCFtX1Ve0,4842
|
35
|
+
aient-1.1.88.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
36
|
+
aient-1.1.88.dist-info/top_level.txt,sha256=3oXzrP5sAVvyyqabpeq8A2_vfMtY554r4bVE-OHBrZk,6
|
37
|
+
aient-1.1.88.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|