agno 2.2.13__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 (575) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +51 -0
  3. agno/agent/agent.py +10405 -0
  4. agno/api/__init__.py +0 -0
  5. agno/api/agent.py +28 -0
  6. agno/api/api.py +40 -0
  7. agno/api/evals.py +22 -0
  8. agno/api/os.py +17 -0
  9. agno/api/routes.py +13 -0
  10. agno/api/schemas/__init__.py +9 -0
  11. agno/api/schemas/agent.py +16 -0
  12. agno/api/schemas/evals.py +16 -0
  13. agno/api/schemas/os.py +14 -0
  14. agno/api/schemas/response.py +6 -0
  15. agno/api/schemas/team.py +16 -0
  16. agno/api/schemas/utils.py +21 -0
  17. agno/api/schemas/workflows.py +16 -0
  18. agno/api/settings.py +53 -0
  19. agno/api/team.py +30 -0
  20. agno/api/workflow.py +28 -0
  21. agno/cloud/aws/base.py +214 -0
  22. agno/cloud/aws/s3/__init__.py +2 -0
  23. agno/cloud/aws/s3/api_client.py +43 -0
  24. agno/cloud/aws/s3/bucket.py +195 -0
  25. agno/cloud/aws/s3/object.py +57 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +598 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2042 -0
  33. agno/db/dynamo/schemas.py +314 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +1795 -0
  37. agno/db/firestore/schemas.py +140 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1335 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1160 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1328 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/__init__.py +0 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/mongo/__init__.py +17 -0
  51. agno/db/mongo/async_mongo.py +2026 -0
  52. agno/db/mongo/mongo.py +1982 -0
  53. agno/db/mongo/schemas.py +87 -0
  54. agno/db/mongo/utils.py +259 -0
  55. agno/db/mysql/__init__.py +3 -0
  56. agno/db/mysql/mysql.py +2308 -0
  57. agno/db/mysql/schemas.py +138 -0
  58. agno/db/mysql/utils.py +355 -0
  59. agno/db/postgres/__init__.py +4 -0
  60. agno/db/postgres/async_postgres.py +1927 -0
  61. agno/db/postgres/postgres.py +2260 -0
  62. agno/db/postgres/schemas.py +139 -0
  63. agno/db/postgres/utils.py +442 -0
  64. agno/db/redis/__init__.py +3 -0
  65. agno/db/redis/redis.py +1660 -0
  66. agno/db/redis/schemas.py +123 -0
  67. agno/db/redis/utils.py +346 -0
  68. agno/db/schemas/__init__.py +4 -0
  69. agno/db/schemas/culture.py +120 -0
  70. agno/db/schemas/evals.py +33 -0
  71. agno/db/schemas/knowledge.py +40 -0
  72. agno/db/schemas/memory.py +46 -0
  73. agno/db/schemas/metrics.py +0 -0
  74. agno/db/singlestore/__init__.py +3 -0
  75. agno/db/singlestore/schemas.py +130 -0
  76. agno/db/singlestore/singlestore.py +2272 -0
  77. agno/db/singlestore/utils.py +384 -0
  78. agno/db/sqlite/__init__.py +4 -0
  79. agno/db/sqlite/async_sqlite.py +2293 -0
  80. agno/db/sqlite/schemas.py +133 -0
  81. agno/db/sqlite/sqlite.py +2288 -0
  82. agno/db/sqlite/utils.py +431 -0
  83. agno/db/surrealdb/__init__.py +3 -0
  84. agno/db/surrealdb/metrics.py +292 -0
  85. agno/db/surrealdb/models.py +309 -0
  86. agno/db/surrealdb/queries.py +71 -0
  87. agno/db/surrealdb/surrealdb.py +1353 -0
  88. agno/db/surrealdb/utils.py +147 -0
  89. agno/db/utils.py +116 -0
  90. agno/debug.py +18 -0
  91. agno/eval/__init__.py +14 -0
  92. agno/eval/accuracy.py +834 -0
  93. agno/eval/performance.py +773 -0
  94. agno/eval/reliability.py +306 -0
  95. agno/eval/utils.py +119 -0
  96. agno/exceptions.py +161 -0
  97. agno/filters.py +354 -0
  98. agno/guardrails/__init__.py +6 -0
  99. agno/guardrails/base.py +19 -0
  100. agno/guardrails/openai.py +144 -0
  101. agno/guardrails/pii.py +94 -0
  102. agno/guardrails/prompt_injection.py +52 -0
  103. agno/integrations/__init__.py +0 -0
  104. agno/integrations/discord/__init__.py +3 -0
  105. agno/integrations/discord/client.py +203 -0
  106. agno/knowledge/__init__.py +5 -0
  107. agno/knowledge/chunking/__init__.py +0 -0
  108. agno/knowledge/chunking/agentic.py +79 -0
  109. agno/knowledge/chunking/document.py +91 -0
  110. agno/knowledge/chunking/fixed.py +57 -0
  111. agno/knowledge/chunking/markdown.py +151 -0
  112. agno/knowledge/chunking/recursive.py +63 -0
  113. agno/knowledge/chunking/row.py +39 -0
  114. agno/knowledge/chunking/semantic.py +86 -0
  115. agno/knowledge/chunking/strategy.py +165 -0
  116. agno/knowledge/content.py +74 -0
  117. agno/knowledge/document/__init__.py +5 -0
  118. agno/knowledge/document/base.py +58 -0
  119. agno/knowledge/embedder/__init__.py +5 -0
  120. agno/knowledge/embedder/aws_bedrock.py +343 -0
  121. agno/knowledge/embedder/azure_openai.py +210 -0
  122. agno/knowledge/embedder/base.py +23 -0
  123. agno/knowledge/embedder/cohere.py +323 -0
  124. agno/knowledge/embedder/fastembed.py +62 -0
  125. agno/knowledge/embedder/fireworks.py +13 -0
  126. agno/knowledge/embedder/google.py +258 -0
  127. agno/knowledge/embedder/huggingface.py +94 -0
  128. agno/knowledge/embedder/jina.py +182 -0
  129. agno/knowledge/embedder/langdb.py +22 -0
  130. agno/knowledge/embedder/mistral.py +206 -0
  131. agno/knowledge/embedder/nebius.py +13 -0
  132. agno/knowledge/embedder/ollama.py +154 -0
  133. agno/knowledge/embedder/openai.py +195 -0
  134. agno/knowledge/embedder/sentence_transformer.py +63 -0
  135. agno/knowledge/embedder/together.py +13 -0
  136. agno/knowledge/embedder/vllm.py +262 -0
  137. agno/knowledge/embedder/voyageai.py +165 -0
  138. agno/knowledge/knowledge.py +1988 -0
  139. agno/knowledge/reader/__init__.py +7 -0
  140. agno/knowledge/reader/arxiv_reader.py +81 -0
  141. agno/knowledge/reader/base.py +95 -0
  142. agno/knowledge/reader/csv_reader.py +166 -0
  143. agno/knowledge/reader/docx_reader.py +82 -0
  144. agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
  145. agno/knowledge/reader/firecrawl_reader.py +201 -0
  146. agno/knowledge/reader/json_reader.py +87 -0
  147. agno/knowledge/reader/markdown_reader.py +137 -0
  148. agno/knowledge/reader/pdf_reader.py +431 -0
  149. agno/knowledge/reader/pptx_reader.py +101 -0
  150. agno/knowledge/reader/reader_factory.py +313 -0
  151. agno/knowledge/reader/s3_reader.py +89 -0
  152. agno/knowledge/reader/tavily_reader.py +194 -0
  153. agno/knowledge/reader/text_reader.py +115 -0
  154. agno/knowledge/reader/web_search_reader.py +372 -0
  155. agno/knowledge/reader/website_reader.py +455 -0
  156. agno/knowledge/reader/wikipedia_reader.py +59 -0
  157. agno/knowledge/reader/youtube_reader.py +78 -0
  158. agno/knowledge/remote_content/__init__.py +0 -0
  159. agno/knowledge/remote_content/remote_content.py +88 -0
  160. agno/knowledge/reranker/__init__.py +3 -0
  161. agno/knowledge/reranker/base.py +14 -0
  162. agno/knowledge/reranker/cohere.py +64 -0
  163. agno/knowledge/reranker/infinity.py +195 -0
  164. agno/knowledge/reranker/sentence_transformer.py +54 -0
  165. agno/knowledge/types.py +39 -0
  166. agno/knowledge/utils.py +189 -0
  167. agno/media.py +462 -0
  168. agno/memory/__init__.py +3 -0
  169. agno/memory/manager.py +1327 -0
  170. agno/models/__init__.py +0 -0
  171. agno/models/aimlapi/__init__.py +5 -0
  172. agno/models/aimlapi/aimlapi.py +45 -0
  173. agno/models/anthropic/__init__.py +5 -0
  174. agno/models/anthropic/claude.py +757 -0
  175. agno/models/aws/__init__.py +15 -0
  176. agno/models/aws/bedrock.py +701 -0
  177. agno/models/aws/claude.py +378 -0
  178. agno/models/azure/__init__.py +18 -0
  179. agno/models/azure/ai_foundry.py +485 -0
  180. agno/models/azure/openai_chat.py +131 -0
  181. agno/models/base.py +2175 -0
  182. agno/models/cerebras/__init__.py +12 -0
  183. agno/models/cerebras/cerebras.py +501 -0
  184. agno/models/cerebras/cerebras_openai.py +112 -0
  185. agno/models/cohere/__init__.py +5 -0
  186. agno/models/cohere/chat.py +389 -0
  187. agno/models/cometapi/__init__.py +5 -0
  188. agno/models/cometapi/cometapi.py +57 -0
  189. agno/models/dashscope/__init__.py +5 -0
  190. agno/models/dashscope/dashscope.py +91 -0
  191. agno/models/deepinfra/__init__.py +5 -0
  192. agno/models/deepinfra/deepinfra.py +28 -0
  193. agno/models/deepseek/__init__.py +5 -0
  194. agno/models/deepseek/deepseek.py +61 -0
  195. agno/models/defaults.py +1 -0
  196. agno/models/fireworks/__init__.py +5 -0
  197. agno/models/fireworks/fireworks.py +26 -0
  198. agno/models/google/__init__.py +5 -0
  199. agno/models/google/gemini.py +1085 -0
  200. agno/models/groq/__init__.py +5 -0
  201. agno/models/groq/groq.py +556 -0
  202. agno/models/huggingface/__init__.py +5 -0
  203. agno/models/huggingface/huggingface.py +491 -0
  204. agno/models/ibm/__init__.py +5 -0
  205. agno/models/ibm/watsonx.py +422 -0
  206. agno/models/internlm/__init__.py +3 -0
  207. agno/models/internlm/internlm.py +26 -0
  208. agno/models/langdb/__init__.py +1 -0
  209. agno/models/langdb/langdb.py +48 -0
  210. agno/models/litellm/__init__.py +14 -0
  211. agno/models/litellm/chat.py +468 -0
  212. agno/models/litellm/litellm_openai.py +25 -0
  213. agno/models/llama_cpp/__init__.py +5 -0
  214. agno/models/llama_cpp/llama_cpp.py +22 -0
  215. agno/models/lmstudio/__init__.py +5 -0
  216. agno/models/lmstudio/lmstudio.py +25 -0
  217. agno/models/message.py +434 -0
  218. agno/models/meta/__init__.py +12 -0
  219. agno/models/meta/llama.py +475 -0
  220. agno/models/meta/llama_openai.py +78 -0
  221. agno/models/metrics.py +120 -0
  222. agno/models/mistral/__init__.py +5 -0
  223. agno/models/mistral/mistral.py +432 -0
  224. agno/models/nebius/__init__.py +3 -0
  225. agno/models/nebius/nebius.py +54 -0
  226. agno/models/nexus/__init__.py +3 -0
  227. agno/models/nexus/nexus.py +22 -0
  228. agno/models/nvidia/__init__.py +5 -0
  229. agno/models/nvidia/nvidia.py +28 -0
  230. agno/models/ollama/__init__.py +5 -0
  231. agno/models/ollama/chat.py +441 -0
  232. agno/models/openai/__init__.py +9 -0
  233. agno/models/openai/chat.py +883 -0
  234. agno/models/openai/like.py +27 -0
  235. agno/models/openai/responses.py +1050 -0
  236. agno/models/openrouter/__init__.py +5 -0
  237. agno/models/openrouter/openrouter.py +66 -0
  238. agno/models/perplexity/__init__.py +5 -0
  239. agno/models/perplexity/perplexity.py +187 -0
  240. agno/models/portkey/__init__.py +3 -0
  241. agno/models/portkey/portkey.py +81 -0
  242. agno/models/requesty/__init__.py +5 -0
  243. agno/models/requesty/requesty.py +52 -0
  244. agno/models/response.py +199 -0
  245. agno/models/sambanova/__init__.py +5 -0
  246. agno/models/sambanova/sambanova.py +28 -0
  247. agno/models/siliconflow/__init__.py +5 -0
  248. agno/models/siliconflow/siliconflow.py +25 -0
  249. agno/models/together/__init__.py +5 -0
  250. agno/models/together/together.py +25 -0
  251. agno/models/utils.py +266 -0
  252. agno/models/vercel/__init__.py +3 -0
  253. agno/models/vercel/v0.py +26 -0
  254. agno/models/vertexai/__init__.py +0 -0
  255. agno/models/vertexai/claude.py +70 -0
  256. agno/models/vllm/__init__.py +3 -0
  257. agno/models/vllm/vllm.py +78 -0
  258. agno/models/xai/__init__.py +3 -0
  259. agno/models/xai/xai.py +113 -0
  260. agno/os/__init__.py +3 -0
  261. agno/os/app.py +876 -0
  262. agno/os/auth.py +57 -0
  263. agno/os/config.py +104 -0
  264. agno/os/interfaces/__init__.py +1 -0
  265. agno/os/interfaces/a2a/__init__.py +3 -0
  266. agno/os/interfaces/a2a/a2a.py +42 -0
  267. agno/os/interfaces/a2a/router.py +250 -0
  268. agno/os/interfaces/a2a/utils.py +924 -0
  269. agno/os/interfaces/agui/__init__.py +3 -0
  270. agno/os/interfaces/agui/agui.py +47 -0
  271. agno/os/interfaces/agui/router.py +144 -0
  272. agno/os/interfaces/agui/utils.py +534 -0
  273. agno/os/interfaces/base.py +25 -0
  274. agno/os/interfaces/slack/__init__.py +3 -0
  275. agno/os/interfaces/slack/router.py +148 -0
  276. agno/os/interfaces/slack/security.py +30 -0
  277. agno/os/interfaces/slack/slack.py +47 -0
  278. agno/os/interfaces/whatsapp/__init__.py +3 -0
  279. agno/os/interfaces/whatsapp/router.py +211 -0
  280. agno/os/interfaces/whatsapp/security.py +53 -0
  281. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  282. agno/os/mcp.py +292 -0
  283. agno/os/middleware/__init__.py +7 -0
  284. agno/os/middleware/jwt.py +233 -0
  285. agno/os/router.py +1763 -0
  286. agno/os/routers/__init__.py +3 -0
  287. agno/os/routers/evals/__init__.py +3 -0
  288. agno/os/routers/evals/evals.py +430 -0
  289. agno/os/routers/evals/schemas.py +142 -0
  290. agno/os/routers/evals/utils.py +162 -0
  291. agno/os/routers/health.py +31 -0
  292. agno/os/routers/home.py +52 -0
  293. agno/os/routers/knowledge/__init__.py +3 -0
  294. agno/os/routers/knowledge/knowledge.py +997 -0
  295. agno/os/routers/knowledge/schemas.py +178 -0
  296. agno/os/routers/memory/__init__.py +3 -0
  297. agno/os/routers/memory/memory.py +515 -0
  298. agno/os/routers/memory/schemas.py +62 -0
  299. agno/os/routers/metrics/__init__.py +3 -0
  300. agno/os/routers/metrics/metrics.py +190 -0
  301. agno/os/routers/metrics/schemas.py +47 -0
  302. agno/os/routers/session/__init__.py +3 -0
  303. agno/os/routers/session/session.py +997 -0
  304. agno/os/schema.py +1055 -0
  305. agno/os/settings.py +43 -0
  306. agno/os/utils.py +630 -0
  307. agno/py.typed +0 -0
  308. agno/reasoning/__init__.py +0 -0
  309. agno/reasoning/anthropic.py +80 -0
  310. agno/reasoning/azure_ai_foundry.py +67 -0
  311. agno/reasoning/deepseek.py +63 -0
  312. agno/reasoning/default.py +97 -0
  313. agno/reasoning/gemini.py +73 -0
  314. agno/reasoning/groq.py +71 -0
  315. agno/reasoning/helpers.py +63 -0
  316. agno/reasoning/ollama.py +67 -0
  317. agno/reasoning/openai.py +86 -0
  318. agno/reasoning/step.py +31 -0
  319. agno/reasoning/vertexai.py +76 -0
  320. agno/run/__init__.py +6 -0
  321. agno/run/agent.py +787 -0
  322. agno/run/base.py +229 -0
  323. agno/run/cancel.py +81 -0
  324. agno/run/messages.py +32 -0
  325. agno/run/team.py +753 -0
  326. agno/run/workflow.py +708 -0
  327. agno/session/__init__.py +10 -0
  328. agno/session/agent.py +295 -0
  329. agno/session/summary.py +265 -0
  330. agno/session/team.py +392 -0
  331. agno/session/workflow.py +205 -0
  332. agno/team/__init__.py +37 -0
  333. agno/team/team.py +8793 -0
  334. agno/tools/__init__.py +10 -0
  335. agno/tools/agentql.py +120 -0
  336. agno/tools/airflow.py +69 -0
  337. agno/tools/api.py +122 -0
  338. agno/tools/apify.py +314 -0
  339. agno/tools/arxiv.py +127 -0
  340. agno/tools/aws_lambda.py +53 -0
  341. agno/tools/aws_ses.py +66 -0
  342. agno/tools/baidusearch.py +89 -0
  343. agno/tools/bitbucket.py +292 -0
  344. agno/tools/brandfetch.py +213 -0
  345. agno/tools/bravesearch.py +106 -0
  346. agno/tools/brightdata.py +367 -0
  347. agno/tools/browserbase.py +209 -0
  348. agno/tools/calcom.py +255 -0
  349. agno/tools/calculator.py +151 -0
  350. agno/tools/cartesia.py +187 -0
  351. agno/tools/clickup.py +244 -0
  352. agno/tools/confluence.py +240 -0
  353. agno/tools/crawl4ai.py +158 -0
  354. agno/tools/csv_toolkit.py +185 -0
  355. agno/tools/dalle.py +110 -0
  356. agno/tools/daytona.py +475 -0
  357. agno/tools/decorator.py +262 -0
  358. agno/tools/desi_vocal.py +108 -0
  359. agno/tools/discord.py +161 -0
  360. agno/tools/docker.py +716 -0
  361. agno/tools/duckdb.py +379 -0
  362. agno/tools/duckduckgo.py +91 -0
  363. agno/tools/e2b.py +703 -0
  364. agno/tools/eleven_labs.py +196 -0
  365. agno/tools/email.py +67 -0
  366. agno/tools/evm.py +129 -0
  367. agno/tools/exa.py +396 -0
  368. agno/tools/fal.py +127 -0
  369. agno/tools/file.py +240 -0
  370. agno/tools/file_generation.py +350 -0
  371. agno/tools/financial_datasets.py +288 -0
  372. agno/tools/firecrawl.py +143 -0
  373. agno/tools/function.py +1187 -0
  374. agno/tools/giphy.py +93 -0
  375. agno/tools/github.py +1760 -0
  376. agno/tools/gmail.py +922 -0
  377. agno/tools/google_bigquery.py +117 -0
  378. agno/tools/google_drive.py +270 -0
  379. agno/tools/google_maps.py +253 -0
  380. agno/tools/googlecalendar.py +674 -0
  381. agno/tools/googlesearch.py +98 -0
  382. agno/tools/googlesheets.py +377 -0
  383. agno/tools/hackernews.py +77 -0
  384. agno/tools/jina.py +101 -0
  385. agno/tools/jira.py +170 -0
  386. agno/tools/knowledge.py +218 -0
  387. agno/tools/linear.py +426 -0
  388. agno/tools/linkup.py +58 -0
  389. agno/tools/local_file_system.py +90 -0
  390. agno/tools/lumalab.py +183 -0
  391. agno/tools/mcp/__init__.py +10 -0
  392. agno/tools/mcp/mcp.py +331 -0
  393. agno/tools/mcp/multi_mcp.py +347 -0
  394. agno/tools/mcp/params.py +24 -0
  395. agno/tools/mcp_toolbox.py +284 -0
  396. agno/tools/mem0.py +193 -0
  397. agno/tools/memori.py +339 -0
  398. agno/tools/memory.py +419 -0
  399. agno/tools/mlx_transcribe.py +139 -0
  400. agno/tools/models/__init__.py +0 -0
  401. agno/tools/models/azure_openai.py +190 -0
  402. agno/tools/models/gemini.py +203 -0
  403. agno/tools/models/groq.py +158 -0
  404. agno/tools/models/morph.py +186 -0
  405. agno/tools/models/nebius.py +124 -0
  406. agno/tools/models_labs.py +195 -0
  407. agno/tools/moviepy_video.py +349 -0
  408. agno/tools/neo4j.py +134 -0
  409. agno/tools/newspaper.py +46 -0
  410. agno/tools/newspaper4k.py +93 -0
  411. agno/tools/notion.py +204 -0
  412. agno/tools/openai.py +202 -0
  413. agno/tools/openbb.py +160 -0
  414. agno/tools/opencv.py +321 -0
  415. agno/tools/openweather.py +233 -0
  416. agno/tools/oxylabs.py +385 -0
  417. agno/tools/pandas.py +102 -0
  418. agno/tools/parallel.py +314 -0
  419. agno/tools/postgres.py +257 -0
  420. agno/tools/pubmed.py +188 -0
  421. agno/tools/python.py +205 -0
  422. agno/tools/reasoning.py +283 -0
  423. agno/tools/reddit.py +467 -0
  424. agno/tools/replicate.py +117 -0
  425. agno/tools/resend.py +62 -0
  426. agno/tools/scrapegraph.py +222 -0
  427. agno/tools/searxng.py +152 -0
  428. agno/tools/serpapi.py +116 -0
  429. agno/tools/serper.py +255 -0
  430. agno/tools/shell.py +53 -0
  431. agno/tools/slack.py +136 -0
  432. agno/tools/sleep.py +20 -0
  433. agno/tools/spider.py +116 -0
  434. agno/tools/sql.py +154 -0
  435. agno/tools/streamlit/__init__.py +0 -0
  436. agno/tools/streamlit/components.py +113 -0
  437. agno/tools/tavily.py +254 -0
  438. agno/tools/telegram.py +48 -0
  439. agno/tools/todoist.py +218 -0
  440. agno/tools/tool_registry.py +1 -0
  441. agno/tools/toolkit.py +146 -0
  442. agno/tools/trafilatura.py +388 -0
  443. agno/tools/trello.py +274 -0
  444. agno/tools/twilio.py +186 -0
  445. agno/tools/user_control_flow.py +78 -0
  446. agno/tools/valyu.py +228 -0
  447. agno/tools/visualization.py +467 -0
  448. agno/tools/webbrowser.py +28 -0
  449. agno/tools/webex.py +76 -0
  450. agno/tools/website.py +54 -0
  451. agno/tools/webtools.py +45 -0
  452. agno/tools/whatsapp.py +286 -0
  453. agno/tools/wikipedia.py +63 -0
  454. agno/tools/workflow.py +278 -0
  455. agno/tools/x.py +335 -0
  456. agno/tools/yfinance.py +257 -0
  457. agno/tools/youtube.py +184 -0
  458. agno/tools/zendesk.py +82 -0
  459. agno/tools/zep.py +454 -0
  460. agno/tools/zoom.py +382 -0
  461. agno/utils/__init__.py +0 -0
  462. agno/utils/agent.py +820 -0
  463. agno/utils/audio.py +49 -0
  464. agno/utils/certs.py +27 -0
  465. agno/utils/code_execution.py +11 -0
  466. agno/utils/common.py +132 -0
  467. agno/utils/dttm.py +13 -0
  468. agno/utils/enum.py +22 -0
  469. agno/utils/env.py +11 -0
  470. agno/utils/events.py +696 -0
  471. agno/utils/format_str.py +16 -0
  472. agno/utils/functions.py +166 -0
  473. agno/utils/gemini.py +426 -0
  474. agno/utils/hooks.py +57 -0
  475. agno/utils/http.py +74 -0
  476. agno/utils/json_schema.py +234 -0
  477. agno/utils/knowledge.py +36 -0
  478. agno/utils/location.py +19 -0
  479. agno/utils/log.py +255 -0
  480. agno/utils/mcp.py +214 -0
  481. agno/utils/media.py +352 -0
  482. agno/utils/merge_dict.py +41 -0
  483. agno/utils/message.py +118 -0
  484. agno/utils/models/__init__.py +0 -0
  485. agno/utils/models/ai_foundry.py +43 -0
  486. agno/utils/models/claude.py +358 -0
  487. agno/utils/models/cohere.py +87 -0
  488. agno/utils/models/llama.py +78 -0
  489. agno/utils/models/mistral.py +98 -0
  490. agno/utils/models/openai_responses.py +140 -0
  491. agno/utils/models/schema_utils.py +153 -0
  492. agno/utils/models/watsonx.py +41 -0
  493. agno/utils/openai.py +257 -0
  494. agno/utils/pickle.py +32 -0
  495. agno/utils/pprint.py +178 -0
  496. agno/utils/print_response/__init__.py +0 -0
  497. agno/utils/print_response/agent.py +842 -0
  498. agno/utils/print_response/team.py +1724 -0
  499. agno/utils/print_response/workflow.py +1668 -0
  500. agno/utils/prompts.py +111 -0
  501. agno/utils/reasoning.py +108 -0
  502. agno/utils/response.py +163 -0
  503. agno/utils/response_iterator.py +17 -0
  504. agno/utils/safe_formatter.py +24 -0
  505. agno/utils/serialize.py +32 -0
  506. agno/utils/shell.py +22 -0
  507. agno/utils/streamlit.py +487 -0
  508. agno/utils/string.py +231 -0
  509. agno/utils/team.py +139 -0
  510. agno/utils/timer.py +41 -0
  511. agno/utils/tools.py +102 -0
  512. agno/utils/web.py +23 -0
  513. agno/utils/whatsapp.py +305 -0
  514. agno/utils/yaml_io.py +25 -0
  515. agno/vectordb/__init__.py +3 -0
  516. agno/vectordb/base.py +127 -0
  517. agno/vectordb/cassandra/__init__.py +5 -0
  518. agno/vectordb/cassandra/cassandra.py +501 -0
  519. agno/vectordb/cassandra/extra_param_mixin.py +11 -0
  520. agno/vectordb/cassandra/index.py +13 -0
  521. agno/vectordb/chroma/__init__.py +5 -0
  522. agno/vectordb/chroma/chromadb.py +929 -0
  523. agno/vectordb/clickhouse/__init__.py +9 -0
  524. agno/vectordb/clickhouse/clickhousedb.py +835 -0
  525. agno/vectordb/clickhouse/index.py +9 -0
  526. agno/vectordb/couchbase/__init__.py +3 -0
  527. agno/vectordb/couchbase/couchbase.py +1442 -0
  528. agno/vectordb/distance.py +7 -0
  529. agno/vectordb/lancedb/__init__.py +6 -0
  530. agno/vectordb/lancedb/lance_db.py +995 -0
  531. agno/vectordb/langchaindb/__init__.py +5 -0
  532. agno/vectordb/langchaindb/langchaindb.py +163 -0
  533. agno/vectordb/lightrag/__init__.py +5 -0
  534. agno/vectordb/lightrag/lightrag.py +388 -0
  535. agno/vectordb/llamaindex/__init__.py +3 -0
  536. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  537. agno/vectordb/milvus/__init__.py +4 -0
  538. agno/vectordb/milvus/milvus.py +1182 -0
  539. agno/vectordb/mongodb/__init__.py +9 -0
  540. agno/vectordb/mongodb/mongodb.py +1417 -0
  541. agno/vectordb/pgvector/__init__.py +12 -0
  542. agno/vectordb/pgvector/index.py +23 -0
  543. agno/vectordb/pgvector/pgvector.py +1462 -0
  544. agno/vectordb/pineconedb/__init__.py +5 -0
  545. agno/vectordb/pineconedb/pineconedb.py +747 -0
  546. agno/vectordb/qdrant/__init__.py +5 -0
  547. agno/vectordb/qdrant/qdrant.py +1134 -0
  548. agno/vectordb/redis/__init__.py +9 -0
  549. agno/vectordb/redis/redisdb.py +694 -0
  550. agno/vectordb/search.py +7 -0
  551. agno/vectordb/singlestore/__init__.py +10 -0
  552. agno/vectordb/singlestore/index.py +41 -0
  553. agno/vectordb/singlestore/singlestore.py +763 -0
  554. agno/vectordb/surrealdb/__init__.py +3 -0
  555. agno/vectordb/surrealdb/surrealdb.py +699 -0
  556. agno/vectordb/upstashdb/__init__.py +5 -0
  557. agno/vectordb/upstashdb/upstashdb.py +718 -0
  558. agno/vectordb/weaviate/__init__.py +8 -0
  559. agno/vectordb/weaviate/index.py +15 -0
  560. agno/vectordb/weaviate/weaviate.py +1005 -0
  561. agno/workflow/__init__.py +23 -0
  562. agno/workflow/agent.py +299 -0
  563. agno/workflow/condition.py +738 -0
  564. agno/workflow/loop.py +735 -0
  565. agno/workflow/parallel.py +824 -0
  566. agno/workflow/router.py +702 -0
  567. agno/workflow/step.py +1432 -0
  568. agno/workflow/steps.py +592 -0
  569. agno/workflow/types.py +520 -0
  570. agno/workflow/workflow.py +4321 -0
  571. agno-2.2.13.dist-info/METADATA +614 -0
  572. agno-2.2.13.dist-info/RECORD +575 -0
  573. agno-2.2.13.dist-info/WHEEL +5 -0
  574. agno-2.2.13.dist-info/licenses/LICENSE +201 -0
  575. agno-2.2.13.dist-info/top_level.txt +1 -0
