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,331 @@
|
|
|
1
|
+
"""Condition models for hook filtering."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Annotated, Any, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import ConfigDict, Field
|
|
8
|
+
from schemez import Schema
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class BaseHookCondition(Schema):
|
|
12
|
+
"""Base class for hook conditions."""
|
|
13
|
+
|
|
14
|
+
type: str = Field(init=False, title="Condition type")
|
|
15
|
+
"""Discriminator for condition types."""
|
|
16
|
+
|
|
17
|
+
model_config = ConfigDict(frozen=True)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# === Tool Hook Conditions ===
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ToolNameCondition(BaseHookCondition):
|
|
24
|
+
"""Match tool by name pattern."""
|
|
25
|
+
|
|
26
|
+
model_config = ConfigDict(json_schema_extra={"title": "Tool Name Condition"})
|
|
27
|
+
|
|
28
|
+
type: Literal["tool_name"] = Field("tool_name", init=False)
|
|
29
|
+
"""Tool name pattern condition."""
|
|
30
|
+
|
|
31
|
+
pattern: str = Field(
|
|
32
|
+
examples=["Bash", "Write|Edit", "mcp__.*", ".*"],
|
|
33
|
+
title="Name pattern",
|
|
34
|
+
)
|
|
35
|
+
"""Regex pattern to match tool names."""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ArgumentCondition(BaseHookCondition):
|
|
39
|
+
"""Check tool argument values."""
|
|
40
|
+
|
|
41
|
+
model_config = ConfigDict(json_schema_extra={"title": "Argument Condition"})
|
|
42
|
+
|
|
43
|
+
type: Literal["argument"] = Field("argument", init=False)
|
|
44
|
+
"""Argument value condition."""
|
|
45
|
+
|
|
46
|
+
key: str = Field(
|
|
47
|
+
examples=["command", "file_path", "options.force"],
|
|
48
|
+
title="Argument key",
|
|
49
|
+
)
|
|
50
|
+
"""Argument name to check. Supports dot notation for nested access."""
|
|
51
|
+
|
|
52
|
+
pattern: str | None = Field(
|
|
53
|
+
default=None,
|
|
54
|
+
examples=["rm\\s+-rf", "^/tmp/.*", ".*\\.py$"],
|
|
55
|
+
title="Regex pattern",
|
|
56
|
+
)
|
|
57
|
+
"""Regex pattern to match argument value."""
|
|
58
|
+
|
|
59
|
+
contains: str | None = Field(
|
|
60
|
+
default=None,
|
|
61
|
+
examples=["sudo", "DROP TABLE", "../"],
|
|
62
|
+
title="Substring match",
|
|
63
|
+
)
|
|
64
|
+
"""Substring that must be present in argument value."""
|
|
65
|
+
|
|
66
|
+
equals: Any | None = Field(
|
|
67
|
+
default=None,
|
|
68
|
+
examples=[True, "/etc/passwd", 0],
|
|
69
|
+
title="Exact value",
|
|
70
|
+
)
|
|
71
|
+
"""Exact value the argument must equal."""
|
|
72
|
+
|
|
73
|
+
case_sensitive: bool = Field(default=True, title="Case sensitive")
|
|
74
|
+
"""Whether string matching is case-sensitive."""
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class ArgumentExistsCondition(BaseHookCondition):
|
|
78
|
+
"""Check if an argument is present."""
|
|
79
|
+
|
|
80
|
+
model_config = ConfigDict(json_schema_extra={"title": "Argument Exists Condition"})
|
|
81
|
+
|
|
82
|
+
type: Literal["argument_exists"] = Field("argument_exists", init=False)
|
|
83
|
+
"""Argument existence condition."""
|
|
84
|
+
|
|
85
|
+
key: str = Field(
|
|
86
|
+
examples=["force", "recursive", "timeout"],
|
|
87
|
+
title="Argument key",
|
|
88
|
+
)
|
|
89
|
+
"""Argument name that must exist (or not exist)."""
|
|
90
|
+
|
|
91
|
+
exists: bool = Field(default=True, title="Must exist")
|
|
92
|
+
"""If True, argument must exist. If False, argument must not exist."""
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class Jinja2HookCondition(BaseHookCondition):
|
|
96
|
+
"""Flexible Jinja2 template condition for hooks."""
|
|
97
|
+
|
|
98
|
+
model_config = ConfigDict(json_schema_extra={"title": "Jinja2 Hook Condition"})
|
|
99
|
+
|
|
100
|
+
type: Literal["jinja2"] = Field("jinja2", init=False)
|
|
101
|
+
"""Jinja2 template condition."""
|
|
102
|
+
|
|
103
|
+
template: str = Field(
|
|
104
|
+
examples=[
|
|
105
|
+
"{{ tool_name == 'Bash' and 'sudo' in tool_input.get('command', '') }}",
|
|
106
|
+
"{{ tool_input.get('path', '').startswith('/tmp') }}",
|
|
107
|
+
"{{ 'password' in tool_input | string | lower }}",
|
|
108
|
+
],
|
|
109
|
+
title="Jinja2 template",
|
|
110
|
+
)
|
|
111
|
+
"""Jinja2 template that evaluates to true/false.
|
|
112
|
+
|
|
113
|
+
Available variables depend on hook event:
|
|
114
|
+
- tool_name: Name of the tool (tool hooks)
|
|
115
|
+
- tool_input: Tool arguments dict (tool hooks)
|
|
116
|
+
- tool_output: Tool result (post_tool_use only)
|
|
117
|
+
- duration_ms: Execution time in ms (post_tool_use only)
|
|
118
|
+
- prompt: User prompt (run hooks)
|
|
119
|
+
- result: Run result (post_run only)
|
|
120
|
+
- agent_name: Name of the agent
|
|
121
|
+
- event: Hook event name
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class DurationCondition(BaseHookCondition):
|
|
126
|
+
"""Check tool execution duration (post_tool_use only)."""
|
|
127
|
+
|
|
128
|
+
model_config = ConfigDict(json_schema_extra={"title": "Duration Condition"})
|
|
129
|
+
|
|
130
|
+
type: Literal["duration"] = Field("duration", init=False)
|
|
131
|
+
"""Duration threshold condition."""
|
|
132
|
+
|
|
133
|
+
min_ms: float | None = Field(
|
|
134
|
+
default=None,
|
|
135
|
+
ge=0,
|
|
136
|
+
examples=[1000, 5000],
|
|
137
|
+
title="Minimum duration (ms)",
|
|
138
|
+
)
|
|
139
|
+
"""Minimum duration in milliseconds. Triggers if duration >= min_ms."""
|
|
140
|
+
|
|
141
|
+
max_ms: float | None = Field(
|
|
142
|
+
default=None,
|
|
143
|
+
ge=0,
|
|
144
|
+
examples=[100, 500],
|
|
145
|
+
title="Maximum duration (ms)",
|
|
146
|
+
)
|
|
147
|
+
"""Maximum duration in milliseconds. Triggers if duration <= max_ms."""
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class OutputCondition(BaseHookCondition):
|
|
151
|
+
"""Check tool output content (post_tool_use only)."""
|
|
152
|
+
|
|
153
|
+
model_config = ConfigDict(json_schema_extra={"title": "Output Condition"})
|
|
154
|
+
|
|
155
|
+
type: Literal["output"] = Field("output", init=False)
|
|
156
|
+
"""Output content condition."""
|
|
157
|
+
|
|
158
|
+
pattern: str | None = Field(
|
|
159
|
+
default=None,
|
|
160
|
+
examples=["error", "Exception", "failed"],
|
|
161
|
+
title="Regex pattern",
|
|
162
|
+
)
|
|
163
|
+
"""Regex pattern to match in output."""
|
|
164
|
+
|
|
165
|
+
contains: str | None = Field(
|
|
166
|
+
default=None,
|
|
167
|
+
examples=["success", "error", "warning"],
|
|
168
|
+
title="Substring match",
|
|
169
|
+
)
|
|
170
|
+
"""Substring that must be present in output."""
|
|
171
|
+
|
|
172
|
+
case_sensitive: bool = Field(default=False, title="Case sensitive")
|
|
173
|
+
"""Whether string matching is case-sensitive."""
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class OutputSizeCondition(BaseHookCondition):
|
|
177
|
+
"""Check tool output size (post_tool_use only)."""
|
|
178
|
+
|
|
179
|
+
model_config = ConfigDict(json_schema_extra={"title": "Output Size Condition"})
|
|
180
|
+
|
|
181
|
+
type: Literal["output_size"] = Field("output_size", init=False)
|
|
182
|
+
"""Output size condition."""
|
|
183
|
+
|
|
184
|
+
min_chars: int | None = Field(
|
|
185
|
+
default=None,
|
|
186
|
+
ge=0,
|
|
187
|
+
examples=[1000, 10000],
|
|
188
|
+
title="Minimum size",
|
|
189
|
+
)
|
|
190
|
+
"""Minimum output length in characters."""
|
|
191
|
+
|
|
192
|
+
max_chars: int | None = Field(
|
|
193
|
+
default=None,
|
|
194
|
+
ge=0,
|
|
195
|
+
examples=[100, 500],
|
|
196
|
+
title="Maximum size",
|
|
197
|
+
)
|
|
198
|
+
"""Maximum output length in characters."""
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
# === Run Hook Conditions ===
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class PromptCondition(BaseHookCondition):
|
|
205
|
+
"""Check prompt content (pre_run/post_run)."""
|
|
206
|
+
|
|
207
|
+
model_config = ConfigDict(json_schema_extra={"title": "Prompt Condition"})
|
|
208
|
+
|
|
209
|
+
type: Literal["prompt"] = Field("prompt", init=False)
|
|
210
|
+
"""Prompt content condition."""
|
|
211
|
+
|
|
212
|
+
pattern: str | None = Field(
|
|
213
|
+
default=None,
|
|
214
|
+
examples=["^(help|\\?)$", ".*password.*"],
|
|
215
|
+
title="Regex pattern",
|
|
216
|
+
)
|
|
217
|
+
"""Regex pattern to match in prompt."""
|
|
218
|
+
|
|
219
|
+
contains: str | None = Field(
|
|
220
|
+
default=None,
|
|
221
|
+
examples=["delete", "remove all"],
|
|
222
|
+
title="Substring match",
|
|
223
|
+
)
|
|
224
|
+
"""Substring that must be present in prompt."""
|
|
225
|
+
|
|
226
|
+
case_sensitive: bool = Field(default=False, title="Case sensitive")
|
|
227
|
+
"""Whether string matching is case-sensitive."""
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
# === Combinators ===
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class AndHookCondition(BaseHookCondition):
|
|
234
|
+
"""Require all conditions to be met."""
|
|
235
|
+
|
|
236
|
+
model_config = ConfigDict(json_schema_extra={"title": "AND Hook Condition"})
|
|
237
|
+
|
|
238
|
+
type: Literal["and"] = Field("and", init=False)
|
|
239
|
+
"""AND combinator for conditions."""
|
|
240
|
+
|
|
241
|
+
conditions: list[HookCondition] = Field(
|
|
242
|
+
min_length=1,
|
|
243
|
+
title="Conditions",
|
|
244
|
+
)
|
|
245
|
+
"""All conditions must be true."""
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
class OrHookCondition(BaseHookCondition):
|
|
249
|
+
"""Require any condition to be met."""
|
|
250
|
+
|
|
251
|
+
model_config = ConfigDict(json_schema_extra={"title": "OR Hook Condition"})
|
|
252
|
+
|
|
253
|
+
type: Literal["or"] = Field("or", init=False)
|
|
254
|
+
"""OR combinator for conditions."""
|
|
255
|
+
|
|
256
|
+
conditions: list[HookCondition] = Field(
|
|
257
|
+
min_length=1,
|
|
258
|
+
title="Conditions",
|
|
259
|
+
)
|
|
260
|
+
"""At least one condition must be true."""
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
class NotHookCondition(BaseHookCondition):
|
|
264
|
+
"""Negate a condition."""
|
|
265
|
+
|
|
266
|
+
model_config = ConfigDict(json_schema_extra={"title": "NOT Hook Condition"})
|
|
267
|
+
|
|
268
|
+
type: Literal["not"] = Field("not", init=False)
|
|
269
|
+
"""NOT combinator for conditions."""
|
|
270
|
+
|
|
271
|
+
condition: HookCondition = Field(title="Condition")
|
|
272
|
+
"""Condition to negate."""
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
# === Union Types ===
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
# Conditions valid for pre_tool_use
|
|
279
|
+
PreToolCondition = Annotated[
|
|
280
|
+
ToolNameCondition
|
|
281
|
+
| ArgumentCondition
|
|
282
|
+
| ArgumentExistsCondition
|
|
283
|
+
| Jinja2HookCondition
|
|
284
|
+
| AndHookCondition
|
|
285
|
+
| OrHookCondition
|
|
286
|
+
| NotHookCondition,
|
|
287
|
+
Field(discriminator="type"),
|
|
288
|
+
]
|
|
289
|
+
|
|
290
|
+
# Conditions valid for post_tool_use (includes duration/output checks)
|
|
291
|
+
PostToolCondition = Annotated[
|
|
292
|
+
ToolNameCondition
|
|
293
|
+
| ArgumentCondition
|
|
294
|
+
| ArgumentExistsCondition
|
|
295
|
+
| Jinja2HookCondition
|
|
296
|
+
| DurationCondition
|
|
297
|
+
| OutputCondition
|
|
298
|
+
| OutputSizeCondition
|
|
299
|
+
| AndHookCondition
|
|
300
|
+
| OrHookCondition
|
|
301
|
+
| NotHookCondition,
|
|
302
|
+
Field(discriminator="type"),
|
|
303
|
+
]
|
|
304
|
+
|
|
305
|
+
# Conditions valid for pre_run/post_run
|
|
306
|
+
RunCondition = Annotated[
|
|
307
|
+
PromptCondition | Jinja2HookCondition | AndHookCondition | OrHookCondition | NotHookCondition,
|
|
308
|
+
Field(discriminator="type"),
|
|
309
|
+
]
|
|
310
|
+
|
|
311
|
+
# General hook condition (all types)
|
|
312
|
+
HookCondition = Annotated[
|
|
313
|
+
ToolNameCondition
|
|
314
|
+
| ArgumentCondition
|
|
315
|
+
| ArgumentExistsCondition
|
|
316
|
+
| Jinja2HookCondition
|
|
317
|
+
| DurationCondition
|
|
318
|
+
| OutputCondition
|
|
319
|
+
| OutputSizeCondition
|
|
320
|
+
| PromptCondition
|
|
321
|
+
| AndHookCondition
|
|
322
|
+
| OrHookCondition
|
|
323
|
+
| NotHookCondition,
|
|
324
|
+
Field(discriminator="type"),
|
|
325
|
+
]
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
# Update forward references for recursive types
|
|
329
|
+
AndHookCondition.model_rebuild()
|
|
330
|
+
OrHookCondition.model_rebuild()
|
|
331
|
+
NotHookCondition.model_rebuild()
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"""Hook configuration models for agent lifecycle events."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Annotated, Any, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import ConfigDict, Field
|
|
8
|
+
from schemez import Schema
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from agentpool.hooks.base import Hook, HookEvent
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BaseHookConfig(Schema):
|
|
16
|
+
"""Base configuration for hooks."""
|
|
17
|
+
|
|
18
|
+
type: str = Field(init=False, title="Hook type")
|
|
19
|
+
"""Hook type discriminator."""
|
|
20
|
+
|
|
21
|
+
matcher: str | None = Field(
|
|
22
|
+
default=None,
|
|
23
|
+
examples=["Write|Edit", "Bash.*", "*"],
|
|
24
|
+
title="Pattern matcher",
|
|
25
|
+
)
|
|
26
|
+
"""Regex pattern to match tool names. None or '*' matches all."""
|
|
27
|
+
|
|
28
|
+
timeout: float = Field(
|
|
29
|
+
default=60.0,
|
|
30
|
+
gt=0,
|
|
31
|
+
examples=[30.0, 60.0, 120.0],
|
|
32
|
+
title="Timeout seconds",
|
|
33
|
+
)
|
|
34
|
+
"""Maximum execution time in seconds."""
|
|
35
|
+
|
|
36
|
+
enabled: bool = Field(default=True, title="Hook enabled")
|
|
37
|
+
"""Whether this hook is active."""
|
|
38
|
+
|
|
39
|
+
def get_hook(self, event: HookEvent) -> Hook:
|
|
40
|
+
"""Create runtime hook from this config.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
event: The lifecycle event this hook handles.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
Runtime hook instance.
|
|
47
|
+
"""
|
|
48
|
+
raise NotImplementedError
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class CommandHookConfig(BaseHookConfig):
|
|
52
|
+
"""Hook that executes a shell command.
|
|
53
|
+
|
|
54
|
+
The command receives hook input as JSON via stdin and should return
|
|
55
|
+
JSON output via stdout. Exit code 0 = success, exit code 2 = block.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Command Hook"})
|
|
59
|
+
|
|
60
|
+
type: Literal["command"] = Field("command", init=False)
|
|
61
|
+
"""Command hook type."""
|
|
62
|
+
|
|
63
|
+
command: str = Field(
|
|
64
|
+
examples=[
|
|
65
|
+
"/path/to/script.sh",
|
|
66
|
+
"$PROJECT_DIR/hooks/validate.py",
|
|
67
|
+
"python -m myproject.hooks.check",
|
|
68
|
+
],
|
|
69
|
+
title="Shell command",
|
|
70
|
+
)
|
|
71
|
+
"""Shell command to execute. Supports $PROJECT_DIR variable."""
|
|
72
|
+
|
|
73
|
+
env: dict[str, str] | None = Field(
|
|
74
|
+
default=None,
|
|
75
|
+
examples=[{"DEBUG": "1", "LOG_LEVEL": "info"}],
|
|
76
|
+
title="Environment variables",
|
|
77
|
+
)
|
|
78
|
+
"""Additional environment variables for the command."""
|
|
79
|
+
|
|
80
|
+
def get_hook(self, event: HookEvent) -> Hook:
|
|
81
|
+
"""Create runtime command hook."""
|
|
82
|
+
from agentpool.hooks import CommandHook
|
|
83
|
+
|
|
84
|
+
return CommandHook(
|
|
85
|
+
event=event,
|
|
86
|
+
command=self.command,
|
|
87
|
+
matcher=self.matcher,
|
|
88
|
+
timeout=self.timeout,
|
|
89
|
+
enabled=self.enabled,
|
|
90
|
+
env=self.env,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class CallableHookConfig(BaseHookConfig):
|
|
95
|
+
"""Hook that executes a Python callable.
|
|
96
|
+
|
|
97
|
+
The callable receives hook input as a dictionary and should return
|
|
98
|
+
a HookResult dictionary or None.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Callable Hook"})
|
|
102
|
+
|
|
103
|
+
type: Literal["callable"] = Field("callable", init=False)
|
|
104
|
+
"""Callable hook type."""
|
|
105
|
+
|
|
106
|
+
import_path: str = Field(
|
|
107
|
+
examples=[
|
|
108
|
+
"myproject.hooks.validate_tool",
|
|
109
|
+
"myapp.security.audit_command",
|
|
110
|
+
],
|
|
111
|
+
title="Import path",
|
|
112
|
+
)
|
|
113
|
+
"""Dotted import path to the callable."""
|
|
114
|
+
|
|
115
|
+
arguments: dict[str, Any] = Field(
|
|
116
|
+
default_factory=dict,
|
|
117
|
+
examples=[{"strict": True, "allowed_paths": ["/tmp"]}],
|
|
118
|
+
title="Arguments",
|
|
119
|
+
)
|
|
120
|
+
"""Additional keyword arguments passed to the callable."""
|
|
121
|
+
|
|
122
|
+
def get_hook(self, event: HookEvent) -> Hook:
|
|
123
|
+
"""Create runtime callable hook."""
|
|
124
|
+
from agentpool.hooks import CallableHook
|
|
125
|
+
|
|
126
|
+
return CallableHook(
|
|
127
|
+
event=event,
|
|
128
|
+
fn=self.import_path,
|
|
129
|
+
matcher=self.matcher,
|
|
130
|
+
timeout=self.timeout,
|
|
131
|
+
enabled=self.enabled,
|
|
132
|
+
arguments=self.arguments,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class PromptHookConfig(BaseHookConfig):
|
|
137
|
+
"""Hook that uses an LLM to evaluate the action.
|
|
138
|
+
|
|
139
|
+
The prompt is sent to a fast LLM which returns a structured decision.
|
|
140
|
+
Use $TOOL_NAME, $TOOL_INPUT, $INPUT placeholders in the prompt.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Prompt Hook"})
|
|
144
|
+
|
|
145
|
+
type: Literal["prompt"] = Field("prompt", init=False)
|
|
146
|
+
"""Prompt-based hook type."""
|
|
147
|
+
|
|
148
|
+
prompt: str = Field(
|
|
149
|
+
examples=[
|
|
150
|
+
"Evaluate if this tool call is safe: $INPUT",
|
|
151
|
+
"Check if $TOOL_NAME with input $TOOL_INPUT follows security policies.",
|
|
152
|
+
],
|
|
153
|
+
title="Evaluation prompt",
|
|
154
|
+
)
|
|
155
|
+
"""Prompt template for LLM evaluation. Supports placeholders."""
|
|
156
|
+
|
|
157
|
+
model: str | None = Field(
|
|
158
|
+
default=None,
|
|
159
|
+
examples=["openai:gpt-4o-mini", "google-gla:gemini-2.0-flash"],
|
|
160
|
+
title="Model",
|
|
161
|
+
)
|
|
162
|
+
"""Model to use for evaluation. Defaults to a fast model if not specified."""
|
|
163
|
+
|
|
164
|
+
def get_hook(self, event: HookEvent) -> Hook:
|
|
165
|
+
"""Create runtime prompt hook."""
|
|
166
|
+
from agentpool.hooks import PromptHook
|
|
167
|
+
|
|
168
|
+
return PromptHook(
|
|
169
|
+
event=event,
|
|
170
|
+
prompt=self.prompt,
|
|
171
|
+
matcher=self.matcher,
|
|
172
|
+
timeout=self.timeout,
|
|
173
|
+
enabled=self.enabled,
|
|
174
|
+
model=self.model,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
HookConfig = Annotated[
|
|
179
|
+
CommandHookConfig | CallableHookConfig | PromptHookConfig,
|
|
180
|
+
Field(discriminator="type"),
|
|
181
|
+
]
|
|
182
|
+
"""Union of all hook configuration types."""
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class HooksConfig(Schema):
|
|
186
|
+
"""Configuration for agent lifecycle hooks.
|
|
187
|
+
|
|
188
|
+
Hooks allow intercepting and customizing agent behavior at key points
|
|
189
|
+
in the execution lifecycle. They can add context, block operations,
|
|
190
|
+
modify inputs, or trigger side effects.
|
|
191
|
+
|
|
192
|
+
Currently supported events:
|
|
193
|
+
- pre_run / post_run: Before/after agent.run() processes a prompt
|
|
194
|
+
- pre_tool_use / post_tool_use: Before/after a tool is called
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
# Message flow events
|
|
198
|
+
pre_run: list[HookConfig] = Field(
|
|
199
|
+
default_factory=list,
|
|
200
|
+
title="Pre-run hooks",
|
|
201
|
+
)
|
|
202
|
+
"""Hooks executed before agent.run() processes a prompt."""
|
|
203
|
+
|
|
204
|
+
post_run: list[HookConfig] = Field(
|
|
205
|
+
default_factory=list,
|
|
206
|
+
title="Post-run hooks",
|
|
207
|
+
)
|
|
208
|
+
"""Hooks executed after agent.run() completes."""
|
|
209
|
+
|
|
210
|
+
# Tool execution events
|
|
211
|
+
pre_tool_use: list[HookConfig] = Field(
|
|
212
|
+
default_factory=list,
|
|
213
|
+
title="Pre-tool-use hooks",
|
|
214
|
+
)
|
|
215
|
+
"""Hooks executed before a tool is called. Can block or modify the call."""
|
|
216
|
+
|
|
217
|
+
post_tool_use: list[HookConfig] = Field(
|
|
218
|
+
default_factory=list,
|
|
219
|
+
title="Post-tool-use hooks",
|
|
220
|
+
)
|
|
221
|
+
"""Hooks executed after a tool completes."""
|
|
222
|
+
|
|
223
|
+
def get_agent_hooks(self) -> AgentHooks:
|
|
224
|
+
"""Create runtime AgentHooks from this configuration.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
AgentHooks instance with all hooks instantiated.
|
|
228
|
+
"""
|
|
229
|
+
from agentpool.hooks import AgentHooks
|
|
230
|
+
|
|
231
|
+
return AgentHooks(
|
|
232
|
+
pre_run=[cfg.get_hook("pre_run") for cfg in self.pre_run],
|
|
233
|
+
post_run=[cfg.get_hook("post_run") for cfg in self.post_run],
|
|
234
|
+
pre_tool_use=[cfg.get_hook("pre_tool_use") for cfg in self.pre_tool_use],
|
|
235
|
+
post_tool_use=[cfg.get_hook("post_tool_use") for cfg in self.post_tool_use],
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
# Import for type checking only - avoid circular imports
|
|
240
|
+
if TYPE_CHECKING:
|
|
241
|
+
from agentpool.hooks import AgentHooks
|