aient 1.1.86__tar.gz → 1.1.87__tar.gz
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-1.1.86 → aient-1.1.87}/PKG-INFO +1 -1
- {aient-1.1.86 → aient-1.1.87}/aient/core/response.py +8 -3
- {aient-1.1.86 → aient-1.1.87}/aient/core/utils.py +28 -1
- {aient-1.1.86 → aient-1.1.87}/aient.egg-info/PKG-INFO +1 -1
- {aient-1.1.86 → aient-1.1.87}/pyproject.toml +1 -1
- {aient-1.1.86 → aient-1.1.87}/LICENSE +0 -0
- {aient-1.1.86 → aient-1.1.87}/README.md +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/__init__.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/__init__.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/log_config.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/models.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/request.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/test/test_base_api.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/test/test_geminimask.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/test/test_image.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/core/test/test_payload.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/models/__init__.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/models/audio.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/models/base.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/models/chatgpt.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/__init__.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/arXiv.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/config.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/excute_command.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/get_time.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/image.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/list_directory.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/read_file.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/read_image.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/readonly.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/registry.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/run_python.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/websearch.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/plugins/write_file.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/utils/__init__.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/utils/prompt.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient/utils/scripts.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient.egg-info/SOURCES.txt +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient.egg-info/dependency_links.txt +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient.egg-info/requires.txt +0 -0
- {aient-1.1.86 → aient-1.1.87}/aient.egg-info/top_level.txt +0 -0
- {aient-1.1.86 → aient-1.1.87}/setup.cfg +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_Web_crawler.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_ddg_search.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_google_search.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_ollama.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_plugin.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_search.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_url.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_whisper.py +0 -0
- {aient-1.1.86 → aient-1.1.87}/test/test_yjh.py +0 -0
@@ -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
|
@@ -306,7 +309,8 @@ async def fetch_gpt_response_stream(client, url, headers, payload, timeout):
|
|
306
309
|
else:
|
307
310
|
if no_stream_content:
|
308
311
|
del line["choices"][0]["message"]
|
309
|
-
|
312
|
+
json_line = await asyncio.to_thread(json.dumps, line)
|
313
|
+
yield "data: " + json_line.strip() + end_of_line
|
310
314
|
yield "data: [DONE]" + end_of_line
|
311
315
|
|
312
316
|
async def fetch_azure_response_stream(client, url, headers, payload, timeout):
|
@@ -363,7 +367,8 @@ async def fetch_azure_response_stream(client, url, headers, payload, timeout):
|
|
363
367
|
else:
|
364
368
|
if no_stream_content:
|
365
369
|
del line["choices"][0]["message"]
|
366
|
-
|
370
|
+
json_line = await asyncio.to_thread(json.dumps, line)
|
371
|
+
yield "data: " + json_line.strip() + end_of_line
|
367
372
|
yield "data: [DONE]" + end_of_line
|
368
373
|
|
369
374
|
async def fetch_cloudflare_response_stream(client, url, headers, payload, model, timeout):
|
@@ -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
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|