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,76 @@
|
|
|
1
|
+
"""Helper functions for common message processing logic."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from agentpool.messaging import ChatMessage
|
|
8
|
+
from agentpool.prompts.convert import convert_prompts
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from pydantic_ai import UserContent
|
|
13
|
+
|
|
14
|
+
from agentpool.common_types import PromptCompatible
|
|
15
|
+
from agentpool.messaging import MessageNode
|
|
16
|
+
from agentpool.messaging.connection_manager import ConnectionManager
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
async def prepare_prompts(
|
|
20
|
+
*prompt: PromptCompatible | ChatMessage[Any],
|
|
21
|
+
) -> tuple[ChatMessage[Any], list[UserContent], ChatMessage[Any] | None]:
|
|
22
|
+
"""Prepare prompts for processing.
|
|
23
|
+
|
|
24
|
+
Extracted from MessageNode.pre_run logic.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
*prompt: The prompt(s) to prepare.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
A tuple of:
|
|
31
|
+
- Either incoming message, or a constructed incoming message based
|
|
32
|
+
on the prompt(s).
|
|
33
|
+
- A list of prompts to be sent to the model.
|
|
34
|
+
- The original ChatMessage if forwarded, None otherwise
|
|
35
|
+
"""
|
|
36
|
+
if len(prompt) == 1 and isinstance(prompt[0], ChatMessage):
|
|
37
|
+
original_msg = prompt[0]
|
|
38
|
+
# Update received message's chain to show it came through its source
|
|
39
|
+
user_msg = original_msg.forwarded(original_msg).to_request()
|
|
40
|
+
prompts = await convert_prompts([user_msg.content])
|
|
41
|
+
# clear cost info to avoid double-counting
|
|
42
|
+
return user_msg, prompts, original_msg
|
|
43
|
+
prompts = await convert_prompts(prompt)
|
|
44
|
+
user_msg = ChatMessage.user_prompt(message=prompts)
|
|
45
|
+
return user_msg, prompts, None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def finalize_message(
|
|
49
|
+
message: ChatMessage[Any],
|
|
50
|
+
previous_message: ChatMessage[Any] | None,
|
|
51
|
+
node: MessageNode[Any, Any],
|
|
52
|
+
connections: ConnectionManager,
|
|
53
|
+
original_message: ChatMessage[Any] | None,
|
|
54
|
+
wait_for_connections: bool | None = None,
|
|
55
|
+
) -> ChatMessage[Any]:
|
|
56
|
+
"""Handle message finalization and routing.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
message: The response message to finalize
|
|
60
|
+
previous_message: The original user message (if any)
|
|
61
|
+
node: The message node that produced the message
|
|
62
|
+
connections: Connection manager for routing
|
|
63
|
+
original_message: The original ChatMessage if forwarded, None otherwise
|
|
64
|
+
wait_for_connections: Whether to wait for connected nodes
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
The finalized message
|
|
68
|
+
"""
|
|
69
|
+
# For chain processing, update the response's chain if input was forwarded
|
|
70
|
+
if original_message:
|
|
71
|
+
message = message.forwarded(original_message)
|
|
72
|
+
node.message_sent.emit(message) # Emit signals
|
|
73
|
+
await node.log_message(message) # Log message if enabled
|
|
74
|
+
# Route to connections
|
|
75
|
+
await connections.route_message(message, wait=wait_for_connections)
|
|
76
|
+
return message
|
agentpool/mime_utils.py
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Centralized MIME type utilities for agentpool.
|
|
2
|
+
|
|
3
|
+
Uses pydantic-ai's enhanced MimeTypes instance for better cross-platform
|
|
4
|
+
coverage of modern file types (.xlsx, .docx, .webp, .mkv, etc.).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pydantic_ai.messages import _mime_types
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# MIME type prefixes that are definitely binary (no need to probe content)
|
|
13
|
+
BINARY_MIME_PREFIXES = (
|
|
14
|
+
"image/",
|
|
15
|
+
"audio/",
|
|
16
|
+
"video/",
|
|
17
|
+
"application/octet-stream",
|
|
18
|
+
"application/zip",
|
|
19
|
+
"application/gzip",
|
|
20
|
+
"application/x-tar",
|
|
21
|
+
"application/pdf",
|
|
22
|
+
"application/x-executable",
|
|
23
|
+
"application/x-sharedlib",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
# MIME type prefixes that should be treated as text
|
|
27
|
+
TEXT_MIME_PREFIXES = (
|
|
28
|
+
"text/",
|
|
29
|
+
"application/json",
|
|
30
|
+
"application/xml",
|
|
31
|
+
"application/javascript",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# How many bytes to probe for binary detection
|
|
35
|
+
BINARY_PROBE_SIZE = 8192
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def guess_type(path: str) -> str | None:
|
|
39
|
+
"""Guess the MIME type of a file based on its path/extension.
|
|
40
|
+
|
|
41
|
+
Uses pydantic-ai's enhanced MimeTypes instance which has better
|
|
42
|
+
coverage for modern file types across platforms.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
path: File path or URL to guess type for
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
MIME type string or None if unknown
|
|
49
|
+
"""
|
|
50
|
+
mime_type, _ = _mime_types.guess_type(path)
|
|
51
|
+
return mime_type
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def is_binary_mime(mime_type: str | None) -> bool:
|
|
55
|
+
"""Check if MIME type is known to be binary (skip content probing).
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
mime_type: MIME type string or None
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
True if the MIME type is definitely binary
|
|
62
|
+
"""
|
|
63
|
+
if mime_type is None:
|
|
64
|
+
return False
|
|
65
|
+
return any(mime_type.startswith(prefix) for prefix in BINARY_MIME_PREFIXES)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def is_text_mime(mime_type: str | None) -> bool:
|
|
69
|
+
"""Check if a MIME type represents text content.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
mime_type: MIME type string or None
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
True if the MIME type is text-based (defaults to True for unknown)
|
|
76
|
+
"""
|
|
77
|
+
if mime_type is None:
|
|
78
|
+
return True # Default to text for unknown types
|
|
79
|
+
return any(mime_type.startswith(prefix) for prefix in TEXT_MIME_PREFIXES)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def is_binary_content(data: bytes) -> bool:
|
|
83
|
+
"""Detect binary content by probing for null bytes.
|
|
84
|
+
|
|
85
|
+
Uses the same heuristic as git: if the first ~8KB contains a null byte,
|
|
86
|
+
the content is considered binary.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
data: Raw bytes to check
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
True if content appears to be binary
|
|
93
|
+
"""
|
|
94
|
+
probe = data[:BINARY_PROBE_SIZE]
|
|
95
|
+
return b"\x00" in probe
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Core data models for AgentPool."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from agentpool.models.acp_agents import ACPAgentConfig, ACPAgentConfigTypes, BaseACPAgentConfig
|
|
6
|
+
from agentpool.models.agents import NativeAgentConfig
|
|
7
|
+
from agentpool.models.agui_agents import AGUIAgentConfig
|
|
8
|
+
from agentpool.models.claude_code_agents import ClaudeCodeAgentConfig
|
|
9
|
+
from agentpool.models.manifest import AgentsManifest, AnyAgentConfig
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"ACPAgentConfig",
|
|
14
|
+
"ACPAgentConfigTypes",
|
|
15
|
+
"AGUIAgentConfig",
|
|
16
|
+
"AgentsManifest",
|
|
17
|
+
"AnyAgentConfig",
|
|
18
|
+
"BaseACPAgentConfig",
|
|
19
|
+
"ClaudeCodeAgentConfig",
|
|
20
|
+
"NativeAgentConfig",
|
|
21
|
+
]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""ACP Agets."""
|
|
2
|
+
|
|
3
|
+
from typing import Annotated
|
|
4
|
+
from .non_mcp import RegularACPAgentConfigTypes
|
|
5
|
+
from .mcp_capable import MCPCapableACPAgentConfigTypes, MCPCapableACPAgentConfig
|
|
6
|
+
from .base import BaseACPAgentConfig, ACPAgentConfig
|
|
7
|
+
from pydantic import Field
|
|
8
|
+
|
|
9
|
+
# Union of all ACP agent config types (discriminated by 'provider')
|
|
10
|
+
ACPAgentConfigTypes = Annotated[
|
|
11
|
+
ACPAgentConfig | RegularACPAgentConfigTypes | MCPCapableACPAgentConfigTypes,
|
|
12
|
+
Field(discriminator="provider"),
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"ACPAgentConfig",
|
|
17
|
+
"ACPAgentConfigTypes",
|
|
18
|
+
"BaseACPAgentConfig",
|
|
19
|
+
"MCPCapableACPAgentConfig",
|
|
20
|
+
"MCPCapableACPAgentConfigTypes",
|
|
21
|
+
"RegularACPAgentConfigTypes",
|
|
22
|
+
]
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"""Configuration models for ACP (Agent Client Protocol) agents."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence # noqa: TC003
|
|
6
|
+
import os
|
|
7
|
+
import tempfile
|
|
8
|
+
from typing import TYPE_CHECKING, Annotated, Any, Literal
|
|
9
|
+
|
|
10
|
+
from exxec import ExecutionEnvironmentStr, get_environment # noqa: TC002
|
|
11
|
+
from exxec.configs import (
|
|
12
|
+
E2bExecutionEnvironmentConfig,
|
|
13
|
+
ExecutionEnvironmentConfig, # noqa: TC002
|
|
14
|
+
)
|
|
15
|
+
from pydantic import ConfigDict, Field
|
|
16
|
+
from tokonomics.model_discovery import ProviderType # noqa: TC002
|
|
17
|
+
|
|
18
|
+
from agentpool_config.nodes import NodeConfig
|
|
19
|
+
from agentpool_config.system_prompts import PromptConfig # noqa: TC001
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from exxec import ExecutionEnvironment
|
|
24
|
+
|
|
25
|
+
from agentpool.prompts.manager import PromptManager
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class BaseACPAgentConfig(NodeConfig):
|
|
29
|
+
"""Base configuration for all ACP agents.
|
|
30
|
+
|
|
31
|
+
Provides common fields and the interface for building commands.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
model_config = ConfigDict(
|
|
35
|
+
json_schema_extra={
|
|
36
|
+
"x-icon": "octicon:terminal-16",
|
|
37
|
+
"x-doc-title": "ACP Agent Configuration",
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
type: Literal["acp"] = Field("acp", init=False)
|
|
42
|
+
"""Top-level discriminator for agent type."""
|
|
43
|
+
|
|
44
|
+
cwd: str | None = Field(
|
|
45
|
+
default=None,
|
|
46
|
+
title="Working Directory",
|
|
47
|
+
examples=["/path/to/project", ".", "/home/user/myproject"],
|
|
48
|
+
)
|
|
49
|
+
"""Working directory for the session."""
|
|
50
|
+
|
|
51
|
+
env: dict[str, str] = Field(
|
|
52
|
+
default_factory=dict,
|
|
53
|
+
title="Environment Variables",
|
|
54
|
+
examples=[{"PATH": "/usr/local/bin:/usr/bin", "DEBUG": "1"}],
|
|
55
|
+
)
|
|
56
|
+
"""Environment variables to set."""
|
|
57
|
+
|
|
58
|
+
execution_environment: Annotated[
|
|
59
|
+
ExecutionEnvironmentStr | ExecutionEnvironmentConfig,
|
|
60
|
+
Field(
|
|
61
|
+
default="local",
|
|
62
|
+
title="Execution Environment",
|
|
63
|
+
examples=[
|
|
64
|
+
"docker",
|
|
65
|
+
E2bExecutionEnvironmentConfig(template="python-sandbox"),
|
|
66
|
+
],
|
|
67
|
+
),
|
|
68
|
+
] = "local"
|
|
69
|
+
"""Execution environment config for the agent's own toolsets."""
|
|
70
|
+
|
|
71
|
+
client_execution_environment: Annotated[
|
|
72
|
+
ExecutionEnvironmentStr | ExecutionEnvironmentConfig | None,
|
|
73
|
+
Field(
|
|
74
|
+
default=None,
|
|
75
|
+
title="Client Execution Environment",
|
|
76
|
+
examples=[
|
|
77
|
+
"local",
|
|
78
|
+
"docker",
|
|
79
|
+
E2bExecutionEnvironmentConfig(template="python-sandbox"),
|
|
80
|
+
],
|
|
81
|
+
),
|
|
82
|
+
] = None
|
|
83
|
+
"""Execution environment for handling subprocess requests (filesystem, terminals).
|
|
84
|
+
|
|
85
|
+
When the ACP subprocess requests file/terminal operations, this environment
|
|
86
|
+
determines where those operations execute. Falls back to execution_environment
|
|
87
|
+
if not set.
|
|
88
|
+
|
|
89
|
+
Use cases:
|
|
90
|
+
- None (default): Use same env as toolsets (execution_environment)
|
|
91
|
+
- "local": Subprocess operates on its own local filesystem
|
|
92
|
+
- Remote config: Subprocess operates in a specific remote environment
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
allow_file_operations: bool = Field(default=True, title="Allow File Operations")
|
|
96
|
+
"""Whether to allow file read/write operations."""
|
|
97
|
+
|
|
98
|
+
allow_terminal: bool = Field(default=True, title="Allow Terminal")
|
|
99
|
+
"""Whether to allow terminal operations."""
|
|
100
|
+
|
|
101
|
+
requires_tool_confirmation: Literal["never", "always"] = Field(
|
|
102
|
+
default="always", title="Tool confirmation mode"
|
|
103
|
+
)
|
|
104
|
+
"""Whether to automatically grant all permission requests."""
|
|
105
|
+
|
|
106
|
+
system_prompt: str | Sequence[str | PromptConfig] | None = Field(
|
|
107
|
+
default=None,
|
|
108
|
+
title="System Prompt",
|
|
109
|
+
examples=[
|
|
110
|
+
"You are a helpful coding assistant.",
|
|
111
|
+
["Always write tests.", "Focus on Python."],
|
|
112
|
+
],
|
|
113
|
+
json_schema_extra={
|
|
114
|
+
"documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/system_prompts_configuration/"
|
|
115
|
+
},
|
|
116
|
+
)
|
|
117
|
+
"""System prompt for the agent. Can be a string or list of strings/prompt configs.
|
|
118
|
+
|
|
119
|
+
Support varies by agent:
|
|
120
|
+
- Claude: passed via --system-prompt
|
|
121
|
+
- Auggie: passed via --instruction-file
|
|
122
|
+
- Stakpak: passed via --system-prompt-file
|
|
123
|
+
- Others: may not support system prompts
|
|
124
|
+
|
|
125
|
+
Docs: https://phil65.github.io/agentpool/YAML%20Configuration/system_prompts_configuration/
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
def get_command(self) -> str:
|
|
129
|
+
"""Get the command to spawn the ACP server."""
|
|
130
|
+
raise NotImplementedError
|
|
131
|
+
|
|
132
|
+
async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
|
|
133
|
+
"""Get command arguments."""
|
|
134
|
+
raise NotImplementedError
|
|
135
|
+
|
|
136
|
+
async def render_system_prompt(
|
|
137
|
+
self,
|
|
138
|
+
prompt_manager: PromptManager | None = None,
|
|
139
|
+
context: dict[str, Any] | None = None,
|
|
140
|
+
) -> str | None:
|
|
141
|
+
"""Render system prompt to a single string.
|
|
142
|
+
|
|
143
|
+
Resolves library references and renders templates.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
prompt_manager: Optional prompt manager for resolving library references
|
|
147
|
+
context: Optional context for template rendering
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
Rendered system prompt string, or None if no prompt configured
|
|
151
|
+
"""
|
|
152
|
+
from toprompt import render_prompt
|
|
153
|
+
|
|
154
|
+
from agentpool_config.system_prompts import (
|
|
155
|
+
FilePromptConfig,
|
|
156
|
+
FunctionPromptConfig,
|
|
157
|
+
LibraryPromptConfig,
|
|
158
|
+
StaticPromptConfig,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
if self.system_prompt is None:
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
context = context or {"name": self.name}
|
|
165
|
+
prompt_list = (
|
|
166
|
+
[self.system_prompt] if isinstance(self.system_prompt, str) else self.system_prompt
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
rendered_parts: list[str] = []
|
|
170
|
+
for prompt in prompt_list:
|
|
171
|
+
match prompt:
|
|
172
|
+
case str() as content:
|
|
173
|
+
rendered_parts.append(render_prompt(content, {"agent": context}))
|
|
174
|
+
case StaticPromptConfig(content=content):
|
|
175
|
+
rendered_parts.append(render_prompt(content, {"agent": context}))
|
|
176
|
+
case FilePromptConfig(path=path, variables=variables):
|
|
177
|
+
from pathlib import Path
|
|
178
|
+
|
|
179
|
+
template_path = Path(path)
|
|
180
|
+
if not template_path.is_absolute() and self.config_file_path:
|
|
181
|
+
base_path = Path(self.config_file_path).parent
|
|
182
|
+
template_path = base_path / path
|
|
183
|
+
template_content = template_path.read_text("utf-8")
|
|
184
|
+
template_ctx = {"agent": context, **variables}
|
|
185
|
+
rendered_parts.append(render_prompt(template_content, template_ctx))
|
|
186
|
+
case LibraryPromptConfig(reference=reference):
|
|
187
|
+
if prompt_manager:
|
|
188
|
+
resolved = await prompt_manager.get_from(reference)
|
|
189
|
+
rendered_parts.append(render_prompt(resolved, {"agent": context}))
|
|
190
|
+
else:
|
|
191
|
+
# Fallback: include reference marker
|
|
192
|
+
rendered_parts.append(f"[LIBRARY:{reference}]")
|
|
193
|
+
case FunctionPromptConfig(function=function, arguments=arguments):
|
|
194
|
+
content = function(**arguments)
|
|
195
|
+
rendered_parts.append(render_prompt(content, {"agent": context}))
|
|
196
|
+
|
|
197
|
+
return "\n\n".join(rendered_parts) if rendered_parts else None
|
|
198
|
+
|
|
199
|
+
async def write_system_prompt_file(
|
|
200
|
+
self,
|
|
201
|
+
prompt_manager: PromptManager | None = None,
|
|
202
|
+
context: dict[str, Any] | None = None,
|
|
203
|
+
) -> str | None:
|
|
204
|
+
"""Write system prompt to a temporary file.
|
|
205
|
+
|
|
206
|
+
Creates a temp file in the system temp directory that will be
|
|
207
|
+
cleaned up on system restart.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
prompt_manager: Optional prompt manager for resolving library references
|
|
211
|
+
context: Optional context for template rendering
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Path to the temp file, or None if no prompt configured
|
|
215
|
+
"""
|
|
216
|
+
content = await self.render_system_prompt(prompt_manager, context)
|
|
217
|
+
if not content:
|
|
218
|
+
return None
|
|
219
|
+
|
|
220
|
+
fd, path = tempfile.mkstemp(prefix="agentpool_prompt_", suffix=".txt")
|
|
221
|
+
with os.fdopen(fd, "w") as f:
|
|
222
|
+
f.write(content)
|
|
223
|
+
return path
|
|
224
|
+
|
|
225
|
+
def get_execution_environment(self) -> ExecutionEnvironment:
|
|
226
|
+
"""Create execution environment from config."""
|
|
227
|
+
if isinstance(self.execution_environment, str):
|
|
228
|
+
return get_environment(self.execution_environment)
|
|
229
|
+
return self.execution_environment.get_provider()
|
|
230
|
+
|
|
231
|
+
def get_client_execution_environment(self) -> ExecutionEnvironment | None:
|
|
232
|
+
"""Create client execution environment from config.
|
|
233
|
+
|
|
234
|
+
Returns None if not configured (caller should fall back to main env).
|
|
235
|
+
"""
|
|
236
|
+
if self.client_execution_environment is None:
|
|
237
|
+
return None
|
|
238
|
+
if isinstance(self.client_execution_environment, str):
|
|
239
|
+
return get_environment(self.client_execution_environment)
|
|
240
|
+
return self.client_execution_environment.get_provider()
|
|
241
|
+
|
|
242
|
+
@property
|
|
243
|
+
def model_providers(self) -> list[ProviderType]:
|
|
244
|
+
"""Return the model providers used by this ACP agent.
|
|
245
|
+
|
|
246
|
+
Override in subclasses to specify which providers the agent uses.
|
|
247
|
+
Used for intelligent model discovery and fallback configuration.
|
|
248
|
+
"""
|
|
249
|
+
return []
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class ACPAgentConfig(BaseACPAgentConfig):
|
|
253
|
+
"""Configuration for a custom ACP agent with explicit command.
|
|
254
|
+
|
|
255
|
+
Use this for ACP servers that don't have a preset, or when you need
|
|
256
|
+
full control over the command and arguments.
|
|
257
|
+
|
|
258
|
+
Example:
|
|
259
|
+
```yaml
|
|
260
|
+
agents:
|
|
261
|
+
custom_agent:
|
|
262
|
+
type: acp
|
|
263
|
+
provider: custom
|
|
264
|
+
command: my-acp-server
|
|
265
|
+
args: ["--mode", "coding"]
|
|
266
|
+
cwd: /path/to/project
|
|
267
|
+
```
|
|
268
|
+
"""
|
|
269
|
+
|
|
270
|
+
model_config = ConfigDict(json_schema_extra={"title": "Custom ACP Agent Configuration"})
|
|
271
|
+
|
|
272
|
+
provider: Literal["custom"] = Field("custom", init=False)
|
|
273
|
+
"""Discriminator for custom ACP agent."""
|
|
274
|
+
|
|
275
|
+
command: str = Field(
|
|
276
|
+
...,
|
|
277
|
+
title="Command",
|
|
278
|
+
examples=["claude-code-acp", "aider", "my-custom-acp"],
|
|
279
|
+
)
|
|
280
|
+
"""Command to spawn the ACP server."""
|
|
281
|
+
|
|
282
|
+
args: list[str] = Field(
|
|
283
|
+
default_factory=list,
|
|
284
|
+
title="Arguments",
|
|
285
|
+
examples=[["--mode", "coding"], ["--debug", "--verbose"]],
|
|
286
|
+
)
|
|
287
|
+
"""Arguments to pass to the command."""
|
|
288
|
+
|
|
289
|
+
providers: list[ProviderType] = Field(
|
|
290
|
+
default_factory=list,
|
|
291
|
+
title="Providers",
|
|
292
|
+
examples=[["openai", "anthropic"], ["gemini"]],
|
|
293
|
+
)
|
|
294
|
+
"""Model providers this agent can use."""
|
|
295
|
+
|
|
296
|
+
@property
|
|
297
|
+
def model_providers(self) -> list[ProviderType]:
|
|
298
|
+
"""Return configured providers for custom ACP agents."""
|
|
299
|
+
return list(self.providers)
|
|
300
|
+
|
|
301
|
+
def get_command(self) -> str:
|
|
302
|
+
"""Get the command to spawn the ACP server."""
|
|
303
|
+
return self.command
|
|
304
|
+
|
|
305
|
+
async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
|
|
306
|
+
"""Get command arguments."""
|
|
307
|
+
_ = prompt_manager # Custom agents use explicit args
|
|
308
|
+
return self.args
|