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/tools/zep.py ADDED
@@ -0,0 +1,454 @@
1
+ import uuid
2
+ from os import getenv
3
+ from textwrap import dedent
4
+ from typing import Any, List, Optional
5
+
6
+ from agno.tools import Toolkit
7
+ from agno.utils.log import log_debug, log_error, log_warning
8
+
9
+ try:
10
+ from zep_cloud import (
11
+ BadRequestError,
12
+ NotFoundError,
13
+ )
14
+ from zep_cloud import (
15
+ Message as ZepMessage,
16
+ )
17
+ from zep_cloud.client import AsyncZep, Zep
18
+ except ImportError:
19
+ raise ImportError("`zep-cloud` package not found. Please install it with `pip install zep-cloud`")
20
+
21
+ DEFAULT_INSTRUCTIONS = dedent(
22
+ """\
23
+ You have access to the users memories stored in Zep. You can interact with them using the following tools:
24
+ - `add_zep_message`: Add a message to the Zep session memory. Use this to add messages to the Zep session memory.
25
+ - `get_zep_memory`: Get the memory for the current Zep session. Use this to get the memory for the current Zep session.
26
+ - `search_zep_memory`: Search the Zep user graph for relevant facts. Use this to search the Zep user graph for relevant facts.
27
+
28
+ Guidelines:
29
+ - Use `add_zep_message` tool to add relevant messages to the users memories. You can use this tool multiple times to add multiple messages.
30
+ - Use `get_zep_memory` tool to get the memory for the current Zep session for additional context. This will give you a entire context of the user's memories with relevant facts.
31
+ - Use `search_zep_memory` tool to search the Zep user memories for relevant facts. This will give you a list of relevant facts.
32
+ """
33
+ )
34
+
35
+
36
+ class ZepTools(Toolkit):
37
+ def __init__(
38
+ self,
39
+ session_id: Optional[str] = None,
40
+ user_id: Optional[str] = None,
41
+ api_key: Optional[str] = None,
42
+ ignore_assistant_messages: bool = False,
43
+ enable_add_zep_message: bool = True,
44
+ enable_get_zep_memory: bool = True,
45
+ enable_search_zep_memory: bool = True,
46
+ instructions: Optional[str] = None,
47
+ add_instructions: bool = False,
48
+ all: bool = False,
49
+ **kwargs,
50
+ ):
51
+ self._api_key = api_key or getenv("ZEP_API_KEY")
52
+ if not self._api_key:
53
+ raise ValueError(
54
+ "No Zep API key provided. Please set the ZEP_API_KEY environment variable or pass it to the ZepTools constructor."
55
+ )
56
+
57
+ if instructions is None:
58
+ self.instructions = "<Memory Instructions>\n" + DEFAULT_INSTRUCTIONS + "\n</Memory Instructions>"
59
+ else:
60
+ self.instructions = instructions
61
+
62
+ self.zep_client: Optional[Zep] = None
63
+ self._initialized = False
64
+
65
+ self.session_id_provided = session_id
66
+ self.user_id_provided = user_id
67
+ self.ignore_assistant_messages = ignore_assistant_messages
68
+
69
+ self.session_id: Optional[str] = None
70
+ self.user_id: Optional[str] = None
71
+
72
+ self.initialize()
73
+
74
+ tools: List[Any] = []
75
+ if enable_add_zep_message or all:
76
+ tools.append(self.add_zep_message)
77
+ if enable_get_zep_memory or all:
78
+ tools.append(self.get_zep_memory)
79
+ if enable_search_zep_memory or all:
80
+ tools.append(self.search_zep_memory)
81
+
82
+ super().__init__(
83
+ name="zep_tools", instructions=self.instructions, add_instructions=add_instructions, tools=tools, **kwargs
84
+ )
85
+
86
+ def initialize(self) -> bool:
87
+ """
88
+ Initialize the Zep client and ensure session/user setup.
89
+ """
90
+ if self._initialized:
91
+ return True
92
+
93
+ try:
94
+ self.zep_client = Zep(api_key=self._api_key)
95
+
96
+ # Handle session_id generation/validation
97
+ self.session_id = self.session_id_provided
98
+ if not self.session_id:
99
+ self.session_id = f"{uuid.uuid4()}"
100
+ log_debug(f"Generated new session ID: {self.session_id}")
101
+
102
+ # Handle user_id generation/validation and Zep user check/creation
103
+ self.user_id = self.user_id_provided
104
+ if not self.user_id:
105
+ self.user_id = f"user-{uuid.uuid4()}"
106
+ log_debug(f"Creating new default Zep user: {self.user_id}")
107
+ self.zep_client.user.add(user_id=self.user_id) # type: ignore
108
+ else:
109
+ try:
110
+ self.zep_client.user.get(self.user_id) # type: ignore
111
+ log_debug(f"Confirmed provided Zep user exists: {self.user_id}")
112
+ except NotFoundError:
113
+ try:
114
+ self.zep_client.user.add(user_id=self.user_id) # type: ignore
115
+ except BadRequestError as add_err:
116
+ log_error(f"Failed to create provided user {self.user_id}: {add_err}")
117
+ self.zep_client = None # Reset client on failure
118
+ return False # Initialization failed
119
+
120
+ # Create session associated with the user
121
+ try:
122
+ self.zep_client.thread.create(thread_id=self.session_id, user_id=self.user_id) # type: ignore
123
+ log_debug(f"Created session {self.session_id} for user {self.user_id}")
124
+ except Exception as e:
125
+ log_debug(f"Session may already exist: {e}")
126
+
127
+ self._initialized = True
128
+ return True
129
+
130
+ except Exception as e:
131
+ log_error(f"Failed to initialize ZepTools: {e}")
132
+ self.zep_client = None
133
+ self._initialized = False
134
+ return False
135
+
136
+ def add_zep_message(self, role: str, content: str) -> str:
137
+ """
138
+ Adds a message to the current Zep session memory.
139
+ Args:
140
+ role (str): The role of the message sender (e.g., 'user', 'assistant', 'system').
141
+ content (str): The text content of the message.
142
+
143
+ Returns:
144
+ A confirmation message or an error string.
145
+ """
146
+ if not self.zep_client or not self.session_id:
147
+ log_error("Zep client or session ID not initialized. Cannot add message.")
148
+ return "Error: Zep client/session not initialized."
149
+
150
+ try:
151
+ zep_message = ZepMessage(
152
+ role=role,
153
+ content=content,
154
+ role_type=role,
155
+ )
156
+
157
+ # Prepare ignore_roles if needed
158
+ ignore_roles_list = ["assistant"] if self.ignore_assistant_messages else None
159
+
160
+ # Add message to Zep memory
161
+ self.zep_client.thread.add_messages( # type: ignore
162
+ thread_id=self.session_id,
163
+ messages=[zep_message],
164
+ ignore_roles=ignore_roles_list,
165
+ )
166
+ return f"Message from '{role}' added successfully to session {self.session_id}."
167
+ except Exception as e:
168
+ error_msg = f"Failed to add message to Zep session {self.session_id}: {e}"
169
+ log_error(error_msg)
170
+ return f"Error adding message: {e}"
171
+
172
+ def get_zep_memory(self, memory_type: str = "context") -> str:
173
+ """
174
+ Retrieves the memory for the current Zep session.
175
+ Args:
176
+ memory_type: The type of memory to retrieve ('context', 'messages').
177
+ Returns:
178
+ The requested memory content as a string, or an error string.
179
+ """
180
+ if not self.zep_client or not self.session_id:
181
+ log_error("Zep client or session ID not initialized. Cannot get memory.")
182
+ return "Error: Zep client/session not initialized."
183
+
184
+ try:
185
+ log_debug(f"Getting Zep memory for session {self.session_id}")
186
+
187
+ if memory_type == "context":
188
+ # Ensure context is a string
189
+ user_context = self.zep_client.thread.get_user_context(thread_id=self.session_id, mode="basic") # type: ignore
190
+ log_debug(f"Memory data: {user_context}")
191
+ return user_context.context or "No context available."
192
+ elif memory_type == "messages":
193
+ messages_list = self.zep_client.thread.get(thread_id=self.session_id) # type: ignore
194
+ # Ensure messages string representation is returned
195
+ return str(messages_list.messages) if messages_list.messages else "No messages available."
196
+ else:
197
+ warning_msg = f"Unsupported memory_type requested: {memory_type}. Returning empty string."
198
+ log_warning(warning_msg)
199
+ return warning_msg
200
+
201
+ except Exception as e:
202
+ log_error(f"Failed to get Zep memory for session {self.session_id}: {e}")
203
+ return f"Error getting memory for session {self.session_id}"
204
+
205
+ def search_zep_memory(self, query: str, search_scope: str = "edges") -> str:
206
+ """
207
+ Searches the Zep knowledge graph for relevant facts or nodes.
208
+ Args:
209
+ query: The search term to find relevant facts or nodes.
210
+ search_scope: The scope of the search to perform. Can be "edges" (for facts) or "nodes".
211
+ Returns:
212
+ A string of the search result
213
+ """
214
+ # Graph search is built on user_id not on session_id
215
+ if not self.zep_client or not self.user_id:
216
+ log_error("Zep client or user ID not initialized. Cannot search graph.")
217
+ return "Error: Zep client/user not initialized."
218
+
219
+ try:
220
+ search_response = self.zep_client.graph.search(
221
+ query=query,
222
+ user_id=self.user_id,
223
+ scope=search_scope, # Can be "edges" or "nodes"
224
+ )
225
+
226
+ if search_scope == "edges" and search_response.edges:
227
+ # Return facts from edges
228
+ facts_str = "\n".join([f"- {edge.fact}" for edge in search_response.edges])
229
+ return f"Found {len(search_response.edges)} facts:\n{facts_str}"
230
+ elif search_scope == "nodes" and search_response.nodes:
231
+ # Return node summaries
232
+ nodes_str = "\n".join([f"- {node.name}: {node.summary}" for node in search_response.nodes])
233
+ return f"Found {len(search_response.nodes)} nodes:\n{nodes_str}"
234
+ else:
235
+ return f"No {search_scope} found for query: {query}"
236
+
237
+ except Exception as e:
238
+ log_error(f"Failed to search Zep graph for user {self.user_id}: {e}")
239
+ return f"Error searching graph: {e}"
240
+
241
+
242
+ class ZepAsyncTools(Toolkit):
243
+ def __init__(
244
+ self,
245
+ session_id: Optional[str] = None,
246
+ user_id: Optional[str] = None,
247
+ api_key: Optional[str] = None,
248
+ ignore_assistant_messages: bool = False,
249
+ add_zep_message: bool = True,
250
+ get_zep_memory: bool = True,
251
+ search_zep_memory: bool = True,
252
+ instructions: Optional[str] = None,
253
+ add_instructions: bool = False,
254
+ **kwargs,
255
+ ):
256
+ self._api_key = api_key or getenv("ZEP_API_KEY")
257
+ if not self._api_key:
258
+ raise ValueError(
259
+ "No Zep API key provided. Please set the ZEP_API_KEY environment variable or pass it to the ZepTools constructor."
260
+ )
261
+
262
+ if instructions is None:
263
+ self.instructions = "<Memory Instructions>\n" + DEFAULT_INSTRUCTIONS + "\n</Memory Instructions>"
264
+ else:
265
+ self.instructions = instructions
266
+
267
+ self.zep_client: Optional[AsyncZep] = None
268
+ self._initialized = False
269
+
270
+ self.session_id_provided = session_id
271
+ self.user_id_provided = user_id
272
+ self.ignore_assistant_messages = ignore_assistant_messages
273
+
274
+ self.session_id: Optional[str] = None
275
+ self.user_id: Optional[str] = None
276
+
277
+ self._initialized = False
278
+
279
+ # Register methods as tools conditionally
280
+ tools = []
281
+ if add_zep_message:
282
+ tools.append(self.add_zep_message)
283
+ if get_zep_memory:
284
+ tools.append(self.get_zep_memory) # type: ignore
285
+ if search_zep_memory:
286
+ tools.append(self.search_zep_memory) # type: ignore
287
+
288
+ super().__init__(
289
+ name="zep_tools", instructions=self.instructions, add_instructions=add_instructions, tools=tools, **kwargs
290
+ )
291
+
292
+ async def initialize(self) -> bool:
293
+ """
294
+ Initialize the AsyncZep client and ensure session/user setup.
295
+ """
296
+ if self._initialized:
297
+ return True
298
+
299
+ try:
300
+ self.zep_client = AsyncZep(api_key=self._api_key)
301
+
302
+ # Handle session_id generation/validation
303
+ self.session_id = self.session_id_provided
304
+ if not self.session_id:
305
+ self.session_id = f"{uuid.uuid4()}"
306
+ log_debug(f"Generated new session ID: {self.session_id}")
307
+
308
+ # Handle user_id generation/validation and Zep user check/creation
309
+ self.user_id = self.user_id_provided
310
+ if not self.user_id:
311
+ self.user_id = f"user-{uuid.uuid4()}"
312
+ log_debug(f"Creating new default Zep user: {self.user_id}")
313
+ await self.zep_client.user.add(user_id=self.user_id) # type: ignore
314
+ else:
315
+ try:
316
+ await self.zep_client.user.get(self.user_id) # type: ignore
317
+ log_debug(f"Confirmed provided Zep user exists: {self.user_id}")
318
+ except NotFoundError:
319
+ try:
320
+ await self.zep_client.user.add(user_id=self.user_id) # type: ignore
321
+ except BadRequestError as add_err:
322
+ log_error(f"Failed to create provided user {self.user_id}: {add_err}")
323
+ self.zep_client = None # Reset client on failure
324
+ return False # Initialization failed
325
+
326
+ # Create session associated with the user
327
+ try:
328
+ await self.zep_client.thread.create(thread_id=self.session_id, user_id=self.user_id) # type: ignore
329
+ log_debug(f"Created session {self.session_id} for user {self.user_id}")
330
+ except Exception as e:
331
+ log_debug(f"Session may already exist: {e}")
332
+
333
+ self._initialized = True
334
+ return True
335
+
336
+ except Exception as e:
337
+ log_error(f"Failed to initialize ZepTools: {e}")
338
+ self.zep_client = None
339
+ self._initialized = False
340
+ return False
341
+
342
+ async def add_zep_message(self, role: str, content: str) -> str:
343
+ """
344
+ Adds a message to the current Zep session memory.
345
+ Args:
346
+ role (str): The role of the message sender (e.g., 'user', 'assistant', 'system').
347
+ content (str): The text content of the message.
348
+
349
+ Returns:
350
+ A confirmation message or an error string.
351
+ """
352
+ if not self._initialized:
353
+ await self.initialize()
354
+
355
+ if not self.zep_client or not self.session_id:
356
+ log_error("Zep client or session ID not initialized. Cannot add message.")
357
+ return "Error: Zep client/session not initialized."
358
+
359
+ try:
360
+ zep_message = ZepMessage(
361
+ role=role,
362
+ content=content,
363
+ role_type=role,
364
+ )
365
+
366
+ # Prepare ignore_roles if needed
367
+ ignore_roles_list = ["assistant"] if self.ignore_assistant_messages else None
368
+
369
+ # Add message to Zep memory
370
+ await self.zep_client.thread.add_messages( # type: ignore
371
+ thread_id=self.session_id,
372
+ messages=[zep_message],
373
+ ignore_roles=ignore_roles_list,
374
+ )
375
+ return f"Message from '{role}' added successfully to session {self.session_id}."
376
+ except Exception as e:
377
+ error_msg = f"Failed to add message to Zep session {self.session_id}: {e}"
378
+ log_error(error_msg)
379
+ return f"Error adding message: {e}"
380
+
381
+ async def get_zep_memory(self, memory_type: str = "context") -> str:
382
+ """
383
+ Retrieves the memory for the current Zep session.
384
+ Args:
385
+ memory_type: The type of memory to retrieve ('context', 'messages').
386
+ Returns:
387
+ The requested memory content as a string, or an error string.
388
+ """
389
+ if not self._initialized:
390
+ await self.initialize()
391
+
392
+ if not self.zep_client or not self.session_id:
393
+ log_error("Zep client or session ID not initialized. Cannot get memory.")
394
+ return "Error: Zep client/session not initialized."
395
+
396
+ try:
397
+ if memory_type == "context":
398
+ # Ensure context is a string
399
+ user_context = await self.zep_client.thread.get_user_context(thread_id=self.session_id, mode="basic") # type: ignore
400
+ log_debug(f"Memory data: {user_context}")
401
+ return user_context.context or "No context available."
402
+ elif memory_type == "messages":
403
+ # Ensure messages string representation is returned
404
+ messages_list = await self.zep_client.thread.get(thread_id=self.session_id) # type: ignore
405
+ return str(messages_list.messages) if messages_list.messages else "No messages available."
406
+ else:
407
+ warning_msg = f"Unsupported memory_type requested: {memory_type}. Returning context."
408
+ log_warning(warning_msg)
409
+ return "No context available."
410
+
411
+ except Exception as e:
412
+ error_msg = f"Failed to get Zep memory for session {self.session_id}: {e}"
413
+ log_error(error_msg)
414
+ return f"Error getting memory: {e}"
415
+
416
+ async def search_zep_memory(self, query: str, scope: str = "edges", limit: int = 5) -> str:
417
+ """
418
+ Searches the Zep knowledge graph for relevant facts or nodes.
419
+ Args:
420
+ query: The search term to find relevant facts or nodes.
421
+ scope: The scope of the search to perform. Can be "edges" (for facts) or "nodes".
422
+ limit: The maximum number of results to return.
423
+ Returns:
424
+ A string of the search result
425
+ """
426
+ if not self._initialized:
427
+ await self.initialize()
428
+
429
+ if not self.zep_client or not self.user_id:
430
+ log_error("Zep client or user ID not initialized. Cannot search graph.")
431
+ return "Error: Zep client/user not initialized."
432
+
433
+ try:
434
+ search_response = await self.zep_client.graph.search( # type: ignore
435
+ query=query,
436
+ user_id=self.user_id,
437
+ scope=scope, # Can be "edges" or "nodes"
438
+ limit=limit,
439
+ )
440
+
441
+ if scope == "edges" and search_response.edges:
442
+ # Return facts from edges
443
+ facts_str = "\n".join([f"- {edge.fact}" for edge in search_response.edges])
444
+ return f"Found {len(search_response.edges)} facts:\n{facts_str}"
445
+ elif scope == "nodes" and search_response.nodes:
446
+ # Return node summaries
447
+ nodes_str = "\n".join([f"- {node.name}: {node.summary}" for node in search_response.nodes])
448
+ return f"Found {len(search_response.nodes)} nodes:\n{nodes_str}"
449
+ else:
450
+ return f"No {scope} found for query: {query}"
451
+
452
+ except Exception as e:
453
+ log_error(f"Failed to search Zep graph for user {self.user_id}: {e}")
454
+ return f"Error searching graph: {e}"