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
@@ -0,0 +1,422 @@
1
+ from dataclasses import dataclass
2
+ from os import getenv
3
+ from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Type, Union
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from agno.exceptions import ModelProviderError
8
+ from agno.models.base import Model
9
+ from agno.models.message import Message
10
+ from agno.models.metrics import Metrics
11
+ from agno.models.response import ModelResponse
12
+ from agno.run.agent import RunOutput
13
+ from agno.utils.log import log_debug, log_error, log_warning
14
+ from agno.utils.models.watsonx import format_images_for_message
15
+
16
+ try:
17
+ from ibm_watsonx_ai import Credentials
18
+ from ibm_watsonx_ai.foundation_models import ModelInference
19
+ except ImportError:
20
+ raise ImportError("`ibm-watsonx-ai` is not installed. Please install it using `pip install ibm-watsonx-ai`.")
21
+
22
+
23
+ @dataclass
24
+ class WatsonX(Model):
25
+ """
26
+ A class for interacting with IBM WatsonX models.
27
+
28
+ See supported models at: https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models.html?context=wx
29
+
30
+ For more information, see: https://www.ibm.com/watsonx/developer/
31
+ """
32
+
33
+ id: str = "ibm/granite-20b-code-instruct"
34
+ name: str = "WatsonX"
35
+ provider: str = "IBM"
36
+
37
+ # Request parameters
38
+ frequency_penalty: Optional[float] = None
39
+ presence_penalty: Optional[float] = None
40
+ max_tokens: Optional[int] = None
41
+ temperature: Optional[float] = None
42
+ top_p: Optional[float] = None
43
+ logprobs: Optional[int] = None
44
+ top_logprobs: Optional[int] = None
45
+
46
+ request_params: Optional[Dict[str, Any]] = None
47
+
48
+ # Client parameters
49
+ api_key: Optional[str] = None
50
+ project_id: Optional[str] = None
51
+ url: Optional[str] = "https://eu-de.ml.cloud.ibm.com"
52
+ verify: bool = True
53
+ client_params: Optional[Dict[str, Any]] = None
54
+
55
+ # WatsonX client
56
+ model_client: Optional[ModelInference] = None
57
+
58
+ def _get_client_params(self) -> Dict[str, Any]:
59
+ # Fetch API key and project ID from env if not already set
60
+ self.api_key = self.api_key or getenv("IBM_WATSONX_API_KEY")
61
+ if not self.api_key:
62
+ log_error("IBM_WATSONX_API_KEY not set. Please set the IBM_WATSONX_API_KEY environment variable.")
63
+
64
+ self.project_id = self.project_id or getenv("IBM_WATSONX_PROJECT_ID")
65
+ if not self.project_id:
66
+ log_error("IBM_WATSONX_PROJECT_ID not set. Please set the IBM_WATSONX_PROJECT_ID environment variable.")
67
+
68
+ self.url = getenv("IBM_WATSONX_URL") or self.url
69
+
70
+ # Create credentials object
71
+ credentials = Credentials(url=self.url, api_key=self.api_key, verify=self.verify)
72
+
73
+ return {
74
+ "credentials": credentials,
75
+ "project_id": self.project_id,
76
+ }
77
+
78
+ def get_client(self) -> ModelInference:
79
+ """
80
+ Returns a WatsonX ModelInference client.
81
+
82
+ Returns:
83
+ ModelInference: An instance of the WatsonX ModelInference client.
84
+ """
85
+ if self.model_client:
86
+ return self.model_client
87
+
88
+ # Get client parameters
89
+ client_params = self._get_client_params()
90
+
91
+ # Initialize model inference client
92
+ self.model_client = ModelInference(model_id=self.id, **client_params)
93
+
94
+ return self.model_client
95
+
96
+ def get_request_params(
97
+ self,
98
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
99
+ tools: Optional[List[Dict[str, Any]]] = None,
100
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
101
+ ) -> Dict[str, Any]:
102
+ params = {
103
+ "frequency_penalty": self.frequency_penalty,
104
+ "presence_penalty": self.presence_penalty,
105
+ "max_tokens": self.max_tokens,
106
+ "temperature": self.temperature,
107
+ "top_p": self.top_p,
108
+ "logprobs": self.logprobs,
109
+ "top_logprobs": self.top_logprobs,
110
+ "response_format": response_format,
111
+ }
112
+ # Filter out None values
113
+ params = {k: v for k, v in params.items() if v is not None}
114
+ request_params = {}
115
+
116
+ if params:
117
+ request_params["params"] = params
118
+
119
+ # Add tools
120
+ if tools is not None:
121
+ request_params["tools"] = tools # type: ignore
122
+ if tool_choice is not None:
123
+ request_params["tool_choice"] = tool_choice # type: ignore
124
+ # Add additional request params if provided
125
+ if self.request_params:
126
+ request_params.update(self.request_params)
127
+
128
+ if request_params:
129
+ log_debug(f"Calling {self.provider} with request parameters: {request_params}", log_level=2)
130
+ return request_params
131
+
132
+ def _format_message(self, message: Message) -> Dict[str, Any]:
133
+ """
134
+ Format a message into the format expected by WatsonX.
135
+
136
+ Args:
137
+ message (Message): The message to format.
138
+
139
+ Returns:
140
+ Dict[str, Any]: The formatted message.
141
+ """
142
+ if message.images is not None and isinstance(message.content, str):
143
+ message = format_images_for_message(message=message, images=message.images)
144
+
145
+ if message.audio is not None and len(message.audio) > 0:
146
+ log_warning("Audio input is currently unsupported.")
147
+
148
+ if message.files is not None and len(message.files) > 0:
149
+ log_warning("File input is currently unsupported.")
150
+
151
+ if message.videos is not None and len(message.videos) > 0:
152
+ log_warning("Video input is currently unsupported.")
153
+
154
+ return message.to_dict()
155
+
156
+ def invoke(
157
+ self,
158
+ messages: List[Message],
159
+ assistant_message: Message,
160
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
161
+ tools: Optional[List[Dict[str, Any]]] = None,
162
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
163
+ run_response: Optional[RunOutput] = None,
164
+ ) -> ModelResponse:
165
+ """
166
+ Send a chat completion request to the WatsonX API.
167
+ """
168
+ try:
169
+ if run_response and run_response.metrics:
170
+ run_response.metrics.set_time_to_first_token()
171
+
172
+ client = self.get_client()
173
+
174
+ formatted_messages = [self._format_message(m) for m in messages]
175
+ request_params = self.get_request_params(
176
+ response_format=response_format, tools=tools, tool_choice=tool_choice
177
+ )
178
+
179
+ assistant_message.metrics.start_timer()
180
+ response = client.chat(messages=formatted_messages, **request_params)
181
+ assistant_message.metrics.stop_timer()
182
+
183
+ model_response = self._parse_provider_response(response, response_format=response_format)
184
+
185
+ return model_response
186
+
187
+ except Exception as e:
188
+ log_error(f"Error calling WatsonX API: {str(e)}")
189
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
190
+
191
+ async def ainvoke(
192
+ self,
193
+ messages: List[Message],
194
+ assistant_message: Message,
195
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
196
+ tools: Optional[List[Dict[str, Any]]] = None,
197
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
198
+ run_response: Optional[RunOutput] = None,
199
+ ) -> Any:
200
+ """
201
+ Sends an asynchronous chat completion request to the WatsonX API.
202
+ """
203
+ try:
204
+ if run_response and run_response.metrics:
205
+ run_response.metrics.set_time_to_first_token()
206
+
207
+ client = self.get_client()
208
+ formatted_messages = [self._format_message(m) for m in messages]
209
+
210
+ request_params = self.get_request_params(
211
+ response_format=response_format, tools=tools, tool_choice=tool_choice
212
+ )
213
+
214
+ assistant_message.metrics.start_timer()
215
+ provider_response = await client.achat(messages=formatted_messages, **request_params)
216
+ assistant_message.metrics.stop_timer()
217
+
218
+ model_response = self._parse_provider_response(provider_response, response_format=response_format)
219
+
220
+ return model_response
221
+
222
+ except Exception as e:
223
+ log_error(f"Error calling WatsonX API: {str(e)}")
224
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
225
+
226
+ def invoke_stream(
227
+ self,
228
+ messages: List[Message],
229
+ assistant_message: Message,
230
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
231
+ tools: Optional[List[Dict[str, Any]]] = None,
232
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
233
+ run_response: Optional[RunOutput] = None,
234
+ ) -> Iterator[ModelResponse]:
235
+ """
236
+ Send a streaming chat completion request to the WatsonX API.
237
+ """
238
+ try:
239
+ client = self.get_client()
240
+ formatted_messages = [self._format_message(m) for m in messages]
241
+
242
+ request_params = self.get_request_params(
243
+ response_format=response_format, tools=tools, tool_choice=tool_choice
244
+ )
245
+
246
+ if run_response and run_response.metrics:
247
+ run_response.metrics.set_time_to_first_token()
248
+
249
+ assistant_message.metrics.start_timer()
250
+
251
+ for chunk in client.chat_stream(messages=formatted_messages, **request_params):
252
+ yield self._parse_provider_response_delta(chunk)
253
+
254
+ assistant_message.metrics.stop_timer()
255
+
256
+ except Exception as e:
257
+ log_error(f"Error calling WatsonX API: {str(e)}")
258
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
259
+
260
+ async def ainvoke_stream(
261
+ self,
262
+ messages: List[Message],
263
+ assistant_message: Message,
264
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
265
+ tools: Optional[List[Dict[str, Any]]] = None,
266
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
267
+ run_response: Optional[RunOutput] = None,
268
+ ) -> AsyncIterator[ModelResponse]:
269
+ """
270
+ Sends an asynchronous streaming chat completion request to the WatsonX API.
271
+ """
272
+ try:
273
+ if run_response and run_response.metrics:
274
+ run_response.metrics.set_time_to_first_token()
275
+
276
+ client = self.get_client()
277
+ formatted_messages = [self._format_message(m) for m in messages]
278
+
279
+ # Get parameters for chat
280
+ request_params = self.get_request_params(
281
+ response_format=response_format, tools=tools, tool_choice=tool_choice
282
+ )
283
+
284
+ assistant_message.metrics.start_timer()
285
+
286
+ async_stream = await client.achat_stream(messages=formatted_messages, **request_params)
287
+ async for chunk in async_stream:
288
+ yield self._parse_provider_response_delta(chunk)
289
+
290
+ assistant_message.metrics.stop_timer()
291
+
292
+ except Exception as e:
293
+ log_error(f"Error in async streaming from WatsonX API: {str(e)}")
294
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
295
+
296
+ # Override base method
297
+ @staticmethod
298
+ def parse_tool_calls(tool_calls_data: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
299
+ """
300
+ Build tool calls from streamed tool call data.
301
+
302
+ Args:
303
+ tool_calls_data (List[ChoiceDeltaToolCall]): The tool call data to build from.
304
+
305
+ Returns:
306
+ List[Dict[str, Any]]: The built tool calls.
307
+ """
308
+ tool_calls: List[Dict[str, Any]] = []
309
+ for _tool_call in tool_calls_data:
310
+ _index = _tool_call.get("index", 0)
311
+ _tool_call_id = _tool_call.get("id")
312
+ _tool_call_type = _tool_call.get("type")
313
+ _function_name = _tool_call.get("function", {}).get("name")
314
+ _function_arguments = _tool_call.get("function", {}).get("arguments")
315
+
316
+ if len(tool_calls) <= _index:
317
+ tool_calls.extend([{}] * (_index - len(tool_calls) + 1))
318
+ tool_call_entry = tool_calls[_index]
319
+ if not tool_call_entry:
320
+ tool_call_entry["id"] = _tool_call_id
321
+ tool_call_entry["type"] = _tool_call_type
322
+ tool_call_entry["function"] = {
323
+ "name": _function_name or "",
324
+ "arguments": _function_arguments or "",
325
+ }
326
+ else:
327
+ if _function_name:
328
+ tool_call_entry["function"]["name"] += _function_name
329
+ if _function_arguments:
330
+ tool_call_entry["function"]["arguments"] += _function_arguments
331
+ if _tool_call_id:
332
+ tool_call_entry["id"] = _tool_call_id
333
+ if _tool_call_type:
334
+ tool_call_entry["type"] = _tool_call_type
335
+ return tool_calls
336
+
337
+ def _parse_provider_response(
338
+ self,
339
+ response: Dict[str, Any],
340
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
341
+ ) -> ModelResponse:
342
+ """
343
+ Parse the WatsonX response into a ModelResponse.
344
+ """
345
+ model_response = ModelResponse()
346
+
347
+ # Get response message
348
+ response_message = response["choices"][0]["message"]
349
+ # Parse structured outputs if enabled
350
+ try:
351
+ if (
352
+ response_format is not None
353
+ and isinstance(response_format, type)
354
+ and issubclass(response_format, BaseModel)
355
+ ):
356
+ parsed_object = response_message.parsed # type: ignore
357
+ if parsed_object is not None:
358
+ model_response.parsed = parsed_object
359
+ except Exception as e:
360
+ log_warning(f"Error retrieving structured outputs: {e}")
361
+
362
+ # Add role
363
+ if response_message.get("role") is not None:
364
+ model_response.role = response_message["role"]
365
+
366
+ # Add content
367
+ if response_message.get("content") is not None:
368
+ model_response.content = response_message["content"]
369
+
370
+ # Add tool calls
371
+ if response_message.get("tool_calls") is not None and len(response_message["tool_calls"]) > 0:
372
+ try:
373
+ model_response.tool_calls = response_message["tool_calls"]
374
+ except Exception as e:
375
+ log_warning(f"Error processing tool calls: {e}")
376
+
377
+ if response.get("usage") is not None:
378
+ model_response.response_usage = self._get_metrics(response["usage"])
379
+
380
+ return model_response
381
+
382
+ def _parse_provider_response_delta(self, response_delta: Dict[str, Any]) -> ModelResponse:
383
+ """
384
+ Parse the OpenAI streaming response into a ModelResponse.
385
+ """
386
+ model_response = ModelResponse()
387
+
388
+ if response_delta.get("choices") and len(response_delta["choices"]) > 0:
389
+ choice_delta: Dict[str, Any] = response_delta["choices"][0].get("delta")
390
+
391
+ if choice_delta:
392
+ # Add content
393
+ if choice_delta.get("content") is not None:
394
+ model_response.content = choice_delta["content"]
395
+
396
+ # Add tool calls
397
+ if choice_delta.get("tool_calls") is not None:
398
+ model_response.tool_calls = choice_delta["tool_calls"]
399
+
400
+ # Add usage metrics if present
401
+ if response_delta.get("usage") is not None:
402
+ model_response.response_usage = self._get_metrics(response_delta["usage"])
403
+
404
+ return model_response
405
+
406
+ def _get_metrics(self, response_usage: Dict[str, Any]) -> Metrics:
407
+ """
408
+ Parse the given WatsonX usage into an Agno Metrics object.
409
+
410
+ Args:
411
+ response_usage: Usage data from WatsonX
412
+
413
+ Returns:
414
+ Metrics: Parsed metrics data
415
+ """
416
+ metrics = Metrics()
417
+
418
+ metrics.input_tokens = response_usage.get("prompt_tokens") or 0
419
+ metrics.output_tokens = response_usage.get("completion_tokens") or 0
420
+ metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
421
+
422
+ return metrics
@@ -0,0 +1,3 @@
1
+ from agno.models.internlm.internlm import InternLM
2
+
3
+ __all__ = ["InternLM"]
@@ -0,0 +1,26 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Optional
4
+
5
+ from agno.models.openai.like import OpenAILike
6
+
7
+
8
+ @dataclass
9
+ class InternLM(OpenAILike):
10
+ """
11
+ Class for interacting with the InternLM API.
12
+
13
+ Attributes:
14
+ id (str): The ID of the language model. Defaults to "internlm2.5-latest".
15
+ name (str): The name of the model. Defaults to "InternLM".
16
+ provider (str): The provider of the model. Defaults to "InternLM".
17
+ api_key (Optional[str]): The API key for the InternLM API.
18
+ base_url (Optional[str]): The base URL for the InternLM API.
19
+ """
20
+
21
+ id: str = "internlm2.5-latest"
22
+ name: str = "InternLM"
23
+ provider: str = "InternLM"
24
+
25
+ api_key: Optional[str] = field(default_factory=lambda: getenv("INTERNLM_API_KEY"))
26
+ base_url: Optional[str] = "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/chat/completions"
@@ -0,0 +1 @@
1
+ from agno.models.langdb.langdb import LangDB
@@ -0,0 +1,48 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Any, Dict, Optional
4
+
5
+ from agno.models.openai.like import OpenAILike
6
+
7
+
8
+ @dataclass
9
+ class LangDB(OpenAILike):
10
+ """
11
+ A class for using models hosted on LangDB.
12
+
13
+ Attributes:
14
+ id (str): The model id. Defaults to "gpt-4o".
15
+ name (str): The model name. Defaults to "LangDB".
16
+ provider (str): The provider name. Defaults to "LangDB".
17
+ api_key (Optional[str]): The API key. Defaults to getenv("LANGDB_API_KEY").
18
+ project_id (Optional[str]): The project id. Defaults to None.
19
+ """
20
+
21
+ id: str = "gpt-4o"
22
+ name: str = "LangDB"
23
+ provider: str = "LangDB"
24
+
25
+ api_key: Optional[str] = field(default_factory=lambda: getenv("LANGDB_API_KEY"))
26
+ project_id: Optional[str] = field(default_factory=lambda: getenv("LANGDB_PROJECT_ID"))
27
+
28
+ base_host_url: str = field(default_factory=lambda: getenv("LANGDB_API_BASE_URL", "https://api.us-east-1.langdb.ai"))
29
+
30
+ base_url: Optional[str] = None
31
+ label: Optional[str] = None
32
+ default_headers: Optional[dict] = None
33
+
34
+ def _get_client_params(self) -> Dict[str, Any]:
35
+ if not self.project_id:
36
+ raise ValueError("LANGDB_PROJECT_ID not set in the environment")
37
+
38
+ if not self.base_url:
39
+ self.base_url = f"{self.base_host_url}/{self.project_id}/v1"
40
+
41
+ # Initialize headers with label if present
42
+ if self.label and not self.default_headers:
43
+ self.default_headers = {
44
+ "x-label": self.label,
45
+ }
46
+
47
+ client_params = super()._get_client_params()
48
+ return client_params
@@ -0,0 +1,14 @@
1
+ from agno.models.litellm.chat import LiteLLM
2
+
3
+ try:
4
+ from agno.models.litellm.litellm_openai import LiteLLMOpenAI
5
+ except ImportError:
6
+
7
+ class LiteLLMOpenAI: # type: ignore
8
+ def __init__(self, *args, **kwargs):
9
+ raise ImportError("`openai` not installed. Please install using `pip install openai`")
10
+
11
+
12
+ __all__ = [
13
+ "LiteLLM",
14
+ ]