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
@@ -7,11 +7,10 @@ from asyncio import Lock
7
7
  from contextlib import AsyncExitStack, asynccontextmanager, suppress
8
8
  import os
9
9
  from pathlib import Path
10
- from typing import TYPE_CHECKING, Any, Literal, Self, Unpack, overload
10
+ from typing import TYPE_CHECKING, Any, Self, Unpack, overload
11
11
 
12
12
  from anyenv import ProcessManager
13
13
  import anyio
14
- from llmling_models.configs.model_configs import BaseModelConfig
15
14
  from upathtools import UPath
16
15
 
17
16
  from agentpool.agents import Agent
@@ -40,7 +39,6 @@ if TYPE_CHECKING:
40
39
  from pydantic_ai import ModelSettings
41
40
  from pydantic_ai.models import Model
42
41
  from pydantic_ai.output import OutputSpec
43
- from tokonomics.model_names import ModelId
44
42
  from upathtools import JoinablePathLike
45
43
 
46
44
  from agentpool.agents.acp_agent import ACPAgent
@@ -52,20 +50,14 @@ if TYPE_CHECKING:
52
50
  AgentName,
53
51
  BuiltinEventHandlerType,
54
52
  IndividualEventHandler,
55
- SessionIdType,
56
- SupportsStructuredOutput,
57
53
  )
58
54
  from agentpool.delegation.base_team import BaseTeam
59
55
  from agentpool.mcp_server.tool_bridge import ToolManagerBridge
60
- from agentpool.models import (
61
- AGUIAgentConfig,
62
- AnyAgentConfig,
63
- BaseACPAgentConfig,
64
- ClaudeCodeAgentConfig,
65
- )
56
+ from agentpool.messaging import ChatMessage
57
+ from agentpool.messaging.compaction import CompactionPipeline
58
+ from agentpool.models import AnyAgentConfig
66
59
  from agentpool.models.manifest import AgentsManifest
67
60
  from agentpool.ui.base import InputProvider
68
- from agentpool_config.session import SessionQuery
69
61
  from agentpool_config.task import Job
70
62
 
71
63
 
@@ -111,13 +103,16 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
111
103
  ValueError: If manifest contains invalid node configurations
112
104
  RuntimeError: If node initialization fails
