beswarm 0.2.72__tar.gz → 0.2.75__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.72 → beswarm-0.2.75}/PKG-INFO +1 -1
  2. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/agents/planact.py +5 -4
  3. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/response.py +5 -6
  4. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/models/chatgpt.py +19 -1
  5. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/subtasks.py +4 -1
  6. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm.egg-info/PKG-INFO +1 -1
  7. {beswarm-0.2.72 → beswarm-0.2.75}/pyproject.toml +1 -1
  8. {beswarm-0.2.72 → beswarm-0.2.75}/MANIFEST.in +0 -0
  9. {beswarm-0.2.72 → beswarm-0.2.75}/README.md +0 -0
  10. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/__init__.py +0 -0
  11. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/agents/chatgroup.py +0 -0
  12. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/__init__.py +0 -0
  13. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/__init__.py +0 -0
  14. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/log_config.py +0 -0
  15. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/models.py +0 -0
  16. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/request.py +0 -0
  17. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/test/test_base_api.py +0 -0
  18. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/test/test_geminimask.py +0 -0
  19. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/test/test_image.py +0 -0
  20. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/test/test_payload.py +0 -0
  21. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/core/utils.py +0 -0
  22. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/models/__init__.py +0 -0
  23. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/models/audio.py +0 -0
  24. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/models/base.py +0 -0
  25. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/__init__.py +0 -0
  26. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/arXiv.py +0 -0
  27. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/config.py +0 -0
  28. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/excute_command.py +0 -0
  29. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/get_time.py +0 -0
  30. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/image.py +0 -0
  31. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/list_directory.py +0 -0
  32. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/read_file.py +0 -0
  33. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/read_image.py +0 -0
  34. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/readonly.py +0 -0
  35. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/registry.py +0 -0
  36. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/run_python.py +0 -0
  37. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/websearch.py +0 -0
  38. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/plugins/write_file.py +0 -0
  39. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/utils/__init__.py +0 -0
  40. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/utils/prompt.py +0 -0
  41. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/aient/utils/scripts.py +0 -0
  42. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_Web_crawler.py +0 -0
  43. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_ddg_search.py +0 -0
  44. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_google_search.py +0 -0
  45. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_ollama.py +0 -0
  46. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_plugin.py +0 -0
  47. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_search.py +0 -0
  48. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_url.py +0 -0
  49. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_whisper.py +0 -0
  50. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/aient/test/test_yjh.py +0 -0
  51. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/bemcp/bemcp/__init__.py +0 -0
  52. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/bemcp/bemcp/decorator.py +0 -0
  53. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/bemcp/bemcp/main.py +0 -0
  54. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/bemcp/bemcp/utils.py +0 -0
  55. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/bemcp/test/client.py +0 -0
  56. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/bemcp/test/server.py +0 -0
  57. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/broker.py +0 -0
  58. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/core.py +0 -0
  59. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/knowledge_graph.py +0 -0
  60. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/prompt.py +0 -0
  61. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
  62. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  63. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  64. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  65. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  66. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  67. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  68. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  69. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  70. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  71. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  72. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  73. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  74. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  75. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  76. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  77. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  78. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  79. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  80. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  81. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  82. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  83. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  84. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  85. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  86. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  87. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  88. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/README.md +0 -0
  89. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
  90. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  91. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  92. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
  93. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  94. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  95. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
  96. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
  97. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  98. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
  99. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  100. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  101. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  102. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
  103. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
  104. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
  105. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  106. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
  107. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
  108. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  109. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/taskmanager.py +0 -0
  110. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/__init__.py +0 -0
  111. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/click.py +0 -0
  112. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/completion.py +0 -0
  113. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/edit_file.py +0 -0
  114. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/graph.py +0 -0
  115. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/planner.py +0 -0
  116. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/repomap.py +0 -0
  117. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/request_input.py +0 -0
  118. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/screenshot.py +0 -0
  119. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/search_arxiv.py +0 -0
  120. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/search_web.py +0 -0
  121. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/worker.py +0 -0
  122. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/tools/write_csv.py +0 -0
  123. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm/utils.py +0 -0
  124. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm.egg-info/SOURCES.txt +0 -0
  125. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm.egg-info/dependency_links.txt +0 -0
  126. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm.egg-info/requires.txt +0 -0
  127. {beswarm-0.2.72 → beswarm-0.2.75}/beswarm.egg-info/top_level.txt +0 -0
  128. {beswarm-0.2.72 → beswarm-0.2.75}/setup.cfg +0 -0
  129. {beswarm-0.2.72 → beswarm-0.2.75}/test/test_TaskManager.py +0 -0
  130. {beswarm-0.2.72 → beswarm-0.2.75}/test/test_broker.py +0 -0
  131. {beswarm-0.2.72 → beswarm-0.2.75}/test/test_graph.py +0 -0
  132. {beswarm-0.2.72 → beswarm-0.2.75}/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.72
