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,98 @@
|
|
|
1
|
+
"""OpenAI-compatible API server for AgentPool."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal, TypedDict
|
|
6
|
+
|
|
7
|
+
from pydantic import Field
|
|
8
|
+
from schemez import Schema
|
|
9
|
+
|
|
10
|
+
from agentpool.log import get_logger
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
logger = get_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CompletionUsage(TypedDict):
|
|
17
|
+
"""Token usage information."""
|
|
18
|
+
|
|
19
|
+
input_tokens: int
|
|
20
|
+
output_tokens: int
|
|
21
|
+
total_tokens: int
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class OpenAIModelInfo(Schema):
|
|
25
|
+
"""OpenAI model info format."""
|
|
26
|
+
|
|
27
|
+
id: str
|
|
28
|
+
object: str = "model"
|
|
29
|
+
owned_by: str = "agentpool"
|
|
30
|
+
created: int
|
|
31
|
+
description: str | None = None
|
|
32
|
+
permissions: list[str] = Field(default_factory=list)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class FunctionCall(Schema):
|
|
36
|
+
"""Function call information."""
|
|
37
|
+
|
|
38
|
+
name: str
|
|
39
|
+
arguments: str
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class ToolCall(Schema):
|
|
43
|
+
"""Tool call information."""
|
|
44
|
+
|
|
45
|
+
id: str
|
|
46
|
+
type: str = "function"
|
|
47
|
+
function: FunctionCall
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class OpenAIMessage(Schema):
|
|
51
|
+
"""OpenAI chat message format."""
|
|
52
|
+
|
|
53
|
+
role: Literal["system", "user", "assistant", "tool", "function"]
|
|
54
|
+
content: str | None # Content can be null in function calls
|
|
55
|
+
name: str | None = None
|
|
56
|
+
function_call: FunctionCall | None = None
|
|
57
|
+
tool_calls: list[ToolCall] | None = None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class ChatCompletionRequest(Schema):
|
|
61
|
+
"""OpenAI chat completion request."""
|
|
62
|
+
|
|
63
|
+
model: str
|
|
64
|
+
messages: list[OpenAIMessage]
|
|
65
|
+
stream: bool = False
|
|
66
|
+
temperature: float | None = None
|
|
67
|
+
max_tokens: int | None = None
|
|
68
|
+
tools: list[dict[str, Any]] | None = None
|
|
69
|
+
tool_choice: str | None = Field(default="auto")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class Choice(Schema):
|
|
73
|
+
"""Choice in a completion response."""
|
|
74
|
+
|
|
75
|
+
index: int = 0
|
|
76
|
+
message: OpenAIMessage
|
|
77
|
+
finish_reason: str = "stop"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class ChatCompletionResponse(Schema):
|
|
81
|
+
"""OpenAI chat completion response."""
|
|
82
|
+
|
|
83
|
+
id: str
|
|
84
|
+
object: str = "chat.completion"
|
|
85
|
+
created: int
|
|
86
|
+
model: str
|
|
87
|
+
choices: list[Choice]
|
|
88
|
+
usage: CompletionUsage | None = None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class ChatCompletionChunk(Schema):
|
|
92
|
+
"""Chunk of a streaming chat completion."""
|
|
93
|
+
|
|
94
|
+
id: str
|
|
95
|
+
object: str = "chat.completion.chunk"
|
|
96
|
+
created: int
|
|
97
|
+
model: str
|
|
98
|
+
choices: list[dict[str, Any]]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Responses API."""
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""OpenAI-compatible responses endpoint."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
|
|
8
|
+
from agentpool_server.openai_api_server.responses.models import (
|
|
9
|
+
Response,
|
|
10
|
+
ResponseMessage,
|
|
11
|
+
ResponseOutputText,
|
|
12
|
+
ResponseToolCall,
|
|
13
|
+
ResponseUsage,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from agentpool.agents import Agent
|
|
19
|
+
from agentpool.agents.acp_agent import ACPAgent
|
|
20
|
+
from agentpool_server.openai_api_server.responses.models import ResponseRequest
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
async def handle_request(request: ResponseRequest, agent: Agent[Any, Any] | ACPAgent) -> Response:
|
|
24
|
+
from fastapi import HTTPException
|
|
25
|
+
|
|
26
|
+
match request.input:
|
|
27
|
+
case str():
|
|
28
|
+
content = request.input
|
|
29
|
+
case list():
|
|
30
|
+
# Get last text content from structured input
|
|
31
|
+
last = request.input[-1]["content"]
|
|
32
|
+
text_parts = [p["text"] for p in last if p["type"] == "input_text"]
|
|
33
|
+
content = "\n".join(text_parts)
|
|
34
|
+
case _:
|
|
35
|
+
raise HTTPException(400, "Invalid input format")
|
|
36
|
+
|
|
37
|
+
message = await agent.run(content)
|
|
38
|
+
text = ResponseOutputText(text=str(message.content))
|
|
39
|
+
output_msg_id = f"msg_{uuid4().hex}"
|
|
40
|
+
output_msg = ResponseMessage(id=output_msg_id, role="assistant", content=[text])
|
|
41
|
+
output: list[ResponseMessage | ResponseToolCall] = [output_msg]
|
|
42
|
+
|
|
43
|
+
calls = [
|
|
44
|
+
ResponseToolCall(type=f"{tc.tool_name}_call", id=tc.tool_call_id)
|
|
45
|
+
for tc in message.get_tool_calls()
|
|
46
|
+
]
|
|
47
|
+
output = calls + output # type: ignore
|
|
48
|
+
|
|
49
|
+
usage_info: ResponseUsage | None = None
|
|
50
|
+
if message.cost_info and (token_usage := message.cost_info.token_usage):
|
|
51
|
+
# Map the keys correctly from agent's dict to ResponseUsage TypedDict
|
|
52
|
+
input_tk = token_usage.input_tokens
|
|
53
|
+
output_tk = token_usage.output_tokens
|
|
54
|
+
total_tk = token_usage.total_tokens
|
|
55
|
+
|
|
56
|
+
usage_info = ResponseUsage(
|
|
57
|
+
input_tokens=input_tk,
|
|
58
|
+
input_tokens_details={},
|
|
59
|
+
output_tokens=output_tk,
|
|
60
|
+
output_tokens_details={},
|
|
61
|
+
total_tokens=total_tk,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return Response(
|
|
65
|
+
model=request.model,
|
|
66
|
+
output=output,
|
|
67
|
+
instructions=request.instructions,
|
|
68
|
+
max_output_tokens=request.max_output_tokens,
|
|
69
|
+
temperature=request.temperature,
|
|
70
|
+
tools=request.tools,
|
|
71
|
+
tool_choice=request.tool_choice,
|
|
72
|
+
usage=usage_info,
|
|
73
|
+
metadata=request.metadata,
|
|
74
|
+
)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Models for OpenAI responses endpoint."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from typing import Any, Literal, TypedDict
|
|
8
|
+
from uuid import uuid4
|
|
9
|
+
|
|
10
|
+
from pydantic import Field
|
|
11
|
+
from schemez import Schema
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class InputText(Schema):
|
|
15
|
+
"""Text input part."""
|
|
16
|
+
|
|
17
|
+
type: Literal["input_text"] = "input_text"
|
|
18
|
+
text: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class InputImage(Schema):
|
|
22
|
+
"""Image input part."""
|
|
23
|
+
|
|
24
|
+
type: Literal["input_image"] = "input_image"
|
|
25
|
+
image_url: str
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ResponseOutputText(Schema):
|
|
29
|
+
"""Text output part."""
|
|
30
|
+
|
|
31
|
+
type: Literal["output_text"] = "output_text"
|
|
32
|
+
text: str
|
|
33
|
+
annotations: list[dict[str, Any]] = Field(default_factory=list)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ResponseToolCall(Schema):
|
|
37
|
+
"""Tool call in response."""
|
|
38
|
+
|
|
39
|
+
type: str # web_search_call etc
|
|
40
|
+
id: str
|
|
41
|
+
status: Literal["completed", "error"] = "completed"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ResponseMessage(Schema):
|
|
45
|
+
"""ResponseMessage in response."""
|
|
46
|
+
|
|
47
|
+
type: Literal["message"] = "message"
|
|
48
|
+
id: str
|
|
49
|
+
status: Literal["completed", "error"] = "completed"
|
|
50
|
+
role: Literal["user", "assistant", "system"]
|
|
51
|
+
content: list[ResponseOutputText]
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ResponseUsage(TypedDict):
|
|
55
|
+
"""Token usage information."""
|
|
56
|
+
|
|
57
|
+
input_tokens: int
|
|
58
|
+
input_tokens_details: dict[str, int]
|
|
59
|
+
output_tokens: int
|
|
60
|
+
output_tokens_details: dict[str, int]
|
|
61
|
+
total_tokens: int
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ResponseRequest(Schema):
|
|
65
|
+
"""Request for /v1/responses endpoint."""
|
|
66
|
+
|
|
67
|
+
model: str
|
|
68
|
+
input: str | list[dict[str, Any]]
|
|
69
|
+
instructions: str | None = None
|
|
70
|
+
stream: bool = False
|
|
71
|
+
temperature: float = 1.0
|
|
72
|
+
tools: list[dict[str, Any]] = Field(default_factory=list)
|
|
73
|
+
tool_choice: str = "auto"
|
|
74
|
+
max_output_tokens: int | None = None
|
|
75
|
+
metadata: dict[str, str] = Field(default_factory=dict)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class Response(Schema):
|
|
79
|
+
"""Response from /v1/responses endpoint."""
|
|
80
|
+
|
|
81
|
+
id: str = Field(default_factory=lambda: f"resp_{uuid4().hex}")
|
|
82
|
+
object: Literal["response"] = "response"
|
|
83
|
+
created_at: int = Field(default_factory=lambda: int(datetime.now().timestamp()))
|
|
84
|
+
status: Literal["completed", "error"] = "completed"
|
|
85
|
+
error: str | None = None
|
|
86
|
+
model: str
|
|
87
|
+
output: Sequence[ResponseMessage | ResponseToolCall]
|
|
88
|
+
|
|
89
|
+
# Include all the request parameters
|
|
90
|
+
instructions: str | None = None
|
|
91
|
+
max_output_tokens: int | None = None
|
|
92
|
+
temperature: float = 1.0
|
|
93
|
+
tools: list[dict[str, Any]] = Field(default_factory=list)
|
|
94
|
+
tool_choice: str = "auto"
|
|
95
|
+
usage: ResponseUsage | None = None
|
|
96
|
+
metadata: dict[str, str] = Field(default_factory=dict)
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"""OpenAI-compatible API server for AgentPool."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Annotated, Any
|
|
6
|
+
|
|
7
|
+
import anyenv
|
|
8
|
+
|
|
9
|
+
from agentpool.log import get_logger
|
|
10
|
+
from agentpool_server import BaseServer
|
|
11
|
+
from agentpool_server.openai_api_server.completions.helpers import stream_response
|
|
12
|
+
from agentpool_server.openai_api_server.completions.models import (
|
|
13
|
+
ChatCompletionResponse,
|
|
14
|
+
Choice,
|
|
15
|
+
OpenAIMessage,
|
|
16
|
+
OpenAIModelInfo,
|
|
17
|
+
)
|
|
18
|
+
from agentpool_server.openai_api_server.responses.helpers import handle_request
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from fastapi import Header, Response
|
|
23
|
+
|
|
24
|
+
from agentpool import AgentPool
|
|
25
|
+
from agentpool_server.openai_api_server.completions.models import ChatCompletionRequest
|
|
26
|
+
from agentpool_server.openai_api_server.responses.models import (
|
|
27
|
+
Response as ResponsesResponse,
|
|
28
|
+
ResponseRequest,
|
|
29
|
+
)
|
|
30
|
+
logger = get_logger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class OpenAIAPIServer(BaseServer):
|
|
34
|
+
"""OpenAI-compatible API server backed by AgentPool.
|
|
35
|
+
|
|
36
|
+
Provides both chat completions and responses endpoints.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(
|
|
40
|
+
self,
|
|
41
|
+
pool: AgentPool,
|
|
42
|
+
*,
|
|
43
|
+
name: str | None = None,
|
|
44
|
+
host: str = "0.0.0.0",
|
|
45
|
+
port: int = 8000,
|
|
46
|
+
cors: bool = True,
|
|
47
|
+
docs: bool = True,
|
|
48
|
+
api_key: str | None = None,
|
|
49
|
+
raise_exceptions: bool = False,
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Initialize OpenAI-compatible server.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
pool: AgentPool containing available agents
|
|
55
|
+
name: Optional Server name (auto-generated if None)
|
|
56
|
+
host: Host to bind server to
|
|
57
|
+
port: Port to bind server to
|
|
58
|
+
cors: Whether to enable CORS middleware
|
|
59
|
+
docs: Whether to enable API documentation endpoints
|
|
60
|
+
api_key: Optional API key for authentication
|
|
61
|
+
raise_exceptions: Whether to raise exceptions during server start
|
|
62
|
+
"""
|
|
63
|
+
from fastapi import Depends, FastAPI
|
|
64
|
+
import logfire
|
|
65
|
+
|
|
66
|
+
super().__init__(pool, name=name, raise_exceptions=raise_exceptions)
|
|
67
|
+
self.host = host
|
|
68
|
+
self.port = port
|
|
69
|
+
self.api_key = api_key
|
|
70
|
+
self.app = FastAPI()
|
|
71
|
+
logfire.instrument_fastapi(self.app)
|
|
72
|
+
|
|
73
|
+
if cors:
|
|
74
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
75
|
+
|
|
76
|
+
self.app.add_middleware(
|
|
77
|
+
CORSMiddleware,
|
|
78
|
+
allow_origins=["*"],
|
|
79
|
+
allow_credentials=True,
|
|
80
|
+
allow_methods=["*"],
|
|
81
|
+
allow_headers=["*"],
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
if not docs:
|
|
85
|
+
self.app.docs_url = None
|
|
86
|
+
self.app.redoc_url = None
|
|
87
|
+
|
|
88
|
+
# Add routes with authentication dependency
|
|
89
|
+
dep = Depends(self.verify_api_key)
|
|
90
|
+
self.app.get("/v1/models")(self.list_models)
|
|
91
|
+
self.app.post("/v1/chat/completions", dependencies=[dep], response_model=None)(
|
|
92
|
+
self.create_chat_completion
|
|
93
|
+
)
|
|
94
|
+
self.app.post("/v1/responses", dependencies=[dep])(self.create_response)
|
|
95
|
+
|
|
96
|
+
def verify_api_key(
|
|
97
|
+
self, authorization: Annotated[str | None, Header(alias="Authorization")] = None
|
|
98
|
+
) -> None:
|
|
99
|
+
"""Verify API key if configured."""
|
|
100
|
+
from fastapi import HTTPException
|
|
101
|
+
|
|
102
|
+
if not authorization:
|
|
103
|
+
raise HTTPException(401, "Missing API key")
|
|
104
|
+
if not authorization.startswith("Bearer "):
|
|
105
|
+
raise HTTPException(401, "Invalid authorization format")
|
|
106
|
+
if self.api_key and authorization != f"Bearer {self.api_key}":
|
|
107
|
+
raise HTTPException(401, "Invalid API key")
|
|
108
|
+
|
|
109
|
+
async def list_models(self) -> dict[str, Any]:
|
|
110
|
+
"""List available agents as models."""
|
|
111
|
+
models = []
|
|
112
|
+
for name, agent in self.pool.all_agents.items():
|
|
113
|
+
info = OpenAIModelInfo(id=name, created=0, description=agent.description)
|
|
114
|
+
models.append(info)
|
|
115
|
+
return {"object": "list", "data": models}
|
|
116
|
+
|
|
117
|
+
async def create_chat_completion(self, request: ChatCompletionRequest) -> Response:
|
|
118
|
+
"""Handle chat completion requests."""
|
|
119
|
+
from fastapi import HTTPException, Response
|
|
120
|
+
from fastapi.responses import StreamingResponse
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
agent = self.pool.all_agents[request.model]
|
|
124
|
+
except KeyError:
|
|
125
|
+
raise HTTPException(404, f"Model {request.model} not found") from None
|
|
126
|
+
|
|
127
|
+
# Just take the last message content - let agent handle history
|
|
128
|
+
content = request.messages[-1].content or ""
|
|
129
|
+
if request.stream:
|
|
130
|
+
return StreamingResponse(
|
|
131
|
+
stream_response(agent, content, request),
|
|
132
|
+
media_type="text/event-stream",
|
|
133
|
+
)
|
|
134
|
+
try:
|
|
135
|
+
response = await agent.run(content)
|
|
136
|
+
message = OpenAIMessage(role="assistant", content=str(response.content))
|
|
137
|
+
completion_response = ChatCompletionResponse(
|
|
138
|
+
id=response.message_id,
|
|
139
|
+
created=int(response.timestamp.timestamp()),
|
|
140
|
+
model=request.model,
|
|
141
|
+
choices=[Choice(message=message)],
|
|
142
|
+
usage=response.cost_info.token_usage if response.cost_info else None, # pyright: ignore
|
|
143
|
+
)
|
|
144
|
+
json = completion_response.model_dump_json()
|
|
145
|
+
return Response(content=json, media_type="application/json")
|
|
146
|
+
except Exception as e:
|
|
147
|
+
self.log.exception("Error processing chat completion")
|
|
148
|
+
raise HTTPException(500, f"Error: {e!s}") from e
|
|
149
|
+
|
|
150
|
+
async def create_response(self, req_body: ResponseRequest) -> ResponsesResponse:
|
|
151
|
+
"""Handle response creation requests."""
|
|
152
|
+
from fastapi import HTTPException
|
|
153
|
+
|
|
154
|
+
try:
|
|
155
|
+
agent = self.pool.agents[req_body.model]
|
|
156
|
+
return await handle_request(req_body, agent)
|
|
157
|
+
except KeyError:
|
|
158
|
+
raise HTTPException(404, f"Model {req_body.model} not found") from None
|
|
159
|
+
except Exception as e:
|
|
160
|
+
raise HTTPException(500, str(e)) from e
|
|
161
|
+
|
|
162
|
+
async def _start_async(self) -> None:
|
|
163
|
+
"""Start the server (blocking async - runs until stopped)."""
|
|
164
|
+
import uvicorn
|
|
165
|
+
|
|
166
|
+
config = uvicorn.Config(
|
|
167
|
+
self.app,
|
|
168
|
+
host=self.host,
|
|
169
|
+
port=self.port,
|
|
170
|
+
log_level="info",
|
|
171
|
+
ws="websockets-sansio",
|
|
172
|
+
)
|
|
173
|
+
server = uvicorn.Server(config)
|
|
174
|
+
await server.serve()
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
if __name__ == "__main__":
|
|
178
|
+
import anyio
|
|
179
|
+
import httpx
|
|
180
|
+
|
|
181
|
+
from agentpool import AgentPool
|
|
182
|
+
|
|
183
|
+
async def test_completions() -> None:
|
|
184
|
+
"""Test the chat completions API."""
|
|
185
|
+
async with httpx.AsyncClient() as client:
|
|
186
|
+
response = await client.post(
|
|
187
|
+
"http://localhost:8000/v1/chat/completions",
|
|
188
|
+
headers={"Authorization": "Bearer dummy"},
|
|
189
|
+
json={
|
|
190
|
+
"model": "gpt-5-mini",
|
|
191
|
+
"messages": [{"role": "user", "content": "Tell me a joke"}],
|
|
192
|
+
"stream": True,
|
|
193
|
+
},
|
|
194
|
+
timeout=30.0,
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
if response.is_success:
|
|
198
|
+
for line in response.iter_lines():
|
|
199
|
+
if line.startswith("data: "):
|
|
200
|
+
data = line[6:] # Remove "data: " prefix
|
|
201
|
+
if data == "[DONE]":
|
|
202
|
+
break
|
|
203
|
+
chunk = anyenv.load_json(data, return_type=dict)
|
|
204
|
+
delta = chunk["choices"][0]["delta"]
|
|
205
|
+
if "content" in delta:
|
|
206
|
+
print(delta["content"], end="", flush=True)
|
|
207
|
+
print("\n")
|
|
208
|
+
else:
|
|
209
|
+
print("Completions error:", response.text)
|
|
210
|
+
|
|
211
|
+
async def test_responses() -> None:
|
|
212
|
+
"""Test the responses API."""
|
|
213
|
+
timeout = httpx.Timeout(30.0, connect=5.0)
|
|
214
|
+
async with httpx.AsyncClient(timeout=timeout) as client:
|
|
215
|
+
response = await client.post(
|
|
216
|
+
"http://localhost:8000/v1/responses",
|
|
217
|
+
headers={"Authorization": "Bearer dummy"},
|
|
218
|
+
json={
|
|
219
|
+
"model": "gpt-5-mini",
|
|
220
|
+
"input": "Tell me a three sentence bedtime story about a unicorn.",
|
|
221
|
+
},
|
|
222
|
+
)
|
|
223
|
+
print("Responses result:", response.text)
|
|
224
|
+
|
|
225
|
+
if not response.is_success:
|
|
226
|
+
print("Responses error:", response.text)
|
|
227
|
+
|
|
228
|
+
async def main() -> None:
|
|
229
|
+
"""Run server and test both endpoints."""
|
|
230
|
+
pool = AgentPool()
|
|
231
|
+
await pool.add_agent("gpt-5-mini", model="openai:gpt-5-mini")
|
|
232
|
+
async with (
|
|
233
|
+
OpenAIAPIServer(pool, host="0.0.0.0", port=8000) as server,
|
|
234
|
+
server.run_context(),
|
|
235
|
+
):
|
|
236
|
+
await anyio.sleep(1) # Wait for server to start
|
|
237
|
+
print("Testing completions endpoint...")
|
|
238
|
+
await test_completions()
|
|
239
|
+
print("\nTesting responses endpoint...")
|
|
240
|
+
await test_responses()
|
|
241
|
+
|
|
242
|
+
anyio.run(main)
|
|
File without changes
|