beswarm 0.2.44__tar.gz → 0.2.46__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 (161) hide show
  1. {beswarm-0.2.44 → beswarm-0.2.46}/PKG-INFO +1 -1
  2. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/agents/planact.py +37 -8
  3. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/core.py +1 -1
  4. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/knowledge_graph.py +16 -6
  5. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/graph.py +3 -1
  6. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm.egg-info/PKG-INFO +1 -1
  7. {beswarm-0.2.44 → beswarm-0.2.46}/pyproject.toml +1 -1
  8. {beswarm-0.2.44 → beswarm-0.2.46}/test/test_graph.py +1 -1
  9. {beswarm-0.2.44 → beswarm-0.2.46}/MANIFEST.in +0 -0
  10. {beswarm-0.2.44 → beswarm-0.2.46}/README.md +0 -0
  11. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/__init__.py +0 -0
  12. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/agents/chatgroup.py +0 -0
  13. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/main.py +0 -0
  14. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/setup.py +0 -0
  15. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/__init__.py +0 -0
  16. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/__init__.py +0 -0
  17. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/log_config.py +0 -0
  18. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/models.py +0 -0
  19. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/request.py +0 -0
  20. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/response.py +0 -0
  21. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/test/test_base_api.py +0 -0
  22. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/test/test_geminimask.py +0 -0
  23. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/test/test_image.py +0 -0
  24. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/test/test_payload.py +0 -0
  25. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/core/utils.py +0 -0
  26. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/__init__.py +0 -0
  27. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/audio.py +0 -0
  28. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/base.py +0 -0
  29. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/chatgpt.py +0 -0
  30. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/claude.py +0 -0
  31. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/duckduckgo.py +0 -0
  32. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/gemini.py +0 -0
  33. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/groq.py +0 -0
  34. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/models/vertex.py +0 -0
  35. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/__init__.py +0 -0
  36. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/arXiv.py +0 -0
  37. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/config.py +0 -0
  38. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/excute_command.py +0 -0
  39. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/get_time.py +0 -0
  40. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/image.py +0 -0
  41. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/list_directory.py +0 -0
  42. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/read_file.py +0 -0
  43. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/read_image.py +0 -0
  44. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/readonly.py +0 -0
  45. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/registry.py +0 -0
  46. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/run_python.py +0 -0
  47. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/websearch.py +0 -0
  48. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/plugins/write_file.py +0 -0
  49. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/utils/__init__.py +0 -0
  50. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/utils/prompt.py +0 -0
  51. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/src/aient/utils/scripts.py +0 -0
  52. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/chatgpt.py +0 -0
  53. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/claude.py +0 -0
  54. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test.py +0 -0
  55. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_API.py +0 -0
  56. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_Deepbricks.py +0 -0
  57. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_Web_crawler.py +0 -0
  58. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_aiwaves.py +0 -0
  59. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_aiwaves_arxiv.py +0 -0
  60. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_ask_gemini.py +0 -0
  61. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_class.py +0 -0
  62. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_claude.py +0 -0
  63. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_claude_zh_char.py +0 -0
  64. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_ddg_search.py +0 -0
  65. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_download_pdf.py +0 -0
  66. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_gemini.py +0 -0
  67. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_get_token_dict.py +0 -0
  68. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_google_search.py +0 -0
  69. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_jieba.py +0 -0
  70. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_json.py +0 -0
  71. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_logging.py +0 -0
  72. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_ollama.py +0 -0
  73. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_plugin.py +0 -0
  74. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_py_run.py +0 -0
  75. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_requests.py +0 -0
  76. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_search.py +0 -0
  77. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_tikitoken.py +0 -0
  78. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_token.py +0 -0
  79. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_url.py +0 -0
  80. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_whisper.py +0 -0
  81. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_wildcard.py +0 -0
  82. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/aient/test/test_yjh.py +0 -0
  83. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/bemcp/bemcp/__init__.py +0 -0
  84. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/bemcp/bemcp/decorator.py +0 -0
  85. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/bemcp/bemcp/main.py +0 -0
  86. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/bemcp/bemcp/utils.py +0 -0
  87. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/bemcp/test/client.py +0 -0
  88. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/bemcp/test/server.py +0 -0
  89. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/broker.py +0 -0
  90. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/prompt.py +0 -0
  91. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
  92. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  93. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  94. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  95. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  96. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  97. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  98. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  99. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  100. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  101. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  102. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  103. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  104. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  105. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  106. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  107. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  108. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  109. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  110. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  111. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  112. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  113. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  114. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  115. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  116. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  117. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  118. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/README.md +0 -0
  119. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
  120. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  121. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  122. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
  123. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  124. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  125. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
  126. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
  127. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  128. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
  129. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  130. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  131. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  132. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
  133. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
  134. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
  135. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  136. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
  137. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
  138. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  139. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/taskmanager.py +0 -0
  140. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/__init__.py +0 -0
  141. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/click.py +0 -0
  142. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/completion.py +0 -0
  143. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/edit_file.py +0 -0
  144. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/planner.py +0 -0
  145. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/repomap.py +0 -0
  146. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/request_input.py +0 -0
  147. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/screenshot.py +0 -0
  148. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/search_arxiv.py +0 -0
  149. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/search_web.py +0 -0
  150. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/subtasks.py +0 -0
  151. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/worker.py +0 -0
  152. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/tools/write_csv.py +0 -0
  153. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm/utils.py +0 -0
  154. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm.egg-info/SOURCES.txt +0 -0
  155. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm.egg-info/dependency_links.txt +0 -0
  156. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm.egg-info/requires.txt +0 -0
  157. {beswarm-0.2.44 → beswarm-0.2.46}/beswarm.egg-info/top_level.txt +0 -0
  158. {beswarm-0.2.44 → beswarm-0.2.46}/setup.cfg +0 -0
  159. {beswarm-0.2.44 → beswarm-0.2.46}/test/test_TaskManager.py +0 -0
  160. {beswarm-0.2.44 → beswarm-0.2.46}/test/test_broker.py +0 -0
  161. {beswarm-0.2.44 → beswarm-0.2.46}/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.44
