agentpool 2.1.9__py3-none-any.whl
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 agentpool might be problematic. Click here for more details.
- acp/README.md +64 -0
- acp/__init__.py +172 -0
- acp/__main__.py +10 -0
- acp/acp_requests.py +285 -0
- acp/agent/__init__.py +6 -0
- acp/agent/connection.py +256 -0
- acp/agent/implementations/__init__.py +6 -0
- acp/agent/implementations/debug_server/__init__.py +1 -0
- acp/agent/implementations/debug_server/cli.py +79 -0
- acp/agent/implementations/debug_server/debug.html +234 -0
- acp/agent/implementations/debug_server/debug_server.py +496 -0
- acp/agent/implementations/testing.py +91 -0
- acp/agent/protocol.py +65 -0
- acp/bridge/README.md +162 -0
- acp/bridge/__init__.py +6 -0
- acp/bridge/__main__.py +91 -0
- acp/bridge/bridge.py +246 -0
- acp/bridge/py.typed +0 -0
- acp/bridge/settings.py +15 -0
- acp/client/__init__.py +7 -0
- acp/client/connection.py +251 -0
- acp/client/implementations/__init__.py +7 -0
- acp/client/implementations/default_client.py +185 -0
- acp/client/implementations/headless_client.py +266 -0
- acp/client/implementations/noop_client.py +110 -0
- acp/client/protocol.py +61 -0
- acp/connection.py +280 -0
- acp/exceptions.py +46 -0
- acp/filesystem.py +524 -0
- acp/notifications.py +832 -0
- acp/py.typed +0 -0
- acp/schema/__init__.py +265 -0
- acp/schema/agent_plan.py +30 -0
- acp/schema/agent_requests.py +126 -0
- acp/schema/agent_responses.py +256 -0
- acp/schema/base.py +39 -0
- acp/schema/capabilities.py +230 -0
- acp/schema/client_requests.py +247 -0
- acp/schema/client_responses.py +96 -0
- acp/schema/common.py +81 -0
- acp/schema/content_blocks.py +188 -0
- acp/schema/mcp.py +82 -0
- acp/schema/messages.py +171 -0
- acp/schema/notifications.py +82 -0
- acp/schema/protocol_stuff.md +3 -0
- acp/schema/session_state.py +160 -0
- acp/schema/session_updates.py +419 -0
- acp/schema/slash_commands.py +51 -0
- acp/schema/terminal.py +15 -0
- acp/schema/tool_call.py +347 -0
- acp/stdio.py +250 -0
- acp/task/__init__.py +53 -0
- acp/task/debug.py +197 -0
- acp/task/dispatcher.py +93 -0
- acp/task/queue.py +69 -0
- acp/task/sender.py +82 -0
- acp/task/state.py +87 -0
- acp/task/supervisor.py +93 -0
- acp/terminal_handle.py +30 -0
- acp/tool_call_reporter.py +199 -0
- acp/tool_call_state.py +178 -0
- acp/transports.py +104 -0
- acp/utils.py +240 -0
- agentpool/__init__.py +63 -0
- agentpool/__main__.py +7 -0
- agentpool/agents/__init__.py +30 -0
- agentpool/agents/acp_agent/__init__.py +5 -0
- agentpool/agents/acp_agent/acp_agent.py +837 -0
- agentpool/agents/acp_agent/acp_converters.py +294 -0
- agentpool/agents/acp_agent/client_handler.py +317 -0
- agentpool/agents/acp_agent/session_state.py +44 -0
- agentpool/agents/agent.py +1264 -0
- agentpool/agents/agui_agent/__init__.py +19 -0
- agentpool/agents/agui_agent/agui_agent.py +677 -0
- agentpool/agents/agui_agent/agui_converters.py +423 -0
- agentpool/agents/agui_agent/chunk_transformer.py +204 -0
- agentpool/agents/agui_agent/event_types.py +83 -0
- agentpool/agents/agui_agent/helpers.py +192 -0
- agentpool/agents/architect.py +71 -0
- agentpool/agents/base_agent.py +177 -0
- agentpool/agents/claude_code_agent/__init__.py +11 -0
- agentpool/agents/claude_code_agent/claude_code_agent.py +1021 -0
- agentpool/agents/claude_code_agent/converters.py +243 -0
- agentpool/agents/context.py +105 -0
- agentpool/agents/events/__init__.py +61 -0
- agentpool/agents/events/builtin_handlers.py +129 -0
- agentpool/agents/events/event_emitter.py +320 -0
- agentpool/agents/events/events.py +561 -0
- agentpool/agents/events/tts_handlers.py +186 -0
- agentpool/agents/interactions.py +419 -0
- agentpool/agents/slashed_agent.py +244 -0
- agentpool/agents/sys_prompts.py +178 -0
- agentpool/agents/tool_wrapping.py +184 -0
- agentpool/base_provider.py +28 -0
- agentpool/common_types.py +226 -0
- agentpool/config_resources/__init__.py +16 -0
- agentpool/config_resources/acp_assistant.yml +24 -0
- agentpool/config_resources/agents.yml +109 -0
- agentpool/config_resources/agents_template.yml +18 -0
- agentpool/config_resources/agui_test.yml +18 -0
- agentpool/config_resources/claude_code_agent.yml +16 -0
- agentpool/config_resources/claude_style_subagent.md +30 -0
- agentpool/config_resources/external_acp_agents.yml +77 -0
- agentpool/config_resources/opencode_style_subagent.md +19 -0
- agentpool/config_resources/tts_test_agents.yml +78 -0
- agentpool/delegation/__init__.py +8 -0
- agentpool/delegation/base_team.py +504 -0
- agentpool/delegation/message_flow_tracker.py +39 -0
- agentpool/delegation/pool.py +1129 -0
- agentpool/delegation/team.py +325 -0
- agentpool/delegation/teamrun.py +343 -0
- agentpool/docs/__init__.py +5 -0
- agentpool/docs/gen_examples.py +42 -0
- agentpool/docs/utils.py +370 -0
- agentpool/functional/__init__.py +20 -0
- agentpool/functional/py.typed +0 -0
- agentpool/functional/run.py +80 -0
- agentpool/functional/structure.py +136 -0
- agentpool/hooks/__init__.py +20 -0
- agentpool/hooks/agent_hooks.py +247 -0
- agentpool/hooks/base.py +119 -0
- agentpool/hooks/callable.py +140 -0
- agentpool/hooks/command.py +180 -0
- agentpool/hooks/prompt.py +122 -0
- agentpool/jinja_filters.py +132 -0
- agentpool/log.py +224 -0
- agentpool/mcp_server/__init__.py +17 -0
- agentpool/mcp_server/client.py +429 -0
- agentpool/mcp_server/constants.py +32 -0
- agentpool/mcp_server/conversions.py +172 -0
- agentpool/mcp_server/helpers.py +47 -0
- agentpool/mcp_server/manager.py +232 -0
- agentpool/mcp_server/message_handler.py +164 -0
- agentpool/mcp_server/registries/__init__.py +1 -0
- agentpool/mcp_server/registries/official_registry_client.py +345 -0
- agentpool/mcp_server/registries/pulsemcp_client.py +88 -0
- agentpool/mcp_server/tool_bridge.py +548 -0
- agentpool/messaging/__init__.py +58 -0
- agentpool/messaging/compaction.py +928 -0
- agentpool/messaging/connection_manager.py +319 -0
- agentpool/messaging/context.py +66 -0
- agentpool/messaging/event_manager.py +426 -0
- agentpool/messaging/events.py +39 -0
- agentpool/messaging/message_container.py +209 -0
- agentpool/messaging/message_history.py +491 -0
- agentpool/messaging/messagenode.py +377 -0
- agentpool/messaging/messages.py +655 -0
- agentpool/messaging/processing.py +76 -0
- agentpool/mime_utils.py +95 -0
- agentpool/models/__init__.py +21 -0
- agentpool/models/acp_agents/__init__.py +22 -0
- agentpool/models/acp_agents/base.py +308 -0
- agentpool/models/acp_agents/mcp_capable.py +790 -0
- agentpool/models/acp_agents/non_mcp.py +842 -0
- agentpool/models/agents.py +450 -0
- agentpool/models/agui_agents.py +89 -0
- agentpool/models/claude_code_agents.py +238 -0
- agentpool/models/file_agents.py +116 -0
- agentpool/models/file_parsing.py +367 -0
- agentpool/models/manifest.py +658 -0
- agentpool/observability/__init__.py +9 -0
- agentpool/observability/observability_registry.py +97 -0
- agentpool/prompts/__init__.py +1 -0
- agentpool/prompts/base.py +27 -0
- agentpool/prompts/builtin_provider.py +75 -0
- agentpool/prompts/conversion_manager.py +95 -0
- agentpool/prompts/convert.py +96 -0
- agentpool/prompts/manager.py +204 -0
- agentpool/prompts/parts/zed.md +33 -0
- agentpool/prompts/prompts.py +581 -0
- agentpool/py.typed +0 -0
- agentpool/queries/tree-sitter-language-pack/README.md +7 -0
- agentpool/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
- agentpool/queries/tree-sitter-language-pack/c-tags.scm +9 -0
- agentpool/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
- agentpool/queries/tree-sitter-language-pack/clojure-tags.scm +7 -0
- agentpool/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
- agentpool/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
- agentpool/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
- agentpool/queries/tree-sitter-language-pack/d-tags.scm +26 -0
- agentpool/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
- agentpool/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
- agentpool/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
- agentpool/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
- agentpool/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
- agentpool/queries/tree-sitter-language-pack/go-tags.scm +42 -0
- agentpool/queries/tree-sitter-language-pack/java-tags.scm +20 -0
- agentpool/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
- agentpool/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
- agentpool/queries/tree-sitter-language-pack/matlab-tags.scm +10 -0
- agentpool/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
- agentpool/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
- agentpool/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
- agentpool/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
- agentpool/queries/tree-sitter-language-pack/python-tags.scm +14 -0
- agentpool/queries/tree-sitter-language-pack/r-tags.scm +21 -0
- agentpool/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
- agentpool/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
- agentpool/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
- agentpool/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
- agentpool/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
- agentpool/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
- agentpool/queries/tree-sitter-languages/README.md +24 -0
- agentpool/queries/tree-sitter-languages/c-tags.scm +9 -0
- agentpool/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
- agentpool/queries/tree-sitter-languages/cpp-tags.scm +15 -0
- agentpool/queries/tree-sitter-languages/dart-tags.scm +91 -0
- agentpool/queries/tree-sitter-languages/elisp-tags.scm +8 -0
- agentpool/queries/tree-sitter-languages/elixir-tags.scm +54 -0
- agentpool/queries/tree-sitter-languages/elm-tags.scm +19 -0
- agentpool/queries/tree-sitter-languages/fortran-tags.scm +15 -0
- agentpool/queries/tree-sitter-languages/go-tags.scm +30 -0
- agentpool/queries/tree-sitter-languages/haskell-tags.scm +3 -0
- agentpool/queries/tree-sitter-languages/hcl-tags.scm +77 -0
- agentpool/queries/tree-sitter-languages/java-tags.scm +20 -0
- agentpool/queries/tree-sitter-languages/javascript-tags.scm +88 -0
- agentpool/queries/tree-sitter-languages/julia-tags.scm +60 -0
- agentpool/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
- agentpool/queries/tree-sitter-languages/matlab-tags.scm +10 -0
- agentpool/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
- agentpool/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
- agentpool/queries/tree-sitter-languages/php-tags.scm +26 -0
- agentpool/queries/tree-sitter-languages/python-tags.scm +12 -0
- agentpool/queries/tree-sitter-languages/ql-tags.scm +26 -0
- agentpool/queries/tree-sitter-languages/ruby-tags.scm +64 -0
- agentpool/queries/tree-sitter-languages/rust-tags.scm +60 -0
- agentpool/queries/tree-sitter-languages/scala-tags.scm +65 -0
- agentpool/queries/tree-sitter-languages/typescript-tags.scm +41 -0
- agentpool/queries/tree-sitter-languages/zig-tags.scm +3 -0
- agentpool/repomap.py +1231 -0
- agentpool/resource_providers/__init__.py +17 -0
- agentpool/resource_providers/aggregating.py +54 -0
- agentpool/resource_providers/base.py +172 -0
- agentpool/resource_providers/codemode/__init__.py +9 -0
- agentpool/resource_providers/codemode/code_executor.py +215 -0
- agentpool/resource_providers/codemode/default_prompt.py +19 -0
- agentpool/resource_providers/codemode/helpers.py +83 -0
- agentpool/resource_providers/codemode/progress_executor.py +212 -0
- agentpool/resource_providers/codemode/provider.py +150 -0
- agentpool/resource_providers/codemode/remote_mcp_execution.py +143 -0
- agentpool/resource_providers/codemode/remote_provider.py +171 -0
- agentpool/resource_providers/filtering.py +42 -0
- agentpool/resource_providers/mcp_provider.py +246 -0
- agentpool/resource_providers/plan_provider.py +196 -0
- agentpool/resource_providers/pool.py +69 -0
- agentpool/resource_providers/static.py +289 -0
- agentpool/running/__init__.py +20 -0
- agentpool/running/decorators.py +56 -0
- agentpool/running/discovery.py +101 -0
- agentpool/running/executor.py +284 -0
- agentpool/running/injection.py +111 -0
- agentpool/running/py.typed +0 -0
- agentpool/running/run_nodes.py +87 -0
- agentpool/server.py +122 -0
- agentpool/sessions/__init__.py +13 -0
- agentpool/sessions/manager.py +302 -0
- agentpool/sessions/models.py +71 -0
- agentpool/sessions/session.py +239 -0
- agentpool/sessions/store.py +163 -0
- agentpool/skills/__init__.py +5 -0
- agentpool/skills/manager.py +120 -0
- agentpool/skills/registry.py +210 -0
- agentpool/skills/skill.py +36 -0
- agentpool/storage/__init__.py +17 -0
- agentpool/storage/manager.py +419 -0
- agentpool/storage/serialization.py +136 -0
- agentpool/talk/__init__.py +13 -0
- agentpool/talk/registry.py +128 -0
- agentpool/talk/stats.py +159 -0
- agentpool/talk/talk.py +604 -0
- agentpool/tasks/__init__.py +20 -0
- agentpool/tasks/exceptions.py +25 -0
- agentpool/tasks/registry.py +33 -0
- agentpool/testing.py +129 -0
- agentpool/text_templates/__init__.py +39 -0
- agentpool/text_templates/system_prompt.jinja +30 -0
- agentpool/text_templates/tool_call_default.jinja +13 -0
- agentpool/text_templates/tool_call_markdown.jinja +25 -0
- agentpool/text_templates/tool_call_simple.jinja +5 -0
- agentpool/tools/__init__.py +16 -0
- agentpool/tools/base.py +269 -0
- agentpool/tools/exceptions.py +9 -0
- agentpool/tools/manager.py +255 -0
- agentpool/tools/tool_call_info.py +87 -0
- agentpool/ui/__init__.py +2 -0
- agentpool/ui/base.py +89 -0
- agentpool/ui/mock_provider.py +81 -0
- agentpool/ui/stdlib_provider.py +150 -0
- agentpool/utils/__init__.py +44 -0
- agentpool/utils/baseregistry.py +185 -0
- agentpool/utils/count_tokens.py +62 -0
- agentpool/utils/dag.py +184 -0
- agentpool/utils/importing.py +206 -0
- agentpool/utils/inspection.py +334 -0
- agentpool/utils/model_capabilities.py +25 -0
- agentpool/utils/network.py +28 -0
- agentpool/utils/now.py +22 -0
- agentpool/utils/parse_time.py +87 -0
- agentpool/utils/result_utils.py +35 -0
- agentpool/utils/signatures.py +305 -0
- agentpool/utils/streams.py +112 -0
- agentpool/utils/tasks.py +186 -0
- agentpool/vfs_registry.py +250 -0
- agentpool-2.1.9.dist-info/METADATA +336 -0
- agentpool-2.1.9.dist-info/RECORD +474 -0
- agentpool-2.1.9.dist-info/WHEEL +4 -0
- agentpool-2.1.9.dist-info/entry_points.txt +14 -0
- agentpool-2.1.9.dist-info/licenses/LICENSE +22 -0
- agentpool_cli/__init__.py +34 -0
- agentpool_cli/__main__.py +66 -0
- agentpool_cli/agent.py +175 -0
- agentpool_cli/cli_types.py +23 -0
- agentpool_cli/common.py +163 -0
- agentpool_cli/create.py +175 -0
- agentpool_cli/history.py +217 -0
- agentpool_cli/log.py +78 -0
- agentpool_cli/py.typed +0 -0
- agentpool_cli/run.py +84 -0
- agentpool_cli/serve_acp.py +177 -0
- agentpool_cli/serve_api.py +69 -0
- agentpool_cli/serve_mcp.py +74 -0
- agentpool_cli/serve_vercel.py +233 -0
- agentpool_cli/store.py +171 -0
- agentpool_cli/task.py +84 -0
- agentpool_cli/utils.py +104 -0
- agentpool_cli/watch.py +54 -0
- agentpool_commands/__init__.py +180 -0
- agentpool_commands/agents.py +199 -0
- agentpool_commands/base.py +45 -0
- agentpool_commands/commands.py +58 -0
- agentpool_commands/completers.py +110 -0
- agentpool_commands/connections.py +175 -0
- agentpool_commands/markdown_utils.py +31 -0
- agentpool_commands/models.py +62 -0
- agentpool_commands/prompts.py +78 -0
- agentpool_commands/py.typed +0 -0
- agentpool_commands/read.py +77 -0
- agentpool_commands/resources.py +210 -0
- agentpool_commands/session.py +48 -0
- agentpool_commands/tools.py +269 -0
- agentpool_commands/utils.py +189 -0
- agentpool_commands/workers.py +163 -0
- agentpool_config/__init__.py +53 -0
- agentpool_config/builtin_tools.py +265 -0
- agentpool_config/commands.py +237 -0
- agentpool_config/conditions.py +301 -0
- agentpool_config/converters.py +30 -0
- agentpool_config/durable.py +331 -0
- agentpool_config/event_handlers.py +600 -0
- agentpool_config/events.py +153 -0
- agentpool_config/forward_targets.py +251 -0
- agentpool_config/hook_conditions.py +331 -0
- agentpool_config/hooks.py +241 -0
- agentpool_config/jinja.py +206 -0
- agentpool_config/knowledge.py +41 -0
- agentpool_config/loaders.py +350 -0
- agentpool_config/mcp_server.py +243 -0
- agentpool_config/nodes.py +202 -0
- agentpool_config/observability.py +191 -0
- agentpool_config/output_types.py +55 -0
- agentpool_config/pool_server.py +267 -0
- agentpool_config/prompt_hubs.py +105 -0
- agentpool_config/prompts.py +185 -0
- agentpool_config/py.typed +0 -0
- agentpool_config/resources.py +33 -0
- agentpool_config/session.py +119 -0
- agentpool_config/skills.py +17 -0
- agentpool_config/storage.py +288 -0
- agentpool_config/system_prompts.py +190 -0
- agentpool_config/task.py +162 -0
- agentpool_config/teams.py +52 -0
- agentpool_config/tools.py +112 -0
- agentpool_config/toolsets.py +1033 -0
- agentpool_config/workers.py +86 -0
- agentpool_prompts/__init__.py +1 -0
- agentpool_prompts/braintrust_hub.py +235 -0
- agentpool_prompts/fabric.py +75 -0
- agentpool_prompts/langfuse_hub.py +79 -0
- agentpool_prompts/promptlayer_provider.py +59 -0
- agentpool_prompts/py.typed +0 -0
- agentpool_server/__init__.py +9 -0
- agentpool_server/a2a_server/__init__.py +5 -0
- agentpool_server/a2a_server/a2a_types.py +41 -0
- agentpool_server/a2a_server/server.py +190 -0
- agentpool_server/a2a_server/storage.py +81 -0
- agentpool_server/acp_server/__init__.py +22 -0
- agentpool_server/acp_server/acp_agent.py +786 -0
- agentpool_server/acp_server/acp_tools.py +43 -0
- agentpool_server/acp_server/commands/__init__.py +18 -0
- agentpool_server/acp_server/commands/acp_commands.py +594 -0
- agentpool_server/acp_server/commands/debug_commands.py +376 -0
- agentpool_server/acp_server/commands/docs_commands/__init__.py +39 -0
- agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +169 -0
- agentpool_server/acp_server/commands/docs_commands/get_schema.py +176 -0
- agentpool_server/acp_server/commands/docs_commands/get_source.py +110 -0
- agentpool_server/acp_server/commands/docs_commands/git_diff.py +111 -0
- agentpool_server/acp_server/commands/docs_commands/helpers.py +33 -0
- agentpool_server/acp_server/commands/docs_commands/url_to_markdown.py +90 -0
- agentpool_server/acp_server/commands/spawn.py +210 -0
- agentpool_server/acp_server/converters.py +235 -0
- agentpool_server/acp_server/input_provider.py +338 -0
- agentpool_server/acp_server/server.py +288 -0
- agentpool_server/acp_server/session.py +969 -0
- agentpool_server/acp_server/session_manager.py +313 -0
- agentpool_server/acp_server/syntax_detection.py +250 -0
- agentpool_server/acp_server/zed_tools.md +90 -0
- agentpool_server/aggregating_server.py +309 -0
- agentpool_server/agui_server/__init__.py +11 -0
- agentpool_server/agui_server/server.py +128 -0
- agentpool_server/base.py +189 -0
- agentpool_server/http_server.py +164 -0
- agentpool_server/mcp_server/__init__.py +6 -0
- agentpool_server/mcp_server/server.py +314 -0
- agentpool_server/mcp_server/zed_wrapper.py +110 -0
- agentpool_server/openai_api_server/__init__.py +5 -0
- agentpool_server/openai_api_server/completions/__init__.py +1 -0
- agentpool_server/openai_api_server/completions/helpers.py +81 -0
- agentpool_server/openai_api_server/completions/models.py +98 -0
- agentpool_server/openai_api_server/responses/__init__.py +1 -0
- agentpool_server/openai_api_server/responses/helpers.py +74 -0
- agentpool_server/openai_api_server/responses/models.py +96 -0
- agentpool_server/openai_api_server/server.py +242 -0
- agentpool_server/py.typed +0 -0
- agentpool_storage/__init__.py +9 -0
- agentpool_storage/base.py +310 -0
- agentpool_storage/file_provider.py +378 -0
- agentpool_storage/formatters.py +129 -0
- agentpool_storage/memory_provider.py +396 -0
- agentpool_storage/models.py +108 -0
- agentpool_storage/py.typed +0 -0
- agentpool_storage/session_store.py +262 -0
- agentpool_storage/sql_provider/__init__.py +21 -0
- agentpool_storage/sql_provider/cli.py +146 -0
- agentpool_storage/sql_provider/models.py +249 -0
- agentpool_storage/sql_provider/queries.py +15 -0
- agentpool_storage/sql_provider/sql_provider.py +444 -0
- agentpool_storage/sql_provider/utils.py +234 -0
- agentpool_storage/text_log_provider.py +275 -0
- agentpool_toolsets/__init__.py +15 -0
- agentpool_toolsets/builtin/__init__.py +33 -0
- agentpool_toolsets/builtin/agent_management.py +239 -0
- agentpool_toolsets/builtin/chain.py +288 -0
- agentpool_toolsets/builtin/code.py +398 -0
- agentpool_toolsets/builtin/debug.py +291 -0
- agentpool_toolsets/builtin/execution_environment.py +381 -0
- agentpool_toolsets/builtin/file_edit/__init__.py +11 -0
- agentpool_toolsets/builtin/file_edit/file_edit.py +747 -0
- agentpool_toolsets/builtin/file_edit/fuzzy_matcher/__init__.py +5 -0
- agentpool_toolsets/builtin/file_edit/fuzzy_matcher/example_usage.py +311 -0
- agentpool_toolsets/builtin/file_edit/fuzzy_matcher/streaming_fuzzy_matcher.py +443 -0
- agentpool_toolsets/builtin/history.py +36 -0
- agentpool_toolsets/builtin/integration.py +85 -0
- agentpool_toolsets/builtin/skills.py +77 -0
- agentpool_toolsets/builtin/subagent_tools.py +324 -0
- agentpool_toolsets/builtin/tool_management.py +90 -0
- agentpool_toolsets/builtin/user_interaction.py +52 -0
- agentpool_toolsets/builtin/workers.py +128 -0
- agentpool_toolsets/composio_toolset.py +96 -0
- agentpool_toolsets/config_creation.py +192 -0
- agentpool_toolsets/entry_points.py +47 -0
- agentpool_toolsets/fsspec_toolset/__init__.py +7 -0
- agentpool_toolsets/fsspec_toolset/diagnostics.py +115 -0
- agentpool_toolsets/fsspec_toolset/grep.py +450 -0
- agentpool_toolsets/fsspec_toolset/helpers.py +631 -0
- agentpool_toolsets/fsspec_toolset/streaming_diff_parser.py +249 -0
- agentpool_toolsets/fsspec_toolset/toolset.py +1384 -0
- agentpool_toolsets/mcp_run_toolset.py +61 -0
- agentpool_toolsets/notifications.py +146 -0
- agentpool_toolsets/openapi.py +118 -0
- agentpool_toolsets/py.typed +0 -0
- agentpool_toolsets/search_toolset.py +202 -0
- agentpool_toolsets/semantic_memory_toolset.py +536 -0
- agentpool_toolsets/streaming_tools.py +265 -0
- agentpool_toolsets/vfs_toolset.py +124 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"""Text-based storage provider with dynamic paths."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any, ClassVar
|
|
6
|
+
|
|
7
|
+
from upathtools import to_upath
|
|
8
|
+
|
|
9
|
+
from agentpool.log import get_logger
|
|
10
|
+
from agentpool.utils.now import get_now
|
|
11
|
+
from agentpool_storage.base import StorageProvider
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
|
|
17
|
+
from jinja2 import Template
|
|
18
|
+
from upathtools import JoinablePathLike, UPath
|
|
19
|
+
|
|
20
|
+
from agentpool.common_types import JsonValue
|
|
21
|
+
from agentpool_config.storage import LogFormat, TextLogConfig
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
CONVERSATIONS_TEMPLATE = """\
|
|
28
|
+
=== AgentPool Log ===
|
|
29
|
+
|
|
30
|
+
{%- for conv_id, conv in conversations.items() %}
|
|
31
|
+
=== Conversation {{ conv_id }} (agent: {{ conv.agent_name }}, started: {{ conv.start_time.strftime('%Y-%m-%d %H:%M:%S') }}) ===
|
|
32
|
+
|
|
33
|
+
{%- for msg in messages if msg.conversation_id == conv_id %}
|
|
34
|
+
[{{ msg.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] {{ msg.sender }}{% if msg.model %} ({{ msg.model }}){% endif %}: {{ msg.content }}
|
|
35
|
+
{%- if msg.cost_info %}
|
|
36
|
+
Tokens: {{ msg.cost_info.token_usage.total }} (prompt: {{ msg.cost_info.token_usage.prompt }}, completion: {{ msg.cost_info.token_usage.completion }})
|
|
37
|
+
Cost: ${{ "%.4f"|format(msg.cost_info.total_cost) }}
|
|
38
|
+
{%- endif %}
|
|
39
|
+
{%- if msg.response_time %}
|
|
40
|
+
Response time: {{ "%.1f"|format(msg.response_time) }}s
|
|
41
|
+
{%- endif %}
|
|
42
|
+
{%- if msg.forwarded_from %}
|
|
43
|
+
Forwarded via: {{ msg.forwarded_from|join(' -> ') }}
|
|
44
|
+
{%- endif %}
|
|
45
|
+
|
|
46
|
+
{%- for tool in tool_calls if tool.message_id == msg.id %}
|
|
47
|
+
Tool Call: {{ tool.tool_name }}
|
|
48
|
+
Args: {{ tool.args|pprint }}
|
|
49
|
+
Result: {{ tool.result }}
|
|
50
|
+
{%- endfor %}
|
|
51
|
+
{%- endfor %}
|
|
52
|
+
{%- endfor %}
|
|
53
|
+
|
|
54
|
+
=== Commands ===
|
|
55
|
+
{%- for cmd in commands %}
|
|
56
|
+
[{{ cmd.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] {{ cmd.agent_name }} ({{ cmd.session_id }}): {{ cmd.command }}
|
|
57
|
+
{%- endfor %}
|
|
58
|
+
""" # noqa: E501
|
|
59
|
+
|
|
60
|
+
CHRONOLOGICAL_TEMPLATE = """\
|
|
61
|
+
=== AgentPool Log ===
|
|
62
|
+
|
|
63
|
+
{%- for entry in entries|sort(attribute="timestamp") %}
|
|
64
|
+
{%- if entry.type == "conversation_start" %}
|
|
65
|
+
=== Conversation {{ entry.conversation_id }} (agent: {{ entry.agent_name }}) started ===
|
|
66
|
+
|
|
67
|
+
{%- elif entry.type == "message" %}
|
|
68
|
+
[{{ entry.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] {{ entry.sender }}{% if entry.model %} ({{ entry.model }}){% endif %}: {{ entry.content }}
|
|
69
|
+
{%- if entry.cost_info %}
|
|
70
|
+
Tokens: {{ entry.cost_info.token_usage.total }} (prompt: {{ entry.cost_info.token_usage.prompt }}, completion: {{ entry.cost_info.token_usage.completion }})
|
|
71
|
+
Cost: ${{ "%.4f"|format(entry.cost_info.total_cost) }}
|
|
72
|
+
{%- endif %}
|
|
73
|
+
{%- if entry.response_time %}
|
|
74
|
+
Response time: {{ "%.1f"|format(entry.response_time) }}s
|
|
75
|
+
{%- endif %}
|
|
76
|
+
{%- if entry.forwarded_from %}
|
|
77
|
+
Forwarded via: {{ entry.forwarded_from|join(' -> ') }}
|
|
78
|
+
{%- endif %}
|
|
79
|
+
|
|
80
|
+
{%- elif entry.type == "tool_call" %}
|
|
81
|
+
[{{ entry.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] Tool Call: {{ entry.tool_name }}
|
|
82
|
+
Args: {{ entry.args|pprint }}
|
|
83
|
+
Result: {{ entry.result }}
|
|
84
|
+
|
|
85
|
+
{%- elif entry.type == "command" %}
|
|
86
|
+
[{{ entry.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] Command by {{ entry.agent_name }}: {{ entry.command }}
|
|
87
|
+
|
|
88
|
+
{%- endif %}
|
|
89
|
+
{%- endfor %}
|
|
90
|
+
""" # noqa: E501
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TextLogProvider(StorageProvider):
|
|
94
|
+
"""Human-readable text log provider with dynamic paths.
|
|
95
|
+
|
|
96
|
+
Available template variables:
|
|
97
|
+
- now: datetime - Current timestamp
|
|
98
|
+
- date: date - Current date
|
|
99
|
+
- operation: str - Type of operation (message/conversation/tool_call/command)
|
|
100
|
+
- conversation_id: str - ID of current conversation
|
|
101
|
+
- agent_name: str - Name of the agent
|
|
102
|
+
- content: str - Message content
|
|
103
|
+
- role: str - Message role
|
|
104
|
+
- model: str - Model name
|
|
105
|
+
- session_id: str - Session ID
|
|
106
|
+
- tool_name: str - Name of tool being called
|
|
107
|
+
- command: str - Command being executed
|
|
108
|
+
|
|
109
|
+
All variables default to empty string if not available for current operation.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
TEMPLATES: ClassVar[dict[LogFormat, str]] = {
|
|
113
|
+
"chronological": CHRONOLOGICAL_TEMPLATE,
|
|
114
|
+
"conversations": CONVERSATIONS_TEMPLATE,
|
|
115
|
+
}
|
|
116
|
+
can_load_history = False
|
|
117
|
+
|
|
118
|
+
def __init__(self, config: TextLogConfig) -> None:
|
|
119
|
+
"""Initialize text log provider."""
|
|
120
|
+
from jinja2 import Environment, Undefined
|
|
121
|
+
|
|
122
|
+
class EmptyStringUndefined(Undefined):
|
|
123
|
+
"""Return empty string for undefined variables."""
|
|
124
|
+
|
|
125
|
+
def __str__(self) -> str:
|
|
126
|
+
return ""
|
|
127
|
+
|
|
128
|
+
super().__init__(config)
|
|
129
|
+
self.encoding = config.encoding
|
|
130
|
+
self.content_template = self._load_template(config.template)
|
|
131
|
+
# Configure Jinja env with empty string for undefined
|
|
132
|
+
env = Environment(undefined=EmptyStringUndefined, enable_async=True)
|
|
133
|
+
self.path_template = env.from_string(config.path)
|
|
134
|
+
|
|
135
|
+
self._entries: list[dict[str, Any]] = []
|
|
136
|
+
|
|
137
|
+
def _load_template(
|
|
138
|
+
self,
|
|
139
|
+
template: LogFormat | JoinablePathLike | None,
|
|
140
|
+
) -> Template:
|
|
141
|
+
"""Load template from predefined or file."""
|
|
142
|
+
from jinja2 import Template
|
|
143
|
+
|
|
144
|
+
if template is None:
|
|
145
|
+
template_str = self.TEMPLATES["chronological"]
|
|
146
|
+
elif template in self.TEMPLATES:
|
|
147
|
+
template_str = self.TEMPLATES[template] # type: ignore
|
|
148
|
+
else: # Assume it's a path
|
|
149
|
+
template_str = to_upath(template).read_text()
|
|
150
|
+
return Template(template_str)
|
|
151
|
+
|
|
152
|
+
def _get_base_context(self, operation: str) -> dict[str, Any]:
|
|
153
|
+
"""Get base context with defaults.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
operation: Type of operation being logged
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
Base context dict with defaults
|
|
160
|
+
"""
|
|
161
|
+
# All other variables will default to empty string via EmptyStringUndefined
|
|
162
|
+
return {"now": get_now(), "date": get_now().date(), "operation": operation}
|
|
163
|
+
|
|
164
|
+
async def _get_path(self, operation: str, **context: Any) -> UPath:
|
|
165
|
+
"""Render path template with context.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
operation: Type of operation being logged
|
|
169
|
+
**context: Additional context variables
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
Concrete path for current operation
|
|
173
|
+
"""
|
|
174
|
+
# Combine base context with provided values
|
|
175
|
+
path_context = self._get_base_context(operation)
|
|
176
|
+
path_context.update(context)
|
|
177
|
+
|
|
178
|
+
path = await self.path_template.render_async(**path_context)
|
|
179
|
+
resolved_path = to_upath(path)
|
|
180
|
+
resolved_path.parent.mkdir(parents=True, exist_ok=True)
|
|
181
|
+
return resolved_path
|
|
182
|
+
|
|
183
|
+
async def log_message(
|
|
184
|
+
self,
|
|
185
|
+
*,
|
|
186
|
+
conversation_id: str,
|
|
187
|
+
message_id: str,
|
|
188
|
+
content: str,
|
|
189
|
+
role: str,
|
|
190
|
+
name: str | None = None,
|
|
191
|
+
cost_info: Any | None = None,
|
|
192
|
+
model: str | None = None,
|
|
193
|
+
response_time: float | None = None,
|
|
194
|
+
forwarded_from: list[str] | None = None,
|
|
195
|
+
provider_name: str | None = None,
|
|
196
|
+
provider_response_id: str | None = None,
|
|
197
|
+
messages: str | None = None,
|
|
198
|
+
finish_reason: str | None = None,
|
|
199
|
+
) -> None:
|
|
200
|
+
"""Store message and update log."""
|
|
201
|
+
entry = {
|
|
202
|
+
"type": "message",
|
|
203
|
+
"timestamp": get_now(),
|
|
204
|
+
"conversation_id": conversation_id,
|
|
205
|
+
"message_id": message_id,
|
|
206
|
+
"content": content,
|
|
207
|
+
"role": role,
|
|
208
|
+
"agent_name": name,
|
|
209
|
+
"model": model,
|
|
210
|
+
"cost_info": cost_info,
|
|
211
|
+
"response_time": response_time,
|
|
212
|
+
"forwarded_from": forwarded_from,
|
|
213
|
+
"provider_name": provider_name,
|
|
214
|
+
"provider_response_id": provider_response_id,
|
|
215
|
+
"messages": messages,
|
|
216
|
+
"finish_reason": finish_reason,
|
|
217
|
+
}
|
|
218
|
+
self._entries.append(entry)
|
|
219
|
+
|
|
220
|
+
path = await self._get_path("message", **entry)
|
|
221
|
+
self._write(path)
|
|
222
|
+
|
|
223
|
+
async def log_conversation(
|
|
224
|
+
self,
|
|
225
|
+
*,
|
|
226
|
+
conversation_id: str,
|
|
227
|
+
node_name: str,
|
|
228
|
+
start_time: datetime | None = None,
|
|
229
|
+
) -> None:
|
|
230
|
+
"""Store conversation start."""
|
|
231
|
+
entry = {
|
|
232
|
+
"type": "conversation",
|
|
233
|
+
"timestamp": start_time or get_now(),
|
|
234
|
+
"conversation_id": conversation_id,
|
|
235
|
+
"agent_name": node_name,
|
|
236
|
+
}
|
|
237
|
+
self._entries.append(entry)
|
|
238
|
+
|
|
239
|
+
path = await self._get_path("conversation", **entry)
|
|
240
|
+
self._write(path)
|
|
241
|
+
|
|
242
|
+
async def log_command(
|
|
243
|
+
self,
|
|
244
|
+
*,
|
|
245
|
+
agent_name: str,
|
|
246
|
+
session_id: str,
|
|
247
|
+
command: str,
|
|
248
|
+
context_type: type | None = None,
|
|
249
|
+
metadata: dict[str, JsonValue] | None = None,
|
|
250
|
+
) -> None:
|
|
251
|
+
"""Store command."""
|
|
252
|
+
entry = {
|
|
253
|
+
"type": "command",
|
|
254
|
+
"timestamp": get_now(),
|
|
255
|
+
"agent_name": agent_name,
|
|
256
|
+
"session_id": session_id,
|
|
257
|
+
"command": command,
|
|
258
|
+
"context_type": context_type.__name__ if context_type else "",
|
|
259
|
+
"metadata": metadata or {},
|
|
260
|
+
}
|
|
261
|
+
self._entries.append(entry)
|
|
262
|
+
|
|
263
|
+
path = await self._get_path("command", **entry)
|
|
264
|
+
self._write(path)
|
|
265
|
+
|
|
266
|
+
def _write(self, path: UPath) -> None:
|
|
267
|
+
"""Write current state to file at given path."""
|
|
268
|
+
context = {"entries": self._entries}
|
|
269
|
+
try:
|
|
270
|
+
text = self.content_template.render(context)
|
|
271
|
+
path.write_text(text, encoding=self.encoding)
|
|
272
|
+
except Exception as e:
|
|
273
|
+
logger.exception("Failed to write to log file", path=path)
|
|
274
|
+
msg = f"Failed to write to log file: {e}"
|
|
275
|
+
raise RuntimeError(msg) from e
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Toolsets package."""
|
|
2
|
+
|
|
3
|
+
from agentpool_toolsets.config_creation import ConfigCreationTools
|
|
4
|
+
from agentpool_toolsets.fsspec_toolset import FSSpecTools
|
|
5
|
+
from agentpool_toolsets.notifications import NotificationsTools
|
|
6
|
+
from agentpool_toolsets.semantic_memory_toolset import SemanticMemoryTools
|
|
7
|
+
from agentpool_toolsets.vfs_toolset import VFSTools
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"ConfigCreationTools",
|
|
11
|
+
"FSSpecTools",
|
|
12
|
+
"NotificationsTools",
|
|
13
|
+
"SemanticMemoryTools",
|
|
14
|
+
"VFSTools",
|
|
15
|
+
]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Built-in toolsets for agent capabilities."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# Import provider classes
|
|
7
|
+
from agentpool_toolsets.builtin.agent_management import AgentManagementTools
|
|
8
|
+
from agentpool_toolsets.builtin.code import CodeTools
|
|
9
|
+
from agentpool_toolsets.builtin.debug import DebugTools
|
|
10
|
+
from agentpool_toolsets.builtin.execution_environment import ExecutionEnvironmentTools
|
|
11
|
+
from agentpool_toolsets.builtin.history import HistoryTools
|
|
12
|
+
from agentpool_toolsets.builtin.integration import IntegrationTools
|
|
13
|
+
from agentpool_toolsets.builtin.skills import SkillsTools
|
|
14
|
+
from agentpool_toolsets.builtin.subagent_tools import SubagentTools
|
|
15
|
+
from agentpool_toolsets.builtin.tool_management import ToolManagementTools
|
|
16
|
+
from agentpool_toolsets.builtin.user_interaction import UserInteractionTools
|
|
17
|
+
from agentpool_toolsets.builtin.workers import WorkersTools
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
# Provider classes
|
|
22
|
+
"AgentManagementTools",
|
|
23
|
+
"CodeTools",
|
|
24
|
+
"DebugTools",
|
|
25
|
+
"ExecutionEnvironmentTools",
|
|
26
|
+
"HistoryTools",
|
|
27
|
+
"IntegrationTools",
|
|
28
|
+
"SkillsTools",
|
|
29
|
+
"SubagentTools",
|
|
30
|
+
"ToolManagementTools",
|
|
31
|
+
"UserInteractionTools",
|
|
32
|
+
"WorkersTools",
|
|
33
|
+
]
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"""Provider for agent pool building tools."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import timedelta
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
7
|
+
|
|
8
|
+
import anyio
|
|
9
|
+
from pydantic_ai import ModelRetry
|
|
10
|
+
|
|
11
|
+
from agentpool.agents.context import AgentContext # noqa: TC001
|
|
12
|
+
from agentpool.log import get_logger
|
|
13
|
+
from agentpool.resource_providers import StaticResourceProvider
|
|
14
|
+
from agentpool.tools.exceptions import ToolError
|
|
15
|
+
from agentpool.utils.result_utils import to_type
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from agentpool.agents import Agent
|
|
20
|
+
|
|
21
|
+
logger = get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
async def create_worker_agent[TDeps](
|
|
25
|
+
ctx: AgentContext[TDeps],
|
|
26
|
+
name: str,
|
|
27
|
+
system_prompt: str,
|
|
28
|
+
model: str | None = None,
|
|
29
|
+
) -> str:
|
|
30
|
+
"""Create a new agent and register it as a tool.
|
|
31
|
+
|
|
32
|
+
The new agent will be available as a tool for delegating specific tasks.
|
|
33
|
+
It inherits the current model unless overridden.
|
|
34
|
+
"""
|
|
35
|
+
from agentpool import Agent
|
|
36
|
+
|
|
37
|
+
if not ctx.pool:
|
|
38
|
+
msg = "Agent needs to be in a pool to list agents"
|
|
39
|
+
raise ToolError(msg)
|
|
40
|
+
|
|
41
|
+
model = model or ctx.agent.model_name
|
|
42
|
+
agent = Agent[TDeps](name=name, model=model, system_prompt=system_prompt, agent_pool=ctx.pool)
|
|
43
|
+
assert ctx.agent
|
|
44
|
+
tool_info = ctx.native_agent.register_worker(agent)
|
|
45
|
+
return f"Created worker agent and registered as tool: {tool_info.name}"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def add_agent( # noqa: D417
|
|
49
|
+
ctx: AgentContext,
|
|
50
|
+
name: str,
|
|
51
|
+
system_prompt: str,
|
|
52
|
+
model: str | None = None,
|
|
53
|
+
tools: list[str] | None = None,
|
|
54
|
+
session: str | None = None,
|
|
55
|
+
output_type: str | None = None,
|
|
56
|
+
) -> str:
|
|
57
|
+
"""Add a new agent to the pool.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
name: Name for the new agent
|
|
61
|
+
system_prompt: System prompt defining agent's role/behavior
|
|
62
|
+
model: Optional model override (uses default if not specified)
|
|
63
|
+
tools: Imort paths of the tools the agent should have, if any.
|
|
64
|
+
session: Session ID to recover conversation state from
|
|
65
|
+
output_type: Name of response type from manifest (for structured output)
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Confirmation message about the created agent
|
|
69
|
+
"""
|
|
70
|
+
assert ctx.pool, "No agent pool available"
|
|
71
|
+
try:
|
|
72
|
+
agent: Agent[Any, Any] = await ctx.pool.add_agent(
|
|
73
|
+
name=name,
|
|
74
|
+
system_prompt=system_prompt,
|
|
75
|
+
model=model,
|
|
76
|
+
tools=tools,
|
|
77
|
+
output_type=to_type(output_type, responses=ctx.pool.manifest.responses),
|
|
78
|
+
session=session,
|
|
79
|
+
)
|
|
80
|
+
except ValueError as e: # for wrong tool imports
|
|
81
|
+
raise ModelRetry(message=f"Error creating agent: {e}") from None
|
|
82
|
+
return f"Created agent **{agent.name}** using model **{agent.model_name}**"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
async def add_team( # noqa: D417
|
|
86
|
+
ctx: AgentContext,
|
|
87
|
+
nodes: list[str],
|
|
88
|
+
mode: Literal["sequential", "parallel"] = "sequential",
|
|
89
|
+
name: str | None = None,
|
|
90
|
+
) -> str:
|
|
91
|
+
"""Create a team from existing agents.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
nodes: Names of agents / sub-teams to include in team
|
|
95
|
+
mode: How the team should operate:
|
|
96
|
+
- sequential: Agents process in sequence (pipeline)
|
|
97
|
+
- parallel: Agents process simultaneously
|
|
98
|
+
name: Optional name for the team
|
|
99
|
+
"""
|
|
100
|
+
if not ctx.pool:
|
|
101
|
+
msg = "No agent pool available"
|
|
102
|
+
raise ToolError(msg)
|
|
103
|
+
|
|
104
|
+
# Verify all agents exist
|
|
105
|
+
for node_name in nodes:
|
|
106
|
+
if node_name not in ctx.pool.nodes:
|
|
107
|
+
msg = (
|
|
108
|
+
f"No agent or team found with name: {node_name}. "
|
|
109
|
+
f"Available nodes: {', '.join(ctx.pool.nodes.keys())}"
|
|
110
|
+
)
|
|
111
|
+
raise ModelRetry(msg)
|
|
112
|
+
if mode == "sequential":
|
|
113
|
+
ctx.pool.create_team_run(nodes, name=name)
|
|
114
|
+
else:
|
|
115
|
+
ctx.pool.create_team(nodes, name=name)
|
|
116
|
+
mode_str = "pipeline" if mode == "sequential" else "parallel"
|
|
117
|
+
return f"Created **{mode_str}** team with nodes: **{', '.join(nodes)}**"
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
async def connect_nodes( # noqa: D417
|
|
121
|
+
ctx: AgentContext,
|
|
122
|
+
source: str,
|
|
123
|
+
target: str,
|
|
124
|
+
*,
|
|
125
|
+
connection_type: Literal["run", "context", "forward"] = "run",
|
|
126
|
+
priority: int = 0,
|
|
127
|
+
delay_seconds: float | None = None,
|
|
128
|
+
queued: bool = False,
|
|
129
|
+
queue_strategy: Literal["concat", "latest", "buffer"] = "latest",
|
|
130
|
+
wait_for_completion: bool = True,
|
|
131
|
+
name: str | None = None,
|
|
132
|
+
) -> str:
|
|
133
|
+
"""Connect two nodes to enable message flow between them.
|
|
134
|
+
|
|
135
|
+
Nodes can be agents or teams.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
source: Name of the source node
|
|
139
|
+
target: Name of the target node
|
|
140
|
+
connection_type: How messages should be handled:
|
|
141
|
+
- run: Execute message as a new run in target
|
|
142
|
+
- context: Add message as context to target
|
|
143
|
+
- forward: Forward message to target's outbox
|
|
144
|
+
priority: Task priority (lower = higher priority)
|
|
145
|
+
delay_seconds: Optional delay before processing messages
|
|
146
|
+
queued: Whether messages should be queued for manual processing
|
|
147
|
+
queue_strategy: How to process queued messages:
|
|
148
|
+
- concat: Combine all messages with newlines
|
|
149
|
+
- latest: Use only the most recent message
|
|
150
|
+
- buffer: Process all messages individually
|
|
151
|
+
wait_for_completion: Whether to wait for target to complete
|
|
152
|
+
name: Optional name for this connection
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Description of the created connection
|
|
156
|
+
"""
|
|
157
|
+
if not ctx.pool:
|
|
158
|
+
msg = "No agent pool available"
|
|
159
|
+
raise ToolError(msg)
|
|
160
|
+
|
|
161
|
+
# Get the nodes
|
|
162
|
+
if source not in ctx.pool.nodes:
|
|
163
|
+
msg = (
|
|
164
|
+
f"No agent or team found with name: {source}. "
|
|
165
|
+
f"Available nodes: {', '.join(ctx.pool.nodes.keys())}"
|
|
166
|
+
)
|
|
167
|
+
raise ModelRetry(msg)
|
|
168
|
+
if target not in ctx.pool.nodes:
|
|
169
|
+
msg = (
|
|
170
|
+
f"No agent or team found with name: {target}. "
|
|
171
|
+
f"Available nodes: {', '.join(ctx.pool.nodes.keys())}"
|
|
172
|
+
)
|
|
173
|
+
raise ModelRetry(msg)
|
|
174
|
+
|
|
175
|
+
source_node = ctx.pool.nodes[source]
|
|
176
|
+
target_node = ctx.pool.nodes[target]
|
|
177
|
+
|
|
178
|
+
# Create the connection
|
|
179
|
+
delay = timedelta(seconds=delay_seconds) if delay_seconds is not None else None
|
|
180
|
+
_talk = source_node.connect_to(
|
|
181
|
+
target_node,
|
|
182
|
+
connection_type=connection_type,
|
|
183
|
+
priority=priority,
|
|
184
|
+
delay=delay,
|
|
185
|
+
queued=queued,
|
|
186
|
+
queue_strategy=queue_strategy,
|
|
187
|
+
name=name,
|
|
188
|
+
)
|
|
189
|
+
source_node.connections.set_wait_state(target_node, wait=wait_for_completion)
|
|
190
|
+
|
|
191
|
+
return (
|
|
192
|
+
f"Created connection from **{source}** to **{target}** "
|
|
193
|
+
f"*(type={connection_type}, queued={queued}, "
|
|
194
|
+
f"strategy={queue_strategy if queued else 'n/a'})*"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class AgentManagementTools(StaticResourceProvider):
|
|
199
|
+
"""Provider for agent pool building tools."""
|
|
200
|
+
|
|
201
|
+
def __init__(self, name: str = "agent_management") -> None:
|
|
202
|
+
super().__init__(name=name)
|
|
203
|
+
for tool in [
|
|
204
|
+
self.create_tool(create_worker_agent, category="other", destructive=False),
|
|
205
|
+
self.create_tool(add_agent, category="other", destructive=False),
|
|
206
|
+
self.create_tool(add_team, category="other", destructive=False),
|
|
207
|
+
self.create_tool(connect_nodes, category="other", destructive=False),
|
|
208
|
+
]:
|
|
209
|
+
self.add_tool(tool)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
if __name__ == "__main__":
|
|
213
|
+
# import logging
|
|
214
|
+
from agentpool import AgentPool
|
|
215
|
+
|
|
216
|
+
user_prompt = """Add a stdio MCP server:
|
|
217
|
+
// "command": "npx",
|
|
218
|
+
// "args": ["mcp-graphql"],
|
|
219
|
+
// "env": { "ENDPOINT": "https://diego.one/graphql" }
|
|
220
|
+
|
|
221
|
+
."""
|
|
222
|
+
|
|
223
|
+
async def main() -> None:
|
|
224
|
+
from agentpool_config.toolsets import IntegrationToolsetConfig
|
|
225
|
+
|
|
226
|
+
async with AgentPool() as pool:
|
|
227
|
+
toolsets = [IntegrationToolsetConfig()]
|
|
228
|
+
toolset_providers = [config.get_provider() for config in toolsets]
|
|
229
|
+
agent = await pool.add_agent(
|
|
230
|
+
"X",
|
|
231
|
+
toolsets=toolset_providers,
|
|
232
|
+
model="openai:gpt-5-nano",
|
|
233
|
+
)
|
|
234
|
+
result = await agent.run(user_prompt)
|
|
235
|
+
print(result)
|
|
236
|
+
result = await agent.run("Which tools does it have?")
|
|
237
|
+
print(result)
|
|
238
|
+
|
|
239
|
+
anyio.run(main)
|