agno/os/auth.py ADDED
@@ -0,0 +1,57 @@
1
+ from fastapi import Depends, HTTPException
2
+ from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
3
+
4
+ from agno.os.settings import AgnoAPISettings
5
+
6
+ # Create a global HTTPBearer instance
7
+ security = HTTPBearer(auto_error=False)
8
+
9
+
10
+ def get_authentication_dependency(settings: AgnoAPISettings):
11
+ """
12
+ Create an authentication dependency function for FastAPI routes.
13
+
14
+ Args:
15
+ settings: The API settings containing the security key
16
+
17
+ Returns:
18
+ A dependency function that can be used with FastAPI's Depends()
19
+ """
20
+
21
+ def auth_dependency(credentials: HTTPAuthorizationCredentials = Depends(security)) -> bool:
22
+ # If no security key is set, skip authentication entirely
23
+ if not settings or not settings.os_security_key:
24
+ return True
25
+
26
+ # If security is enabled but no authorization header provided, fail
27
+ if not credentials:
28
+ raise HTTPException(status_code=401, detail="Authorization header required")
29
+
30
+ token = credentials.credentials
31
+
32
+ # Verify the token
33
+ if token != settings.os_security_key:
34
+ raise HTTPException(status_code=401, detail="Invalid authentication token")
35
+
36
+ return True
37
+
38
+ return auth_dependency
39
+
40
+
41
+ def validate_websocket_token(token: str, settings: AgnoAPISettings) -> bool:
42
+ """
43
+ Validate a bearer token for WebSocket authentication.
44
+
45
+ Args:
46
+ token: The bearer token to validate
47
+ settings: The API settings containing the security key
48
+
49
+ Returns:
50
+ True if the token is valid or authentication is disabled, False otherwise
51
+ """
52
+ # If no security key is set, skip authentication entirely
53
+ if not settings or not settings.os_security_key:
54
+ return True
55
+
56
+ # Verify the token matches the configured security key
57
+ return token == settings.os_security_key
agno/os/config.py ADDED
@@ -0,0 +1,104 @@
1
+ """Schemas related to the AgentOS configuration"""
2
+
3
+ from typing import Generic, List, Optional, TypeVar
4
+
5
+ from pydantic import BaseModel, field_validator
6
+
7
+
8
+ class EvalsDomainConfig(BaseModel):
9
+ """Configuration for the Evals domain of the AgentOS"""
10
+
11
+ display_name: Optional[str] = None
12
+ available_models: Optional[List[str]] = None
13
+
14
+
15
+ class SessionDomainConfig(BaseModel):
16
+ """Configuration for the Session domain of the AgentOS"""
17
+
18
+ display_name: Optional[str] = None
19
+
20
+
21
+ class KnowledgeDomainConfig(BaseModel):
22
+ """Configuration for the Knowledge domain of the AgentOS"""
23
+
24
+ display_name: Optional[str] = None
25
+
26
+
27
+ class MetricsDomainConfig(BaseModel):
28
+ """Configuration for the Metrics domain of the AgentOS"""
29
+
30
+ display_name: Optional[str] = None
31
+
32
+
33
+ class MemoryDomainConfig(BaseModel):
34
+ """Configuration for the Memory domain of the AgentOS"""
35
+
36
+ display_name: Optional[str] = None
37
+
38
+
39
+ DomainConfigType = TypeVar("DomainConfigType")
40
+
41
+
42
+ class DatabaseConfig(BaseModel, Generic[DomainConfigType]):
43
+ """Configuration for a domain when used with the contextual database"""
44
+
45
+ db_id: str
46
+ domain_config: Optional[DomainConfigType] = None
47
+ tables: Optional[List[str]] = None
48
+
49
+
50
+ class EvalsConfig(EvalsDomainConfig):
51
+ """Configuration for the Evals domain of the AgentOS"""
52
+
53
+ dbs: Optional[List[DatabaseConfig[EvalsDomainConfig]]] = None
54
+
55
+
56
+ class SessionConfig(SessionDomainConfig):
57
+ """Configuration for the Session domain of the AgentOS"""
58
+
59
+ dbs: Optional[List[DatabaseConfig[SessionDomainConfig]]] = None
60
+
61
+
62
+ class MemoryConfig(MemoryDomainConfig):
63
+ """Configuration for the Memory domain of the AgentOS"""
64
+
65
+ dbs: Optional[List[DatabaseConfig[MemoryDomainConfig]]] = None
66
+
67
+
68
+ class KnowledgeConfig(KnowledgeDomainConfig):
69
+ """Configuration for the Knowledge domain of the AgentOS"""
70
+
71
+ dbs: Optional[List[DatabaseConfig[KnowledgeDomainConfig]]] = None
72
+
73
+
74
+ class MetricsConfig(MetricsDomainConfig):
75
+ """Configuration for the Metrics domain of the AgentOS"""
76
+
77
+ dbs: Optional[List[DatabaseConfig[MetricsDomainConfig]]] = None
78
+
79
+
80
+ class ChatConfig(BaseModel):
81
+ """Configuration for the Chat page of the AgentOS"""
82
+
83
+ quick_prompts: dict[str, list[str]]
84
+
85
+ # Limit the number of quick prompts to 3 (per agent/team/workflow)
86
+ @field_validator("quick_prompts")
87
+ @classmethod
88
+ def limit_lists(cls, v):
89
+ for key, lst in v.items():
90
+ if len(lst) > 3:
91
+ raise ValueError(f"Too many quick prompts for '{key}', maximum allowed is 3")
92
+ return v
93
+
94
+
95
+ class AgentOSConfig(BaseModel):
96
+ """General configuration for an AgentOS instance"""
97
+
98
+ available_models: Optional[List[str]] = None
99
+ chat: Optional[ChatConfig] = None
100
+ evals: Optional[EvalsConfig] = None
101
+ knowledge: Optional[KnowledgeConfig] = None
102
+ memory: Optional[MemoryConfig] = None
103
+ session: Optional[SessionConfig] = None
104
+ metrics: Optional[MetricsConfig] = None
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,3 @@
1
+ from agno.os.interfaces.a2a.a2a import A2A
2
+
3
+ __all__ = ["A2A"]
@@ -0,0 +1,42 @@
1
+ """Main class for the A2A app, used to expose an Agno Agent, Team, or Workflow in an A2A compatible format."""
2
+
3
+ from typing import Optional
4
+
5
+ from fastapi.routing import APIRouter
6
+ from typing_extensions import List
7
+
8
+ from agno.agent import Agent
9
+ from agno.os.interfaces.a2a.router import attach_routes
10
+ from agno.os.interfaces.base import BaseInterface
11
+ from agno.team import Team
12
+ from agno.workflow import Workflow
13
+
14
+
15
+ class A2A(BaseInterface):
16
+ type = "a2a"
17
+
18
+ router: APIRouter
19
+
20
+ def __init__(
21
+ self,
22
+ agents: Optional[List[Agent]] = None,
23
+ teams: Optional[List[Team]] = None,
24
+ workflows: Optional[List[Workflow]] = None,
25
+ prefix: str = "/a2a",
26
+ tags: Optional[List[str]] = None,
27
+ ):
28
+ self.agents = agents
29
+ self.teams = teams
30
+ self.workflows = workflows
31
+ self.prefix = prefix
32
+ self.tags = tags or ["A2A"]
33
+
34
+ if not (self.agents or self.teams or self.workflows):
35
+ raise ValueError("Agents, Teams, or Workflows are required to setup the A2A interface.")
36
+
37
+ def get_router(self, **kwargs) -> APIRouter:
38
+ self.router = APIRouter(prefix=self.prefix, tags=self.tags) # type: ignore
39
+
40
+ self.router = attach_routes(router=self.router, agents=self.agents, teams=self.teams, workflows=self.workflows)
41
+
42
+ return self.router
@@ -0,0 +1,250 @@
1
+ """Async router handling exposing an Agno Agent or Team in an A2A compatible format."""
2
+
3
+ from typing import Optional, Union
4
+ from uuid import uuid4
5
+
6
+ from fastapi import HTTPException, Request
7
+ from fastapi.responses import StreamingResponse
8
+ from fastapi.routing import APIRouter
9
+ from typing_extensions import List
10
+
11
+ try:
12
+ from a2a.types import SendMessageSuccessResponse, Task, TaskState, TaskStatus
13
+ except ImportError as e:
14
+ raise ImportError("`a2a` not installed. Please install it with `pip install -U a2a-sdk`") from e
15
+
16
+ from agno.agent import Agent
17
+ from agno.os.interfaces.a2a.utils import (
18
+ map_a2a_request_to_run_input,
19
+ map_run_output_to_a2a_task,
20
+ stream_a2a_response_with_error_handling,
21
+ )
22
+ from agno.os.router import _get_request_kwargs
23
+ from agno.os.utils import get_agent_by_id, get_team_by_id, get_workflow_by_id
24
+ from agno.team import Team
25
+ from agno.workflow import Workflow
26
+
27
+
28
+ def attach_routes(
29
+ router: APIRouter,
30
+ agents: Optional[List[Agent]] = None,
31
+ teams: Optional[List[Team]] = None,
32
+ workflows: Optional[List[Workflow]] = None,
33
+ ) -> APIRouter:
34
+ if agents is None and teams is None and workflows is None:
35
+ raise ValueError("Agents, Teams, or Workflows are required to setup the A2A interface.")
36
+
37
+ @router.post(
38
+ "/message/send",
39
+ operation_id="send_message",
40
+ name="send_message",
41
+ description="Send a message to an Agno Agent, Team, or Workflow. "
42
+ "The Agent, Team or Workflow is identified via the 'agentId' field in params.message or X-Agent-ID header. "
43
+ "Optional: Pass user ID via X-User-ID header (recommended) or 'userId' in params.message.metadata.",
44
+ response_model_exclude_none=True,
45
+ responses={
46
+ 200: {
47
+ "description": "Message sent successfully",
48
+ "content": {
49
+ "application/json": {
50
+ "example": {
51
+ "jsonrpc": "2.0",
52
+ "id": "request-123",
53
+ "result": {
54
+ "task": {
55
+ "id": "task-456",
56
+ "context_id": "context-789",
57
+ "status": "completed",
58
+ "history": [
59
+ {
60
+ "message_id": "msg-1",
61
+ "role": "agent",
62
+ "parts": [{"kind": "text", "text": "Response from agent"}],
63
+ }
64
+ ],
65
+ }
66
+ },
67
+ }
68
+ }
69
+ },
70
+ },
71
+ 400: {"description": "Invalid request or unsupported method"},
72
+ 404: {"description": "Agent, Team, or Workflow not found"},
73
+ },
74
+ response_model=SendMessageSuccessResponse,
75
+ )
76
+ async def a2a_send_message(request: Request):
77
+ request_body = await request.json()
78
+ kwargs = await _get_request_kwargs(request, a2a_send_message)
79
+
80
+ # 1. Get the Agent, Team, or Workflow to run
81
+ agent_id = request_body.get("params", {}).get("message", {}).get("agentId") or request.headers.get("X-Agent-ID")
82
+ if not agent_id:
83
+ raise HTTPException(
84
+ status_code=400,
85
+ detail="Entity ID required. Provide it via 'agentId' in params.message or 'X-Agent-ID' header.",
86
+ )
87
+ entity: Optional[Union[Agent, Team, Workflow]] = None
88
+ if agents:
89
+ entity = get_agent_by_id(agent_id, agents)
90
+ if not entity and teams:
91
+ entity = get_team_by_id(agent_id, teams)
92
+ if not entity and workflows:
93
+ entity = get_workflow_by_id(agent_id, workflows)
94
+ if entity is None:
95
+ raise HTTPException(status_code=404, detail=f"Agent, Team, or Workflow with ID '{agent_id}' not found")
96
+
97
+ # 2. Map the request to our run_input and run variables
98
+ run_input = await map_a2a_request_to_run_input(request_body, stream=False)
99
+ context_id = request_body.get("params", {}).get("message", {}).get("contextId")
100
+ user_id = request.headers.get("X-User-ID")
101
+ if not user_id:
102
+ user_id = request_body.get("params", {}).get("message", {}).get("metadata", {}).get("userId")
103
+
104
+ # 3. Run the agent, team, or workflow
105
+ try:
106
+ if isinstance(entity, Workflow):
107
+ response = await entity.arun(
108
+ input=run_input.input_content,
109
+ images=list(run_input.images) if run_input.images else None,
110
+ videos=list(run_input.videos) if run_input.videos else None,
111
+ audio=list(run_input.audios) if run_input.audios else None,
112
+ files=list(run_input.files) if run_input.files else None,
113
+ session_id=context_id,
114
+ user_id=user_id,
115
+ **kwargs,
116
+ )
117
+ else:
118
+ response = await entity.arun(
119
+ input=run_input.input_content,
120
+ images=run_input.images,
121
+ videos=run_input.videos,
122
+ audio=run_input.audios,
123
+ files=run_input.files,
124
+ session_id=context_id,
125
+ user_id=user_id,
126
+ **kwargs,
127
+ )
128
+
129
+ # 4. Send the response
130
+ a2a_task = map_run_output_to_a2a_task(response)
131
+ return SendMessageSuccessResponse(
132
+ id=request_body.get("id", "unknown"),
133
+ result=a2a_task,
134
+ )
135
+
136
+ # Handle all critical errors
137
+ except Exception as e:
138
+ from a2a.types import Message as A2AMessage
139
+ from a2a.types import Part, Role, TextPart
140
+
141
+ error_message = A2AMessage(
142
+ message_id=str(uuid4()),
143
+ role=Role.agent,
144
+ parts=[Part(root=TextPart(text=f"Error: {str(e)}"))],
145
+ context_id=context_id or str(uuid4()),
146
+ )
147
+ failed_task = Task(
148
+ id=str(uuid4()),
149
+ context_id=context_id or str(uuid4()),
150
+ status=TaskStatus(state=TaskState.failed),
151
+ history=[error_message],
152
+ )
153
+
154
+ return SendMessageSuccessResponse(
155
+ id=request_body.get("id", "unknown"),
156
+ result=failed_task,
157
+ )
158
+
159
+ @router.post(
160
+ "/message/stream",
161
+ operation_id="stream_message",
162
+ name="stream_message",
163
+ description="Stream a message to an Agno Agent, Team, or Workflow."
164
+ "The Agent, Team or Workflow is identified via the 'agentId' field in params.message or X-Agent-ID header. "
165
+ "Optional: Pass user ID via X-User-ID header (recommended) or 'userId' in params.message.metadata. "
166
+ "Returns real-time updates as newline-delimited JSON (NDJSON).",
167
+ response_model_exclude_none=True,
168
+ responses={
169
+ 200: {
170
+ "description": "Streaming response with task updates",
171
+ "content": {
172
+ "application/x-ndjson": {
173
+ "example": '{"jsonrpc":"2.0","id":"request-123","result":{"taskId":"task-456","status":"working"}}\n'
174
+ '{"jsonrpc":"2.0","id":"request-123","result":{"messageId":"msg-1","role":"agent","parts":[{"kind":"text","text":"Response"}]}}\n'
175
+ }
176
+ },
177
+ },
178
+ 400: {"description": "Invalid request or unsupported method"},
179
+ 404: {"description": "Agent, Team, or Workflow not found"},
180
+ },
181
+ )
182
+ async def a2a_stream_message(request: Request):
183
+ request_body = await request.json()
184
+ kwargs = await _get_request_kwargs(request, a2a_stream_message)
185
+
186
+ # 1. Get the Agent, Team, or Workflow to run
187
+ agent_id = request_body.get("params", {}).get("message", {}).get("agentId")
188
+ if not agent_id:
189
+ agent_id = request.headers.get("X-Agent-ID")
190
+ if not agent_id:
191
+ raise HTTPException(
192
+ status_code=400,
193
+ detail="Entity ID required. Provide 'agentId' in params.message or 'X-Agent-ID' header.",
194
+ )
195
+ entity: Optional[Union[Agent, Team, Workflow]] = None
196
+ if agents:
197
+ entity = get_agent_by_id(agent_id, agents)
198
+ if not entity and teams:
199
+ entity = get_team_by_id(agent_id, teams)
200
+ if not entity and workflows:
201
+ entity = get_workflow_by_id(agent_id, workflows)
202
+ if entity is None:
203
+ raise HTTPException(status_code=404, detail=f"Agent, Team, or Workflow with ID '{agent_id}' not found")
204
+
205
+ # 2. Map the request to our run_input and run variables
206
+ run_input = await map_a2a_request_to_run_input(request_body, stream=True)
207
+ context_id = request_body.get("params", {}).get("message", {}).get("contextId")
208
+ user_id = request.headers.get("X-User-ID")
209
+ if not user_id:
210
+ user_id = request_body.get("params", {}).get("message", {}).get("metadata", {}).get("userId")
211
+
212
+ # 3. Run the Agent, Team, or Workflow and stream the response
213
+ try:
214
+ if isinstance(entity, Workflow):
215
+ event_stream = entity.arun(
216
+ input=run_input.input_content,
217
+ images=list(run_input.images) if run_input.images else None,
218
+ videos=list(run_input.videos) if run_input.videos else None,
219
+ audio=list(run_input.audios) if run_input.audios else None,
220
+ files=list(run_input.files) if run_input.files else None,
221
+ session_id=context_id,
222
+ user_id=user_id,
223
+ stream=True,
224
+ stream_events=True,
225
+ **kwargs,
226
+ )
227
+ else:
228
+ event_stream = entity.arun( # type: ignore[assignment]
229
+ input=run_input.input_content,
230
+ images=run_input.images,
231
+ videos=run_input.videos,
232
+ audio=run_input.audios,
233
+ files=run_input.files,
234
+ session_id=context_id,
235
+ user_id=user_id,
236
+ stream=True,
237
+ stream_events=True,
238
+ **kwargs,
239
+ )
240
+
241
+ # 4. Stream the response
242
+ return StreamingResponse(
243
+ stream_a2a_response_with_error_handling(event_stream=event_stream, request_id=request_body["id"]), # type: ignore[arg-type]
244
+ media_type="application/x-ndjson",
245
+ )
246
+
247
+ except Exception as e:
248
+ raise HTTPException(status_code=500, detail=f"Failed to start run: {str(e)}")
249
+
250
+ return router