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,17 @@
|
|
|
1
|
+
"""Resource provider implementations."""
|
|
2
|
+
|
|
3
|
+
from agentpool.resource_providers.base import ResourceProvider
|
|
4
|
+
from agentpool.resource_providers.static import StaticResourceProvider
|
|
5
|
+
from agentpool.resource_providers.filtering import FilteringResourceProvider
|
|
6
|
+
from agentpool.resource_providers.aggregating import AggregatingResourceProvider
|
|
7
|
+
from agentpool.resource_providers.mcp_provider import MCPResourceProvider
|
|
8
|
+
from agentpool.resource_providers.plan_provider import PlanProvider
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"AggregatingResourceProvider",
|
|
12
|
+
"FilteringResourceProvider",
|
|
13
|
+
"MCPResourceProvider",
|
|
14
|
+
"PlanProvider",
|
|
15
|
+
"ResourceProvider",
|
|
16
|
+
"StaticResourceProvider",
|
|
17
|
+
]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Aggregating resource provider."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from agentpool.resource_providers import ResourceProvider
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from pydantic_ai import ModelRequestPart
|
|
12
|
+
|
|
13
|
+
from agentpool.prompts.prompts import BasePrompt
|
|
14
|
+
from agentpool.tools.base import Tool
|
|
15
|
+
from agentpool_config.resources import ResourceInfo
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AggregatingResourceProvider(ResourceProvider):
|
|
19
|
+
"""Provider that combines resources from multiple providers."""
|
|
20
|
+
|
|
21
|
+
def __init__(self, providers: list[ResourceProvider], name: str = "aggregating") -> None:
|
|
22
|
+
"""Initialize provider with list of providers to aggregate.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
providers: Resource providers to aggregate (stores reference to list)
|
|
26
|
+
name: Name for this provider
|
|
27
|
+
"""
|
|
28
|
+
super().__init__(name=name)
|
|
29
|
+
# Store reference to the providers list for dynamic updates
|
|
30
|
+
self.providers = providers
|
|
31
|
+
|
|
32
|
+
async def get_tools(self) -> list[Tool]:
|
|
33
|
+
"""Get tools from all providers."""
|
|
34
|
+
return [t for provider in self.providers for t in await provider.get_tools()]
|
|
35
|
+
|
|
36
|
+
async def get_prompts(self) -> list[BasePrompt]:
|
|
37
|
+
"""Get prompts from all providers."""
|
|
38
|
+
return [p for provider in self.providers for p in await provider.get_prompts()]
|
|
39
|
+
|
|
40
|
+
async def get_resources(self) -> list[ResourceInfo]:
|
|
41
|
+
"""Get resources from all providers."""
|
|
42
|
+
return [r for provider in self.providers for r in await provider.get_resources()]
|
|
43
|
+
|
|
44
|
+
async def get_request_parts(
|
|
45
|
+
self, name: str, arguments: dict[str, str] | None = None
|
|
46
|
+
) -> list[ModelRequestPart]:
|
|
47
|
+
"""Try to get prompt from first provider that has it."""
|
|
48
|
+
for provider in self.providers:
|
|
49
|
+
try:
|
|
50
|
+
return await provider.get_request_parts(name, arguments)
|
|
51
|
+
except KeyError:
|
|
52
|
+
continue
|
|
53
|
+
msg = f"Prompt {name!r} not found in any provider"
|
|
54
|
+
raise KeyError(msg)
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""Base resource provider interface."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
6
|
+
|
|
7
|
+
from agentpool.log import get_logger
|
|
8
|
+
from agentpool.tools.base import Tool
|
|
9
|
+
from agentpool_config.tools import ToolHints
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from collections.abc import Callable
|
|
14
|
+
from types import TracebackType
|
|
15
|
+
|
|
16
|
+
from pydantic_ai import ModelRequestPart
|
|
17
|
+
from schemez import OpenAIFunctionDefinition
|
|
18
|
+
|
|
19
|
+
from agentpool.prompts.prompts import BasePrompt
|
|
20
|
+
from agentpool.skills.skill import Skill
|
|
21
|
+
from agentpool.tools.base import ToolKind
|
|
22
|
+
from agentpool_config.resources import ResourceInfo
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = get_logger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ResourceProvider:
|
|
29
|
+
"""Base class for resource providers.
|
|
30
|
+
|
|
31
|
+
Provides tools, prompts, and other resources to agents.
|
|
32
|
+
Default implementations return empty lists - override as needed.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(self, name: str, owner: str | None = None) -> None:
|
|
36
|
+
"""Initialize the resource provider."""
|
|
37
|
+
self.name = name
|
|
38
|
+
self.owner = owner
|
|
39
|
+
self.log = logger.bind(name=self.name, owner=self.owner)
|
|
40
|
+
|
|
41
|
+
async def __aenter__(self) -> Self:
|
|
42
|
+
"""Async context entry if required."""
|
|
43
|
+
return self
|
|
44
|
+
|
|
45
|
+
async def __aexit__(
|
|
46
|
+
self,
|
|
47
|
+
exc_type: type[BaseException] | None,
|
|
48
|
+
exc_val: BaseException | None,
|
|
49
|
+
exc_tb: TracebackType | None,
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Async context cleanup if required."""
|
|
52
|
+
|
|
53
|
+
def __repr__(self) -> str:
|
|
54
|
+
return f"{self.__class__.__name__}(name={self.name!r})"
|
|
55
|
+
|
|
56
|
+
async def get_tools(self) -> list[Tool]:
|
|
57
|
+
"""Get available tools. Override to provide tools."""
|
|
58
|
+
return []
|
|
59
|
+
|
|
60
|
+
async def get_tool(self, tool_name: str) -> Tool:
|
|
61
|
+
"""Get specific tool."""
|
|
62
|
+
tools = await self.get_tools()
|
|
63
|
+
for tool in tools:
|
|
64
|
+
if tool.name == tool_name:
|
|
65
|
+
return tool
|
|
66
|
+
msg = f"Tool {tool_name!r} not found"
|
|
67
|
+
raise ValueError(msg)
|
|
68
|
+
|
|
69
|
+
async def get_prompts(self) -> list[BasePrompt]:
|
|
70
|
+
"""Get available prompts. Override to provide prompts."""
|
|
71
|
+
return []
|
|
72
|
+
|
|
73
|
+
async def get_resources(self) -> list[ResourceInfo]:
|
|
74
|
+
"""Get available resources. Override to provide resources."""
|
|
75
|
+
return []
|
|
76
|
+
|
|
77
|
+
async def get_skills(self) -> list[Skill]:
|
|
78
|
+
"""Get available skills. Override to provide skills."""
|
|
79
|
+
return []
|
|
80
|
+
|
|
81
|
+
async def get_skill_instructions(self, skill_name: str) -> str:
|
|
82
|
+
"""Get full instructions for a specific skill.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
skill_name: Name of the skill to get instructions for
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
The full skill instructions for execution
|
|
89
|
+
|
|
90
|
+
Raises:
|
|
91
|
+
KeyError: If skill not found
|
|
92
|
+
"""
|
|
93
|
+
msg = f"Skill {skill_name!r} not found"
|
|
94
|
+
raise KeyError(msg)
|
|
95
|
+
|
|
96
|
+
async def get_request_parts(
|
|
97
|
+
self, name: str, arguments: dict[str, str] | None = None
|
|
98
|
+
) -> list[ModelRequestPart]:
|
|
99
|
+
"""Get a prompt formatted with arguments.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
name: Name of the prompt to format
|
|
103
|
+
arguments: Optional arguments for prompt formatting
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Single chat message with merged content
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
KeyError: If prompt not found
|
|
110
|
+
ValueError: If formatting fails
|
|
111
|
+
"""
|
|
112
|
+
prompts = await self.get_prompts()
|
|
113
|
+
prompt = next((p for p in prompts if p.name == name), None)
|
|
114
|
+
if not prompt:
|
|
115
|
+
msg = f"Prompt {name!r} not found"
|
|
116
|
+
raise KeyError(msg)
|
|
117
|
+
|
|
118
|
+
messages = await prompt.format(arguments or {})
|
|
119
|
+
if not messages:
|
|
120
|
+
msg = f"Prompt {name!r} produced no messages"
|
|
121
|
+
raise ValueError(msg)
|
|
122
|
+
|
|
123
|
+
return [p for prompt_msg in messages for p in prompt_msg.to_pydantic_parts()]
|
|
124
|
+
|
|
125
|
+
def create_tool(
|
|
126
|
+
self,
|
|
127
|
+
fn: Callable[..., Any],
|
|
128
|
+
read_only: bool | None = None,
|
|
129
|
+
destructive: bool | None = None,
|
|
130
|
+
idempotent: bool | None = None,
|
|
131
|
+
open_world: bool | None = None,
|
|
132
|
+
requires_confirmation: bool = False,
|
|
133
|
+
metadata: dict[str, Any] | None = None,
|
|
134
|
+
category: ToolKind | None = None,
|
|
135
|
+
name_override: str | None = None,
|
|
136
|
+
description_override: str | None = None,
|
|
137
|
+
schema_override: OpenAIFunctionDefinition | None = None,
|
|
138
|
+
) -> Tool:
|
|
139
|
+
"""Create a tool from a function.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
fn: Function to create a tool from
|
|
143
|
+
read_only: Whether the tool is read-only
|
|
144
|
+
destructive: Whether the tool is destructive
|
|
145
|
+
idempotent: Whether the tool is idempotent
|
|
146
|
+
open_world: Whether the tool is open-world
|
|
147
|
+
requires_confirmation: Whether the tool requires confirmation
|
|
148
|
+
metadata: Metadata for the tool
|
|
149
|
+
category: Category of the tool
|
|
150
|
+
name_override: Override the name of the tool
|
|
151
|
+
description_override: Override the description of the tool
|
|
152
|
+
schema_override: Override the schema of the tool
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Tool created from the function
|
|
156
|
+
"""
|
|
157
|
+
return Tool.from_callable(
|
|
158
|
+
fn=fn,
|
|
159
|
+
category=category,
|
|
160
|
+
source=self.name,
|
|
161
|
+
requires_confirmation=requires_confirmation,
|
|
162
|
+
metadata=metadata,
|
|
163
|
+
name_override=name_override,
|
|
164
|
+
description_override=description_override,
|
|
165
|
+
schema_override=schema_override,
|
|
166
|
+
hints=ToolHints(
|
|
167
|
+
read_only=read_only,
|
|
168
|
+
destructive=destructive,
|
|
169
|
+
idempotent=idempotent,
|
|
170
|
+
open_world=open_world,
|
|
171
|
+
),
|
|
172
|
+
)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Meta-resource provider that exposes tools through Python execution."""
|
|
2
|
+
|
|
3
|
+
from agentpool.resource_providers.codemode.provider import CodeModeResourceProvider
|
|
4
|
+
from agentpool.resource_providers.codemode.remote_provider import (
|
|
5
|
+
RemoteCodeModeResourceProvider,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
__all__ = ["CodeModeResourceProvider", "RemoteCodeModeResourceProvider"]
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""Code execution provider with secure tool isolation via FastAPI server."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import contextlib
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
9
|
+
|
|
10
|
+
import anyio
|
|
11
|
+
|
|
12
|
+
from agentpool.log import get_logger
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from collections.abc import Sequence
|
|
17
|
+
import socket
|
|
18
|
+
from types import TracebackType
|
|
19
|
+
|
|
20
|
+
from exxec.base import ExecutionEnvironment
|
|
21
|
+
from exxec.configs import ExecutionEnvironmentConfig
|
|
22
|
+
from exxec.models import ServerInfo
|
|
23
|
+
from fastapi import FastAPI
|
|
24
|
+
from schemez import ToolsetCodeGenerator
|
|
25
|
+
import uvicorn
|
|
26
|
+
|
|
27
|
+
from agentpool.tools.base import Tool
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
logger = get_logger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class RemoteCodeExecutor:
|
|
35
|
+
"""Provides secure code execution with tool access via FastAPI server.
|
|
36
|
+
|
|
37
|
+
Architecture:
|
|
38
|
+
- FastAPI server runs in HOST environment with tool routes
|
|
39
|
+
- User code runs in SANDBOX environment (Docker, E2B, etc.)
|
|
40
|
+
- Sandbox makes HTTP calls to server for tool execution
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
toolset_generator: ToolsetCodeGenerator
|
|
44
|
+
"""Code generator for tools."""
|
|
45
|
+
|
|
46
|
+
execution_env: ExecutionEnvironment
|
|
47
|
+
"""Execution environment for running code."""
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def from_tools(
|
|
51
|
+
cls,
|
|
52
|
+
tools: Sequence[Tool],
|
|
53
|
+
env_config: ExecutionEnvironmentConfig,
|
|
54
|
+
server_host: str = "localhost",
|
|
55
|
+
server_port: int = 8000,
|
|
56
|
+
include_docstrings: bool = True,
|
|
57
|
+
) -> RemoteCodeExecutor:
|
|
58
|
+
"""Create provider from tools and environment configuration.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
tools: Tools to make available for code execution
|
|
62
|
+
env_config: Execution environment configuration
|
|
63
|
+
server_host: Host for FastAPI server
|
|
64
|
+
server_port: Port for FastAPI server
|
|
65
|
+
include_docstrings: Include function docstrings in documentation
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
RemoteCodeExecutor instance
|
|
69
|
+
"""
|
|
70
|
+
from agentpool.resource_providers.codemode.helpers import tools_to_codegen
|
|
71
|
+
|
|
72
|
+
toolset_gen = tools_to_codegen(tools, include_docstrings)
|
|
73
|
+
server_handler = ToolServerLifecycleHandler(toolset_gen, server_host, server_port)
|
|
74
|
+
execution_env = env_config.get_provider(server_handler)
|
|
75
|
+
return cls(toolset_gen, execution_env)
|
|
76
|
+
|
|
77
|
+
def get_tool_description(self) -> str:
|
|
78
|
+
"""Get comprehensive description of available tools."""
|
|
79
|
+
return self.toolset_generator.generate_tool_description()
|
|
80
|
+
|
|
81
|
+
async def execute_code(self, code: str) -> Any:
|
|
82
|
+
"""Execute code with tools available via HTTP API.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
code: Python code to execute
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Execution result from the environment
|
|
89
|
+
"""
|
|
90
|
+
return await self.execution_env.execute(code)
|
|
91
|
+
|
|
92
|
+
async def __aenter__(self) -> Self:
|
|
93
|
+
"""Async context manager entry."""
|
|
94
|
+
await self.execution_env.__aenter__()
|
|
95
|
+
return self
|
|
96
|
+
|
|
97
|
+
async def __aexit__(
|
|
98
|
+
self,
|
|
99
|
+
exc_type: type[BaseException] | None,
|
|
100
|
+
exc_val: BaseException | None,
|
|
101
|
+
exc_tb: TracebackType | None,
|
|
102
|
+
) -> None:
|
|
103
|
+
"""Async context manager exit."""
|
|
104
|
+
return await self.execution_env.__aexit__(exc_type, exc_val, exc_tb)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class ToolServerLifecycleHandler:
|
|
108
|
+
"""Manages FastAPI server lifecycle for tool access."""
|
|
109
|
+
|
|
110
|
+
def __init__(
|
|
111
|
+
self,
|
|
112
|
+
toolset_generator: ToolsetCodeGenerator,
|
|
113
|
+
host: str = "localhost",
|
|
114
|
+
port: int = 8000,
|
|
115
|
+
) -> None:
|
|
116
|
+
self.toolset_generator = toolset_generator
|
|
117
|
+
self.host = host
|
|
118
|
+
self.port = port # Will be set when socket is created
|
|
119
|
+
self.app: FastAPI | None = None
|
|
120
|
+
self.server: uvicorn.Server | None = None
|
|
121
|
+
self._server_task: asyncio.Task[None] | None = None
|
|
122
|
+
self._socket: socket.socket | None = None
|
|
123
|
+
|
|
124
|
+
async def __aenter__(self) -> ServerInfo:
|
|
125
|
+
"""Start FastAPI server with tool routes."""
|
|
126
|
+
from exxec.models import ServerInfo
|
|
127
|
+
from fastapi import FastAPI
|
|
128
|
+
|
|
129
|
+
from agentpool.utils.network import _create_socket
|
|
130
|
+
|
|
131
|
+
if self.server is not None:
|
|
132
|
+
return ServerInfo(url=f"http://{self.host}:{self.port}", port=self.port)
|
|
133
|
+
# Create socket and get actual port
|
|
134
|
+
self._socket, self.port = _create_socket(self.port)
|
|
135
|
+
# Create FastAPI app
|
|
136
|
+
self.app = FastAPI(title="Tool Server", description="Generated tool endpoints")
|
|
137
|
+
|
|
138
|
+
# Add tool routes
|
|
139
|
+
self.toolset_generator.add_all_routes(self.app, "/tools")
|
|
140
|
+
|
|
141
|
+
import uvicorn
|
|
142
|
+
|
|
143
|
+
config = uvicorn.Config(
|
|
144
|
+
self.app,
|
|
145
|
+
log_level="error", # Reduce log noise
|
|
146
|
+
access_log=False,
|
|
147
|
+
host=self.host,
|
|
148
|
+
port=self.port,
|
|
149
|
+
ws="websockets-sansio",
|
|
150
|
+
)
|
|
151
|
+
self.server = uvicorn.Server(config)
|
|
152
|
+
|
|
153
|
+
# Start server in background with our socket
|
|
154
|
+
self._server_task = asyncio.create_task(self.server.serve([self._socket]))
|
|
155
|
+
logger.info("Started tool server", host=self.host, port=self.port)
|
|
156
|
+
await anyio.sleep(0.1) # Wait for server to start properly
|
|
157
|
+
# Verify server is running
|
|
158
|
+
max_retries = 10
|
|
159
|
+
for _ in range(max_retries):
|
|
160
|
+
if self.server.started:
|
|
161
|
+
break
|
|
162
|
+
await anyio.sleep(0.1)
|
|
163
|
+
|
|
164
|
+
return ServerInfo(url=f"http://{self.host}:{self.port}", port=self.port)
|
|
165
|
+
|
|
166
|
+
async def __aexit__(
|
|
167
|
+
self,
|
|
168
|
+
exc_type: type[BaseException] | None,
|
|
169
|
+
exc_val: BaseException | None,
|
|
170
|
+
exc_tb: TracebackType | None,
|
|
171
|
+
) -> None:
|
|
172
|
+
"""Stop FastAPI server."""
|
|
173
|
+
# Stop server gracefully
|
|
174
|
+
if self.server:
|
|
175
|
+
with contextlib.suppress(Exception):
|
|
176
|
+
self.server.should_exit = True
|
|
177
|
+
if hasattr(self.server, "force_exit"):
|
|
178
|
+
self.server.force_exit = True
|
|
179
|
+
|
|
180
|
+
# Cancel server task
|
|
181
|
+
if self._server_task and not self._server_task.done():
|
|
182
|
+
self._server_task.cancel()
|
|
183
|
+
with contextlib.suppress(asyncio.CancelledError, Exception):
|
|
184
|
+
await asyncio.wait_for(self._server_task, timeout=1.0)
|
|
185
|
+
|
|
186
|
+
# Close socket
|
|
187
|
+
if self._socket:
|
|
188
|
+
with contextlib.suppress(Exception):
|
|
189
|
+
self._socket.close()
|
|
190
|
+
|
|
191
|
+
# Reset state
|
|
192
|
+
self.server = None
|
|
193
|
+
self._server_task = None
|
|
194
|
+
self._socket = None
|
|
195
|
+
self.app = None
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
if __name__ == "__main__":
|
|
199
|
+
from exxec.configs import LocalExecutionEnvironmentConfig
|
|
200
|
+
|
|
201
|
+
from agentpool.tools.base import Tool
|
|
202
|
+
|
|
203
|
+
def add_numbers(x: int, y: int) -> int:
|
|
204
|
+
"""Add two numbers."""
|
|
205
|
+
return x + y
|
|
206
|
+
|
|
207
|
+
async def main() -> None:
|
|
208
|
+
tools = [Tool.from_callable(add_numbers)]
|
|
209
|
+
config = LocalExecutionEnvironmentConfig()
|
|
210
|
+
provider = RemoteCodeExecutor.from_tools(tools, config, server_port=9876)
|
|
211
|
+
async with provider:
|
|
212
|
+
result = await provider.execute_code("_result = await add_numbers(5, 3)")
|
|
213
|
+
print(f"Result: {result.result}")
|
|
214
|
+
|
|
215
|
+
anyio.run(main)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
USAGE = """
|
|
5
|
+
A tool to execute python code.
|
|
6
|
+
You can (and should) use the provided stubs as async function calls
|
|
7
|
+
if you need to.
|
|
8
|
+
Write an async main function which returns the result if neccessary.
|
|
9
|
+
DONT write placeholders. DONT run the function yourself. just write the function.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
async def main():
|
|
13
|
+
result_1 = await provided_function()
|
|
14
|
+
result_2 = await provided_function_2("some_arg")
|
|
15
|
+
return result_1 + result_2
|
|
16
|
+
|
|
17
|
+
You may also use loops, conditionals etc. if neccessary.
|
|
18
|
+
|
|
19
|
+
"""
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Prepare LLM output to be in proper shape and executable."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import ast
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from agentpool.log import get_logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from collections.abc import Sequence
|
|
13
|
+
|
|
14
|
+
from schemez import ToolsetCodeGenerator
|
|
15
|
+
|
|
16
|
+
from agentpool.tools import Tool
|
|
17
|
+
|
|
18
|
+
logger = get_logger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def validate_code(python_code: str) -> None:
|
|
22
|
+
"""Validate code structure and raise ModelRetry for fixable issues."""
|
|
23
|
+
from pydantic_ai import ModelRetry
|
|
24
|
+
|
|
25
|
+
code = python_code.strip()
|
|
26
|
+
try:
|
|
27
|
+
ast.parse(code)
|
|
28
|
+
except SyntaxError as e:
|
|
29
|
+
msg = f"Invalid code syntax: {e}"
|
|
30
|
+
logger.info("Invalid code", code=code)
|
|
31
|
+
raise ModelRetry(msg) from None
|
|
32
|
+
else:
|
|
33
|
+
if "async def main(" not in code:
|
|
34
|
+
logger.info("Code not in async def main()", code=code)
|
|
35
|
+
msg = (
|
|
36
|
+
"Code must be wrapped in 'async def main():' function. "
|
|
37
|
+
"Please rewrite your code like:\n"
|
|
38
|
+
"async def main():\n"
|
|
39
|
+
" # your code here\n"
|
|
40
|
+
" return result"
|
|
41
|
+
)
|
|
42
|
+
raise ModelRetry(msg)
|
|
43
|
+
|
|
44
|
+
# Check if code contains a return statement
|
|
45
|
+
if "return " not in code:
|
|
46
|
+
logger.info("Code does not contain a return statement", code=code)
|
|
47
|
+
msg = "The main() function should return a value."
|
|
48
|
+
raise ModelRetry(msg)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def tools_to_codegen(
|
|
52
|
+
tools: Sequence[Tool],
|
|
53
|
+
include_docstrings: bool = True,
|
|
54
|
+
) -> ToolsetCodeGenerator:
|
|
55
|
+
"""Create a ToolsetCodeGenerator from a sequence of Tools.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
tools: Tools to generate code for
|
|
59
|
+
include_docstrings: Include function docstrings in documentation
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
ToolsetCodeGenerator instance
|
|
63
|
+
"""
|
|
64
|
+
from pydantic_ai import RunContext
|
|
65
|
+
from schemez import ToolCodeGenerator, ToolsetCodeGenerator, create_schema
|
|
66
|
+
|
|
67
|
+
from agentpool.agents.context import AgentContext
|
|
68
|
+
|
|
69
|
+
generators = [
|
|
70
|
+
ToolCodeGenerator(
|
|
71
|
+
schema=create_schema(
|
|
72
|
+
t.callable,
|
|
73
|
+
name_override=t.name,
|
|
74
|
+
description_override=t.description,
|
|
75
|
+
mode="openai",
|
|
76
|
+
exclude_types=[AgentContext, RunContext],
|
|
77
|
+
),
|
|
78
|
+
callable=t.callable,
|
|
79
|
+
name_override=t.name,
|
|
80
|
+
)
|
|
81
|
+
for t in tools
|
|
82
|
+
]
|
|
83
|
+
return ToolsetCodeGenerator(generators, include_docstrings)
|