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
@@ -0,0 +1,498 @@
1
+ """Models for agentpool standalone tool configuration."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Literal
6
+
7
+ from exxec_config import ExecutionEnvironmentConfig # noqa: TC002
8
+ from pydantic import ConfigDict, Field
9
+
10
+ from agentpool_config.converters import ConversionConfig # noqa: TC001
11
+ from agentpool_config.tools import BaseToolConfig
12
+
13
+
14
+ if TYPE_CHECKING:
15
+ from agentpool.tools.base import Tool
16
+
17
+
18
+ class BashToolConfig(BaseToolConfig):
19
+ """Configuration for bash command execution tool.
20
+
21
+ Example:
22
+ ```yaml
23
+ tools:
24
+ - type: bash
25
+ timeout: 30.0
26
+ output_limit: 10000
27
+ requires_confirmation: true
28
+ environment:
29
+ type: mock
30
+ deterministic_ids: true
31
+ ```
32
+ """
33
+
34
+ model_config = ConfigDict(title="Bash Tool")
35
+
36
+ type: Literal["bash"] = Field("bash", init=False)
37
+ """Bash command execution tool."""
38
+
39
+ timeout: float | None = Field(
40
+ default=None,
41
+ examples=[30.0, 60.0, 120.0],
42
+ title="Command timeout",
43
+ )
44
+ """Command timeout in seconds. None means no timeout."""
45
+
46
+ output_limit: int | None = Field(
47
+ default=None,
48
+ examples=[10000, 50000, 100000],
49
+ title="Output limit",
50
+ )
51
+ """Maximum bytes of output to return."""
52
+
53
+ environment: ExecutionEnvironmentConfig | None = Field(
54
+ default=None,
55
+ title="Execution environment",
56
+ )
57
+ """Execution environment for command execution. Falls back to agent's env if not set."""
58
+
59
+ def get_tool(self) -> Tool:
60
+ """Convert config to BashTool instance."""
61
+ from agentpool.tool_impls.bash import create_bash_tool
62
+
63
+ env = self.environment.get_provider() if self.environment else None
64
+ return create_bash_tool(
65
+ env=env,
66
+ timeout=self.timeout,
67
+ output_limit=self.output_limit,
68
+ name=self.name or "bash",
69
+ description=self.description or "Execute a shell command and return the output.",
70
+ requires_confirmation=self.requires_confirmation,
71
+ )
72
+
73
+
74
+ class AgentCliToolConfig(BaseToolConfig):
75
+ """Configuration for agent CLI tool.
76
+
77
+ Example:
78
+ ```yaml
79
+ tools:
80
+ - type: agent_cli
81
+ ```
82
+ """
83
+
84
+ model_config = ConfigDict(title="Agent CLI Tool")
85
+
86
+ type: Literal["agent_cli"] = Field("agent_cli", init=False)
87
+ """Agent CLI tool."""
88
+
89
+ def get_tool(self) -> Tool:
90
+ """Convert config to AgentCliTool instance."""
91
+ from agentpool.tool_impls.agent_cli import create_agent_cli_tool
92
+
93
+ return create_agent_cli_tool(
94
+ name=self.name or "run_agent_cli_command",
95
+ description=self.description or "Execute an internal agent management command.",
96
+ requires_confirmation=self.requires_confirmation,
97
+ )
98
+
99
+
100
+ class QuestionToolConfig(BaseToolConfig):
101
+ """Configuration for user interaction tool.
102
+
103
+ Example:
104
+ ```yaml
105
+ tools:
106
+ - type: question
107
+ ```
108
+ """
109
+
110
+ model_config = ConfigDict(title="Ask User Tool")
111
+
112
+ type: Literal["question"] = Field("question", init=False)
113
+ """User interaction tool."""
114
+
115
+ def get_tool(self) -> Tool:
116
+ """Convert config to QuestionTool instance."""
117
+ from agentpool.tool_impls.question import create_question_tool
118
+
119
+ return create_question_tool(
120
+ name=self.name or "question",
121
+ description=self.description or "Ask the user a clarifying question.",
122
+ requires_confirmation=self.requires_confirmation,
123
+ )
124
+
125
+
126
+ class ExecuteCodeToolConfig(BaseToolConfig):
127
+ """Configuration for Python code execution tool.
128
+
129
+ Example:
130
+ ```yaml
131
+ tools:
132
+ - type: execute_code
133
+ requires_confirmation: true
134
+ environment:
135
+ type: mock
136
+ deterministic_ids: true
137
+ ```
138
+ """
139
+
140
+ model_config = ConfigDict(title="Execute Code Tool")
141
+
142
+ type: Literal["execute_code"] = Field("execute_code", init=False)
143
+ """Python code execution tool."""
144
+
145
+ environment: ExecutionEnvironmentConfig | None = Field(
146
+ default=None,
147
+ title="Execution environment",
148
+ )
149
+ """Execution environment for code execution. Falls back to agent's env if not set."""
150
+
151
+ def get_tool(self) -> Tool:
152
+ """Convert config to ExecuteCodeTool instance."""
153
+ from agentpool.tool_impls.execute_code import create_execute_code_tool
154
+
155
+ env = self.environment.get_provider() if self.environment else None
156
+ return create_execute_code_tool(
157
+ env=env,
158
+ name=self.name or "execute_code",
159
+ description=self.description or "Execute Python code and return the result.",
160
+ requires_confirmation=self.requires_confirmation,
161
+ )
162
+
163
+
164
+ class ReadToolConfig(BaseToolConfig):
165
+ """Configuration for file reading tool.
166
+
167
+ Example:
168
+ ```yaml
169
+ tools:
170
+ - type: read
171
+ max_file_size_kb: 128
172
+ max_image_size: 1500
173
+ large_file_tokens: 10000
174
+ conversion:
175
+ default_provider: markitdown
176
+ environment:
177
+ type: local
178
+ ```
179
+ """
180
+
181
+ model_config = ConfigDict(title="Read Tool")
182
+
183
+ type: Literal["read"] = Field("read", init=False)
184
+ """File reading tool."""
185
+
186
+ environment: ExecutionEnvironmentConfig | None = Field(
187
+ default=None,
188
+ title="Execution environment",
189
+ )
190
+ """Execution environment for filesystem access. Falls back to agent's env if not set."""
191
+
192
+ cwd: str | None = Field(
193
+ default=None,
194
+ title="Working directory",
195
+ )
196
+ """Working directory for resolving relative paths."""
197
+
198
+ max_file_size_kb: int = Field(
199
+ default=64,
200
+ examples=[64, 128, 256],
201
+ title="Max file size",
202
+ )
203
+ """Maximum file size in KB for read operations."""
204
+
205
+ max_image_size: int | None = Field(
206
+ default=2000,
207
+ examples=[1500, 2000, 2500],
208
+ title="Max image dimensions",
209
+ )
210
+ """Max width/height for images in pixels. Images are auto-resized if larger."""
211
+
212
+ max_image_bytes: int | None = Field(
213
+ default=None,
214
+ title="Max image file size",
215
+ )
216
+ """Max file size for images in bytes. Images are compressed if larger."""
217
+
218
+ large_file_tokens: int = Field(
219
+ default=12_000,
220
+ examples=[10_000, 12_000, 15_000],
221
+ title="Large file threshold",
222
+ )
223
+ """Token threshold for switching to structure map for large files."""
224
+
225
+ map_max_tokens: int = Field(
226
+ default=2048,
227
+ examples=[1024, 2048, 4096],
228
+ title="Structure map max tokens",
229
+ )
230
+ """Maximum tokens for structure map output."""
231
+
232
+ conversion: ConversionConfig | None = Field(
233
+ default=None,
234
+ title="Conversion config",
235
+ )
236
+ """Optional conversion config for binary files. If set, converts supported files to markdown."""
237
+
238
+ def get_tool(self) -> Tool:
239
+ """Convert config to ReadTool instance."""
240
+ from agentpool.tool_impls.read import create_read_tool
241
+
242
+ env = self.environment.get_provider() if self.environment else None
243
+
244
+ # Create converter if conversion config is provided
245
+ converter = None
246
+ if self.conversion is not None:
247
+ try:
248
+ from agentpool.prompts.conversion_manager import ConversionManager
249
+
250
+ converter = ConversionManager(self.conversion)
251
+ except Exception: # noqa: BLE001
252
+ # ConversionManager not available, continue without it
253
+ pass
254
+
255
+ return create_read_tool(
256
+ env=env,
257
+ converter=converter,
258
+ cwd=self.cwd,
259
+ max_file_size_kb=self.max_file_size_kb,
260
+ max_image_size=self.max_image_size,
261
+ max_image_bytes=self.max_image_bytes,
262
+ large_file_tokens=self.large_file_tokens,
263
+ map_max_tokens=self.map_max_tokens,
264
+ name=self.name or "read",
265
+ description=self.description or "Read file contents with automatic format detection.",
266
+ requires_confirmation=self.requires_confirmation,
267
+ )
268
+
269
+
270
+ class ListDirectoryToolConfig(BaseToolConfig):
271
+ """Configuration for directory listing tool.
272
+
273
+ Example:
274
+ ```yaml
275
+ tools:
276
+ - type: list_directory
277
+ max_items: 1000
278
+ environment:
279
+ type: local
280
+ ```
281
+ """
282
+
283
+ model_config = ConfigDict(title="List Directory Tool")
284
+
285
+ type: Literal["list_directory"] = Field("list_directory", init=False)
286
+ """Directory listing tool."""
287
+
288
+ environment: ExecutionEnvironmentConfig | None = Field(
289
+ default=None,
290
+ title="Execution environment",
291
+ )
292
+ """Execution environment for filesystem access. Falls back to agent's env if not set."""
293
+
294
+ cwd: str | None = Field(
295
+ default=None,
296
+ title="Working directory",
297
+ )
298
+ """Working directory for resolving relative paths."""
299
+
300
+ max_items: int = Field(
301
+ default=500,
302
+ examples=[500, 1000, 2000],
303
+ title="Max items",
304
+ )
305
+ """Maximum number of items to return (safety limit)."""
306
+
307
+ def get_tool(self) -> Tool:
308
+ """Convert config to ListDirectoryTool instance."""
309
+ from agentpool.tool_impls.list_directory import create_list_directory_tool
310
+
311
+ env = self.environment.get_provider() if self.environment else None
312
+ return create_list_directory_tool(
313
+ env=env,
314
+ cwd=self.cwd,
315
+ max_items=self.max_items,
316
+ name=self.name or "list_directory",
317
+ description=self.description or "List files in a directory with filtering support.",
318
+ requires_confirmation=self.requires_confirmation,
319
+ )
320
+
321
+
322
+ class GrepToolConfig(BaseToolConfig):
323
+ """Configuration for grep search tool.
324
+
325
+ Example:
326
+ ```yaml
327
+ tools:
328
+ - type: grep
329
+ max_output_kb: 128
330
+ use_subprocess_grep: true
331
+ environment:
332
+ type: local
333
+ ```
334
+ """
335
+
336
+ model_config = ConfigDict(title="Grep Tool")
337
+
338
+ type: Literal["grep"] = Field("grep", init=False)
339
+ """Grep search tool."""
340
+
341
+ environment: ExecutionEnvironmentConfig | None = Field(
342
+ default=None,
343
+ title="Execution environment",
344
+ )
345
+ """Execution environment for filesystem access. Falls back to agent's env if not set."""
346
+
347
+ cwd: str | None = Field(
348
+ default=None,
349
+ title="Working directory",
350
+ )
351
+ """Working directory for resolving relative paths."""
352
+
353
+ max_output_kb: int = Field(
354
+ default=64,
355
+ examples=[64, 128, 256],
356
+ title="Max output size",
357
+ )
358
+ """Maximum output size in KB."""
359
+
360
+ use_subprocess_grep: bool = Field(
361
+ default=True,
362
+ title="Use subprocess grep",
363
+ )
364
+ """Use ripgrep/grep subprocess if available (faster for large codebases)."""
365
+
366
+ def get_tool(self) -> Tool:
367
+ """Convert config to GrepTool instance."""
368
+ from agentpool.tool_impls.grep import create_grep_tool
369
+
370
+ env = self.environment.get_provider() if self.environment else None
371
+ return create_grep_tool(
372
+ env=env,
373
+ cwd=self.cwd,
374
+ max_output_kb=self.max_output_kb,
375
+ use_subprocess_grep=self.use_subprocess_grep,
376
+ name=self.name or "grep",
377
+ description=self.description or "Search file contents for patterns.",
378
+ requires_confirmation=self.requires_confirmation,
379
+ )
380
+
381
+
382
+ class DeletePathToolConfig(BaseToolConfig):
383
+ """Configuration for delete path tool.
384
+
385
+ Example:
386
+ ```yaml
387
+ tools:
388
+ - type: delete_path
389
+ requires_confirmation: true
390
+ environment:
391
+ type: local
392
+ ```
393
+ """
394
+
395
+ model_config = ConfigDict(title="Delete Path Tool")
396
+
397
+ type: Literal["delete_path"] = Field("delete_path", init=False)
398
+ """Delete path tool."""
399
+
400
+ environment: ExecutionEnvironmentConfig | None = Field(
401
+ default=None,
402
+ title="Execution environment",
403
+ )
404
+ """Execution environment for filesystem access. Falls back to agent's env if not set."""
405
+
406
+ cwd: str | None = Field(
407
+ default=None,
408
+ title="Working directory",
409
+ )
410
+ """Working directory for resolving relative paths."""
411
+
412
+ def get_tool(self) -> Tool:
413
+ """Convert config to DeletePathTool instance."""
414
+ from agentpool.tool_impls.delete_path import create_delete_path_tool
415
+
416
+ env = self.environment.get_provider() if self.environment else None
417
+ return create_delete_path_tool(
418
+ env=env,
419
+ cwd=self.cwd,
420
+ name=self.name or "delete_path",
421
+ description=self.description or "Delete a file or directory.",
422
+ requires_confirmation=self.requires_confirmation,
423
+ )
424
+
425
+
426
+ class DownloadFileToolConfig(BaseToolConfig):
427
+ """Configuration for file download tool.
428
+
429
+ Example:
430
+ ```yaml
431
+ tools:
432
+ - type: download_file
433
+ chunk_size: 16384
434
+ timeout: 60.0
435
+ environment:
436
+ type: local
437
+ ```
438
+ """
439
+
440
+ model_config = ConfigDict(title="Download File Tool")
441
+
442
+ type: Literal["download_file"] = Field("download_file", init=False)
443
+ """File download tool."""
444
+
445
+ environment: ExecutionEnvironmentConfig | None = Field(
446
+ default=None,
447
+ title="Execution environment",
448
+ )
449
+ """Execution environment for filesystem access. Falls back to agent's env if not set."""
450
+
451
+ cwd: str | None = Field(
452
+ default=None,
453
+ title="Working directory",
454
+ )
455
+ """Working directory for resolving relative paths."""
456
+
457
+ chunk_size: int = Field(
458
+ default=8192,
459
+ examples=[8192, 16384, 32768],
460
+ title="Chunk size",
461
+ )
462
+ """Size of chunks to download in bytes."""
463
+
464
+ timeout: float = Field(
465
+ default=30.0,
466
+ examples=[30.0, 60.0, 120.0],
467
+ title="Request timeout",
468
+ )
469
+ """Request timeout in seconds."""
470
+
471
+ def get_tool(self) -> Tool:
472
+ """Convert config to DownloadFileTool instance."""
473
+ from agentpool.tool_impls.download_file import create_download_file_tool
474
+
475
+ env = self.environment.get_provider() if self.environment else None
476
+ return create_download_file_tool(
477
+ env=env,
478
+ cwd=self.cwd,
479
+ chunk_size=self.chunk_size,
480
+ timeout=self.timeout,
481
+ name=self.name or "download_file",
482
+ description=self.description or "Download a file from a URL.",
483
+ requires_confirmation=self.requires_confirmation,
484
+ )
485
+
486
+
487
+ # Union type for agentpool tool configs
488
+ AgentpoolToolConfig = (
489
+ AgentCliToolConfig
490
+ | QuestionToolConfig
491
+ | BashToolConfig
492
+ | DeletePathToolConfig
493
+ | DownloadFileToolConfig
494
+ | ExecuteCodeToolConfig
495
+ | GrepToolConfig
496
+ | ListDirectoryToolConfig
497
+ | ReadToolConfig
498
+ )
@@ -25,17 +25,33 @@ if TYPE_CHECKING:
25
25
  class BaseBuiltinToolConfig(BaseToolConfig):
