beswarm 0.2.64__tar.gz → 0.2.66__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 (132) hide show
  1. {beswarm-0.2.64 → beswarm-0.2.66}/PKG-INFO +1 -1
  2. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/agents/planact.py +18 -9
  3. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/request.py +34 -15
  4. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/response.py +22 -0
  5. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/utils.py +6 -3
  6. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/models/chatgpt.py +14 -6
  7. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm.egg-info/PKG-INFO +1 -1
  8. {beswarm-0.2.64 → beswarm-0.2.66}/pyproject.toml +1 -1
  9. {beswarm-0.2.64 → beswarm-0.2.66}/MANIFEST.in +0 -0
  10. {beswarm-0.2.64 → beswarm-0.2.66}/README.md +0 -0
  11. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/__init__.py +0 -0
  12. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/agents/chatgroup.py +0 -0
  13. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/__init__.py +0 -0
  14. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/__init__.py +0 -0
  15. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/log_config.py +0 -0
  16. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/models.py +0 -0
  17. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/test/test_base_api.py +0 -0
  18. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/test/test_geminimask.py +0 -0
  19. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/test/test_image.py +0 -0
  20. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/core/test/test_payload.py +0 -0
  21. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/models/__init__.py +0 -0
  22. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/models/audio.py +0 -0
  23. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/models/base.py +0 -0
  24. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/__init__.py +0 -0
  25. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/arXiv.py +0 -0
  26. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/config.py +0 -0
  27. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/excute_command.py +0 -0
  28. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/get_time.py +0 -0
  29. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/image.py +0 -0
  30. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/list_directory.py +0 -0
  31. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/read_file.py +0 -0
  32. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/read_image.py +0 -0
  33. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/readonly.py +0 -0
  34. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/registry.py +0 -0
  35. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/run_python.py +0 -0
  36. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/websearch.py +0 -0
  37. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/plugins/write_file.py +0 -0
  38. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/utils/__init__.py +0 -0
  39. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/utils/prompt.py +0 -0
  40. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/aient/utils/scripts.py +0 -0
  41. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_Web_crawler.py +0 -0
  42. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_ddg_search.py +0 -0
  43. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_google_search.py +0 -0
  44. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_ollama.py +0 -0
  45. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_plugin.py +0 -0
  46. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_search.py +0 -0
  47. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_url.py +0 -0
  48. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_whisper.py +0 -0
  49. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/aient/test/test_yjh.py +0 -0
  50. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/bemcp/bemcp/__init__.py +0 -0
  51. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/bemcp/bemcp/decorator.py +0 -0
  52. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/bemcp/bemcp/main.py +0 -0
  53. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/bemcp/bemcp/utils.py +0 -0
  54. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/bemcp/test/client.py +0 -0
  55. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/bemcp/test/server.py +0 -0
  56. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/broker.py +0 -0
  57. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/core.py +0 -0
  58. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/knowledge_graph.py +0 -0
  59. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/prompt.py +0 -0
  60. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
  61. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  62. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  63. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  64. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  65. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  66. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  67. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  68. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  69. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  70. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  71. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  72. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  73. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  74. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  75. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  76. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  77. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  78. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  79. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  80. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  81. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  82. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  83. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  84. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  85. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  86. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  87. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/README.md +0 -0
  88. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
  89. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  90. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  91. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
  92. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  93. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  94. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
  95. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
  96. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  97. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
  98. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  99. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  100. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  101. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
  102. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
  103. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
  104. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  105. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
  106. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
  107. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  108. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/taskmanager.py +0 -0
  109. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/__init__.py +0 -0
  110. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/click.py +0 -0
  111. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/completion.py +0 -0
  112. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/edit_file.py +0 -0
  113. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/graph.py +0 -0
  114. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/planner.py +0 -0
  115. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/repomap.py +0 -0
  116. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/request_input.py +0 -0
  117. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/screenshot.py +0 -0
  118. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/search_arxiv.py +0 -0
  119. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/search_web.py +0 -0
  120. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/subtasks.py +0 -0
  121. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/worker.py +0 -0
  122. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/tools/write_csv.py +0 -0
  123. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm/utils.py +0 -0
  124. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm.egg-info/SOURCES.txt +0 -0
  125. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm.egg-info/dependency_links.txt +0 -0
  126. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm.egg-info/requires.txt +0 -0
  127. {beswarm-0.2.64 → beswarm-0.2.66}/beswarm.egg-info/top_level.txt +0 -0
  128. {beswarm-0.2.64 → beswarm-0.2.66}/setup.cfg +0 -0
  129. {beswarm-0.2.64 → beswarm-0.2.66}/test/test_TaskManager.py +0 -0
  130. {beswarm-0.2.64 → beswarm-0.2.66}/test/test_broker.py +0 -0
  131. {beswarm-0.2.64 → beswarm-0.2.66}/test/test_graph.py +0 -0
  132. {beswarm-0.2.64 → beswarm-0.2.66}/test/test_new_TaskManager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.64