3
+ Version: 0.2.46
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -17,7 +17,7 @@ from ..utils import extract_xml_content, get_current_screen_image_message, repla
17
17
 
18
18
  class BaseAgent:
19
19
  """Base class for agents, handling common initialization and disposal."""
20
- def __init__(self, goal: str, tools_json: List, agent_config: Dict, work_dir: str, cache_messages: Union[bool, List[Dict]], broker: MessageBroker, listen_topic: str, publish_topic: str, status_topic: str):
20
+ def __init__(self, goal: str, tools_json: List, agent_config: Dict, work_dir: str, cache_messages: Union[bool, List[Dict]], broker: MessageBroker, listen_topic: str, publish_topic: str, status_topic: str, graph_update_topic: str = None):
21
21
  self.goal = goal
22
22
  self.tools_json = tools_json
23
23
  self.work_dir = work_dir
@@ -32,12 +32,20 @@ class BaseAgent:
32
32
  self.error_topic = listen_topic + ".error"
33
33
  self.publish_topic = publish_topic
34
34
  self.status_topic = status_topic
35
+ self.graph_update_topic = graph_update_topic
36
+ if self.graph_update_topic:
37
+ self.graph_update_subscription = self.broker.subscribe(self.handle_graph_update, self.graph_update_topic)
38
+
35
39
  self._subscription = self.broker.subscribe(self.handle_message, [self.listen_topic, self.error_topic])
36
40
 
37
41
  async def handle_message(self, message: Dict):
38
42
  """Process incoming messages. Must be implemented by subclasses."""
39
43
  raise NotImplementedError
40
44
 
45
+ def handle_graph_update(self, message: Dict):
46
+ """Handle graph update messages."""
47
+ raise NotImplementedError
48
+
41
49
  def dispose(self):
42
50
  """Cancels the subscription and cleans up resources."""
43
51
  if self._subscription:
@@ -46,12 +54,13 @@ class BaseAgent:
46
54
 
47
55
  class InstructionAgent(BaseAgent):
48
56
  """Generates instructions and publishes them to a message broker."""
49
- def __init__(self, goal: str, tools_json: List, agent_config: Dict, work_dir: str, cache_messages: Union[bool, List[Dict]], broker: MessageBroker, listen_topic: str, publish_topic: str, status_topic: str):
50
- super().__init__(goal, tools_json, agent_config, work_dir, cache_messages, broker, listen_topic, publish_topic, status_topic)
57
+ def __init__(self, goal: str, tools_json: List, agent_config: Dict, work_dir: str, cache_messages: Union[bool, List[Dict]], broker: MessageBroker, listen_topic: str, publish_topic: str, status_topic: str, graph_update_topic: str):
58
+ super().__init__(goal, tools_json, agent_config, work_dir, cache_messages, broker, listen_topic, publish_topic, status_topic, graph_update_topic)
51
59
 
52
60
  self.last_instruction = None
53
61
  self.agent = chatgpt(**self.config)
54
62
 
63
+ self.graph_tree = None
55
64
  self.goal_diff = None
56
65
 
57
66
  if self.cache_messages and isinstance(self.cache_messages, list) and len(self.cache_messages) > 1:
@@ -64,8 +73,13 @@ class InstructionAgent(BaseAgent):
64
73
  changed_lines.append(line)
65
74
  self.goal_diff = '\n'.join(changed_lines).strip()
66
75
 
67
- def get_conversation_history(self, conversation_history: List[Dict]):
68
- conversation_history = copy.deepcopy(conversation_history)
76
+ def handle_graph_update(self, message: Dict):
77
+ """Handle graph update messages."""
78
+ if message.get("message") == "graph_updated":
79
+ self.graph_tree = message.get("graph")
80
+
81
+ def get_conversation_history(self, raw_conversation_history: List[Dict]):
82
+ conversation_history = copy.deepcopy(raw_conversation_history)
69
83
 
70
84
  self.cache_file.write_text(json.dumps(conversation_history, ensure_ascii=False, indent=4), encoding="utf-8")
71
85
 
@@ -83,6 +97,17 @@ class InstructionAgent(BaseAgent):
83
97
  elif isinstance(conversation_history[0]["content"], list) and extracted_content:
84
98
  conversation_history[0]["content"].append({"type": "text", "text": extracted_content})
85
99
 
100
+ for message in conversation_history:
101
+ if message.get("content") and isinstance(message["content"], str) \
102
+ and "<knowledge_graph_tree>" in message["content"] and self.graph_tree:
103
+ message["content"] = replace_xml_content(message["content"], "knowledge_graph_tree", self.graph_tree)
104
+
105
+ for index, message in enumerate(raw_conversation_history):
106
+ if message.get("content") and isinstance(message["content"], str) \
107
+ and "<knowledge_graph_tree>" in message["content"] and self.graph_tree:
108
+ message["content"] = replace_xml_content(message["content"], "knowledge_graph_tree", self.graph_tree)
109
+ raw_conversation_history[index] = message
110
+
86
111
  return conversation_history
87
112
 
88
113
  async def handle_message(self, message: Dict):
@@ -201,18 +226,21 @@ class BrokerWorker:
201
226
  self.task_completion_event = asyncio.Event()
202
227
  self.final_result = None
203
228
  self._status_subscription = None
204
- self.setup()
205
229
 
206
230
  self.channel = self.broker.request_channel()
207
231
  self.INSTRUCTION_TOPIC = self.channel + ".instructions"
208
232
  self.WORKER_RESPONSE_TOPIC = self.channel + ".worker_responses"
209
233
  self.TASK_STATUS_TOPIC =self.channel + ".task_status"
234
+ self.GRAPH_UPDATE_TOPIC = self.channel + ".knowledge_graph"
235
+
236
+ self.setup()
210
237
 
211
238
  def setup(self):
212
239
  cache_dir = self.work_dir / ".beswarm"
213
240
  cache_dir.mkdir(parents=True, exist_ok=True)
214
241
  self.task_manager.set_root_path(self.work_dir)
215
242
  self.kgm.set_root_path(self.work_dir)
243
+ self.kgm.set_publish_topic(self.GRAPH_UPDATE_TOPIC)
216
244
  self.cache_file = cache_dir / "work_agent_conversation_history.json"
217
245
  if not self.cache_file.exists():
218
246
  self.cache_file.write_text("[]", encoding="utf-8")
@@ -276,13 +304,14 @@ class BrokerWorker:
276
304
  instruction_agent = InstructionAgent(
277
305
  goal=self.goal, tools_json=self.tools_json, agent_config=instruction_agent_config, work_dir=self.work_dir, cache_messages=self.cache_messages,
278
306
  broker=self.broker, listen_topic=self.WORKER_RESPONSE_TOPIC,
279
- publish_topic=self.INSTRUCTION_TOPIC, status_topic=self.TASK_STATUS_TOPIC
307
+ publish_topic=self.INSTRUCTION_TOPIC, status_topic=self.TASK_STATUS_TOPIC,
308
+ graph_update_topic=self.GRAPH_UPDATE_TOPIC
280
309
  )
281
310
 
282
311
  worker_agent = WorkerAgent(
283
312
  goal=self.goal, tools_json=self.tools_json, agent_config=worker_agent_config, work_dir=self.work_dir, cache_messages=self.cache_messages,
284
313
  broker=self.broker, listen_topic=self.INSTRUCTION_TOPIC,
285
- publish_topic=self.WORKER_RESPONSE_TOPIC, status_topic=self.TASK_STATUS_TOPIC
314
+ publish_topic=self.WORKER_RESPONSE_TOPIC, status_topic=self.TASK_STATUS_TOPIC,
286
315
  )
287
316
  return instruction_agent, worker_agent
288
317
 
