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,119 @@
|
|
|
1
|
+
"""Memory configuration for agent memory and history handling."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Literal, Self
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from pydantic import ConfigDict, Field
|
|
9
|
+
from schemez import Schema
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
MessageRole = Literal["user", "assistant"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class MemoryConfig(Schema):
|
|
20
|
+
"""Configuration for agent memory and history handling."""
|
|
21
|
+
|
|
22
|
+
enable: bool = Field(default=True, title="Enable memory")
|
|
23
|
+
"""Whether to enable history tracking."""
|
|
24
|
+
|
|
25
|
+
max_tokens: int | None = Field(
|
|
26
|
+
default=None,
|
|
27
|
+
examples=[1000, 4000, 8000],
|
|
28
|
+
title="Maximum context tokens",
|
|
29
|
+
)
|
|
30
|
+
"""Maximum number of tokens to keep in context window."""
|
|
31
|
+
|
|
32
|
+
max_messages: int | None = Field(
|
|
33
|
+
default=None,
|
|
34
|
+
examples=[10, 50, 100],
|
|
35
|
+
title="Maximum message count",
|
|
36
|
+
)
|
|
37
|
+
"""Maximum number of messages to keep in context window."""
|
|
38
|
+
|
|
39
|
+
session: SessionQuery | None = Field(default=None, title="Session query")
|
|
40
|
+
"""Query configuration for loading previous session."""
|
|
41
|
+
|
|
42
|
+
provider: str | None = Field(
|
|
43
|
+
default=None,
|
|
44
|
+
examples=["sqlite", "memory", "file"],
|
|
45
|
+
title="Storage provider",
|
|
46
|
+
)
|
|
47
|
+
"""Override default storage provider for this agent.
|
|
48
|
+
If None, uses manifest's default provider or first available."""
|
|
49
|
+
|
|
50
|
+
model_config = ConfigDict(frozen=True)
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def from_value(cls, value: bool | int | str | SessionQuery | UUID | None) -> Self:
|
|
54
|
+
"""Create MemoryConfig from any value."""
|
|
55
|
+
match value:
|
|
56
|
+
case False:
|
|
57
|
+
return cls(max_messages=0)
|
|
58
|
+
case int():
|
|
59
|
+
return cls(max_tokens=value)
|
|
60
|
+
case str() | UUID():
|
|
61
|
+
return cls(session=SessionQuery(name=str(value)))
|
|
62
|
+
case SessionQuery():
|
|
63
|
+
return cls(session=value)
|
|
64
|
+
case None | True:
|
|
65
|
+
return cls()
|
|
66
|
+
case _:
|
|
67
|
+
raise ValueError(f"Invalid memory configuration: type: {value}")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class SessionQuery(Schema):
|
|
71
|
+
"""Query configuration for session recovery."""
|
|
72
|
+
|
|
73
|
+
name: str | None = Field(
|
|
74
|
+
default=None,
|
|
75
|
+
examples=["main_session", "user_123", "conversation_01"],
|
|
76
|
+
title="Session name",
|
|
77
|
+
)
|
|
78
|
+
"""Session identifier to match."""
|
|
79
|
+
|
|
80
|
+
agents: set[str] | None = Field(default=None, title="Agent filter")
|
|
81
|
+
"""Filter by agent names."""
|
|
82
|
+
|
|
83
|
+
since: str | None = Field(
|
|
84
|
+
default=None,
|
|
85
|
+
examples=["1h", "2d", "1w"],
|
|
86
|
+
title="Time period lookback",
|
|
87
|
+
)
|
|
88
|
+
"""Time period to look back (e.g. "1h", "2d")."""
|
|
89
|
+
|
|
90
|
+
until: str | None = Field(default=None, examples=["1h", "2d", "1w"], title="Time period limit")
|
|
91
|
+
"""Time period to look up to."""
|
|
92
|
+
|
|
93
|
+
contains: str | None = Field(
|
|
94
|
+
default=None,
|
|
95
|
+
examples=["error", "important", "task completed"],
|
|
96
|
+
title="Content filter",
|
|
97
|
+
)
|
|
98
|
+
"""Filter by message content."""
|
|
99
|
+
|
|
100
|
+
roles: set[MessageRole] | None = Field(default=None, title="Role filter")
|
|
101
|
+
"""Only include specific message roles."""
|
|
102
|
+
|
|
103
|
+
limit: int | None = Field(default=None, examples=[10, 50, 100], title="Message limit")
|
|
104
|
+
"""Maximum number of messages to return."""
|
|
105
|
+
|
|
106
|
+
include_forwarded: bool = Field(default=True, title="Include forwarded messages")
|
|
107
|
+
"""Whether to include messages forwarded through agents."""
|
|
108
|
+
|
|
109
|
+
model_config = ConfigDict(frozen=True)
|
|
110
|
+
|
|
111
|
+
def get_time_cutoff(self) -> datetime | None:
|
|
112
|
+
"""Get datetime from time period string."""
|
|
113
|
+
from agentpool.utils.now import get_now
|
|
114
|
+
from agentpool.utils.parse_time import parse_time_period
|
|
115
|
+
|
|
116
|
+
if not self.since:
|
|
117
|
+
return None
|
|
118
|
+
delta = parse_time_period(self.since)
|
|
119
|
+
return get_now() - delta
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Skills configuration."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class Skill:
|
|
8
|
+
"""Skill configuration."""
|
|
9
|
+
|
|
10
|
+
url: str
|
|
11
|
+
name: str
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
dev_browser = Skill(
|
|
15
|
+
url="https://github.com/SawyerHood/dev-browser/tree/main/skills/dev-browser",
|
|
16
|
+
name="dev-browser",
|
|
17
|
+
)
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""Storage configuration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import TYPE_CHECKING, Annotated, Final, Literal
|
|
8
|
+
|
|
9
|
+
from platformdirs import user_data_dir
|
|
10
|
+
from pydantic import ConfigDict, Field
|
|
11
|
+
from schemez import Schema
|
|
12
|
+
from tokonomics.model_names import ModelId
|
|
13
|
+
from yamling import FormatType
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
18
|
+
|
|
19
|
+
from agentpool.sessions.store import SessionStore
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
LogFormat = Literal["chronological", "conversations"]
|
|
23
|
+
FilterMode = Literal["and", "override"]
|
|
24
|
+
|
|
25
|
+
APP_NAME: Final = "agentpool"
|
|
26
|
+
APP_AUTHOR: Final = "agentpool"
|
|
27
|
+
DATA_DIR: Final = Path(user_data_dir(APP_NAME, APP_AUTHOR))
|
|
28
|
+
DEFAULT_DB_NAME: Final = "history.db"
|
|
29
|
+
DEFAULT_TITLE_PROMPT: Final = """\
|
|
30
|
+
Generate a short, descriptive title (3-7 words) for this request. \
|
|
31
|
+
Only respond with the title, nothing else."""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_database_path() -> str:
|
|
35
|
+
"""Get the database file path, creating directories if needed."""
|
|
36
|
+
db_path = DATA_DIR / DEFAULT_DB_NAME
|
|
37
|
+
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
return f"sqlite:///{db_path}"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class BaseStorageProviderConfig(Schema):
|
|
42
|
+
"""Base storage provider configuration."""
|
|
43
|
+
|
|
44
|
+
type: str = Field(init=False)
|
|
45
|
+
"""Storage provider type."""
|
|
46
|
+
|
|
47
|
+
log_messages: bool = Field(default=True, title="Log messages")
|
|
48
|
+
"""Whether to log messages"""
|
|
49
|
+
|
|
50
|
+
agents: set[str] | None = Field(default=None, title="Agent filter")
|
|
51
|
+
"""Optional set of agent names to include. If None, logs all agents."""
|
|
52
|
+
|
|
53
|
+
log_conversations: bool = Field(default=True, title="Log conversations")
|
|
54
|
+
"""Whether to log conversations"""
|
|
55
|
+
|
|
56
|
+
log_commands: bool = Field(default=True, title="Log commands")
|
|
57
|
+
"""Whether to log command executions"""
|
|
58
|
+
|
|
59
|
+
log_context: bool = Field(default=True, title="Log context")
|
|
60
|
+
"""Whether to log context messages."""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class SQLStorageConfig(BaseStorageProviderConfig):
|
|
64
|
+
"""SQL database storage configuration."""
|
|
65
|
+
|
|
66
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "SQL Storage"})
|
|
67
|
+
|
|
68
|
+
type: Literal["sql"] = Field("sql", init=False)
|
|
69
|
+
"""SQLModel storage configuration."""
|
|
70
|
+
|
|
71
|
+
url: str = Field(
|
|
72
|
+
default_factory=get_database_path,
|
|
73
|
+
examples=["sqlite:///history.db", "postgresql://user:pass@localhost/db"],
|
|
74
|
+
title="Database URL",
|
|
75
|
+
)
|
|
76
|
+
"""Database URL (e.g. sqlite:///history.db)"""
|
|
77
|
+
|
|
78
|
+
pool_size: int = Field(
|
|
79
|
+
default=5,
|
|
80
|
+
ge=1,
|
|
81
|
+
examples=[5, 10, 20],
|
|
82
|
+
title="Connection pool size",
|
|
83
|
+
)
|
|
84
|
+
"""Connection pool size"""
|
|
85
|
+
|
|
86
|
+
auto_migration: bool = Field(default=True, title="Auto migration")
|
|
87
|
+
"""Whether to automatically add missing columns"""
|
|
88
|
+
|
|
89
|
+
def get_engine(self) -> AsyncEngine:
|
|
90
|
+
from sqlalchemy.ext.asyncio import create_async_engine
|
|
91
|
+
|
|
92
|
+
# Convert URL to async format
|
|
93
|
+
url_str = str(self.url)
|
|
94
|
+
if url_str.startswith("sqlite://"):
|
|
95
|
+
url_str = url_str.replace("sqlite://", "sqlite+aiosqlite://", 1)
|
|
96
|
+
elif url_str.startswith("postgresql://"):
|
|
97
|
+
url_str = url_str.replace("postgresql://", "postgresql+asyncpg://", 1)
|
|
98
|
+
elif url_str.startswith("mysql://"):
|
|
99
|
+
url_str = url_str.replace("mysql://", "mysql+aiomysql://", 1)
|
|
100
|
+
|
|
101
|
+
# SQLite doesn't support pool_size parameter
|
|
102
|
+
if url_str.startswith("sqlite+aiosqlite://"):
|
|
103
|
+
return create_async_engine(url_str)
|
|
104
|
+
return create_async_engine(url_str, pool_size=self.pool_size)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class TextLogConfig(BaseStorageProviderConfig):
|
|
108
|
+
"""Text log configuration."""
|
|
109
|
+
|
|
110
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Text Log"})
|
|
111
|
+
|
|
112
|
+
type: Literal["text_file"] = Field("text_file", init=False)
|
|
113
|
+
"""Text log storage configuration."""
|
|
114
|
+
|
|
115
|
+
path: str = Field(
|
|
116
|
+
examples=["/var/log/agent.log", "~/logs/conversations.txt"],
|
|
117
|
+
title="Log file path",
|
|
118
|
+
)
|
|
119
|
+
"""Path to log file"""
|
|
120
|
+
|
|
121
|
+
format: LogFormat = Field(
|
|
122
|
+
default="chronological",
|
|
123
|
+
examples=["chronological", "conversations"],
|
|
124
|
+
title="Log format",
|
|
125
|
+
)
|
|
126
|
+
"""Log format template to use"""
|
|
127
|
+
|
|
128
|
+
template: Literal["chronological", "conversations"] | str | None = Field( # noqa: PYI051
|
|
129
|
+
default="chronological",
|
|
130
|
+
examples=["chronological", "conversations", "/path/to/template.j2"],
|
|
131
|
+
title="Template",
|
|
132
|
+
)
|
|
133
|
+
"""Template to use: either predefined name or path to custom template"""
|
|
134
|
+
|
|
135
|
+
encoding: str = Field(default="utf-8", examples=["utf-8", "ascii"], title="File encoding")
|
|
136
|
+
"""File encoding"""
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class FileStorageConfig(BaseStorageProviderConfig):
|
|
140
|
+
"""File storage configuration."""
|
|
141
|
+
|
|
142
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "File Storage"})
|
|
143
|
+
|
|
144
|
+
type: Literal["file"] = Field("file", init=False)
|
|
145
|
+
"""File storage configuration."""
|
|
146
|
+
|
|
147
|
+
path: str = Field(
|
|
148
|
+
examples=["/data/storage.json", "~/agent_data.yaml"],
|
|
149
|
+
title="Storage file path",
|
|
150
|
+
)
|
|
151
|
+
"""Path to storage file (extension determines format unless specified)"""
|
|
152
|
+
|
|
153
|
+
format: FormatType = Field(
|
|
154
|
+
default="auto",
|
|
155
|
+
examples=["auto", "json", "yaml", "toml"],
|
|
156
|
+
title="Storage format",
|
|
157
|
+
)
|
|
158
|
+
"""Storage format (auto=detect from extension)"""
|
|
159
|
+
|
|
160
|
+
encoding: str = Field(default="utf-8", examples=["utf-8", "ascii"], title="File encoding")
|
|
161
|
+
"""File encoding of the storage file."""
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class MemoryStorageConfig(BaseStorageProviderConfig):
|
|
165
|
+
"""In-memory storage configuration for testing."""
|
|
166
|
+
|
|
167
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Memory Storage"})
|
|
168
|
+
|
|
169
|
+
type: Literal["memory"] = Field("memory", init=False)
|
|
170
|
+
"""In-memory storage configuration for testing."""
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
StorageProviderConfig = Annotated[
|
|
174
|
+
SQLStorageConfig | FileStorageConfig | TextLogConfig | MemoryStorageConfig,
|
|
175
|
+
Field(discriminator="type"),
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
SessionStoreType = Literal["sql", "memory"]
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class StorageConfig(Schema):
|
|
183
|
+
"""Global storage configuration.
|
|
184
|
+
|
|
185
|
+
Docs: https://phil65.github.io/agentpool/YAML%20Configuration/storage_configuration/
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
providers: list[StorageProviderConfig] | None = Field(
|
|
189
|
+
default=None,
|
|
190
|
+
title="Storage providers",
|
|
191
|
+
examples=[[{"type": "file", "path": "/data/storage.json"}]],
|
|
192
|
+
)
|
|
193
|
+
"""List of configured storage providers"""
|
|
194
|
+
|
|
195
|
+
session_store: SessionStoreType = Field(
|
|
196
|
+
default="sql",
|
|
197
|
+
title="Session store type",
|
|
198
|
+
examples=["sql", "memory"],
|
|
199
|
+
)
|
|
200
|
+
"""Type of session store to use for session persistence.
|
|
201
|
+
|
|
202
|
+
- "sql": Persist sessions to SQL database (uses same URL as SQL provider)
|
|
203
|
+
- "memory": In-memory storage (sessions lost on restart)
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
default_provider: str | None = Field(
|
|
207
|
+
default=None,
|
|
208
|
+
examples=["sql", "file", "memory"],
|
|
209
|
+
title="Default provider",
|
|
210
|
+
)
|
|
211
|
+
"""Name of default provider for history queries.
|
|
212
|
+
If None, uses first configured provider."""
|
|
213
|
+
|
|
214
|
+
agents: set[str] | None = Field(default=None, title="Global agent filter")
|
|
215
|
+
"""Global agent filter. Can be overridden by provider-specific filters."""
|
|
216
|
+
|
|
217
|
+
filter_mode: FilterMode = Field(
|
|
218
|
+
default="and",
|
|
219
|
+
examples=["and", "override"],
|
|
220
|
+
title="Filter mode",
|
|
221
|
+
)
|
|
222
|
+
"""How to combine global and provider agent filters:
|
|
223
|
+
- "and": Both global and provider filters must allow the agent
|
|
224
|
+
- "override": Provider filter overrides global filter if set
|
|
225
|
+
"""
|
|
226
|
+
|
|
227
|
+
log_messages: bool = Field(default=True, title="Log messages")
|
|
228
|
+
"""Whether to log messages."""
|
|
229
|
+
|
|
230
|
+
log_conversations: bool = Field(default=True, title="Log conversations")
|
|
231
|
+
"""Whether to log conversations."""
|
|
232
|
+
|
|
233
|
+
log_commands: bool = Field(default=True, title="Log commands")
|
|
234
|
+
"""Whether to log command executions."""
|
|
235
|
+
|
|
236
|
+
log_context: bool = Field(default=True, title="Log context")
|
|
237
|
+
"""Whether to log additions to the context."""
|
|
238
|
+
|
|
239
|
+
title_generation_model: ModelId | str | None = Field(
|
|
240
|
+
default="google-gla:gemini-2.5-flash-lite",
|
|
241
|
+
examples=["google-gla:gemini-2.5-flash-lite", None],
|
|
242
|
+
title="Title generation model",
|
|
243
|
+
)
|
|
244
|
+
"""Model to use for generating conversation titles.
|
|
245
|
+
Set to None to disable automatic title generation."""
|
|
246
|
+
|
|
247
|
+
title_generation_prompt: str = Field(
|
|
248
|
+
default=DEFAULT_TITLE_PROMPT,
|
|
249
|
+
examples=[DEFAULT_TITLE_PROMPT, "Summarize this given request in 5 words"],
|
|
250
|
+
title="Title generation prompt",
|
|
251
|
+
)
|
|
252
|
+
"""Prompt template for generating conversation titles."""
|
|
253
|
+
|
|
254
|
+
model_config = ConfigDict(frozen=True)
|
|
255
|
+
|
|
256
|
+
@property
|
|
257
|
+
def effective_providers(self) -> list[StorageProviderConfig]:
|
|
258
|
+
"""Get effective list of providers.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
- Default SQLite provider if providers is None
|
|
262
|
+
- Empty list if providers is empty list
|
|
263
|
+
- Configured providers otherwise
|
|
264
|
+
"""
|
|
265
|
+
if self.providers is None:
|
|
266
|
+
if os.getenv("PYTEST_CURRENT_TEST"):
|
|
267
|
+
return [MemoryStorageConfig()]
|
|
268
|
+
return [SQLStorageConfig()]
|
|
269
|
+
return self.providers
|
|
270
|
+
|
|
271
|
+
def get_session_store(self) -> SessionStore:
|
|
272
|
+
"""Create session store based on configuration."""
|
|
273
|
+
from agentpool.sessions.store import MemorySessionStore
|
|
274
|
+
from agentpool_storage.session_store import SQLSessionStore
|
|
275
|
+
|
|
276
|
+
match self.session_store:
|
|
277
|
+
case "memory":
|
|
278
|
+
return MemorySessionStore()
|
|
279
|
+
case "sql":
|
|
280
|
+
# Find SQL config or use default
|
|
281
|
+
sql_config = None
|
|
282
|
+
for provider in self.effective_providers:
|
|
283
|
+
if isinstance(provider, SQLStorageConfig):
|
|
284
|
+
sql_config = provider
|
|
285
|
+
break
|
|
286
|
+
if sql_config is None:
|
|
287
|
+
sql_config = SQLStorageConfig()
|
|
288
|
+
return SQLSessionStore(sql_config)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"""System prompts configuration for agents."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from typing import Annotated, Any, Literal
|
|
7
|
+
|
|
8
|
+
from pydantic import ConfigDict, Field, ImportString
|
|
9
|
+
from schemez import Schema
|
|
10
|
+
|
|
11
|
+
from agentpool_config.prompt_hubs import PromptHubConfig
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
SystemPromptCategory = Literal["role", "methodology", "quality", "task"]
|
|
15
|
+
|
|
16
|
+
DEFAULT_TEMPLATE = """
|
|
17
|
+
{%- for prompt in role_prompts %}
|
|
18
|
+
Role: {{ prompt.content }}
|
|
19
|
+
{%- endfor %}
|
|
20
|
+
|
|
21
|
+
{%- for prompt in methodology_prompts %}
|
|
22
|
+
Method: {{ prompt.content }}
|
|
23
|
+
{%- endfor %}
|
|
24
|
+
|
|
25
|
+
{%- for prompt in quality_prompts %}
|
|
26
|
+
Quality Check: {{ prompt.content }}
|
|
27
|
+
{%- endfor %}
|
|
28
|
+
|
|
29
|
+
{%- for prompt in task_prompts %}
|
|
30
|
+
Task: {{ prompt.content }}
|
|
31
|
+
{%- endfor %}
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class BaseSystemPrompt(Schema):
|
|
36
|
+
"""Individual system prompt definition."""
|
|
37
|
+
|
|
38
|
+
content: str = Field(
|
|
39
|
+
examples=["You are a helpful assistant", "Always be concise"],
|
|
40
|
+
title="Prompt content",
|
|
41
|
+
)
|
|
42
|
+
"""The actual prompt text."""
|
|
43
|
+
|
|
44
|
+
category: SystemPromptCategory = Field(
|
|
45
|
+
default="role",
|
|
46
|
+
examples=["role", "methodology", "quality", "task"],
|
|
47
|
+
title="Prompt category",
|
|
48
|
+
)
|
|
49
|
+
"""Categorization for template organization."""
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class StaticPromptConfig(BaseSystemPrompt):
|
|
53
|
+
"""Configuration for a static text prompt."""
|
|
54
|
+
|
|
55
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Static Prompt"})
|
|
56
|
+
|
|
57
|
+
type: Literal["static"] = Field("static", init=False)
|
|
58
|
+
"""Static prompt reference."""
|
|
59
|
+
|
|
60
|
+
content: str = Field(
|
|
61
|
+
examples=["You are a helpful assistant", "Always be concise"],
|
|
62
|
+
title="Prompt content",
|
|
63
|
+
)
|
|
64
|
+
"""The prompt text content."""
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class FilePromptConfig(BaseSystemPrompt):
|
|
68
|
+
"""Configuration for a file-based Jinja template prompt."""
|
|
69
|
+
|
|
70
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "File Prompt"})
|
|
71
|
+
|
|
72
|
+
type: Literal["file"] = Field("file", init=False)
|
|
73
|
+
"""File prompt reference."""
|
|
74
|
+
|
|
75
|
+
path: str = Field(
|
|
76
|
+
examples=["prompts/system.j2", "/templates/agent_prompt.jinja"],
|
|
77
|
+
title="Template file path",
|
|
78
|
+
)
|
|
79
|
+
"""Path to the Jinja template file."""
|
|
80
|
+
|
|
81
|
+
variables: dict[str, Any] = Field(default_factory=dict, title="Template variables")
|
|
82
|
+
"""Variables to pass to the template."""
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class LibraryPromptConfig(Schema):
|
|
86
|
+
"""Configuration for a library reference prompt."""
|
|
87
|
+
|
|
88
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Library Prompt"})
|
|
89
|
+
|
|
90
|
+
type: Literal["library"] = Field("library", init=False)
|
|
91
|
+
"""Library prompt reference."""
|
|
92
|
+
|
|
93
|
+
reference: str = Field(
|
|
94
|
+
examples=["coding_assistant", "helpful_agent", "creative_writer"],
|
|
95
|
+
title="Library reference",
|
|
96
|
+
)
|
|
97
|
+
"""Library prompt reference identifier."""
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class FunctionPromptConfig(BaseSystemPrompt):
|
|
101
|
+
"""Configuration for a function-generated prompt."""
|
|
102
|
+
|
|
103
|
+
model_config = ConfigDict(json_schema_extra={"x-doc-title": "Function Prompt"})
|
|
104
|
+
|
|
105
|
+
type: Literal["function"] = Field("function", init=False)
|
|
106
|
+
"""Function prompt reference."""
|
|
107
|
+
|
|
108
|
+
function: ImportString[Callable[..., str]] = Field(
|
|
109
|
+
examples=["mymodule.generate_prompt", "prompts.dynamic:create_system_prompt"],
|
|
110
|
+
title="Function import path",
|
|
111
|
+
)
|
|
112
|
+
"""Import path to the function that generates the prompt."""
|
|
113
|
+
|
|
114
|
+
arguments: dict[str, Any] = Field(default_factory=dict, title="Function arguments")
|
|
115
|
+
"""Arguments to pass to the function."""
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
PromptConfig = Annotated[
|
|
119
|
+
StaticPromptConfig | FilePromptConfig | LibraryPromptConfig | FunctionPromptConfig,
|
|
120
|
+
Field(discriminator="type"),
|
|
121
|
+
]
|
|
122
|
+
"""Union type for different prompt configuration types."""
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class PromptLibraryConfig(Schema):
|
|
126
|
+
"""Complete prompt configuration.
|
|
127
|
+
|
|
128
|
+
Docs: https://phil65.github.io/agentpool/YAML%20Configuration/prompt_configuration/
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
system_prompts: dict[str, StaticPromptConfig] = Field(
|
|
132
|
+
default_factory=dict,
|
|
133
|
+
title="System prompt definitions",
|
|
134
|
+
)
|
|
135
|
+
"""Mapping of system prompt identifiers to their definitions."""
|
|
136
|
+
|
|
137
|
+
template: str | None = Field(
|
|
138
|
+
default=None,
|
|
139
|
+
examples=["Role: {{role}}\nMethod: {{method}}", "{{content}}"],
|
|
140
|
+
title="Combination template",
|
|
141
|
+
)
|
|
142
|
+
"""Optional template for combining prompts.
|
|
143
|
+
Has access to prompts grouped by type."""
|
|
144
|
+
|
|
145
|
+
providers: list[PromptHubConfig] = Field(
|
|
146
|
+
default_factory=list,
|
|
147
|
+
examples=[
|
|
148
|
+
[
|
|
149
|
+
{
|
|
150
|
+
"type": "promptlayer",
|
|
151
|
+
"api_key": "pl_abc123",
|
|
152
|
+
}
|
|
153
|
+
],
|
|
154
|
+
[
|
|
155
|
+
{
|
|
156
|
+
"type": "fabric",
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
],
|
|
160
|
+
title="Prompt hub providers",
|
|
161
|
+
)
|
|
162
|
+
"""List of external prompt providers to use."""
|
|
163
|
+
|
|
164
|
+
def format_prompts(self, identifiers: list[str] | None = None) -> str:
|
|
165
|
+
"""Format selected prompts using template.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
identifiers: Optional list of prompt IDs to include.
|
|
169
|
+
If None, includes all prompts.
|
|
170
|
+
"""
|
|
171
|
+
# Filter prompts if identifiers provided
|
|
172
|
+
prompts = (
|
|
173
|
+
{k: v for k, v in self.system_prompts.items() if k in identifiers}
|
|
174
|
+
if identifiers
|
|
175
|
+
else self.system_prompts
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
# Group prompts by type for template
|
|
179
|
+
by_type = {
|
|
180
|
+
"role_prompts": [p for p in prompts.values() if p.category == "role"],
|
|
181
|
+
"methodology_prompts": [p for p in prompts.values() if p.category == "methodology"],
|
|
182
|
+
"quality_prompts": [p for p in prompts.values() if p.category == "quality"],
|
|
183
|
+
"task_prompts": [p for p in prompts.values() if p.category == "task"],
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
# Render template
|
|
187
|
+
from jinja2 import Template
|
|
188
|
+
|
|
189
|
+
template = Template(self.template or DEFAULT_TEMPLATE)
|
|
190
|
+
return template.render(**by_type)
|