26
26
  """Base configuration for PydanticAI builtin tools."""
27
27
 
28
+ type: Literal["builtin"] = Field("builtin", init=False)
29
+ """Top-level discriminator - always 'builtin' for builtin tools."""
30
+
31
+ builtin_type: str = Field(init=False)
32
+ """Sub-discriminator for specific builtin tool type."""
33
+
28
34
  def get_builtin_tool(self) -> AbstractBuiltinTool:
29
35
  """Convert config to PydanticAI builtin tool instance."""
30
36
  raise NotImplementedError
31
37
 
32
38
 
33
39
  class WebSearchToolConfig(BaseBuiltinToolConfig):
34
- """Configuration for PydanticAI web search builtin tool."""
40
+ """Configuration for PydanticAI web search builtin tool.
41
+
42
+ Example:
43
+ ```yaml
44
+ tools:
45
+ - type: builtin
46
+ builtin_type: web_search
47
+ search_context_size: high
48
+ blocked_domains: ["spam.com"]
49
+ ```
50
+ """
35
51
 
36
52
  model_config = ConfigDict(title="Web Search Tool")
37
53
 
38
- type: Literal["web_search"] = Field("web_search", init=False)
54
+ builtin_type: Literal["web_search"] = Field("web_search", init=False)
39
55
  """Web search builtin tool."""
