agentpool 2.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of agentpool might be problematic. Click here for more details.

Files changed (474) hide show
  1. acp/README.md +64 -0
  2. acp/__init__.py +172 -0
  3. acp/__main__.py +10 -0
  4. acp/acp_requests.py +285 -0
  5. acp/agent/__init__.py +6 -0
  6. acp/agent/connection.py +256 -0
  7. acp/agent/implementations/__init__.py +6 -0
  8. acp/agent/implementations/debug_server/__init__.py +1 -0
  9. acp/agent/implementations/debug_server/cli.py +79 -0
  10. acp/agent/implementations/debug_server/debug.html +234 -0
  11. acp/agent/implementations/debug_server/debug_server.py +496 -0
  12. acp/agent/implementations/testing.py +91 -0
  13. acp/agent/protocol.py +65 -0
  14. acp/bridge/README.md +162 -0
  15. acp/bridge/__init__.py +6 -0
  16. acp/bridge/__main__.py +91 -0
  17. acp/bridge/bridge.py +246 -0
  18. acp/bridge/py.typed +0 -0
  19. acp/bridge/settings.py +15 -0
  20. acp/client/__init__.py +7 -0
  21. acp/client/connection.py +251 -0
  22. acp/client/implementations/__init__.py +7 -0
  23. acp/client/implementations/default_client.py +185 -0
  24. acp/client/implementations/headless_client.py +266 -0
  25. acp/client/implementations/noop_client.py +110 -0
  26. acp/client/protocol.py +61 -0
  27. acp/connection.py +280 -0
  28. acp/exceptions.py +46 -0
  29. acp/filesystem.py +524 -0
  30. acp/notifications.py +832 -0
  31. acp/py.typed +0 -0
  32. acp/schema/__init__.py +265 -0
  33. acp/schema/agent_plan.py +30 -0
  34. acp/schema/agent_requests.py +126 -0
  35. acp/schema/agent_responses.py +256 -0
  36. acp/schema/base.py +39 -0
  37. acp/schema/capabilities.py +230 -0
  38. acp/schema/client_requests.py +247 -0
  39. acp/schema/client_responses.py +96 -0
  40. acp/schema/common.py +81 -0
  41. acp/schema/content_blocks.py +188 -0
  42. acp/schema/mcp.py +82 -0
  43. acp/schema/messages.py +171 -0
  44. acp/schema/notifications.py +82 -0
  45. acp/schema/protocol_stuff.md +3 -0
  46. acp/schema/session_state.py +160 -0
  47. acp/schema/session_updates.py +419 -0
  48. acp/schema/slash_commands.py +51 -0
  49. acp/schema/terminal.py +15 -0
  50. acp/schema/tool_call.py +347 -0
  51. acp/stdio.py +250 -0
  52. acp/task/__init__.py +53 -0
  53. acp/task/debug.py +197 -0
  54. acp/task/dispatcher.py +93 -0
  55. acp/task/queue.py +69 -0
  56. acp/task/sender.py +82 -0
  57. acp/task/state.py +87 -0
  58. acp/task/supervisor.py +93 -0
  59. acp/terminal_handle.py +30 -0
  60. acp/tool_call_reporter.py +199 -0
  61. acp/tool_call_state.py +178 -0
  62. acp/transports.py +104 -0
  63. acp/utils.py +240 -0
  64. agentpool/__init__.py +63 -0
  65. agentpool/__main__.py +7 -0
  66. agentpool/agents/__init__.py +30 -0
  67. agentpool/agents/acp_agent/__init__.py +5 -0
  68. agentpool/agents/acp_agent/acp_agent.py +837 -0
  69. agentpool/agents/acp_agent/acp_converters.py +294 -0
  70. agentpool/agents/acp_agent/client_handler.py +317 -0
  71. agentpool/agents/acp_agent/session_state.py +44 -0
  72. agentpool/agents/agent.py +1264 -0
  73. agentpool/agents/agui_agent/__init__.py +19 -0
  74. agentpool/agents/agui_agent/agui_agent.py +677 -0
  75. agentpool/agents/agui_agent/agui_converters.py +423 -0
  76. agentpool/agents/agui_agent/chunk_transformer.py +204 -0
  77. agentpool/agents/agui_agent/event_types.py +83 -0
  78. agentpool/agents/agui_agent/helpers.py +192 -0
  79. agentpool/agents/architect.py +71 -0
  80. agentpool/agents/base_agent.py +177 -0
  81. agentpool/agents/claude_code_agent/__init__.py +11 -0
  82. agentpool/agents/claude_code_agent/claude_code_agent.py +1021 -0
  83. agentpool/agents/claude_code_agent/converters.py +243 -0
  84. agentpool/agents/context.py +105 -0
  85. agentpool/agents/events/__init__.py +61 -0
  86. agentpool/agents/events/builtin_handlers.py +129 -0
  87. agentpool/agents/events/event_emitter.py +320 -0
  88. agentpool/agents/events/events.py +561 -0
  89. agentpool/agents/events/tts_handlers.py +186 -0
  90. agentpool/agents/interactions.py +419 -0
  91. agentpool/agents/slashed_agent.py +244 -0
  92. agentpool/agents/sys_prompts.py +178 -0
  93. agentpool/agents/tool_wrapping.py +184 -0
  94. agentpool/base_provider.py +28 -0
  95. agentpool/common_types.py +226 -0
  96. agentpool/config_resources/__init__.py +16 -0
  97. agentpool/config_resources/acp_assistant.yml +24 -0
  98. agentpool/config_resources/agents.yml +109 -0
  99. agentpool/config_resources/agents_template.yml +18 -0
  100. agentpool/config_resources/agui_test.yml +18 -0
  101. agentpool/config_resources/claude_code_agent.yml +16 -0
  102. agentpool/config_resources/claude_style_subagent.md +30 -0
  103. agentpool/config_resources/external_acp_agents.yml +77 -0
  104. agentpool/config_resources/opencode_style_subagent.md +19 -0
  105. agentpool/config_resources/tts_test_agents.yml +78 -0
  106. agentpool/delegation/__init__.py +8 -0
  107. agentpool/delegation/base_team.py +504 -0
  108. agentpool/delegation/message_flow_tracker.py +39 -0
  109. agentpool/delegation/pool.py +1129 -0
  110. agentpool/delegation/team.py +325 -0
  111. agentpool/delegation/teamrun.py +343 -0
  112. agentpool/docs/__init__.py +5 -0
  113. agentpool/docs/gen_examples.py +42 -0
  114. agentpool/docs/utils.py +370 -0
  115. agentpool/functional/__init__.py +20 -0
  116. agentpool/functional/py.typed +0 -0
  117. agentpool/functional/run.py +80 -0
  118. agentpool/functional/structure.py +136 -0
  119. agentpool/hooks/__init__.py +20 -0
  120. agentpool/hooks/agent_hooks.py +247 -0
  121. agentpool/hooks/base.py +119 -0
  122. agentpool/hooks/callable.py +140 -0
  123. agentpool/hooks/command.py +180 -0
  124. agentpool/hooks/prompt.py +122 -0
  125. agentpool/jinja_filters.py +132 -0
  126. agentpool/log.py +224 -0
  127. agentpool/mcp_server/__init__.py +17 -0
  128. agentpool/mcp_server/client.py +429 -0
  129. agentpool/mcp_server/constants.py +32 -0
  130. agentpool/mcp_server/conversions.py +172 -0
  131. agentpool/mcp_server/helpers.py +47 -0
  132. agentpool/mcp_server/manager.py +232 -0
  133. agentpool/mcp_server/message_handler.py +164 -0
  134. agentpool/mcp_server/registries/__init__.py +1 -0
  135. agentpool/mcp_server/registries/official_registry_client.py +345 -0
  136. agentpool/mcp_server/registries/pulsemcp_client.py +88 -0
  137. agentpool/mcp_server/tool_bridge.py +548 -0
  138. agentpool/messaging/__init__.py +58 -0
  139. agentpool/messaging/compaction.py +928 -0
  140. agentpool/messaging/connection_manager.py +319 -0
  141. agentpool/messaging/context.py +66 -0
  142. agentpool/messaging/event_manager.py +426 -0
  143. agentpool/messaging/events.py +39 -0
  144. agentpool/messaging/message_container.py +209 -0
  145. agentpool/messaging/message_history.py +491 -0
  146. agentpool/messaging/messagenode.py +377 -0
  147. agentpool/messaging/messages.py +655 -0
  148. agentpool/messaging/processing.py +76 -0
  149. agentpool/mime_utils.py +95 -0
  150. agentpool/models/__init__.py +21 -0
  151. agentpool/models/acp_agents/__init__.py +22 -0
  152. agentpool/models/acp_agents/base.py +308 -0
  153. agentpool/models/acp_agents/mcp_capable.py +790 -0
  154. agentpool/models/acp_agents/non_mcp.py +842 -0
  155. agentpool/models/agents.py +450 -0
  156. agentpool/models/agui_agents.py +89 -0
  157. agentpool/models/claude_code_agents.py +238 -0
  158. agentpool/models/file_agents.py +116 -0
  159. agentpool/models/file_parsing.py +367 -0
  160. agentpool/models/manifest.py +658 -0
  161. agentpool/observability/__init__.py +9 -0
  162. agentpool/observability/observability_registry.py +97 -0
  163. agentpool/prompts/__init__.py +1 -0
  164. agentpool/prompts/base.py +27 -0
  165. agentpool/prompts/builtin_provider.py +75 -0
  166. agentpool/prompts/conversion_manager.py +95 -0
  167. agentpool/prompts/convert.py +96 -0
  168. agentpool/prompts/manager.py +204 -0
  169. agentpool/prompts/parts/zed.md +33 -0
  170. agentpool/prompts/prompts.py +581 -0
  171. agentpool/py.typed +0 -0
  172. agentpool/queries/tree-sitter-language-pack/README.md +7 -0
  173. agentpool/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
  174. agentpool/queries/tree-sitter-language-pack/c-tags.scm +9 -0
  175. agentpool/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
  176. agentpool/queries/tree-sitter-language-pack/clojure-tags.scm +7 -0
  177. agentpool/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
  178. agentpool/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
  179. agentpool/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
  180. agentpool/queries/tree-sitter-language-pack/d-tags.scm +26 -0
  181. agentpool/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
  182. agentpool/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
  183. agentpool/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
  184. agentpool/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
  185. agentpool/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
  186. agentpool/queries/tree-sitter-language-pack/go-tags.scm +42 -0
  187. agentpool/queries/tree-sitter-language-pack/java-tags.scm +20 -0
  188. agentpool/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
  189. agentpool/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
  190. agentpool/queries/tree-sitter-language-pack/matlab-tags.scm +10 -0
  191. agentpool/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
  192. agentpool/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
  193. agentpool/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
  194. agentpool/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
  195. agentpool/queries/tree-sitter-language-pack/python-tags.scm +14 -0
  196. agentpool/queries/tree-sitter-language-pack/r-tags.scm +21 -0
  197. agentpool/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
  198. agentpool/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
  199. agentpool/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
  200. agentpool/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
  201. agentpool/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
  202. agentpool/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
  203. agentpool/queries/tree-sitter-languages/README.md +24 -0
  204. agentpool/queries/tree-sitter-languages/c-tags.scm +9 -0
  205. agentpool/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
  206. agentpool/queries/tree-sitter-languages/cpp-tags.scm +15 -0
  207. agentpool/queries/tree-sitter-languages/dart-tags.scm +91 -0
  208. agentpool/queries/tree-sitter-languages/elisp-tags.scm +8 -0
  209. agentpool/queries/tree-sitter-languages/elixir-tags.scm +54 -0
  210. agentpool/queries/tree-sitter-languages/elm-tags.scm +19 -0
  211. agentpool/queries/tree-sitter-languages/fortran-tags.scm +15 -0
  212. agentpool/queries/tree-sitter-languages/go-tags.scm +30 -0
  213. agentpool/queries/tree-sitter-languages/haskell-tags.scm +3 -0
  214. agentpool/queries/tree-sitter-languages/hcl-tags.scm +77 -0
  215. agentpool/queries/tree-sitter-languages/java-tags.scm +20 -0
  216. agentpool/queries/tree-sitter-languages/javascript-tags.scm +88 -0
  217. agentpool/queries/tree-sitter-languages/julia-tags.scm +60 -0
  218. agentpool/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
  219. agentpool/queries/tree-sitter-languages/matlab-tags.scm +10 -0
  220. agentpool/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
  221. agentpool/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
  222. agentpool/queries/tree-sitter-languages/php-tags.scm +26 -0
  223. agentpool/queries/tree-sitter-languages/python-tags.scm +12 -0
  224. agentpool/queries/tree-sitter-languages/ql-tags.scm +26 -0
  225. agentpool/queries/tree-sitter-languages/ruby-tags.scm +64 -0
  226. agentpool/queries/tree-sitter-languages/rust-tags.scm +60 -0
  227. agentpool/queries/tree-sitter-languages/scala-tags.scm +65 -0
  228. agentpool/queries/tree-sitter-languages/typescript-tags.scm +41 -0
  229. agentpool/queries/tree-sitter-languages/zig-tags.scm +3 -0
  230. agentpool/repomap.py +1231 -0
  231. agentpool/resource_providers/__init__.py +17 -0
  232. agentpool/resource_providers/aggregating.py +54 -0
  233. agentpool/resource_providers/base.py +172 -0
  234. agentpool/resource_providers/codemode/__init__.py +9 -0
  235. agentpool/resource_providers/codemode/code_executor.py +215 -0
  236. agentpool/resource_providers/codemode/default_prompt.py +19 -0
  237. agentpool/resource_providers/codemode/helpers.py +83 -0
  238. agentpool/resource_providers/codemode/progress_executor.py +212 -0
  239. agentpool/resource_providers/codemode/provider.py +150 -0
  240. agentpool/resource_providers/codemode/remote_mcp_execution.py +143 -0
  241. agentpool/resource_providers/codemode/remote_provider.py +171 -0
  242. agentpool/resource_providers/filtering.py +42 -0
  243. agentpool/resource_providers/mcp_provider.py +246 -0
  244. agentpool/resource_providers/plan_provider.py +196 -0
  245. agentpool/resource_providers/pool.py +69 -0
  246. agentpool/resource_providers/static.py +289 -0
  247. agentpool/running/__init__.py +20 -0
  248. agentpool/running/decorators.py +56 -0
  249. agentpool/running/discovery.py +101 -0
  250. agentpool/running/executor.py +284 -0
  251. agentpool/running/injection.py +111 -0
  252. agentpool/running/py.typed +0 -0
  253. agentpool/running/run_nodes.py +87 -0
  254. agentpool/server.py +122 -0
  255. agentpool/sessions/__init__.py +13 -0
  256. agentpool/sessions/manager.py +302 -0
  257. agentpool/sessions/models.py +71 -0
  258. agentpool/sessions/session.py +239 -0
  259. agentpool/sessions/store.py +163 -0
  260. agentpool/skills/__init__.py +5 -0
  261. agentpool/skills/manager.py +120 -0
  262. agentpool/skills/registry.py +210 -0
  263. agentpool/skills/skill.py +36 -0
  264. agentpool/storage/__init__.py +17 -0
  265. agentpool/storage/manager.py +419 -0
  266. agentpool/storage/serialization.py +136 -0
  267. agentpool/talk/__init__.py +13 -0
  268. agentpool/talk/registry.py +128 -0
  269. agentpool/talk/stats.py +159 -0
  270. agentpool/talk/talk.py +604 -0
  271. agentpool/tasks/__init__.py +20 -0
  272. agentpool/tasks/exceptions.py +25 -0
  273. agentpool/tasks/registry.py +33 -0
  274. agentpool/testing.py +129 -0
  275. agentpool/text_templates/__init__.py +39 -0
  276. agentpool/text_templates/system_prompt.jinja +30 -0
  277. agentpool/text_templates/tool_call_default.jinja +13 -0
  278. agentpool/text_templates/tool_call_markdown.jinja +25 -0
  279. agentpool/text_templates/tool_call_simple.jinja +5 -0
  280. agentpool/tools/__init__.py +16 -0
  281. agentpool/tools/base.py +269 -0
  282. agentpool/tools/exceptions.py +9 -0
  283. agentpool/tools/manager.py +255 -0
  284. agentpool/tools/tool_call_info.py +87 -0
  285. agentpool/ui/__init__.py +2 -0
  286. agentpool/ui/base.py +89 -0
  287. agentpool/ui/mock_provider.py +81 -0
  288. agentpool/ui/stdlib_provider.py +150 -0
  289. agentpool/utils/__init__.py +44 -0
  290. agentpool/utils/baseregistry.py +185 -0
  291. agentpool/utils/count_tokens.py +62 -0
  292. agentpool/utils/dag.py +184 -0
  293. agentpool/utils/importing.py +206 -0
  294. agentpool/utils/inspection.py +334 -0
  295. agentpool/utils/model_capabilities.py +25 -0
  296. agentpool/utils/network.py +28 -0
  297. agentpool/utils/now.py +22 -0
  298. agentpool/utils/parse_time.py +87 -0
  299. agentpool/utils/result_utils.py +35 -0
  300. agentpool/utils/signatures.py +305 -0
  301. agentpool/utils/streams.py +112 -0
  302. agentpool/utils/tasks.py +186 -0
  303. agentpool/vfs_registry.py +250 -0
  304. agentpool-2.1.9.dist-info/METADATA +336 -0
  305. agentpool-2.1.9.dist-info/RECORD +474 -0
  306. agentpool-2.1.9.dist-info/WHEEL +4 -0
  307. agentpool-2.1.9.dist-info/entry_points.txt +14 -0
  308. agentpool-2.1.9.dist-info/licenses/LICENSE +22 -0
  309. agentpool_cli/__init__.py +34 -0
  310. agentpool_cli/__main__.py +66 -0
  311. agentpool_cli/agent.py +175 -0
  312. agentpool_cli/cli_types.py +23 -0
  313. agentpool_cli/common.py +163 -0
  314. agentpool_cli/create.py +175 -0
  315. agentpool_cli/history.py +217 -0
  316. agentpool_cli/log.py +78 -0
  317. agentpool_cli/py.typed +0 -0
  318. agentpool_cli/run.py +84 -0
  319. agentpool_cli/serve_acp.py +177 -0
  320. agentpool_cli/serve_api.py +69 -0
  321. agentpool_cli/serve_mcp.py +74 -0
  322. agentpool_cli/serve_vercel.py +233 -0
  323. agentpool_cli/store.py +171 -0
  324. agentpool_cli/task.py +84 -0
  325. agentpool_cli/utils.py +104 -0
  326. agentpool_cli/watch.py +54 -0
  327. agentpool_commands/__init__.py +180 -0
  328. agentpool_commands/agents.py +199 -0
  329. agentpool_commands/base.py +45 -0
  330. agentpool_commands/commands.py +58 -0
  331. agentpool_commands/completers.py +110 -0
  332. agentpool_commands/connections.py +175 -0
  333. agentpool_commands/markdown_utils.py +31 -0
  334. agentpool_commands/models.py +62 -0
  335. agentpool_commands/prompts.py +78 -0
  336. agentpool_commands/py.typed +0 -0
  337. agentpool_commands/read.py +77 -0
  338. agentpool_commands/resources.py +210 -0
  339. agentpool_commands/session.py +48 -0
  340. agentpool_commands/tools.py +269 -0
  341. agentpool_commands/utils.py +189 -0
  342. agentpool_commands/workers.py +163 -0
  343. agentpool_config/__init__.py +53 -0
  344. agentpool_config/builtin_tools.py +265 -0
  345. agentpool_config/commands.py +237 -0
  346. agentpool_config/conditions.py +301 -0
  347. agentpool_config/converters.py +30 -0
  348. agentpool_config/durable.py +331 -0
  349. agentpool_config/event_handlers.py +600 -0
  350. agentpool_config/events.py +153 -0
  351. agentpool_config/forward_targets.py +251 -0
  352. agentpool_config/hook_conditions.py +331 -0
  353. agentpool_config/hooks.py +241 -0
  354. agentpool_config/jinja.py +206 -0
  355. agentpool_config/knowledge.py +41 -0
  356. agentpool_config/loaders.py +350 -0
  357. agentpool_config/mcp_server.py +243 -0
  358. agentpool_config/nodes.py +202 -0
  359. agentpool_config/observability.py +191 -0
  360. agentpool_config/output_types.py +55 -0
  361. agentpool_config/pool_server.py +267 -0
  362. agentpool_config/prompt_hubs.py +105 -0
  363. agentpool_config/prompts.py +185 -0
  364. agentpool_config/py.typed +0 -0
  365. agentpool_config/resources.py +33 -0
  366. agentpool_config/session.py +119 -0
  367. agentpool_config/skills.py +17 -0
  368. agentpool_config/storage.py +288 -0
  369. agentpool_config/system_prompts.py +190 -0
  370. agentpool_config/task.py +162 -0
  371. agentpool_config/teams.py +52 -0
  372. agentpool_config/tools.py +112 -0
  373. agentpool_config/toolsets.py +1033 -0
  374. agentpool_config/workers.py +86 -0
  375. agentpool_prompts/__init__.py +1 -0
  376. agentpool_prompts/braintrust_hub.py +235 -0
  377. agentpool_prompts/fabric.py +75 -0
  378. agentpool_prompts/langfuse_hub.py +79 -0
  379. agentpool_prompts/promptlayer_provider.py +59 -0
  380. agentpool_prompts/py.typed +0 -0
  381. agentpool_server/__init__.py +9 -0
  382. agentpool_server/a2a_server/__init__.py +5 -0
  383. agentpool_server/a2a_server/a2a_types.py +41 -0
  384. agentpool_server/a2a_server/server.py +190 -0
  385. agentpool_server/a2a_server/storage.py +81 -0
  386. agentpool_server/acp_server/__init__.py +22 -0
  387. agentpool_server/acp_server/acp_agent.py +786 -0
  388. agentpool_server/acp_server/acp_tools.py +43 -0
  389. agentpool_server/acp_server/commands/__init__.py +18 -0
  390. agentpool_server/acp_server/commands/acp_commands.py +594 -0
  391. agentpool_server/acp_server/commands/debug_commands.py +376 -0
  392. agentpool_server/acp_server/commands/docs_commands/__init__.py +39 -0
  393. agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +169 -0
  394. agentpool_server/acp_server/commands/docs_commands/get_schema.py +176 -0
  395. agentpool_server/acp_server/commands/docs_commands/get_source.py +110 -0
  396. agentpool_server/acp_server/commands/docs_commands/git_diff.py +111 -0
  397. agentpool_server/acp_server/commands/docs_commands/helpers.py +33 -0
  398. agentpool_server/acp_server/commands/docs_commands/url_to_markdown.py +90 -0
  399. agentpool_server/acp_server/commands/spawn.py +210 -0
  400. agentpool_server/acp_server/converters.py +235 -0
  401. agentpool_server/acp_server/input_provider.py +338 -0
  402. agentpool_server/acp_server/server.py +288 -0
  403. agentpool_server/acp_server/session.py +969 -0
  404. agentpool_server/acp_server/session_manager.py +313 -0
  405. agentpool_server/acp_server/syntax_detection.py +250 -0
  406. agentpool_server/acp_server/zed_tools.md +90 -0
  407. agentpool_server/aggregating_server.py +309 -0
  408. agentpool_server/agui_server/__init__.py +11 -0
  409. agentpool_server/agui_server/server.py +128 -0
  410. agentpool_server/base.py +189 -0
  411. agentpool_server/http_server.py +164 -0
  412. agentpool_server/mcp_server/__init__.py +6 -0
  413. agentpool_server/mcp_server/server.py +314 -0
  414. agentpool_server/mcp_server/zed_wrapper.py +110 -0
  415. agentpool_server/openai_api_server/__init__.py +5 -0
  416. agentpool_server/openai_api_server/completions/__init__.py +1 -0
  417. agentpool_server/openai_api_server/completions/helpers.py +81 -0
  418. agentpool_server/openai_api_server/completions/models.py +98 -0
  419. agentpool_server/openai_api_server/responses/__init__.py +1 -0
  420. agentpool_server/openai_api_server/responses/helpers.py +74 -0
  421. agentpool_server/openai_api_server/responses/models.py +96 -0
  422. agentpool_server/openai_api_server/server.py +242 -0
  423. agentpool_server/py.typed +0 -0
  424. agentpool_storage/__init__.py +9 -0
  425. agentpool_storage/base.py +310 -0
  426. agentpool_storage/file_provider.py +378 -0
  427. agentpool_storage/formatters.py +129 -0
  428. agentpool_storage/memory_provider.py +396 -0
  429. agentpool_storage/models.py +108 -0
  430. agentpool_storage/py.typed +0 -0
  431. agentpool_storage/session_store.py +262 -0
  432. agentpool_storage/sql_provider/__init__.py +21 -0
  433. agentpool_storage/sql_provider/cli.py +146 -0
  434. agentpool_storage/sql_provider/models.py +249 -0
  435. agentpool_storage/sql_provider/queries.py +15 -0
  436. agentpool_storage/sql_provider/sql_provider.py +444 -0
  437. agentpool_storage/sql_provider/utils.py +234 -0
  438. agentpool_storage/text_log_provider.py +275 -0
  439. agentpool_toolsets/__init__.py +15 -0
  440. agentpool_toolsets/builtin/__init__.py +33 -0
  441. agentpool_toolsets/builtin/agent_management.py +239 -0
  442. agentpool_toolsets/builtin/chain.py +288 -0
  443. agentpool_toolsets/builtin/code.py +398 -0
  444. agentpool_toolsets/builtin/debug.py +291 -0
  445. agentpool_toolsets/builtin/execution_environment.py +381 -0
  446. agentpool_toolsets/builtin/file_edit/__init__.py +11 -0
  447. agentpool_toolsets/builtin/file_edit/file_edit.py +747 -0
  448. agentpool_toolsets/builtin/file_edit/fuzzy_matcher/__init__.py +5 -0
  449. agentpool_toolsets/builtin/file_edit/fuzzy_matcher/example_usage.py +311 -0
  450. agentpool_toolsets/builtin/file_edit/fuzzy_matcher/streaming_fuzzy_matcher.py +443 -0
  451. agentpool_toolsets/builtin/history.py +36 -0
  452. agentpool_toolsets/builtin/integration.py +85 -0
  453. agentpool_toolsets/builtin/skills.py +77 -0
  454. agentpool_toolsets/builtin/subagent_tools.py +324 -0
  455. agentpool_toolsets/builtin/tool_management.py +90 -0
  456. agentpool_toolsets/builtin/user_interaction.py +52 -0
  457. agentpool_toolsets/builtin/workers.py +128 -0
  458. agentpool_toolsets/composio_toolset.py +96 -0
  459. agentpool_toolsets/config_creation.py +192 -0
  460. agentpool_toolsets/entry_points.py +47 -0
  461. agentpool_toolsets/fsspec_toolset/__init__.py +7 -0
  462. agentpool_toolsets/fsspec_toolset/diagnostics.py +115 -0
  463. agentpool_toolsets/fsspec_toolset/grep.py +450 -0
  464. agentpool_toolsets/fsspec_toolset/helpers.py +631 -0
  465. agentpool_toolsets/fsspec_toolset/streaming_diff_parser.py +249 -0
  466. agentpool_toolsets/fsspec_toolset/toolset.py +1384 -0
  467. agentpool_toolsets/mcp_run_toolset.py +61 -0
  468. agentpool_toolsets/notifications.py +146 -0
  469. agentpool_toolsets/openapi.py +118 -0
  470. agentpool_toolsets/py.typed +0 -0
  471. agentpool_toolsets/search_toolset.py +202 -0
  472. agentpool_toolsets/semantic_memory_toolset.py +536 -0
  473. agentpool_toolsets/streaming_tools.py +265 -0
  474. agentpool_toolsets/vfs_toolset.py +124 -0