113
105
  """
114
- super().__init__()
115
106
  from agentpool.mcp_server.manager import MCPManager
116
107
  from agentpool.models.manifest import AgentsManifest
117
108
  from agentpool.observability import registry
118
109
  from agentpool.sessions import SessionManager
119
110
  from agentpool.skills.manager import SkillsManager
120
111
  from agentpool.storage import StorageManager
112
+ from agentpool.utils.streams import FileOpsTracker, TodoTracker
113
+ from agentpool_toolsets.builtin.debug import install_memory_handler
114
+
115
+ super().__init__()
121
116
 
122
117
  match manifest:
123
118
  case None:
@@ -131,6 +126,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
131
126
  raise ValueError(msg)
132
127
 
133
128
  registry.configure_observability(self.manifest.observability)
129
+ self._memory_log_handler = install_memory_handler()
134
130
  self.shared_deps_type = shared_deps_type
135
131
  self._input_provider = input_provider
136
132
  self.exit_stack = AsyncExitStack()
@@ -149,22 +145,19 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
149
145
  for name, task in self.manifest.jobs.items():
150
146
  self._tasks.register(name, task)
151
147
  self.process_manager = ProcessManager()
152
- self.pool_talk = TeamTalk[Any].from_nodes(list(self.nodes.values()))
153
-
148
+ self.file_ops = FileOpsTracker()
149
+ # Todo/plan tracker for task management
150
+ self.todos = TodoTracker()
154
151
  # Create all agents from unified manifest.agents dict
155
152
  for name, config in self.manifest.agents.items():
156
- agent = self._create_agent_from_config(
157
- name,
158
- config,
159
- deps_type=shared_deps_type,
160
- )
153
+ agent = self._create_agent_from_config(name, config, deps_type=shared_deps_type)
161
154
  agent.agent_pool = self
162
155
  self.register(name, agent)
163
156
 
164
157
  self._create_teams()
165
158
  if connect_nodes:
166
159
  self._connect_nodes()
167
-
160
+ self.pool_talk = TeamTalk[Any].from_nodes(list(self.nodes.values()))
168
161
  self._enter_lock = Lock() # Initialize async safety fields
169
162
  self._running_count = 0
170
163
 
@@ -179,32 +172,23 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
179
172
  await self.exit_stack.enter_async_context(self.mcp)
180
173
  await self.exit_stack.enter_async_context(self.skills)
181
174
  aggregating_provider = self.mcp.get_aggregating_provider()
182
- agents = list(self.agents.values())
183
- acp_agents = list(self.acp_agents.values())
184
- agui_agents = list(self.agui_agents.values())
185
- claude_code_agents = list(self.claude_code_agents.values())
175
+ agents = list(self.all_agents.values())
186
176
  teams = list(self.teams.values())
187
177
  for agent in agents:
188
178
  agent.tools.add_provider(aggregating_provider)
189
179
  # Collect remaining components to initialize (MCP already initialized)
190
- components: list[AbstractAsyncContextManager[Any]] = [
180
+ comps: list[AbstractAsyncContextManager[Any]] = [
191
181
  self.storage,
192
182
  self.sessions,
193
183
  *agents,
194
- *acp_agents,
195
- *agui_agents,
196
- *claude_code_agents,
197
184
  *teams,
198
185
  ]
199
- # MCP server is now managed externally - removed from pool
200
- # Initialize all components
186
+ node_inits = [self.exit_stack.enter_async_context(c) for c in comps]
201
187
  if self.parallel_load:
202
- await asyncio.gather(
203
- *(self.exit_stack.enter_async_context(c) for c in components)
204
- )
188
+ await asyncio.gather(*node_inits)
205
189
  else:
206
- for component in components:
207
- await self.exit_stack.enter_async_context(component)
190
+ for init in node_inits:
191
+ await init
208
192
 
209
193
  except Exception as e:
210
194
  await self.cleanup()
@@ -240,7 +224,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
240
224
  name: str = "pool_tools",
241
225
  host: str = "127.0.0.1",
242
226
  port: int = 0,
243
- transport: Literal["sse", "streamable-http"] = "sse",
244
227
  ) -> ToolManagerBridge:
245
228
  """Create and start a tool bridge for exposing tools to external agents.
246
229
 
@@ -253,7 +236,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
253
236
  name: Unique name for this bridge
254
237
  host: Host to bind the HTTP server to
255
238
  port: Port to bind to (0 = auto-select)
256
- transport: Transport protocol ('sse' or 'streamable-http')
257
239
 
258
240
  Returns:
259
241
  Started ToolManagerBridge instance
@@ -281,7 +263,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
281
263
  config = BridgeConfig(
282
264
  host=host,
283
265
  port=port,
284
- transport=transport,
285
266
  server_name=f"agentpool-{name}",
286
267
  )
287
268
  bridge = ToolManagerBridge(node=node, config=config)
@@ -327,9 +308,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
327
308
  name: str | None = None,
328
309
  description: str | None = None,
329
310
  shared_prompt: str | None = None,
330
- picker: SupportsStructuredOutput | None = None,
331
- num_picks: int | None = None,
332
- pick_prompt: str | None = None,
333
311
  ) -> TeamRun[TPoolDeps, TResult]: ...
334
312
 
335
313
  @overload
@@ -341,9 +319,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
341
319
  name: str | None = None,
342
320
  description: str | None = None,
343
321
  shared_prompt: str | None = None,
344
- picker: SupportsStructuredOutput | None = None,
345
- num_picks: int | None = None,
346
- pick_prompt: str | None = None,
347
322
  ) -> TeamRun[TDeps, TResult]: ...
348
323
 
349
324
  @overload
@@ -355,9 +330,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
355
330
  name: str | None = None,
356
331
  description: str | None = None,
357
332
  shared_prompt: str | None = None,
