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,61 @@
|
|
|
1
|
+
"""McpRun based toolset implementation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
7
|
+
|
|
8
|
+
from schemez import OpenAIFunctionDefinition
|
|
9
|
+
|
|
10
|
+
from agentpool.resource_providers import ResourceProvider
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from mcp.types import CallToolResult
|
|
15
|
+
|
|
16
|
+
from agentpool.tools.base import Tool
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class McpRunTools(ResourceProvider):
|
|
20
|
+
"""Provider for MCP.run tools."""
|
|
21
|
+
|
|
22
|
+
def __init__(self, entity_id: str, session_id: str | None = None) -> None:
|
|
23
|
+
from mcp_run import Client, ClientConfig # type: ignore[import-untyped]
|
|
24
|
+
|
|
25
|
+
super().__init__(name=entity_id)
|
|
26
|
+
id_ = session_id or os.environ.get("MCP_RUN_SESSION_ID")
|
|
27
|
+
config = ClientConfig()
|
|
28
|
+
self.client = Client(session_id=id_, config=config)
|
|
29
|
+
self._tools: list[Tool] | None = None
|
|
30
|
+
|
|
31
|
+
async def get_tools(self) -> list[Tool]:
|
|
32
|
+
"""Get tools from MCP.run."""
|
|
33
|
+
# Return cached tools if available
|
|
34
|
+
if self._tools is not None:
|
|
35
|
+
return self._tools
|
|
36
|
+
|
|
37
|
+
self._tools = []
|
|
38
|
+
for name, tool in self.client.tools.items():
|
|
39
|
+
|
|
40
|
+
async def run(tool_name: str = name, **input_dict: Any) -> CallToolResult:
|
|
41
|
+
async with self.client.mcp_sse().connect() as session:
|
|
42
|
+
return await session.call_tool(tool_name, arguments=input_dict) # type: ignore[no-any-return]
|
|
43
|
+
|
|
44
|
+
run.__name__ = name
|
|
45
|
+
wrapped_tool = self.create_tool(
|
|
46
|
+
run, schema_override=cast(OpenAIFunctionDefinition, tool.input_schema)
|
|
47
|
+
)
|
|
48
|
+
self._tools.append(wrapped_tool)
|
|
49
|
+
|
|
50
|
+
return self._tools
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == "__main__":
|
|
54
|
+
import anyio
|
|
55
|
+
|
|
56
|
+
async def main() -> None:
|
|
57
|
+
tools = McpRunTools("default")
|
|
58
|
+
fns = await tools.get_tools()
|
|
59
|
+
print(fns)
|
|
60
|
+
|
|
61
|
+
anyio.run(main)
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"""Apprise-based notifications toolset implementation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from schemez.functionschema.typedefs import OpenAIFunctionDefinition
|
|
8
|
+
|
|
9
|
+
from agentpool.log import get_logger
|
|
10
|
+
from agentpool.resource_providers import ResourceProvider
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from collections.abc import Mapping
|
|
15
|
+
|
|
16
|
+
from agentpool.tools.base import Tool
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class NotificationsTools(ResourceProvider):
|
|
23
|
+
"""Provider for Apprise-based notification tools.
|
|
24
|
+
|
|
25
|
+
Provides a send_notification tool that can send messages via
|
|
26
|
+
various notification services (Slack, Telegram, Email, etc.)
|
|
27
|
+
configured through Apprise URLs.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
channels: Mapping[str, str | list[str]],
|
|
33
|
+
name: str = "notifications",
|
|
34
|
+
) -> None:
|
|
35
|
+
"""Initialize notifications provider.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
channels: Named notification channels mapping to Apprise URL(s).
|
|
39
|
+
Values can be a single URL string or list of URLs.
|
|
40
|
+
name: Provider name
|
|
41
|
+
"""
|
|
42
|
+
import apprise
|
|
43
|
+
|
|
44
|
+
super().__init__(name=name)
|
|
45
|
+
self.channels = channels
|
|
46
|
+
self._tools: list[Tool] | None = None
|
|
47
|
+
self._apprise = apprise.Apprise()
|
|
48
|
+
for channel_name, urls in self.channels.items():
|
|
49
|
+
# Normalize to list
|
|
50
|
+
url_list = [urls] if isinstance(urls, str) else urls
|
|
51
|
+
for url in url_list:
|
|
52
|
+
# Tag each URL with the channel name for filtering
|
|
53
|
+
self._apprise.add(url, tag=channel_name)
|
|
54
|
+
logger.debug("Added notification URL", channel=channel_name, url=url[:30] + "...")
|
|
55
|
+
|
|
56
|
+
async def get_tools(self) -> list[Tool]:
|
|
57
|
+
"""Get notification tools with dynamic schema based on configured channels."""
|
|
58
|
+
if self._tools is not None:
|
|
59
|
+
return self._tools
|
|
60
|
+
|
|
61
|
+
channel_names = sorted(self.channels.keys())
|
|
62
|
+
# Build schema with enum for available channels
|
|
63
|
+
properties: dict[str, Any] = {
|
|
64
|
+
"message": {"type": "string", "description": "The notification message body"},
|
|
65
|
+
"title": {"type": "string", "description": "Optional notification title"},
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if channel_names:
|
|
69
|
+
properties["channel"] = {
|
|
70
|
+
"type": "string",
|
|
71
|
+
"enum": channel_names,
|
|
72
|
+
"description": "Send to a specific channel. If not specified, sends to all channels.", # noqa: E501
|
|
73
|
+
}
|
|
74
|
+
else:
|
|
75
|
+
properties["channel"] = {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"description": "Send to a specific channel. If not specified, sends to all channels.", # noqa: E501
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
schema_override = OpenAIFunctionDefinition(
|
|
81
|
+
name="send_notification",
|
|
82
|
+
description=(
|
|
83
|
+
"Send a notification via configured channels. "
|
|
84
|
+
"Specify a channel name to send to that channel only, "
|
|
85
|
+
"or omit to broadcast to all channels."
|
|
86
|
+
),
|
|
87
|
+
parameters={"type": "object", "properties": properties, "required": ["message"]},
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
self._tools = [
|
|
91
|
+
self.create_tool(
|
|
92
|
+
self.send_notification, schema_override=schema_override, open_world=True
|
|
93
|
+
)
|
|
94
|
+
]
|
|
95
|
+
return self._tools
|
|
96
|
+
|
|
97
|
+
async def send_notification(
|
|
98
|
+
self,
|
|
99
|
+
message: str,
|
|
100
|
+
title: str | None = None,
|
|
101
|
+
channel: str | None = None,
|
|
102
|
+
) -> dict[str, Any]:
|
|
103
|
+
"""Send a notification via configured channels.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
message: The notification message body
|
|
107
|
+
title: Optional notification title
|
|
108
|
+
channel: Send to specific channel, or all if not specified
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Result dict with success status and details
|
|
112
|
+
"""
|
|
113
|
+
if channel:
|
|
114
|
+
if channel not in self.channels:
|
|
115
|
+
return {
|
|
116
|
+
"success": False,
|
|
117
|
+
"error": f"Unknown channel: {channel}",
|
|
118
|
+
"available_channels": list(self.channels.keys()),
|
|
119
|
+
}
|
|
120
|
+
notify_tag = channel
|
|
121
|
+
target_desc = f"channel '{channel}'"
|
|
122
|
+
else:
|
|
123
|
+
notify_tag = "all"
|
|
124
|
+
target_desc = "all channels"
|
|
125
|
+
|
|
126
|
+
logger.info("Sending notification", target=target_desc, title=title, length=len(message))
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
success = self._apprise.notify(body=message, title=title or "", tag=notify_tag)
|
|
130
|
+
except Exception as e:
|
|
131
|
+
logger.exception("Failed to send notification")
|
|
132
|
+
return {"success": False, "error": str(e), "target": target_desc}
|
|
133
|
+
|
|
134
|
+
if success:
|
|
135
|
+
logger.info("Notification sent successfully", target=target_desc)
|
|
136
|
+
return {
|
|
137
|
+
"success": True,
|
|
138
|
+
"target": target_desc,
|
|
139
|
+
"message": "Notification sent successfully",
|
|
140
|
+
}
|
|
141
|
+
logger.warning("Notification may have partially failed", target=target_desc)
|
|
142
|
+
return {
|
|
143
|
+
"success": False,
|
|
144
|
+
"target": target_desc,
|
|
145
|
+
"message": "Notification delivery may have failed for some channels",
|
|
146
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""OpenAPI toolset provider."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from schemez.openapi.callable_factory import OpenAPICallableFactory
|
|
8
|
+
from schemez.openapi.loader import load_openapi_spec, parse_operations
|
|
9
|
+
from upathtools import read_path, to_upath
|
|
10
|
+
|
|
11
|
+
from agentpool.log import get_logger
|
|
12
|
+
from agentpool.resource_providers import ResourceProvider
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
import httpx
|
|
17
|
+
from upathtools import JoinablePathLike
|
|
18
|
+
|
|
19
|
+
from agentpool.tools.base import Tool
|
|
20
|
+
|
|
21
|
+
logger = get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class OpenAPITools(ResourceProvider):
|
|
25
|
+
"""Provider for OpenAPI-based tools."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
spec: JoinablePathLike,
|
|
30
|
+
base_url: str = "",
|
|
31
|
+
name: str | None = None,
|
|
32
|
+
headers: dict[str, str] | None = None,
|
|
33
|
+
) -> None:
|
|
34
|
+
super().__init__(name=name or f"openapi_{base_url}")
|
|
35
|
+
self.spec_url = spec
|
|
36
|
+
self.base_url = base_url
|
|
37
|
+
self.headers = headers or {}
|
|
38
|
+
self._client: httpx.AsyncClient | None = None
|
|
39
|
+
self._spec: dict[str, Any] | None = None
|
|
40
|
+
self._schemas: dict[str, dict[str, Any]] = {}
|
|
41
|
+
self._operations: dict[str, Any] = {}
|
|
42
|
+
self._factory: OpenAPICallableFactory | None = None
|
|
43
|
+
|
|
44
|
+
async def get_tools(self) -> list[Tool]:
|
|
45
|
+
"""Get all API operations as tools."""
|
|
46
|
+
if not self._spec:
|
|
47
|
+
await self._load_spec()
|
|
48
|
+
|
|
49
|
+
if not self._factory:
|
|
50
|
+
return []
|
|
51
|
+
|
|
52
|
+
tools = []
|
|
53
|
+
for op_id, config in self._operations.items():
|
|
54
|
+
method = self._factory.create_callable(op_id, config)
|
|
55
|
+
tool = self.create_tool(method, metadata={"operation": op_id})
|
|
56
|
+
tools.append(tool)
|
|
57
|
+
return tools
|
|
58
|
+
|
|
59
|
+
async def _load_spec(self) -> dict[str, Any]:
|
|
60
|
+
import httpx
|
|
61
|
+
|
|
62
|
+
if not self._client:
|
|
63
|
+
self._client = httpx.AsyncClient(base_url=self.base_url, headers=self.headers)
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
spec_str = str(self.spec_url)
|
|
67
|
+
if spec_str.startswith(("http://", "https://")):
|
|
68
|
+
self._spec = load_openapi_spec(spec_str)
|
|
69
|
+
else:
|
|
70
|
+
path = to_upath(self.spec_url)
|
|
71
|
+
if path.exists():
|
|
72
|
+
self._spec = load_openapi_spec(path)
|
|
73
|
+
else:
|
|
74
|
+
# Try reading via upathtools for remote/special paths
|
|
75
|
+
content = await read_path(self.spec_url)
|
|
76
|
+
import tempfile
|
|
77
|
+
|
|
78
|
+
with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f:
|
|
79
|
+
f.write(content)
|
|
80
|
+
temp_path = f.name
|
|
81
|
+
try:
|
|
82
|
+
self._spec = load_openapi_spec(temp_path)
|
|
83
|
+
finally:
|
|
84
|
+
to_upath(temp_path).unlink(missing_ok=True)
|
|
85
|
+
|
|
86
|
+
if not self._spec:
|
|
87
|
+
msg = f"Empty or invalid OpenAPI spec from {self.spec_url}"
|
|
88
|
+
raise ValueError(msg) # noqa: TRY301
|
|
89
|
+
|
|
90
|
+
self._schemas = self._spec.get("components", {}).get("schemas", {})
|
|
91
|
+
self._operations = parse_operations(self._spec.get("paths", {}))
|
|
92
|
+
self._factory = OpenAPICallableFactory(self._schemas, self._make_request)
|
|
93
|
+
|
|
94
|
+
if not self._operations:
|
|
95
|
+
logger.warning("No operations found in spec %s.", self.spec_url)
|
|
96
|
+
|
|
97
|
+
except Exception as e:
|
|
98
|
+
msg = f"Failed to load OpenAPI spec from {self.spec_url}"
|
|
99
|
+
raise ValueError(msg) from e
|
|
100
|
+
else:
|
|
101
|
+
return self._spec
|
|
102
|
+
|
|
103
|
+
async def _make_request(
|
|
104
|
+
self,
|
|
105
|
+
method: str,
|
|
106
|
+
path: str,
|
|
107
|
+
params: dict[str, Any],
|
|
108
|
+
body: dict[str, Any] | None,
|
|
109
|
+
) -> dict[str, Any]:
|
|
110
|
+
"""Perform HTTP request to the API."""
|
|
111
|
+
if not self._client:
|
|
112
|
+
import httpx
|
|
113
|
+
|
|
114
|
+
self._client = httpx.AsyncClient(base_url=self.base_url, headers=self.headers)
|
|
115
|
+
|
|
116
|
+
response = await self._client.request(method=method, url=path, params=params, json=body)
|
|
117
|
+
response.raise_for_status()
|
|
118
|
+
return response.json() # type: ignore[no-any-return]
|
|
File without changes
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"""Search toolset implementation using searchly providers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from agentpool.log import get_logger
|
|
8
|
+
from agentpool.resource_providers import ResourceProvider
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from searchly.base import (
|
|
13
|
+
CountryCode,
|
|
14
|
+
LanguageCode,
|
|
15
|
+
NewsSearchProvider,
|
|
16
|
+
NewsSearchResponse,
|
|
17
|
+
WebSearchProvider,
|
|
18
|
+
WebSearchResponse,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from agentpool.agents.context import AgentContext
|
|
22
|
+
from agentpool.tools.base import Tool
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = get_logger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def format_web_results(response: WebSearchResponse, query: str) -> str:
|
|
29
|
+
"""Format web search results as markdown."""
|
|
30
|
+
if not response.results:
|
|
31
|
+
return f"No results found for: {query}"
|
|
32
|
+
|
|
33
|
+
lines = [f"## Web Search Results for: {query}\n"]
|
|
34
|
+
for i, result in enumerate(response.results, 1):
|
|
35
|
+
lines.append(f"### {i}. [{result.title}]({result.url})")
|
|
36
|
+
lines.append(f"{result.snippet}\n")
|
|
37
|
+
return "\n".join(lines)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def format_news_results(response: NewsSearchResponse, query: str) -> str:
|
|
41
|
+
"""Format news search results as markdown."""
|
|
42
|
+
if not response.results:
|
|
43
|
+
return f"No news results found for: {query}"
|
|
44
|
+
|
|
45
|
+
lines = [f"## News Search Results for: {query}\n"]
|
|
46
|
+
for i, result in enumerate(response.results, 1):
|
|
47
|
+
# Build header with source/date if available
|
|
48
|
+
header = f"### {i}. [{result.title}]({result.url})"
|
|
49
|
+
lines.append(header)
|
|
50
|
+
|
|
51
|
+
meta_parts = []
|
|
52
|
+
if result.source:
|
|
53
|
+
meta_parts.append(f"*{result.source}*")
|
|
54
|
+
if result.published:
|
|
55
|
+
meta_parts.append(f"({result.published})")
|
|
56
|
+
if meta_parts:
|
|
57
|
+
lines.append(" ".join(meta_parts))
|
|
58
|
+
|
|
59
|
+
lines.append(f"{result.snippet}\n")
|
|
60
|
+
return "\n".join(lines)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class SearchTools(ResourceProvider):
|
|
64
|
+
"""Provider for web and news search tools."""
|
|
65
|
+
|
|
66
|
+
def __init__(
|
|
67
|
+
self,
|
|
68
|
+
web_search: WebSearchProvider | None = None,
|
|
69
|
+
news_search: NewsSearchProvider | None = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
"""Initialize search tools provider.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
web_search: Web search provider instance.
|
|
75
|
+
news_search: News search provider instance.
|
|
76
|
+
"""
|
|
77
|
+
super().__init__(name="search")
|
|
78
|
+
self._web_provider = web_search
|
|
79
|
+
self._news_provider = news_search
|
|
80
|
+
|
|
81
|
+
async def web_search( # noqa: D417
|
|
82
|
+
self,
|
|
83
|
+
agent_ctx: AgentContext,
|
|
84
|
+
query: str,
|
|
85
|
+
*,
|
|
86
|
+
max_results: int = 10,
|
|
87
|
+
country: CountryCode | None = None,
|
|
88
|
+
language: LanguageCode | None = None,
|
|
89
|
+
**kwargs: Any,
|
|
90
|
+
) -> str:
|
|
91
|
+
"""Search the web for information.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
query: Search query string.
|
|
95
|
+
max_results: Maximum number of results to return.
|
|
96
|
+
country: Country code for regional results.
|
|
97
|
+
language: Language code for results.
|
|
98
|
+
**kwargs: Provider-specific options.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
Formatted markdown search results.
|
|
102
|
+
"""
|
|
103
|
+
from agentpool.agents.events import TextContentItem
|
|
104
|
+
|
|
105
|
+
assert self._web_provider is not None
|
|
106
|
+
|
|
107
|
+
await agent_ctx.events.tool_call_progress(
|
|
108
|
+
title=f"Searching: {query}",
|
|
109
|
+
items=[TextContentItem(text=f"Searching web for: {query}")],
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
response = await self._web_provider.web_search(
|
|
113
|
+
query,
|
|
114
|
+
max_results=max_results,
|
|
115
|
+
country=country,
|
|
116
|
+
language=language,
|
|
117
|
+
**kwargs,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
result_count = len(response.results)
|
|
121
|
+
formatted = format_web_results(response, query)
|
|
122
|
+
|
|
123
|
+
await agent_ctx.events.tool_call_progress(
|
|
124
|
+
title=f"Found {result_count} results",
|
|
125
|
+
items=[TextContentItem(text=formatted)],
|
|
126
|
+
replace_content=True,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
return formatted
|
|
130
|
+
|
|
131
|
+
async def news_search( # noqa: D417
|
|
132
|
+
self,
|
|
133
|
+
agent_ctx: AgentContext,
|
|
134
|
+
query: str,
|
|
135
|
+
*,
|
|
136
|
+
max_results: int = 10,
|
|
137
|
+
country: CountryCode | None = None,
|
|
138
|
+
language: LanguageCode | None = None,
|
|
139
|
+
**kwargs: Any,
|
|
140
|
+
) -> str:
|
|
141
|
+
"""Search for news articles.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
query: Search query string.
|
|
145
|
+
max_results: Maximum number of results to return.
|
|
146
|
+
country: Country code for regional results.
|
|
147
|
+
language: Language code for results.
|
|
148
|
+
**kwargs: Provider-specific options.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Formatted markdown news results.
|
|
152
|
+
"""
|
|
153
|
+
from agentpool.agents.events import TextContentItem
|
|
154
|
+
|
|
155
|
+
assert self._news_provider is not None
|
|
156
|
+
|
|
157
|
+
await agent_ctx.events.tool_call_progress(
|
|
158
|
+
title=f"Searching news: {query}",
|
|
159
|
+
items=[TextContentItem(text=f"Searching news for: {query}")],
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
response = await self._news_provider.news_search(
|
|
163
|
+
query,
|
|
164
|
+
max_results=max_results,
|
|
165
|
+
country=country,
|
|
166
|
+
language=language,
|
|
167
|
+
**kwargs,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
result_count = len(response.results)
|
|
171
|
+
formatted = format_news_results(response, query)
|
|
172
|
+
|
|
173
|
+
await agent_ctx.events.tool_call_progress(
|
|
174
|
+
title=f"Found {result_count} articles",
|
|
175
|
+
items=[TextContentItem(text=formatted)],
|
|
176
|
+
replace_content=True,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
return formatted
|
|
180
|
+
|
|
181
|
+
async def get_tools(self) -> list[Tool]:
|
|
182
|
+
"""Get search tools from configured providers."""
|
|
183
|
+
tools: list[Tool] = []
|
|
184
|
+
if self._web_provider:
|
|
185
|
+
tools.append(
|
|
186
|
+
self.create_tool(
|
|
187
|
+
self.web_search,
|
|
188
|
+
read_only=True,
|
|
189
|
+
idempotent=True,
|
|
190
|
+
open_world=True,
|
|
191
|
+
)
|
|
192
|
+
)
|
|
193
|
+
if self._news_provider:
|
|
194
|
+
tools.append(
|
|
195
|
+
self.create_tool(
|
|
196
|
+
self.news_search,
|
|
197
|
+
read_only=True,
|
|
198
|
+
idempotent=True,
|
|
199
|
+
open_world=True,
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
return tools
|