@@ -0,0 +1,275 @@
1
+ """Text-based storage provider with dynamic paths."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Any, ClassVar
6
+
7
+ from upathtools import to_upath
8
+
9
+ from agentpool.log import get_logger
10
+ from agentpool.utils.now import get_now
11
+ from agentpool_storage.base import StorageProvider
12
+
13
+
14
+ if TYPE_CHECKING:
15
+ from datetime import datetime
16
+
17
+ from jinja2 import Template
18
+ from upathtools import JoinablePathLike, UPath
19
+
20
+ from agentpool.common_types import JsonValue
21
+ from agentpool_config.storage import LogFormat, TextLogConfig
22
+
23
+
24
+ logger = get_logger(__name__)
25
+
26
+
27
+ CONVERSATIONS_TEMPLATE = """\
28
+ === AgentPool Log ===
29
+
30
+ {%- for conv_id, conv in conversations.items() %}
31
+ === Conversation {{ conv_id }} (agent: {{ conv.agent_name }}, started: {{ conv.start_time.strftime('%Y-%m-%d %H:%M:%S') }}) ===
32
+
33
+ {%- for msg in messages if msg.conversation_id == conv_id %}
34
+ [{{ msg.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] {{ msg.sender }}{% if msg.model %} ({{ msg.model }}){% endif %}: {{ msg.content }}
35
+ {%- if msg.cost_info %}
36
+ Tokens: {{ msg.cost_info.token_usage.total }} (prompt: {{ msg.cost_info.token_usage.prompt }}, completion: {{ msg.cost_info.token_usage.completion }})
37
+ Cost: ${{ "%.4f"|format(msg.cost_info.total_cost) }}
38
+ {%- endif %}
39
+ {%- if msg.response_time %}
40
+ Response time: {{ "%.1f"|format(msg.response_time) }}s
41
+ {%- endif %}
42
+ {%- if msg.forwarded_from %}
43
+ Forwarded via: {{ msg.forwarded_from|join(' -> ') }}
44
+ {%- endif %}
45
+
46
+ {%- for tool in tool_calls if tool.message_id == msg.id %}
47
+ Tool Call: {{ tool.tool_name }}
48
+ Args: {{ tool.args|pprint }}
49
+ Result: {{ tool.result }}
50
+ {%- endfor %}
51
+ {%- endfor %}
52
+ {%- endfor %}
53
+
54
+ === Commands ===
55
+ {%- for cmd in commands %}
56
+ [{{ cmd.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] {{ cmd.agent_name }} ({{ cmd.session_id }}): {{ cmd.command }}
57
+ {%- endfor %}
58
+ """ # noqa: E501
59
+
60
+ CHRONOLOGICAL_TEMPLATE = """\
61
+ === AgentPool Log ===
62
+
63
+ {%- for entry in entries|sort(attribute="timestamp") %}
64
+ {%- if entry.type == "conversation_start" %}
65
+ === Conversation {{ entry.conversation_id }} (agent: {{ entry.agent_name }}) started ===
66
+
67
+ {%- elif entry.type == "message" %}
68
+ [{{ entry.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] {{ entry.sender }}{% if entry.model %} ({{ entry.model }}){% endif %}: {{ entry.content }}
69
+ {%- if entry.cost_info %}
70
+ Tokens: {{ entry.cost_info.token_usage.total }} (prompt: {{ entry.cost_info.token_usage.prompt }}, completion: {{ entry.cost_info.token_usage.completion }})
71
+ Cost: ${{ "%.4f"|format(entry.cost_info.total_cost) }}
72
+ {%- endif %}
73
+ {%- if entry.response_time %}
74
+ Response time: {{ "%.1f"|format(entry.response_time) }}s
75
+ {%- endif %}
76
+ {%- if entry.forwarded_from %}
77
+ Forwarded via: {{ entry.forwarded_from|join(' -> ') }}
78
+ {%- endif %}
79
+
80
+ {%- elif entry.type == "tool_call" %}
81
+ [{{ entry.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] Tool Call: {{ entry.tool_name }}
82
+ Args: {{ entry.args|pprint }}
83
+ Result: {{ entry.result }}
84
+
85
+ {%- elif entry.type == "command" %}
86
+ [{{ entry.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}] Command by {{ entry.agent_name }}: {{ entry.command }}
87
+
88
+ {%- endif %}
89
+ {%- endfor %}
90
+ """ # noqa: E501
91
+
92
+
93
+ class TextLogProvider(StorageProvider):
94
+ """Human-readable text log provider with dynamic paths.
95
+
96
+ Available template variables:
97
+ - now: datetime - Current timestamp
98
+ - date: date - Current date
99
+ - operation: str - Type of operation (message/conversation/tool_call/command)
100
+ - conversation_id: str - ID of current conversation
101
+ - agent_name: str - Name of the agent
102
+ - content: str - Message content
103
+ - role: str - Message role
104
+ - model: str - Model name
105
+ - session_id: str - Session ID
106
+ - tool_name: str - Name of tool being called
107
+ - command: str - Command being executed
108
+
109
+ All variables default to empty string if not available for current operation.
110
+ """
111
+
112
+ TEMPLATES: ClassVar[dict[LogFormat, str]] = {
113
+ "chronological": CHRONOLOGICAL_TEMPLATE,
114
+ "conversations": CONVERSATIONS_TEMPLATE,
115
+ }
116
+ can_load_history = False
117
+
118
+ def __init__(self, config: TextLogConfig) -> None:
119
+ """Initialize text log provider."""
120
+ from jinja2 import Environment, Undefined
121
+
122
+ class EmptyStringUndefined(Undefined):
123
+ """Return empty string for undefined variables."""
124
+
125
+ def __str__(self) -> str:
126
+ return ""
127
+
128
+ super().__init__(config)
129
+ self.encoding = config.encoding
130
+ self.content_template = self._load_template(config.template)
131
+ # Configure Jinja env with empty string for undefined
132
+ env = Environment(undefined=EmptyStringUndefined, enable_async=True)
133
+ self.path_template = env.from_string(config.path)
134
+
135
+ self._entries: list[dict[str, Any]] = []
136
+
137
+ def _load_template(
138
+ self,
139
+ template: LogFormat | JoinablePathLike | None,
140
+ ) -> Template:
141
+ """Load template from predefined or file."""
142
+ from jinja2 import Template
143
+
144
+ if template is None:
145
+ template_str = self.TEMPLATES["chronological"]
146
+ elif template in self.TEMPLATES:
147
+ template_str = self.TEMPLATES[template] # type: ignore
148
+ else: # Assume it's a path
149
+ template_str = to_upath(template).read_text()
150
+ return Template(template_str)
151
+
152
+ def _get_base_context(self, operation: str) -> dict[str, Any]:
153
+ """Get base context with defaults.
154
+
155
+ Args:
156
+ operation: Type of operation being logged
157
+
158
+ Returns:
159
+ Base context dict with defaults
160
+ """
161
+ # All other variables will default to empty string via EmptyStringUndefined
162
+ return {"now": get_now(), "date": get_now().date(), "operation": operation}
163
+
164
+ async def _get_path(self, operation: str, **context: Any) -> UPath:
165
+ """Render path template with context.
166
+
167
+ Args:
168
+ operation: Type of operation being logged
169
+ **context: Additional context variables
170
+
171
+ Returns:
172
+ Concrete path for current operation
173
+ """
174
+ # Combine base context with provided values
175
+ path_context = self._get_base_context(operation)
176
+ path_context.update(context)
177
+
178
+ path = await self.path_template.render_async(**path_context)
179
+ resolved_path = to_upath(path)
180
+ resolved_path.parent.mkdir(parents=True, exist_ok=True)
181
+ return resolved_path
182
+
183
+ async def log_message(
184
+ self,
185
+ *,
186
+ conversation_id: str,
187
+ message_id: str,
188
+ content: str,
189
+ role: str,
190
+ name: str | None = None,
191
+ cost_info: Any | None = None,
192
+ model: str | None = None,
193
+ response_time: float | None = None,
194
+ forwarded_from: list[str] | None = None,
195
+ provider_name: str | None = None,
196
+ provider_response_id: str | None = None,
197
+ messages: str | None = None,
198
+ finish_reason: str | None = None,
199
+ ) -> None:
200
+ """Store message and update log."""
201
+ entry = {
202
+ "type": "message",
203
+ "timestamp": get_now(),
204
+ "conversation_id": conversation_id,
205
+ "message_id": message_id,
206
+ "content": content,
207
+ "role": role,
208
+ "agent_name": name,
209
+ "model": model,
210
+ "cost_info": cost_info,
211
+ "response_time": response_time,
212
+ "forwarded_from": forwarded_from,
213
+ "provider_name": provider_name,
214
+ "provider_response_id": provider_response_id,
215
+ "messages": messages,
216
+ "finish_reason": finish_reason,
217
+ }
218
+ self._entries.append(entry)
219
+
220
+ path = await self._get_path("message", **entry)
221
+ self._write(path)
222
+
223
+ async def log_conversation(
224
+ self,
225
+ *,
226
+ conversation_id: str,
227
+ node_name: str,
228
+ start_time: datetime | None = None,
229
+ ) -> None:
230
+ """Store conversation start."""
231
+ entry = {
232
+ "type": "conversation",
233
+ "timestamp": start_time or get_now(),
234
+ "conversation_id": conversation_id,
235
+ "agent_name": node_name,
236
+ }
237
+ self._entries.append(entry)
238
+
239
+ path = await self._get_path("conversation", **entry)
240
+ self._write(path)
241
+
242
+ async def log_command(
243
+ self,
244
+ *,
245
+ agent_name: str,
246
+ session_id: str,
247
+ command: str,
248
+ context_type: type | None = None,
249
+ metadata: dict[str, JsonValue] | None = None,
250
+ ) -> None:
251
+ """Store command."""
252
+ entry = {
253
+ "type": "command",
254
+ "timestamp": get_now(),
255
+ "agent_name": agent_name,
256
+ "session_id": session_id,
257
+ "command": command,
258
+ "context_type": context_type.__name__ if context_type else "",
259
+ "metadata": metadata or {},
260
+ }
261
+ self._entries.append(entry)
262
+
263
+ path = await self._get_path("command", **entry)
264
+ self._write(path)
265
+
266
+ def _write(self, path: UPath) -> None:
267
+ """Write current state to file at given path."""
268
+ context = {"entries": self._entries}
269
+ try:
270
+ text = self.content_template.render(context)
271
+ path.write_text(text, encoding=self.encoding)
272
+ except Exception as e:
273
+ logger.exception("Failed to write to log file", path=path)
274
+ msg = f"Failed to write to log file: {e}"
275
+ raise RuntimeError(msg) from e
@@ -0,0 +1,15 @@
1
+ """Toolsets package."""
2
+
3
+ from agentpool_toolsets.config_creation import ConfigCreationTools
4
+ from agentpool_toolsets.fsspec_toolset import FSSpecTools
5
+ from agentpool_toolsets.notifications import NotificationsTools
6
+ from agentpool_toolsets.semantic_memory_toolset import SemanticMemoryTools
7
+ from agentpool_toolsets.vfs_toolset import VFSTools
8
+
9
+ __all__ = [
10
+ "ConfigCreationTools",
11
+ "FSSpecTools",
12
+ "NotificationsTools",
13
+ "SemanticMemoryTools",
14
+ "VFSTools",
15
+ ]
@@ -0,0 +1,33 @@
1
+ """Built-in toolsets for agent capabilities."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ # Import provider classes
7
+ from agentpool_toolsets.builtin.agent_management import AgentManagementTools
8
+ from agentpool_toolsets.builtin.code import CodeTools
9
+ from agentpool_toolsets.builtin.debug import DebugTools
10
+ from agentpool_toolsets.builtin.execution_environment import ExecutionEnvironmentTools
11
+ from agentpool_toolsets.builtin.history import HistoryTools
12
+ from agentpool_toolsets.builtin.integration import IntegrationTools
13
+ from agentpool_toolsets.builtin.skills import SkillsTools
14
+ from agentpool_toolsets.builtin.subagent_tools import SubagentTools
15
+ from agentpool_toolsets.builtin.tool_management import ToolManagementTools
16
+ from agentpool_toolsets.builtin.user_interaction import UserInteractionTools
17
+ from agentpool_toolsets.builtin.workers import WorkersTools
18
+
19
+
20
+ __all__ = [
21
+ # Provider classes
22
+ "AgentManagementTools",
23
+ "CodeTools",
24
+ "DebugTools",
25
+ "ExecutionEnvironmentTools",
26
+ "HistoryTools",
27
+ "IntegrationTools",
28
+ "SkillsTools",
29
+ "SubagentTools",
30
+ "ToolManagementTools",
31
+ "UserInteractionTools",
32
+ "WorkersTools",
33
+ ]
@@ -0,0 +1,239 @@
1
+ """Provider for agent pool building tools."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import timedelta
6
+ from typing import TYPE_CHECKING, Any, Literal
7
+
8
+ import anyio
9
+ from pydantic_ai import ModelRetry
10
+
11
+ from agentpool.agents.context import AgentContext # noqa: TC001
12
+ from agentpool.log import get_logger
13
+ from agentpool.resource_providers import StaticResourceProvider
14
+ from agentpool.tools.exceptions import ToolError
15
+ from agentpool.utils.result_utils import to_type
16
+
17
+
18
+ if TYPE_CHECKING:
19
+ from agentpool.agents import Agent
20
+
21
+ logger = get_logger(__name__)
22
+
23
+
24
+ async def create_worker_agent[TDeps](
25
+ ctx: AgentContext[TDeps],
26
+ name: str,
27
+ system_prompt: str,
28
+ model: str | None = None,
29
+ ) -> str:
30
+ """Create a new agent and register it as a tool.
31
+
32
+ The new agent will be available as a tool for delegating specific tasks.
33
+ It inherits the current model unless overridden.
34
+ """
35
+ from agentpool import Agent
36
+
37
+ if not ctx.pool:
38
+ msg = "Agent needs to be in a pool to list agents"
39
+ raise ToolError(msg)
40
+
41
+ model = model or ctx.agent.model_name
42
+ agent = Agent[TDeps](name=name, model=model, system_prompt=system_prompt, agent_pool=ctx.pool)
43
+ assert ctx.agent
44
+ tool_info = ctx.native_agent.register_worker(agent)
45
+ return f"Created worker agent and registered as tool: {tool_info.name}"
46
+
47
+
48
+ async def add_agent( # noqa: D417
49
+ ctx: AgentContext,
50
+ name: str,
51
+ system_prompt: str,
52
+ model: str | None = None,
53
+ tools: list[str] | None = None,
54
+ session: str | None = None,
55
+ output_type: str | None = None,
56
+ ) -> str:
57
+ """Add a new agent to the pool.
58
+
59
+ Args:
60
+ name: Name for the new agent
61
+ system_prompt: System prompt defining agent's role/behavior
62
+ model: Optional model override (uses default if not specified)
63
+ tools: Imort paths of the tools the agent should have, if any.
64
+ session: Session ID to recover conversation state from
65
+ output_type: Name of response type from manifest (for structured output)
66
+
67
+ Returns:
68
+ Confirmation message about the created agent
69
+ """
70
+ assert ctx.pool, "No agent pool available"
71
+ try:
72
+ agent: Agent[Any, Any] = await ctx.pool.add_agent(
73
+ name=name,
74
+ system_prompt=system_prompt,
75
+ model=model,
76
+ tools=tools,
77
+ output_type=to_type(output_type, responses=ctx.pool.manifest.responses),
78
+ session=session,
79
+ )
80
+ except ValueError as e: # for wrong tool imports
81
+ raise ModelRetry(message=f"Error creating agent: {e}") from None
82
+ return f"Created agent **{agent.name}** using model **{agent.model_name}**"
83
+
84
+
85
+ async def add_team( # noqa: D417
86
+ ctx: AgentContext,
87
+ nodes: list[str],
88
+ mode: Literal["sequential", "parallel"] = "sequential",
89
+ name: str | None = None,
90
+ ) -> str:
91
+ """Create a team from existing agents.
92
+
93
+ Args:
94
+ nodes: Names of agents / sub-teams to include in team
95
+ mode: How the team should operate:
96
+ - sequential: Agents process in sequence (pipeline)
97
+ - parallel: Agents process simultaneously
98
+ name: Optional name for the team
99
+ """
100
+ if not ctx.pool:
101
+ msg = "No agent pool available"
102
+ raise ToolError(msg)
103
+
104
+ # Verify all agents exist
105
+ for node_name in nodes:
106
+ if node_name not in ctx.pool.nodes:
107
+ msg = (
108
+ f"No agent or team found with name: {node_name}. "
109
+ f"Available nodes: {', '.join(ctx.pool.nodes.keys())}"
110
+ )
111
+ raise ModelRetry(msg)
112
+ if mode == "sequential":
113
+ ctx.pool.create_team_run(nodes, name=name)
114
+ else:
115
+ ctx.pool.create_team(nodes, name=name)
116
+ mode_str = "pipeline" if mode == "sequential" else "parallel"
117
+ return f"Created **{mode_str}** team with nodes: **{', '.join(nodes)}**"
118
+
119
+
120
+ async def connect_nodes( # noqa: D417
121
+ ctx: AgentContext,
122
+ source: str,
123
+ target: str,
124
+ *,
125
+ connection_type: Literal["run", "context", "forward"] = "run",
126
+ priority: int = 0,
127
+ delay_seconds: float | None = None,
128
+ queued: bool = False,
129
+ queue_strategy: Literal["concat", "latest", "buffer"] = "latest",
130
+ wait_for_completion: bool = True,
131
+ name: str | None = None,
132
+ ) -> str:
133
+ """Connect two nodes to enable message flow between them.
134
+
135
+ Nodes can be agents or teams.
136
+
137
+ Args:
138
+ source: Name of the source node
139
+ target: Name of the target node
140
+ connection_type: How messages should be handled:
141
+ - run: Execute message as a new run in target
142
+ - context: Add message as context to target
143
+ - forward: Forward message to target's outbox
144
+ priority: Task priority (lower = higher priority)
145
+ delay_seconds: Optional delay before processing messages
146
+ queued: Whether messages should be queued for manual processing
147
+ queue_strategy: How to process queued messages:
148
+ - concat: Combine all messages with newlines
149
+ - latest: Use only the most recent message
150
+ - buffer: Process all messages individually
151
+ wait_for_completion: Whether to wait for target to complete
152
+ name: Optional name for this connection
153
+
154
+ Returns:
155
+ Description of the created connection
156
+ """
157
+ if not ctx.pool:
158
+ msg = "No agent pool available"
159
+ raise ToolError(msg)
160
+
161
+ # Get the nodes
162
+ if source not in ctx.pool.nodes:
163
+ msg = (
164
+ f"No agent or team found with name: {source}. "
165
+ f"Available nodes: {', '.join(ctx.pool.nodes.keys())}"
166
+ )
167
+ raise ModelRetry(msg)
168
+ if target not in ctx.pool.nodes:
169
+ msg = (
170
+ f"No agent or team found with name: {target}. "
171
+ f"Available nodes: {', '.join(ctx.pool.nodes.keys())}"
172
+ )
173
+ raise ModelRetry(msg)
174
+
175
+ source_node = ctx.pool.nodes[source]
176
+ target_node = ctx.pool.nodes[target]
177
+
178
+ # Create the connection
179
+ delay = timedelta(seconds=delay_seconds) if delay_seconds is not None else None
180
+ _talk = source_node.connect_to(
181
+ target_node,
182
+ connection_type=connection_type,
183
+ priority=priority,
184
+ delay=delay,
185
+ queued=queued,
186
+ queue_strategy=queue_strategy,
187
+ name=name,
188
+ )
189
+ source_node.connections.set_wait_state(target_node, wait=wait_for_completion)
190
+
191
+ return (
192
+ f"Created connection from **{source}** to **{target}** "
193
+ f"*(type={connection_type}, queued={queued}, "
194
+ f"strategy={queue_strategy if queued else 'n/a'})*"
195
+ )
196
+
197
+
198
+ class AgentManagementTools(StaticResourceProvider):
199
+ """Provider for agent pool building tools."""
200
+
201
+ def __init__(self, name: str = "agent_management") -> None:
202
+ super().__init__(name=name)
203
+ for tool in [
204
+ self.create_tool(create_worker_agent, category="other", destructive=False),
205
+ self.create_tool(add_agent, category="other", destructive=False),
206
+ self.create_tool(add_team, category="other", destructive=False),
207
+ self.create_tool(connect_nodes, category="other", destructive=False),
208
+ ]:
209
+ self.add_tool(tool)
210
+
211
+
212
+ if __name__ == "__main__":
213
+ # import logging
214
+ from agentpool import AgentPool
215
+
216
+ user_prompt = """Add a stdio MCP server:
217
+ // "command": "npx",
218
+ // "args": ["mcp-graphql"],
219
+ // "env": { "ENDPOINT": "https://diego.one/graphql" }
220
+
221
+ ."""
222
+
223
+ async def main() -> None:
224
+ from agentpool_config.toolsets import IntegrationToolsetConfig
225
+
226
+ async with AgentPool() as pool:
227
+ toolsets = [IntegrationToolsetConfig()]
228
+ toolset_providers = [config.get_provider() for config in toolsets]
229
+ agent = await pool.add_agent(
230
+ "X",
231
+ toolsets=toolset_providers,
232
+ model="openai:gpt-5-nano",
233
+ )
234
+ result = await agent.run(user_prompt)
235
+ print(result)
236
+ result = await agent.run("Which tools does it have?")
237
+ print(result)
238
+
239
+ anyio.run(main)