3
+ Version: 0.2.66
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -12,7 +12,7 @@ from typing import List, Dict, Union
12
12
 
13
13
  from ..broker import MessageBroker
14
14
  from ..aient.aient.models import chatgpt
15
- from ..aient.aient.models.chatgpt import ModelNotFoundError, TaskComplete
15
+ from ..aient.aient.models.chatgpt import ModelNotFoundError, TaskComplete, RetryFailedError
16
16
  from ..aient.aient.plugins import get_function_call_list, registry
17
17
  from ..prompt import worker_system_prompt, instruction_system_prompt
18
18
  from ..utils import extract_xml_content, get_current_screen_image_message, replace_xml_content, register_mcp_tools, setup_logger
@@ -90,8 +90,16 @@ class InstructionAgent(BaseAgent):
90
90
  self.goal_diff = '\n'.join(changed_lines).strip()
91
91
 
92
92
  def get_conversation_history(self, raw_conversation_history: List[Dict]):
93
- conversation_history = copy.deepcopy(raw_conversation_history)
94
93
 
94
+ for index, message in enumerate(raw_conversation_history):
95
+ if message.get("content") and isinstance(message["content"], str):
96
+ if "<knowledge_graph_tree>" in message["content"] and self.graph_tree:
97
+ message["content"] = replace_xml_content(message["content"], "knowledge_graph_tree", self.graph_tree)
98
+ raw_conversation_history[index] = message
99
+ if "\n\nYour message **must** end with [done] to signify the end of your output." in message["content"]:
100
+ message["content"] = message["content"].replace("\n\nYour message **must** end with [done] to signify the end of your output.", "")
101
+
102
+ conversation_history = copy.deepcopy(raw_conversation_history)
95
103
  self.cache_file.write_text(json.dumps(conversation_history, ensure_ascii=False, indent=4), encoding="utf-8")
96
104
 
97
105
  work_agent_system_prompt = conversation_history.pop(0)
@@ -113,13 +121,6 @@ class InstructionAgent(BaseAgent):
113
121
  if "<knowledge_graph_tree>" in message["content"] and self.graph_tree:
114
122
  message["content"] = replace_xml_content(message["content"], "knowledge_graph_tree", self.graph_tree)
115
123
 
116
- for index, message in enumerate(raw_conversation_history):
117
- if message.get("content") and isinstance(message["content"], str):
118
- if "<knowledge_graph_tree>" in message["content"] and self.graph_tree:
119
- message["content"] = replace_xml_content(message["content"], "knowledge_graph_tree", self.graph_tree)
120
- raw_conversation_history[index] = message
121
- if "\n\nYour message **must** end with [done] to signify the end of your output." in message["content"]:
122
- message["content"] = message["content"].replace("\n\nYour message **must** end with [done] to signify the end of your output.", "")
123
124
 
124
125
  return conversation_history
125
126
 
@@ -149,6 +150,10 @@ class InstructionAgent(BaseAgent):
149
150
  raw_response = await self.agent.ask_async(instruction_prompt)
150
151
  except ModelNotFoundError as e:
151
152
  raise Exception(str(e))
153
+ except RetryFailedError as e:
154
+ self.logger.error("❌ Commander retry failed, retrying...")
155
+ self.broker.publish(message, self.error_topic)
156
+ return
152
157
 
153
158
  if "'status_code': 413" in raw_response or \
154
159
  "'status_code': 400" in raw_response:
@@ -220,6 +225,10 @@ class WorkerAgent(BaseAgent):
220
225
  except TaskComplete as e:
221
226
  self.broker.publish({"status": "finished", "result": e.completion_message}, self.status_topic)
222
227
  return
228
+ except RetryFailedError as e:
229
+ self.logger.error("❌ Worker retry failed, retrying...")
230
+ self.broker.publish(message, self.error_topic)
231
+ return
223
232
 
224
233
  if response.strip() == '':
225
234
  self.logger.error("\n❌ 工作智能体回复为空,请重新生成指令。")
