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,250 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Literal, assert_never, overload
|
|
4
|
+
|
|
5
|
+
from upathtools import AsyncUPath, UnionFileSystem, list_files, read_folder, read_path
|
|
6
|
+
|
|
7
|
+
from agentpool.log import get_logger
|
|
8
|
+
from agentpool.utils.baseregistry import AgentPoolError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from collections.abc import Iterator
|
|
13
|
+
|
|
14
|
+
from fsspec import AbstractFileSystem
|
|
15
|
+
from upathtools import AsyncUPath, UPath
|
|
16
|
+
|
|
17
|
+
from agentpool.models.manifest import ResourceConfig
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
logger = get_logger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class VFSRegistry:
|
|
24
|
+
"""Registry for virtual filesystems built on UnionFileSystem."""
|
|
25
|
+
|
|
26
|
+
def __init__(self) -> None:
|
|
27
|
+
"""Initialize empty VFS registry."""
|
|
28
|
+
self._union_fs = UnionFileSystem({})
|
|
29
|
+
logger.debug("Initialized VFS registry")
|
|
30
|
+
|
|
31
|
+
def __contains__(self, name: str) -> bool:
|
|
32
|
+
"""Check if a resource is registered."""
|
|
33
|
+
return name in self._union_fs.filesystems
|
|
34
|
+
|
|
35
|
+
def __len__(self) -> int:
|
|
36
|
+
"""Get number of registered resources."""
|
|
37
|
+
return len(self._union_fs.filesystems)
|
|
38
|
+
|
|
39
|
+
def __iter__(self) -> Iterator[str]:
|
|
40
|
+
"""Iterate over registered resource names."""
|
|
41
|
+
return iter(self._union_fs.filesystems)
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def is_empty(self) -> bool:
|
|
45
|
+
"""Check if registry has any resources."""
|
|
46
|
+
return len(self._union_fs.filesystems) == 0
|
|
47
|
+
|
|
48
|
+
def register(self, name: str, fs: AbstractFileSystem | str, *, replace: bool = False) -> None:
|
|
49
|
+
"""Register a filesystem resource.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
name: Resource name to use as mount point
|
|
53
|
+
fs: Filesystem instance or URI string
|
|
54
|
+
replace: Whether to replace existing resource
|
|
55
|
+
|
|
56
|
+
Raises:
|
|
57
|
+
ValueError: If resource exists and replace=False
|
|
58
|
+
"""
|
|
59
|
+
logger.debug("Registering resource", name=name, type=type(fs).__name__)
|
|
60
|
+
try:
|
|
61
|
+
self._union_fs.register(name, fs, replace=replace)
|
|
62
|
+
except ValueError as e:
|
|
63
|
+
raise AgentPoolError(str(e)) from e
|
|
64
|
+
|
|
65
|
+
def unregister(self, name: str) -> None:
|
|
66
|
+
"""Unregister a filesystem resource.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
name: Resource name to remove
|
|
70
|
+
|
|
71
|
+
Raises:
|
|
72
|
+
AgentPoolError: If resource doesn't exist
|
|
73
|
+
"""
|
|
74
|
+
logger.debug("Unregistering resource", name=name)
|
|
75
|
+
try:
|
|
76
|
+
self._union_fs.unregister(name)
|
|
77
|
+
except ValueError as e:
|
|
78
|
+
raise AgentPoolError(str(e)) from e
|
|
79
|
+
|
|
80
|
+
def register_from_config(self, name: str, config: ResourceConfig) -> AbstractFileSystem:
|
|
81
|
+
"""Register a resource from configuration.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
name: Resource name
|
|
85
|
+
config: Resource configuration
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
The registered filesystem instance
|
|
89
|
+
"""
|
|
90
|
+
from upathtools.configs.base import FileSystemConfig, URIFileSystemConfig
|
|
91
|
+
|
|
92
|
+
match config:
|
|
93
|
+
case str() as uri:
|
|
94
|
+
fs_config = URIFileSystemConfig(uri=uri)
|
|
95
|
+
fs = fs_config.create_fs()
|
|
96
|
+
case FileSystemConfig():
|
|
97
|
+
fs = config.create_fs()
|
|
98
|
+
case _ as unreachable:
|
|
99
|
+
assert_never(unreachable)
|
|
100
|
+
|
|
101
|
+
self.register(name, fs)
|
|
102
|
+
return fs
|
|
103
|
+
|
|
104
|
+
def list_resources(self) -> list[str]:
|
|
105
|
+
"""List all registered resource names."""
|
|
106
|
+
return self._union_fs.list_mount_points()
|
|
107
|
+
|
|
108
|
+
def get_fs(self) -> UnionFileSystem:
|
|
109
|
+
"""Get unified filesystem view of all resources."""
|
|
110
|
+
return self._union_fs
|
|
111
|
+
|
|
112
|
+
@overload
|
|
113
|
+
def get_upath(
|
|
114
|
+
self, resource_name: str | None = None, *, as_async: Literal[True]
|
|
115
|
+
) -> AsyncUPath: ...
|
|
116
|
+
|
|
117
|
+
@overload
|
|
118
|
+
def get_upath(
|
|
119
|
+
self, resource_name: str | None = None, *, as_async: Literal[False] = False
|
|
120
|
+
) -> UPath: ...
|
|
121
|
+
|
|
122
|
+
@overload
|
|
123
|
+
def get_upath(
|
|
124
|
+
self, resource_name: str | None = None, *, as_async: bool = False
|
|
125
|
+
) -> UPath | AsyncUPath: ...
|
|
126
|
+
|
|
127
|
+
def get_upath(
|
|
128
|
+
self, resource_name: str | None = None, *, as_async: bool = False
|
|
129
|
+
) -> UPath | AsyncUPath:
|
|
130
|
+
"""Get a UPath object for accessing resources.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
resource_name: Specific resource or None for unified view
|
|
134
|
+
as_async: Whether to return AsyncUPath
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
UPath or AsyncUPath instance
|
|
138
|
+
"""
|
|
139
|
+
if resource_name is not None and resource_name not in self._union_fs.filesystems:
|
|
140
|
+
msg = f"Resource not found: {resource_name}"
|
|
141
|
+
raise AgentPoolError(msg)
|
|
142
|
+
|
|
143
|
+
return self._union_fs.get_upath(resource_name, as_async=as_async)
|
|
144
|
+
|
|
145
|
+
async def get_content(
|
|
146
|
+
self,
|
|
147
|
+
path: str,
|
|
148
|
+
encoding: str = "utf-8",
|
|
149
|
+
recursive: bool = True,
|
|
150
|
+
exclude: list[str] | None = None,
|
|
151
|
+
max_depth: int | None = None,
|
|
152
|
+
) -> str:
|
|
153
|
+
"""Get content from a resource as text.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
path: Path to read, either:
|
|
157
|
+
- resource (whole resource)
|
|
158
|
+
- resource/file.txt (single file)
|
|
159
|
+
- resource/folder (directory)
|
|
160
|
+
encoding: Text encoding for binary content
|
|
161
|
+
recursive: For directories, whether to read recursively
|
|
162
|
+
exclude: For directories, patterns to exclude
|
|
163
|
+
max_depth: For directories, maximum depth to read
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
For files: file content
|
|
167
|
+
For directories: concatenated content of all files
|
|
168
|
+
"""
|
|
169
|
+
# Normalize path - ensure it has resource prefix
|
|
170
|
+
if "/" not in path:
|
|
171
|
+
path = f"{path}/"
|
|
172
|
+
|
|
173
|
+
if await self._union_fs._isdir(path):
|
|
174
|
+
content_dict = await read_folder(
|
|
175
|
+
self._union_fs.get_upath(path),
|
|
176
|
+
encoding=encoding,
|
|
177
|
+
recursive=recursive,
|
|
178
|
+
exclude=exclude,
|
|
179
|
+
max_depth=max_depth,
|
|
180
|
+
)
|
|
181
|
+
# Combine all files with headers
|
|
182
|
+
sections = []
|
|
183
|
+
for rel_path, content in sorted(content_dict.items()):
|
|
184
|
+
sections.extend([f"--- {rel_path} ---", content, ""])
|
|
185
|
+
return "\n".join(sections)
|
|
186
|
+
|
|
187
|
+
return await read_path(self._union_fs.get_upath(path), encoding=encoding)
|
|
188
|
+
|
|
189
|
+
async def query(
|
|
190
|
+
self,
|
|
191
|
+
path: str,
|
|
192
|
+
pattern: str = "**/*",
|
|
193
|
+
*,
|
|
194
|
+
recursive: bool = True,
|
|
195
|
+
include_dirs: bool = False,
|
|
196
|
+
exclude: list[str] | None = None,
|
|
197
|
+
max_depth: int | None = None,
|
|
198
|
+
) -> list[str]:
|
|
199
|
+
"""Query contents of a resource or subfolder.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
path: Path to query, either:
|
|
203
|
+
- resource (queries whole resource)
|
|
204
|
+
- resource/subfolder (queries specific folder)
|
|
205
|
+
pattern: Glob pattern to match files against
|
|
206
|
+
recursive: Whether to search subdirectories
|
|
207
|
+
include_dirs: Whether to include directories in results
|
|
208
|
+
exclude: List of patterns to exclude
|
|
209
|
+
max_depth: Maximum directory depth for recursive search
|
|
210
|
+
|
|
211
|
+
Example:
|
|
212
|
+
# Query whole resource
|
|
213
|
+
files = await registry.query("docs")
|
|
214
|
+
|
|
215
|
+
# Query specific subfolder
|
|
216
|
+
files = await registry.query("docs/guides", pattern="*.md")
|
|
217
|
+
"""
|
|
218
|
+
# Normalize path - ensure it has resource prefix
|
|
219
|
+
if "/" not in path:
|
|
220
|
+
path = f"{path}/"
|
|
221
|
+
|
|
222
|
+
resource = path.split("/")[0]
|
|
223
|
+
if resource not in self:
|
|
224
|
+
msg = f"Resource not found: {resource}"
|
|
225
|
+
raise AgentPoolError(msg)
|
|
226
|
+
|
|
227
|
+
files = await list_files(
|
|
228
|
+
self._union_fs.get_upath(path),
|
|
229
|
+
pattern=pattern,
|
|
230
|
+
recursive=recursive,
|
|
231
|
+
include_dirs=include_dirs,
|
|
232
|
+
exclude=exclude,
|
|
233
|
+
max_depth=max_depth,
|
|
234
|
+
)
|
|
235
|
+
return [str(p) for p in files]
|
|
236
|
+
|
|
237
|
+
def reset(self) -> None:
|
|
238
|
+
"""Reset registry to empty state."""
|
|
239
|
+
logger.debug("Resetting VFS registry")
|
|
240
|
+
self._union_fs = UnionFileSystem({})
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
if __name__ == "__main__":
|
|
244
|
+
from fsspec.implementations.memory import MemoryFileSystem
|
|
245
|
+
|
|
246
|
+
registry = VFSRegistry()
|
|
247
|
+
fs1 = MemoryFileSystem()
|
|
248
|
+
registry.register("test", fs1)
|
|
249
|
+
union = registry.get_fs()
|
|
250
|
+
print(union.ls(""))
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentpool
|
|
3
|
+
Version: 2.1.9
|
|
4
|
+
Summary: Pydantic-AI based Multi-Agent Framework with YAML-based Agents, Teams, Workflows & Extended ACP / AGUI integration
|
|
5
|
+
Keywords:
|
|
6
|
+
Author: Philipp Temminghoff
|
|
7
|
+
Author-email: Philipp Temminghoff <philipptemminghoff@googlemail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Framework :: Pydantic
|
|
12
|
+
Classifier: Framework :: Pydantic :: 2
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Topic :: Documentation
|
|
21
|
+
Classifier: Topic :: Internet
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Software Development
|
|
24
|
+
Classifier: Topic :: Utilities
|
|
25
|
+
Classifier: Typing :: Typed
|
|
26
|
+
Requires-Dist: anyenv[httpx]>=0.3.0
|
|
27
|
+
Requires-Dist: docler>=1.0.3
|
|
28
|
+
Requires-Dist: docstring-parser>=0.17.0
|
|
29
|
+
Requires-Dist: epregistry
|
|
30
|
+
Requires-Dist: evented>=1.0.5
|
|
31
|
+
Requires-Dist: exxec>=0.1.0
|
|
32
|
+
Requires-Dist: fastmcp>=2.12.4
|
|
33
|
+
Requires-Dist: fsspec
|
|
34
|
+
Requires-Dist: httpx
|
|
35
|
+
Requires-Dist: jinja2
|
|
36
|
+
Requires-Dist: jinjarope
|
|
37
|
+
Requires-Dist: llmling-models>=1.4.1
|
|
38
|
+
Requires-Dist: logfire
|
|
39
|
+
Requires-Dist: mcp>=1.2.0
|
|
40
|
+
Requires-Dist: platformdirs
|
|
41
|
+
Requires-Dist: promptantic>=0.4.5
|
|
42
|
+
Requires-Dist: psygnal>=0.11.1
|
|
43
|
+
Requires-Dist: pydantic>=2.10.0
|
|
44
|
+
Requires-Dist: pydantic-ai-slim>=1.0.0
|
|
45
|
+
Requires-Dist: pydocket==0.16.1
|
|
46
|
+
Requires-Dist: python-dotenv>=1.0.1
|
|
47
|
+
Requires-Dist: rich
|
|
48
|
+
Requires-Dist: schemez[codegen]
|
|
49
|
+
Requires-Dist: searchly[all]>=2.0.1
|
|
50
|
+
Requires-Dist: slashed>=0.1.0
|
|
51
|
+
Requires-Dist: sqlalchemy[aiosqlite]
|
|
52
|
+
Requires-Dist: sqlmodel>=0.0.22
|
|
53
|
+
Requires-Dist: structlog>=25.5.0
|
|
54
|
+
Requires-Dist: tokonomics>=0.1.2
|
|
55
|
+
Requires-Dist: toprompt>=0.0.1
|
|
56
|
+
Requires-Dist: typer
|
|
57
|
+
Requires-Dist: upathtools>=0.1.0
|
|
58
|
+
Requires-Dist: yamling>=2.0.2
|
|
59
|
+
Requires-Dist: fasta2a ; extra == 'a2a'
|
|
60
|
+
Requires-Dist: starlette ; extra == 'a2a'
|
|
61
|
+
Requires-Dist: ag-ui-protocol>=0.1.10 ; extra == 'ag-ui'
|
|
62
|
+
Requires-Dist: braintrust ; extra == 'braintrust'
|
|
63
|
+
Requires-Dist: autoevals ; extra == 'braintrust'
|
|
64
|
+
Requires-Dist: claude-agent-sdk>=0.1.18 ; extra == 'claude'
|
|
65
|
+
Requires-Dist: clipman ; extra == 'clipboard'
|
|
66
|
+
Requires-Dist: rustworkx>=0.17.1 ; extra == 'coding'
|
|
67
|
+
Requires-Dist: grep-ast ; extra == 'coding'
|
|
68
|
+
Requires-Dist: ast-grep-py>=0.40.0 ; extra == 'coding'
|
|
69
|
+
Requires-Dist: tree-sitter>=0.25.2 ; extra == 'coding'
|
|
70
|
+
Requires-Dist: tree-sitter-python>=0.25.0 ; extra == 'coding'
|
|
71
|
+
Requires-Dist: tree-sitter-c>=0.24.1 ; extra == 'coding'
|
|
72
|
+
Requires-Dist: tree-sitter-javascript>=0.25.0 ; extra == 'coding'
|
|
73
|
+
Requires-Dist: tree-sitter>=0.25.2 ; extra == 'coding'
|
|
74
|
+
Requires-Dist: tree-sitter-typescript>=0.23.0 ; extra == 'coding'
|
|
75
|
+
Requires-Dist: tree-sitter-cpp>=0.23.0 ; extra == 'coding'
|
|
76
|
+
Requires-Dist: tree-sitter-rust>=0.23.0 ; extra == 'coding'
|
|
77
|
+
Requires-Dist: tree-sitter-go>=0.23.0 ; extra == 'coding'
|
|
78
|
+
Requires-Dist: tree-sitter-json>=0.24.0 ; extra == 'coding'
|
|
79
|
+
Requires-Dist: tree-sitter-yaml>=0.6.0 ; extra == 'coding'
|
|
80
|
+
Requires-Dist: composio ; extra == 'composio'
|
|
81
|
+
Requires-Dist: pydantic-ai-slim[openai,google,anthropic,mistral,retries]>=1.0.0 ; extra == 'default'
|
|
82
|
+
Requires-Dist: evented[all] ; extra == 'events'
|
|
83
|
+
Requires-Dist: fsspec[git] ; extra == 'git'
|
|
84
|
+
Requires-Dist: langfuse ; extra == 'langfuse'
|
|
85
|
+
Requires-Dist: markitdown ; python_full_version < '3.14' and extra == 'markitdown'
|
|
86
|
+
Requires-Dist: mcpx-py>=0.7.0 ; extra == 'mcp-run'
|
|
87
|
+
Requires-Dist: typeagent>=0.3.3 ; extra == 'memory'
|
|
88
|
+
Requires-Dist: apprise>=1.9.5 ; extra == 'notifications'
|
|
89
|
+
Requires-Dist: keyring>=25.6.0 ; extra == 'oauth'
|
|
90
|
+
Requires-Dist: promptlayer ; extra == 'promptlayer'
|
|
91
|
+
Requires-Dist: logfire[fastapi] ; extra == 'server'
|
|
92
|
+
Requires-Dist: fastapi ; extra == 'server'
|
|
93
|
+
Requires-Dist: uvicorn[standard] ; extra == 'server'
|
|
94
|
+
Requires-Dist: textual>=1.0.0 ; extra == 'textual'
|
|
95
|
+
Requires-Dist: tiktoken ; extra == 'tiktoken'
|
|
96
|
+
Requires-Dist: anyvoice[tts-edge,openai]>=0.0.2 ; extra == 'tts'
|
|
97
|
+
Requires-Python: >=3.13
|
|
98
|
+
Project-URL: Code coverage, https://app.codecov.io/gh/phil65/agentpool
|
|
99
|
+
Project-URL: Discussions, https://github.com/phil65/agentpool/discussions
|
|
100
|
+
Project-URL: Documentation, https://phil65.github.io/agentpool/
|
|
101
|
+
Project-URL: Issues, https://github.com/phil65/agentpool/issues
|
|
102
|
+
Project-URL: Source, https://github.com/phil65/agentpool
|
|
103
|
+
Provides-Extra: a2a
|
|
104
|
+
Provides-Extra: ag-ui
|
|
105
|
+
Provides-Extra: braintrust
|
|
106
|
+
Provides-Extra: claude
|
|
107
|
+
Provides-Extra: clipboard
|
|
108
|
+
Provides-Extra: coding
|
|
109
|
+
Provides-Extra: composio
|
|
110
|
+
Provides-Extra: default
|
|
111
|
+
Provides-Extra: events
|
|
112
|
+
Provides-Extra: git
|
|
113
|
+
Provides-Extra: langfuse
|
|
114
|
+
Provides-Extra: markitdown
|
|
115
|
+
Provides-Extra: mcp-run
|
|
116
|
+
Provides-Extra: memory
|
|
117
|
+
Provides-Extra: notifications
|
|
118
|
+
Provides-Extra: oauth
|
|
119
|
+
Provides-Extra: promptlayer
|
|
120
|
+
Provides-Extra: server
|
|
121
|
+
Provides-Extra: textual
|
|
122
|
+
Provides-Extra: tiktoken
|
|
123
|
+
Provides-Extra: tts
|
|
124
|
+
Description-Content-Type: text/markdown
|
|
125
|
+
|
|
126
|
+
# AgentPool
|
|
127
|
+
|
|
128
|
+
[](https://pypi.org/project/agentpool/)
|
|
129
|
+
[](https://pypi.org/project/agentpool/)
|
|
130
|
+
[](https://pypi.org/project/agentpool/)
|
|
131
|
+
[](https://pypi.org/project/agentpool/)
|
|
132
|
+
[](https://github.com/phil65/agentpool/stars)
|
|
133
|
+
|
|
134
|
+
**A unified agent orchestration hub that lets you configure and manage heterogeneous AI agents via YAML and expose them through standardized protocols.**
|
|
135
|
+
|
|
136
|
+
[Documentation](https://phil65.github.io/agentpool/)
|
|
137
|
+
|
|
138
|
+
## The Problem
|
|
139
|
+
|
|
140
|
+
You want to use multiple AI agents together - Claude Code for refactoring, a custom analysis agent, maybe Goose for specific tasks. But each has different APIs, protocols, and integration patterns. Coordinating them means writing glue code for each combination.
|
|
141
|
+
|
|
142
|
+
## The Solution
|
|
143
|
+
|
|
144
|
+
AgentPool acts as a protocol bridge. Define all your agents in one YAML file - whether they're native (PydanticAI-based), external ACP agents (Claude Code, Codex, Goose), or AG-UI agents. Then expose them all through ACP or AG-UI protocols, letting them cooperate, delegate, and communicate through a unified interface.
|
|
145
|
+
|
|
146
|
+
```mermaid
|
|
147
|
+
flowchart TB
|
|
148
|
+
subgraph AgentPool
|
|
149
|
+
subgraph config[YAML Configuration]
|
|
150
|
+
native[Native Agents<br/>PydanticAI]
|
|
151
|
+
acp_agents[ACP Agents<br/>Claude Code, Goose, Codex]
|
|
152
|
+
agui_agents[AG-UI Agents]
|
|
153
|
+
workflows[Teams & Workflows]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
subgraph interface[Unified Agent Interface]
|
|
157
|
+
delegation[Inter-agent delegation]
|
|
158
|
+
routing[Message routing]
|
|
159
|
+
context[Shared context]
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
config --> interface
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
interface --> acp_server[ACP Server]
|
|
166
|
+
interface --> agui_server[AG-UI Server]
|
|
167
|
+
|
|
168
|
+
acp_server --> clients1[Zed, Toad, ACP Clients]
|
|
169
|
+
agui_server --> clients2[AG-UI Clients]
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Quick Start
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
uv tool install agentpool[default]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Minimal Configuration
|
|
179
|
+
|
|
180
|
+
```yaml
|
|
181
|
+
# agents.yml
|
|
182
|
+
agents:
|
|
183
|
+
assistant:
|
|
184
|
+
type: native
|
|
185
|
+
model: openai:gpt-4o
|
|
186
|
+
system_prompt: "You are a helpful assistant."
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# Run via CLI
|
|
191
|
+
agentpool run assistant "Hello!"
|
|
192
|
+
|
|
193
|
+
# Or start as ACP server (for Zed, Toad, etc.)
|
|
194
|
+
agentpool serve-acp agents.yml
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Integrating External Agents
|
|
198
|
+
|
|
199
|
+
The real power comes from mixing agent types:
|
|
200
|
+
|
|
201
|
+
```yaml
|
|
202
|
+
agents:
|
|
203
|
+
# Native PydanticAI-based agent
|
|
204
|
+
coordinator:
|
|
205
|
+
type: native
|
|
206
|
+
model: openai:gpt-4o
|
|
207
|
+
toolsets:
|
|
208
|
+
- type: subagent # Can delegate to all other agents
|
|
209
|
+
system_prompt: "Coordinate tasks between available agents."
|
|
210
|
+
|
|
211
|
+
# Claude Code agent (direct integration)
|
|
212
|
+
claude:
|
|
213
|
+
type: claude
|
|
214
|
+
description: "Claude Code for complex refactoring"
|
|
215
|
+
|
|
216
|
+
# ACP protocol agents
|
|
217
|
+
goose:
|
|
218
|
+
type: acp
|
|
219
|
+
provider: goose
|
|
220
|
+
description: "Goose for file operations"
|
|
221
|
+
|
|
222
|
+
codex:
|
|
223
|
+
type: acp
|
|
224
|
+
provider: codex
|
|
225
|
+
description: "OpenAI Codex agent"
|
|
226
|
+
|
|
227
|
+
# AG-UI protocol agent
|
|
228
|
+
agui_agent:
|
|
229
|
+
type: agui
|
|
230
|
+
url: "http://localhost:8000"
|
|
231
|
+
description: "Custom AG-UI agent"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Now `coordinator` can delegate work to any of these agents, and all are accessible through the same interface.
|
|
235
|
+
|
|
236
|
+
## Key Features
|
|
237
|
+
|
|
238
|
+
### Multi-Agent Coordination
|
|
239
|
+
|
|
240
|
+
Agents can form teams (parallel) or chains (sequential):
|
|
241
|
+
|
|
242
|
+
```yaml
|
|
243
|
+
teams:
|
|
244
|
+
review_pipeline:
|
|
245
|
+
mode: sequential
|
|
246
|
+
members: [analyzer, reviewer, formatter]
|
|
247
|
+
|
|
248
|
+
parallel_coders:
|
|
249
|
+
mode: parallel
|
|
250
|
+
members: [claude, goose]
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
```python
|
|
254
|
+
async with AgentPool("agents.yml") as pool:
|
|
255
|
+
# Parallel execution
|
|
256
|
+
team = pool.get_agent("analyzer") & pool.get_agent("reviewer")
|
|
257
|
+
results = await team.run("Review this code")
|
|
258
|
+
|
|
259
|
+
# Sequential pipeline
|
|
260
|
+
chain = analyzer | reviewer | formatter
|
|
261
|
+
result = await chain.run("Process this")
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Rich YAML Configuration
|
|
265
|
+
|
|
266
|
+
Everything is configurable - models, tools, connections, triggers, storage:
|
|
267
|
+
|
|
268
|
+
```yaml
|
|
269
|
+
agents:
|
|
270
|
+
analyzer:
|
|
271
|
+
type: native
|
|
272
|
+
model:
|
|
273
|
+
type: fallback
|
|
274
|
+
models: [openai:gpt-4o, anthropic:claude-sonnet-4-0]
|
|
275
|
+
toolsets:
|
|
276
|
+
- type: subagent
|
|
277
|
+
- type: resource_access
|
|
278
|
+
mcp_servers:
|
|
279
|
+
- "uvx mcp-server-filesystem"
|
|
280
|
+
knowledge:
|
|
281
|
+
paths: ["docs/**/*.md"]
|
|
282
|
+
connections:
|
|
283
|
+
- type: node
|
|
284
|
+
name: reporter
|
|
285
|
+
filter_condition:
|
|
286
|
+
type: word_match
|
|
287
|
+
words: [error, warning]
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Protocol Support
|
|
291
|
+
|
|
292
|
+
- **MCP**: Full support including elicitation, sampling, progress reporting
|
|
293
|
+
- **ACP**: Serve agents to Zed, Toad, and other ACP clients
|
|
294
|
+
- **AG-UI**: Expose agents through AG-UI protocol
|
|
295
|
+
|
|
296
|
+
### Additional Capabilities
|
|
297
|
+
|
|
298
|
+
- **Structured Output**: Define response schemas inline or import Python types
|
|
299
|
+
- **Storage & Analytics**: Track all interactions with configurable providers
|
|
300
|
+
- **File Abstraction**: UPath-backed operations work on local and remote sources
|
|
301
|
+
- **Triggers**: React to file changes, webhooks, or custom events
|
|
302
|
+
- **Streaming TTS**: Voice output support for all agents
|
|
303
|
+
|
|
304
|
+
## Usage Patterns
|
|
305
|
+
|
|
306
|
+
### CLI
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
agentpool run agent_name "prompt" # Single run
|
|
310
|
+
agentpool serve-acp config.yml # Start ACP server
|
|
311
|
+
agentpool watch --config agents.yml # React to triggers
|
|
312
|
+
agentpool history stats --group-by model # View analytics
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Programmatic
|
|
316
|
+
|
|
317
|
+
```python
|
|
318
|
+
from agentpool import AgentPool
|
|
319
|
+
|
|
320
|
+
async with AgentPool("agents.yml") as pool:
|
|
321
|
+
agent = pool.get_agent("assistant")
|
|
322
|
+
|
|
323
|
+
# Simple run
|
|
324
|
+
result = await agent.run("Hello")
|
|
325
|
+
|
|
326
|
+
# Streaming
|
|
327
|
+
async for event in agent.run_stream("Tell me a story"):
|
|
328
|
+
print(event)
|
|
329
|
+
|
|
330
|
+
# Multi-modal
|
|
331
|
+
result = await agent.run("Describe this", Path("image.jpg"))
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## Documentation
|
|
335
|
+
|
|
336
|
+
For complete documentation including advanced configuration, connection patterns, and API reference, visit [phil65.github.io/agentpool](https://phil65.github.io/agentpool/).
|