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.
Files changed (79) hide show
  1. {aient-1.1.53/src/aient.egg-info → aient-1.1.55}/PKG-INFO +1 -1
  2. {aient-1.1.53 → aient-1.1.55}/setup.py +1 -1
  3. {aient-1.1.53 → aient-1.1.55}/src/aient/core/request.py +24 -5
  4. {aient-1.1.53 → aient-1.1.55}/src/aient/core/response.py +18 -8
  5. {aient-1.1.53 → aient-1.1.55}/src/aient/models/chatgpt.py +4 -3
  6. {aient-1.1.53 → aient-1.1.55/src/aient.egg-info}/PKG-INFO +1 -1
  7. {aient-1.1.53 → aient-1.1.55}/LICENSE +0 -0
  8. {aient-1.1.53 → aient-1.1.55}/MANIFEST.in +0 -0
  9. {aient-1.1.53 → aient-1.1.55}/README.md +0 -0
  10. {aient-1.1.53 → aient-1.1.55}/setup.cfg +0 -0
  11. {aient-1.1.53 → aient-1.1.55}/src/aient/__init__.py +0 -0
  12. {aient-1.1.53 → aient-1.1.55}/src/aient/core/.git +0 -0
  13. {aient-1.1.53 → aient-1.1.55}/src/aient/core/.gitignore +0 -0
  14. {aient-1.1.53 → aient-1.1.55}/src/aient/core/__init__.py +0 -0
  15. {aient-1.1.53 → aient-1.1.55}/src/aient/core/log_config.py +0 -0
  16. {aient-1.1.53 → aient-1.1.55}/src/aient/core/models.py +0 -0
  17. {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_base_api.py +0 -0
  18. {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_geminimask.py +0 -0
  19. {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_image.py +0 -0
  20. {aient-1.1.53 → aient-1.1.55}/src/aient/core/test/test_payload.py +0 -0
  21. {aient-1.1.53 → aient-1.1.55}/src/aient/core/utils.py +0 -0
  22. {aient-1.1.53 → aient-1.1.55}/src/aient/models/__init__.py +0 -0
  23. {aient-1.1.53 → aient-1.1.55}/src/aient/models/audio.py +0 -0
  24. {aient-1.1.53 → aient-1.1.55}/src/aient/models/base.py +0 -0
  25. {aient-1.1.53 → aient-1.1.55}/src/aient/models/claude.py +0 -0
  26. {aient-1.1.53 → aient-1.1.55}/src/aient/models/duckduckgo.py +0 -0
  27. {aient-1.1.53 → aient-1.1.55}/src/aient/models/gemini.py +0 -0
  28. {aient-1.1.53 → aient-1.1.55}/src/aient/models/groq.py +0 -0
  29. {aient-1.1.53 → aient-1.1.55}/src/aient/models/vertex.py +0 -0
  30. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/__init__.py +0 -0
  31. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/arXiv.py +0 -0
  32. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/config.py +0 -0
  33. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/excute_command.py +0 -0
  34. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/get_time.py +0 -0
  35. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/image.py +0 -0
  36. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/list_directory.py +0 -0
  37. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/read_file.py +0 -0
  38. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/read_image.py +0 -0
  39. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/readonly.py +0 -0
  40. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/registry.py +0 -0
  41. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/run_python.py +0 -0
  42. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/websearch.py +0 -0
  43. {aient-1.1.53 → aient-1.1.55}/src/aient/plugins/write_file.py +0 -0
  44. {aient-1.1.53 → aient-1.1.55}/src/aient/utils/__init__.py +0 -0
  45. {aient-1.1.53 → aient-1.1.55}/src/aient/utils/prompt.py +0 -0
  46. {aient-1.1.53 → aient-1.1.55}/src/aient/utils/scripts.py +0 -0
  47. {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/SOURCES.txt +0 -0
  48. {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/dependency_links.txt +0 -0
  49. {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/requires.txt +0 -0
  50. {aient-1.1.53 → aient-1.1.55}/src/aient.egg-info/top_level.txt +0 -0
  51. {aient-1.1.53 → aient-1.1.55}/test/test.py +0 -0
  52. {aient-1.1.53 → aient-1.1.55}/test/test_API.py +0 -0
  53. {aient-1.1.53 → aient-1.1.55}/test/test_Deepbricks.py +0 -0
  54. {aient-1.1.53 → aient-1.1.55}/test/test_Web_crawler.py +0 -0
  55. {aient-1.1.53 → aient-1.1.55}/test/test_aiwaves.py +0 -0
  56. {aient-1.1.53 → aient-1.1.55}/test/test_aiwaves_arxiv.py +0 -0
  57. {aient-1.1.53 → aient-1.1.55}/test/test_ask_gemini.py +0 -0
  58. {aient-1.1.53 → aient-1.1.55}/test/test_class.py +0 -0
  59. {aient-1.1.53 → aient-1.1.55}/test/test_claude.py +0 -0
  60. {aient-1.1.53 → aient-1.1.55}/test/test_claude_zh_char.py +0 -0
  61. {aient-1.1.53 → aient-1.1.55}/test/test_ddg_search.py +0 -0
  62. {aient-1.1.53 → aient-1.1.55}/test/test_download_pdf.py +0 -0
  63. {aient-1.1.53 → aient-1.1.55}/test/test_gemini.py +0 -0
  64. {aient-1.1.53 → aient-1.1.55}/test/test_get_token_dict.py +0 -0
  65. {aient-1.1.53 → aient-1.1.55}/test/test_google_search.py +0 -0
  66. {aient-1.1.53 → aient-1.1.55}/test/test_jieba.py +0 -0
  67. {aient-1.1.53 → aient-1.1.55}/test/test_json.py +0 -0
  68. {aient-1.1.53 → aient-1.1.55}/test/test_logging.py +0 -0
  69. {aient-1.1.53 → aient-1.1.55}/test/test_ollama.py +0 -0
  70. {aient-1.1.53 → aient-1.1.55}/test/test_plugin.py +0 -0
  71. {aient-1.1.53 → aient-1.1.55}/test/test_py_run.py +0 -0
  72. {aient-1.1.53 → aient-1.1.55}/test/test_requests.py +0 -0
  73. {aient-1.1.53 → aient-1.1.55}/test/test_search.py +0 -0
  74. {aient-1.1.53 → aient-1.1.55}/test/test_tikitoken.py +0 -0
  75. {aient-1.1.53 → aient-1.1.55}/test/test_token.py +0 -0
  76. {aient-1.1.53 → aient-1.1.55}/test/test_url.py +0 -0
  77. {aient-1.1.53 → aient-1.1.55}/test/test_whisper.py +0 -0
  78. {aient-1.1.53 → aient-1.1.55}/test/test_wildcard.py +0 -0
  79. {aient-1.1.53 → aient-1.1.55}/test/test_yjh.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aient
3
- Version: 1.1.53
3
+ Version: 1.1.55
4
4
  Summary: Aient: The Awakening of Agent.
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
4
4
 
5
5
  setup(
6
6
  name="aient",
7
- version="1.1.53",
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 "o3" in original_model or "o4" in original_model:
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
- name = None
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
- name = msg.name
1370
- if name:
1371
- messages.append({"role": msg.role, "name": name, "content": content})
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 = json.dumps(safe_get(json_data, "functionCall", "args", default=""))
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
- cache_buffer += chunk
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=content)
92
+ sse_string = await generate_sse_response(timestamp, model, reasoning_content=reasoning_content)
84
93
  yield sse_string
85
- elif not image_base64 and content:
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
- else:
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))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aient
3
- Version: 1.1.53
3
+ Version: 1.1.55
4
4
  Summary: Aient: The Awakening of Agent.
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
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