@@ -3,9 +3,9 @@ import json
3
3
  import httpx
4
4
  import base64
5
5
  import asyncio
6
- import urllib.parse
7
6
  from io import IOBase
8
7
  from typing import Tuple
8
+ from urllib.parse import urlparse
9
9
 
10
10
  from .models import RequestModel, Message
11
11
  from .utils import (
@@ -41,7 +41,7 @@ async def get_gemini_payload(request, engine, provider, api_key=None):
41
41
  else:
42
42
  gemini_stream = "generateContent"
43
43
  url = provider['base_url']
44
- parsed_url = urllib.parse.urlparse(url)
44
+ parsed_url = urlparse(url)
45
45
  if "/v1beta" in parsed_url.path:
46
46
  api_version = "v1beta"
47
47
  else:
@@ -1952,21 +1952,40 @@ async def get_embedding_payload(request, engine, provider, api_key=None):
1952
1952
  headers = {
1953
1953
  "Content-Type": "application/json",
1954
1954
  }
1955
- if api_key:
1956
- headers['Authorization'] = f"Bearer {api_key}"
1957
- url = provider['base_url']
1958
- url = BaseAPI(url).embeddings
1959
1955
 
1960
- payload = {
1961
- "input": request.input,
1962
- "model": original_model,
1963
- }
1956
+ url = provider['base_url']
1957
+ parsed_url = urlparse(url)
1958
+ if "embedding-00" in original_model and "127.0.0.1" not in url and \
1959
+ (parsed_url.path.endswith("/v1beta") or \
1960
+ parsed_url.path.endswith("/v1") or \
1961
+ (parsed_url.netloc == 'generativelanguage.googleapis.com' and "openai/chat/completions" not in parsed_url.path)):
1962
+ if api_key:
1963
+ headers['x-goog-api-key'] = f"{api_key}"
1964
+ parsed_url = urllib.parse.urlparse(url)
1965
+ url = f"{parsed_url.scheme}://{parsed_url.netloc}{parsed_url.path.split('/models')[0].rstrip('/')}/models/{original_model}:embedContent"
1966
+ payload = {
1967
+ "content": {
1968
+ "parts": [
1969
+ {
1970
+ "text": request.input
1971
+ }
1972
+ ]
1973
+ }
1974
+ }
1975
+ else:
1976
+ if api_key:
1977
+ headers['Authorization'] = f"Bearer {api_key}"
1978
+ url = BaseAPI(url).embeddings
1979
+ payload = {
1980
+ "input": request.input,
1981
+ "model": original_model,
1982
+ }
1964
1983
 
1965
- if request.encoding_format:
1966
- if url.startswith("https://api.jina.ai"):
1967
- payload["embedding_type"] = request.encoding_format
1968
- else:
1969
- payload["encoding_format"] = request.encoding_format
1984
+ if request.encoding_format:
1985
+ if url.startswith("https://api.jina.ai"):
1986
+ payload["embedding_type"] = request.encoding_format
1987
+ else:
1988
+ payload["encoding_format"] = request.encoding_format
1970
1989
 
1971
1990
  return url, headers, payload
1972
1991
 
@@ -626,6 +626,28 @@ async def fetch_response(client, url, headers, payload, engine, model, timeout=2
626
626
  response_json = await asyncio.to_thread(json.loads, response_bytes)
627
627
  content = safe_get(response_json, "output", "choices", 0, "message", "content", 0, default=None)
628
628
  yield content
629
+
630
+ elif "embedContent" in url:
631
+ response_bytes = await response.aread()
632
+ response_json = await asyncio.to_thread(json.loads, response_bytes)
633
+ content = safe_get(response_json, "embedding", "values", default=[])
634
+ response_embedContent = {
635
+ "object": "list",
636
+ "data": [
637
+ {
638
+ "object": "embedding",
639
+ "embedding":content,
640
+ "index": 0
641
+ }
642
+ ],
643
+ "model": model,
644
+ "usage": {
645
+ "prompt_tokens": 0,
646
+ "total_tokens": 0
647
+ }
648
+ }
649
+
650
+ yield response_embedContent
629
651
  else:
630
652
  response_bytes = await response.aread()
631
653
  response_json = await asyncio.to_thread(json.loads, response_bytes)
@@ -518,7 +518,7 @@ async def generate_sse_response(timestamp, model, content=None, tools_id=None, f
518
518
  sample_data["choices"][0]["delta"] = {}
519
519
  sample_data["choices"][0]["finish_reason"] = stop
520
520
 
521
- json_data = json.dumps(sample_data, ensure_ascii=False)
521
+ json_data = await asyncio.to_thread(json.dumps, sample_data, ensure_ascii=False)
522
522
  # print("json_data", json.dumps(sample_data, indent=4, ensure_ascii=False))
523
523
 
524
524
  # 构建SSE响应
@@ -557,6 +557,9 @@ async def generate_no_stream_response(timestamp, model, content=None, tools_id=N
557
557
  if function_call_name:
558
558
  if not tools_id:
559
559
  tools_id = f"call_{random_str}"
560
+
561
+ arguments_json = await asyncio.to_thread(json.dumps, function_call_content, ensure_ascii=False)
562
+
560
563
  sample_data = {
561
564
  "id": f"chatcmpl-{random_str}",
562
565
  "object": "chat.completion",
@@ -574,7 +577,7 @@ async def generate_no_stream_response(timestamp, model, content=None, tools_id=N
574
577
  "type": "function",
575
578
  "function": {
576
579
  "name": function_call_name,
577
- "arguments": json.dumps(function_call_content, ensure_ascii=False)
580
+ "arguments": arguments_json
578
581
  }
579
582
  }
580
583
  ],
@@ -605,7 +608,7 @@ async def generate_no_stream_response(timestamp, model, content=None, tools_id=N
605
608
  if total_tokens:
606
609
  sample_data["usage"] = {"prompt_tokens": prompt_tokens, "completion_tokens": completion_tokens, "total_tokens": total_tokens}
607
610
 
608
- json_data = json.dumps(sample_data, ensure_ascii=False)
611
+ json_data = await asyncio.to_thread(json.dumps, sample_data, ensure_ascii=False)
609
612
  # print("json_data", json.dumps(sample_data, indent=4, ensure_ascii=False))
610
613
 
611
614
  return json_data
@@ -37,6 +37,14 @@ class RateLimitError(Exception):
37
37
  """Custom exception for rate limit (429) errors."""
38
38
  pass
39
39
 
40
+ class ConfigurationError(Exception):
41
+ """Custom exception for configuration errors."""
42
+ pass
43
+
44
+ class RetryFailedError(Exception):
45
+ """Custom exception for retry failures."""
46
+ pass
47
+
40
48
  class TaskComplete(Exception):
41
49
  """Exception-like signal to indicate the task is complete."""
42
50
  def __init__(self, message):
@@ -731,7 +739,7 @@ class chatgpt(BaseLLM):
731
739
  need_done_prompt = False
732
740
 
733
741
  # 发送请求并处理响应
734
- for i in range(30):
742
+ for i in range(10):
735
743
  tmp_post_json = copy.deepcopy(json_post)
736
744
  if need_done_prompt:
737
745
  tmp_post_json["messages"].extend(need_done_prompt)
@@ -789,8 +797,8 @@ class chatgpt(BaseLLM):
789
797
 
790
798
  # 成功处理,跳出重试循环
791
799
  break
792
- except (httpx.ConnectError, httpx.ReadTimeout):
793
- self.logger.error("连接或读取超时错误,请检查服务器状态或网络连接。")
800
+ except (httpx.ConnectError, httpx.ReadTimeout, httpx.PoolTimeout):
801
+ self.logger.error("Connection or read timeout.")
794
802
  return # Stop iteration
795
803
  except httpx.RemoteProtocolError:
796
804
  continue
@@ -820,10 +828,10 @@ class chatgpt(BaseLLM):
820
828
  self.logger.error(traceback.format_exc())
821
829
  if "Invalid URL" in str(e):
822
830
  error_message = "您输入了无效的API URL,请使用正确的URL并使用`/start`命令重新设置API URL。具体错误如下:\n\n" + str(e)
823
- raise Exception(json.dumps({"type": "configuration_error", "message": error_message}, ensure_ascii=False))
831
+ raise ConfigurationError(error_message)
824
832
  # 最后一次重试失败,向上抛出异常
825
- if i == 11:
826
- raise Exception(json.dumps({"type": "retry_failed", "message": str(e)}, ensure_ascii=False))
833
+ if i == 10:
834
+ raise RetryFailedError(str(e))
827
835
 
828
836
  def ask_stream(
829
837
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.64
3
+ Version: 0.2.66
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "beswarm"
3
- version = "0.2.64"
3
+ version = "0.2.66"
4
4
  description = "MAS"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
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