358
- picker: SupportsStructuredOutput | None = None,
359
- num_picks: int | None = None,
360
- pick_prompt: str | None = None,
361
333
  ) -> TeamRun[Any, TResult]: ...
362
334
 
363
335
  def create_team_run[TResult](
@@ -368,9 +340,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
368
340
  name: str | None = None,
369
341
  description: str | None = None,
370
342
  shared_prompt: str | None = None,
371
- picker: SupportsStructuredOutput | None = None,
372
- num_picks: int | None = None,
373
- pick_prompt: str | None = None,
374
343
  ) -> TeamRun[Any, TResult]:
375
344
  """Create a a sequential TeamRun from a list of Agents.
376
345
 
@@ -380,9 +349,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
380
349
  name: Optional name for the team
381
350
  description: Optional description for the team
382
351
  shared_prompt: Optional prompt for all agents
383
- picker: Agent to use for picking agents
384
- num_picks: Number of agents to pick
385
- pick_prompt: Prompt to use for picking agents
386
352
  """
387
353
  from agentpool.delegation.teamrun import TeamRun
388
354
 
@@ -394,9 +360,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
394
360
  description=description,
395
361
  validator=validator,
396
362
  shared_prompt=shared_prompt,
397
- picker=picker,
398
- num_picks=num_picks,
399
- pick_prompt=pick_prompt,
400
363
  )
401
364
  if name:
402
365
  self[name] = team
@@ -413,9 +376,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
413
376
  name: str | None = None,
414
377
  description: str | None = None,
415
378
  shared_prompt: str | None = None,
416
- picker: SupportsStructuredOutput | None = None,
417
- num_picks: int | None = None,
418
- pick_prompt: str | None = None,
419
379
  ) -> Team[TDeps]: ...
420
380
 
421
381
  @overload
@@ -426,9 +386,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
426
386
  name: str | None = None,
427
387
  description: str | None = None,
428
388
  shared_prompt: str | None = None,
429
- picker: SupportsStructuredOutput | None = None,
430
- num_picks: int | None = None,
431
- pick_prompt: str | None = None,
432
389
  ) -> Team[Any]: ...
433
390
 
434
391
  def create_team(
@@ -438,9 +395,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
438
395
  name: str | None = None,
439
396
  description: str | None = None,
440
397
  shared_prompt: str | None = None,
441
- picker: SupportsStructuredOutput | None = None,
442
- num_picks: int | None = None,
443
- pick_prompt: str | None = None,
444
398
  ) -> Team[Any]:
445
399
  """Create a group from agent names or instances.
446
400
 
@@ -449,9 +403,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
449
403
  name: Optional name for the team
450
404
  description: Optional description for the team
451
405
  shared_prompt: Optional prompt for all agents
452
- picker: Agent to use for picking agents
453
- num_picks: Number of agents to pick
454
- pick_prompt: Prompt to use for picking agents
455
406
  """
456
407
  from agentpool.delegation.team import Team
457
408
 
@@ -463,9 +414,6 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
463
414
  description=description,
464
415
  agents=[self.get_agent(i) if isinstance(i, str) else i for i in agents],
465
416
  shared_prompt=shared_prompt,
466
- picker=picker,
467
- num_picks=num_picks,
468
- pick_prompt=pick_prompt,
469
417
  )
470
418
  if name:
471
419
  self[name] = team
@@ -538,6 +486,15 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
538
486
 
539
487
  return {i.name: i for i in self._items.values() if isinstance(i, MessageNode)}
540
488
 
489
+ @property
490
+ def compaction_pipeline(self) -> CompactionPipeline | None:
491
+ """Get the configured compaction pipeline for message history management.
492
+
493
+ Returns:
494
+ CompactionPipeline instance or None if not configured
495
+ """
496
+ return self.manifest.get_compaction_pipeline()
497
+
541
498
  def _validate_item(self, item: MessageNode[Any, Any] | Any) -> MessageNode[Any, Any]:
542
499
  """Validate and convert items before registration.
543
500
 
@@ -628,19 +585,14 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
628
585
  stop_condition=target.stop_condition.check if target.stop_condition else None,
629
586
  exit_condition=target.exit_condition.check if target.exit_condition else None,
630
587
  )
631
- source.connections.set_wait_state(
632
- target_node,
633
- wait=target.wait_for_completion,
634
- )
588
+ source.connections.set_wait_state(target_node, wait=target.wait_for_completion)
635
589
 
636
590
  @overload
637
591
  def get_agent[TResult = str](
638
592
  self,
639
593
  agent: AgentName | Agent[Any, str],
640
594
  *,
641
- return_type: type[TResult] = str, # type: ignore
642
- model_override: ModelId | str | None = None,
643
- session: SessionIdType | SessionQuery = None,
595
+ output_type: type[TResult] = str, # type: ignore
644
596
  ) -> Agent[TPoolDeps, TResult]: ...
645
597
 
646
598
  @overload
@@ -649,9 +601,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
649
601
  agent: AgentName | Agent[Any, str],
650
602
  *,
651
603
  deps_type: type[TCustomDeps],
652
- return_type: type[TResult] = str, # type: ignore
653
- model_override: ModelId | str | None = None,
654
- session: SessionIdType | SessionQuery = None,
604
+ output_type: type[TResult] = str, # type: ignore
655
605
  ) -> Agent[TCustomDeps, TResult]: ...
656
606
 
657
607
  def get_agent(
@@ -659,9 +609,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
659
609
  agent: AgentName | Agent[Any, str],
660
610
  *,
661
611
  deps_type: Any | None = None,
662
- return_type: Any = str,
663
- model_override: ModelId | str | None = None,
664
- session: SessionIdType | SessionQuery = None,
612
+ output_type: Any = str,
665
613
  ) -> Agent[Any, Any]:
666
614
  """Get or configure an agent from the pool.
667
615
 
@@ -672,9 +620,7 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
672
620
  Args:
673
621
  agent: Either agent name or instance
674
622
  deps_type: Optional custom dependencies type (overrides shared deps)
675
- return_type: Optional type for structured responses
676
- model_override: Optional model override
677
- session: Optional session ID or query to recover conversation
623
+ output_type: Optional type for structured responses
678
624
 
679
625
  Returns:
680
626
  Either:
@@ -684,6 +630,10 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
684
630
  Raises:
685
631
  KeyError: If agent name not found
686
632
  ValueError: If configuration is invalid
