agentpool 2.1.9__py3-none-any.whl → 2.5.0__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.
- acp/__init__.py +13 -4
- acp/acp_requests.py +20 -77
- acp/agent/connection.py +8 -0
- acp/agent/implementations/debug_server/debug_server.py +6 -2
- acp/agent/protocol.py +6 -0
- acp/bridge/README.md +15 -2
- acp/bridge/__init__.py +3 -2
- acp/bridge/__main__.py +60 -19
- acp/bridge/ws_server.py +173 -0
- acp/bridge/ws_server_cli.py +89 -0
- acp/client/connection.py +38 -29
- acp/client/implementations/default_client.py +3 -2
- acp/client/implementations/headless_client.py +2 -2
- acp/connection.py +2 -2
- acp/notifications.py +20 -50
- acp/schema/__init__.py +2 -0
- acp/schema/agent_responses.py +21 -0
- acp/schema/client_requests.py +3 -3
- acp/schema/session_state.py +63 -29
- acp/stdio.py +39 -9
- acp/task/supervisor.py +2 -2
- acp/transports.py +362 -2
- acp/utils.py +17 -4
- agentpool/__init__.py +6 -1
- agentpool/agents/__init__.py +2 -0
- agentpool/agents/acp_agent/acp_agent.py +407 -277
- agentpool/agents/acp_agent/acp_converters.py +196 -38
- agentpool/agents/acp_agent/client_handler.py +191 -26
- agentpool/agents/acp_agent/session_state.py +17 -6
- agentpool/agents/agent.py +607 -572
- agentpool/agents/agui_agent/__init__.py +0 -2
- agentpool/agents/agui_agent/agui_agent.py +176 -110
- agentpool/agents/agui_agent/agui_converters.py +0 -131
- agentpool/agents/agui_agent/helpers.py +3 -4
- agentpool/agents/base_agent.py +632 -17
- agentpool/agents/claude_code_agent/FORKING.md +191 -0
- agentpool/agents/claude_code_agent/__init__.py +13 -1
- agentpool/agents/claude_code_agent/claude_code_agent.py +1058 -291
- agentpool/agents/claude_code_agent/converters.py +74 -143
- agentpool/agents/claude_code_agent/history.py +474 -0
- agentpool/agents/claude_code_agent/models.py +77 -0
- agentpool/agents/claude_code_agent/static_info.py +100 -0
- agentpool/agents/claude_code_agent/usage.py +242 -0
- agentpool/agents/context.py +40 -0
- agentpool/agents/events/__init__.py +24 -0
- agentpool/agents/events/builtin_handlers.py +67 -1
- agentpool/agents/events/event_emitter.py +32 -2
- agentpool/agents/events/events.py +104 -3
- agentpool/agents/events/infer_info.py +145 -0
- agentpool/agents/events/processors.py +254 -0
- agentpool/agents/interactions.py +41 -6
- agentpool/agents/modes.py +67 -0
- agentpool/agents/slashed_agent.py +5 -4
- agentpool/agents/tool_call_accumulator.py +213 -0
- agentpool/agents/tool_wrapping.py +18 -6
- agentpool/common_types.py +56 -21
- agentpool/config_resources/__init__.py +38 -1
- agentpool/config_resources/acp_assistant.yml +2 -2
- agentpool/config_resources/agents.yml +3 -0
- agentpool/config_resources/agents_template.yml +1 -0
- agentpool/config_resources/claude_code_agent.yml +10 -6
- agentpool/config_resources/external_acp_agents.yml +2 -1
- agentpool/delegation/base_team.py +4 -30
- agentpool/delegation/pool.py +136 -289
- agentpool/delegation/team.py +58 -57
- agentpool/delegation/teamrun.py +51 -55
- agentpool/diagnostics/__init__.py +53 -0
- agentpool/diagnostics/lsp_manager.py +1593 -0
- agentpool/diagnostics/lsp_proxy.py +41 -0
- agentpool/diagnostics/lsp_proxy_script.py +229 -0
- agentpool/diagnostics/models.py +398 -0
- agentpool/functional/run.py +10 -4
- agentpool/mcp_server/__init__.py +0 -2
- agentpool/mcp_server/client.py +76 -32
- agentpool/mcp_server/conversions.py +54 -13
- agentpool/mcp_server/manager.py +34 -54
- agentpool/mcp_server/registries/official_registry_client.py +35 -1
- agentpool/mcp_server/tool_bridge.py +186 -139
- agentpool/messaging/__init__.py +0 -2
- agentpool/messaging/compaction.py +72 -197
- agentpool/messaging/connection_manager.py +11 -10
- agentpool/messaging/event_manager.py +5 -5
- agentpool/messaging/message_container.py +6 -30
- agentpool/messaging/message_history.py +99 -8
- agentpool/messaging/messagenode.py +52 -14
- agentpool/messaging/messages.py +54 -35
- agentpool/messaging/processing.py +12 -22
- agentpool/models/__init__.py +1 -1
- agentpool/models/acp_agents/base.py +6 -24
- agentpool/models/acp_agents/mcp_capable.py +126 -157
- agentpool/models/acp_agents/non_mcp.py +129 -95
- agentpool/models/agents.py +98 -76
- agentpool/models/agui_agents.py +1 -1
- agentpool/models/claude_code_agents.py +144 -19
- agentpool/models/file_parsing.py +0 -1
- agentpool/models/manifest.py +113 -50
- agentpool/prompts/conversion_manager.py +1 -1
- agentpool/prompts/prompts.py +5 -2
- agentpool/repomap.py +1 -1
- agentpool/resource_providers/__init__.py +11 -1
- agentpool/resource_providers/aggregating.py +56 -5
- agentpool/resource_providers/base.py +70 -4
- agentpool/resource_providers/codemode/code_executor.py +72 -5
- agentpool/resource_providers/codemode/helpers.py +2 -2
- agentpool/resource_providers/codemode/provider.py +64 -12
- agentpool/resource_providers/codemode/remote_mcp_execution.py +2 -2
- agentpool/resource_providers/codemode/remote_provider.py +9 -12
- agentpool/resource_providers/filtering.py +3 -1
- agentpool/resource_providers/mcp_provider.py +89 -12
- agentpool/resource_providers/plan_provider.py +228 -46
- agentpool/resource_providers/pool.py +7 -3
- agentpool/resource_providers/resource_info.py +111 -0
- agentpool/resource_providers/static.py +4 -2
- agentpool/sessions/__init__.py +4 -1
- agentpool/sessions/manager.py +33 -5
- agentpool/sessions/models.py +59 -6
- agentpool/sessions/protocol.py +28 -0
- agentpool/sessions/session.py +11 -55
- agentpool/skills/registry.py +13 -8
- agentpool/storage/manager.py +572 -49
- agentpool/talk/registry.py +4 -4
- agentpool/talk/talk.py +9 -10
- agentpool/testing.py +538 -20
- agentpool/tool_impls/__init__.py +6 -0
- agentpool/tool_impls/agent_cli/__init__.py +42 -0
- agentpool/tool_impls/agent_cli/tool.py +95 -0
- agentpool/tool_impls/bash/__init__.py +64 -0
- agentpool/tool_impls/bash/helpers.py +35 -0
- agentpool/tool_impls/bash/tool.py +171 -0
- agentpool/tool_impls/delete_path/__init__.py +70 -0
- agentpool/tool_impls/delete_path/tool.py +142 -0
- agentpool/tool_impls/download_file/__init__.py +80 -0
- agentpool/tool_impls/download_file/tool.py +183 -0
- agentpool/tool_impls/execute_code/__init__.py +55 -0
- agentpool/tool_impls/execute_code/tool.py +163 -0
- agentpool/tool_impls/grep/__init__.py +80 -0
- agentpool/tool_impls/grep/tool.py +200 -0
- agentpool/tool_impls/list_directory/__init__.py +73 -0
- agentpool/tool_impls/list_directory/tool.py +197 -0
- agentpool/tool_impls/question/__init__.py +42 -0
- agentpool/tool_impls/question/tool.py +127 -0
- agentpool/tool_impls/read/__init__.py +104 -0
- agentpool/tool_impls/read/tool.py +305 -0
- agentpool/tools/__init__.py +2 -1
- agentpool/tools/base.py +114 -34
- agentpool/tools/manager.py +57 -1
- agentpool/ui/base.py +2 -2
- agentpool/ui/mock_provider.py +2 -2
- agentpool/ui/stdlib_provider.py +2 -2
- agentpool/utils/file_watcher.py +269 -0
- agentpool/utils/identifiers.py +121 -0
- agentpool/utils/pydantic_ai_helpers.py +46 -0
- agentpool/utils/streams.py +616 -2
- agentpool/utils/subprocess_utils.py +155 -0
- agentpool/utils/token_breakdown.py +461 -0
- agentpool/vfs_registry.py +7 -2
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/METADATA +41 -27
- agentpool-2.5.0.dist-info/RECORD +579 -0
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/WHEEL +1 -1
- agentpool_cli/__main__.py +24 -0
- agentpool_cli/create.py +1 -1
- agentpool_cli/serve_acp.py +100 -21
- agentpool_cli/serve_agui.py +87 -0
- agentpool_cli/serve_opencode.py +119 -0
- agentpool_cli/ui.py +557 -0
- agentpool_commands/__init__.py +42 -5
- agentpool_commands/agents.py +75 -2
- agentpool_commands/history.py +62 -0
- agentpool_commands/mcp.py +176 -0
- agentpool_commands/models.py +56 -3
- agentpool_commands/pool.py +260 -0
- agentpool_commands/session.py +1 -1
- agentpool_commands/text_sharing/__init__.py +119 -0
- agentpool_commands/text_sharing/base.py +123 -0
- agentpool_commands/text_sharing/github_gist.py +80 -0
- agentpool_commands/text_sharing/opencode.py +462 -0
- agentpool_commands/text_sharing/paste_rs.py +59 -0
- agentpool_commands/text_sharing/pastebin.py +116 -0
- agentpool_commands/text_sharing/shittycodingagent.py +112 -0
- agentpool_commands/tools.py +57 -0
- agentpool_commands/utils.py +80 -30
- agentpool_config/__init__.py +30 -2
- agentpool_config/agentpool_tools.py +498 -0
- agentpool_config/builtin_tools.py +77 -22
- agentpool_config/commands.py +24 -1
- agentpool_config/compaction.py +258 -0
- agentpool_config/converters.py +1 -1
- agentpool_config/event_handlers.py +42 -0
- agentpool_config/events.py +1 -1
- agentpool_config/forward_targets.py +1 -4
- agentpool_config/jinja.py +3 -3
- agentpool_config/mcp_server.py +132 -6
- agentpool_config/nodes.py +1 -1
- agentpool_config/observability.py +44 -0
- agentpool_config/session.py +0 -3
- agentpool_config/storage.py +82 -38
- agentpool_config/task.py +3 -3
- agentpool_config/tools.py +11 -22
- agentpool_config/toolsets.py +109 -233
- agentpool_server/a2a_server/agent_worker.py +307 -0
- agentpool_server/a2a_server/server.py +23 -18
- agentpool_server/acp_server/acp_agent.py +234 -181
- agentpool_server/acp_server/commands/acp_commands.py +151 -156
- agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +18 -17
- agentpool_server/acp_server/event_converter.py +651 -0
- agentpool_server/acp_server/input_provider.py +53 -10
- agentpool_server/acp_server/server.py +24 -90
- agentpool_server/acp_server/session.py +173 -331
- agentpool_server/acp_server/session_manager.py +8 -34
- agentpool_server/agui_server/server.py +3 -1
- agentpool_server/mcp_server/server.py +5 -2
- agentpool_server/opencode_server/.rules +95 -0
- agentpool_server/opencode_server/ENDPOINTS.md +401 -0
- agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md +202 -0
- agentpool_server/opencode_server/__init__.py +19 -0
- agentpool_server/opencode_server/command_validation.py +172 -0
- agentpool_server/opencode_server/converters.py +975 -0
- agentpool_server/opencode_server/dependencies.py +24 -0
- agentpool_server/opencode_server/input_provider.py +421 -0
- agentpool_server/opencode_server/models/__init__.py +250 -0
- agentpool_server/opencode_server/models/agent.py +53 -0
- agentpool_server/opencode_server/models/app.py +72 -0
- agentpool_server/opencode_server/models/base.py +26 -0
- agentpool_server/opencode_server/models/common.py +23 -0
- agentpool_server/opencode_server/models/config.py +37 -0
- agentpool_server/opencode_server/models/events.py +821 -0
- agentpool_server/opencode_server/models/file.py +88 -0
- agentpool_server/opencode_server/models/mcp.py +44 -0
- agentpool_server/opencode_server/models/message.py +179 -0
- agentpool_server/opencode_server/models/parts.py +323 -0
- agentpool_server/opencode_server/models/provider.py +81 -0
- agentpool_server/opencode_server/models/pty.py +43 -0
- agentpool_server/opencode_server/models/question.py +56 -0
- agentpool_server/opencode_server/models/session.py +111 -0
- agentpool_server/opencode_server/routes/__init__.py +29 -0
- agentpool_server/opencode_server/routes/agent_routes.py +473 -0
- agentpool_server/opencode_server/routes/app_routes.py +202 -0
- agentpool_server/opencode_server/routes/config_routes.py +302 -0
- agentpool_server/opencode_server/routes/file_routes.py +571 -0
- agentpool_server/opencode_server/routes/global_routes.py +94 -0
- agentpool_server/opencode_server/routes/lsp_routes.py +319 -0
- agentpool_server/opencode_server/routes/message_routes.py +761 -0
- agentpool_server/opencode_server/routes/permission_routes.py +63 -0
- agentpool_server/opencode_server/routes/pty_routes.py +300 -0
- agentpool_server/opencode_server/routes/question_routes.py +128 -0
- agentpool_server/opencode_server/routes/session_routes.py +1276 -0
- agentpool_server/opencode_server/routes/tui_routes.py +139 -0
- agentpool_server/opencode_server/server.py +475 -0
- agentpool_server/opencode_server/state.py +151 -0
- agentpool_server/opencode_server/time_utils.py +8 -0
- agentpool_storage/__init__.py +12 -0
- agentpool_storage/base.py +184 -2
- agentpool_storage/claude_provider/ARCHITECTURE.md +433 -0
- agentpool_storage/claude_provider/__init__.py +42 -0
- agentpool_storage/claude_provider/provider.py +1089 -0
- agentpool_storage/file_provider.py +278 -15
- agentpool_storage/memory_provider.py +193 -12
- agentpool_storage/models.py +3 -0
- agentpool_storage/opencode_provider/ARCHITECTURE.md +386 -0
- agentpool_storage/opencode_provider/__init__.py +16 -0
- agentpool_storage/opencode_provider/helpers.py +414 -0
- agentpool_storage/opencode_provider/provider.py +895 -0
- agentpool_storage/project_store.py +325 -0
- agentpool_storage/session_store.py +26 -6
- agentpool_storage/sql_provider/__init__.py +4 -2
- agentpool_storage/sql_provider/models.py +48 -0
- agentpool_storage/sql_provider/sql_provider.py +269 -3
- agentpool_storage/sql_provider/utils.py +12 -13
- agentpool_storage/zed_provider/__init__.py +16 -0
- agentpool_storage/zed_provider/helpers.py +281 -0
- agentpool_storage/zed_provider/models.py +130 -0
- agentpool_storage/zed_provider/provider.py +442 -0
- agentpool_storage/zed_provider.py +803 -0
- agentpool_toolsets/__init__.py +0 -2
- agentpool_toolsets/builtin/__init__.py +2 -12
- agentpool_toolsets/builtin/code.py +96 -57
- agentpool_toolsets/builtin/debug.py +118 -48
- agentpool_toolsets/builtin/execution_environment.py +115 -230
- agentpool_toolsets/builtin/file_edit/file_edit.py +115 -7
- agentpool_toolsets/builtin/skills.py +9 -4
- agentpool_toolsets/builtin/subagent_tools.py +64 -51
- agentpool_toolsets/builtin/workers.py +4 -2
- agentpool_toolsets/composio_toolset.py +2 -2
- agentpool_toolsets/entry_points.py +3 -1
- agentpool_toolsets/fsspec_toolset/__init__.py +13 -1
- agentpool_toolsets/fsspec_toolset/diagnostics.py +860 -73
- agentpool_toolsets/fsspec_toolset/grep.py +99 -7
- agentpool_toolsets/fsspec_toolset/helpers.py +3 -2
- agentpool_toolsets/fsspec_toolset/image_utils.py +161 -0
- agentpool_toolsets/fsspec_toolset/toolset.py +500 -95
- agentpool_toolsets/mcp_discovery/__init__.py +5 -0
- agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
- agentpool_toolsets/mcp_discovery/toolset.py +511 -0
- agentpool_toolsets/mcp_run_toolset.py +87 -12
- agentpool_toolsets/notifications.py +33 -33
- agentpool_toolsets/openapi.py +3 -1
- agentpool_toolsets/search_toolset.py +3 -1
- agentpool-2.1.9.dist-info/RECORD +0 -474
- agentpool_config/resources.py +0 -33
- agentpool_server/acp_server/acp_tools.py +0 -43
- agentpool_server/acp_server/commands/spawn.py +0 -210
- agentpool_storage/text_log_provider.py +0 -275
- agentpool_toolsets/builtin/agent_management.py +0 -239
- agentpool_toolsets/builtin/chain.py +0 -288
- agentpool_toolsets/builtin/history.py +0 -36
- agentpool_toolsets/builtin/integration.py +0 -85
- agentpool_toolsets/builtin/tool_management.py +0 -90
- agentpool_toolsets/builtin/user_interaction.py +0 -52
- agentpool_toolsets/semantic_memory_toolset.py +0 -536
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/entry_points.txt +0 -0
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,7 +5,6 @@ from __future__ import annotations
|
|
|
5
5
|
from typing import TYPE_CHECKING, Literal
|
|
6
6
|
|
|
7
7
|
from pydantic import ConfigDict, Field
|
|
8
|
-
from tokonomics.model_discovery import ProviderType # noqa: TC002
|
|
9
8
|
|
|
10
9
|
from agentpool.models.acp_agents.base import BaseACPAgentConfig
|
|
11
10
|
|
|
@@ -14,29 +13,6 @@ if TYPE_CHECKING:
|
|
|
14
13
|
from agentpool.prompts.manager import PromptManager
|
|
15
14
|
|
|
16
15
|
|
|
17
|
-
ClaudeCodeModelName = Literal["default", "sonnet", "opus", "haiku", "sonnet[1m]", "opusplan"]
|
|
18
|
-
ClaudeCodeToolName = Literal[
|
|
19
|
-
"AskUserQuestion",
|
|
20
|
-
"Bash",
|
|
21
|
-
"BashOutput",
|
|
22
|
-
"Edit",
|
|
23
|
-
"ExitPlanMode",
|
|
24
|
-
"Glob",
|
|
25
|
-
"Grep",
|
|
26
|
-
"KillShell",
|
|
27
|
-
"NotebookEdit",
|
|
28
|
-
"Read",
|
|
29
|
-
"Skill",
|
|
30
|
-
"SlashCommand",
|
|
31
|
-
"Task",
|
|
32
|
-
"TodoWrite",
|
|
33
|
-
"WebFetch",
|
|
34
|
-
"WebSearch",
|
|
35
|
-
"Write",
|
|
36
|
-
]
|
|
37
|
-
ClaudeCodePermissionmode = Literal["default", "acceptEdits", "bypassPermissions", "dontAsk", "plan"]
|
|
38
|
-
|
|
39
|
-
|
|
40
16
|
class CodexACPAgentConfig(BaseACPAgentConfig):
|
|
41
17
|
"""Configuration for Zed Codex via ACP.
|
|
42
18
|
|
|
@@ -67,6 +43,12 @@ class CodexACPAgentConfig(BaseACPAgentConfig):
|
|
|
67
43
|
)
|
|
68
44
|
"""Model override."""
|
|
69
45
|
|
|
46
|
+
auto_approve: bool = Field(
|
|
47
|
+
default=False,
|
|
48
|
+
title="Auto Approve",
|
|
49
|
+
)
|
|
50
|
+
"""Automatically accept all actions (YOLO mode)."""
|
|
51
|
+
|
|
70
52
|
sandbox_permissions: list[str] | None = Field(
|
|
71
53
|
default=None,
|
|
72
54
|
title="Sandbox Permissions",
|
|
@@ -85,11 +67,6 @@ class CodexACPAgentConfig(BaseACPAgentConfig):
|
|
|
85
67
|
"""Get the command to spawn the ACP server."""
|
|
86
68
|
return "npx"
|
|
87
69
|
|
|
88
|
-
@property
|
|
89
|
-
def model_providers(self) -> list[ProviderType]:
|
|
90
|
-
"""Codex uses OpenAI models."""
|
|
91
|
-
return ["openai"]
|
|
92
|
-
|
|
93
70
|
async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
|
|
94
71
|
"""Build command arguments from settings."""
|
|
95
72
|
args: list[str] = ["@zed-industries/codex-acp"]
|
|
@@ -105,6 +82,8 @@ class CodexACPAgentConfig(BaseACPAgentConfig):
|
|
|
105
82
|
"-c",
|
|
106
83
|
f"shell_environment_policy.inherit={self.shell_environment_policy_inherit}",
|
|
107
84
|
])
|
|
85
|
+
if self.auto_approve:
|
|
86
|
+
args.extend(["-c", "approval_mode=yolo"])
|
|
108
87
|
|
|
109
88
|
return args
|
|
110
89
|
|
|
@@ -142,11 +121,6 @@ class OpenCodeACPAgentConfig(BaseACPAgentConfig):
|
|
|
142
121
|
args.extend(["--cwd", self.cwd])
|
|
143
122
|
return args
|
|
144
123
|
|
|
145
|
-
@property
|
|
146
|
-
def model_providers(self) -> list[ProviderType]:
|
|
147
|
-
"""OpenCode supports multiple providers."""
|
|
148
|
-
return ["openai", "anthropic", "gemini", "openrouter"]
|
|
149
|
-
|
|
150
124
|
|
|
151
125
|
class GooseACPAgentConfig(BaseACPAgentConfig):
|
|
152
126
|
"""Configuration for Goose via ACP.
|
|
@@ -176,11 +150,6 @@ class GooseACPAgentConfig(BaseACPAgentConfig):
|
|
|
176
150
|
"""Build command arguments from settings."""
|
|
177
151
|
return ["acp"]
|
|
178
152
|
|
|
179
|
-
@property
|
|
180
|
-
def model_providers(self) -> list[ProviderType]:
|
|
181
|
-
"""Goose supports multiple providers."""
|
|
182
|
-
return ["openai", "anthropic", "gemini", "openrouter"]
|
|
183
|
-
|
|
184
153
|
|
|
185
154
|
class MistralACPAgentConfig(BaseACPAgentConfig):
|
|
186
155
|
"""Configuration for Mistral Agent via ACP.
|
|
@@ -208,11 +177,6 @@ class MistralACPAgentConfig(BaseACPAgentConfig):
|
|
|
208
177
|
"""Build command arguments from settings."""
|
|
209
178
|
return []
|
|
210
179
|
|
|
211
|
-
@property
|
|
212
|
-
def model_providers(self) -> list[ProviderType]:
|
|
213
|
-
"""Goose supports multiple providers."""
|
|
214
|
-
return ["mistral"]
|
|
215
|
-
|
|
216
180
|
|
|
217
181
|
class OpenHandsACPAgentConfig(BaseACPAgentConfig):
|
|
218
182
|
"""Configuration for OpenHands via ACP.
|
|
@@ -242,11 +206,6 @@ class OpenHandsACPAgentConfig(BaseACPAgentConfig):
|
|
|
242
206
|
"""Build command arguments from settings."""
|
|
243
207
|
return ["acp"]
|
|
244
208
|
|
|
245
|
-
@property
|
|
246
|
-
def model_providers(self) -> list[ProviderType]:
|
|
247
|
-
"""OpenHands supports multiple providers."""
|
|
248
|
-
return ["openai", "anthropic", "gemini", "openrouter"]
|
|
249
|
-
|
|
250
209
|
|
|
251
210
|
class AmpACPAgentConfig(BaseACPAgentConfig):
|
|
252
211
|
"""Configuration for Amp (AmpCode) via ACP.
|
|
@@ -292,11 +251,6 @@ class AmpACPAgentConfig(BaseACPAgentConfig):
|
|
|
292
251
|
"""Build command arguments for amp-acp bridge."""
|
|
293
252
|
return ["-y", "amp-acp"]
|
|
294
253
|
|
|
295
|
-
@property
|
|
296
|
-
def model_providers(self) -> list[ProviderType]:
|
|
297
|
-
"""Amp supports multiple providers."""
|
|
298
|
-
return ["openai", "anthropic", "gemini"]
|
|
299
|
-
|
|
300
254
|
|
|
301
255
|
class CagentACPAgentConfig(BaseACPAgentConfig):
|
|
302
256
|
"""Configuration for Docker cagent via ACP.
|
|
@@ -393,11 +347,6 @@ class CagentACPAgentConfig(BaseACPAgentConfig):
|
|
|
393
347
|
|
|
394
348
|
return args
|
|
395
349
|
|
|
396
|
-
@property
|
|
397
|
-
def model_providers(self) -> list[ProviderType]:
|
|
398
|
-
"""Cagent supports multiple providers via MCP."""
|
|
399
|
-
return ["openai", "anthropic", "gemini"]
|
|
400
|
-
|
|
401
350
|
|
|
402
351
|
class StakpakACPAgentConfig(BaseACPAgentConfig):
|
|
403
352
|
"""Configuration for Stakpak Agent via ACP.
|
|
@@ -538,11 +487,6 @@ class StakpakACPAgentConfig(BaseACPAgentConfig):
|
|
|
538
487
|
|
|
539
488
|
return args
|
|
540
489
|
|
|
541
|
-
@property
|
|
542
|
-
def model_providers(self) -> list[ProviderType]:
|
|
543
|
-
"""Stakpak supports multiple providers."""
|
|
544
|
-
return ["openai", "anthropic", "gemini"]
|
|
545
|
-
|
|
546
490
|
|
|
547
491
|
class VTCodeACPAgentConfig(BaseACPAgentConfig):
|
|
548
492
|
"""Configuration for VT Code via ACP.
|
|
@@ -644,7 +588,7 @@ class VTCodeACPAgentConfig(BaseACPAgentConfig):
|
|
|
644
588
|
)
|
|
645
589
|
"""Configuration file path."""
|
|
646
590
|
|
|
647
|
-
|
|
591
|
+
auto_approve: bool = Field(default=False, title="Auto Approve")
|
|
648
592
|
"""Skip safety confirmations."""
|
|
649
593
|
|
|
650
594
|
full_auto: bool = Field(default=False, title="Full Auto")
|
|
@@ -684,18 +628,13 @@ class VTCodeACPAgentConfig(BaseACPAgentConfig):
|
|
|
684
628
|
args.extend(["--max-tool-calls", str(self.max_tool_calls)])
|
|
685
629
|
if self.config:
|
|
686
630
|
args.extend(["--config", self.config])
|
|
687
|
-
if self.
|
|
631
|
+
if self.auto_approve:
|
|
688
632
|
args.append("--skip-confirmations")
|
|
689
633
|
if self.full_auto:
|
|
690
634
|
args.append("--full-auto")
|
|
691
635
|
|
|
692
636
|
return args
|
|
693
637
|
|
|
694
|
-
@property
|
|
695
|
-
def model_providers(self) -> list[ProviderType]:
|
|
696
|
-
"""VT Code supports multiple providers."""
|
|
697
|
-
return ["openai", "anthropic", "gemini"]
|
|
698
|
-
|
|
699
638
|
|
|
700
639
|
class CursorACPAgentConfig(BaseACPAgentConfig):
|
|
701
640
|
"""Configuration for Cursor via ACP.
|
|
@@ -748,25 +687,13 @@ class CursorACPAgentConfig(BaseACPAgentConfig):
|
|
|
748
687
|
)
|
|
749
688
|
"""Session storage directory (default: ~/.cursor-sessions)."""
|
|
750
689
|
|
|
751
|
-
timeout: int | None = Field(
|
|
752
|
-
default=None,
|
|
753
|
-
title="Timeout",
|
|
754
|
-
examples=[30000, 60000],
|
|
755
|
-
)
|
|
690
|
+
timeout: int | None = Field(default=None, title="Timeout", examples=[30000, 60000])
|
|
756
691
|
"""Cursor-agent timeout in milliseconds (default: 30000)."""
|
|
757
692
|
|
|
758
|
-
retries: int | None = Field(
|
|
759
|
-
default=None,
|
|
760
|
-
title="Retries",
|
|
761
|
-
examples=[3, 5],
|
|
762
|
-
)
|
|
693
|
+
retries: int | None = Field(default=None, title="Retries", examples=[3, 5])
|
|
763
694
|
"""Number of retries for cursor-agent commands (default: 3)."""
|
|
764
695
|
|
|
765
|
-
max_sessions: int | None = Field(
|
|
766
|
-
default=None,
|
|
767
|
-
title="Max Sessions",
|
|
768
|
-
examples=[100, 200],
|
|
769
|
-
)
|
|
696
|
+
max_sessions: int | None = Field(default=None, title="Max Sessions", examples=[100, 200])
|
|
770
697
|
"""Maximum number of concurrent sessions (default: 100)."""
|
|
771
698
|
|
|
772
699
|
session_timeout: int | None = Field(
|
|
@@ -782,11 +709,7 @@ class CursorACPAgentConfig(BaseACPAgentConfig):
|
|
|
782
709
|
no_terminal: bool = Field(default=False, title="No Terminal")
|
|
783
710
|
"""Disable terminal tools."""
|
|
784
711
|
|
|
785
|
-
max_processes: int | None = Field(
|
|
786
|
-
default=None,
|
|
787
|
-
title="Max Processes",
|
|
788
|
-
examples=[5, 10],
|
|
789
|
-
)
|
|
712
|
+
max_processes: int | None = Field(default=None, title="Max Processes", examples=[5, 10])
|
|
790
713
|
"""Maximum number of terminal processes (default: 5)."""
|
|
791
714
|
|
|
792
715
|
def get_command(self) -> str:
|
|
@@ -821,10 +744,120 @@ class CursorACPAgentConfig(BaseACPAgentConfig):
|
|
|
821
744
|
args.extend(["--max-processes", str(self.max_processes)])
|
|
822
745
|
return args
|
|
823
746
|
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
747
|
+
|
|
748
|
+
class GeminiACPAgentConfig(BaseACPAgentConfig):
|
|
749
|
+
"""Configuration for Gemini CLI via ACP.
|
|
750
|
+
|
|
751
|
+
Provides typed settings for the gemini CLI with ACP support.
|
|
752
|
+
|
|
753
|
+
Note:
|
|
754
|
+
Gemini CLI does not support runtime MCP server injection via config.
|
|
755
|
+
MCP servers must be pre-configured using `gemini mcp add` command.
|
|
756
|
+
|
|
757
|
+
Example:
|
|
758
|
+
```yaml
|
|
759
|
+
agents:
|
|
760
|
+
coder:
|
|
761
|
+
type: acp
|
|
762
|
+
provider: gemini
|
|
763
|
+
cwd: /path/to/project
|
|
764
|
+
model: gemini-2.5-pro
|
|
765
|
+
approval_mode: auto_edit
|
|
766
|
+
allowed_tools:
|
|
767
|
+
- read_file
|
|
768
|
+
- write_file
|
|
769
|
+
- terminal
|
|
770
|
+
```
|
|
771
|
+
"""
|
|
772
|
+
|
|
773
|
+
model_config = ConfigDict(json_schema_extra={"title": "Gemini ACP Agent Configuration"})
|
|
774
|
+
|
|
775
|
+
provider: Literal["gemini"] = Field("gemini", init=False)
|
|
776
|
+
"""Discriminator for Gemini ACP agent."""
|
|
777
|
+
|
|
778
|
+
model: str | None = Field(
|
|
779
|
+
default=None,
|
|
780
|
+
title="Model",
|
|
781
|
+
examples=["gemini-2.5-pro", "gemini-2.5-flash"],
|
|
782
|
+
)
|
|
783
|
+
"""Model override."""
|
|
784
|
+
|
|
785
|
+
approval_mode: Literal["default", "auto_edit", "yolo"] | None = Field(
|
|
786
|
+
default=None,
|
|
787
|
+
title="Approval Mode",
|
|
788
|
+
examples=["auto_edit", "yolo"],
|
|
789
|
+
)
|
|
790
|
+
"""Approval mode for tool execution."""
|
|
791
|
+
|
|
792
|
+
sandbox: bool = Field(default=False, title="Sandbox")
|
|
793
|
+
"""Run in sandbox mode."""
|
|
794
|
+
|
|
795
|
+
auto_approve: bool = Field(default=False, title="Auto Approve")
|
|
796
|
+
"""Automatically accept all actions."""
|
|
797
|
+
|
|
798
|
+
allowed_tools: list[str] | None = Field(
|
|
799
|
+
default=None,
|
|
800
|
+
title="Allowed Tools",
|
|
801
|
+
examples=[["read_file", "write_file", "terminal"], ["search"]],
|
|
802
|
+
)
|
|
803
|
+
"""Tools allowed to run without confirmation."""
|
|
804
|
+
|
|
805
|
+
allowed_mcp_server_names: list[str] | None = Field(
|
|
806
|
+
default=None,
|
|
807
|
+
title="Allowed MCP Server Names",
|
|
808
|
+
examples=[["filesystem", "github"], ["slack"]],
|
|
809
|
+
)
|
|
810
|
+
"""Allowed MCP server names."""
|
|
811
|
+
|
|
812
|
+
extensions: list[str] | None = Field(
|
|
813
|
+
default=None,
|
|
814
|
+
title="Extensions",
|
|
815
|
+
examples=[["python", "typescript"], ["rust", "go"]],
|
|
816
|
+
)
|
|
817
|
+
"""List of extensions to use. If not provided, all are used."""
|
|
818
|
+
|
|
819
|
+
include_directories: list[str] | None = Field(
|
|
820
|
+
default=None,
|
|
821
|
+
title="Include Directories",
|
|
822
|
+
examples=[["/path/to/lib", "/path/to/shared"], ["./vendor"]],
|
|
823
|
+
)
|
|
824
|
+
"""Additional directories to include in the workspace."""
|
|
825
|
+
|
|
826
|
+
output_format: Literal["text", "json", "stream-json"] | None = Field(
|
|
827
|
+
default=None,
|
|
828
|
+
title="Output Format",
|
|
829
|
+
examples=["json", "stream-json"],
|
|
830
|
+
)
|
|
831
|
+
"""Output format."""
|
|
832
|
+
|
|
833
|
+
def get_command(self) -> str:
|
|
834
|
+
"""Get the command to spawn the ACP server."""
|
|
835
|
+
return "gemini"
|
|
836
|
+
|
|
837
|
+
async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
|
|
838
|
+
"""Build command arguments from settings."""
|
|
839
|
+
args: list[str] = ["--experimental-acp"]
|
|
840
|
+
|
|
841
|
+
if self.model:
|
|
842
|
+
args.extend(["--model", self.model])
|
|
843
|
+
if self.approval_mode:
|
|
844
|
+
args.extend(["--approval-mode", self.approval_mode])
|
|
845
|
+
if self.sandbox:
|
|
846
|
+
args.append("--sandbox")
|
|
847
|
+
if self.auto_approve:
|
|
848
|
+
args.append("--yolo")
|
|
849
|
+
if self.allowed_tools:
|
|
850
|
+
args.extend(["--allowed-tools", *self.allowed_tools])
|
|
851
|
+
if self.allowed_mcp_server_names:
|
|
852
|
+
args.extend(["--allowed-mcp-server-names", *self.allowed_mcp_server_names])
|
|
853
|
+
if self.extensions:
|
|
854
|
+
args.extend(["--extensions", *self.extensions])
|
|
855
|
+
if self.include_directories:
|
|
856
|
+
args.extend(["--include-directories", *self.include_directories])
|
|
857
|
+
if self.output_format:
|
|
858
|
+
args.extend(["--output-format", self.output_format])
|
|
859
|
+
|
|
860
|
+
return args
|
|
828
861
|
|
|
829
862
|
|
|
830
863
|
# Union of all ACP agent config types
|
|
@@ -839,4 +872,5 @@ RegularACPAgentConfigTypes = (
|
|
|
839
872
|
| MistralACPAgentConfig
|
|
840
873
|
| VTCodeACPAgentConfig
|
|
841
874
|
| CursorACPAgentConfig
|
|
875
|
+
| GeminiACPAgentConfig
|
|
842
876
|
)
|
agentpool/models/agents.py
CHANGED
|
@@ -4,14 +4,15 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from collections.abc import Sequence # noqa: TC003
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import TYPE_CHECKING, Any, Literal, assert_never
|
|
7
|
+
from typing import TYPE_CHECKING, Annotated, Any, Literal, assert_never
|
|
8
8
|
from uuid import UUID
|
|
9
9
|
|
|
10
|
-
from
|
|
11
|
-
from
|
|
10
|
+
from exxec_config import ExecutionEnvironmentConfig # noqa: TC002
|
|
11
|
+
from llmling_models_config import AnyModelConfig # noqa: TC002
|
|
12
12
|
from pydantic import ConfigDict, Field, model_validator
|
|
13
13
|
from pydantic_ai import UsageLimits # noqa: TC002
|
|
14
14
|
from schemez import InlineSchemaDef
|
|
15
|
+
from tokonomics.model_discovery import ProviderType # noqa: TC002
|
|
15
16
|
from tokonomics.model_names import ModelId # noqa: TC002
|
|
16
17
|
from toprompt import render_prompt
|
|
17
18
|
|
|
@@ -19,14 +20,15 @@ from agentpool import log
|
|
|
19
20
|
from agentpool.common_types import EndStrategy # noqa: TC001
|
|
20
21
|
from agentpool.prompts.prompts import PromptMessage, StaticPrompt
|
|
21
22
|
from agentpool.resource_providers import StaticResourceProvider
|
|
23
|
+
from agentpool_config import BaseToolConfig, NativeAgentToolConfig
|
|
24
|
+
from agentpool_config.builtin_tools import BaseBuiltinToolConfig
|
|
22
25
|
from agentpool_config.hooks import HooksConfig # noqa: TC001
|
|
23
26
|
from agentpool_config.knowledge import Knowledge # noqa: TC001
|
|
24
27
|
from agentpool_config.nodes import BaseAgentConfig
|
|
25
28
|
from agentpool_config.output_types import StructuredResponseConfig # noqa: TC001
|
|
26
29
|
from agentpool_config.session import MemoryConfig, SessionQuery
|
|
27
30
|
from agentpool_config.system_prompts import PromptConfig # noqa: TC001
|
|
28
|
-
from agentpool_config.
|
|
29
|
-
from agentpool_config.toolsets import ToolsetConfig # noqa: TC001
|
|
31
|
+
from agentpool_config.toolsets import BaseToolsetConfig, ToolsetConfig
|
|
30
32
|
from agentpool_config.workers import WorkerConfig # noqa: TC001
|
|
31
33
|
|
|
32
34
|
|
|
@@ -37,10 +39,15 @@ if TYPE_CHECKING:
|
|
|
37
39
|
|
|
38
40
|
|
|
39
41
|
ToolMode = Literal["codemode"]
|
|
40
|
-
AutoCache = Literal["off", "5m", "1h"]
|
|
41
42
|
|
|
42
43
|
logger = log.get_logger(__name__)
|
|
43
44
|
|
|
45
|
+
# Unified type for all tool configurations (single tools + toolsets)
|
|
46
|
+
AnyToolConfig = Annotated[
|
|
47
|
+
NativeAgentToolConfig | ToolsetConfig,
|
|
48
|
+
Field(discriminator="type"),
|
|
49
|
+
]
|
|
50
|
+
|
|
44
51
|
|
|
45
52
|
class NativeAgentConfig(BaseAgentConfig):
|
|
46
53
|
"""Configuration for a single agent in the system.
|
|
@@ -61,11 +68,8 @@ class NativeAgentConfig(BaseAgentConfig):
|
|
|
61
68
|
type: Literal["native"] = Field(default="native", init=False)
|
|
62
69
|
"""Top-level discriminator for agent type."""
|
|
63
70
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
model: AnyModelConfig | ModelId | str | None = Field(
|
|
68
|
-
default=None,
|
|
71
|
+
model: AnyModelConfig | ModelId | str = Field(
|
|
72
|
+
...,
|
|
69
73
|
examples=["openai:gpt-5-nano"],
|
|
70
74
|
title="Model configuration or name",
|
|
71
75
|
json_schema_extra={
|
|
@@ -78,7 +82,7 @@ class NativeAgentConfig(BaseAgentConfig):
|
|
|
78
82
|
Docs: https://phil65.github.io/agentpool/YAML%20Configuration/model_configuration/
|
|
79
83
|
"""
|
|
80
84
|
|
|
81
|
-
tools: list[
|
|
85
|
+
tools: list[AnyToolConfig | str] = Field(
|
|
82
86
|
default_factory=list,
|
|
83
87
|
examples=[
|
|
84
88
|
["webbrowser:open", "builtins:print"],
|
|
@@ -87,46 +91,30 @@ class NativeAgentConfig(BaseAgentConfig):
|
|
|
87
91
|
"type": "import",
|
|
88
92
|
"import_path": "webbrowser:open",
|
|
89
93
|
"name": "web_browser",
|
|
90
|
-
}
|
|
91
|
-
],
|
|
92
|
-
],
|
|
93
|
-
title="Tool configurations",
|
|
94
|
-
json_schema_extra={
|
|
95
|
-
"documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/"
|
|
96
|
-
},
|
|
97
|
-
)
|
|
98
|
-
"""A list of tools to register with this agent.
|
|
99
|
-
|
|
100
|
-
Docs: https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/
|
|
101
|
-
"""
|
|
102
|
-
|
|
103
|
-
toolsets: list[ToolsetConfig] = Field(
|
|
104
|
-
default_factory=list,
|
|
105
|
-
examples=[
|
|
106
|
-
[
|
|
94
|
+
},
|
|
107
95
|
{
|
|
108
|
-
"type": "
|
|
109
|
-
"
|
|
110
|
-
"namespace": "api",
|
|
96
|
+
"type": "bash",
|
|
97
|
+
"timeout": 30.0,
|
|
111
98
|
},
|
|
112
99
|
{
|
|
113
100
|
"type": "file_access",
|
|
114
101
|
},
|
|
115
102
|
{
|
|
116
|
-
"type": "
|
|
117
|
-
"user_id": "user123@example.com",
|
|
118
|
-
"toolsets": ["github", "slack"],
|
|
103
|
+
"type": "process_management",
|
|
119
104
|
},
|
|
120
105
|
],
|
|
121
106
|
],
|
|
122
|
-
title="
|
|
107
|
+
title="Tool configurations",
|
|
123
108
|
json_schema_extra={
|
|
124
|
-
"documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/
|
|
109
|
+
"documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/"
|
|
125
110
|
},
|
|
126
111
|
)
|
|
127
|
-
"""
|
|
112
|
+
"""A list of tools and toolsets to register with this agent.
|
|
113
|
+
|
|
114
|
+
Supports both single tools (bash, import, web_search, etc.) and
|
|
115
|
+
toolsets (file_access, process_management, code, etc.).
|
|
128
116
|
|
|
129
|
-
Docs: https://phil65.github.io/agentpool/YAML%20Configuration/
|
|
117
|
+
Docs: https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/
|
|
130
118
|
"""
|
|
131
119
|
|
|
132
120
|
session: str | SessionQuery | MemoryConfig | None = Field(
|
|
@@ -230,6 +218,18 @@ class NativeAgentConfig(BaseAgentConfig):
|
|
|
230
218
|
usage_limits: UsageLimits | None = Field(default=None, title="Usage limits")
|
|
231
219
|
"""Usage limits for this agent."""
|
|
232
220
|
|
|
221
|
+
model_providers: list[ProviderType] | None = Field(
|
|
222
|
+
default=None,
|
|
223
|
+
examples=[["models.dev"], ["anthropic", "openai"]],
|
|
224
|
+
title="Model providers",
|
|
225
|
+
)
|
|
226
|
+
"""List of model providers to use for model discovery.
|
|
227
|
+
|
|
228
|
+
When set, the agent's get_available_models() will return models from these
|
|
229
|
+
providers. Common values: "openai", "anthropic", "gemini", "mistral", etc.
|
|
230
|
+
If not set, defaults to ["models.dev"].
|
|
231
|
+
"""
|
|
232
|
+
|
|
233
233
|
tool_mode: ToolMode | None = Field(
|
|
234
234
|
default=None,
|
|
235
235
|
examples=["codemode"],
|
|
@@ -240,17 +240,6 @@ class NativeAgentConfig(BaseAgentConfig):
|
|
|
240
240
|
- "codemode": Tools are wrapped in a Python execution environment
|
|
241
241
|
"""
|
|
242
242
|
|
|
243
|
-
auto_cache: AutoCache = Field(
|
|
244
|
-
default="off",
|
|
245
|
-
examples=["off", "5m", "1h"],
|
|
246
|
-
title="Automatic caching",
|
|
247
|
-
)
|
|
248
|
-
"""Automatic prompt caching configuration:
|
|
249
|
-
- "off": No automatic caching
|
|
250
|
-
- "5m": Add cache point with 5 minute TTL
|
|
251
|
-
- "1h": Add cache point with 1 hour TTL
|
|
252
|
-
"""
|
|
253
|
-
|
|
254
243
|
hooks: HooksConfig | None = Field(
|
|
255
244
|
default=None,
|
|
256
245
|
title="Lifecycle hooks",
|
|
@@ -295,43 +284,76 @@ class NativeAgentConfig(BaseAgentConfig):
|
|
|
295
284
|
data["model"] = {"type": "string", "identifier": model}
|
|
296
285
|
return data
|
|
297
286
|
|
|
298
|
-
def
|
|
299
|
-
"""Get all resource providers for this agent.
|
|
300
|
-
providers: list[ResourceProvider] = []
|
|
301
|
-
|
|
302
|
-
# Add providers from toolsets
|
|
303
|
-
for toolset_config in self.toolsets:
|
|
304
|
-
try:
|
|
305
|
-
provider = toolset_config.get_provider()
|
|
306
|
-
providers.append(provider)
|
|
307
|
-
except Exception as e:
|
|
308
|
-
msg = "Failed to create provider for toolset"
|
|
309
|
-
logger.exception(msg, toolset_config)
|
|
310
|
-
raise ValueError(msg) from e
|
|
287
|
+
def get_tool_providers(self) -> list[ResourceProvider]:
|
|
288
|
+
"""Get all resource providers for this agent's tools.
|
|
311
289
|
|
|
312
|
-
|
|
290
|
+
Processes the unified tools list, separating:
|
|
291
|
+
- Toolsets: Each becomes its own ResourceProvider
|
|
292
|
+
- Single tools: Aggregated into a single StaticResourceProvider
|
|
313
293
|
|
|
314
|
-
|
|
315
|
-
|
|
294
|
+
Returns:
|
|
295
|
+
List of ResourceProvider instances
|
|
296
|
+
"""
|
|
316
297
|
from agentpool.tools.base import Tool
|
|
317
298
|
|
|
318
|
-
|
|
319
|
-
if not self.tools:
|
|
320
|
-
return None
|
|
299
|
+
providers: list[ResourceProvider] = []
|
|
321
300
|
static_tools: list[Tool] = []
|
|
301
|
+
|
|
322
302
|
for tool_config in self.tools:
|
|
303
|
+
# Skip builtin tools - they're handled via get_builtin_tools()
|
|
304
|
+
if isinstance(tool_config, BaseBuiltinToolConfig):
|
|
305
|
+
continue
|
|
306
|
+
|
|
323
307
|
try:
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
308
|
+
if isinstance(tool_config, BaseToolsetConfig):
|
|
309
|
+
# Toolset -> get its provider directly
|
|
310
|
+
providers.append(tool_config.get_provider())
|
|
311
|
+
elif isinstance(tool_config, str):
|
|
312
|
+
# String import path -> single tool
|
|
313
|
+
static_tools.append(Tool.from_callable(tool_config))
|
|
314
|
+
elif isinstance(tool_config, BaseToolConfig):
|
|
315
|
+
# Single tool config -> single tool
|
|
316
|
+
static_tools.append(tool_config.get_tool())
|
|
330
317
|
except Exception:
|
|
331
318
|
logger.exception("Failed to load tool", config=tool_config)
|
|
332
319
|
continue
|
|
333
320
|
|
|
334
|
-
|
|
321
|
+
# Wrap all single tools in one provider
|
|
322
|
+
if static_tools:
|
|
323
|
+
providers.append(StaticResourceProvider(name="tools", tools=static_tools))
|
|
324
|
+
|
|
325
|
+
return providers
|
|
326
|
+
|
|
327
|
+
# Keep old methods for backward compatibility during transition
|
|
328
|
+
def get_toolsets(self) -> list[ResourceProvider]:
|
|
329
|
+
"""Get toolset providers. Deprecated: use get_tool_providers() instead."""
|
|
330
|
+
return [
|
|
331
|
+
p
|
|
332
|
+
for p in self.get_tool_providers()
|
|
333
|
+
if not isinstance(p, StaticResourceProvider) or p.name != "tools"
|
|
334
|
+
]
|
|
335
|
+
|
|
336
|
+
def get_tool_provider(self) -> ResourceProvider | None:
|
|
337
|
+
"""Get single tools provider. Deprecated: use get_tool_providers() instead."""
|
|
338
|
+
for p in self.get_tool_providers():
|
|
339
|
+
if isinstance(p, StaticResourceProvider) and p.name == "tools":
|
|
340
|
+
return p
|
|
341
|
+
return None
|
|
342
|
+
|
|
343
|
+
def get_builtin_tools(self) -> list[Any]:
|
|
344
|
+
"""Get pydantic-ai builtin tools from config.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
List of AbstractBuiltinTool instances (WebSearchTool, etc.)
|
|
348
|
+
"""
|
|
349
|
+
builtin_tools: list[Any] = []
|
|
350
|
+
for tool_config in self.tools:
|
|
351
|
+
if isinstance(tool_config, BaseBuiltinToolConfig):
|
|
352
|
+
try:
|
|
353
|
+
builtin_tools.append(tool_config.get_builtin_tool())
|
|
354
|
+
except Exception:
|
|
355
|
+
logger.exception("Failed to load builtin tool", config=tool_config)
|
|
356
|
+
return builtin_tools
|
|
335
357
|
|
|
336
358
|
def get_session_config(self) -> MemoryConfig:
|
|
337
359
|
"""Get resolved memory configuration."""
|
agentpool/models/agui_agents.py
CHANGED
|
@@ -6,8 +6,8 @@ from typing import Literal
|
|
|
6
6
|
|
|
7
7
|
from pydantic import ConfigDict, Field
|
|
8
8
|
|
|
9
|
+
from agentpool_config import ToolConfig # noqa: TC001
|
|
9
10
|
from agentpool_config.nodes import BaseAgentConfig
|
|
10
|
-
from agentpool_config.tools import ToolConfig # noqa: TC001
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class AGUIAgentConfig(BaseAgentConfig):
|