@@ -10,4 +10,4 @@ from .knowledge_graph import KnowledgeGraphManager
10
10
  broker = MessageBroker()
11
11
  mcp_manager = MCPManager()
12
12
  task_manager = TaskManager()
13
- kgm = KnowledgeGraphManager()
13
+ kgm = KnowledgeGraphManager(broker=broker)
@@ -9,7 +9,7 @@ class KnowledgeGraphManager:
9
9
  - 数据持久化为 GraphML 文件。
10
10
  - 提供添加、删除、重命名、移动节点和渲染树状图的功能。
11
11
  """
12
- def __init__(self, storage_path="knowledge_graph.graphml"):
12
+ def __init__(self, storage_path="knowledge_graph.graphml", broker=None, publish_topic=None):
13
13
  """
14
14
  初始化知识图谱管理器。
15
15
 
@@ -20,6 +20,8 @@ class KnowledgeGraphManager:
20
20
  self.storage_path = Path(storage_path)
21
21
  self.graph = nx.DiGraph()
22
22
  self.root_path = None
23
+ self.broker = broker
24
+ self.publish_topic = publish_topic
23
25
  # self._load_graph()
24
26
 
25
27
  def set_root_path(self, root_path):
@@ -49,16 +51,24 @@ class KnowledgeGraphManager:
49
51
  self.graph.add_node("root", name=".", description="知识图谱根节点")
50
52
  self._save_graph()
51
53
 
54
+ def set_publish_topic(self, publish_topic):
55
+ if not publish_topic:
56
+ return
57
+ self.publish_topic = publish_topic
58
+
52
59
  def _save_graph(self):
53
60
  """将当前图的状态保存到文件。"""
54
61
  nx.write_graphml(self.graph, self.storage_path)
55
62
 
63
+ if self.publish_topic and self.broker:
64
+ self.broker.publish({"message": "graph_updated", "graph": self.render_tree()}, self.publish_topic)
65
+
56
66
  def _get_node_id_by_path(self, path: str):
57
67
  """通过'/'分隔的路径查找节点的唯一ID,支持前缀匹配。"""
58
68
  if path is None or not path.strip() or path.strip() in ['.', '/']:
59
69
  return "root"
60
70
 
61
- segments = path.strip('/').split('/')
71
+ segments = [s for s in path.strip('/').split('/') if s and s != '.']
62
72
  current_node_id = "root"
63
73
 
64
74
  for segment in segments:
@@ -69,17 +79,17 @@ class KnowledgeGraphManager:
69
79
  current_node_id = child_id
70
80
  found_child = True
71
81
  break
72
-
82
+
73
83
  if found_child:
74
84
  continue
75
-
85
+
76
86
  # 如果完全匹配失败,尝试前缀匹配
77
87
  prefix_matches = []
78
88
  for child_id in self.graph.successors(current_node_id):
79
89
  child_name = self.graph.nodes[child_id].get('name', '')
80
90
  if child_name.startswith(segment):
81
91
  prefix_matches.append(child_id)
82
-
92
+
83
93
  if len(prefix_matches) == 1:
84
94
  # 只有一个前缀匹配,使用这个节点
85
95
  current_node_id = prefix_matches[0]
@@ -89,7 +99,7 @@ class KnowledgeGraphManager:
89
99
  else:
90
100
  # 没有前缀匹配,节点不存在
91
101
  return None
92
-
102
+
93
103
  return current_node_id
94
104
 
95
105
  def add_node(self, parent_path: str, node_name: str, description: str = "") -> str:
@@ -65,7 +65,9 @@ def get_knowledge_graph_tree() -> str:
65
65
  此工具不需要任何参数,它会读取当前的图状态并生成一个易于阅读的、
66
66
  表示层级结构的字符串。
67
67
 
68
+ 注意:此函数返回的知识图谱状态是实时更新的,永远是最新的。只需要调用一次,不必重复调用。
69
+
68
70
  Returns:
69
71
  str: 表示整个知识图谱的、格式化的树状结构字符串。
70
72
  """
71
- return kgm.render_tree()
73
+ return "<knowledge_graph_tree>" + kgm.render_tree() + "</knowledge_graph_tree>"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.44
3
+ Version: 0.2.46
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.44"
3
+ version = "0.2.46"
4
4
  description = "MAS"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -59,7 +59,7 @@ class KnowledgeGraphManager:
59
59
  if path is None or not path.strip() or path.strip() in ['.', '/']:
60
60
  return "root"
61
61
 
62
- segments = path.strip('/').split('/')
62
+ segments = [s for s in path.strip('/').split('/') if s and s != '.']
63
63
  current_node_id = "root"
64
64
 
65
65
  for i, segment in enumerate(segments):
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