agno 0.1.2__py3-none-any.whl → 2.3.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 +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- 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/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -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 +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -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 +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -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 +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- 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/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- 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/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -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 +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -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 +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- 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 +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -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 +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -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 +249 -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 +147 -0
- agno/os/interfaces/agui/utils.py +574 -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 +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -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 +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -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/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -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 +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- 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 +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- 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/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- 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 +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- 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 +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -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 +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -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/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- 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 +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -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 +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/memory/db/sqlite.py
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
|
|
4
|
-
try:
|
|
5
|
-
from sqlalchemy import (
|
|
6
|
-
Column,
|
|
7
|
-
DateTime,
|
|
8
|
-
Engine,
|
|
9
|
-
MetaData,
|
|
10
|
-
String,
|
|
11
|
-
Table,
|
|
12
|
-
create_engine,
|
|
13
|
-
delete,
|
|
14
|
-
inspect,
|
|
15
|
-
select,
|
|
16
|
-
text,
|
|
17
|
-
)
|
|
18
|
-
from sqlalchemy.exc import SQLAlchemyError
|
|
19
|
-
from sqlalchemy.orm import scoped_session, sessionmaker
|
|
20
|
-
except ImportError:
|
|
21
|
-
raise ImportError("`sqlalchemy` not installed. Please install it with `pip install sqlalchemy`")
|
|
22
|
-
|
|
23
|
-
from agno.memory.db import MemoryDb
|
|
24
|
-
from agno.memory.row import MemoryRow
|
|
25
|
-
from agno.utils.log import logger
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class SqliteMemoryDb(MemoryDb):
|
|
29
|
-
def __init__(
|
|
30
|
-
self,
|
|
31
|
-
table_name: str = "memory",
|
|
32
|
-
db_url: Optional[str] = None,
|
|
33
|
-
db_file: Optional[str] = None,
|
|
34
|
-
db_engine: Optional[Engine] = None,
|
|
35
|
-
):
|
|
36
|
-
"""
|
|
37
|
-
This class provides a memory store backed by a SQLite table.
|
|
38
|
-
|
|
39
|
-
The following order is used to determine the database connection:
|
|
40
|
-
1. Use the db_engine if provided
|
|
41
|
-
2. Use the db_url
|
|
42
|
-
3. Use the db_file
|
|
43
|
-
4. Create a new in-memory database
|
|
44
|
-
|
|
45
|
-
Args:
|
|
46
|
-
table_name: The name of the table to store Agent sessions.
|
|
47
|
-
db_url: The database URL to connect to.
|
|
48
|
-
db_file: The database file to connect to.
|
|
49
|
-
db_engine: The database engine to use.
|
|
50
|
-
"""
|
|
51
|
-
_engine: Optional[Engine] = db_engine
|
|
52
|
-
if _engine is None and db_url is not None:
|
|
53
|
-
_engine = create_engine(db_url)
|
|
54
|
-
elif _engine is None and db_file is not None:
|
|
55
|
-
# Use the db_file to create the engine
|
|
56
|
-
db_path = Path(db_file).resolve()
|
|
57
|
-
# Ensure the directory exists
|
|
58
|
-
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
59
|
-
_engine = create_engine(f"sqlite:///{db_path}")
|
|
60
|
-
else:
|
|
61
|
-
_engine = create_engine("sqlite://")
|
|
62
|
-
|
|
63
|
-
if _engine is None:
|
|
64
|
-
raise ValueError("Must provide either db_url, db_file or db_engine")
|
|
65
|
-
|
|
66
|
-
# Database attributes
|
|
67
|
-
self.table_name: str = table_name
|
|
68
|
-
self.db_url: Optional[str] = db_url
|
|
69
|
-
self.db_engine: Engine = _engine
|
|
70
|
-
self.metadata: MetaData = MetaData()
|
|
71
|
-
self.inspector = inspect(self.db_engine)
|
|
72
|
-
|
|
73
|
-
# Database session
|
|
74
|
-
self.Session = scoped_session(sessionmaker(bind=self.db_engine))
|
|
75
|
-
# Database table for memories
|
|
76
|
-
self.table: Table = self.get_table()
|
|
77
|
-
|
|
78
|
-
def get_table(self) -> Table:
|
|
79
|
-
return Table(
|
|
80
|
-
self.table_name,
|
|
81
|
-
self.metadata,
|
|
82
|
-
Column("id", String, primary_key=True),
|
|
83
|
-
Column("user_id", String),
|
|
84
|
-
Column("memory", String),
|
|
85
|
-
Column("created_at", DateTime, server_default=text("CURRENT_TIMESTAMP")),
|
|
86
|
-
Column(
|
|
87
|
-
"updated_at", DateTime, server_default=text("CURRENT_TIMESTAMP"), onupdate=text("CURRENT_TIMESTAMP")
|
|
88
|
-
),
|
|
89
|
-
extend_existing=True,
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
def create(self) -> None:
|
|
93
|
-
if not self.table_exists():
|
|
94
|
-
try:
|
|
95
|
-
logger.debug(f"Creating table: {self.table_name}")
|
|
96
|
-
self.table.create(self.db_engine, checkfirst=True)
|
|
97
|
-
except Exception as e:
|
|
98
|
-
logger.error(f"Error creating table '{self.table_name}': {e}")
|
|
99
|
-
raise
|
|
100
|
-
|
|
101
|
-
def memory_exists(self, memory: MemoryRow) -> bool:
|
|
102
|
-
with self.Session() as session:
|
|
103
|
-
stmt = select(self.table.c.id).where(self.table.c.id == memory.id)
|
|
104
|
-
result = session.execute(stmt).first()
|
|
105
|
-
return result is not None
|
|
106
|
-
|
|
107
|
-
def read_memories(
|
|
108
|
-
self, user_id: Optional[str] = None, limit: Optional[int] = None, sort: Optional[str] = None
|
|
109
|
-
) -> List[MemoryRow]:
|
|
110
|
-
memories: List[MemoryRow] = []
|
|
111
|
-
try:
|
|
112
|
-
with self.Session() as session:
|
|
113
|
-
stmt = select(self.table)
|
|
114
|
-
if user_id is not None:
|
|
115
|
-
stmt = stmt.where(self.table.c.user_id == user_id)
|
|
116
|
-
|
|
117
|
-
if sort == "asc":
|
|
118
|
-
stmt = stmt.order_by(self.table.c.created_at.asc())
|
|
119
|
-
else:
|
|
120
|
-
stmt = stmt.order_by(self.table.c.created_at.desc())
|
|
121
|
-
|
|
122
|
-
if limit is not None:
|
|
123
|
-
stmt = stmt.limit(limit)
|
|
124
|
-
|
|
125
|
-
result = session.execute(stmt)
|
|
126
|
-
for row in result:
|
|
127
|
-
memories.append(MemoryRow(id=row.id, user_id=row.user_id, memory=eval(row.memory)))
|
|
128
|
-
except SQLAlchemyError as e:
|
|
129
|
-
logger.debug(f"Exception reading from table: {e}")
|
|
130
|
-
logger.debug(f"Table does not exist: {self.table_name}")
|
|
131
|
-
logger.debug("Creating table for future transactions")
|
|
132
|
-
self.create()
|
|
133
|
-
return memories
|
|
134
|
-
|
|
135
|
-
def upsert_memory(self, memory: MemoryRow, create_and_retry: bool = True) -> None:
|
|
136
|
-
try:
|
|
137
|
-
with self.Session() as session:
|
|
138
|
-
# Check if the memory already exists
|
|
139
|
-
existing = session.execute(select(self.table).where(self.table.c.id == memory.id)).first()
|
|
140
|
-
|
|
141
|
-
if existing:
|
|
142
|
-
# Update existing memory
|
|
143
|
-
stmt = (
|
|
144
|
-
self.table.update()
|
|
145
|
-
.where(self.table.c.id == memory.id)
|
|
146
|
-
.values(user_id=memory.user_id, memory=str(memory.memory), updated_at=text("CURRENT_TIMESTAMP"))
|
|
147
|
-
)
|
|
148
|
-
else:
|
|
149
|
-
# Insert new memory
|
|
150
|
-
stmt = self.table.insert().values(id=memory.id, user_id=memory.user_id, memory=str(memory.memory)) # type: ignore
|
|
151
|
-
|
|
152
|
-
session.execute(stmt)
|
|
153
|
-
session.commit()
|
|
154
|
-
except SQLAlchemyError as e:
|
|
155
|
-
logger.error(f"Exception upserting into table: {e}")
|
|
156
|
-
if not self.table_exists():
|
|
157
|
-
logger.info(f"Table does not exist: {self.table_name}")
|
|
158
|
-
logger.info("Creating table for future transactions")
|
|
159
|
-
self.create()
|
|
160
|
-
if create_and_retry:
|
|
161
|
-
return self.upsert_memory(memory, create_and_retry=False)
|
|
162
|
-
else:
|
|
163
|
-
raise
|
|
164
|
-
|
|
165
|
-
def delete_memory(self, id: str) -> None:
|
|
166
|
-
with self.Session() as session:
|
|
167
|
-
stmt = delete(self.table).where(self.table.c.id == id)
|
|
168
|
-
session.execute(stmt)
|
|
169
|
-
session.commit()
|
|
170
|
-
|
|
171
|
-
def drop_table(self) -> None:
|
|
172
|
-
if self.table_exists():
|
|
173
|
-
logger.debug(f"Deleting table: {self.table_name}")
|
|
174
|
-
self.table.drop(self.db_engine)
|
|
175
|
-
|
|
176
|
-
def table_exists(self) -> bool:
|
|
177
|
-
logger.debug(f"Checking if table exists: {self.table.name}")
|
|
178
|
-
try:
|
|
179
|
-
return self.inspector.has_table(self.table.name)
|
|
180
|
-
except Exception as e:
|
|
181
|
-
logger.error(e)
|
|
182
|
-
return False
|
|
183
|
-
|
|
184
|
-
def clear(self) -> bool:
|
|
185
|
-
with self.Session() as session:
|
|
186
|
-
stmt = delete(self.table)
|
|
187
|
-
session.execute(stmt)
|
|
188
|
-
session.commit()
|
|
189
|
-
return True
|
|
190
|
-
|
|
191
|
-
def __del__(self):
|
|
192
|
-
# self.Session.remove()
|
|
193
|
-
pass
|
agno/memory/memory.py
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, Optional
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class Memory(BaseModel):
|
|
7
|
-
"""Model for Agent Memories"""
|
|
8
|
-
|
|
9
|
-
memory: str
|
|
10
|
-
id: Optional[str] = None
|
|
11
|
-
topic: Optional[str] = None
|
|
12
|
-
input: Optional[str] = None
|
|
13
|
-
|
|
14
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
15
|
-
return self.model_dump(exclude_none=True)
|
agno/memory/row.py
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from datetime import datetime
|
|
3
|
-
from hashlib import md5
|
|
4
|
-
from typing import Any, Dict, Optional
|
|
5
|
-
|
|
6
|
-
from pydantic import BaseModel, ConfigDict, model_validator
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class MemoryRow(BaseModel):
|
|
10
|
-
"""Memory Row that is stored in the database"""
|
|
11
|
-
|
|
12
|
-
memory: Dict[str, Any]
|
|
13
|
-
user_id: Optional[str] = None
|
|
14
|
-
created_at: Optional[datetime] = None
|
|
15
|
-
updated_at: Optional[datetime] = None
|
|
16
|
-
# id for this memory, auto-generated from the memory
|
|
17
|
-
id: Optional[str] = None
|
|
18
|
-
|
|
19
|
-
model_config = ConfigDict(from_attributes=True, arbitrary_types_allowed=True)
|
|
20
|
-
|
|
21
|
-
def serializable_dict(self) -> Dict[str, Any]:
|
|
22
|
-
_dict = self.model_dump(exclude={"created_at", "updated_at"})
|
|
23
|
-
_dict["created_at"] = self.created_at.isoformat() if self.created_at else None
|
|
24
|
-
_dict["updated_at"] = self.updated_at.isoformat() if self.updated_at else None
|
|
25
|
-
return _dict
|
|
26
|
-
|
|
27
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
28
|
-
return self.serializable_dict()
|
|
29
|
-
|
|
30
|
-
@model_validator(mode="after")
|
|
31
|
-
def generate_id(self) -> "MemoryRow":
|
|
32
|
-
if self.id is None:
|
|
33
|
-
memory_str = json.dumps(self.memory, sort_keys=True)
|
|
34
|
-
cleaned_memory = memory_str.replace(" ", "").replace("\n", "").replace("\t", "")
|
|
35
|
-
self.id = md5(cleaned_memory.encode()).hexdigest()
|
|
36
|
-
return self
|
agno/memory/summarizer.py
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from textwrap import dedent
|
|
3
|
-
from typing import Any, Dict, List, Optional, Tuple, cast
|
|
4
|
-
|
|
5
|
-
from pydantic import BaseModel, ValidationError
|
|
6
|
-
|
|
7
|
-
from agno.memory.summary import SessionSummary
|
|
8
|
-
from agno.models.base import Model
|
|
9
|
-
from agno.models.message import Message
|
|
10
|
-
from agno.utils.log import logger
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class MemorySummarizer(BaseModel):
|
|
14
|
-
model: Optional[Model] = None
|
|
15
|
-
use_structured_outputs: bool = False
|
|
16
|
-
|
|
17
|
-
def update_model(self) -> None:
|
|
18
|
-
if self.model is None:
|
|
19
|
-
try:
|
|
20
|
-
from agno.models.openai import OpenAIChat
|
|
21
|
-
except ModuleNotFoundError as e:
|
|
22
|
-
logger.exception(e)
|
|
23
|
-
logger.error(
|
|
24
|
-
"Agno uses `openai` as the default model provider. Please provide a `model` or install `openai`."
|
|
25
|
-
)
|
|
26
|
-
exit(1)
|
|
27
|
-
self.model = OpenAIChat(id="gpt-4o")
|
|
28
|
-
|
|
29
|
-
# Set response_format if it is not set on the Model
|
|
30
|
-
if self.use_structured_outputs:
|
|
31
|
-
self.model.response_format = SessionSummary
|
|
32
|
-
self.model.structured_outputs = True
|
|
33
|
-
else:
|
|
34
|
-
self.model.response_format = {"type": "json_object"}
|
|
35
|
-
|
|
36
|
-
def get_system_message(self, messages_for_summarization: List[Dict[str, str]]) -> Message:
|
|
37
|
-
# -*- Return a system message for summarization
|
|
38
|
-
system_prompt = dedent("""\
|
|
39
|
-
Analyze the following conversation between a user and an assistant, and extract the following details:
|
|
40
|
-
- Summary (str): Provide a concise summary of the session, focusing on important information that would be helpful for future interactions.
|
|
41
|
-
- Topics (Optional[List[str]]): List the topics discussed in the session.
|
|
42
|
-
Please ignore any frivolous information.
|
|
43
|
-
|
|
44
|
-
Conversation:
|
|
45
|
-
""")
|
|
46
|
-
conversation = []
|
|
47
|
-
for message_pair in messages_for_summarization:
|
|
48
|
-
conversation.append(f"User: {message_pair['user']}")
|
|
49
|
-
if "assistant" in message_pair:
|
|
50
|
-
conversation.append(f"Assistant: {message_pair['assistant']}")
|
|
51
|
-
elif "model" in message_pair:
|
|
52
|
-
conversation.append(f"Assistant: {message_pair['model']}")
|
|
53
|
-
|
|
54
|
-
system_prompt += "\n".join(conversation)
|
|
55
|
-
|
|
56
|
-
if not self.use_structured_outputs:
|
|
57
|
-
system_prompt += "\n\nProvide your output as a JSON containing the following fields:"
|
|
58
|
-
json_schema = SessionSummary.model_json_schema()
|
|
59
|
-
response_model_properties = {}
|
|
60
|
-
json_schema_properties = json_schema.get("properties")
|
|
61
|
-
if json_schema_properties is not None:
|
|
62
|
-
for field_name, field_properties in json_schema_properties.items():
|
|
63
|
-
formatted_field_properties = {
|
|
64
|
-
prop_name: prop_value
|
|
65
|
-
for prop_name, prop_value in field_properties.items()
|
|
66
|
-
if prop_name != "title"
|
|
67
|
-
}
|
|
68
|
-
response_model_properties[field_name] = formatted_field_properties
|
|
69
|
-
|
|
70
|
-
if len(response_model_properties) > 0:
|
|
71
|
-
system_prompt += "\n<json_fields>"
|
|
72
|
-
system_prompt += f"\n{json.dumps([key for key in response_model_properties.keys() if key != '$defs'])}"
|
|
73
|
-
system_prompt += "\n</json_fields>"
|
|
74
|
-
system_prompt += "\nHere are the properties for each field:"
|
|
75
|
-
system_prompt += "\n<json_field_properties>"
|
|
76
|
-
system_prompt += f"\n{json.dumps(response_model_properties, indent=2)}"
|
|
77
|
-
system_prompt += "\n</json_field_properties>"
|
|
78
|
-
|
|
79
|
-
system_prompt += "\nStart your response with `{` and end it with `}`."
|
|
80
|
-
system_prompt += "\nYour output will be passed to json.loads() to convert it to a Python object."
|
|
81
|
-
system_prompt += "\nMake sure it only contains valid JSON."
|
|
82
|
-
return Message(role="system", content=system_prompt)
|
|
83
|
-
|
|
84
|
-
def run(
|
|
85
|
-
self,
|
|
86
|
-
message_pairs: List[Tuple[Message, Message]],
|
|
87
|
-
**kwargs: Any,
|
|
88
|
-
) -> Optional[SessionSummary]:
|
|
89
|
-
logger.debug("*********** MemorySummarizer Start ***********")
|
|
90
|
-
|
|
91
|
-
if message_pairs is None or len(message_pairs) == 0:
|
|
92
|
-
logger.info("No message pairs provided for summarization.")
|
|
93
|
-
return None
|
|
94
|
-
|
|
95
|
-
# Update the Model (set defaults, add logit etc.)
|
|
96
|
-
self.update_model()
|
|
97
|
-
|
|
98
|
-
# Convert the message pairs to a list of dictionaries
|
|
99
|
-
messages_for_summarization: List[Dict[str, str]] = []
|
|
100
|
-
for message_pair in message_pairs:
|
|
101
|
-
user_message, assistant_message = message_pair
|
|
102
|
-
messages_for_summarization.append(
|
|
103
|
-
{
|
|
104
|
-
user_message.role: user_message.get_content_string(),
|
|
105
|
-
assistant_message.role: assistant_message.get_content_string(),
|
|
106
|
-
}
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
# Prepare the List of messages to send to the Model
|
|
110
|
-
messages_for_model: List[Message] = [self.get_system_message(messages_for_summarization)]
|
|
111
|
-
# Generate a response from the Model (includes running function calls)
|
|
112
|
-
self.model = cast(Model, self.model)
|
|
113
|
-
response = self.model.response(messages=messages_for_model)
|
|
114
|
-
logger.debug("*********** MemorySummarizer End ***********")
|
|
115
|
-
|
|
116
|
-
# If the model natively supports structured outputs, the parsed value is already in the structured format
|
|
117
|
-
if self.use_structured_outputs and response.parsed is not None and isinstance(response.parsed, SessionSummary):
|
|
118
|
-
return response.parsed
|
|
119
|
-
|
|
120
|
-
# Otherwise convert the response to the structured format
|
|
121
|
-
if isinstance(response.content, str):
|
|
122
|
-
try:
|
|
123
|
-
session_summary = None
|
|
124
|
-
try:
|
|
125
|
-
session_summary = SessionSummary.model_validate_json(response.content)
|
|
126
|
-
except ValidationError:
|
|
127
|
-
# Check if response starts with ```json
|
|
128
|
-
if response.content.startswith("```json"):
|
|
129
|
-
response.content = response.content.replace("```json\n", "").replace("\n```", "")
|
|
130
|
-
try:
|
|
131
|
-
session_summary = SessionSummary.model_validate_json(response.content)
|
|
132
|
-
except ValidationError as exc:
|
|
133
|
-
logger.warning(f"Failed to validate session_summary response: {exc}")
|
|
134
|
-
return session_summary
|
|
135
|
-
except Exception as e:
|
|
136
|
-
logger.warning(f"Failed to convert response to session_summary: {e}")
|
|
137
|
-
return None
|
|
138
|
-
|
|
139
|
-
async def arun(
|
|
140
|
-
self,
|
|
141
|
-
message_pairs: List[Tuple[Message, Message]],
|
|
142
|
-
**kwargs: Any,
|
|
143
|
-
) -> Optional[SessionSummary]:
|
|
144
|
-
logger.debug("*********** Async MemorySummarizer Start ***********")
|
|
145
|
-
|
|
146
|
-
if message_pairs is None or len(message_pairs) == 0:
|
|
147
|
-
logger.info("No message pairs provided for summarization.")
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
# Update the Model (set defaults, add logit etc.)
|
|
151
|
-
self.update_model()
|
|
152
|
-
|
|
153
|
-
# Convert the message pairs to a list of dictionaries
|
|
154
|
-
messages_for_summarization: List[Dict[str, str]] = []
|
|
155
|
-
for message_pair in message_pairs:
|
|
156
|
-
user_message, assistant_message = message_pair
|
|
157
|
-
messages_for_summarization.append(
|
|
158
|
-
{
|
|
159
|
-
user_message.role: user_message.get_content_string(),
|
|
160
|
-
assistant_message.role: assistant_message.get_content_string(),
|
|
161
|
-
}
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
# Prepare the List of messages to send to the Model
|
|
165
|
-
messages_for_model: List[Message] = [self.get_system_message(messages_for_summarization)]
|
|
166
|
-
# Generate a response from the Model (includes running function calls)
|
|
167
|
-
self.model = cast(Model, self.model)
|
|
168
|
-
response = await self.model.aresponse(messages=messages_for_model)
|
|
169
|
-
logger.debug("*********** Async MemorySummarizer End ***********")
|
|
170
|
-
|
|
171
|
-
# If the model natively supports structured outputs, the parsed value is already in the structured format
|
|
172
|
-
if self.use_structured_outputs and response.parsed is not None and isinstance(response.parsed, SessionSummary):
|
|
173
|
-
return response.parsed
|
|
174
|
-
|
|
175
|
-
# Otherwise convert the response to the structured format
|
|
176
|
-
if isinstance(response.content, str):
|
|
177
|
-
try:
|
|
178
|
-
session_summary = None
|
|
179
|
-
try:
|
|
180
|
-
session_summary = SessionSummary.model_validate_json(response.content)
|
|
181
|
-
except ValidationError:
|
|
182
|
-
# Check if response starts with ```json
|
|
183
|
-
if response.content.startswith("```json"):
|
|
184
|
-
response.content = response.content.replace("```json\n", "").replace("\n```", "")
|
|
185
|
-
try:
|
|
186
|
-
session_summary = SessionSummary.model_validate_json(response.content)
|
|
187
|
-
except ValidationError as exc:
|
|
188
|
-
logger.warning(f"Failed to validate session_summary response: {exc}")
|
|
189
|
-
return session_summary
|
|
190
|
-
except Exception as e:
|
|
191
|
-
logger.warning(f"Failed to convert response to session_summary: {e}")
|
|
192
|
-
return None
|
agno/memory/summary.py
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Optional
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, Field
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class SessionSummary(BaseModel):
|
|
7
|
-
"""Model for Session Summary."""
|
|
8
|
-
|
|
9
|
-
summary: str = Field(
|
|
10
|
-
...,
|
|
11
|
-
description="Summary of the session. Be concise and focus on only important information. Do not make anything up.",
|
|
12
|
-
)
|
|
13
|
-
topics: Optional[List[str]] = Field(None, description="Topics discussed in the session.")
|
|
14
|
-
|
|
15
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
16
|
-
return self.model_dump(exclude_none=True)
|
|
17
|
-
|
|
18
|
-
def to_json(self) -> str:
|
|
19
|
-
return self.model_dump_json(exclude_none=True, indent=2)
|
agno/memory/workflow.py
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Optional
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, ConfigDict
|
|
4
|
-
|
|
5
|
-
from agno.run.response import RunResponse
|
|
6
|
-
from agno.utils.log import logger
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class WorkflowRun(BaseModel):
|
|
10
|
-
input: Optional[Dict[str, Any]] = None
|
|
11
|
-
response: Optional[RunResponse] = None
|
|
12
|
-
|
|
13
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class WorkflowMemory(BaseModel):
|
|
17
|
-
runs: List[WorkflowRun] = []
|
|
18
|
-
|
|
19
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
20
|
-
|
|
21
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
22
|
-
return self.model_dump(exclude_none=True)
|
|
23
|
-
|
|
24
|
-
def add_run(self, workflow_run: WorkflowRun) -> None:
|
|
25
|
-
"""Adds a WorkflowRun to the runs list."""
|
|
26
|
-
self.runs.append(workflow_run)
|
|
27
|
-
logger.debug("Added WorkflowRun to WorkflowMemory")
|
|
28
|
-
|
|
29
|
-
def clear(self) -> None:
|
|
30
|
-
"""Clear the WorkflowMemory"""
|
|
31
|
-
|
|
32
|
-
self.runs = []
|
|
33
|
-
|
|
34
|
-
def deep_copy(self, *, update: Optional[Dict[str, Any]] = None) -> "WorkflowMemory":
|
|
35
|
-
new_memory = self.model_copy(deep=True, update=update)
|
|
36
|
-
# clear the new memory to remove any references to the old memory
|
|
37
|
-
new_memory.clear()
|
|
38
|
-
return new_memory
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
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 GeminiOpenAI(OpenAILike):
|
|
10
|
-
"""
|
|
11
|
-
Class for interacting with the Gemini API (OpenAI).
|
|
12
|
-
|
|
13
|
-
Attributes:
|
|
14
|
-
id (str): The ID of the API.
|
|
15
|
-
name (str): The name of the API.
|
|
16
|
-
provider (str): The provider of the API.
|
|
17
|
-
api_key (Optional[str]): The API key for the xAI API.
|
|
18
|
-
base_url (Optional[str]): The base URL for the xAI API.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
id: str = "gemini-1.5-flash"
|
|
22
|
-
name: str = "Gemini"
|
|
23
|
-
provider: str = "Google"
|
|
24
|
-
|
|
25
|
-
api_key: Optional[str] = getenv("GOOGLE_API_KEY", None)
|
|
26
|
-
base_url: Optional[str] = "https://generativelanguage.googleapis.com/v1beta/"
|