40
56
 
41
57
  search_context_size: Literal["low", "medium", "high"] = Field(
@@ -77,11 +93,19 @@ class WebSearchToolConfig(BaseBuiltinToolConfig):
77
93
 
78
94
 
79
95
  class CodeExecutionToolConfig(BaseBuiltinToolConfig):
80
- """Configuration for PydanticAI code execution builtin tool."""
96
+ """Configuration for PydanticAI code execution builtin tool.
97
+
98
+ Example:
99
+ ```yaml
100
+ tools:
101
+ - type: builtin
102
+ builtin_type: code_execution
103
+ ```
104
+ """
81
105
 
82
106
  model_config = ConfigDict(title="Code Execution Tool")
83
107
 
84
- type: Literal["code_execution"] = Field("code_execution", init=False)
108
+ builtin_type: Literal["code_execution"] = Field("code_execution", init=False)
85
109
  """Code execution builtin tool."""
86
110
 
87
111
  def get_builtin_tool(self) -> CodeExecutionTool:
@@ -90,12 +114,20 @@ class CodeExecutionToolConfig(BaseBuiltinToolConfig):
90
114
 
91
115
 
92
116
  class WebFetchToolConfig(BaseBuiltinToolConfig):
93
- """Configuration for PydanticAI URL context builtin tool."""
117
+ """Configuration for PydanticAI web fetch builtin tool.
118
+
119
+ Example:
120
+ ```yaml
121
+ tools:
122
+ - type: builtin
123
+ builtin_type: web_fetch
124
+ ```
125
+ """
94
126
 
95
- model_config = ConfigDict(title="Url Context Tool")
127
+ model_config = ConfigDict(title="Web Fetch Tool")
96
128
 
97
- type: Literal["web_fetch"] = Field("web_fetch", init=False)
98
- """URL context builtin tool."""
129
+ builtin_type: Literal["web_fetch"] = Field("web_fetch", init=False)
130
+ """Web fetch builtin tool."""
99
131
 
100
132
  def get_builtin_tool(self) -> WebFetchTool:
101
133
  """Convert config to WebFetchTool instance."""
@@ -103,11 +135,21 @@ class WebFetchToolConfig(BaseBuiltinToolConfig):
103
135
 
104
136
 
105
137
  class ImageGenerationToolConfig(BaseBuiltinToolConfig):
106
- """Configuration for PydanticAI image generation builtin tool."""
138
+ """Configuration for PydanticAI image generation builtin tool.
139
+
140
+ Example:
141
+ ```yaml
142
+ tools:
143
+ - type: builtin
144
+ builtin_type: image_generation
145
+ quality: high
146
+ size: 1024x1024
147
+ ```
148
+ """
107
149
 
108
150
  model_config = ConfigDict(title="Image Generation Tool")
109
151
 
110
- type: Literal["image_generation"] = Field("image_generation", init=False)
152
+ builtin_type: Literal["image_generation"] = Field("image_generation", init=False)
111
153
  """Image generation builtin tool."""
112
154
 
113
155
  background: Literal["transparent", "opaque", "auto"] = Field(
@@ -184,11 +226,19 @@ class ImageGenerationToolConfig(BaseBuiltinToolConfig):
184
226
 
185
227
 
186
228
  class MemoryToolConfig(BaseBuiltinToolConfig):
187
- """Configuration for PydanticAI memory builtin tool."""
229
+ """Configuration for PydanticAI memory builtin tool.
230
+
231
+ Example:
232
+ ```yaml
233
+ tools:
234
+ - type: builtin
235
+ builtin_type: memory
236
+ ```
237
+ """
188
238
 
189
239
  model_config = ConfigDict(title="Memory Tool")
190
240
 
191
- type: Literal["memory"] = Field("memory", init=False)
241
+ builtin_type: Literal["memory"] = Field("memory", init=False)
192
242
  """Memory builtin tool."""
193
243
 
194
244
  def get_builtin_tool(self) -> MemoryTool:
@@ -197,11 +247,21 @@ class MemoryToolConfig(BaseBuiltinToolConfig):
197
247
 
198
248
 
199
249
  class MCPServerToolConfig(BaseBuiltinToolConfig):
200
- """Configuration for PydanticAI MCP server builtin tool."""
250
+ """Configuration for PydanticAI MCP server builtin tool.
251
+
252
+ Example:
253
+ ```yaml
254
+ tools:
255
+ - type: builtin
256
+ builtin_type: mcp_server
257
+ id: my_server
258
+ url: https://api.example.com/mcp
259
+ ```
260
+ """
201
261
 
202
262
  model_config = ConfigDict(title="MCP Server Tool")
203
263
 
204
- type: Literal["mcp_server"] = Field("mcp_server", init=False)
264
+ builtin_type: Literal["mcp_server"] = Field("mcp_server", init=False)
205
265
  """MCP server builtin tool."""
206
266
 
207
267
  server_id: str = Field(
@@ -224,12 +284,7 @@ class MCPServerToolConfig(BaseBuiltinToolConfig):
224
284
  )
225
285
  """Authorization header to use when making requests to the MCP server."""
226
286
 
227
- description: str | None = Field(
228
- default=None,
229
- examples=["External API tools", "Code execution server"],
230
- title="Server description",
231
- )
232
- """A description of the MCP server."""
287
+ # description is inherited from BaseToolConfig
233
288
 
234
289
  allowed_tools: list[str] | None = Field(
235
290
  default=None,
@@ -253,7 +308,7 @@ class MCPServerToolConfig(BaseBuiltinToolConfig):
253
308
  )
254
309
 
255
310
 
256
- # Union type for builtin tool configs
311
+ # Union type for builtin tool configs (sub-discriminated by builtin_type)
257
312
  BuiltinToolConfig = Annotated[
258
313
  WebSearchToolConfig
259
314
  | CodeExecutionToolConfig
@@ -261,5 +316,5 @@ BuiltinToolConfig = Annotated[
261
316
  | ImageGenerationToolConfig
262
317
  | MemoryToolConfig
263
318
  | MCPServerToolConfig,
264
- Field(discriminator="type"),
319
+ Field(discriminator="builtin_type"),
265
320
  ]