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/schema.py ADDED
@@ -0,0 +1,1055 @@
1
+ from datetime import datetime, timezone
2
+ from enum import Enum
3
+ from typing import Any, Dict, Generic, List, Optional, TypeVar, Union
4
+ from uuid import uuid4
5
+
6
+ from pydantic import BaseModel, ConfigDict, Field
7
+
8
+ from agno.agent import Agent
9
+ from agno.db.base import SessionType
10
+ from agno.models.message import Message
11
+ from agno.os.config import ChatConfig, EvalsConfig, KnowledgeConfig, MemoryConfig, MetricsConfig, SessionConfig
12
+ from agno.os.utils import (
13
+ extract_input_media,
14
+ format_team_tools,
15
+ format_tools,
16
+ get_agent_input_schema_dict,
17
+ get_run_input,
18
+ get_session_name,
19
+ get_team_input_schema_dict,
20
+ get_workflow_input_schema_dict,
21
+ )
22
+ from agno.run import RunContext
23
+ from agno.run.agent import RunOutput
24
+ from agno.run.team import TeamRunOutput
25
+ from agno.session import AgentSession, TeamSession, WorkflowSession
26
+ from agno.team.team import Team
27
+ from agno.workflow.agent import WorkflowAgent
28
+ from agno.workflow.workflow import Workflow
29
+
30
+
31
+ class BadRequestResponse(BaseModel):
32
+ model_config = ConfigDict(json_schema_extra={"example": {"detail": "Bad request", "error_code": "BAD_REQUEST"}})
33
+
34
+ detail: str = Field(..., description="Error detail message")
35
+ error_code: Optional[str] = Field(None, description="Error code for categorization")
36
+
37
+
38
+ class NotFoundResponse(BaseModel):
39
+ model_config = ConfigDict(json_schema_extra={"example": {"detail": "Not found", "error_code": "NOT_FOUND"}})
40
+
41
+ detail: str = Field(..., description="Error detail message")
42
+ error_code: Optional[str] = Field(None, description="Error code for categorization")
43
+
44
+
45
+ class UnauthorizedResponse(BaseModel):
46
+ model_config = ConfigDict(
47
+ json_schema_extra={"example": {"detail": "Unauthorized access", "error_code": "UNAUTHORIZED"}}
48
+ )
49
+
50
+ detail: str = Field(..., description="Error detail message")
51
+ error_code: Optional[str] = Field(None, description="Error code for categorization")
52
+
53
+
54
+ class UnauthenticatedResponse(BaseModel):
55
+ model_config = ConfigDict(
56
+ json_schema_extra={"example": {"detail": "Unauthenticated access", "error_code": "UNAUTHENTICATED"}}
57
+ )
58
+
59
+ detail: str = Field(..., description="Error detail message")
60
+ error_code: Optional[str] = Field(None, description="Error code for categorization")
61
+
62
+
63
+ class ValidationErrorResponse(BaseModel):
64
+ model_config = ConfigDict(
65
+ json_schema_extra={"example": {"detail": "Validation error", "error_code": "VALIDATION_ERROR"}}
66
+ )
67
+
68
+ detail: str = Field(..., description="Error detail message")
69
+ error_code: Optional[str] = Field(None, description="Error code for categorization")
70
+
71
+
72
+ class InternalServerErrorResponse(BaseModel):
73
+ model_config = ConfigDict(
74
+ json_schema_extra={"example": {"detail": "Internal server error", "error_code": "INTERNAL_SERVER_ERROR"}}
75
+ )
76
+
77
+ detail: str = Field(..., description="Error detail message")
78
+ error_code: Optional[str] = Field(None, description="Error code for categorization")
79
+
80
+
81
+ class HealthResponse(BaseModel):
82
+ model_config = ConfigDict(json_schema_extra={"example": {"status": "ok", "instantiated_at": "1760169236.778903"}})
83
+
84
+ status: str = Field(..., description="Health status of the service")
85
+ instantiated_at: str = Field(..., description="Unix timestamp when service was instantiated")
86
+
87
+
88
+ class InterfaceResponse(BaseModel):
89
+ type: str = Field(..., description="Type of the interface")
90
+ version: str = Field(..., description="Version of the interface")
91
+ route: str = Field(..., description="API route path")
92
+
93
+
94
+ class ManagerResponse(BaseModel):
95
+ type: str = Field(..., description="Type of the manager")
96
+ name: str = Field(..., description="Name of the manager")
97
+ version: str = Field(..., description="Version of the manager")
98
+ route: str = Field(..., description="API route path")
99
+
100
+
101
+ class AgentSummaryResponse(BaseModel):
102
+ id: Optional[str] = Field(None, description="Unique identifier for the agent")
103
+ name: Optional[str] = Field(None, description="Name of the agent")
104
+ description: Optional[str] = Field(None, description="Description of the agent")
105
+ db_id: Optional[str] = Field(None, description="Database identifier")
106
+
107
+ @classmethod
108
+ def from_agent(cls, agent: Agent) -> "AgentSummaryResponse":
109
+ return cls(id=agent.id, name=agent.name, description=agent.description, db_id=agent.db.id if agent.db else None)
110
+
111
+
112
+ class TeamSummaryResponse(BaseModel):
113
+ id: Optional[str] = Field(None, description="Unique identifier for the team")
114
+ name: Optional[str] = Field(None, description="Name of the team")
115
+ description: Optional[str] = Field(None, description="Description of the team")
116
+ db_id: Optional[str] = Field(None, description="Database identifier")
117
+
118
+ @classmethod
119
+ def from_team(cls, team: Team) -> "TeamSummaryResponse":
120
+ return cls(id=team.id, name=team.name, description=team.description, db_id=team.db.id if team.db else None)
121
+
122
+
123
+ class WorkflowSummaryResponse(BaseModel):
124
+ id: Optional[str] = Field(None, description="Unique identifier for the workflow")
125
+ name: Optional[str] = Field(None, description="Name of the workflow")
126
+ description: Optional[str] = Field(None, description="Description of the workflow")
127
+ db_id: Optional[str] = Field(None, description="Database identifier")
128
+
129
+ @classmethod
130
+ def from_workflow(cls, workflow: Workflow) -> "WorkflowSummaryResponse":
131
+ return cls(
132
+ id=workflow.id,
133
+ name=workflow.name,
134
+ description=workflow.description,
135
+ db_id=workflow.db.id if workflow.db else None,
136
+ )
137
+
138
+
139
+ class ConfigResponse(BaseModel):
140
+ """Response schema for the general config endpoint"""
141
+
142
+ os_id: str = Field(..., description="Unique identifier for the OS instance")
143
+ name: Optional[str] = Field(None, description="Name of the OS instance")
144
+ description: Optional[str] = Field(None, description="Description of the OS instance")
145
+ available_models: Optional[List[str]] = Field(None, description="List of available models")
146
+ databases: List[str] = Field(..., description="List of database IDs")
147
+ chat: Optional[ChatConfig] = Field(None, description="Chat configuration")
148
+
149
+ session: Optional[SessionConfig] = Field(None, description="Session configuration")
150
+ metrics: Optional[MetricsConfig] = Field(None, description="Metrics configuration")
151
+ memory: Optional[MemoryConfig] = Field(None, description="Memory configuration")
152
+ knowledge: Optional[KnowledgeConfig] = Field(None, description="Knowledge configuration")
153
+ evals: Optional[EvalsConfig] = Field(None, description="Evaluations configuration")
154
+
155
+ agents: List[AgentSummaryResponse] = Field(..., description="List of registered agents")
156
+ teams: List[TeamSummaryResponse] = Field(..., description="List of registered teams")
157
+ workflows: List[WorkflowSummaryResponse] = Field(..., description="List of registered workflows")
158
+ interfaces: List[InterfaceResponse] = Field(..., description="List of available interfaces")
159
+
160
+
161
+ class Model(BaseModel):
162
+ id: Optional[str] = Field(None, description="Model identifier")
163
+ provider: Optional[str] = Field(None, description="Model provider name")
164
+
165
+
166
+ class ModelResponse(BaseModel):
167
+ name: Optional[str] = Field(None, description="Name of the model")
168
+ model: Optional[str] = Field(None, description="Model identifier")
169
+ provider: Optional[str] = Field(None, description="Model provider name")
170
+
171
+
172
+ class AgentResponse(BaseModel):
173
+ id: Optional[str] = None
174
+ name: Optional[str] = None
175
+ db_id: Optional[str] = None
176
+ model: Optional[ModelResponse] = None
177
+ tools: Optional[Dict[str, Any]] = None
178
+ sessions: Optional[Dict[str, Any]] = None
179
+ knowledge: Optional[Dict[str, Any]] = None
180
+ memory: Optional[Dict[str, Any]] = None
181
+ reasoning: Optional[Dict[str, Any]] = None
182
+ default_tools: Optional[Dict[str, Any]] = None
183
+ system_message: Optional[Dict[str, Any]] = None
184
+ extra_messages: Optional[Dict[str, Any]] = None
185
+ response_settings: Optional[Dict[str, Any]] = None
186
+ streaming: Optional[Dict[str, Any]] = None
187
+ metadata: Optional[Dict[str, Any]] = None
188
+ input_schema: Optional[Dict[str, Any]] = None
189
+
190
+ @classmethod
191
+ async def from_agent(cls, agent: Agent) -> "AgentResponse":
192
+ def filter_meaningful_config(d: Dict[str, Any], defaults: Dict[str, Any]) -> Optional[Dict[str, Any]]:
193
+ """Filter out fields that match their default values, keeping only meaningful user configurations"""
194
+ filtered = {}
195
+ for key, value in d.items():
196
+ if value is None:
197
+ continue
198
+ # Skip if value matches the default exactly
199
+ if key in defaults and value == defaults[key]:
200
+ continue
201
+ # Keep non-default values
202
+ filtered[key] = value
203
+ return filtered if filtered else None
204
+
205
+ # Define default values for filtering
206
+ agent_defaults = {
207
+ # Sessions defaults
208
+ "add_history_to_context": False,
209
+ "num_history_runs": 3,
210
+ "enable_session_summaries": False,
211
+ "search_session_history": False,
212
+ "cache_session": False,
213
+ # Knowledge defaults
214
+ "add_references": False,
215
+ "references_format": "json",
216
+ "enable_agentic_knowledge_filters": False,
217
+ # Memory defaults
218
+ "enable_agentic_memory": False,
219
+ "enable_user_memories": False,
220
+ # Reasoning defaults
221
+ "reasoning": False,
222
+ "reasoning_min_steps": 1,
223
+ "reasoning_max_steps": 10,
224
+ # Default tools defaults
225
+ "read_chat_history": False,
226
+ "search_knowledge": True,
227
+ "update_knowledge": False,
228
+ "read_tool_call_history": False,
229
+ # System message defaults
230
+ "system_message_role": "system",
231
+ "build_context": True,
232
+ "markdown": False,
233
+ "add_name_to_context": False,
234
+ "add_datetime_to_context": False,
235
+ "add_location_to_context": False,
236
+ "resolve_in_context": True,
237
+ # Extra messages defaults
238
+ "user_message_role": "user",
239
+ "build_user_context": True,
240
+ # Response settings defaults
241
+ "retries": 0,
242
+ "delay_between_retries": 1,
243
+ "exponential_backoff": False,
244
+ "parse_response": True,
245
+ "use_json_mode": False,
246
+ # Streaming defaults
247
+ "stream_events": False,
248
+ "stream_intermediate_steps": False,
249
+ }
250
+
251
+ session_id = str(uuid4())
252
+ run_id = str(uuid4())
253
+ agent_tools = await agent.aget_tools(
254
+ session=AgentSession(session_id=session_id, session_data={}),
255
+ run_response=RunOutput(run_id=run_id, session_id=session_id),
256
+ run_context=RunContext(run_id=run_id, session_id=session_id, user_id=agent.user_id),
257
+ check_mcp_tools=False,
258
+ )
259
+ formatted_tools = format_tools(agent_tools) if agent_tools else None
260
+
261
+ additional_input = agent.additional_input
262
+ if additional_input and isinstance(additional_input[0], Message):
263
+ additional_input = [message.to_dict() for message in additional_input] # type: ignore
264
+
265
+ # Build model only if it has at least one non-null field
266
+ model_name = agent.model.name if (agent.model and agent.model.name) else None
267
+ model_provider = agent.model.provider if (agent.model and agent.model.provider) else None
268
+ model_id = agent.model.id if (agent.model and agent.model.id) else None
269
+ _agent_model_data: Dict[str, Any] = {}
270
+ if model_name is not None:
271
+ _agent_model_data["name"] = model_name
272
+ if model_id is not None:
273
+ _agent_model_data["model"] = model_id
274
+ if model_provider is not None:
275
+ _agent_model_data["provider"] = model_provider
276
+
277
+ session_table = agent.db.session_table_name if agent.db else None
278
+ knowledge_table = agent.db.knowledge_table_name if agent.db and agent.knowledge else None
279
+
280
+ tools_info = {
281
+ "tools": formatted_tools,
282
+ "tool_call_limit": agent.tool_call_limit,
283
+ "tool_choice": agent.tool_choice,
284
+ }
285
+
286
+ sessions_info = {
287
+ "session_table": session_table,
288
+ "add_history_to_context": agent.add_history_to_context,
289
+ "enable_session_summaries": agent.enable_session_summaries,
290
+ "num_history_runs": agent.num_history_runs,
291
+ "search_session_history": agent.search_session_history,
292
+ "num_history_sessions": agent.num_history_sessions,
293
+ "cache_session": agent.cache_session,
294
+ }
295
+
296
+ knowledge_info = {
297
+ "knowledge_table": knowledge_table,
298
+ "enable_agentic_knowledge_filters": agent.enable_agentic_knowledge_filters,
299
+ "knowledge_filters": agent.knowledge_filters,
300
+ "references_format": agent.references_format,
301
+ }
302
+
303
+ memory_info: Optional[Dict[str, Any]] = None
304
+ if agent.memory_manager is not None:
305
+ memory_info = {
306
+ "enable_agentic_memory": agent.enable_agentic_memory,
307
+ "enable_user_memories": agent.enable_user_memories,
308
+ "metadata": agent.metadata,
309
+ "memory_table": agent.db.memory_table_name if agent.db and agent.enable_user_memories else None,
310
+ }
311
+
312
+ if agent.memory_manager.model is not None:
313
+ memory_info["model"] = ModelResponse(
314
+ name=agent.memory_manager.model.name,
315
+ model=agent.memory_manager.model.id,
316
+ provider=agent.memory_manager.model.provider,
317
+ ).model_dump()
318
+
319
+ reasoning_info: Dict[str, Any] = {
320
+ "reasoning": agent.reasoning,
321
+ "reasoning_agent_id": agent.reasoning_agent.id if agent.reasoning_agent else None,
322
+ "reasoning_min_steps": agent.reasoning_min_steps,
323
+ "reasoning_max_steps": agent.reasoning_max_steps,
324
+ }
325
+
326
+ if agent.reasoning_model:
327
+ reasoning_info["reasoning_model"] = ModelResponse(
328
+ name=agent.reasoning_model.name,
329
+ model=agent.reasoning_model.id,
330
+ provider=agent.reasoning_model.provider,
331
+ ).model_dump()
332
+
333
+ default_tools_info = {
334
+ "read_chat_history": agent.read_chat_history,
335
+ "search_knowledge": agent.search_knowledge,
336
+ "update_knowledge": agent.update_knowledge,
337
+ "read_tool_call_history": agent.read_tool_call_history,
338
+ }
339
+
340
+ system_message_info = {
341
+ "system_message": str(agent.system_message) if agent.system_message else None,
342
+ "system_message_role": agent.system_message_role,
343
+ "build_context": agent.build_context,
344
+ "description": agent.description,
345
+ "instructions": agent.instructions if agent.instructions else None,
346
+ "expected_output": agent.expected_output,
347
+ "additional_context": agent.additional_context,
348
+ "markdown": agent.markdown,
349
+ "add_name_to_context": agent.add_name_to_context,
350
+ "add_datetime_to_context": agent.add_datetime_to_context,
351
+ "add_location_to_context": agent.add_location_to_context,
352
+ "timezone_identifier": agent.timezone_identifier,
353
+ "resolve_in_context": agent.resolve_in_context,
354
+ }
355
+
356
+ extra_messages_info = {
357
+ "additional_input": additional_input, # type: ignore
358
+ "user_message_role": agent.user_message_role,
359
+ "build_user_context": agent.build_user_context,
360
+ }
361
+
362
+ response_settings_info: Dict[str, Any] = {
363
+ "retries": agent.retries,
364
+ "delay_between_retries": agent.delay_between_retries,
365
+ "exponential_backoff": agent.exponential_backoff,
366
+ "output_schema_name": agent.output_schema.__name__ if agent.output_schema else None,
367
+ "parser_model_prompt": agent.parser_model_prompt,
368
+ "parse_response": agent.parse_response,
369
+ "structured_outputs": agent.structured_outputs,
370
+ "use_json_mode": agent.use_json_mode,
371
+ "save_response_to_file": agent.save_response_to_file,
372
+ }
373
+
374
+ if agent.parser_model:
375
+ response_settings_info["parser_model"] = ModelResponse(
376
+ name=agent.parser_model.name,
377
+ model=agent.parser_model.id,
378
+ provider=agent.parser_model.provider,
379
+ ).model_dump()
380
+
381
+ streaming_info = {
382
+ "stream": agent.stream,
383
+ "stream_events": agent.stream_events,
384
+ "stream_intermediate_steps": agent.stream_intermediate_steps,
385
+ }
386
+
387
+ return AgentResponse(
388
+ id=agent.id,
389
+ name=agent.name,
390
+ db_id=agent.db.id if agent.db else None,
391
+ model=ModelResponse(**_agent_model_data) if _agent_model_data else None,
392
+ tools=filter_meaningful_config(tools_info, {}),
393
+ sessions=filter_meaningful_config(sessions_info, agent_defaults),
394
+ knowledge=filter_meaningful_config(knowledge_info, agent_defaults),
395
+ memory=filter_meaningful_config(memory_info, agent_defaults) if memory_info else None,
396
+ reasoning=filter_meaningful_config(reasoning_info, agent_defaults),
397
+ default_tools=filter_meaningful_config(default_tools_info, agent_defaults),
398
+ system_message=filter_meaningful_config(system_message_info, agent_defaults),
399
+ extra_messages=filter_meaningful_config(extra_messages_info, agent_defaults),
400
+ response_settings=filter_meaningful_config(response_settings_info, agent_defaults),
401
+ streaming=filter_meaningful_config(streaming_info, agent_defaults),
402
+ metadata=agent.metadata,
403
+ input_schema=get_agent_input_schema_dict(agent),
404
+ )
405
+
406
+
407
+ class TeamResponse(BaseModel):
408
+ id: Optional[str] = None
409
+ name: Optional[str] = None
410
+ db_id: Optional[str] = None
411
+ description: Optional[str] = None
412
+ model: Optional[ModelResponse] = None
413
+ tools: Optional[Dict[str, Any]] = None
414
+ sessions: Optional[Dict[str, Any]] = None
415
+ knowledge: Optional[Dict[str, Any]] = None
416
+ memory: Optional[Dict[str, Any]] = None
417
+ reasoning: Optional[Dict[str, Any]] = None
418
+ default_tools: Optional[Dict[str, Any]] = None
419
+ system_message: Optional[Dict[str, Any]] = None
420
+ response_settings: Optional[Dict[str, Any]] = None
421
+ streaming: Optional[Dict[str, Any]] = None
422
+ members: Optional[List[Union[AgentResponse, "TeamResponse"]]] = None
423
+ metadata: Optional[Dict[str, Any]] = None
424
+ input_schema: Optional[Dict[str, Any]] = None
425
+
426
+ @classmethod
427
+ async def from_team(cls, team: Team) -> "TeamResponse":
428
+ def filter_meaningful_config(d: Dict[str, Any], defaults: Dict[str, Any]) -> Optional[Dict[str, Any]]:
429
+ """Filter out fields that match their default values, keeping only meaningful user configurations"""
430
+ filtered = {}
431
+ for key, value in d.items():
432
+ if value is None:
433
+ continue
434
+ # Skip if value matches the default exactly
435
+ if key in defaults and value == defaults[key]:
436
+ continue
437
+ # Keep non-default values
438
+ filtered[key] = value
439
+ return filtered if filtered else None
440
+
441
+ # Define default values for filtering (similar to agent defaults)
442
+ team_defaults = {
443
+ # Sessions defaults
444
+ "add_history_to_context": False,
445
+ "num_history_runs": 3,
446
+ "enable_session_summaries": False,
447
+ "cache_session": False,
448
+ # Knowledge defaults
449
+ "add_references": False,
450
+ "references_format": "json",
451
+ "enable_agentic_knowledge_filters": False,
452
+ # Memory defaults
453
+ "enable_agentic_memory": False,
454
+ "enable_user_memories": False,
455
+ # Reasoning defaults
456
+ "reasoning": False,
457
+ "reasoning_min_steps": 1,
458
+ "reasoning_max_steps": 10,
459
+ # Default tools defaults
460
+ "search_knowledge": True,
461
+ "read_team_history": False,
462
+ "get_member_information_tool": False,
463
+ # System message defaults
464
+ "system_message_role": "system",
465
+ "markdown": False,
466
+ "add_datetime_to_context": False,
467
+ "add_location_to_context": False,
468
+ "resolve_in_context": True,
469
+ # Response settings defaults
470
+ "parse_response": True,
471
+ "use_json_mode": False,
472
+ # Streaming defaults
473
+ "stream_events": False,
474
+ "stream_intermediate_steps": False,
475
+ "stream_member_events": False,
476
+ }
477
+
478
+ run_id = str(uuid4())
479
+ session_id = str(uuid4())
480
+ _tools = team._determine_tools_for_model(
481
+ model=team.model, # type: ignore
482
+ session=TeamSession(session_id=session_id, session_data={}),
483
+ run_response=TeamRunOutput(run_id=run_id),
484
+ run_context=RunContext(run_id=run_id, session_id=session_id, session_state={}),
485
+ async_mode=True,
486
+ team_run_context={},
487
+ check_mcp_tools=False,
488
+ )
489
+ team_tools = _tools
490
+ formatted_tools = format_team_tools(team_tools) if team_tools else None
491
+
492
+ model_name = team.model.name or team.model.__class__.__name__ if team.model else None
493
+ model_provider = team.model.provider or team.model.__class__.__name__ if team.model else ""
494
+ model_id = team.model.id if team.model else None
495
+
496
+ if model_provider and model_id:
497
+ model_provider = f"{model_provider} {model_id}"
498
+ elif model_name and model_id:
499
+ model_provider = f"{model_name} {model_id}"
500
+ elif model_id:
501
+ model_provider = model_id
502
+
503
+ session_table = team.db.session_table_name if team.db else None
504
+ knowledge_table = team.db.knowledge_table_name if team.db and team.knowledge else None
505
+
506
+ tools_info = {
507
+ "tools": formatted_tools,
508
+ "tool_call_limit": team.tool_call_limit,
509
+ "tool_choice": team.tool_choice,
510
+ }
511
+
512
+ sessions_info = {
513
+ "session_table": session_table,
514
+ "add_history_to_context": team.add_history_to_context,
515
+ "enable_session_summaries": team.enable_session_summaries,
516
+ "num_history_runs": team.num_history_runs,
517
+ "cache_session": team.cache_session,
518
+ }
519
+
520
+ knowledge_info = {
521
+ "knowledge_table": knowledge_table,
522
+ "enable_agentic_knowledge_filters": team.enable_agentic_knowledge_filters,
523
+ "knowledge_filters": team.knowledge_filters,
524
+ "references_format": team.references_format,
525
+ }
526
+
527
+ memory_info: Optional[Dict[str, Any]] = None
528
+ if team.memory_manager is not None:
529
+ memory_info = {
530
+ "enable_agentic_memory": team.enable_agentic_memory,
531
+ "enable_user_memories": team.enable_user_memories,
532
+ "metadata": team.metadata,
533
+ "memory_table": team.db.memory_table_name if team.db and team.enable_user_memories else None,
534
+ }
535
+
536
+ if team.memory_manager.model is not None:
537
+ memory_info["model"] = ModelResponse(
538
+ name=team.memory_manager.model.name,
539
+ model=team.memory_manager.model.id,
540
+ provider=team.memory_manager.model.provider,
541
+ ).model_dump()
542
+
543
+ reasoning_info: Dict[str, Any] = {
544
+ "reasoning": team.reasoning,
545
+ "reasoning_agent_id": team.reasoning_agent.id if team.reasoning_agent else None,
546
+ "reasoning_min_steps": team.reasoning_min_steps,
547
+ "reasoning_max_steps": team.reasoning_max_steps,
548
+ }
549
+
550
+ if team.reasoning_model:
551
+ reasoning_info["reasoning_model"] = ModelResponse(
552
+ name=team.reasoning_model.name,
553
+ model=team.reasoning_model.id,
554
+ provider=team.reasoning_model.provider,
555
+ ).model_dump()
556
+
557
+ default_tools_info = {
558
+ "search_knowledge": team.search_knowledge,
559
+ "read_team_history": team.read_team_history,
560
+ "get_member_information_tool": team.get_member_information_tool,
561
+ }
562
+
563
+ team_instructions = (
564
+ team.instructions() if team.instructions and callable(team.instructions) else team.instructions
565
+ )
566
+
567
+ system_message_info = {
568
+ "system_message": str(team.system_message) if team.system_message else None,
569
+ "system_message_role": team.system_message_role,
570
+ "description": team.description,
571
+ "instructions": team_instructions,
572
+ "expected_output": team.expected_output,
573
+ "additional_context": team.additional_context,
574
+ "markdown": team.markdown,
575
+ "add_datetime_to_context": team.add_datetime_to_context,
576
+ "add_location_to_context": team.add_location_to_context,
577
+ "resolve_in_context": team.resolve_in_context,
578
+ }
579
+
580
+ response_settings_info: Dict[str, Any] = {
581
+ "output_schema_name": team.output_schema.__name__ if team.output_schema else None,
582
+ "parser_model_prompt": team.parser_model_prompt,
583
+ "parse_response": team.parse_response,
584
+ "use_json_mode": team.use_json_mode,
585
+ }
586
+
587
+ if team.parser_model:
588
+ response_settings_info["parser_model"] = ModelResponse(
589
+ name=team.parser_model.name,
590
+ model=team.parser_model.id,
591
+ provider=team.parser_model.provider,
592
+ ).model_dump()
593
+
594
+ streaming_info = {
595
+ "stream": team.stream,
596
+ "stream_events": team.stream_events,
597
+ "stream_intermediate_steps": team.stream_intermediate_steps,
598
+ "stream_member_events": team.stream_member_events,
599
+ }
600
+
601
+ # Build team model only if it has at least one non-null field
602
+ _team_model_data: Dict[str, Any] = {}
603
+ if team.model and team.model.name is not None:
604
+ _team_model_data["name"] = team.model.name
605
+ if team.model and team.model.id is not None:
606
+ _team_model_data["model"] = team.model.id
607
+ if team.model and team.model.provider is not None:
608
+ _team_model_data["provider"] = team.model.provider
609
+
610
+ members: List[Union[AgentResponse, TeamResponse]] = []
611
+ for member in team.members:
612
+ if isinstance(member, Agent):
613
+ agent_response = await AgentResponse.from_agent(member)
614
+ members.append(agent_response)
615
+ if isinstance(member, Team):
616
+ team_response = await TeamResponse.from_team(member)
617
+ members.append(team_response)
618
+
619
+ return TeamResponse(
620
+ id=team.id,
621
+ name=team.name,
622
+ db_id=team.db.id if team.db else None,
623
+ model=ModelResponse(**_team_model_data) if _team_model_data else None,
624
+ tools=filter_meaningful_config(tools_info, {}),
625
+ sessions=filter_meaningful_config(sessions_info, team_defaults),
626
+ knowledge=filter_meaningful_config(knowledge_info, team_defaults),
627
+ memory=filter_meaningful_config(memory_info, team_defaults) if memory_info else None,
628
+ reasoning=filter_meaningful_config(reasoning_info, team_defaults),
629
+ default_tools=filter_meaningful_config(default_tools_info, team_defaults),
630
+ system_message=filter_meaningful_config(system_message_info, team_defaults),
631
+ response_settings=filter_meaningful_config(response_settings_info, team_defaults),
632
+ streaming=filter_meaningful_config(streaming_info, team_defaults),
633
+ members=members if members else None,
634
+ metadata=team.metadata,
635
+ input_schema=get_team_input_schema_dict(team),
636
+ )
637
+
638
+
639
+ class WorkflowResponse(BaseModel):
640
+ id: Optional[str] = Field(None, description="Unique identifier for the workflow")
641
+ name: Optional[str] = Field(None, description="Name of the workflow")
642
+ db_id: Optional[str] = Field(None, description="Database identifier")
643
+ description: Optional[str] = Field(None, description="Description of the workflow")
644
+ input_schema: Optional[Dict[str, Any]] = Field(None, description="Input schema for the workflow")
645
+ steps: Optional[List[Dict[str, Any]]] = Field(None, description="List of workflow steps")
646
+ agent: Optional[AgentResponse] = Field(None, description="Agent configuration if used")
647
+ team: Optional[TeamResponse] = Field(None, description="Team configuration if used")
648
+ metadata: Optional[Dict[str, Any]] = Field(None, description="Additional metadata")
649
+ workflow_agent: bool = Field(False, description="Whether this workflow uses a WorkflowAgent")
650
+
651
+ @classmethod
652
+ async def _resolve_agents_and_teams_recursively(cls, steps: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
653
+ """Parse Agents and Teams into AgentResponse and TeamResponse objects.
654
+
655
+ If the given steps have nested steps, recursively work on those."""
656
+ if not steps:
657
+ return steps
658
+
659
+ def _prune_none(value: Any) -> Any:
660
+ # Recursively remove None values from dicts and lists
661
+ if isinstance(value, dict):
662
+ return {k: _prune_none(v) for k, v in value.items() if v is not None}
663
+ if isinstance(value, list):
664
+ return [_prune_none(v) for v in value]
665
+ return value
666
+
667
+ for idx, step in enumerate(steps):
668
+ if step.get("agent"):
669
+ # Convert to dict and exclude fields that are None
670
+ agent_response = await AgentResponse.from_agent(step.get("agent")) # type: ignore
671
+ step["agent"] = agent_response.model_dump(exclude_none=True)
672
+
673
+ if step.get("team"):
674
+ team_response = await TeamResponse.from_team(step.get("team")) # type: ignore
675
+ step["team"] = team_response.model_dump(exclude_none=True)
676
+
677
+ if step.get("steps"):
678
+ step["steps"] = await cls._resolve_agents_and_teams_recursively(step["steps"])
679
+
680
+ # Prune None values in the entire step
681
+ steps[idx] = _prune_none(step)
682
+
683
+ return steps
684
+
685
+ @classmethod
686
+ async def from_workflow(cls, workflow: Workflow) -> "WorkflowResponse":
687
+ workflow_dict = workflow.to_dict()
688
+ steps = workflow_dict.get("steps")
689
+
690
+ if steps:
691
+ steps = await cls._resolve_agents_and_teams_recursively(steps)
692
+
693
+ return cls(
694
+ id=workflow.id,
695
+ name=workflow.name,
696
+ db_id=workflow.db.id if workflow.db else None,
697
+ description=workflow.description,
698
+ steps=steps,
699
+ input_schema=get_workflow_input_schema_dict(workflow),
700
+ metadata=workflow.metadata,
701
+ workflow_agent=isinstance(workflow.agent, WorkflowAgent) if workflow.agent else False,
702
+ )
703
+
704
+
705
+ class WorkflowRunRequest(BaseModel):
706
+ input: Dict[str, Any] = Field(..., description="Input parameters for the workflow run")
707
+ user_id: Optional[str] = Field(None, description="User identifier for the workflow run")
708
+ session_id: Optional[str] = Field(None, description="Session identifier for context persistence")
709
+
710
+
711
+ class SessionSchema(BaseModel):
712
+ session_id: str = Field(..., description="Unique identifier for the session")
713
+ session_name: str = Field(..., description="Human-readable name for the session")
714
+ session_state: Optional[dict] = Field(None, description="Current state data of the session")
715
+ created_at: Optional[datetime] = Field(None, description="Timestamp when session was created")
716
+ updated_at: Optional[datetime] = Field(None, description="Timestamp when session was last updated")
717
+
718
+ @classmethod
719
+ def from_dict(cls, session: Dict[str, Any]) -> "SessionSchema":
720
+ session_name = get_session_name(session)
721
+ return cls(
722
+ session_id=session.get("session_id", ""),
723
+ session_name=session_name,
724
+ session_state=session.get("session_data", {}).get("session_state", None),
725
+ created_at=datetime.fromtimestamp(session.get("created_at", 0), tz=timezone.utc)
726
+ if session.get("created_at")
727
+ else None,
728
+ updated_at=datetime.fromtimestamp(session.get("updated_at", 0), tz=timezone.utc)
729
+ if session.get("updated_at")
730
+ else None,
731
+ )
732
+
733
+
734
+ class DeleteSessionRequest(BaseModel):
735
+ session_ids: List[str] = Field(..., description="List of session IDs to delete", min_length=1)
736
+ session_types: List[SessionType] = Field(..., description="Types of sessions to delete", min_length=1)
737
+
738
+
739
+ class CreateSessionRequest(BaseModel):
740
+ session_id: Optional[str] = Field(None, description="Optional session ID (generated if not provided)")
741
+ session_name: Optional[str] = Field(None, description="Name for the session")
742
+ session_state: Optional[Dict[str, Any]] = Field(None, description="Initial session state")
743
+ metadata: Optional[Dict[str, Any]] = Field(None, description="Additional metadata")
744
+ user_id: Optional[str] = Field(None, description="User ID associated with the session")
745
+ agent_id: Optional[str] = Field(None, description="Agent ID if this is an agent session")
746
+ team_id: Optional[str] = Field(None, description="Team ID if this is a team session")
747
+ workflow_id: Optional[str] = Field(None, description="Workflow ID if this is a workflow session")
748
+
749
+
750
+ class UpdateSessionRequest(BaseModel):
751
+ session_name: Optional[str] = Field(None, description="Updated session name")
752
+ session_state: Optional[Dict[str, Any]] = Field(None, description="Updated session state")
753
+ metadata: Optional[Dict[str, Any]] = Field(None, description="Updated metadata")
754
+ summary: Optional[Dict[str, Any]] = Field(None, description="Session summary")
755
+
756
+
757
+ class AgentSessionDetailSchema(BaseModel):
758
+ user_id: Optional[str] = Field(None, description="User ID associated with the session")
759
+ agent_session_id: str = Field(..., description="Unique agent session identifier")
760
+ session_id: str = Field(..., description="Session identifier")
761
+ session_name: str = Field(..., description="Human-readable session name")
762
+ session_summary: Optional[dict] = Field(None, description="Summary of session interactions")
763
+ session_state: Optional[dict] = Field(None, description="Current state of the session")
764
+ agent_id: Optional[str] = Field(None, description="Agent ID used in this session")
765
+ total_tokens: Optional[int] = Field(None, description="Total tokens used in this session")
766
+ agent_data: Optional[dict] = Field(None, description="Agent-specific data")
767
+ metrics: Optional[dict] = Field(None, description="Session metrics")
768
+ metadata: Optional[dict] = Field(None, description="Additional metadata")
769
+ chat_history: Optional[List[dict]] = Field(None, description="Complete chat history")
770
+ created_at: Optional[datetime] = Field(None, description="Session creation timestamp")
771
+ updated_at: Optional[datetime] = Field(None, description="Last update timestamp")
772
+
773
+ @classmethod
774
+ def from_session(cls, session: AgentSession) -> "AgentSessionDetailSchema":
775
+ session_name = get_session_name({**session.to_dict(), "session_type": "agent"})
776
+ return cls(
777
+ user_id=session.user_id,
778
+ agent_session_id=session.session_id,
779
+ session_id=session.session_id,
780
+ session_name=session_name,
781
+ session_summary=session.summary.to_dict() if session.summary else None,
782
+ session_state=session.session_data.get("session_state", None) if session.session_data else None,
783
+ agent_id=session.agent_id if session.agent_id else None,
784
+ agent_data=session.agent_data,
785
+ total_tokens=session.session_data.get("session_metrics", {}).get("total_tokens")
786
+ if session.session_data
787
+ else None,
788
+ metrics=session.session_data.get("session_metrics", {}) if session.session_data else None, # type: ignore
789
+ metadata=session.metadata,
790
+ chat_history=[message.to_dict() for message in session.get_chat_history()],
791
+ created_at=datetime.fromtimestamp(session.created_at, tz=timezone.utc) if session.created_at else None,
792
+ updated_at=datetime.fromtimestamp(session.updated_at, tz=timezone.utc) if session.updated_at else None,
793
+ )
794
+
795
+
796
+ class TeamSessionDetailSchema(BaseModel):
797
+ session_id: str = Field(..., description="Unique session identifier")
798
+ session_name: str = Field(..., description="Human-readable session name")
799
+ user_id: Optional[str] = Field(None, description="User ID associated with the session")
800
+ team_id: Optional[str] = Field(None, description="Team ID used in this session")
801
+ session_summary: Optional[dict] = Field(None, description="Summary of team interactions")
802
+ session_state: Optional[dict] = Field(None, description="Current state of the session")
803
+ metrics: Optional[dict] = Field(None, description="Session metrics")
804
+ team_data: Optional[dict] = Field(None, description="Team-specific data")
805
+ metadata: Optional[dict] = Field(None, description="Additional metadata")
806
+ chat_history: Optional[List[dict]] = Field(None, description="Complete chat history")
807
+ created_at: Optional[datetime] = Field(None, description="Session creation timestamp")
808
+ updated_at: Optional[datetime] = Field(None, description="Last update timestamp")
809
+ total_tokens: Optional[int] = Field(None, description="Total tokens used in this session")
810
+
811
+ @classmethod
812
+ def from_session(cls, session: TeamSession) -> "TeamSessionDetailSchema":
813
+ session_dict = session.to_dict()
814
+ session_name = get_session_name({**session_dict, "session_type": "team"})
815
+
816
+ return cls(
817
+ session_id=session.session_id,
818
+ team_id=session.team_id,
819
+ session_name=session_name,
820
+ session_summary=session_dict.get("summary") if session_dict.get("summary") else None,
821
+ user_id=session.user_id,
822
+ team_data=session.team_data,
823
+ session_state=session.session_data.get("session_state", None) if session.session_data else None,
824
+ total_tokens=session.session_data.get("session_metrics", {}).get("total_tokens")
825
+ if session.session_data
826
+ else None,
827
+ metrics=session.session_data.get("session_metrics", {}) if session.session_data else None,
828
+ metadata=session.metadata,
829
+ chat_history=[message.to_dict() for message in session.get_chat_history()],
830
+ created_at=datetime.fromtimestamp(session.created_at, tz=timezone.utc) if session.created_at else None,
831
+ updated_at=datetime.fromtimestamp(session.updated_at, tz=timezone.utc) if session.updated_at else None,
832
+ )
833
+
834
+
835
+ class WorkflowSessionDetailSchema(BaseModel):
836
+ user_id: Optional[str] = Field(None, description="User ID associated with the session")
837
+ workflow_id: Optional[str] = Field(None, description="Workflow ID used in this session")
838
+ workflow_name: Optional[str] = Field(None, description="Name of the workflow")
839
+ session_id: str = Field(..., description="Unique session identifier")
840
+ session_name: str = Field(..., description="Human-readable session name")
841
+
842
+ session_data: Optional[dict] = Field(None, description="Complete session data")
843
+ session_state: Optional[dict] = Field(None, description="Current workflow state")
844
+ workflow_data: Optional[dict] = Field(None, description="Workflow-specific data")
845
+ metadata: Optional[dict] = Field(None, description="Additional metadata")
846
+
847
+ created_at: Optional[int] = Field(None, description="Unix timestamp of session creation")
848
+ updated_at: Optional[int] = Field(None, description="Unix timestamp of last update")
849
+
850
+ @classmethod
851
+ def from_session(cls, session: WorkflowSession) -> "WorkflowSessionDetailSchema":
852
+ session_dict = session.to_dict()
853
+ session_name = get_session_name({**session_dict, "session_type": "workflow"})
854
+
855
+ return cls(
856
+ session_id=session.session_id,
857
+ user_id=session.user_id,
858
+ workflow_id=session.workflow_id,
859
+ workflow_name=session.workflow_name,
860
+ session_name=session_name,
861
+ session_data=session.session_data,
862
+ session_state=session.session_data.get("session_state", None) if session.session_data else None,
863
+ workflow_data=session.workflow_data,
864
+ metadata=session.metadata,
865
+ created_at=session.created_at,
866
+ updated_at=session.updated_at,
867
+ )
868
+
869
+
870
+ class RunSchema(BaseModel):
871
+ run_id: str = Field(..., description="Unique identifier for the run")
872
+ parent_run_id: Optional[str] = Field(None, description="Parent run ID if this is a nested run")
873
+ agent_id: Optional[str] = Field(None, description="Agent ID that executed this run")
874
+ user_id: Optional[str] = Field(None, description="User ID associated with the run")
875
+ run_input: Optional[str] = Field(None, description="Input provided to the run")
876
+ content: Optional[Union[str, dict]] = Field(None, description="Output content from the run")
877
+ run_response_format: Optional[str] = Field(None, description="Format of the response (text/json)")
878
+ reasoning_content: Optional[str] = Field(None, description="Reasoning content if reasoning was enabled")
879
+ reasoning_steps: Optional[List[dict]] = Field(None, description="List of reasoning steps")
880
+ metrics: Optional[dict] = Field(None, description="Performance and usage metrics")
881
+ messages: Optional[List[dict]] = Field(None, description="Message history for the run")
882
+ tools: Optional[List[dict]] = Field(None, description="Tools used in the run")
883
+ events: Optional[List[dict]] = Field(None, description="Events generated during the run")
884
+ created_at: Optional[datetime] = Field(None, description="Run creation timestamp")
885
+ references: Optional[List[dict]] = Field(None, description="References cited in the run")
886
+ reasoning_messages: Optional[List[dict]] = Field(None, description="Reasoning process messages")
887
+ session_state: Optional[dict] = Field(None, description="Session state at the end of the run")
888
+ images: Optional[List[dict]] = Field(None, description="Images included in the run")
889
+ videos: Optional[List[dict]] = Field(None, description="Videos included in the run")
890
+ audio: Optional[List[dict]] = Field(None, description="Audio files included in the run")
891
+ files: Optional[List[dict]] = Field(None, description="Files included in the run")
892
+ response_audio: Optional[dict] = Field(None, description="Audio response if generated")
893
+ input_media: Optional[Dict[str, Any]] = Field(None, description="Input media attachments")
894
+
895
+ @classmethod
896
+ def from_dict(cls, run_dict: Dict[str, Any]) -> "RunSchema":
897
+ run_input = get_run_input(run_dict)
898
+ run_response_format = "text" if run_dict.get("content_type", "str") == "str" else "json"
899
+ return cls(
900
+ run_id=run_dict.get("run_id", ""),
901
+ parent_run_id=run_dict.get("parent_run_id", ""),
902
+ agent_id=run_dict.get("agent_id", ""),
903
+ user_id=run_dict.get("user_id", ""),
904
+ run_input=run_input,
905
+ content=run_dict.get("content", ""),
906
+ run_response_format=run_response_format,
907
+ reasoning_content=run_dict.get("reasoning_content", ""),
908
+ reasoning_steps=run_dict.get("reasoning_steps", []),
909
+ metrics=run_dict.get("metrics", {}),
910
+ messages=[message for message in run_dict.get("messages", [])] if run_dict.get("messages") else None,
911
+ tools=[tool for tool in run_dict.get("tools", [])] if run_dict.get("tools") else None,
912
+ events=[event for event in run_dict["events"]] if run_dict.get("events") else None,
913
+ references=run_dict.get("references", []),
914
+ reasoning_messages=run_dict.get("reasoning_messages", []),
915
+ session_state=run_dict.get("session_state"),
916
+ images=run_dict.get("images", []),
917
+ videos=run_dict.get("videos", []),
918
+ audio=run_dict.get("audio", []),
919
+ files=run_dict.get("files", []),
920
+ response_audio=run_dict.get("response_audio", None),
921
+ input_media=extract_input_media(run_dict),
922
+ created_at=datetime.fromtimestamp(run_dict.get("created_at", 0), tz=timezone.utc)
923
+ if run_dict.get("created_at") is not None
924
+ else None,
925
+ )
926
+
927
+
928
+ class TeamRunSchema(BaseModel):
929
+ run_id: str = Field(..., description="Unique identifier for the team run")
930
+ parent_run_id: Optional[str] = Field(None, description="Parent run ID if this is a nested run")
931
+ team_id: Optional[str] = Field(None, description="Team ID that executed this run")
932
+ content: Optional[Union[str, dict]] = Field(None, description="Output content from the team run")
933
+ reasoning_content: Optional[str] = Field(None, description="Reasoning content if reasoning was enabled")
934
+ reasoning_steps: Optional[List[dict]] = Field(None, description="List of reasoning steps")
935
+ run_input: Optional[str] = Field(None, description="Input provided to the run")
936
+ run_response_format: Optional[str] = Field(None, description="Format of the response (text/json)")
937
+ metrics: Optional[dict] = Field(None, description="Performance and usage metrics")
938
+ tools: Optional[List[dict]] = Field(None, description="Tools used in the run")
939
+ messages: Optional[List[dict]] = Field(None, description="Message history for the run")
940
+ events: Optional[List[dict]] = Field(None, description="Events generated during the run")
941
+ created_at: Optional[datetime] = Field(None, description="Run creation timestamp")
942
+ references: Optional[List[dict]] = Field(None, description="References cited in the run")
943
+ reasoning_messages: Optional[List[dict]] = Field(None, description="Reasoning process messages")
944
+ session_state: Optional[dict] = Field(None, description="Session state at the end of the run")
945
+ input_media: Optional[Dict[str, Any]] = Field(None, description="Input media attachments")
946
+ images: Optional[List[dict]] = Field(None, description="Images included in the run")
947
+ videos: Optional[List[dict]] = Field(None, description="Videos included in the run")
948
+ audio: Optional[List[dict]] = Field(None, description="Audio files included in the run")
949
+ files: Optional[List[dict]] = Field(None, description="Files included in the run")
950
+ response_audio: Optional[dict] = Field(None, description="Audio response if generated")
951
+
952
+ @classmethod
953
+ def from_dict(cls, run_dict: Dict[str, Any]) -> "TeamRunSchema":
954
+ run_input = get_run_input(run_dict)
955
+ run_response_format = "text" if run_dict.get("content_type", "str") == "str" else "json"
956
+ return cls(
957
+ run_id=run_dict.get("run_id", ""),
958
+ parent_run_id=run_dict.get("parent_run_id", ""),
959
+ team_id=run_dict.get("team_id", ""),
960
+ run_input=run_input,
961
+ content=run_dict.get("content", ""),
962
+ run_response_format=run_response_format,
963
+ reasoning_content=run_dict.get("reasoning_content", ""),
964
+ reasoning_steps=run_dict.get("reasoning_steps", []),
965
+ metrics=run_dict.get("metrics", {}),
966
+ messages=[message for message in run_dict.get("messages", [])] if run_dict.get("messages") else None,
967
+ tools=[tool for tool in run_dict.get("tools", [])] if run_dict.get("tools") else None,
968
+ events=[event for event in run_dict["events"]] if run_dict.get("events") else None,
969
+ created_at=datetime.fromtimestamp(run_dict.get("created_at", 0), tz=timezone.utc)
970
+ if run_dict.get("created_at") is not None
971
+ else None,
972
+ references=run_dict.get("references", []),
973
+ reasoning_messages=run_dict.get("reasoning_messages", []),
974
+ session_state=run_dict.get("session_state"),
975
+ images=run_dict.get("images", []),
976
+ videos=run_dict.get("videos", []),
977
+ audio=run_dict.get("audio", []),
978
+ files=run_dict.get("files", []),
979
+ response_audio=run_dict.get("response_audio", None),
980
+ input_media=extract_input_media(run_dict),
981
+ )
982
+
983
+
984
+ class WorkflowRunSchema(BaseModel):
985
+ run_id: str = Field(..., description="Unique identifier for the workflow run")
986
+ run_input: Optional[str] = Field(None, description="Input provided to the workflow")
987
+ events: Optional[List[dict]] = Field(None, description="Events generated during the workflow")
988
+ workflow_id: Optional[str] = Field(None, description="Workflow ID that was executed")
989
+ user_id: Optional[str] = Field(None, description="User ID associated with the run")
990
+ content: Optional[Union[str, dict]] = Field(None, description="Output content from the workflow")
991
+ content_type: Optional[str] = Field(None, description="Type of content returned")
992
+ status: Optional[str] = Field(None, description="Status of the workflow run")
993
+ step_results: Optional[list[dict]] = Field(None, description="Results from each workflow step")
994
+ step_executor_runs: Optional[list[dict]] = Field(None, description="Executor runs for each step")
995
+ metrics: Optional[dict] = Field(None, description="Performance and usage metrics")
996
+ created_at: Optional[int] = Field(None, description="Unix timestamp of run creation")
997
+ reasoning_content: Optional[str] = Field(None, description="Reasoning content if reasoning was enabled")
998
+ reasoning_steps: Optional[List[dict]] = Field(None, description="List of reasoning steps")
999
+ references: Optional[List[dict]] = Field(None, description="References cited in the workflow")
1000
+ reasoning_messages: Optional[List[dict]] = Field(None, description="Reasoning process messages")
1001
+ images: Optional[List[dict]] = Field(None, description="Images included in the workflow")
1002
+ videos: Optional[List[dict]] = Field(None, description="Videos included in the workflow")
1003
+ audio: Optional[List[dict]] = Field(None, description="Audio files included in the workflow")
1004
+ files: Optional[List[dict]] = Field(None, description="Files included in the workflow")
1005
+ response_audio: Optional[dict] = Field(None, description="Audio response if generated")
1006
+
1007
+ @classmethod
1008
+ def from_dict(cls, run_response: Dict[str, Any]) -> "WorkflowRunSchema":
1009
+ run_input = get_run_input(run_response, is_workflow_run=True)
1010
+ return cls(
1011
+ run_id=run_response.get("run_id", ""),
1012
+ run_input=run_input,
1013
+ events=run_response.get("events", []),
1014
+ workflow_id=run_response.get("workflow_id", ""),
1015
+ user_id=run_response.get("user_id", ""),
1016
+ content=run_response.get("content", ""),
1017
+ content_type=run_response.get("content_type", ""),
1018
+ status=run_response.get("status", ""),
1019
+ metrics=run_response.get("metrics", {}),
1020
+ step_results=run_response.get("step_results", []),
1021
+ step_executor_runs=run_response.get("step_executor_runs", []),
1022
+ created_at=run_response["created_at"],
1023
+ reasoning_content=run_response.get("reasoning_content", ""),
1024
+ reasoning_steps=run_response.get("reasoning_steps", []),
1025
+ references=run_response.get("references", []),
1026
+ reasoning_messages=run_response.get("reasoning_messages", []),
1027
+ images=run_response.get("images", []),
1028
+ videos=run_response.get("videos", []),
1029
+ audio=run_response.get("audio", []),
1030
+ files=run_response.get("files", []),
1031
+ response_audio=run_response.get("response_audio", None),
1032
+ )
1033
+
1034
+
1035
+ T = TypeVar("T")
1036
+
1037
+
1038
+ class SortOrder(str, Enum):
1039
+ ASC = "asc"
1040
+ DESC = "desc"
1041
+
1042
+
1043
+ class PaginationInfo(BaseModel):
1044
+ page: int = Field(0, description="Current page number (0-indexed)", ge=0)
1045
+ limit: int = Field(20, description="Number of items per page", ge=1, le=100)
1046
+ total_pages: int = Field(0, description="Total number of pages", ge=0)
1047
+ total_count: int = Field(0, description="Total count of items", ge=0)
1048
+ search_time_ms: float = Field(0, description="Search execution time in milliseconds", ge=0)
1049
+
1050
+
1051
+ class PaginatedResponse(BaseModel, Generic[T]):
1052
+ """Wrapper to add pagination info to classes used as response models"""
1053
+
1054
+ data: List[T] = Field(..., description="List of items for the current page")
1055
+ meta: PaginationInfo = Field(..., description="Pagination metadata")