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.
Files changed (311) hide show
  1. acp/__init__.py +13 -4
  2. acp/acp_requests.py +20 -77
  3. acp/agent/connection.py +8 -0
  4. acp/agent/implementations/debug_server/debug_server.py +6 -2
  5. acp/agent/protocol.py +6 -0
  6. acp/bridge/README.md +15 -2
  7. acp/bridge/__init__.py +3 -2
  8. acp/bridge/__main__.py +60 -19
  9. acp/bridge/ws_server.py +173 -0
  10. acp/bridge/ws_server_cli.py +89 -0
  11. acp/client/connection.py +38 -29
  12. acp/client/implementations/default_client.py +3 -2
  13. acp/client/implementations/headless_client.py +2 -2
  14. acp/connection.py +2 -2
  15. acp/notifications.py +20 -50
  16. acp/schema/__init__.py +2 -0
  17. acp/schema/agent_responses.py +21 -0
  18. acp/schema/client_requests.py +3 -3
  19. acp/schema/session_state.py +63 -29
  20. acp/stdio.py +39 -9
  21. acp/task/supervisor.py +2 -2
  22. acp/transports.py +362 -2
  23. acp/utils.py +17 -4
  24. agentpool/__init__.py +6 -1
  25. agentpool/agents/__init__.py +2 -0
  26. agentpool/agents/acp_agent/acp_agent.py +407 -277
  27. agentpool/agents/acp_agent/acp_converters.py +196 -38
  28. agentpool/agents/acp_agent/client_handler.py +191 -26
  29. agentpool/agents/acp_agent/session_state.py +17 -6
  30. agentpool/agents/agent.py +607 -572
  31. agentpool/agents/agui_agent/__init__.py +0 -2
  32. agentpool/agents/agui_agent/agui_agent.py +176 -110
  33. agentpool/agents/agui_agent/agui_converters.py +0 -131
  34. agentpool/agents/agui_agent/helpers.py +3 -4
  35. agentpool/agents/base_agent.py +632 -17
  36. agentpool/agents/claude_code_agent/FORKING.md +191 -0
  37. agentpool/agents/claude_code_agent/__init__.py +13 -1
  38. agentpool/agents/claude_code_agent/claude_code_agent.py +1058 -291
  39. agentpool/agents/claude_code_agent/converters.py +74 -143
  40. agentpool/agents/claude_code_agent/history.py +474 -0
  41. agentpool/agents/claude_code_agent/models.py +77 -0
  42. agentpool/agents/claude_code_agent/static_info.py +100 -0
  43. agentpool/agents/claude_code_agent/usage.py +242 -0
  44. agentpool/agents/context.py +40 -0
  45. agentpool/agents/events/__init__.py +24 -0
  46. agentpool/agents/events/builtin_handlers.py +67 -1
  47. agentpool/agents/events/event_emitter.py +32 -2
  48. agentpool/agents/events/events.py +104 -3
  49. agentpool/agents/events/infer_info.py +145 -0
  50. agentpool/agents/events/processors.py +254 -0
  51. agentpool/agents/interactions.py +41 -6
  52. agentpool/agents/modes.py +67 -0
  53. agentpool/agents/slashed_agent.py +5 -4
  54. agentpool/agents/tool_call_accumulator.py +213 -0
  55. agentpool/agents/tool_wrapping.py +18 -6
  56. agentpool/common_types.py +56 -21
  57. agentpool/config_resources/__init__.py +38 -1
  58. agentpool/config_resources/acp_assistant.yml +2 -2
  59. agentpool/config_resources/agents.yml +3 -0
  60. agentpool/config_resources/agents_template.yml +1 -0
  61. agentpool/config_resources/claude_code_agent.yml +10 -6
  62. agentpool/config_resources/external_acp_agents.yml +2 -1
  63. agentpool/delegation/base_team.py +4 -30
  64. agentpool/delegation/pool.py +136 -289
  65. agentpool/delegation/team.py +58 -57
  66. agentpool/delegation/teamrun.py +51 -55
  67. agentpool/diagnostics/__init__.py +53 -0
  68. agentpool/diagnostics/lsp_manager.py +1593 -0
  69. agentpool/diagnostics/lsp_proxy.py +41 -0
  70. agentpool/diagnostics/lsp_proxy_script.py +229 -0
  71. agentpool/diagnostics/models.py +398 -0
  72. agentpool/functional/run.py +10 -4
  73. agentpool/mcp_server/__init__.py +0 -2
  74. agentpool/mcp_server/client.py +76 -32
  75. agentpool/mcp_server/conversions.py +54 -13
  76. agentpool/mcp_server/manager.py +34 -54
  77. agentpool/mcp_server/registries/official_registry_client.py +35 -1
  78. agentpool/mcp_server/tool_bridge.py +186 -139
  79. agentpool/messaging/__init__.py +0 -2
  80. agentpool/messaging/compaction.py +72 -197
  81. agentpool/messaging/connection_manager.py +11 -10
  82. agentpool/messaging/event_manager.py +5 -5
  83. agentpool/messaging/message_container.py +6 -30
  84. agentpool/messaging/message_history.py +99 -8
  85. agentpool/messaging/messagenode.py +52 -14
  86. agentpool/messaging/messages.py +54 -35
  87. agentpool/messaging/processing.py +12 -22
  88. agentpool/models/__init__.py +1 -1
  89. agentpool/models/acp_agents/base.py +6 -24
  90. agentpool/models/acp_agents/mcp_capable.py +126 -157
  91. agentpool/models/acp_agents/non_mcp.py +129 -95
  92. agentpool/models/agents.py +98 -76
  93. agentpool/models/agui_agents.py +1 -1
  94. agentpool/models/claude_code_agents.py +144 -19
  95. agentpool/models/file_parsing.py +0 -1
  96. agentpool/models/manifest.py +113 -50
  97. agentpool/prompts/conversion_manager.py +1 -1
  98. agentpool/prompts/prompts.py +5 -2
  99. agentpool/repomap.py +1 -1
  100. agentpool/resource_providers/__init__.py +11 -1
  101. agentpool/resource_providers/aggregating.py +56 -5
  102. agentpool/resource_providers/base.py +70 -4
  103. agentpool/resource_providers/codemode/code_executor.py +72 -5
  104. agentpool/resource_providers/codemode/helpers.py +2 -2
  105. agentpool/resource_providers/codemode/provider.py +64 -12
  106. agentpool/resource_providers/codemode/remote_mcp_execution.py +2 -2
  107. agentpool/resource_providers/codemode/remote_provider.py +9 -12
  108. agentpool/resource_providers/filtering.py +3 -1
  109. agentpool/resource_providers/mcp_provider.py +89 -12
  110. agentpool/resource_providers/plan_provider.py +228 -46
  111. agentpool/resource_providers/pool.py +7 -3
  112. agentpool/resource_providers/resource_info.py +111 -0
  113. agentpool/resource_providers/static.py +4 -2
  114. agentpool/sessions/__init__.py +4 -1
  115. agentpool/sessions/manager.py +33 -5
  116. agentpool/sessions/models.py +59 -6
  117. agentpool/sessions/protocol.py +28 -0
  118. agentpool/sessions/session.py +11 -55
  119. agentpool/skills/registry.py +13 -8
  120. agentpool/storage/manager.py +572 -49
  121. agentpool/talk/registry.py +4 -4
  122. agentpool/talk/talk.py +9 -10
  123. agentpool/testing.py +538 -20
  124. agentpool/tool_impls/__init__.py +6 -0
  125. agentpool/tool_impls/agent_cli/__init__.py +42 -0
  126. agentpool/tool_impls/agent_cli/tool.py +95 -0
  127. agentpool/tool_impls/bash/__init__.py +64 -0
  128. agentpool/tool_impls/bash/helpers.py +35 -0
  129. agentpool/tool_impls/bash/tool.py +171 -0
  130. agentpool/tool_impls/delete_path/__init__.py +70 -0
  131. agentpool/tool_impls/delete_path/tool.py +142 -0
  132. agentpool/tool_impls/download_file/__init__.py +80 -0
  133. agentpool/tool_impls/download_file/tool.py +183 -0
  134. agentpool/tool_impls/execute_code/__init__.py +55 -0
  135. agentpool/tool_impls/execute_code/tool.py +163 -0
  136. agentpool/tool_impls/grep/__init__.py +80 -0
  137. agentpool/tool_impls/grep/tool.py +200 -0
  138. agentpool/tool_impls/list_directory/__init__.py +73 -0
  139. agentpool/tool_impls/list_directory/tool.py +197 -0
  140. agentpool/tool_impls/question/__init__.py +42 -0
  141. agentpool/tool_impls/question/tool.py +127 -0
  142. agentpool/tool_impls/read/__init__.py +104 -0
  143. agentpool/tool_impls/read/tool.py +305 -0
  144. agentpool/tools/__init__.py +2 -1
  145. agentpool/tools/base.py +114 -34
  146. agentpool/tools/manager.py +57 -1
  147. agentpool/ui/base.py +2 -2
  148. agentpool/ui/mock_provider.py +2 -2
  149. agentpool/ui/stdlib_provider.py +2 -2
  150. agentpool/utils/file_watcher.py +269 -0
  151. agentpool/utils/identifiers.py +121 -0
  152. agentpool/utils/pydantic_ai_helpers.py +46 -0
  153. agentpool/utils/streams.py +616 -2
  154. agentpool/utils/subprocess_utils.py +155 -0
  155. agentpool/utils/token_breakdown.py +461 -0
  156. agentpool/vfs_registry.py +7 -2
  157. {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/METADATA +41 -27
  158. agentpool-2.5.0.dist-info/RECORD +579 -0
  159. {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/WHEEL +1 -1
  160. agentpool_cli/__main__.py +24 -0
  161. agentpool_cli/create.py +1 -1
  162. agentpool_cli/serve_acp.py +100 -21
  163. agentpool_cli/serve_agui.py +87 -0
  164. agentpool_cli/serve_opencode.py +119 -0
  165. agentpool_cli/ui.py +557 -0
  166. agentpool_commands/__init__.py +42 -5
  167. agentpool_commands/agents.py +75 -2
  168. agentpool_commands/history.py +62 -0
  169. agentpool_commands/mcp.py +176 -0
  170. agentpool_commands/models.py +56 -3
  171. agentpool_commands/pool.py +260 -0
  172. agentpool_commands/session.py +1 -1
  173. agentpool_commands/text_sharing/__init__.py +119 -0
  174. agentpool_commands/text_sharing/base.py +123 -0
  175. agentpool_commands/text_sharing/github_gist.py +80 -0
  176. agentpool_commands/text_sharing/opencode.py +462 -0
  177. agentpool_commands/text_sharing/paste_rs.py +59 -0
  178. agentpool_commands/text_sharing/pastebin.py +116 -0
  179. agentpool_commands/text_sharing/shittycodingagent.py +112 -0
  180. agentpool_commands/tools.py +57 -0
  181. agentpool_commands/utils.py +80 -30
  182. agentpool_config/__init__.py +30 -2
  183. agentpool_config/agentpool_tools.py +498 -0
  184. agentpool_config/builtin_tools.py +77 -22
  185. agentpool_config/commands.py +24 -1
  186. agentpool_config/compaction.py +258 -0
  187. agentpool_config/converters.py +1 -1
  188. agentpool_config/event_handlers.py +42 -0
  189. agentpool_config/events.py +1 -1
  190. agentpool_config/forward_targets.py +1 -4
  191. agentpool_config/jinja.py +3 -3
  192. agentpool_config/mcp_server.py +132 -6
  193. agentpool_config/nodes.py +1 -1
  194. agentpool_config/observability.py +44 -0
  195. agentpool_config/session.py +0 -3
  196. agentpool_config/storage.py +82 -38
  197. agentpool_config/task.py +3 -3
  198. agentpool_config/tools.py +11 -22
  199. agentpool_config/toolsets.py +109 -233
  200. agentpool_server/a2a_server/agent_worker.py +307 -0
  201. agentpool_server/a2a_server/server.py +23 -18
  202. agentpool_server/acp_server/acp_agent.py +234 -181
  203. agentpool_server/acp_server/commands/acp_commands.py +151 -156
  204. agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +18 -17
  205. agentpool_server/acp_server/event_converter.py +651 -0
  206. agentpool_server/acp_server/input_provider.py +53 -10
  207. agentpool_server/acp_server/server.py +24 -90
  208. agentpool_server/acp_server/session.py +173 -331
  209. agentpool_server/acp_server/session_manager.py +8 -34
  210. agentpool_server/agui_server/server.py +3 -1
  211. agentpool_server/mcp_server/server.py +5 -2
  212. agentpool_server/opencode_server/.rules +95 -0
  213. agentpool_server/opencode_server/ENDPOINTS.md +401 -0
  214. agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md +202 -0
  215. agentpool_server/opencode_server/__init__.py +19 -0
  216. agentpool_server/opencode_server/command_validation.py +172 -0
  217. agentpool_server/opencode_server/converters.py +975 -0
  218. agentpool_server/opencode_server/dependencies.py +24 -0
  219. agentpool_server/opencode_server/input_provider.py +421 -0
  220. agentpool_server/opencode_server/models/__init__.py +250 -0
  221. agentpool_server/opencode_server/models/agent.py +53 -0
  222. agentpool_server/opencode_server/models/app.py +72 -0
  223. agentpool_server/opencode_server/models/base.py +26 -0
  224. agentpool_server/opencode_server/models/common.py +23 -0
  225. agentpool_server/opencode_server/models/config.py +37 -0
  226. agentpool_server/opencode_server/models/events.py +821 -0
  227. agentpool_server/opencode_server/models/file.py +88 -0
  228. agentpool_server/opencode_server/models/mcp.py +44 -0
  229. agentpool_server/opencode_server/models/message.py +179 -0
  230. agentpool_server/opencode_server/models/parts.py +323 -0
  231. agentpool_server/opencode_server/models/provider.py +81 -0
  232. agentpool_server/opencode_server/models/pty.py +43 -0
  233. agentpool_server/opencode_server/models/question.py +56 -0
  234. agentpool_server/opencode_server/models/session.py +111 -0
  235. agentpool_server/opencode_server/routes/__init__.py +29 -0
  236. agentpool_server/opencode_server/routes/agent_routes.py +473 -0
  237. agentpool_server/opencode_server/routes/app_routes.py +202 -0
  238. agentpool_server/opencode_server/routes/config_routes.py +302 -0
  239. agentpool_server/opencode_server/routes/file_routes.py +571 -0
  240. agentpool_server/opencode_server/routes/global_routes.py +94 -0
  241. agentpool_server/opencode_server/routes/lsp_routes.py +319 -0
  242. agentpool_server/opencode_server/routes/message_routes.py +761 -0
  243. agentpool_server/opencode_server/routes/permission_routes.py +63 -0
  244. agentpool_server/opencode_server/routes/pty_routes.py +300 -0
  245. agentpool_server/opencode_server/routes/question_routes.py +128 -0
  246. agentpool_server/opencode_server/routes/session_routes.py +1276 -0
  247. agentpool_server/opencode_server/routes/tui_routes.py +139 -0
  248. agentpool_server/opencode_server/server.py +475 -0
  249. agentpool_server/opencode_server/state.py +151 -0
  250. agentpool_server/opencode_server/time_utils.py +8 -0
  251. agentpool_storage/__init__.py +12 -0
  252. agentpool_storage/base.py +184 -2
  253. agentpool_storage/claude_provider/ARCHITECTURE.md +433 -0
  254. agentpool_storage/claude_provider/__init__.py +42 -0
  255. agentpool_storage/claude_provider/provider.py +1089 -0
  256. agentpool_storage/file_provider.py +278 -15
  257. agentpool_storage/memory_provider.py +193 -12
  258. agentpool_storage/models.py +3 -0
  259. agentpool_storage/opencode_provider/ARCHITECTURE.md +386 -0
  260. agentpool_storage/opencode_provider/__init__.py +16 -0
  261. agentpool_storage/opencode_provider/helpers.py +414 -0
  262. agentpool_storage/opencode_provider/provider.py +895 -0
  263. agentpool_storage/project_store.py +325 -0
  264. agentpool_storage/session_store.py +26 -6
  265. agentpool_storage/sql_provider/__init__.py +4 -2
  266. agentpool_storage/sql_provider/models.py +48 -0
  267. agentpool_storage/sql_provider/sql_provider.py +269 -3
  268. agentpool_storage/sql_provider/utils.py +12 -13
  269. agentpool_storage/zed_provider/__init__.py +16 -0
  270. agentpool_storage/zed_provider/helpers.py +281 -0
  271. agentpool_storage/zed_provider/models.py +130 -0
  272. agentpool_storage/zed_provider/provider.py +442 -0
  273. agentpool_storage/zed_provider.py +803 -0
  274. agentpool_toolsets/__init__.py +0 -2
  275. agentpool_toolsets/builtin/__init__.py +2 -12
  276. agentpool_toolsets/builtin/code.py +96 -57
  277. agentpool_toolsets/builtin/debug.py +118 -48
  278. agentpool_toolsets/builtin/execution_environment.py +115 -230
  279. agentpool_toolsets/builtin/file_edit/file_edit.py +115 -7
  280. agentpool_toolsets/builtin/skills.py +9 -4
  281. agentpool_toolsets/builtin/subagent_tools.py +64 -51
  282. agentpool_toolsets/builtin/workers.py +4 -2
  283. agentpool_toolsets/composio_toolset.py +2 -2
  284. agentpool_toolsets/entry_points.py +3 -1
  285. agentpool_toolsets/fsspec_toolset/__init__.py +13 -1
  286. agentpool_toolsets/fsspec_toolset/diagnostics.py +860 -73
  287. agentpool_toolsets/fsspec_toolset/grep.py +99 -7
  288. agentpool_toolsets/fsspec_toolset/helpers.py +3 -2
  289. agentpool_toolsets/fsspec_toolset/image_utils.py +161 -0
  290. agentpool_toolsets/fsspec_toolset/toolset.py +500 -95
  291. agentpool_toolsets/mcp_discovery/__init__.py +5 -0
  292. agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
  293. agentpool_toolsets/mcp_discovery/toolset.py +511 -0
  294. agentpool_toolsets/mcp_run_toolset.py +87 -12
  295. agentpool_toolsets/notifications.py +33 -33
  296. agentpool_toolsets/openapi.py +3 -1
  297. agentpool_toolsets/search_toolset.py +3 -1
  298. agentpool-2.1.9.dist-info/RECORD +0 -474
  299. agentpool_config/resources.py +0 -33
  300. agentpool_server/acp_server/acp_tools.py +0 -43
  301. agentpool_server/acp_server/commands/spawn.py +0 -210
  302. agentpool_storage/text_log_provider.py +0 -275
  303. agentpool_toolsets/builtin/agent_management.py +0 -239
  304. agentpool_toolsets/builtin/chain.py +0 -288
  305. agentpool_toolsets/builtin/history.py +0 -36
  306. agentpool_toolsets/builtin/integration.py +0 -85
  307. agentpool_toolsets/builtin/tool_management.py +0 -90
  308. agentpool_toolsets/builtin/user_interaction.py +0 -52
  309. agentpool_toolsets/semantic_memory_toolset.py +0 -536
  310. {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/entry_points.txt +0 -0
  311. {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
- skip_confirmations: bool = Field(default=False, title="Skip Confirmations")
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.skip_confirmations:
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
- @property
825
- def model_providers(self) -> list[ProviderType]:
826
- """Cursor supports multiple providers."""
827
- return ["openai", "anthropic", "gemini", "openrouter"]
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
  )
@@ -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 exxec.configs import ExecutionEnvironmentConfig # noqa: TC002
11
- from llmling_models.configs import AnyModelConfig # noqa: TC002
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.tools import BaseToolConfig, ToolConfig # noqa: TC001
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
- inherits: str | None = Field(default=None, title="Inheritance source")
65
- """Name of agent config to inherit from"""
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[ToolConfig | str] = Field(
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": "openapi",
109
- "spec": "https://api.example.com/openapi.json",
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": "composio",
117
- "user_id": "user123@example.com",
118
- "toolsets": ["github", "slack"],
103
+ "type": "process_management",
119
104
  },
120
105
  ],
121
106
  ],
122
- title="Toolset configurations",
107
+ title="Tool configurations",
123
108
  json_schema_extra={
124
- "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/toolset_configuration/"
109
+ "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/"
125
110
  },
126
111
  )
127
- """Toolset configurations for extensible tool collections.
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/toolset_configuration/
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 get_toolsets(self) -> list[ResourceProvider]:
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
- return providers
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
- def get_tool_provider(self) -> ResourceProvider | None:
315
- """Get tool provider for this agent."""
294
+ Returns:
295
+ List of ResourceProvider instances
296
+ """
316
297
  from agentpool.tools.base import Tool
317
298
 
318
- # Create provider for static tools
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
- match tool_config:
325
- case str():
326
- tool = Tool.from_callable(tool_config)
327
- static_tools.append(tool)
328
- case BaseToolConfig():
329
- static_tools.append(tool_config.get_tool())
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
- return StaticResourceProvider(name="builtin", tools=static_tools)
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."""
@@ -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):