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,265 @@
|
|
|
1
|
+
"""Models for PydanticAI builtin tools configuration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Annotated, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import ConfigDict, Field
|
|
8
|
+
from pydantic_ai import (
|
|
9
|
+
CodeExecutionTool,
|
|
10
|
+
ImageGenerationTool,
|
|
11
|
+
MCPServerTool,
|
|
12
|
+
MemoryTool,
|
|
13
|
+
WebFetchTool,
|
|
14
|
+
WebSearchTool,
|
|
15
|
+
)
|
|
16
|
+
from pydantic_ai.builtin_tools import WebSearchUserLocation # noqa: TC002
|
|
17
|
+
|
|
18
|
+
from agentpool_config.tools import BaseToolConfig
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from pydantic_ai.builtin_tools import AbstractBuiltinTool
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class BaseBuiltinToolConfig(BaseToolConfig):
|
|
26
|
+
"""Base configuration for PydanticAI builtin tools."""
|
|
27
|
+
|
|
28
|
+
def get_builtin_tool(self) -> AbstractBuiltinTool:
|
|
29
|
+
"""Convert config to PydanticAI builtin tool instance."""
|
|
30
|
+
raise NotImplementedError
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class WebSearchToolConfig(BaseBuiltinToolConfig):
|
|
34
|
+
"""Configuration for PydanticAI web search builtin tool."""
|
|
35
|
+
|
|
36
|
+
model_config = ConfigDict(title="Web Search Tool")
|
|
37
|
+
|
|
38
|
+
type: Literal["web_search"] = Field("web_search", init=False)
|
|
39
|
+
"""Web search builtin tool."""
|
|
40
|
+
|
|
41
|
+
search_context_size: Literal["low", "medium", "high"] = Field(
|
|
42
|
+
default="medium",
|
|
43
|
+
examples=["low", "medium", "high"],
|
|
44
|
+
title="Search context size",
|
|
45
|
+
)
|
|
46
|
+
"""The search context size parameter controls how much context is retrieved."""
|
|
47
|
+
|
|
48
|
+
user_location: WebSearchUserLocation | None = Field(default=None, title="User location")
|
|
49
|
+
"""User location for localizing search results (city, country, region, timezone)."""
|
|
50
|
+
|
|
51
|
+
blocked_domains: list[str] | None = Field(
|
|
52
|
+
default=None,
|
|
53
|
+
examples=[["spam.com", "ads.example.com"], ["blocked.site"]],
|
|
54
|
+
title="Blocked domains",
|
|
55
|
+
)
|
|
56
|
+
"""Domains that will never appear in results."""
|
|
57
|
+
|
|
58
|
+
allowed_domains: list[str] | None = Field(
|
|
59
|
+
default=None,
|
|
60
|
+
examples=[["wikipedia.org", "github.com"], ["trusted.site"]],
|
|
61
|
+
title="Allowed domains",
|
|
62
|
+
)
|
|
63
|
+
"""Only these domains will be included in results."""
|
|
64
|
+
|
|
65
|
+
max_uses: int | None = Field(default=None, examples=[5, 10, 20], title="Maximum uses")
|
|
66
|
+
"""Maximum number of times the tool can be used."""
|
|
67
|
+
|
|
68
|
+
def get_builtin_tool(self) -> WebSearchTool:
|
|
69
|
+
"""Convert config to WebSearchTool instance."""
|
|
70
|
+
return WebSearchTool(
|
|
71
|
+
search_context_size=self.search_context_size,
|
|
72
|
+
user_location=self.user_location,
|
|
73
|
+
blocked_domains=self.blocked_domains,
|
|
74
|
+
allowed_domains=self.allowed_domains,
|
|
75
|
+
max_uses=self.max_uses,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class CodeExecutionToolConfig(BaseBuiltinToolConfig):
|
|
80
|
+
"""Configuration for PydanticAI code execution builtin tool."""
|
|
81
|
+
|
|
82
|
+
model_config = ConfigDict(title="Code Execution Tool")
|
|
83
|
+
|
|
84
|
+
type: Literal["code_execution"] = Field("code_execution", init=False)
|
|
85
|
+
"""Code execution builtin tool."""
|
|
86
|
+
|
|
87
|
+
def get_builtin_tool(self) -> CodeExecutionTool:
|
|
88
|
+
"""Convert config to CodeExecutionTool instance."""
|
|
89
|
+
return CodeExecutionTool()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class WebFetchToolConfig(BaseBuiltinToolConfig):
|
|
93
|
+
"""Configuration for PydanticAI URL context builtin tool."""
|
|
94
|
+
|
|
95
|
+
model_config = ConfigDict(title="Url Context Tool")
|
|
96
|
+
|
|
97
|
+
type: Literal["web_fetch"] = Field("web_fetch", init=False)
|
|
98
|
+
"""URL context builtin tool."""
|
|
99
|
+
|
|
100
|
+
def get_builtin_tool(self) -> WebFetchTool:
|
|
101
|
+
"""Convert config to WebFetchTool instance."""
|
|
102
|
+
return WebFetchTool()
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class ImageGenerationToolConfig(BaseBuiltinToolConfig):
|
|
106
|
+
"""Configuration for PydanticAI image generation builtin tool."""
|
|
107
|
+
|
|
108
|
+
model_config = ConfigDict(title="Image Generation Tool")
|
|
109
|
+
|
|
110
|
+
type: Literal["image_generation"] = Field("image_generation", init=False)
|
|
111
|
+
"""Image generation builtin tool."""
|
|
112
|
+
|
|
113
|
+
background: Literal["transparent", "opaque", "auto"] = Field(
|
|
114
|
+
default="auto",
|
|
115
|
+
examples=["transparent", "opaque", "auto"],
|
|
116
|
+
title="Background type",
|
|
117
|
+
)
|
|
118
|
+
"""Background type for the generated image."""
|
|
119
|
+
|
|
120
|
+
input_fidelity: Literal["high", "low"] | None = Field(
|
|
121
|
+
default=None,
|
|
122
|
+
examples=["high", "low"],
|
|
123
|
+
title="Input fidelity",
|
|
124
|
+
)
|
|
125
|
+
"""Control how much effort the model will exert to match input image features."""
|
|
126
|
+
|
|
127
|
+
moderation: Literal["auto", "low"] = Field(
|
|
128
|
+
default="auto",
|
|
129
|
+
examples=["auto", "low"],
|
|
130
|
+
title="Moderation level",
|
|
131
|
+
)
|
|
132
|
+
"""Moderation level for the generated image."""
|
|
133
|
+
|
|
134
|
+
output_compression: int = Field(
|
|
135
|
+
default=100,
|
|
136
|
+
ge=0,
|
|
137
|
+
le=100,
|
|
138
|
+
examples=[80, 90, 100],
|
|
139
|
+
title="Output compression",
|
|
140
|
+
)
|
|
141
|
+
"""Compression level for the output image."""
|
|
142
|
+
|
|
143
|
+
output_format: Literal["png", "webp", "jpeg"] | None = Field(
|
|
144
|
+
default=None,
|
|
145
|
+
examples=["png", "webp", "jpeg"],
|
|
146
|
+
title="Output format",
|
|
147
|
+
)
|
|
148
|
+
"""The output format of the generated image."""
|
|
149
|
+
|
|
150
|
+
partial_images: int = Field(
|
|
151
|
+
default=0,
|
|
152
|
+
ge=0,
|
|
153
|
+
examples=[0, 2, 4],
|
|
154
|
+
title="Partial images count",
|
|
155
|
+
)
|
|
156
|
+
"""Number of partial images to generate in streaming mode."""
|
|
157
|
+
|
|
158
|
+
quality: Literal["low", "medium", "high", "auto"] = Field(
|
|
159
|
+
default="auto",
|
|
160
|
+
examples=["low", "medium", "high", "auto"],
|
|
161
|
+
title="Image quality",
|
|
162
|
+
)
|
|
163
|
+
"""The quality of the generated image."""
|
|
164
|
+
|
|
165
|
+
size: Literal["1024x1024", "1024x1536", "1536x1024", "auto"] = Field(
|
|
166
|
+
default="auto",
|
|
167
|
+
examples=["1024x1024", "1024x1536", "1536x1024", "auto"],
|
|
168
|
+
title="Image size",
|
|
169
|
+
)
|
|
170
|
+
"""The size of the generated image."""
|
|
171
|
+
|
|
172
|
+
def get_builtin_tool(self) -> ImageGenerationTool:
|
|
173
|
+
"""Convert config to ImageGenerationTool instance."""
|
|
174
|
+
return ImageGenerationTool(
|
|
175
|
+
background=self.background,
|
|
176
|
+
input_fidelity=self.input_fidelity,
|
|
177
|
+
moderation=self.moderation,
|
|
178
|
+
output_compression=self.output_compression,
|
|
179
|
+
output_format=self.output_format,
|
|
180
|
+
partial_images=self.partial_images,
|
|
181
|
+
quality=self.quality,
|
|
182
|
+
size=self.size,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class MemoryToolConfig(BaseBuiltinToolConfig):
|
|
187
|
+
"""Configuration for PydanticAI memory builtin tool."""
|
|
188
|
+
|
|
189
|
+
model_config = ConfigDict(title="Memory Tool")
|
|
190
|
+
|
|
191
|
+
type: Literal["memory"] = Field("memory", init=False)
|
|
192
|
+
"""Memory builtin tool."""
|
|
193
|
+
|
|
194
|
+
def get_builtin_tool(self) -> MemoryTool:
|
|
195
|
+
"""Convert config to MemoryTool instance."""
|
|
196
|
+
return MemoryTool()
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class MCPServerToolConfig(BaseBuiltinToolConfig):
|
|
200
|
+
"""Configuration for PydanticAI MCP server builtin tool."""
|
|
201
|
+
|
|
202
|
+
model_config = ConfigDict(title="MCP Server Tool")
|
|
203
|
+
|
|
204
|
+
type: Literal["mcp_server"] = Field("mcp_server", init=False)
|
|
205
|
+
"""MCP server builtin tool."""
|
|
206
|
+
|
|
207
|
+
server_id: str = Field(
|
|
208
|
+
alias="id",
|
|
209
|
+
examples=["my_mcp_server", "code_tools", "web_api"],
|
|
210
|
+
title="Server ID",
|
|
211
|
+
)
|
|
212
|
+
"""A unique identifier for the MCP server."""
|
|
213
|
+
|
|
214
|
+
url: str = Field(
|
|
215
|
+
examples=["https://api.example.com/mcp", "http://localhost:8080"],
|
|
216
|
+
title="Server URL",
|
|
217
|
+
)
|
|
218
|
+
"""The URL of the MCP server to use."""
|
|
219
|
+
|
|
220
|
+
authorization_token: str | None = Field(
|
|
221
|
+
default=None,
|
|
222
|
+
examples=["Bearer token123", "api_key_abc"],
|
|
223
|
+
title="Authorization token",
|
|
224
|
+
)
|
|
225
|
+
"""Authorization header to use when making requests to the MCP server."""
|
|
226
|
+
|
|
227
|
+
description: str | None = Field(
|
|
228
|
+
default=None,
|
|
229
|
+
examples=["External API tools", "Code execution server"],
|
|
230
|
+
title="Server description",
|
|
231
|
+
)
|
|
232
|
+
"""A description of the MCP server."""
|
|
233
|
+
|
|
234
|
+
allowed_tools: list[str] | None = Field(
|
|
235
|
+
default=None,
|
|
236
|
+
examples=[["search", "fetch"], ["execute", "compile"]],
|
|
237
|
+
title="Allowed tools",
|
|
238
|
+
)
|
|
239
|
+
"""A list of tools that the MCP server can use."""
|
|
240
|
+
|
|
241
|
+
headers: dict[str, str] | None = Field(default=None, title="HTTP headers")
|
|
242
|
+
"""Optional HTTP headers to send to the MCP server."""
|
|
243
|
+
|
|
244
|
+
def get_builtin_tool(self) -> MCPServerTool:
|
|
245
|
+
"""Convert config to MCPServerTool instance."""
|
|
246
|
+
return MCPServerTool(
|
|
247
|
+
id=self.server_id,
|
|
248
|
+
url=self.url,
|
|
249
|
+
authorization_token=self.authorization_token,
|
|
250
|
+
description=self.description,
|
|
251
|
+
allowed_tools=self.allowed_tools,
|
|
252
|
+
headers=self.headers,
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
# Union type for builtin tool configs
|
|
257
|
+
BuiltinToolConfig = Annotated[
|
|
258
|
+
WebSearchToolConfig
|
|
259
|
+
| CodeExecutionToolConfig
|
|
260
|
+
| WebFetchToolConfig
|
|
261
|
+
| ImageGenerationToolConfig
|
|
262
|
+
| MemoryToolConfig
|
|
263
|
+
| MCPServerToolConfig,
|
|
264
|
+
Field(discriminator="type"),
|
|
265
|
+
]
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"""Command configuration for prompt shortcuts."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
import inspect
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import re
|
|
9
|
+
from typing import Annotated, Any, Literal
|
|
10
|
+
|
|
11
|
+
from pydantic import ConfigDict, Field, ImportString
|
|
12
|
+
from schemez import Schema
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BaseCommandConfig(Schema):
|
|
16
|
+
"""Base configuration for commands."""
|
|
17
|
+
|
|
18
|
+
model_config = ConfigDict(json_schema_extra={"title": "Base Command"})
|
|
19
|
+
|
|
20
|
+
type: str = Field(title="Command type")
|
|
21
|
+
"""Type discriminator for command configurations."""
|
|
22
|
+
|
|
23
|
+
name: str | None = Field(
|
|
24
|
+
default=None,
|
|
25
|
+
examples=["summarize", "code_review", "translate"],
|
|
26
|
+
title="Command name",
|
|
27
|
+
)
|
|
28
|
+
"""Command name (optional, can be inferred from key)."""
|
|
29
|
+
|
|
30
|
+
description: str | None = Field(
|
|
31
|
+
default=None,
|
|
32
|
+
examples=["Summarize the given text", "Review code for issues"],
|
|
33
|
+
title="Command description",
|
|
34
|
+
)
|
|
35
|
+
"""Optional description of what this command does."""
|
|
36
|
+
|
|
37
|
+
def get_callable(self) -> Callable[..., str]:
|
|
38
|
+
"""Generate a callable function from the command configuration.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
A function with proper signature that can be introspected by libraries
|
|
42
|
+
like slashed that examine Python callables.
|
|
43
|
+
"""
|
|
44
|
+
raise NotImplementedError
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class StaticCommandConfig(BaseCommandConfig):
|
|
48
|
+
"""Static command with inline content."""
|
|
49
|
+
|
|
50
|
+
model_config = ConfigDict(json_schema_extra={"title": "Static Command"})
|
|
51
|
+
|
|
52
|
+
type: Literal["static"] = Field("static", init=False)
|
|
53
|
+
"""Static command configuration."""
|
|
54
|
+
|
|
55
|
+
content: str = Field(
|
|
56
|
+
examples=[
|
|
57
|
+
"Summarize this text: {text}",
|
|
58
|
+
"Translate {text} to {language}",
|
|
59
|
+
"Review this code: {code}",
|
|
60
|
+
],
|
|
61
|
+
title="Template content",
|
|
62
|
+
)
|
|
63
|
+
"""The prompt template content. Supports ${env.VAR} substitution."""
|
|
64
|
+
|
|
65
|
+
def get_callable(self) -> Callable[..., str]:
|
|
66
|
+
"""Generate a callable function from the static command content.
|
|
67
|
+
|
|
68
|
+
Parses {param} placeholders in content to create function parameters.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
A function with signature matching the template parameters
|
|
72
|
+
"""
|
|
73
|
+
# Extract parameter names from {param} placeholders
|
|
74
|
+
param_names = list(set(re.findall(r"\{(\w+)\}", self.content)))
|
|
75
|
+
param_names.sort() # Consistent ordering
|
|
76
|
+
|
|
77
|
+
# Create function that does template substitution
|
|
78
|
+
def command_func(*args: Any, **kwargs: Any) -> str:
|
|
79
|
+
"""Generated command function."""
|
|
80
|
+
# Build substitution dict from args and kwargs
|
|
81
|
+
substitutions = {}
|
|
82
|
+
for i, name in enumerate(param_names):
|
|
83
|
+
if i < len(args):
|
|
84
|
+
substitutions[name] = args[i]
|
|
85
|
+
elif name in kwargs:
|
|
86
|
+
substitutions[name] = kwargs[name]
|
|
87
|
+
else:
|
|
88
|
+
substitutions[name] = "" # Default empty string
|
|
89
|
+
|
|
90
|
+
# Substitute into template
|
|
91
|
+
return self.content.format(**substitutions)
|
|
92
|
+
|
|
93
|
+
# Create proper signature
|
|
94
|
+
parameters = [
|
|
95
|
+
inspect.Parameter(
|
|
96
|
+
name, inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=str, default=""
|
|
97
|
+
)
|
|
98
|
+
for name in param_names
|
|
99
|
+
]
|
|
100
|
+
signature = inspect.Signature(parameters, return_annotation=str)
|
|
101
|
+
# Set function metadata
|
|
102
|
+
command_func.__name__ = self.name or "unnamed_command"
|
|
103
|
+
command_func.__doc__ = self.description or self.content
|
|
104
|
+
command_func.__signature__ = signature # type: ignore
|
|
105
|
+
|
|
106
|
+
return command_func
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class CallableCommandConfig(BaseCommandConfig):
|
|
110
|
+
"""Callable command that references a Python function."""
|
|
111
|
+
|
|
112
|
+
model_config = ConfigDict(json_schema_extra={"title": "Callable Command"})
|
|
113
|
+
|
|
114
|
+
type: Literal["callable"] = Field("callable", init=False)
|
|
115
|
+
"""Callable command configuration."""
|
|
116
|
+
|
|
117
|
+
function: ImportString[Callable[..., Any]] = Field(
|
|
118
|
+
examples=[
|
|
119
|
+
"mymodule.commands.summarize",
|
|
120
|
+
"utils.prompts:code_review",
|
|
121
|
+
"external.tools:translate_text",
|
|
122
|
+
],
|
|
123
|
+
title="Function import path",
|
|
124
|
+
)
|
|
125
|
+
"""Python function import path (e.g., 'my.package.module.function_name')."""
|
|
126
|
+
|
|
127
|
+
def get_callable(self) -> Callable[..., str]:
|
|
128
|
+
"""Return the imported function directly.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
The imported Python function
|
|
132
|
+
|
|
133
|
+
Raises:
|
|
134
|
+
ImportError: If the function cannot be imported
|
|
135
|
+
TypeError: If the imported object is not callable
|
|
136
|
+
"""
|
|
137
|
+
func = self.function
|
|
138
|
+
if not callable(func):
|
|
139
|
+
msg = f"Imported object {self.function} is not callable"
|
|
140
|
+
raise TypeError(msg)
|
|
141
|
+
|
|
142
|
+
# Set name if provided and function has __name__
|
|
143
|
+
if self.name and hasattr(func, "__name__"):
|
|
144
|
+
func.__name__ = self.name # ty: ignore
|
|
145
|
+
|
|
146
|
+
# Set description as docstring if provided
|
|
147
|
+
if self.description and not func.__doc__:
|
|
148
|
+
func.__doc__ = self.description
|
|
149
|
+
elif self.description:
|
|
150
|
+
# Prepend description to existing docstring
|
|
151
|
+
existing_doc = func.__doc__ or ""
|
|
152
|
+
func.__doc__ = f"{self.description}\n\n{existing_doc}".strip()
|
|
153
|
+
|
|
154
|
+
return func
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class FileCommandConfig(BaseCommandConfig):
|
|
158
|
+
"""File-based command that loads content from external file."""
|
|
159
|
+
|
|
160
|
+
model_config = ConfigDict(json_schema_extra={"title": "File-based Command"})
|
|
161
|
+
|
|
162
|
+
type: Literal["file"] = Field("file", init=False)
|
|
163
|
+
"""File-based command configuration."""
|
|
164
|
+
|
|
165
|
+
path: str = Field(
|
|
166
|
+
examples=[
|
|
167
|
+
"prompts/summarize.txt",
|
|
168
|
+
"/templates/code_review.j2",
|
|
169
|
+
"commands/translate.md",
|
|
170
|
+
],
|
|
171
|
+
title="Template file path",
|
|
172
|
+
)
|
|
173
|
+
"""Path to file containing the prompt template."""
|
|
174
|
+
|
|
175
|
+
encoding: str = Field(
|
|
176
|
+
default="utf-8",
|
|
177
|
+
examples=["utf-8", "ascii", "latin1"],
|
|
178
|
+
title="File encoding",
|
|
179
|
+
)
|
|
180
|
+
"""File encoding to use when reading the file."""
|
|
181
|
+
|
|
182
|
+
def get_callable(self) -> Callable[..., str]:
|
|
183
|
+
"""Generate a callable function from the file-based command.
|
|
184
|
+
|
|
185
|
+
Loads content from file and creates function with parameters
|
|
186
|
+
based on {param} placeholders in the file content.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
A function with signature matching the template parameters
|
|
190
|
+
|
|
191
|
+
Raises:
|
|
192
|
+
FileNotFoundError: If the specified file doesn't exist
|
|
193
|
+
UnicodeDecodeError: If file cannot be decoded with specified encoding
|
|
194
|
+
"""
|
|
195
|
+
file_path = Path(self.path)
|
|
196
|
+
content = file_path.read_text(encoding=self.encoding)
|
|
197
|
+
# Extract parameter names from {param} placeholders
|
|
198
|
+
param_names = list(set(re.findall(r"\{(\w+)\}", content)))
|
|
199
|
+
param_names.sort() # Consistent ordering
|
|
200
|
+
|
|
201
|
+
# Create function that does template substitution
|
|
202
|
+
def command_func(*args: Any, **kwargs: Any) -> str:
|
|
203
|
+
"""Generated command function from file."""
|
|
204
|
+
# Build substitution dict from args and kwargs
|
|
205
|
+
substitutions = {}
|
|
206
|
+
for i, name in enumerate(param_names):
|
|
207
|
+
if i < len(args):
|
|
208
|
+
substitutions[name] = args[i]
|
|
209
|
+
elif name in kwargs:
|
|
210
|
+
substitutions[name] = kwargs[name]
|
|
211
|
+
else:
|
|
212
|
+
substitutions[name] = "" # Default empty string
|
|
213
|
+
|
|
214
|
+
# Substitute into template
|
|
215
|
+
return content.format(**substitutions)
|
|
216
|
+
|
|
217
|
+
# Create proper signature
|
|
218
|
+
parameters = [
|
|
219
|
+
inspect.Parameter(
|
|
220
|
+
name, inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=str, default=""
|
|
221
|
+
)
|
|
222
|
+
for name in param_names
|
|
223
|
+
]
|
|
224
|
+
signature = inspect.Signature(parameters, return_annotation=str)
|
|
225
|
+
|
|
226
|
+
# Set function metadata
|
|
227
|
+
command_func.__name__ = self.name or "unnamed_command"
|
|
228
|
+
command_func.__doc__ = self.description or f"Command from {self.path}"
|
|
229
|
+
command_func.__signature__ = signature # type: ignore
|
|
230
|
+
|
|
231
|
+
return command_func
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
CommandConfig = Annotated[
|
|
235
|
+
StaticCommandConfig | FileCommandConfig | CallableCommandConfig,
|
|
236
|
+
Field(discriminator="type"),
|
|
237
|
+
]
|