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.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +51 -0
- agno/agent/agent.py +10405 -0
- agno/api/__init__.py +0 -0
- agno/api/agent.py +28 -0
- agno/api/api.py +40 -0
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +13 -0
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +16 -0
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/response.py +6 -0
- agno/api/schemas/team.py +16 -0
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +30 -0
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +598 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2042 -0
- agno/db/dynamo/schemas.py +314 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1795 -0
- agno/db/firestore/schemas.py +140 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1335 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1160 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1328 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/__init__.py +0 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2026 -0
- agno/db/mongo/mongo.py +1982 -0
- agno/db/mongo/schemas.py +87 -0
- agno/db/mongo/utils.py +259 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +2308 -0
- agno/db/mysql/schemas.py +138 -0
- agno/db/mysql/utils.py +355 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +1927 -0
- agno/db/postgres/postgres.py +2260 -0
- agno/db/postgres/schemas.py +139 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1660 -0
- agno/db/redis/schemas.py +123 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/schemas/metrics.py +0 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +130 -0
- agno/db/singlestore/singlestore.py +2272 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2293 -0
- agno/db/sqlite/schemas.py +133 -0
- agno/db/sqlite/sqlite.py +2288 -0
- agno/db/sqlite/utils.py +431 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1353 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +116 -0
- agno/debug.py +18 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +834 -0
- agno/eval/performance.py +773 -0
- agno/eval/reliability.py +306 -0
- agno/eval/utils.py +119 -0
- agno/exceptions.py +161 -0
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/__init__.py +0 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -0
- agno/knowledge/chunking/__init__.py +0 -0
- agno/knowledge/chunking/agentic.py +79 -0
- agno/knowledge/chunking/document.py +91 -0
- agno/knowledge/chunking/fixed.py +57 -0
- agno/knowledge/chunking/markdown.py +151 -0
- agno/knowledge/chunking/recursive.py +63 -0
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +86 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/knowledge/document/base.py +58 -0
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/knowledge/embedder/base.py +23 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/knowledge/embedder/fireworks.py +13 -0
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/knowledge/embedder/together.py +13 -0
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +1988 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +166 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +87 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +115 -0
- agno/knowledge/reader/web_search_reader.py +372 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/__init__.py +0 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/reranker/base.py +14 -0
- agno/knowledge/reranker/cohere.py +64 -0
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +189 -0
- agno/media.py +462 -0
- agno/memory/__init__.py +3 -0
- agno/memory/manager.py +1327 -0
- agno/models/__init__.py +0 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +45 -0
- agno/models/anthropic/__init__.py +5 -0
- agno/models/anthropic/claude.py +757 -0
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +701 -0
- agno/models/aws/claude.py +378 -0
- agno/models/azure/__init__.py +18 -0
- agno/models/azure/ai_foundry.py +485 -0
- agno/models/azure/openai_chat.py +131 -0
- agno/models/base.py +2175 -0
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +501 -0
- agno/models/cerebras/cerebras_openai.py +112 -0
- agno/models/cohere/__init__.py +5 -0
- agno/models/cohere/chat.py +389 -0
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +91 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +28 -0
- agno/models/deepseek/__init__.py +5 -0
- agno/models/deepseek/deepseek.py +61 -0
- agno/models/defaults.py +1 -0
- agno/models/fireworks/__init__.py +5 -0
- agno/models/fireworks/fireworks.py +26 -0
- agno/models/google/__init__.py +5 -0
- agno/models/google/gemini.py +1085 -0
- agno/models/groq/__init__.py +5 -0
- agno/models/groq/groq.py +556 -0
- agno/models/huggingface/__init__.py +5 -0
- agno/models/huggingface/huggingface.py +491 -0
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +422 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +26 -0
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +48 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +468 -0
- agno/models/litellm/litellm_openai.py +25 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +434 -0
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +475 -0
- agno/models/meta/llama_openai.py +78 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +5 -0
- agno/models/mistral/mistral.py +432 -0
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +54 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +5 -0
- agno/models/nvidia/nvidia.py +28 -0
- agno/models/ollama/__init__.py +5 -0
- agno/models/ollama/chat.py +441 -0
- agno/models/openai/__init__.py +9 -0
- agno/models/openai/chat.py +883 -0
- agno/models/openai/like.py +27 -0
- agno/models/openai/responses.py +1050 -0
- agno/models/openrouter/__init__.py +5 -0
- agno/models/openrouter/openrouter.py +66 -0
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +187 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +81 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +199 -0
- agno/models/sambanova/__init__.py +5 -0
- agno/models/sambanova/sambanova.py +28 -0
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/__init__.py +5 -0
- agno/models/together/together.py +25 -0
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +26 -0
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +70 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +78 -0
- agno/models/xai/__init__.py +3 -0
- agno/models/xai/xai.py +113 -0
- agno/os/__init__.py +3 -0
- agno/os/app.py +876 -0
- agno/os/auth.py +57 -0
- agno/os/config.py +104 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +144 -0
- agno/os/interfaces/agui/utils.py +534 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +211 -0
- agno/os/interfaces/whatsapp/security.py +53 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +292 -0
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +1763 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +430 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +162 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +997 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +515 -0
- agno/os/routers/memory/schemas.py +62 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/schema.py +1055 -0
- agno/os/settings.py +43 -0
- agno/os/utils.py +630 -0
- agno/py.typed +0 -0
- agno/reasoning/__init__.py +0 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +63 -0
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +31 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +787 -0
- agno/run/base.py +229 -0
- agno/run/cancel.py +81 -0
- agno/run/messages.py +32 -0
- agno/run/team.py +753 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +295 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +392 -0
- agno/session/workflow.py +205 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +8793 -0
- agno/tools/__init__.py +10 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +69 -0
- agno/tools/api.py +122 -0
- agno/tools/apify.py +314 -0
- agno/tools/arxiv.py +127 -0
- agno/tools/aws_lambda.py +53 -0
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +89 -0
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +255 -0
- agno/tools/calculator.py +151 -0
- agno/tools/cartesia.py +187 -0
- agno/tools/clickup.py +244 -0
- agno/tools/confluence.py +240 -0
- agno/tools/crawl4ai.py +158 -0
- agno/tools/csv_toolkit.py +185 -0
- agno/tools/dalle.py +110 -0
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +262 -0
- agno/tools/desi_vocal.py +108 -0
- agno/tools/discord.py +161 -0
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +379 -0
- agno/tools/duckduckgo.py +91 -0
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +196 -0
- agno/tools/email.py +67 -0
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +396 -0
- agno/tools/fal.py +127 -0
- agno/tools/file.py +240 -0
- agno/tools/file_generation.py +350 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +143 -0
- agno/tools/function.py +1187 -0
- agno/tools/giphy.py +93 -0
- agno/tools/github.py +1760 -0
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +270 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +674 -0
- agno/tools/googlesearch.py +98 -0
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +77 -0
- agno/tools/jina.py +101 -0
- agno/tools/jira.py +170 -0
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +426 -0
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +90 -0
- agno/tools/lumalab.py +183 -0
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memori.py +339 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +139 -0
- agno/tools/models/__init__.py +0 -0
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +195 -0
- agno/tools/moviepy_video.py +349 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +46 -0
- agno/tools/newspaper4k.py +93 -0
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +202 -0
- agno/tools/openbb.py +160 -0
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +102 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +257 -0
- agno/tools/pubmed.py +188 -0
- agno/tools/python.py +205 -0
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +467 -0
- agno/tools/replicate.py +117 -0
- agno/tools/resend.py +62 -0
- agno/tools/scrapegraph.py +222 -0
- agno/tools/searxng.py +152 -0
- agno/tools/serpapi.py +116 -0
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +53 -0
- agno/tools/slack.py +136 -0
- agno/tools/sleep.py +20 -0
- agno/tools/spider.py +116 -0
- agno/tools/sql.py +154 -0
- agno/tools/streamlit/__init__.py +0 -0
- agno/tools/streamlit/components.py +113 -0
- agno/tools/tavily.py +254 -0
- agno/tools/telegram.py +48 -0
- agno/tools/todoist.py +218 -0
- agno/tools/tool_registry.py +1 -0
- agno/tools/toolkit.py +146 -0
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +274 -0
- agno/tools/twilio.py +186 -0
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +54 -0
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +63 -0
- agno/tools/workflow.py +278 -0
- agno/tools/x.py +335 -0
- agno/tools/yfinance.py +257 -0
- agno/tools/youtube.py +184 -0
- agno/tools/zendesk.py +82 -0
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +382 -0
- agno/utils/__init__.py +0 -0
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +49 -0
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +132 -0
- agno/utils/dttm.py +13 -0
- agno/utils/enum.py +22 -0
- agno/utils/env.py +11 -0
- agno/utils/events.py +696 -0
- agno/utils/format_str.py +16 -0
- agno/utils/functions.py +166 -0
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +74 -0
- agno/utils/json_schema.py +234 -0
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +255 -0
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +352 -0
- agno/utils/merge_dict.py +41 -0
- agno/utils/message.py +118 -0
- agno/utils/models/__init__.py +0 -0
- agno/utils/models/ai_foundry.py +43 -0
- agno/utils/models/claude.py +358 -0
- agno/utils/models/cohere.py +87 -0
- agno/utils/models/llama.py +78 -0
- agno/utils/models/mistral.py +98 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +32 -0
- agno/utils/pprint.py +178 -0
- agno/utils/print_response/__init__.py +0 -0
- agno/utils/print_response/agent.py +842 -0
- agno/utils/print_response/team.py +1724 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/response_iterator.py +17 -0
- agno/utils/safe_formatter.py +24 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +22 -0
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +231 -0
- agno/utils/team.py +139 -0
- agno/utils/timer.py +41 -0
- agno/utils/tools.py +102 -0
- agno/utils/web.py +23 -0
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +25 -0
- agno/vectordb/__init__.py +3 -0
- agno/vectordb/base.py +127 -0
- agno/vectordb/cassandra/__init__.py +5 -0
- agno/vectordb/cassandra/cassandra.py +501 -0
- agno/vectordb/cassandra/extra_param_mixin.py +11 -0
- agno/vectordb/cassandra/index.py +13 -0
- agno/vectordb/chroma/__init__.py +5 -0
- agno/vectordb/chroma/chromadb.py +929 -0
- agno/vectordb/clickhouse/__init__.py +9 -0
- agno/vectordb/clickhouse/clickhousedb.py +835 -0
- agno/vectordb/clickhouse/index.py +9 -0
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1442 -0
- agno/vectordb/distance.py +7 -0
- agno/vectordb/lancedb/__init__.py +6 -0
- agno/vectordb/lancedb/lance_db.py +995 -0
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +4 -0
- agno/vectordb/milvus/milvus.py +1182 -0
- agno/vectordb/mongodb/__init__.py +9 -0
- agno/vectordb/mongodb/mongodb.py +1417 -0
- agno/vectordb/pgvector/__init__.py +12 -0
- agno/vectordb/pgvector/index.py +23 -0
- agno/vectordb/pgvector/pgvector.py +1462 -0
- agno/vectordb/pineconedb/__init__.py +5 -0
- agno/vectordb/pineconedb/pineconedb.py +747 -0
- agno/vectordb/qdrant/__init__.py +5 -0
- agno/vectordb/qdrant/qdrant.py +1134 -0
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/search.py +7 -0
- agno/vectordb/singlestore/__init__.py +10 -0
- agno/vectordb/singlestore/index.py +41 -0
- agno/vectordb/singlestore/singlestore.py +763 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +699 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1005 -0
- agno/workflow/__init__.py +23 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +738 -0
- agno/workflow/loop.py +735 -0
- agno/workflow/parallel.py +824 -0
- agno/workflow/router.py +702 -0
- agno/workflow/step.py +1432 -0
- agno/workflow/steps.py +592 -0
- agno/workflow/types.py +520 -0
- agno/workflow/workflow.py +4321 -0
- agno-2.2.13.dist-info/METADATA +614 -0
- agno-2.2.13.dist-info/RECORD +575 -0
- agno-2.2.13.dist-info/WHEEL +5 -0
- agno-2.2.13.dist-info/licenses/LICENSE +201 -0
- 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}"
|