beswarm 0.2.27__tar.gz → 0.2.29__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.

Potentially problematic release.


This version of beswarm might be problematic. Click here for more details.

Files changed (150) hide show
  1. {beswarm-0.2.27 → beswarm-0.2.29}/PKG-INFO +1 -1
  2. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/__init__.py +2 -0
  3. beswarm-0.2.29/beswarm/tools/completion.py +17 -0
  4. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/worker.py +29 -13
  5. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm.egg-info/PKG-INFO +1 -1
  6. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm.egg-info/SOURCES.txt +1 -0
  7. {beswarm-0.2.27 → beswarm-0.2.29}/pyproject.toml +1 -1
  8. {beswarm-0.2.27 → beswarm-0.2.29}/MANIFEST.in +0 -0
  9. {beswarm-0.2.27 → beswarm-0.2.29}/README.md +0 -0
  10. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/__init__.py +0 -0
  11. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/main.py +0 -0
  12. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/setup.py +0 -0
  13. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/__init__.py +0 -0
  14. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/__init__.py +0 -0
  15. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/log_config.py +0 -0
  16. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/models.py +0 -0
  17. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/request.py +0 -0
  18. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/response.py +0 -0
  19. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/test/test_base_api.py +0 -0
  20. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/test/test_geminimask.py +0 -0
  21. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/test/test_image.py +0 -0
  22. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/test/test_payload.py +0 -0
  23. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/core/utils.py +0 -0
  24. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/__init__.py +0 -0
  25. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/audio.py +0 -0
  26. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/base.py +0 -0
  27. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/chatgpt.py +0 -0
  28. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/claude.py +0 -0
  29. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/duckduckgo.py +0 -0
  30. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/gemini.py +0 -0
  31. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/groq.py +0 -0
  32. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/models/vertex.py +0 -0
  33. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/__init__.py +0 -0
  34. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/arXiv.py +0 -0
  35. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/config.py +0 -0
  36. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/excute_command.py +0 -0
  37. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/get_time.py +0 -0
  38. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/image.py +0 -0
  39. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/list_directory.py +0 -0
  40. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/read_file.py +0 -0
  41. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/read_image.py +0 -0
  42. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/readonly.py +0 -0
  43. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/registry.py +0 -0
  44. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/run_python.py +0 -0
  45. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/websearch.py +0 -0
  46. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/plugins/write_file.py +0 -0
  47. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/utils/__init__.py +0 -0
  48. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/utils/prompt.py +0 -0
  49. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/src/aient/utils/scripts.py +0 -0
  50. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/chatgpt.py +0 -0
  51. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/claude.py +0 -0
  52. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test.py +0 -0
  53. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_API.py +0 -0
  54. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_Deepbricks.py +0 -0
  55. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_Web_crawler.py +0 -0
  56. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_aiwaves.py +0 -0
  57. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_aiwaves_arxiv.py +0 -0
  58. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_ask_gemini.py +0 -0
  59. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_class.py +0 -0
  60. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_claude.py +0 -0
  61. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_claude_zh_char.py +0 -0
  62. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_ddg_search.py +0 -0
  63. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_download_pdf.py +0 -0
  64. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_gemini.py +0 -0
  65. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_get_token_dict.py +0 -0
  66. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_google_search.py +0 -0
  67. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_jieba.py +0 -0
  68. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_json.py +0 -0
  69. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_logging.py +0 -0
  70. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_ollama.py +0 -0
  71. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_plugin.py +0 -0
  72. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_py_run.py +0 -0
  73. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_requests.py +0 -0
  74. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_search.py +0 -0
  75. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_tikitoken.py +0 -0
  76. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_token.py +0 -0
  77. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_url.py +0 -0
  78. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_whisper.py +0 -0
  79. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_wildcard.py +0 -0
  80. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/aient/test/test_yjh.py +0 -0
  81. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/bemcp/bemcp/__init__.py +0 -0
  82. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/bemcp/bemcp/decorator.py +0 -0
  83. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/bemcp/bemcp/main.py +0 -0
  84. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/bemcp/bemcp/utils.py +0 -0
  85. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/bemcp/test/client.py +0 -0
  86. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/bemcp/test/server.py +0 -0
  87. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/prompt.py +0 -0
  88. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
  89. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  90. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  91. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  92. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  93. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  94. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  95. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  96. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  97. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  98. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  99. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  100. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  101. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  102. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  103. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  104. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  105. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  106. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  107. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  108. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  109. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  110. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  111. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  112. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  113. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  114. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  115. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/README.md +0 -0
  116. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
  117. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  118. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  119. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
  120. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  121. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  122. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
  123. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
  124. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  125. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
  126. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  127. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  128. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  129. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
  130. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
  131. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
  132. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  133. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
  134. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
  135. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  136. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/click.py +0 -0
  137. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/edit_file.py +0 -0
  138. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/planner.py +0 -0
  139. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/repomap.py +0 -0
  140. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/request_input.py +0 -0
  141. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/screenshot.py +0 -0
  142. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/search_arxiv.py +0 -0
  143. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/search_web.py +0 -0
  144. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/tools/taskmanager.py +0 -0
  145. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm/utils.py +0 -0
  146. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm.egg-info/dependency_links.txt +0 -0
  147. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm.egg-info/requires.txt +0 -0
  148. {beswarm-0.2.27 → beswarm-0.2.29}/beswarm.egg-info/top_level.txt +0 -0
  149. {beswarm-0.2.27 → beswarm-0.2.29}/setup.cfg +0 -0
  150. {beswarm-0.2.27 → beswarm-0.2.29}/test/test_TaskManager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.27
