beswarm 0.2.42__tar.gz → 0.2.44__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.
- {beswarm-0.2.42 → beswarm-0.2.44}/PKG-INFO +1 -1
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/agents/chatgroup.py +3 -1
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/agents/planact.py +3 -1
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/core.py +5 -3
- beswarm-0.2.44/beswarm/knowledge_graph.py +199 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/taskmanager.py +6 -4
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/__init__.py +6 -0
- beswarm-0.2.44/beswarm/tools/graph.py +71 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/subtasks.py +59 -15
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/worker.py +4 -4
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm.egg-info/PKG-INFO +1 -1
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm.egg-info/SOURCES.txt +3 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/pyproject.toml +1 -1
- beswarm-0.2.44/test/test_graph.py +254 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/MANIFEST.in +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/README.md +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/__init__.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/main.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/setup.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/__init__.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/__init__.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/log_config.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/models.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/request.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/response.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/test/test_base_api.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/test/test_geminimask.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/test/test_image.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/test/test_payload.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/core/utils.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/__init__.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/audio.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/base.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/chatgpt.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/claude.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/duckduckgo.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/gemini.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/groq.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/models/vertex.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/__init__.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/arXiv.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/config.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/excute_command.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/get_time.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/image.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/list_directory.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/read_file.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/read_image.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/readonly.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/registry.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/run_python.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/websearch.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/plugins/write_file.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/utils/__init__.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/utils/prompt.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/src/aient/utils/scripts.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/chatgpt.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/claude.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_API.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_Deepbricks.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_Web_crawler.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_aiwaves.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_aiwaves_arxiv.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_ask_gemini.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_class.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_claude.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_claude_zh_char.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_ddg_search.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_download_pdf.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_gemini.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_get_token_dict.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_google_search.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_jieba.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_json.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_logging.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_ollama.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_plugin.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_py_run.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_requests.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_search.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_tikitoken.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_token.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_url.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_whisper.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_wildcard.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/aient/test/test_yjh.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/bemcp/bemcp/__init__.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/bemcp/bemcp/decorator.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/bemcp/bemcp/main.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/bemcp/bemcp/utils.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/bemcp/test/client.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/bemcp/test/server.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/broker.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/prompt.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/README.md +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/click.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/completion.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/edit_file.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/planner.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/repomap.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/request_input.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/screenshot.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/search_arxiv.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/search_web.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/tools/write_csv.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm/utils.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm.egg-info/dependency_links.txt +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm.egg-info/requires.txt +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/beswarm.egg-info/top_level.txt +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/setup.cfg +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/test/test_TaskManager.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/test/test_broker.py +0 -0
- {beswarm-0.2.42 → beswarm-0.2.44}/test/test_new_TaskManager.py +0 -0
|
@@ -100,7 +100,7 @@ class Tee:
|
|
|
100
100
|
|
|
101
101
|
class ChatGroupWorker:
|
|
102
102
|
"""The 'glue' class that orchestrates agents via a MessageBroker."""
|
|
103
|
-
def __init__(self, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None, broker: MessageBroker = None, mcp_manager: MCPManager = None, task_manager = None):
|
|
103
|
+
def __init__(self, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None, broker: MessageBroker = None, mcp_manager: MCPManager = None, task_manager = None, kgm = None):
|
|
104
104
|
self.tools = tools
|
|
105
105
|
self.work_dir = Path(work_dir)
|
|
106
106
|
self.cache_messages = cache_messages
|
|
@@ -108,6 +108,7 @@ class ChatGroupWorker:
|
|
|
108
108
|
self.broker = broker
|
|
109
109
|
self.mcp_manager = mcp_manager
|
|
110
110
|
self.task_manager = task_manager
|
|
111
|
+
self.kgm = kgm
|
|
111
112
|
self.task_completion_event = asyncio.Event()
|
|
112
113
|
self.final_result = None
|
|
113
114
|
self._status_subscription = None
|
|
@@ -122,6 +123,7 @@ class ChatGroupWorker:
|
|
|
122
123
|
cache_dir = self.work_dir / ".beswarm"
|
|
123
124
|
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
124
125
|
self.task_manager.set_root_path(self.work_dir)
|
|
126
|
+
self.kgm.set_root_path(self.work_dir)
|
|
125
127
|
self.cache_file = cache_dir / "work_agent_conversation_history.json"
|
|
126
128
|
if not self.cache_file.exists():
|
|
127
129
|
self.cache_file.write_text("[]", encoding="utf-8")
|
|
@@ -188,7 +188,7 @@ class WorkerAgent(BaseAgent):
|
|
|
188
188
|
|
|
189
189
|
class BrokerWorker:
|
|
190
190
|
"""The 'glue' class that orchestrates agents via a MessageBroker."""
|
|
191
|
-
def __init__(self, goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None, broker = None, mcp_manager = None, task_manager = None):
|
|
191
|
+
def __init__(self, goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None, broker = None, mcp_manager = None, task_manager = None, kgm = None):
|
|
192
192
|
self.goal = goal
|
|
193
193
|
self.tools = tools
|
|
194
194
|
self.work_dir = Path(work_dir)
|
|
@@ -197,6 +197,7 @@ class BrokerWorker:
|
|
|
197
197
|
self.broker = broker
|
|
198
198
|
self.mcp_manager = mcp_manager
|
|
199
199
|
self.task_manager = task_manager
|
|
200
|
+
self.kgm = kgm
|
|
200
201
|
self.task_completion_event = asyncio.Event()
|
|
201
202
|
self.final_result = None
|
|
202
203
|
self._status_subscription = None
|
|
@@ -211,6 +212,7 @@ class BrokerWorker:
|
|
|
211
212
|
cache_dir = self.work_dir / ".beswarm"
|
|
212
213
|
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
213
214
|
self.task_manager.set_root_path(self.work_dir)
|
|
215
|
+
self.kgm.set_root_path(self.work_dir)
|
|
214
216
|
self.cache_file = cache_dir / "work_agent_conversation_history.json"
|
|
215
217
|
if not self.cache_file.exists():
|
|
216
218
|
self.cache_file.write_text("[]", encoding="utf-8")
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
from .taskmanager import TaskManager
|
|
2
1
|
from .broker import MessageBroker
|
|
3
2
|
from .bemcp.bemcp import MCPManager
|
|
3
|
+
from .taskmanager import TaskManager
|
|
4
|
+
from .knowledge_graph import KnowledgeGraphManager
|
|
4
5
|
|
|
5
6
|
"""
|
|
6
7
|
全局共享实例
|
|
7
8
|
"""
|
|
8
9
|
|
|
9
|
-
task_manager = TaskManager()
|
|
10
10
|
broker = MessageBroker()
|
|
11
|
-
mcp_manager = MCPManager()
|
|
11
|
+
mcp_manager = MCPManager()
|
|
12
|
+
task_manager = TaskManager()
|
|
13
|
+
kgm = KnowledgeGraphManager()
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
import networkx as nx
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
class KnowledgeGraphManager:
|
|
6
|
+
"""
|
|
7
|
+
一个使用 NetworkX 管理知识图谱的管理器。
|
|
8
|
+
- 图数据存储在 networkx.DiGraph 对象中。
|
|
9
|
+
- 数据持久化为 GraphML 文件。
|
|
10
|
+
- 提供添加、删除、重命名、移动节点和渲染树状图的功能。
|
|
11
|
+
"""
|
|
12
|
+
def __init__(self, storage_path="knowledge_graph.graphml"):
|
|
13
|
+
"""
|
|
14
|
+
初始化知识图谱管理器。
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
storage_path (str, optional): GraphML文件的存储路径。
|
|
18
|
+
默认为 'knowledge_graph.graphml'。
|
|
19
|
+
"""
|
|
20
|
+
self.storage_path = Path(storage_path)
|
|
21
|
+
self.graph = nx.DiGraph()
|
|
22
|
+
self.root_path = None
|
|
23
|
+
# self._load_graph()
|
|
24
|
+
|
|
25
|
+
def set_root_path(self, root_path):
|
|
26
|
+
"""设置工作根目录并加载持久化的任务状态。"""
|
|
27
|
+
if self.root_path is not None:
|
|
28
|
+
return
|
|
29
|
+
self.root_path = Path(root_path)
|
|
30
|
+
self.cache_dir = self.root_path / ".beswarm"
|
|
31
|
+
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
32
|
+
self.storage_path = self.cache_dir / "knowledge_graph.graphml"
|
|
33
|
+
|
|
34
|
+
self._load_graph()
|
|
35
|
+
|
|
36
|
+
def _load_graph(self):
|
|
37
|
+
"""从文件加载图,如果文件不存在或加载失败,则创建一个新的。"""
|
|
38
|
+
if self.storage_path.exists():
|
|
39
|
+
try:
|
|
40
|
+
self.graph = nx.read_graphml(self.storage_path, node_type=str)
|
|
41
|
+
except Exception:
|
|
42
|
+
self._create_new_graph()
|
|
43
|
+
else:
|
|
44
|
+
self._create_new_graph()
|
|
45
|
+
|
|
46
|
+
def _create_new_graph(self):
|
|
47
|
+
"""创建一个带有根节点的新图谱并保存。"""
|
|
48
|
+
self.graph = nx.DiGraph()
|
|
49
|
+
self.graph.add_node("root", name=".", description="知识图谱根节点")
|
|
50
|
+
self._save_graph()
|
|
51
|
+
|
|
52
|
+
def _save_graph(self):
|
|
53
|
+
"""将当前图的状态保存到文件。"""
|
|
54
|
+
nx.write_graphml(self.graph, self.storage_path)
|
|
55
|
+
|
|
56
|
+
def _get_node_id_by_path(self, path: str):
|
|
57
|
+
"""通过'/'分隔的路径查找节点的唯一ID,支持前缀匹配。"""
|
|
58
|
+
if path is None or not path.strip() or path.strip() in ['.', '/']:
|
|
59
|
+
return "root"
|
|
60
|
+
|
|
61
|
+
segments = path.strip('/').split('/')
|
|
62
|
+
current_node_id = "root"
|
|
63
|
+
|
|
64
|
+
for segment in segments:
|
|
65
|
+
# 首先尝试完全匹配
|
|
66
|
+
found_child = False
|
|
67
|
+
for child_id in self.graph.successors(current_node_id):
|
|
68
|
+
if self.graph.nodes[child_id].get('name') == segment:
|
|
69
|
+
current_node_id = child_id
|
|
70
|
+
found_child = True
|
|
71
|
+
break
|
|
72
|
+
|
|
73
|
+
if found_child:
|
|
74
|
+
continue
|
|
75
|
+
|
|
76
|
+
# 如果完全匹配失败,尝试前缀匹配
|
|
77
|
+
prefix_matches = []
|
|
78
|
+
for child_id in self.graph.successors(current_node_id):
|
|
79
|
+
child_name = self.graph.nodes[child_id].get('name', '')
|
|
80
|
+
if child_name.startswith(segment):
|
|
81
|
+
prefix_matches.append(child_id)
|
|
82
|
+
|
|
83
|
+
if len(prefix_matches) == 1:
|
|
84
|
+
# 只有一个前缀匹配,使用这个节点
|
|
85
|
+
current_node_id = prefix_matches[0]
|
|
86
|
+
elif len(prefix_matches) > 1:
|
|
87
|
+
# 多个前缀匹配,存在歧义,返回None
|
|
88
|
+
return None
|
|
89
|
+
else:
|
|
90
|
+
# 没有前缀匹配,节点不存在
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
return current_node_id
|
|
94
|
+
|
|
95
|
+
def add_node(self, parent_path: str, node_name: str, description: str = "") -> str:
|
|
96
|
+
"""在指定父节点下添加一个新节点。"""
|
|
97
|
+
if not node_name.strip():
|
|
98
|
+
return "❌ 错误:节点名称不能为空。"
|
|
99
|
+
if '/' in node_name:
|
|
100
|
+
return f"❌ 错误:节点名称 '{node_name}' 不能包含'/'。"
|
|
101
|
+
|
|
102
|
+
parent_id = self._get_node_id_by_path(parent_path)
|
|
103
|
+
if parent_id is None:
|
|
104
|
+
return f"❌ 错误:父路径 '{parent_path}' 不存在。"
|
|
105
|
+
|
|
106
|
+
for child_id in self.graph.successors(parent_id):
|
|
107
|
+
if self.graph.nodes[child_id].get('name') == node_name:
|
|
108
|
+
return f"❌ 错误:在 '{parent_path}' 下已存在名为 '{node_name}' 的节点。"
|
|
109
|
+
|
|
110
|
+
new_node_id = str(uuid.uuid4())
|
|
111
|
+
self.graph.add_node(new_node_id, name=node_name, description=description)
|
|
112
|
+
self.graph.add_edge(parent_id, new_node_id)
|
|
113
|
+
self._save_graph()
|
|
114
|
+
return f"✅ 成功在 '{parent_path}' 下添加节点 '{node_name}'。"
|
|
115
|
+
|
|
116
|
+
def delete_node(self, node_path: str) -> str:
|
|
117
|
+
"""删除一个节点及其所有子孙节点。"""
|
|
118
|
+
if node_path is None or node_path.strip() in ['.', '/']:
|
|
119
|
+
return "❌ 错误:不能删除根节点。"
|
|
120
|
+
|
|
121
|
+
node_id = self._get_node_id_by_path(node_path)
|
|
122
|
+
if node_id is None:
|
|
123
|
+
return f"❌ 错误:路径 '{node_path}' 不存在。"
|
|
124
|
+
if node_id == "root":
|
|
125
|
+
return "❌ 错误:不能删除根节点。"
|
|
126
|
+
|
|
127
|
+
descendants = nx.descendants(self.graph, node_id)
|
|
128
|
+
self.graph.remove_nodes_from(descendants.union({node_id}))
|
|
129
|
+
self._save_graph()
|
|
130
|
+
return f"✅ 成功删除节点 '{node_path}' 及其所有子节点。"
|
|
131
|
+
|
|
132
|
+
def rename_node(self, node_path: str, new_name: str) -> str:
|
|
133
|
+
"""重命名一个节点。"""
|
|
134
|
+
if not new_name.strip():
|
|
135
|
+
return "❌ 错误:新名称不能为空。"
|
|
136
|
+
if '/' in new_name:
|
|
137
|
+
return f"❌ 错误:新名称 '{new_name}' 不能包含'/'。"
|
|
138
|
+
|
|
139
|
+
node_id = self._get_node_id_by_path(node_path)
|
|
140
|
+
if node_id is None:
|
|
141
|
+
return f"❌ 错误:路径 '{node_path}' 不存在。"
|
|
142
|
+
if node_id == "root":
|
|
143
|
+
return "❌ 错误:不能重命名根节点。"
|
|
144
|
+
|
|
145
|
+
parent_id = list(self.graph.predecessors(node_id))[0]
|
|
146
|
+
for sibling_id in self.graph.successors(parent_id):
|
|
147
|
+
if sibling_id != node_id and self.graph.nodes[sibling_id].get('name') == new_name:
|
|
148
|
+
return f"❌ 错误:同级目录下已存在名为 '{new_name}' 的节点。"
|
|
149
|
+
|
|
150
|
+
self.graph.nodes[node_id]['name'] = new_name
|
|
151
|
+
self._save_graph()
|
|
152
|
+
return f"✅ 成功将节点 '{node_path}' 重命名为 '{new_name}'。"
|
|
153
|
+
|
|
154
|
+
def move_node(self, source_path: str, target_parent_path: str) -> str:
|
|
155
|
+
"""将一个节点移动到另一个父节点下。"""
|
|
156
|
+
source_id = self._get_node_id_by_path(source_path)
|
|
157
|
+
if source_id is None:
|
|
158
|
+
return f"❌ 错误:源路径 '{source_path}' 不存在。"
|
|
159
|
+
if source_id == "root":
|
|
160
|
+
return "❌ 错误:不能移动根节点。"
|
|
161
|
+
|
|
162
|
+
target_parent_id = self._get_node_id_by_path(target_parent_path)
|
|
163
|
+
if target_parent_id is None:
|
|
164
|
+
return f"❌ 错误:目标父路径 '{target_parent_path}' 不存在。"
|
|
165
|
+
|
|
166
|
+
if source_id == target_parent_id or target_parent_id in nx.descendants(self.graph, source_id):
|
|
167
|
+
return "❌ 错误:不能将节点移动到其自身或其子孙节点下。"
|
|
168
|
+
|
|
169
|
+
source_name = self.graph.nodes[source_id]['name']
|
|
170
|
+
for child_id in self.graph.successors(target_parent_id):
|
|
171
|
+
if self.graph.nodes[child_id].get('name') == source_name:
|
|
172
|
+
return f"❌ 错误:目标目录 '{target_parent_path}' 下已存在同名节点 '{source_name}'。"
|
|
173
|
+
|
|
174
|
+
old_parent_id = list(self.graph.predecessors(source_id))[0]
|
|
175
|
+
self.graph.remove_edge(old_parent_id, source_id)
|
|
176
|
+
self.graph.add_edge(target_parent_id, source_id)
|
|
177
|
+
self._save_graph()
|
|
178
|
+
return f"✅ 成功将节点 '{source_path}' 移动到 '{target_parent_path}' 下。"
|
|
179
|
+
|
|
180
|
+
def render_tree(self) -> str:
|
|
181
|
+
"""渲染整个知识图谱为树状结构的文本。"""
|
|
182
|
+
if not self.graph or "root" not in self.graph:
|
|
183
|
+
return "图谱为空或未正确初始化。"
|
|
184
|
+
|
|
185
|
+
root_name = self.graph.nodes["root"].get("name", ".")
|
|
186
|
+
tree_lines = [root_name]
|
|
187
|
+
self._build_tree_string_recursive("root", "", tree_lines)
|
|
188
|
+
return "\n".join(tree_lines)
|
|
189
|
+
|
|
190
|
+
def _build_tree_string_recursive(self, parent_id, prefix, tree_lines):
|
|
191
|
+
"""递归辅助函数,用于构建树状图字符串。"""
|
|
192
|
+
children = sorted(list(self.graph.successors(parent_id)), key=lambda n: self.graph.nodes[n].get('name', ''))
|
|
193
|
+
for i, child_id in enumerate(children):
|
|
194
|
+
is_last = (i == len(children) - 1)
|
|
195
|
+
connector = "└── " if is_last else "├── "
|
|
196
|
+
node_name = self.graph.nodes[child_id].get('name', '[Unnamed Node]')
|
|
197
|
+
tree_lines.append(f"{prefix}{connector}{node_name}")
|
|
198
|
+
new_prefix = prefix + " " if is_last else prefix + "│ "
|
|
199
|
+
self._build_tree_string_recursive(child_id, new_prefix, tree_lines)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import json
|
|
2
3
|
import uuid
|
|
3
4
|
import asyncio
|
|
@@ -21,11 +22,12 @@ class TaskManager:
|
|
|
21
22
|
一个带并发控制的异步任务管理器。
|
|
22
23
|
它管理任务的生命周期,并通过一个固定大小的工作者池来控制并发执行的任务数量。
|
|
23
24
|
"""
|
|
24
|
-
def __init__(self, concurrency_limit=
|
|
25
|
-
|
|
25
|
+
def __init__(self, concurrency_limit=None):
|
|
26
|
+
self.concurrency_limit = concurrency_limit or int(os.getenv("BESWARM_CONCURRENCY_LIMIT", "3"))
|
|
27
|
+
|
|
28
|
+
if self.concurrency_limit <= 0:
|
|
26
29
|
raise ValueError("并发限制必须大于0")
|
|
27
30
|
|
|
28
|
-
self.concurrency_limit = concurrency_limit
|
|
29
31
|
self.tasks_cache = {} # 存储所有任务的状态和元数据, key: task_id
|
|
30
32
|
|
|
31
33
|
self._pending_queue = asyncio.Queue() # 内部待办任务队列
|
|
@@ -101,7 +103,7 @@ class TaskManager:
|
|
|
101
103
|
self._pending_queue.task_done()
|
|
102
104
|
|
|
103
105
|
except asyncio.CancelledError:
|
|
104
|
-
print(f"[{worker_name}] 被取消,正在退出...")
|
|
106
|
+
# print(f"[{worker_name}] 被取消,正在退出...")
|
|
105
107
|
break
|
|
106
108
|
except Exception as e:
|
|
107
109
|
print(f"[{worker_name}] 循环中遇到严重错误: {e}")
|
|
@@ -4,6 +4,7 @@ from .completion import task_complete
|
|
|
4
4
|
from .search_arxiv import search_arxiv
|
|
5
5
|
from .repomap import get_code_repo_map
|
|
6
6
|
from .write_csv import append_row_to_csv
|
|
7
|
+
from .graph import add_knowledge_node, delete_knowledge_node, rename_knowledge_node, move_knowledge_node, get_knowledge_graph_tree
|
|
7
8
|
from .request_input import request_admin_input
|
|
8
9
|
from .screenshot import save_screenshot_to_file
|
|
9
10
|
from .worker import worker, worker_gen, chatgroup
|
|
@@ -48,6 +49,11 @@ __all__ = [
|
|
|
48
49
|
"list_directory",
|
|
49
50
|
"get_task_result",
|
|
50
51
|
"get_url_content",
|
|
52
|
+
"add_knowledge_node",
|
|
53
|
+
"move_knowledge_node",
|
|
54
|
+
"delete_knowledge_node",
|
|
55
|
+
"rename_knowledge_node",
|
|
56
|
+
"get_knowledge_graph_tree",
|
|
51
57
|
"append_row_to_csv",
|
|
52
58
|
"set_readonly_path",
|
|
53
59
|
"get_code_repo_map",
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from ..aient.src.aient.plugins import register_tool
|
|
2
|
+
from ..core import kgm
|
|
3
|
+
|
|
4
|
+
@register_tool()
|
|
5
|
+
def add_knowledge_node(parent_path: str, node_name: str, description: str = "") -> str:
|
|
6
|
+
"""
|
|
7
|
+
在知识图谱的指定父路径下添加一个新节点。
|
|
8
|
+
|
|
9
|
+
Args:
|
|
10
|
+
parent_path (str): 父节点的路径。路径由'/'分隔,例如 'a/b'。根节点路径为 '.' 或 '/'。
|
|
11
|
+
node_name (str): 新节点的名称。名称中不能包含'/'字符。
|
|
12
|
+
description (str, optional): 节点的可选描述信息。默认为空字符串。
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
str: 操作结果的描述信息,例如成功或失败的原因。
|
|
16
|
+
"""
|
|
17
|
+
return kgm.add_node(parent_path, node_name, description)
|
|
18
|
+
|
|
19
|
+
@register_tool()
|
|
20
|
+
def delete_knowledge_node(node_path: str) -> str:
|
|
21
|
+
"""
|
|
22
|
+
从知识图谱中删除一个节点及其所有后代节点。
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
node_path (str): 要删除的节点的完整路径,例如 'a/b/c'。不允许删除根节点。
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
str: 操作结果的描述信息,例如成功或失败的原因。
|
|
29
|
+
"""
|
|
30
|
+
return kgm.delete_node(node_path)
|
|
31
|
+
|
|
32
|
+
@register_tool()
|
|
33
|
+
def rename_knowledge_node(node_path: str, new_name: str) -> str:
|
|
34
|
+
"""
|
|
35
|
+
重命名知识图谱中的一个现有节点。
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
node_path (str): 要重命名的节点的当前完整路径。
|
|
39
|
+
new_name (str): 节点的新名称。名称中不能包含'/'字符。
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
str: 操作结果的描述信息,例如成功或失败的原因。
|
|
43
|
+
"""
|
|
44
|
+
return kgm.rename_node(node_path, new_name)
|
|
45
|
+
|
|
46
|
+
@register_tool()
|
|
47
|
+
def move_knowledge_node(source_path: str, target_parent_path: str) -> str:
|
|
48
|
+
"""
|
|
49
|
+
将一个节点(及其整个子树)移动到知识图谱中的另一个父节点下。
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
source_path (str): 要移动的节点的当前完整路径。
|
|
53
|
+
target_parent_path (str): 目标父节点的完整路径。节点将被移动到这个新父节点之下。
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
str: 操作结果的描述信息,例如成功或失败的原因。
|
|
57
|
+
"""
|
|
58
|
+
return kgm.move_node(source_path, target_parent_path)
|
|
59
|
+
|
|
60
|
+
@register_tool()
|
|
61
|
+
def get_knowledge_graph_tree() -> str:
|
|
62
|
+
"""
|
|
63
|
+
渲染并返回整个知识图谱的文本树状图。
|
|
64
|
+
|
|
65
|
+
此工具不需要任何参数,它会读取当前的图状态并生成一个易于阅读的、
|
|
66
|
+
表示层级结构的字符串。
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
str: 表示整个知识图谱的、格式化的树状结构字符串。
|
|
70
|
+
"""
|
|
71
|
+
return kgm.render_tree()
|
|
@@ -67,27 +67,68 @@ def get_all_tasks_status():
|
|
|
67
67
|
return task_manager.tasks_cache
|
|
68
68
|
|
|
69
69
|
@register_tool()
|
|
70
|
-
async def get_task_result():
|
|
70
|
+
async def get_task_result(reduce: bool = False):
|
|
71
71
|
"""
|
|
72
|
-
|
|
72
|
+
等待并获取子任务的执行结果。
|
|
73
|
+
|
|
74
|
+
如果 `reduce` 为 `False`(默认),此工具会等待并返回任何一个子任务完成的结果。
|
|
75
|
+
一旦有任务完成,它会立即获取并返回该任务的结果。如果调用时没有任务完成,它会阻塞并等待。
|
|
76
|
+
|
|
77
|
+
如果 `reduce` 为 `True`,此工具会进入“规约”模式,等待 **所有** 正在运行或待处理的子任务都执行完毕后,
|
|
78
|
+
才将所有任务的结果汇总并返回。这在子任务之间无依赖、可以完全并行执行的场景下非常有用,
|
|
79
|
+
可以避免为了获取每个任务的结果而进行多次轮询,从而节省token。
|
|
80
|
+
|
|
81
|
+
警告:当子任务之间存在依赖关系,或者需要根据一个任务的结果来决定下一步操作时,**禁止** 使用 `reduce=True`。
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
reduce (bool, optional): 是否启用规约模式。默认为 `False`。
|
|
73
85
|
|
|
74
86
|
Returns:
|
|
75
|
-
str:
|
|
87
|
+
str:
|
|
88
|
+
- 当 `reduce=False` 时,返回单个子任务的执行结果。
|
|
89
|
+
- 当 `reduce=True` 时,返回一个包含所有任务最终状态和结果的汇总字符串。
|
|
76
90
|
"""
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
91
|
+
def get_running_tasks_count():
|
|
92
|
+
return len([
|
|
93
|
+
task_id for task_id, task in task_manager.tasks_cache.items()
|
|
94
|
+
if task_id != "root_path" and task.get("status") in ["PENDING", "RUNNING"]
|
|
95
|
+
])
|
|
81
96
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
f"Task ID: {task_id}\n",
|
|
85
|
-
f"Status: {status.value}\n",
|
|
86
|
-
f"Result: {result}\n\n",
|
|
87
|
-
f"There are {len(unfinished_tasks)} unfinished tasks, unfinished task ids: {unfinished_tasks[:5]} ..." if unfinished_tasks else "All tasks are finished.",
|
|
88
|
-
])
|
|
97
|
+
if get_running_tasks_count() == 0:
|
|
98
|
+
return "All tasks are finished."
|
|
89
99
|
|
|
90
|
-
|
|
100
|
+
if not reduce:
|
|
101
|
+
# 默认行为:获取下一个完成的任务结果
|
|
102
|
+
task_id, status, result = await task_manager.get_next_result()
|
|
103
|
+
|
|
104
|
+
unfinished_tasks = [tid for tid, task in task_manager.tasks_cache.items() if tid != "root_path" and task.get("status") not in ["DONE", "ERROR"]]
|
|
105
|
+
text = "".join([
|
|
106
|
+
f"Task ID: {task_id}\n",
|
|
107
|
+
f"Status: {status.value}\n",
|
|
108
|
+
f"Result: {result}\n\n",
|
|
109
|
+
f"There are {len(unfinished_tasks)} unfinished tasks, unfinished task ids: {unfinished_tasks[:5]} ..." if unfinished_tasks else "All tasks are finished.",
|
|
110
|
+
])
|
|
111
|
+
return text
|
|
112
|
+
else:
|
|
113
|
+
# 规约模式:等待所有任务完成
|
|
114
|
+
while get_running_tasks_count() > 0:
|
|
115
|
+
await task_manager.get_next_result()
|
|
116
|
+
|
|
117
|
+
# 收集所有任务的结果
|
|
118
|
+
all_results = []
|
|
119
|
+
for task_id, task in task_manager.tasks_cache.items():
|
|
120
|
+
if task_id == "root_path":
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
status = task.get('status', 'UNKNOWN')
|
|
124
|
+
result = task.get('result', 'No result available')
|
|
125
|
+
all_results.append(
|
|
126
|
+
f"Task ID: {task_id}\nStatus: {status}\nResult: {result}"
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
summary = f"All {len(all_results)} subtasks have been completed.\n\n"
|
|
130
|
+
summary += "\n\n".join(all_results)
|
|
131
|
+
return summary
|
|
91
132
|
|
|
92
133
|
import os
|
|
93
134
|
import csv
|
|
@@ -97,6 +138,7 @@ def create_tasks_from_csv(goal_template: str, csv_file_path: str, tools_json_str
|
|
|
97
138
|
"""
|
|
98
139
|
从一个CSV文件批量创建子任务。
|
|
99
140
|
此工具读取CSV文件的每一行,使用行数据填充goal模板,然后为每一行创建一个新的子任务。
|
|
141
|
+
可以使用 get_task_result 工具获取每个子任务的运行结果。
|
|
100
142
|
|
|
101
143
|
Args:
|
|
102
144
|
goal_template (str): 一个包含占位符的字符串模板。占位符的格式应为 `{column_name}`,
|
|
@@ -127,6 +169,8 @@ def create_tasks_from_csv(goal_template: str, csv_file_path: str, tools_json_str
|
|
|
127
169
|
|
|
128
170
|
try:
|
|
129
171
|
# 2. 读取并处理CSV文件
|
|
172
|
+
# 增加CSV字段大小限制以处理大字段
|
|
173
|
+
csv.field_size_limit(min(2**31-1, 2**20)) # 设置为1MB或系统最大值
|
|
130
174
|
with open(csv_file_path, mode='r', encoding='utf-8') as csvfile:
|
|
131
175
|
# 使用 DictReader 可以方便地通过列名访问数据
|
|
132
176
|
reader = csv.DictReader(csvfile)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
2
|
from typing import List, Dict, Union
|
|
3
3
|
|
|
4
|
-
from ..core import mcp_manager, broker, task_manager
|
|
4
|
+
from ..core import mcp_manager, broker, task_manager, kgm
|
|
5
5
|
from ..agents.planact import BrokerWorker
|
|
6
6
|
from ..agents.chatgroup import ChatGroupWorker
|
|
7
7
|
from ..aient.src.aient.plugins import register_tool
|
|
@@ -10,7 +10,7 @@ from ..aient.src.aient.plugins import register_tool
|
|
|
10
10
|
@register_tool()
|
|
11
11
|
async def worker(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
|
|
12
12
|
start_time = datetime.now()
|
|
13
|
-
worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager)
|
|
13
|
+
worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
|
|
14
14
|
result = await worker_instance.run()
|
|
15
15
|
end_time = datetime.now()
|
|
16
16
|
print(f"\n任务开始时间: {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
@@ -21,7 +21,7 @@ async def worker(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_
|
|
|
21
21
|
@register_tool()
|
|
22
22
|
async def worker_gen(goal: str, tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
|
|
23
23
|
start_time = datetime.now()
|
|
24
|
-
worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager)
|
|
24
|
+
worker_instance = BrokerWorker(goal, tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
|
|
25
25
|
async for result in worker_instance.stream_run():
|
|
26
26
|
yield result
|
|
27
27
|
end_time = datetime.now()
|
|
@@ -32,7 +32,7 @@ async def worker_gen(goal: str, tools: List[Union[str, Dict]], work_dir: str, ca
|
|
|
32
32
|
@register_tool()
|
|
33
33
|
async def chatgroup(tools: List[Union[str, Dict]], work_dir: str, cache_messages: Union[bool, List[Dict]] = None):
|
|
34
34
|
start_time = datetime.now()
|
|
35
|
-
worker_instance = ChatGroupWorker(tools, work_dir, cache_messages, broker, mcp_manager, task_manager)
|
|
35
|
+
worker_instance = ChatGroupWorker(tools, work_dir, cache_messages, broker, mcp_manager, task_manager, kgm)
|
|
36
36
|
result = await worker_instance.run()
|
|
37
37
|
end_time = datetime.now()
|
|
38
38
|
print(f"\n任务开始时间: {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
@@ -4,6 +4,7 @@ pyproject.toml
|
|
|
4
4
|
beswarm/__init__.py
|
|
5
5
|
beswarm/broker.py
|
|
6
6
|
beswarm/core.py
|
|
7
|
+
beswarm/knowledge_graph.py
|
|
7
8
|
beswarm/prompt.py
|
|
8
9
|
beswarm/taskmanager.py
|
|
9
10
|
beswarm/utils.py
|
|
@@ -142,6 +143,7 @@ beswarm/tools/__init__.py
|
|
|
142
143
|
beswarm/tools/click.py
|
|
143
144
|
beswarm/tools/completion.py
|
|
144
145
|
beswarm/tools/edit_file.py
|
|
146
|
+
beswarm/tools/graph.py
|
|
145
147
|
beswarm/tools/planner.py
|
|
146
148
|
beswarm/tools/repomap.py
|
|
147
149
|
beswarm/tools/request_input.py
|
|
@@ -153,4 +155,5 @@ beswarm/tools/worker.py
|
|
|
153
155
|
beswarm/tools/write_csv.py
|
|
154
156
|
test/test_TaskManager.py
|
|
155
157
|
test/test_broker.py
|
|
158
|
+
test/test_graph.py
|
|
156
159
|
test/test_new_TaskManager.py
|