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,600 @@
1
+ """Event handler configuration models for AgentPool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Annotated, Literal
6
+
7
+ from pydantic import ConfigDict, Field
8
+ from pydantic.types import SecretStr
9
+ from schemez import Schema
10
+
11
+
12
+ if TYPE_CHECKING:
13
+ from collections.abc import Sequence
14
+
15
+ from agentpool.common_types import IndividualEventHandler
16
+
17
+ StdOutStyle = Literal["simple", "detailed"]
18
+
19
+ OpenAITTSModel = Literal["tts-1", "tts-1-hd"]
20
+ OpenAITTSVoice = Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"]
21
+
22
+ EdgeTTSVoice = Literal[
23
+ "af-ZA-AdriNeural",
24
+ "af-ZA-WillemNeural",
25
+ "sq-AL-AnilaNeural",
26
+ "sq-AL-IlirNeural",
27
+ "am-ET-AmehaNeural",
28
+ "am-ET-MekdesNeural",
29
+ "ar-DZ-AminaNeural",
30
+ "ar-DZ-IsmaelNeural",
31
+ "ar-BH-AliNeural",
32
+ "ar-BH-LailaNeural",
33
+ "ar-EG-SalmaNeural",
34
+ "ar-EG-ShakirNeural",
35
+ "ar-IQ-BasselNeural",
36
+ "ar-IQ-RanaNeural",
37
+ "ar-JO-SanaNeural",
38
+ "ar-JO-TaimNeural",
39
+ "ar-KW-FahedNeural",
40
+ "ar-KW-NouraNeural",
41
+ "ar-LB-LaylaNeural",
42
+ "ar-LB-RamiNeural",
43
+ "ar-LY-ImanNeural",
44
+ "ar-LY-OmarNeural",
45
+ "ar-MA-JamalNeural",
46
+ "ar-MA-MounaNeural",
47
+ "ar-OM-AbdullahNeural",
48
+ "ar-OM-AyshaNeural",
49
+ "ar-QA-AmalNeural",
50
+ "ar-QA-MoazNeural",
51
+ "ar-SA-HamedNeural",
52
+ "ar-SA-ZariyahNeural",
53
+ "ar-SY-AmanyNeural",
54
+ "ar-SY-LaithNeural",
55
+ "ar-TN-HediNeural",
56
+ "ar-TN-ReemNeural",
57
+ "ar-AE-FatimaNeural",
58
+ "ar-AE-HamdanNeural",
59
+ "ar-YE-MaryamNeural",
60
+ "ar-YE-SalehNeural",
61
+ "az-AZ-BabekNeural",
62
+ "az-AZ-BanuNeural",
63
+ "bn-BD-NabanitaNeural",
64
+ "bn-BD-PradeepNeural",
65
+ "bn-IN-BashkarNeural",
66
+ "bn-IN-TanishaaNeural",
67
+ "bs-BA-GoranNeural",
68
+ "bs-BA-VesnaNeural",
69
+ "bg-BG-BorislavNeural",
70
+ "bg-BG-KalinaNeural",
71
+ "my-MM-NilarNeural",
72
+ "my-MM-ThihaNeural",
73
+ "ca-ES-EnricNeural",
74
+ "ca-ES-JoanaNeural",
75
+ "zh-HK-HiuGaaiNeural",
76
+ "zh-HK-HiuMaanNeural",
77
+ "zh-HK-WanLungNeural",
78
+ "zh-CN-XiaoxiaoNeural",
79
+ "zh-CN-XiaoyiNeural",
80
+ "zh-CN-YunjianNeural",
81
+ "zh-CN-YunxiNeural",
82
+ "zh-CN-YunxiaNeural",
83
+ "zh-CN-YunyangNeural",
84
+ "zh-CN-liaoning-XiaobeiNeural",
85
+ "zh-TW-HsiaoChenNeural",
86
+ "zh-TW-YunJheNeural",
87
+ "zh-TW-HsiaoYuNeural",
88
+ "zh-CN-shaanxi-XiaoniNeural",
89
+ "hr-HR-GabrijelaNeural",
90
+ "hr-HR-SreckoNeural",
91
+ "cs-CZ-AntoninNeural",
92
+ "cs-CZ-VlastaNeural",
93
+ "da-DK-ChristelNeural",
94
+ "da-DK-JeppeNeural",
95
+ "nl-BE-ArnaudNeural",
96
+ "nl-BE-DenaNeural",
97
+ "nl-NL-ColetteNeural",
98
+ "nl-NL-FennaNeural",
99
+ "nl-NL-MaartenNeural",
100
+ "en-AU-NatashaNeural",
101
+ "en-AU-WilliamNeural",
102
+ "en-CA-ClaraNeural",
103
+ "en-CA-LiamNeural",
104
+ "en-HK-SamNeural",
105
+ "en-HK-YanNeural",
106
+ "en-IN-NeerjaNeural",
107
+ "en-IN-PrabhatNeural",
108
+ "en-IE-ConnorNeural",
109
+ "en-IE-EmilyNeural",
110
+ "en-KE-AsiliaNeural",
111
+ "en-KE-ChilembaNeural",
112
+ "en-NZ-MitchellNeural",
113
+ "en-NZ-MollyNeural",
114
+ "en-NG-AbeoNeural",
115
+ "en-NG-EzinneNeural",
116
+ "en-PH-JamesNeural",
117
+ "en-PH-RosaNeural",
118
+ "en-SG-LunaNeural",
119
+ "en-SG-WayneNeural",
120
+ "en-ZA-LeahNeural",
121
+ "en-ZA-LukeNeural",
122
+ "en-TZ-ElimuNeural",
123
+ "en-TZ-ImaniNeural",
124
+ "en-GB-LibbyNeural",
125
+ "en-GB-MaisieNeural",
126
+ "en-GB-RyanNeural",
127
+ "en-GB-SoniaNeural",
128
+ "en-GB-ThomasNeural",
129
+ "en-US-AriaNeural",
130
+ "en-US-AnaNeural",
131
+ "en-US-ChristopherNeural",
132
+ "en-US-EricNeural",
133
+ "en-US-GuyNeural",
134
+ "en-US-JennyNeural",
135
+ "en-US-MichelleNeural",
136
+ "en-US-RogerNeural",
137
+ "en-US-SteffanNeural",
138
+ "et-EE-AnuNeural",
139
+ "et-EE-KertNeural",
140
+ "fil-PH-AngeloNeural",
141
+ "fil-PH-BlessicaNeural",
142
+ "fi-FI-HarriNeural",
143
+ "fi-FI-NooraNeural",
144
+ "fr-BE-CharlineNeural",
145
+ "fr-BE-GerardNeural",
146
+ "fr-CA-AntoineNeural",
147
+ "fr-CA-JeanNeural",
148
+ "fr-CA-SylvieNeural",
149
+ "fr-FR-DeniseNeural",
150
+ "fr-FR-EloiseNeural",
151
+ "fr-FR-HenriNeural",
152
+ "fr-CH-ArianeNeural",
153
+ "fr-CH-FabriceNeural",
154
+ "gl-ES-RoiNeural",
155
+ "gl-ES-SabelaNeural",
156
+ "ka-GE-EkaNeural",
157
+ "ka-GE-GiorgiNeural",
158
+ "de-AT-IngridNeural",
159
+ "de-AT-JonasNeural",
160
+ "de-DE-AmalaNeural",
161
+ "de-DE-ConradNeural",
162
+ "de-DE-KatjaNeural",
163
+ "de-DE-KillianNeural",
164
+ "de-CH-JanNeural",
165
+ "de-CH-LeniNeural",
166
+ "el-GR-AthinaNeural",
167
+ "el-GR-NestorasNeural",
168
+ "gu-IN-DhwaniNeural",
169
+ "gu-IN-NiranjanNeural",
170
+ "he-IL-AvriNeural",
171
+ "he-IL-HilaNeural",
172
+ "hi-IN-MadhurNeural",
173
+ "hi-IN-SwaraNeural",
174
+ "hu-HU-NoemiNeural",
175
+ "hu-HU-TamasNeural",
176
+ "is-IS-GudrunNeural",
177
+ "is-IS-GunnarNeural",
178
+ "id-ID-ArdiNeural",
179
+ "id-ID-GadisNeural",
180
+ "ga-IE-ColmNeural",
181
+ "ga-IE-OrlaNeural",
182
+ "it-IT-DiegoNeural",
183
+ "it-IT-ElsaNeural",
184
+ "it-IT-IsabellaNeural",
185
+ "ja-JP-KeitaNeural",
186
+ "ja-JP-NanamiNeural",
187
+ "jv-ID-DimasNeural",
188
+ "jv-ID-SitiNeural",
189
+ "kn-IN-GaganNeural",
190
+ "kn-IN-SapnaNeural",
191
+ "kk-KZ-AigulNeural",
192
+ "kk-KZ-DauletNeural",
193
+ "km-KH-PisethNeural",
194
+ "km-KH-SreymomNeural",
195
+ "ko-KR-InJoonNeural",
196
+ "ko-KR-SunHiNeural",
197
+ "lo-LA-ChanthavongNeural",
198
+ "lo-LA-KeomanyNeural",
199
+ "lv-LV-EveritaNeural",
200
+ "lv-LV-NilsNeural",
201
+ "lt-LT-LeonasNeural",
202
+ "lt-LT-OnaNeural",
203
+ "mk-MK-AleksandarNeural",
204
+ "mk-MK-MarijaNeural",
205
+ "ms-MY-OsmanNeural",
206
+ "ms-MY-YasminNeural",
207
+ "ml-IN-MidhunNeural",
208
+ "ml-IN-SobhanaNeural",
209
+ "mt-MT-GraceNeural",
210
+ "mt-MT-JosephNeural",
211
+ "mr-IN-AarohiNeural",
212
+ "mr-IN-ManoharNeural",
213
+ "mn-MN-BataaNeural",
214
+ "mn-MN-YesuiNeural",
215
+ "ne-NP-HemkalaNeural",
216
+ "ne-NP-SagarNeural",
217
+ "nb-NO-FinnNeural",
218
+ "nb-NO-PernilleNeural",
219
+ "ps-AF-GulNawazNeural",
220
+ "ps-AF-LatifaNeural",
221
+ "fa-IR-DilaraNeural",
222
+ "fa-IR-FaridNeural",
223
+ "pl-PL-MarekNeural",
224
+ "pl-PL-ZofiaNeural",
225
+ "pt-BR-AntonioNeural",
226
+ "pt-BR-FranciscaNeural",
227
+ "pt-PT-DuarteNeural",
228
+ "pt-PT-RaquelNeural",
229
+ "ro-RO-AlinaNeural",
230
+ "ro-RO-EmilNeural",
231
+ "ru-RU-DmitryNeural",
232
+ "ru-RU-SvetlanaNeural",
233
+ "sr-RS-NicholasNeural",
234
+ "sr-RS-SophieNeural",
235
+ "si-LK-SameeraNeural",
236
+ "si-LK-ThiliniNeural",
237
+ "sk-SK-LukasNeural",
238
+ "sk-SK-ViktoriaNeural",
239
+ "sl-SI-PetraNeural",
240
+ "sl-SI-RokNeural",
241
+ "so-SO-MuuseNeural",
242
+ "so-SO-UbaxNeural",
243
+ "es-AR-ElenaNeural",
244
+ "es-AR-TomasNeural",
245
+ "es-BO-MarceloNeural",
246
+ "es-BO-SofiaNeural",
247
+ "es-CL-CatalinaNeural",
248
+ "es-CL-LorenzoNeural",
249
+ "es-CO-GonzaloNeural",
250
+ "es-CO-SalomeNeural",
251
+ "es-CR-JuanNeural",
252
+ "es-CR-MariaNeural",
253
+ "es-CU-BelkysNeural",
254
+ "es-CU-ManuelNeural",
255
+ "es-DO-EmilioNeural",
256
+ "es-DO-RamonaNeural",
257
+ "es-EC-AndreaNeural",
258
+ "es-EC-LuisNeural",
259
+ "es-SV-LorenaNeural",
260
+ "es-SV-RodrigoNeural",
261
+ "es-GQ-JavierNeural",
262
+ "es-GQ-TeresaNeural",
263
+ "es-GT-AndresNeural",
264
+ "es-GT-MartaNeural",
265
+ "es-HN-CarlosNeural",
266
+ "es-HN-KarlaNeural",
267
+ "es-MX-DaliaNeural",
268
+ "es-MX-JorgeNeural",
269
+ "es-MX-LorenzoEsCLNeural",
270
+ "es-NI-FedericoNeural",
271
+ "es-NI-YolandaNeural",
272
+ "es-PA-MargaritaNeural",
273
+ "es-PA-RobertoNeural",
274
+ "es-PY-MarioNeural",
275
+ "es-PY-TaniaNeural",
276
+ "es-PE-AlexNeural",
277
+ "es-PE-CamilaNeural",
278
+ "es-PR-KarinaNeural",
279
+ "es-PR-VictorNeural",
280
+ "es-ES-AlvaroNeural",
281
+ "es-ES-ElviraNeural",
282
+ "es-ES-ManuelEsCUNeural",
283
+ "es-US-AlonsoNeural",
284
+ "es-US-PalomaNeural",
285
+ "es-UY-MateoNeural",
286
+ "es-UY-ValentinaNeural",
287
+ "es-VE-PaolaNeural",
288
+ "es-VE-SebastianNeural",
289
+ "su-ID-JajangNeural",
290
+ "su-ID-TutiNeural",
291
+ "sw-KE-RafikiNeural",
292
+ "sw-KE-ZuriNeural",
293
+ "sw-TZ-DaudiNeural",
294
+ "sw-TZ-RehemaNeural",
295
+ "sv-SE-MattiasNeural",
296
+ "sv-SE-SofieNeural",
297
+ "ta-IN-PallaviNeural",
298
+ "ta-IN-ValluvarNeural",
299
+ "ta-MY-KaniNeural",
300
+ "ta-MY-SuryaNeural",
301
+ "ta-SG-AnbuNeural",
302
+ "ta-SG-VenbaNeural",
303
+ "ta-LK-KumarNeural",
304
+ "ta-LK-SaranyaNeural",
305
+ "te-IN-MohanNeural",
306
+ "te-IN-ShrutiNeural",
307
+ "th-TH-NiwatNeural",
308
+ "th-TH-PremwadeeNeural",
309
+ "tr-TR-AhmetNeural",
310
+ "tr-TR-EmelNeural",
311
+ "uk-UA-OstapNeural",
312
+ "uk-UA-PolinaNeural",
313
+ "ur-IN-GulNeural",
314
+ "ur-IN-SalmanNeural",
315
+ "ur-PK-AsadNeural",
316
+ "ur-PK-UzmaNeural",
317
+ "uz-UZ-MadinaNeural",
318
+ "uz-UZ-SardorNeural",
319
+ "vi-VN-HoaiMyNeural",
320
+ "vi-VN-NamMinhNeural",
321
+ "cy-GB-AledNeural",
322
+ "cy-GB-NiaNeural",
323
+ "zu-ZA-ThandoNeural",
324
+ "zu-ZA-ThembaNeural",
325
+ ]
326
+
327
+
328
+ class BaseEventHandlerConfig(Schema):
329
+ """Base configuration for event handlers."""
330
+
331
+ type: str = Field(init=False)
332
+ """Event handler type discriminator."""
333
+
334
+ enabled: bool = Field(default=True)
335
+ """Whether this handler is enabled."""
336
+
337
+ def get_handler(self) -> IndividualEventHandler:
338
+ """Create and return the configured event handler.
339
+
340
+ Returns:
341
+ Configured event handler callable.
342
+
343
+ Raises:
344
+ NotImplementedError: Must be implemented by subclasses.
345
+ """
346
+ raise NotImplementedError
347
+
348
+
349
+ class StdoutEventHandlerConfig(BaseEventHandlerConfig):
350
+ """Configuration for built-in event handlers (simple, detailed)."""
351
+
352
+ model_config = ConfigDict(title="Stdout Event Handler")
353
+
354
+ type: Literal["builtin"] = Field("builtin", init=False)
355
+ """Builtin event handler."""
356
+
357
+ handler: StdOutStyle = Field(default="simple", examples=["simple", "detailed"])
358
+ """Which builtin handler to use.
359
+
360
+ - simple: Basic text and tool notifications
361
+ - detailed: Comprehensive execution visibility
362
+ """
363
+
364
+ def get_handler(self) -> IndividualEventHandler:
365
+ """Get the builtin event handler."""
366
+ from agentpool.agents.events import detailed_print_handler, simple_print_handler
367
+
368
+ handlers = {"simple": simple_print_handler, "detailed": detailed_print_handler}
369
+ return handlers[self.handler]
370
+
371
+
372
+ class CallbackEventHandlerConfig(BaseEventHandlerConfig):
373
+ """Configuration for custom callback event handlers via import path."""
374
+
375
+ model_config = ConfigDict(title="Callback Event Handler")
376
+
377
+ type: Literal["callback"] = Field("callback", init=False)
378
+ """Callback event handler."""
379
+
380
+ import_path: str = Field(
381
+ examples=[
382
+ "mymodule:my_handler",
383
+ "mypackage.handlers:custom_event_handler",
384
+ ],
385
+ )
386
+ """Import path to the handler function (module:function format)."""
387
+
388
+ def get_handler(self) -> IndividualEventHandler:
389
+ """Import and return the callback handler."""
390
+ from agentpool.utils.importing import import_callable
391
+
392
+ return import_callable(self.import_path)
393
+
394
+
395
+ class TTSEventHandlerConfig(BaseEventHandlerConfig):
396
+ """Configuration for Text-to-Speech event handler with OpenAI streaming."""
397
+
398
+ model_config = ConfigDict(title="Text-to-Speech Event Handler")
399
+
400
+ type: Literal["tts-openai"] = Field("tts-openai", init=False)
401
+ """OpenAI TTS event handler."""
402
+
403
+ api_key: SecretStr | None = Field(default=None, examples=["sk-..."], title="OpenAI API Key")
404
+ """OpenAI API key. If not provided, uses OPENAI_API_KEY env var."""
405
+
406
+ model: OpenAITTSModel = Field(
407
+ default="tts-1", examples=["tts-1", "tts-1-hd"], title="TTS Model"
408
+ )
409
+ """TTS model to use.
410
+
411
+ - tts-1: Fast, optimized for real-time streaming
412
+ - tts-1-hd: Higher quality, slightly higher latency
413
+ """
414
+
415
+ voice: OpenAITTSVoice = Field(
416
+ default="alloy",
417
+ examples=["alloy", "echo", "fable", "onyx", "nova", "shimmer"],
418
+ title="Voice type",
419
+ )
420
+ """Voice to use for synthesis."""
421
+
422
+ speed: float = Field(
423
+ default=1.0,
424
+ ge=0.25,
425
+ le=4.0,
426
+ examples=[0.5, 1.0, 1.5, 2.0],
427
+ title="Speed of speech",
428
+ )
429
+ """Speed of speech (0.25 to 4.0, default 1.0)."""
430
+
431
+ chunk_size: int = Field(default=1024, ge=256, examples=[512, 1024, 2048], title="Chunk Size")
432
+ """Size of audio chunks to process (in bytes)."""
433
+
434
+ sample_rate: int = Field(default=24000, examples=[16000, 24000, 44100], title="Sample Rate")
435
+ """Audio sample rate in Hz (for PCM format)."""
436
+
437
+ min_text_length: int = Field(
438
+ default=20,
439
+ ge=5,
440
+ examples=[10, 20, 50],
441
+ title="Minimum Text Length",
442
+ )
443
+ """Minimum text length before synthesizing (in characters)."""
444
+
445
+ mode: Literal["sync_sentence", "sync_run", "async_queue", "async_cancel"] = Field(
446
+ default="sync_run",
447
+ examples=["sync_sentence", "sync_run", "async_queue", "async_cancel"],
448
+ title="Synchronization Mode",
449
+ )
450
+ """How TTS synthesis synchronizes with the event stream.
451
+
452
+ - sync_sentence: Wait for each sentence's audio before continuing (slowest, most synchronized)
453
+ - sync_run: Stream fast, wait for all audio at run end (default, recommended)
454
+ - async_queue: Stream fast, audio plays in background, multiple runs queue up
455
+ - async_cancel: Stream fast, audio plays in background, new run cancels previous audio
456
+ """
457
+
458
+ def get_handler(self) -> IndividualEventHandler:
459
+ """Get the TTS event handler."""
460
+ from agentpool.agents.events.tts_handlers import OpenAITTSEventHandler
461
+
462
+ key = self.api_key.get_secret_value() if self.api_key else None
463
+ return OpenAITTSEventHandler(
464
+ api_key=key,
465
+ model=self.model,
466
+ voice=self.voice,
467
+ speed=self.speed,
468
+ chunk_size=self.chunk_size,
469
+ sample_rate=self.sample_rate,
470
+ mode=self.mode,
471
+ min_text_length=self.min_text_length,
472
+ )
473
+
474
+
475
+ class EdgeTTSEventHandlerConfig(BaseEventHandlerConfig):
476
+ """Configuration for Edge TTS event handler (free, no API key required).
477
+
478
+ Uses Microsoft Edge's TTS service via edge-tts library.
479
+ Supports many voices and languages without requiring an API key.
480
+ """
481
+
482
+ model_config = ConfigDict(title="Edge TTS Event Handler")
483
+
484
+ type: Literal["tts-edge"] = Field("tts-edge", init=False)
485
+ """Edge TTS event handler."""
486
+
487
+ voice: EdgeTTSVoice = Field(
488
+ default="en-US-AriaNeural",
489
+ examples=[
490
+ "en-US-AriaNeural",
491
+ "en-US-GuyNeural",
492
+ "en-GB-SoniaNeural",
493
+ "de-DE-KatjaNeural",
494
+ "fr-FR-DeniseNeural",
495
+ ],
496
+ title="Voice name",
497
+ )
498
+ """Voice to use for synthesis.
499
+
500
+ Use `edge-tts --list-voices` to see all available voices.
501
+ Format: {locale}-{Name}Neural (e.g., en-US-AriaNeural)
502
+ """
503
+
504
+ speed: float = Field(
505
+ default=1.0,
506
+ ge=0.25,
507
+ le=4.0,
508
+ examples=[0.5, 1.0, 1.5, 2.0],
509
+ title="Speed of speech",
510
+ )
511
+ """Speed of speech (0.25 to 4.0, default 1.0)."""
512
+
513
+ volume: float = Field(
514
+ default=1.0,
515
+ ge=0.0,
516
+ le=2.0,
517
+ examples=[0.5, 1.0, 1.5, 2.0],
518
+ title="Volume",
519
+ )
520
+ """Volume level (0.0 to 2.0, default 1.0 = normal)."""
521
+
522
+ pitch: float = Field(
523
+ default=0.0,
524
+ ge=-100.0,
525
+ le=100.0,
526
+ examples=[-50.0, 0.0, 25.0, 50.0],
527
+ title="Pitch",
528
+ )
529
+ """Pitch adjustment in Hz (default 0.0 = no change)."""
530
+
531
+ sample_rate: int = Field(default=24000, examples=[16000, 24000, 44100], title="Sample Rate")
532
+ """Audio sample rate in Hz for playback."""
533
+
534
+ min_text_length: int = Field(
535
+ default=20,
536
+ ge=5,
537
+ examples=[10, 20, 50],
538
+ title="Minimum Text Length",
539
+ )
540
+ """Minimum text length before synthesizing (in characters)."""
541
+
542
+ mode: Literal["sync_sentence", "sync_run", "async_queue", "async_cancel"] = Field(
543
+ default="sync_run",
544
+ examples=["sync_sentence", "sync_run", "async_queue", "async_cancel"],
545
+ title="Synchronization Mode",
546
+ )
547
+ """How TTS synthesis synchronizes with the event stream.
548
+
549
+ - sync_sentence: Wait for each sentence's audio before continuing (slowest, most synchronized)
550
+ - sync_run: Stream fast, wait for all audio at run end (default, recommended)
551
+ - async_queue: Stream fast, audio plays in background, multiple runs queue up
552
+ - async_cancel: Stream fast, audio plays in background, new run cancels previous audio
553
+ """
554
+
555
+ def get_handler(self) -> IndividualEventHandler:
556
+ """Get the Edge TTS event handler."""
557
+ from agentpool.agents.events.tts_handlers import EdgeTTSEventHandler
558
+
559
+ # Convert to Edge TTS string formats
560
+ # speed: 1.0 -> "+0%", 1.5 -> "+50%", 0.5 -> "-50%"
561
+ # volume: 1.0 -> "+0%", 1.5 -> "+50%", 0.5 -> "-50%"
562
+ # pitch: 0.0 -> "+0Hz", 50.0 -> "+50Hz", -25.0 -> "-25Hz"
563
+ rate = f"{round((self.speed - 1.0) * 100):+d}%"
564
+ volume = f"{round((self.volume - 1.0) * 100):+d}%"
565
+ pitch = f"{round(self.pitch):+d}Hz"
566
+
567
+ return EdgeTTSEventHandler(
568
+ voice=self.voice,
569
+ rate=rate,
570
+ volume=volume,
571
+ pitch=pitch,
572
+ sample_rate=self.sample_rate,
573
+ mode=self.mode,
574
+ min_text_length=self.min_text_length,
575
+ )
576
+
577
+
578
+ EventHandlerConfig = Annotated[
579
+ StdoutEventHandlerConfig
580
+ | CallbackEventHandlerConfig
581
+ | TTSEventHandlerConfig
582
+ | EdgeTTSEventHandlerConfig,
583
+ Field(discriminator="type"),
584
+ ]
585
+
586
+
587
+ def resolve_handler_configs(
588
+ configs: Sequence[EventHandlerConfig] | None,
589
+ ) -> list[IndividualEventHandler]:
590
+ """Resolve event handler configs to actual handler callables.
591
+
592
+ Args:
593
+ configs: List of event handler configurations.
594
+
595
+ Returns:
596
+ List of resolved event handler callables.
597
+ """
598
+ if not configs:
599
+ return []
600
+ return [cfg.get_handler() for cfg in configs]