aient 1.1.53__tar.gz → 1.1.55__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.53/src/aient.egg-info → aient-1.1.55}/PKG-INFO +1 -1
- {aient-1.1.53 → aient-1.1.55}/setup.py +1 -1
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/request.py +24 -5
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/response.py +18 -8
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/chatgpt.py +4 -3
- {aient-1.1.53 → aient-1.1.55/src/aient.egg-info}/PKG-INFO +1 -1
- {aient-1.1.53 → aient-1.1.55}/LICENSE +0 -0
- {aient-1.1.53 → aient-1.1.55}/MANIFEST.in +0 -0
- {aient-1.1.53 → aient-1.1.55}/README.md +0 -0
- {aient-1.1.53 → aient-1.1.55}/setup.cfg +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/__init__.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/.git +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/.gitignore +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/__init__.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/log_config.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/models.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_base_api.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_geminimask.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_image.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_payload.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/core/utils.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/__init__.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/audio.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/base.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/claude.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/duckduckgo.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/gemini.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/groq.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/models/vertex.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/__init__.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/arXiv.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/config.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/excute_command.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/get_time.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/image.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/list_directory.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/read_file.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/read_image.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/readonly.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/registry.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/run_python.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/websearch.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/write_file.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/utils/__init__.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/utils/prompt.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient/utils/scripts.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/SOURCES.txt +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/dependency_links.txt +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/requires.txt +0 -0
- {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/top_level.txt +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_API.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_Deepbricks.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_Web_crawler.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_aiwaves.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_aiwaves_arxiv.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_ask_gemini.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_class.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_claude.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_claude_zh_char.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_ddg_search.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_download_pdf.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_gemini.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_get_token_dict.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_google_search.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_jieba.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_json.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_logging.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_ollama.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_plugin.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_py_run.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_requests.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_search.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_tikitoken.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_token.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_url.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_whisper.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_wildcard.py +0 -0
- {aient-1.1.53 → aient-1.1.55}/test/test_yjh.py +0 -0
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
|
|
4
4
|
|
5
5
|
setup(
|
6
6
|
name="aient",
|
7
|
-
version="1.1.
|
7
|
+
version="1.1.55",
|
8
8
|
description="Aient: The Awakening of Agent.",
|
9
9
|
long_description=Path.open(Path("README.md"), encoding="utf-8").read(),
|
10
10
|
long_description_content_type="text/markdown",
|
@@ -1071,7 +1071,9 @@ async def get_gpt_payload(request, engine, provider, api_key=None):
|
|
1071
1071
|
elif request.model.endswith("low"):
|
1072
1072
|
payload["reasoning_effort"] = "low"
|
1073
1073
|
|
1074
|
-
if "o1" in original_model or
|
1074
|
+
if "o1" in original_model or \
|
1075
|
+
"o3" in original_model or "o4" in original_model or \
|
1076
|
+
"gpt-oss" in original_model or "gpt-5" in original_model:
|
1075
1077
|
if request.model.endswith("high"):
|
1076
1078
|
payload["reasoning_effort"] = "high"
|
1077
1079
|
elif request.model.endswith("low"):
|
@@ -1354,7 +1356,8 @@ async def get_openrouter_payload(request, engine, provider, api_key=None):
|
|
1354
1356
|
|
1355
1357
|
messages = []
|
1356
1358
|
for msg in request.messages:
|
1357
|
-
|
1359
|
+
tool_calls = None
|
1360
|
+
tool_call_id = None
|
1358
1361
|
if isinstance(msg.content, list):
|
1359
1362
|
content = []
|
1360
1363
|
for item in msg.content:
|
@@ -1366,9 +1369,25 @@ async def get_openrouter_payload(request, engine, provider, api_key=None):
|
|
1366
1369
|
content.append(image_message)
|
1367
1370
|
else:
|
1368
1371
|
content = msg.content
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
+
tool_calls = msg.tool_calls
|
1373
|
+
tool_call_id = msg.tool_call_id
|
1374
|
+
|
1375
|
+
if tool_calls:
|
1376
|
+
tool_calls_list = []
|
1377
|
+
for tool_call in tool_calls:
|
1378
|
+
tool_calls_list.append({
|
1379
|
+
"id": tool_call.id,
|
1380
|
+
"type": tool_call.type,
|
1381
|
+
"function": {
|
1382
|
+
"name": tool_call.function.name,
|
1383
|
+
"arguments": tool_call.function.arguments
|
1384
|
+
}
|
1385
|
+
})
|
1386
|
+
if provider.get("tools"):
|
1387
|
+
messages.append({"role": msg.role, "tool_calls": tool_calls_list})
|
1388
|
+
elif tool_call_id:
|
1389
|
+
if provider.get("tools"):
|
1390
|
+
messages.append({"role": msg.role, "tool_call_id": tool_call_id, "content": content})
|
1372
1391
|
else:
|
1373
1392
|
# print("content", content)
|
1374
1393
|
if isinstance(content, list):
|
@@ -34,19 +34,22 @@ def gemini_json_poccess(response_str):
|
|
34
34
|
candidatesTokenCount = safe_get(response_json, "usageMetadata", "candidatesTokenCount", default=0)
|
35
35
|
totalTokenCount = safe_get(response_json, "usageMetadata", "totalTokenCount", default=0)
|
36
36
|
|
37
|
-
content = safe_get(json_data, "parts", 0, "text", default="")
|
37
|
+
content = reasoning_content = safe_get(json_data, "parts", 0, "text", default="")
|
38
38
|
b64_json = safe_get(json_data, "parts", 0, "inlineData", "data", default="")
|
39
39
|
if b64_json:
|
40
40
|
image_base64 = b64_json
|
41
41
|
|
42
42
|
is_thinking = safe_get(json_data, "parts", 0, "thought", default=False)
|
43
|
+
if is_thinking:
|
44
|
+
content = safe_get(json_data, "parts", 1, "text", default="")
|
43
45
|
|
44
46
|
function_call_name = safe_get(json_data, "functionCall", "name", default=None)
|
45
|
-
function_full_response =
|
47
|
+
function_full_response = safe_get(json_data, "functionCall", "args", default="")
|
48
|
+
function_full_response = json.dumps(function_full_response) if function_full_response else None
|
46
49
|
|
47
50
|
blockReason = safe_get(json_data, 0, "promptFeedback", "blockReason", default=None)
|
48
51
|
|
49
|
-
return is_thinking, content, image_base64, function_call_name, function_full_response, blockReason, promptTokenCount, candidatesTokenCount, totalTokenCount
|
52
|
+
return is_thinking, reasoning_content, content, image_base64, function_call_name, function_full_response, finishReason, blockReason, promptTokenCount, candidatesTokenCount, totalTokenCount
|
50
53
|
|
51
54
|
async def fetch_gemini_response_stream(client, url, headers, payload, model):
|
52
55
|
timestamp = int(datetime.timestamp(datetime.now()))
|
@@ -62,12 +65,18 @@ async def fetch_gemini_response_stream(client, url, headers, payload, model):
|
|
62
65
|
parts_json = ""
|
63
66
|
async for chunk in response.aiter_text():
|
64
67
|
buffer += chunk
|
65
|
-
|
68
|
+
if buffer and "\n" not in buffer:
|
69
|
+
buffer += "\n"
|
66
70
|
|
67
71
|
while "\n" in buffer:
|
68
72
|
line, buffer = buffer.split("\n", 1)
|
69
73
|
if line.startswith("data: "):
|
70
74
|
parts_json = line.lstrip("data: ").strip()
|
75
|
+
try:
|
76
|
+
json.loads(parts_json)
|
77
|
+
except json.JSONDecodeError:
|
78
|
+
logger.error(f"JSON decode error: {parts_json}")
|
79
|
+
continue
|
71
80
|
else:
|
72
81
|
parts_json += line
|
73
82
|
parts_json = parts_json.lstrip("[,")
|
@@ -77,12 +86,12 @@ async def fetch_gemini_response_stream(client, url, headers, payload, model):
|
|
77
86
|
continue
|
78
87
|
|
79
88
|
# https://ai.google.dev/api/generate-content?hl=zh-cn#FinishReason
|
80
|
-
is_thinking, content, image_base64, function_call_name, function_full_response, blockReason, promptTokenCount, candidatesTokenCount, totalTokenCount = gemini_json_poccess(parts_json)
|
89
|
+
is_thinking, reasoning_content, content, image_base64, function_call_name, function_full_response, finishReason, blockReason, promptTokenCount, candidatesTokenCount, totalTokenCount = gemini_json_poccess(parts_json)
|
81
90
|
|
82
91
|
if is_thinking:
|
83
|
-
sse_string = await generate_sse_response(timestamp, model, reasoning_content=
|
92
|
+
sse_string = await generate_sse_response(timestamp, model, reasoning_content=reasoning_content)
|
84
93
|
yield sse_string
|
85
|
-
|
94
|
+
if not image_base64 and content:
|
86
95
|
sse_string = await generate_sse_response(timestamp, model, content=content)
|
87
96
|
yield sse_string
|
88
97
|
|
@@ -99,9 +108,10 @@ async def fetch_gemini_response_stream(client, url, headers, payload, model):
|
|
99
108
|
if parts_json == "[]" or blockReason == "PROHIBITED_CONTENT":
|
100
109
|
sse_string = await generate_sse_response(timestamp, model, stop="PROHIBITED_CONTENT")
|
101
110
|
yield sse_string
|
102
|
-
|
111
|
+
elif finishReason:
|
103
112
|
sse_string = await generate_sse_response(timestamp, model, stop="stop")
|
104
113
|
yield sse_string
|
114
|
+
break
|
105
115
|
|
106
116
|
parts_json = ""
|
107
117
|
|
@@ -187,7 +187,8 @@ class chatgpt(BaseLLM):
|
|
187
187
|
# print(json.dumps(replaced_text, indent=4, ensure_ascii=False))
|
188
188
|
while message_index < conversation_len:
|
189
189
|
if self.conversation[convo_id][message_index]["role"] == self.conversation[convo_id][message_index + 1]["role"]:
|
190
|
-
if self.conversation[convo_id][message_index].get("content") and self.conversation[convo_id][message_index + 1].get("content")
|
190
|
+
if self.conversation[convo_id][message_index].get("content") and self.conversation[convo_id][message_index + 1].get("content") \
|
191
|
+
and self.conversation[convo_id][message_index].get("content") != self.conversation[convo_id][message_index + 1].get("content"):
|
191
192
|
if type(self.conversation[convo_id][message_index + 1]["content"]) == str \
|
192
193
|
and type(self.conversation[convo_id][message_index]["content"]) == list:
|
193
194
|
self.conversation[convo_id][message_index + 1]["content"] = [{"type": "text", "text": self.conversation[convo_id][message_index + 1]["content"]}]
|
@@ -754,8 +755,8 @@ class chatgpt(BaseLLM):
|
|
754
755
|
|
755
756
|
# 打印日志
|
756
757
|
if self.print_log:
|
757
|
-
print("api_url", kwargs.get('api_url', self.api_url.chat_url) == url)
|
758
|
-
print("api_url", kwargs.get('api_url', self.api_url.chat_url))
|
758
|
+
# print("api_url", kwargs.get('api_url', self.api_url.chat_url) == url)
|
759
|
+
# print("api_url", kwargs.get('api_url', self.api_url.chat_url))
|
759
760
|
print("api_url", url)
|
760
761
|
# print("headers", headers)
|
761
762
|
print("api_key", kwargs.get('api_key', self.api_key))
|
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
|
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
|