3
+ Version: 0.2.29
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -8,6 +8,7 @@ from .repomap import get_code_repo_map
8
8
  from .click import find_and_click_element, scroll_screen
9
9
  from .search_web import search_web
10
10
  from .taskmanager import create_task, resume_task, get_all_tasks_status, get_task_result
11
+ from .completion import task_complete
11
12
 
12
13
  #显式导入 aient.plugins 中的所需内容
13
14
  from ..aient.src.aient.plugins import (
@@ -55,4 +56,5 @@ __all__ = [
55
56
  "resume_task",
56
57
  "get_all_tasks_status",
57
58
  "get_task_result",
59
+ "task_complete",
58
60
  ]
@@ -0,0 +1,17 @@
1
+ from ..aient.src.aient.plugins import register_tool
2
+
3
+ @register_tool()
4
+ def task_complete(message: str) -> str:
5
+ """
6
+ 当任务完成时,调用此工具以返回最终结果。
7
+
8
+ 这个工具接收一个表示任务完成信息的字符串,并将其直接返回。
9
+ 它标志着一个任务的成功结束,并将最终的输出传递给用户或调用者。
10
+
11
+ Args:
12
+ message (str): 任务完成的信息或最终结果。
13
+
14
+ Returns:
15
+ str: 传入的任务完成信息。
16
+ """
17
+ return "<task_complete_message>" + message + "</task_complete_message>"
@@ -64,6 +64,8 @@ async def worker(goal, tools, work_dir, cache_messages=None):
64
64
  tools += mcp_tools_name
65
65
 
66
66
  tools = [item for item in tools if not isinstance(item, dict)]
67
+ if "task_complete" not in tools:
68
+ tools.append("task_complete")
67
69
 
68
70
  tools_json = [value for _, value in get_function_call_list(tools).items()]
69
71
  work_agent_system_prompt = worker_system_prompt.format(
@@ -77,7 +79,7 @@ async def worker(goal, tools, work_dir, cache_messages=None):
77
79
  work_agent_config = {
78
80
  "api_key": os.getenv("API_KEY"),
79
81
  "api_url": os.getenv("BASE_URL"),
80
- "engine": os.getenv("MODEL"),
82
+ "engine": os.getenv("FAST_MODEL") or os.getenv("MODEL"),
81
83
  "system_prompt": work_agent_system_prompt,
82
84
  "print_log": True,
83
85
  # "max_tokens": 8000,
@@ -120,7 +122,7 @@ async def worker(goal, tools, work_dir, cache_messages=None):
120
122
  f"任务目标: {goal}\n\n",
121
123
  f"任务目标新变化:\n{goal_diff}\n\n" if goal_diff else "",
122
124
  "在 tag <work_agent_conversation_start>...</work_agent_conversation_end> 之前的对话历史都是工作智能体的对话历史。\n\n",
123
- "根据以上对话历史和目标,请生成下一步指令。如果任务已完成,请回复'任务已完成'。\n\n",
125
+ "根据以上对话历史和目标,请生成下一步指令。如果任务已完成,指示工作智能体调用task_complete工具。\n\n",
124
126
  ])
125
127
  if last_instruction and 'fetch_gpt_response_stream HTTP Error' not in last_instruction:
126
128
  instruction_prompt = (
@@ -131,6 +133,11 @@ async def worker(goal, tools, work_dir, cache_messages=None):
131
133
  # 让指令agent分析对话历史并生成新指令
132
134
  instruction_agent = chatgpt(**instruction_agent_config)
133
135
  conversation_history = copy.deepcopy(work_agent.conversation["default"])
136
+ if len(conversation_history) > 1 and conversation_history[-2]["role"] == "user" \
137
+ and "<task_complete_message>" in conversation_history[-2]["content"]:
138
+ task_complete_message = extract_xml_content(conversation_history[-2]["content"], "task_complete_message")
139
+ # del work_agent.conversation["default"][-4:]
140
+ return "<task_complete_message>" + task_complete_message + "</task_complete_message>"
134
141
 
135
142
  cache_file.write_text(json.dumps(conversation_history, ensure_ascii=False, indent=4), encoding="utf-8")
136
143
 
@@ -169,8 +176,7 @@ async def worker(goal, tools, work_dir, cache_messages=None):
169
176
  print(f"任务结束时间: {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
170
177
  print(f"总用时: {total_time}")
171
178
  raise Exception(f"The request body is too long, please try again.")
172
- if "任务已完成" == next_instruction.strip():
173
- break
179
+
174
180
  last_instruction = next_instruction
175
181
  next_instruction = extract_xml_content(next_instruction, "instructions")
176
182
  if not next_instruction:
@@ -198,18 +204,19 @@ async def worker(goal, tools, work_dir, cache_messages=None):
198
204
  return next_instruction
199
205
 
200
206
  need_instruction = True
207
+ result = None
201
208
  while True:
202
209
  next_instruction = ''
203
210
  if need_instruction:
204
211
  next_instruction = await instruction_agent_task()
205
212
 
206
213
  # 检查任务是否完成
207
- if "任务已完成" in next_instruction and len(next_instruction) < 10:
214
+ if "<task_complete_message>" in next_instruction:
208
215
  if finish_flag == 0:
209
216
  finish_flag = 1
210
217
  continue
211
218
  elif finish_flag == 1:
212
- print("\n✅ 任务已完成!")
219
+ result = extract_xml_content(next_instruction, "task_complete_message")
213
220
  break
214
221
  else:
215
222
  finish_flag = 0
@@ -225,11 +232,12 @@ async def worker(goal, tools, work_dir, cache_messages=None):
225
232
 
226
233
  end_time = datetime.now()
227
234
  total_time = end_time - start_time
235
+ print("\n✅ 任务已完成:", result)
228
236
  print(f"\n任务开始时间: {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
229
237
  print(f"任务结束时间: {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
230
238
  print(f"总用时: {total_time}")
231
239
  await manager.cleanup()
232
- return "任务已完成"
240
+ return result
233
241
 
234
242
  async def worker_gen(goal, tools, work_dir, cache_messages=None):
235
243
  cache_dir = Path(work_dir) / ".beswarm"
@@ -265,6 +273,8 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
265
273
  tools += mcp_tools_name
266
274
 
267
275
  tools = [item for item in tools if not isinstance(item, dict)]
276
+ if "task_complete" not in tools:
277
+ tools.append("task_complete")
268
278
 
269
279
  tools_json = [value for _, value in get_function_call_list(tools).items()]
270
280
  work_agent_system_prompt = worker_system_prompt.format(
@@ -278,7 +288,7 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
278
288
  work_agent_config = {
279
289
  "api_key": os.getenv("API_KEY"),
280
290
  "api_url": os.getenv("BASE_URL"),
281
- "engine": os.getenv("MODEL"),
291
+ "engine": os.getenv("FAST_MODEL") or os.getenv("MODEL"),
282
292
  "system_prompt": work_agent_system_prompt,
283
293
  "print_log": True,
284
294
  # "max_tokens": 8000,
@@ -321,7 +331,7 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
321
331
  f"任务目标: {goal}\n\n",
322
332
  f"任务目标新变化:\n{goal_diff}\n\n" if goal_diff else "",
323
333
  "在 tag <work_agent_conversation_start>...</work_agent_conversation_end> 之前的对话历史都是工作智能体的对话历史。\n\n",
324
- "根据以上对话历史和目标,请生成下一步指令。如果任务已完成,请回复'任务已完成'。\n\n",
334
+ "根据以上对话历史和目标,请生成下一步指令。如果任务已完成,指示工作智能体调用task_complete工具。\n\n",
325
335
  ])
326
336
  if last_instruction and 'fetch_gpt_response_stream HTTP Error' not in last_instruction:
327
337
  instruction_prompt = (
@@ -332,6 +342,11 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
332
342
  # 让指令agent分析对话历史并生成新指令
333
343
  instruction_agent = chatgpt(**instruction_agent_config)
334
344
  conversation_history = copy.deepcopy(work_agent.conversation["default"])
345
+ if len(conversation_history) > 1 and conversation_history[-2]["role"] == "user" \
346
+ and "<task_complete_message>" in conversation_history[-2]["content"]:
347
+ task_complete_message = extract_xml_content(conversation_history[-2]["content"], "task_complete_message")
348
+ # del work_agent.conversation["default"][-4:]
349
+ return "<task_complete_message>" + task_complete_message + "</task_complete_message>"
335
350
 
336
351
  cache_file.write_text(json.dumps(conversation_history, ensure_ascii=False, indent=4), encoding="utf-8")
337
352
 
@@ -370,8 +385,7 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
370
385
  print(f"任务结束时间: {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
371
386
  print(f"总用时: {total_time}")
372
387
  raise Exception(f"The request body is too long, please try again.")
373
- if "任务已完成" == next_instruction.strip():
374
- break
388
+
375
389
  last_instruction = next_instruction
376
390
  next_instruction = extract_xml_content(next_instruction, "instructions")
377
391
  if not next_instruction:
@@ -399,6 +413,7 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
399
413
  return next_instruction
400
414
 
401
415
  need_instruction = True
416
+ result = None
402
417
  while True:
403
418
  next_instruction = ''
404
419
  if need_instruction:
@@ -407,12 +422,12 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
407
422
  yield {"user": next_instruction}
408
423
 
409
424
  # 检查任务是否完成
410
- if "任务已完成" in next_instruction and len(next_instruction) < 10:
425
+ if "<task_complete_message>" in next_instruction:
411
426
  if finish_flag == 0:
412
427
  finish_flag = 1
413
428
  continue
414
429
  elif finish_flag == 1:
415
- print("\n✅ 任务已完成!")
430
+ result = extract_xml_content(next_instruction, "task_complete_message")
416
431
  break
417
432
  else:
418
433
  finish_flag = 0
@@ -429,6 +444,7 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
429
444
 
430
445
  end_time = datetime.now()
431
446
  total_time = end_time - start_time
447
+ print("\n✅ 任务已完成:", result)
432
448
  print(f"\n任务开始时间: {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
433
449
  print(f"任务结束时间: {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
434
450
  print(f"总用时: {total_time}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.27
3
+ Version: 0.2.29
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -135,6 +135,7 @@ beswarm/queries/tree-sitter-languages/scala-tags.scm
135
135
  beswarm/queries/tree-sitter-languages/typescript-tags.scm
136
136
  beswarm/tools/__init__.py
137
137
  beswarm/tools/click.py
138
+ beswarm/tools/completion.py
138
139
  beswarm/tools/edit_file.py
139
140
  beswarm/tools/planner.py
140
141
  beswarm/tools/repomap.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "beswarm"
3
- version = "0.2.27"
3
+ version = "0.2.29"
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