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,122 @@
|
|
|
1
|
+
"""Prompt-based hook implementation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from string import Template
|
|
7
|
+
from typing import TYPE_CHECKING, Literal
|
|
8
|
+
|
|
9
|
+
from pydantic import Field
|
|
10
|
+
from schemez import Schema
|
|
11
|
+
|
|
12
|
+
from agentpool.hooks.base import Hook, HookResult
|
|
13
|
+
from agentpool.log import get_logger
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from agentpool.hooks.base import HookEvent, HookInput
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
logger = get_logger(__name__)
|
|
21
|
+
|
|
22
|
+
# Default fast model for hook evaluation
|
|
23
|
+
DEFAULT_HOOK_MODEL = "openai:gpt-4o-mini"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class HookDecision(Schema):
|
|
27
|
+
"""Structured response from LLM hook evaluation."""
|
|
28
|
+
|
|
29
|
+
decision: Literal["allow", "deny"]
|
|
30
|
+
"""Whether to allow or deny the action"""
|
|
31
|
+
|
|
32
|
+
reason: str = Field(default="")
|
|
33
|
+
"""Explanation for the decision"""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class PromptHook(Hook):
|
|
37
|
+
"""Hook that uses an LLM to evaluate the action.
|
|
38
|
+
|
|
39
|
+
The prompt is sent to a fast LLM which returns a structured decision.
|
|
40
|
+
Supports placeholders: $INPUT, $TOOL_NAME, $TOOL_INPUT, $AGENT_NAME, etc.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
event: HookEvent,
|
|
46
|
+
prompt: str,
|
|
47
|
+
matcher: str | None = None,
|
|
48
|
+
timeout: float = 30.0,
|
|
49
|
+
enabled: bool = True,
|
|
50
|
+
model: str | None = None,
|
|
51
|
+
):
|
|
52
|
+
"""Initialize prompt hook.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
event: The lifecycle event this hook handles.
|
|
56
|
+
prompt: Prompt template for LLM evaluation.
|
|
57
|
+
matcher: Regex pattern for matching.
|
|
58
|
+
timeout: Maximum execution time in seconds.
|
|
59
|
+
enabled: Whether this hook is active.
|
|
60
|
+
model: Model to use for evaluation. Defaults to a fast model.
|
|
61
|
+
"""
|
|
62
|
+
super().__init__(event=event, matcher=matcher, timeout=timeout, enabled=enabled)
|
|
63
|
+
self.prompt_template = prompt
|
|
64
|
+
self.model = model or DEFAULT_HOOK_MODEL
|
|
65
|
+
|
|
66
|
+
async def execute(self, input_data: HookInput) -> HookResult:
|
|
67
|
+
"""Execute the LLM evaluation.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
input_data: The hook input data.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Hook result from LLM.
|
|
74
|
+
"""
|
|
75
|
+
try:
|
|
76
|
+
prompt = self._build_prompt(input_data)
|
|
77
|
+
decision = await self._query_llm(prompt)
|
|
78
|
+
return HookResult(decision=decision.decision, reason=decision.reason)
|
|
79
|
+
except Exception as e:
|
|
80
|
+
logger.exception("Prompt hook failed")
|
|
81
|
+
return HookResult(decision="allow", reason=str(e))
|
|
82
|
+
|
|
83
|
+
def _build_prompt(self, input_data: HookInput) -> str:
|
|
84
|
+
"""Build prompt with placeholder substitutions.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
input_data: The hook input data.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Formatted prompt string.
|
|
91
|
+
"""
|
|
92
|
+
variables = {
|
|
93
|
+
"INPUT": json.dumps(dict(input_data), indent=2),
|
|
94
|
+
"TOOL_NAME": input_data.get("tool_name", ""),
|
|
95
|
+
"TOOL_INPUT": json.dumps(input_data.get("tool_input", {}), indent=2),
|
|
96
|
+
"TOOL_OUTPUT": json.dumps(input_data.get("tool_output", ""), indent=2),
|
|
97
|
+
"AGENT_NAME": input_data.get("agent_name", ""),
|
|
98
|
+
"PROMPT": input_data.get("prompt", ""),
|
|
99
|
+
"EVENT": input_data.get("event", ""),
|
|
100
|
+
}
|
|
101
|
+
template = Template(self.prompt_template)
|
|
102
|
+
return template.safe_substitute(variables)
|
|
103
|
+
|
|
104
|
+
async def _query_llm(self, prompt: str) -> HookDecision:
|
|
105
|
+
"""Query the LLM for evaluation.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
prompt: The evaluation prompt.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Structured hook decision.
|
|
112
|
+
"""
|
|
113
|
+
from pydantic_ai import Agent
|
|
114
|
+
|
|
115
|
+
agent: Agent[None, HookDecision] = Agent(
|
|
116
|
+
model=self.model,
|
|
117
|
+
system_prompt="You are a security/policy evaluation assistant. "
|
|
118
|
+
"Analyze the request and decide whether to allow or deny it.",
|
|
119
|
+
output_type=HookDecision,
|
|
120
|
+
)
|
|
121
|
+
result = await agent.run(prompt)
|
|
122
|
+
return result.output
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""Jinja filters for agentpool documentation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
import jinja2
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from collections.abc import Mapping, Sequence
|
|
12
|
+
import os
|
|
13
|
+
|
|
14
|
+
from mknodes.jinja.nodeenvironment import NodeEnvironment
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@jinja2.pass_environment
|
|
18
|
+
def pydantic_playground_url(
|
|
19
|
+
env: NodeEnvironment,
|
|
20
|
+
files: Mapping[str, str] | Sequence[str | os.PathLike[str]],
|
|
21
|
+
active_index: int = 0,
|
|
22
|
+
) -> str:
|
|
23
|
+
"""Generate a Pydantic Playground URL from files.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
env: The jinja environment (passed automatically)
|
|
27
|
+
files: Either a mapping of filenames to content, or a sequence of file paths
|
|
28
|
+
active_index: Index of the file to show as active (default: 0)
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
URL to Pydantic Playground with files pre-loaded
|
|
32
|
+
"""
|
|
33
|
+
import mknodes as mk
|
|
34
|
+
|
|
35
|
+
link = mk.MkLink.for_pydantic_playground(files, active_index=active_index)
|
|
36
|
+
return str(link.target)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@jinja2.pass_environment
|
|
40
|
+
def pydantic_playground_iframe(
|
|
41
|
+
env: NodeEnvironment,
|
|
42
|
+
files: Mapping[str, str] | Sequence[str | os.PathLike[str]],
|
|
43
|
+
width: int = 1200,
|
|
44
|
+
height: int = 900,
|
|
45
|
+
active_index: int = 0,
|
|
46
|
+
) -> str:
|
|
47
|
+
"""Generate an MkIFrame for Pydantic Playground.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
env: The jinja environment (passed automatically)
|
|
51
|
+
files: Either a mapping of filenames to content, or a sequence of file paths
|
|
52
|
+
width: Width of the iframe
|
|
53
|
+
height: Height of the iframe
|
|
54
|
+
active_index: Index of the file to show as active
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
MkIFrame node
|
|
58
|
+
"""
|
|
59
|
+
import mknodes as mk
|
|
60
|
+
|
|
61
|
+
link = mk.MkLink.for_pydantic_playground(files, active_index=active_index)
|
|
62
|
+
return str(mk.MkIFrame(str(link.target), width=width, height=height, parent=env.node))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@jinja2.pass_environment
|
|
66
|
+
def pydantic_playground_link(
|
|
67
|
+
env: NodeEnvironment,
|
|
68
|
+
files: Mapping[str, str] | Sequence[str | os.PathLike[str]],
|
|
69
|
+
title: str = "Open in Pydantic Playground",
|
|
70
|
+
active_index: int = 0,
|
|
71
|
+
as_button: bool = True,
|
|
72
|
+
) -> str:
|
|
73
|
+
"""Generate an MkLink to Pydantic Playground.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
env: The jinja environment (passed automatically)
|
|
77
|
+
files: Either a mapping of filenames to content, or a sequence of file paths
|
|
78
|
+
title: Link text
|
|
79
|
+
active_index: Index of the file to show as active
|
|
80
|
+
as_button: Whether to style as a button
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
MkLink node
|
|
84
|
+
"""
|
|
85
|
+
import mknodes as mk
|
|
86
|
+
|
|
87
|
+
link = mk.MkLink.for_pydantic_playground(
|
|
88
|
+
files, title=title, active_index=active_index, parent=env.node
|
|
89
|
+
)
|
|
90
|
+
if as_button:
|
|
91
|
+
link.as_button = True
|
|
92
|
+
return str(link)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@jinja2.pass_environment
|
|
96
|
+
def pydantic_playground(
|
|
97
|
+
env: NodeEnvironment,
|
|
98
|
+
files: Mapping[str, str] | Sequence[str | os.PathLike[str]],
|
|
99
|
+
width: int = 1200,
|
|
100
|
+
height: int = 900,
|
|
101
|
+
active_index: int = 0,
|
|
102
|
+
show_link: bool = True,
|
|
103
|
+
link_title: str = "Open in Pydantic Playground",
|
|
104
|
+
) -> str:
|
|
105
|
+
"""Generate both iframe and link for Pydantic Playground.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
env: The jinja environment (passed automatically)
|
|
109
|
+
files: Either a mapping of filenames to content, or a sequence of file paths
|
|
110
|
+
width: Width of the iframe
|
|
111
|
+
height: Height of the iframe
|
|
112
|
+
active_index: Index of the file to show as active
|
|
113
|
+
show_link: Whether to show a link below the iframe
|
|
114
|
+
link_title: Text for the link
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
MkContainer with iframe and optional link
|
|
118
|
+
"""
|
|
119
|
+
import mknodes as mk
|
|
120
|
+
|
|
121
|
+
link = mk.MkLink.for_pydantic_playground(files, active_index=active_index)
|
|
122
|
+
iframe = mk.MkIFrame(str(link.target), width=width, height=height)
|
|
123
|
+
|
|
124
|
+
if show_link:
|
|
125
|
+
button_link = mk.MkLink.for_pydantic_playground(
|
|
126
|
+
files, title=link_title, active_index=active_index
|
|
127
|
+
)
|
|
128
|
+
button_link.as_button = True
|
|
129
|
+
container = mk.MkContainer([iframe, button_link], parent=env.node)
|
|
130
|
+
return str(container)
|
|
131
|
+
container = mk.MkContainer([iframe], parent=env.node)
|
|
132
|
+
return str(container)
|
agentpool/log.py
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"""Logging configuration for agentpool with structlog support."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from contextlib import contextmanager
|
|
6
|
+
import logging
|
|
7
|
+
from logging.handlers import RotatingFileHandler
|
|
8
|
+
import sys
|
|
9
|
+
from typing import TYPE_CHECKING, Any
|
|
10
|
+
|
|
11
|
+
import logfire
|
|
12
|
+
import structlog
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from collections.abc import Iterator, Sequence
|
|
17
|
+
|
|
18
|
+
from slashed import OutputWriter
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
LogLevel = int | str
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
_LOGGING_CONFIGURED = False
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def configure_logging(
|
|
28
|
+
level: LogLevel = "INFO",
|
|
29
|
+
*,
|
|
30
|
+
use_colors: bool | None = None,
|
|
31
|
+
json_logs: bool = False,
|
|
32
|
+
force: bool = False,
|
|
33
|
+
log_file: str | None = None,
|
|
34
|
+
) -> None:
|
|
35
|
+
"""Configure structlog and standard logging.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
level: Logging level
|
|
39
|
+
use_colors: Whether to use colored output (auto-detected if None)
|
|
40
|
+
json_logs: Force JSON output regardless of TTY detection
|
|
41
|
+
force: Force reconfiguration even if already configured
|
|
42
|
+
log_file: Optional file path to write logs to instead of stderr
|
|
43
|
+
"""
|
|
44
|
+
global _LOGGING_CONFIGURED # noqa: PLW0603
|
|
45
|
+
|
|
46
|
+
if _LOGGING_CONFIGURED and not force:
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
if isinstance(level, str):
|
|
50
|
+
level = getattr(logging, level.upper())
|
|
51
|
+
|
|
52
|
+
if log_file:
|
|
53
|
+
_configure_file_logging(level, log_file)
|
|
54
|
+
else:
|
|
55
|
+
_configure_console_logging(level, use_colors=use_colors, json_logs=json_logs)
|
|
56
|
+
|
|
57
|
+
_LOGGING_CONFIGURED = True
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _configure_file_logging(level: LogLevel, log_file: str, max_lines: int = 5000) -> None:
|
|
61
|
+
"""Configure logging to write to a file with human-readable format and line-based rotation.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
level: Logging level
|
|
65
|
+
log_file: Path to log file
|
|
66
|
+
max_lines: Maximum number of lines before rotation (default: 5000)
|
|
67
|
+
"""
|
|
68
|
+
if isinstance(level, str):
|
|
69
|
+
level = getattr(logging, level.upper())
|
|
70
|
+
|
|
71
|
+
# Estimate bytes per line (assuming ~200 chars average)
|
|
72
|
+
max_bytes = max_lines * 200
|
|
73
|
+
|
|
74
|
+
# Set up rotating file handler with 3 backup files
|
|
75
|
+
handler = RotatingFileHandler(log_file, maxBytes=max_bytes, backupCount=3, encoding="utf-8")
|
|
76
|
+
handler.setFormatter(logging.Formatter("%(message)s"))
|
|
77
|
+
logging.basicConfig(level=level, handlers=[handler], force=True)
|
|
78
|
+
|
|
79
|
+
# Configure structlog processors for file output
|
|
80
|
+
processors: list[Any] = [
|
|
81
|
+
structlog.stdlib.filter_by_level,
|
|
82
|
+
structlog.stdlib.add_log_level,
|
|
83
|
+
structlog.stdlib.add_logger_name,
|
|
84
|
+
structlog.stdlib.PositionalArgumentsFormatter(),
|
|
85
|
+
structlog.processors.TimeStamper(fmt="iso"),
|
|
86
|
+
structlog.processors.StackInfoRenderer(),
|
|
87
|
+
structlog.processors.format_exc_info,
|
|
88
|
+
structlog.processors.UnicodeDecoder(),
|
|
89
|
+
logfire.StructlogProcessor(), # Capture logs for observability
|
|
90
|
+
structlog.dev.ConsoleRenderer(
|
|
91
|
+
colors=False, exception_formatter=structlog.dev.plain_traceback
|
|
92
|
+
),
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
structlog.configure(
|
|
96
|
+
processors=processors,
|
|
97
|
+
context_class=dict,
|
|
98
|
+
logger_factory=structlog.stdlib.LoggerFactory(),
|
|
99
|
+
wrapper_class=structlog.stdlib.BoundLogger,
|
|
100
|
+
cache_logger_on_first_use=True,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _configure_console_logging(
|
|
105
|
+
level: LogLevel, *, use_colors: bool | None = None, json_logs: bool = False
|
|
106
|
+
) -> None:
|
|
107
|
+
"""Configure logging to stderr with console or JSON format."""
|
|
108
|
+
if isinstance(level, str):
|
|
109
|
+
level = getattr(logging, level.upper())
|
|
110
|
+
|
|
111
|
+
# Determine output format
|
|
112
|
+
colors = sys.stderr.isatty() and not json_logs if use_colors is None else use_colors or False
|
|
113
|
+
use_console_renderer = not json_logs and (colors or sys.stderr.isatty())
|
|
114
|
+
# Configure standard logging as backend
|
|
115
|
+
handler = logging.StreamHandler(sys.stderr)
|
|
116
|
+
if use_console_renderer:
|
|
117
|
+
# For console output, don't show level in stdlib logging (structlog handles it)
|
|
118
|
+
handler.setFormatter(logging.Formatter("%(message)s"))
|
|
119
|
+
logging.basicConfig(level=level, handlers=[handler], force=True)
|
|
120
|
+
else: # For structured output, use minimal formatting
|
|
121
|
+
logging.basicConfig(level=level, handlers=[handler], force=True, format="%(message)s")
|
|
122
|
+
processors: list[Any] = [
|
|
123
|
+
structlog.stdlib.filter_by_level,
|
|
124
|
+
structlog.stdlib.add_log_level,
|
|
125
|
+
structlog.stdlib.PositionalArgumentsFormatter(),
|
|
126
|
+
structlog.processors.TimeStamper(fmt="iso"),
|
|
127
|
+
structlog.processors.StackInfoRenderer(),
|
|
128
|
+
structlog.processors.UnicodeDecoder(),
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
# Add logger name only for non-console renderers (avoid duplication with stdlib)
|
|
132
|
+
if not use_console_renderer:
|
|
133
|
+
processors.insert(1, structlog.stdlib.add_logger_name)
|
|
134
|
+
processors.append(structlog.processors.format_exc_info)
|
|
135
|
+
|
|
136
|
+
# Add logfire processor before final renderer to capture logs for observability
|
|
137
|
+
processors.append(logfire.StructlogProcessor())
|
|
138
|
+
|
|
139
|
+
# Add final renderer
|
|
140
|
+
if use_console_renderer:
|
|
141
|
+
processors.append(structlog.dev.ConsoleRenderer(colors=colors))
|
|
142
|
+
else:
|
|
143
|
+
processors.append(structlog.processors.JSONRenderer())
|
|
144
|
+
|
|
145
|
+
structlog.configure(
|
|
146
|
+
processors=processors,
|
|
147
|
+
context_class=dict,
|
|
148
|
+
logger_factory=structlog.stdlib.LoggerFactory(),
|
|
149
|
+
wrapper_class=structlog.stdlib.BoundLogger,
|
|
150
|
+
cache_logger_on_first_use=True,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def get_logger(name: str, log_level: LogLevel | None = None) -> structlog.stdlib.BoundLogger:
|
|
155
|
+
"""Get a structlog logger for the given name.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
name: The name of the logger, will be prefixed with 'agentpool.'
|
|
159
|
+
log_level: The logging level to set for the logger
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
A structlog BoundLogger instance
|
|
163
|
+
"""
|
|
164
|
+
# Ensure basic structlog configuration exists for tests
|
|
165
|
+
if not _LOGGING_CONFIGURED and not structlog.is_configured():
|
|
166
|
+
# Minimal configuration that doesn't interfere with stdio
|
|
167
|
+
structlog.configure(
|
|
168
|
+
processors=[
|
|
169
|
+
structlog.stdlib.filter_by_level,
|
|
170
|
+
structlog.stdlib.add_log_level,
|
|
171
|
+
structlog.processors.StackInfoRenderer(),
|
|
172
|
+
logfire.StructlogProcessor(),
|
|
173
|
+
structlog.dev.ConsoleRenderer(colors=False),
|
|
174
|
+
],
|
|
175
|
+
wrapper_class=structlog.stdlib.BoundLogger,
|
|
176
|
+
logger_factory=structlog.stdlib.LoggerFactory(),
|
|
177
|
+
cache_logger_on_first_use=True,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
logger = structlog.get_logger(f"agentpool.{name}")
|
|
181
|
+
if log_level is not None:
|
|
182
|
+
if isinstance(log_level, str):
|
|
183
|
+
log_level = getattr(logging, log_level.upper())
|
|
184
|
+
assert log_level
|
|
185
|
+
# Set level on underlying stdlib logger
|
|
186
|
+
stdlib_logger = logging.getLogger(f"agentpool.{name}")
|
|
187
|
+
stdlib_logger.setLevel(log_level)
|
|
188
|
+
return logger # type: ignore[no-any-return]
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@contextmanager
|
|
192
|
+
def set_handler_level(
|
|
193
|
+
level: int,
|
|
194
|
+
logger_names: Sequence[str],
|
|
195
|
+
*,
|
|
196
|
+
session_handler: OutputWriter | None = None,
|
|
197
|
+
) -> Iterator[None]:
|
|
198
|
+
"""Temporarily set logging level and optionally add session handler.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
level: Logging level to set
|
|
202
|
+
logger_names: Names of loggers to configure
|
|
203
|
+
session_handler: Optional output writer for session logging
|
|
204
|
+
"""
|
|
205
|
+
loggers = [logging.getLogger(name) for name in logger_names]
|
|
206
|
+
old_levels = [logger.level for logger in loggers]
|
|
207
|
+
|
|
208
|
+
handler = None
|
|
209
|
+
if session_handler:
|
|
210
|
+
from slashed.log import SessionLogHandler
|
|
211
|
+
|
|
212
|
+
handler = SessionLogHandler(session_handler)
|
|
213
|
+
for logger in loggers:
|
|
214
|
+
logger.addHandler(handler)
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
for logger in loggers:
|
|
218
|
+
logger.setLevel(level)
|
|
219
|
+
yield
|
|
220
|
+
finally:
|
|
221
|
+
for logger, old_level in zip(loggers, old_levels, strict=True):
|
|
222
|
+
logger.setLevel(old_level)
|
|
223
|
+
if handler:
|
|
224
|
+
logger.removeHandler(handler)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""MCP server integration for AgentPool."""
|
|
2
|
+
|
|
3
|
+
from agentpool.mcp_server.client import MCPClient
|
|
4
|
+
from agentpool.mcp_server.tool_bridge import (
|
|
5
|
+
BridgeConfig,
|
|
6
|
+
ToolBridgeRegistry,
|
|
7
|
+
ToolManagerBridge,
|
|
8
|
+
create_tool_bridge,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"BridgeConfig",
|
|
13
|
+
"MCPClient",
|
|
14
|
+
"ToolBridgeRegistry",
|
|
15
|
+
"ToolManagerBridge",
|
|
16
|
+
"create_tool_bridge",
|
|
17
|
+
]
|