3
+ Version: 0.2.75
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -12,10 +12,10 @@ 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, RetryFailedError
16
15
  from ..aient.aient.plugins import get_function_call_list, registry
17
16
  from ..prompt import worker_system_prompt, instruction_system_prompt
18
17
  from ..utils import extract_xml_content, get_current_screen_image_message, replace_xml_content, register_mcp_tools, setup_logger
18
+ from ..aient.aient.models.chatgpt import ModelNotFoundError, TaskComplete, RetryFailedError, InputTokenCountExceededError, BadRequestError
19
19
 
20
20
  try:
21
21
  from importlib import metadata
@@ -154,11 +154,12 @@ class InstructionAgent(BaseAgent):
154
154
  self.logger.error("❌ Commander retry failed, retrying...")
155
155
  self.broker.publish(message, self.error_topic)
156
156
  return
157
-
158
- if "'status_code': 413" in raw_response or \
159
- "'status_code': 400" in raw_response:
157
+ except InputTokenCountExceededError as e:
160
158
  self.broker.publish({"status": "error", "result": "The request body is too long, please try again."}, self.status_topic)
161
159
  return
160
+ except BadRequestError as e:
161
+ self.broker.publish({"status": "error", "result": "Bad request error!"}, self.status_topic)
162
+ return
162
163
 
163
164
  self.broker.publish({"status": "new_message", "result": "\n🤖 指令智能体:\n" + raw_response}, self.status_topic)
164
165
 
@@ -21,13 +21,12 @@ async def check_response(response, error_log):
21
21
  return {"error": f"{error_log} HTTP Error", "status_code": response.status_code, "details": error_json}
22
22
  return None
23
23
 
24
- async def gemini_json_poccess(response_str):
24
+ async def gemini_json_poccess(response_json):
25
25
  promptTokenCount = 0
26
26
  candidatesTokenCount = 0
27
27
  totalTokenCount = 0
28
28
  image_base64 = None
29
29
 
30
- response_json = await asyncio.to_thread(json.loads, response_str)
31
30
  json_data = safe_get(response_json, "candidates", 0, "content", default=None)
32
31
  finishReason = safe_get(response_json, "candidates", 0 , "finishReason", default=None)
33
32
  if finishReason:
@@ -48,7 +47,7 @@ async def gemini_json_poccess(response_str):
48
47
 
49
48
  function_call_name = safe_get(json_data, "functionCall", "name", default=None)
50
49
  function_full_response = safe_get(json_data, "functionCall", "args", default="")
51
- function_full_response = json.dumps(function_full_response) if function_full_response else None
50
+ function_full_response = await asyncio.to_thread(json.dumps, function_full_response) if function_full_response else None
52
51
 
53
52
  blockReason = safe_get(json_data, 0, "promptFeedback", "blockReason", default=None)
54
53
 