633
+
634
+ Note:
635
+ To change the model, call `await agent.set_model(model_id)` after
636
+ getting the agent.
687
637
  """
688
638
  from agentpool.agents import Agent
689
639
 
@@ -692,13 +642,8 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
692
642
  # base.context.data = deps if deps is not None else self.shared_deps
693
643
  base.deps_type = deps_type
694
644
  base.agent_pool = self
695
- if model_override:
696
- base.set_model(model_override)
697
- if session:
698
- base.conversation.load_history_from_database(session=session)
699
- if return_type not in {str, None}:
700
- base.to_structured(return_type)
701
-
645
+ if output_type not in {str, None}:
646
+ base.to_structured(output_type)
702
647
  return base
703
648
 
704
649
  def get_job(self, name: str) -> Job[Any, Any]:
@@ -777,6 +722,55 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
777
722
 
778
723
  return "\n".join(lines)
779
724
 
725
+ def get_message_chain(self, message: ChatMessage[Any]) -> list[str]:
726
+ """Get the chain of agent names that processed a message.
727
+
728
+ Reconstructs the forwarding chain by walking parent_id references
729
+ across all agents' conversations in the pool.
730
+
731
+ Args:
732
+ message: The message to trace back
733
+
734
+ Returns:
735
+ List of agent names in order from origin to current message's agent.
736
+ Empty list if message has no parent or parent not found.
737
+ """
738
+ # Build index of all messages by ID across all agents
739
+ message_index: dict[str, tuple[ChatMessage[Any], str]] = {}
740
+ for agent in self.agents.values():
741
+ for msg in agent.conversation.chat_messages:
742
+ message_index[msg.message_id] = (msg, agent.name)
743
+
744
+ # Walk back through parent_id chain
745
+ chain: list[str] = []
746
+ current_id = message.parent_id
747
+
748
+ while current_id and current_id in message_index:
749
+ parent_msg, agent_name = message_index[current_id]
750
+ # Only add agent name if it's different from previous (avoid duplicates)
751
+ if not chain or chain[-1] != agent_name:
752
+ chain.append(agent_name)
753
+ current_id = parent_msg.parent_id
754
+
755
+ # Reverse to get origin -> current order
756
+ chain.reverse()
757
+ return chain
758
+
759
+ def find_message_by_id(self, message_id: str) -> ChatMessage[Any] | None:
760
+ """Find a message by ID across all agents in the pool.
761
+
762
+ Args:
763
+ message_id: The message ID to search for
764
+
765
+ Returns:
766
+ The ChatMessage if found, None otherwise
767
+ """
768
+ for agent in self.agents.values():
769
+ for msg in agent.conversation.chat_messages:
770
+ if msg.message_id == message_id:
771
+ return msg
772
+ return None
773
+
780
774
  def _create_agent_from_config[TAgentDeps](
781
775
  self,
782
776
  name: str,
@@ -804,99 +798,56 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
804
798
 
805
799
  match config:
806
800
  case NativeAgentConfig():
807
- return self.create_agent(
808
- name,
809
- deps_type=deps_type,
810
- input_provider=self._input_provider,
811
- pool=self,
801
+ from agentpool import Agent
802
+
803
+ return Agent.from_config(
804
+ config,
805
+ name=name, # Pass dict key for manifest lookups
806
+ manifest=self.manifest,
812
807
  event_handlers=self.event_handlers,
808
+ input_provider=self._input_provider,
809
+ agent_pool=self,
810
+ deps_type=deps_type,
813
811
  )
814
812
  case AGUIAgentConfig():
815
- return self._create_agui_agent_from_config(config, deps_type)
813
+ from agentpool.agents.agui_agent import AGUIAgent
814
+
815
+ return AGUIAgent.from_config(
816
+ config,
817
+ event_handlers=self.event_handlers,
818
+ agent_pool=self,
819
+ )
816
820
  case ClaudeCodeAgentConfig():
817
- return self._create_claude_code_agent_from_config(config, deps_type)
821
+ from agentpool.agents.claude_code_agent import ClaudeCodeAgent
822
+ from agentpool.utils.result_utils import to_type
823
+
824
+ output_type: type | None = None
825
+ if config.output_type:
826
+ output_type = to_type(config.output_type, self.manifest.responses)
827
+ return ClaudeCodeAgent.from_config(
828
+ config,
829
+ event_handlers=self.event_handlers,
830
+ input_provider=self._input_provider,
831
+ agent_pool=self,
832
+ output_type=output_type,
833
+ )
818
834
  case BaseACPAgentConfig():
819
- return self._create_acp_agent_from_config(config, deps_type)
835
+ from agentpool.agents.acp_agent import ACPAgent
836
+
837
+ return ACPAgent.from_config(
838
+ config,
839
+ event_handlers=self.event_handlers,
840
+ agent_pool=self,
841
+ )
820
842
  case _:
821
843
  msg = f"Unknown agent config type: {type(config)}"
822
844
  raise TypeError(msg)
823
845
 
824
- def _create_acp_agent_from_config[TDeps](
825
- self,
826
- config: BaseACPAgentConfig,
827
- deps_type: type[TDeps] | None = None,
828
- ) -> ACPAgent[TDeps]:
829
- """Create an ACPAgent from config object."""
830
- from agentpool.agents.acp_agent import ACPAgent
831
-
832
- config_handlers = config.get_event_handlers()
833
- merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
834
- *config_handlers,
835
- *self.event_handlers,
836
- ]
837
- return ACPAgent(config=config, event_handlers=merged_handlers or None)
838
-
839
- def _create_agui_agent_from_config[TDeps](
840
- self,
841
- config: AGUIAgentConfig,
842
- deps_type: type[TDeps] | None = None,
843
- ) -> AGUIAgent[TDeps]:
844
- """Create an AGUIAgent from config object."""
845
- from agentpool.agents.agui_agent import AGUIAgent
846
-
847
- config_handlers = config.get_event_handlers()
848
- merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
849
- *config_handlers,
850
- *self.event_handlers,
851
- ]
852
- return AGUIAgent(
853
- endpoint=config.endpoint,
854
- name=config.name or "agui-agent",
855
- description=config.description,
856
- display_name=config.display_name,
857
- event_handlers=merged_handlers or None,
858
- timeout=config.timeout,
859
- headers=config.headers,
860
- startup_command=config.startup_command,
861
- startup_delay=config.startup_delay,
862
- tools=[tool_config.get_tool() for tool_config in config.tools],
863
- mcp_servers=config.mcp_servers,
864
- tool_confirmation_mode=config.requires_tool_confirmation,
865
- )
866
-
867
- def _create_claude_code_agent_from_config[TDeps, TResult](
868
- self,
869
- config: ClaudeCodeAgentConfig,
870
- deps_type: type[TDeps] | None = None,
871
- ) -> ClaudeCodeAgent[TDeps, TResult]:
872
- """Create a ClaudeCodeAgent from config object."""
873
- from agentpool.agents.claude_code_agent import ClaudeCodeAgent
874
- from agentpool.utils.result_utils import to_type
875
-
876
- config_handlers = config.get_event_handlers()
877
- merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
878
- *config_handlers,
879
- *self.event_handlers,
880
- ]
881
- # Resolve output type if configured
882
- output_type: type | None = None
883
- if config.output_type:
884
- output_type = to_type(config.output_type, self.manifest.responses)
885
- return ClaudeCodeAgent(
886
- config=config,
887
- event_handlers=merged_handlers or None,
888
- input_provider=self._input_provider,
889
- tool_confirmation_mode=config.requires_tool_confirmation,
890
- output_type=output_type,
891
- agent_pool=self,
892
- )
893
-
894
846
  def create_agent[TAgentDeps]( # noqa: PLR0915
895
847
  self,
896
848
  name: str,
897
849
  deps_type: type[TAgentDeps] | None = None,
898
850
  input_provider: InputProvider | None = None,
899
- pool: AgentPool[Any] | None = None,
900
851
  event_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] | None = None,
901
852
  ) -> Agent[TAgentDeps, Any]:
902
853
  from agentpool import Agent
@@ -977,16 +928,13 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
977
928
  *config_handlers,
978
929
  *(event_handlers or []),
979
930
  ]
980
- match config.model:
981
- case str():
982
- model: Model | str | None = config.model
983
- model_settings: ModelSettings | None = None
984
- case BaseModelConfig():
985
- model = config.model.get_model()
986
- model_settings = config.model.get_model_settings()
987
- case _:
988
- model = None
989
- model_settings = None
931
+ # Resolve model (handles variants and wraps strings)
932
+ resolved_model = self.manifest.resolve_model(config.model)
933
+ model: Model | str = resolved_model.get_model()
934
+ model_settings: ModelSettings | None = resolved_model.get_model_settings()
935
+ # Extract pydantic-ai builtin tools from config
936
+ builtin_tools = config.get_builtin_tools()
937
+
990
938
  return Agent(
991
939
  # context=context,
992
940
  model=model,
@@ -1005,116 +953,15 @@ class AgentPool[TPoolDeps = None](BaseRegistry[NodeName, MessageNode[Any, Any]])
1005
953
  input_provider=input_provider,
1006
954
  output_type=resolved_output_type,
1007
955
  event_handlers=merged_handlers or None,
1008
- agent_pool=pool,
956
+ agent_pool=self,
1009
957
  tool_mode=config.tool_mode,
1010
958
  knowledge=config.knowledge,
1011
959
  toolsets=toolsets_list,
1012
- auto_cache=config.auto_cache,
1013
960
  hooks=config.hooks.get_agent_hooks() if config.hooks else None,
1014
961
  tool_confirmation_mode=config.requires_tool_confirmation,
1015
- )
1016
-
1017
- def create_acp_agent[TDeps](
1018
- self,
1019
- name: str,
1020
- deps_type: type[TDeps] | None = None,
1021
- ) -> ACPAgent[TDeps]:
1022
- """Create an ACPAgent from configuration.
1023
-
1024
- Args:
1025
- name: Name of the ACP agent in the manifest
1026
- deps_type: Optional dependency type (not used by ACP agents currently)
1027
-
1028
- Returns:
1029
- Configured ACPAgent instance
1030
- """
1031
- from agentpool.agents.acp_agent import ACPAgent
1032
-
1033
- config = self.manifest.acp_agents[name]
1034
- # Ensure name is set on config
1035
- if config.name is None:
1036
- config = config.model_copy(update={"name": name})
1037
- # Merge pool-level handlers with config-level handlers
1038
- config_handlers = config.get_event_handlers()
1039
- merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
1040
- *config_handlers,
1041
- *self.event_handlers,
1042
- ]
1043
- return ACPAgent(config=config, event_handlers=merged_handlers or None)
1044
-
1045
- def create_agui_agent[TDeps](
1046
- self,
1047
- name: str,
1048
- deps_type: type[TDeps] | None = None,
1049
- ) -> AGUIAgent[TDeps]:
1050
- """Create an AGUIAgent from configuration.
1051
-
1052
- Args:
1053
- name: Name of the AG-UI agent in the manifest
1054
- deps_type: Optional dependency type (not used by AG-UI agents currently)
1055
-
1056
- Returns:
1057
- Configured AGUIAgent instance
1058
- """
1059
- from agentpool.agents.agui_agent import AGUIAgent
1060
-
1061
- config = self.manifest.agui_agents[name]
1062
- # Ensure name is set on config
1063
- if config.name is None:
1064
- config = config.model_copy(update={"name": name})
1065
- # Merge pool-level handlers with config-level handlers
1066
- config_handlers = config.get_event_handlers()
1067
- merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
1068
- *config_handlers,
1069
- *self.event_handlers,
1070
- ]
1071
- return AGUIAgent(
1072
- endpoint=config.endpoint,
1073
- name=config.name or "agui-agent",
1074
- description=config.description,
1075
- display_name=config.display_name,
1076
- event_handlers=merged_handlers or None,
1077
- timeout=config.timeout,
1078
- headers=config.headers,
1079
- startup_command=config.startup_command,
1080
- startup_delay=config.startup_delay,
1081
- tools=[tool_config.get_tool() for tool_config in config.tools],
1082
- mcp_servers=config.mcp_servers,
1083
- tool_confirmation_mode=config.requires_tool_confirmation,
1084
- )
1085
-
1086
- def create_claude_code_agent[TDeps](
1087
- self,
1088
- name: str,
1089
- deps_type: type[TDeps] | None = None,
1090
- ) -> ClaudeCodeAgent[TDeps, str]:
1091
- """Create a ClaudeCodeAgent from configuration.
1092
-
1093
- Args:
1094
- name: Name of the Claude Code agent in the manifest
1095
- deps_type: Optional dependency type (not used by Claude Code agents currently)
1096
-
1097
- Returns:
1098
- Configured ClaudeCodeAgent instance
1099
- """
1100
- from agentpool.agents.claude_code_agent import ClaudeCodeAgent
1101
-
1102
- config = self.manifest.claude_code_agents[name]
1103
- # Ensure name is set on config
1104
- if config.name is None:
1105
- config = config.model_copy(update={"name": name})
1106
- # Merge pool-level handlers with config-level handlers
1107
- config_handlers = config.get_event_handlers()
1108
- merged_handlers: list[IndividualEventHandler | BuiltinEventHandlerType] = [
1109
- *config_handlers,
1110
- *self.event_handlers,
1111
- ]
1112
- return ClaudeCodeAgent(
1113
- config=config,
1114
- event_handlers=merged_handlers or None,
1115
- input_provider=self._input_provider,
1116
- tool_confirmation_mode=config.requires_tool_confirmation,
1117
- agent_pool=self,
962
+ builtin_tools=builtin_tools or None,
963
+ usage_limits=config.usage_limits,
964
+ providers=config.model_providers,
1118
965
  )
1119
966
 
1120
967