@@ -77,7 +76,7 @@ async def fetch_gemini_response_stream(client, url, headers, payload, model, tim
77
76
  if line.startswith("data: "):
78
77
  parts_json = line.lstrip("data: ").strip()
79
78
  try:
80
- await asyncio.to_thread(json.loads, parts_json)
79
+ response_json = await asyncio.to_thread(json.loads, parts_json)
81
80
  except json.JSONDecodeError:
82
81
  logger.error(f"JSON decode error: {parts_json}")
83
82
  continue
@@ -85,12 +84,12 @@ async def fetch_gemini_response_stream(client, url, headers, payload, model, tim
85
84
  parts_json += line
86
85
  parts_json = parts_json.lstrip("[,")
87
86
  try:
88
- await asyncio.to_thread(json.loads, parts_json)
87
+ response_json = await asyncio.to_thread(json.loads, parts_json)
89
88
  except json.JSONDecodeError:
90
89
  continue
91
90
 
92
91
  # https://ai.google.dev/api/generate-content?hl=zh-cn#FinishReason
93
- is_thinking, reasoning_content, content, image_base64, function_call_name, function_full_response, finishReason, blockReason, promptTokenCount, candidatesTokenCount, totalTokenCount = await gemini_json_poccess(parts_json)
92
+ is_thinking, reasoning_content, content, image_base64, function_call_name, function_full_response, finishReason, blockReason, promptTokenCount, candidatesTokenCount, totalTokenCount = await gemini_json_poccess(response_json)
94
93
 
95
94
  if is_thinking:
96
95
  sse_string = await generate_sse_response(timestamp, model, reasoning_content=reasoning_content)
@@ -37,10 +37,18 @@ class RateLimitError(Exception):
37
37
  """Custom exception for rate limit (429) errors."""
38
38
  pass
39
39
 
40
+ class BadRequestError(Exception):
41
+ """Custom exception for bad request (400) errors."""
42
+ pass
43
+
40
44
  class HTTPError(Exception):
41
45
  """Custom exception for HTTP 500 errors."""
42
46
  pass
43
47
 
48
+ class InputTokenCountExceededError(Exception):
49
+ """Custom exception for input token count exceeding the maximum."""
50
+ pass
51
+
44
52
  class ConfigurationError(Exception):
45
53
  """Custom exception for configuration errors."""
46
54
  pass
@@ -802,6 +810,10 @@ class chatgpt(BaseLLM):
802
810
  raise ModelNotFoundError(f"Model: {model or self.engine} not found!")
803
811
  if "HTTP Error', 'status_code': 429" in processed_chunk:
804
812
  raise RateLimitError(f"Rate limit exceeded for model: {model or self.engine}")
813
+ if "HTTP Error', 'status_code': 413" in processed_chunk:
814
+ raise InputTokenCountExceededError(processed_chunk)
815
+ if "HTTP Error', 'status_code': 400" in processed_chunk:
816
+ raise BadRequestError(f"Bad Request: {processed_chunk}")
805
817
  if "HTTP Error', 'status_code': " in processed_chunk:
806
818
  raise HTTPError(f"HTTP Error: {processed_chunk}")
807
819
  yield processed_chunk
@@ -814,7 +826,7 @@ class chatgpt(BaseLLM):
814
826
  return # Stop iteration
815
827
  except httpx.RemoteProtocolError:
816
828
  continue
817
- except httpx.ReadError:
829
+ except httpx.ReadError as e:
818
830
  self.logger.warning(f"{e}, retrying...")
819
831
  continue
820
832
  except APITimeoutError:
@@ -826,6 +838,12 @@ class chatgpt(BaseLLM):
826
838
  except RateLimitError as e:
827
839
  self.logger.warning(f"{e}, retrying...")
828
840
  continue
841
+ except InputTokenCountExceededError as e:
842
+ self.logger.error(f"The request body is too long: {e}")
843
+ raise
844
+ except BadRequestError as e:
845
+ self.logger.error(f"Bad request error: {e}")
846
+ raise
829
847
  except ValidationError as e:
830
848
  self.logger.warning(f"Validation failed: {e}. Retrying with corrective prompt.")
831
849
  need_done_prompt = [
@@ -36,11 +36,14 @@ def create_task(goal, tools, work_dir):
36
36
  }
37
37
  ]
38
38
 
39
+ if work_dir == str(task_manager.root_path):
40
+ return f"<tool_error>子任务的工作目录位置在主任务的工作目录的子目录。子任务工作目录**禁止**设置为主任务目录本身。请重新创建子任务。当前主任务工作目录:{task_manager.root_path}</tool_error>"
41
+
39
42
  # 调用新的批量创建接口
40
43
  task_ids = task_manager.create_tasks_batch(worker_fun, tasks_params)
41
44
 
42
45
  # 返回新创建的单个任务ID
43
- return f"子任务已提交到队列,ID: {task_ids[0]}" if task_ids else "任务提交失败"
46
+ return f"子任务已提交到队列,ID: {task_ids[0]}" if task_ids else "<tool_error>任务提交失败</tool_error>"
44
47
 
45
48
  @register_tool()
46
49
  def resume_task(task_id, goal):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.72
3
+ Version: 0.2.75
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.72"
3
+ version = "0.2.75"
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