agno 1.8.0__py3-none-any.whl → 2.0.0a1__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 +19 -27
- agno/agent/agent.py +2781 -4126
- agno/api/agent.py +9 -65
- agno/api/api.py +5 -46
- agno/api/evals.py +6 -17
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +9 -64
- 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/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1749 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1438 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +888 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1051 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1417 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +298 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1720 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +281 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1371 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1722 -0
- agno/db/singlestore/utils.py +327 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1680 -0
- agno/db/sqlite/utils.py +269 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +142 -43
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +10 -10
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -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/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1515 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +68 -15
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/knowledge/reader/gcs_reader.py +67 -0
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +36 -9
- agno/{document → knowledge}/reader/pdf_reader.py +79 -21
- agno/knowledge/reader/reader_factory.py +275 -0
- agno/knowledge/reader/s3_reader.py +171 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +84 -0
- agno/knowledge/reader/web_search_reader.py +389 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/media.py +2 -2
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +129 -82
- agno/models/aws/bedrock.py +107 -175
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +347 -287
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/dashscope/dashscope.py +14 -5
- agno/models/google/gemini.py +123 -53
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +38 -144
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +84 -46
- agno/models/openai/chat.py +135 -27
- agno/models/openai/responses.py +233 -115
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +14 -8
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +393 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +65 -28
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +33 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +30 -0
- agno/os/router.py +843 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +204 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +413 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +179 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +58 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +163 -0
- agno/os/schema.py +892 -0
- agno/{app/playground → os}/settings.py +8 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/{response.py → agent.py} +144 -72
- agno/run/base.py +44 -58
- agno/run/cancel.py +83 -0
- agno/run/team.py +133 -77
- agno/run/workflow.py +537 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +2967 -4243
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +42 -22
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +18 -13
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +71 -18
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +18 -11
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +16 -7
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +62 -62
- agno/tools/eleven_labs.py +35 -28
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +29 -29
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +68 -17
- agno/tools/giphy.py +22 -10
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +46 -62
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +31 -19
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +32 -14
- agno/tools/models/gemini.py +58 -31
- agno/tools/models/groq.py +29 -20
- agno/tools/models/nebius.py +27 -11
- agno/tools/models_labs.py +39 -15
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +57 -26
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +62 -46
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +54 -41
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +95 -118
- agno/utils/knowledge.py +29 -0
- agno/utils/location.py +2 -2
- agno/utils/log.py +2 -2
- agno/utils/mcp.py +11 -5
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/claude.py +6 -4
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1565 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +356 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +200 -42
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2394 -696
- agno-2.0.0a1.dist-info/METADATA +355 -0
- agno-2.0.0a1.dist-info/RECORD +514 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- 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 -698
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- 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 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- 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/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.0.dist-info/METADATA +0 -979
- agno-1.8.0.dist-info/RECORD +0 -565
- agno-1.8.0.dist-info/entry_points.txt +0 -3
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/db/json/utils.py
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""Utility functions for the JSON database class."""
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
from datetime import date, datetime, timedelta, timezone
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
|
|
8
|
+
from agno.db.base import SessionType
|
|
9
|
+
from agno.run.agent import RunOutput
|
|
10
|
+
from agno.run.team import TeamRunOutput
|
|
11
|
+
from agno.session.summary import SessionSummary
|
|
12
|
+
from agno.utils.log import log_debug
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def hydrate_session(session: dict) -> dict:
|
|
16
|
+
"""Convert nested dictionaries to their corresponding object types.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
session (dict): The session dictionary to hydrate.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
dict: The hydrated session dictionary.
|
|
23
|
+
"""
|
|
24
|
+
if session.get("summary") is not None:
|
|
25
|
+
session["summary"] = SessionSummary.from_dict(session["summary"])
|
|
26
|
+
if session.get("runs") is not None:
|
|
27
|
+
if session["session_type"] == SessionType.AGENT:
|
|
28
|
+
session["runs"] = [RunOutput.from_dict(run) for run in session["runs"]]
|
|
29
|
+
elif session["session_type"] == SessionType.TEAM:
|
|
30
|
+
session["runs"] = [TeamRunOutput.from_dict(run) for run in session["runs"]]
|
|
31
|
+
|
|
32
|
+
return session
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def apply_sorting(
|
|
36
|
+
data: List[Dict[str, Any]], sort_by: Optional[str] = None, sort_order: Optional[str] = None
|
|
37
|
+
) -> List[Dict[str, Any]]:
|
|
38
|
+
"""Apply sorting to the given data list.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
data: The list of dictionaries to sort
|
|
42
|
+
sort_by: The field to sort by
|
|
43
|
+
sort_order: The sort order ('asc' or 'desc')
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
The sorted list
|
|
47
|
+
"""
|
|
48
|
+
if sort_by is None or not data:
|
|
49
|
+
return data
|
|
50
|
+
|
|
51
|
+
# Check if the sort field exists in the first item
|
|
52
|
+
if sort_by not in data[0]:
|
|
53
|
+
log_debug(f"Invalid sort field: '{sort_by}'. Will not apply any sorting.")
|
|
54
|
+
return data
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
reverse_order = sort_order != "asc" if sort_order else True
|
|
58
|
+
return sorted(data, key=lambda x: x.get(sort_by, 0), reverse=reverse_order)
|
|
59
|
+
except Exception as e:
|
|
60
|
+
log_debug(f"Error sorting data by '{sort_by}': {e}")
|
|
61
|
+
return data
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
65
|
+
"""Calculate metrics for the given single date.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
date_to_process (date): The date to calculate metrics for.
|
|
69
|
+
sessions_data (dict): The sessions data to calculate metrics for.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
dict: The calculated metrics.
|
|
73
|
+
"""
|
|
74
|
+
metrics = {
|
|
75
|
+
"users_count": 0,
|
|
76
|
+
"agent_sessions_count": 0,
|
|
77
|
+
"team_sessions_count": 0,
|
|
78
|
+
"workflow_sessions_count": 0,
|
|
79
|
+
"agent_runs_count": 0,
|
|
80
|
+
"team_runs_count": 0,
|
|
81
|
+
"workflow_runs_count": 0,
|
|
82
|
+
}
|
|
83
|
+
token_metrics = {
|
|
84
|
+
"input_tokens": 0,
|
|
85
|
+
"output_tokens": 0,
|
|
86
|
+
"total_tokens": 0,
|
|
87
|
+
"audio_total_tokens": 0,
|
|
88
|
+
"audio_input_tokens": 0,
|
|
89
|
+
"audio_output_tokens": 0,
|
|
90
|
+
"cache_read_tokens": 0,
|
|
91
|
+
"cache_write_tokens": 0,
|
|
92
|
+
"reasoning_tokens": 0,
|
|
93
|
+
}
|
|
94
|
+
model_counts: Dict[str, int] = {}
|
|
95
|
+
|
|
96
|
+
session_types = [
|
|
97
|
+
("agent", "agent_sessions_count", "agent_runs_count"),
|
|
98
|
+
("team", "team_sessions_count", "team_runs_count"),
|
|
99
|
+
("workflow", "workflow_sessions_count", "workflow_runs_count"),
|
|
100
|
+
]
|
|
101
|
+
all_user_ids = set()
|
|
102
|
+
|
|
103
|
+
for session_type, sessions_count_key, runs_count_key in session_types:
|
|
104
|
+
sessions = sessions_data.get(session_type, [])
|
|
105
|
+
metrics[sessions_count_key] = len(sessions)
|
|
106
|
+
|
|
107
|
+
for session in sessions:
|
|
108
|
+
if session.get("user_id"):
|
|
109
|
+
all_user_ids.add(session["user_id"])
|
|
110
|
+
metrics[runs_count_key] += len(session.get("runs", []))
|
|
111
|
+
if runs := session.get("runs", []):
|
|
112
|
+
for run in runs:
|
|
113
|
+
if model_id := run.get("model"):
|
|
114
|
+
model_provider = run.get("model_provider", "")
|
|
115
|
+
model_counts[f"{model_id}:{model_provider}"] = (
|
|
116
|
+
model_counts.get(f"{model_id}:{model_provider}", 0) + 1
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
session_metrics = session.get("session_data", {}).get("session_metrics", {})
|
|
120
|
+
for field in token_metrics:
|
|
121
|
+
token_metrics[field] += session_metrics.get(field, 0)
|
|
122
|
+
|
|
123
|
+
model_metrics = []
|
|
124
|
+
for model, count in model_counts.items():
|
|
125
|
+
model_id, model_provider = model.split(":")
|
|
126
|
+
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
127
|
+
|
|
128
|
+
metrics["users_count"] = len(all_user_ids)
|
|
129
|
+
current_time = int(time.time())
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
"id": str(uuid4()),
|
|
133
|
+
"date": date_to_process.isoformat(),
|
|
134
|
+
"completed": date_to_process < datetime.now(timezone.utc).date(),
|
|
135
|
+
"token_metrics": token_metrics,
|
|
136
|
+
"model_metrics": model_metrics,
|
|
137
|
+
"created_at": current_time,
|
|
138
|
+
"updated_at": current_time,
|
|
139
|
+
"aggregation_period": "daily",
|
|
140
|
+
**metrics,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def fetch_all_sessions_data(
|
|
145
|
+
sessions: List[Dict[str, Any]], dates_to_process: list[date], start_timestamp: int
|
|
146
|
+
) -> Optional[dict]:
|
|
147
|
+
"""Return all session data for the given dates, for all session types.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
sessions: List of session dictionaries
|
|
151
|
+
dates_to_process (list[date]): The dates to fetch session data for.
|
|
152
|
+
start_timestamp (int): The starting timestamp for filtering
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
dict: A dictionary with dates as keys and session data as values, for all session types.
|
|
156
|
+
|
|
157
|
+
Example:
|
|
158
|
+
{
|
|
159
|
+
"2000-01-01": {
|
|
160
|
+
"agent": [<session1>, <session2>, ...],
|
|
161
|
+
"team": [...],
|
|
162
|
+
"workflow": [...],
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
"""
|
|
166
|
+
if not dates_to_process:
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
all_sessions_data: Dict[str, Dict[str, List[Dict[str, Any]]]] = {
|
|
170
|
+
date_to_process.isoformat(): {"agent": [], "team": [], "workflow": []} for date_to_process in dates_to_process
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
for session in sessions:
|
|
174
|
+
session_date = (
|
|
175
|
+
datetime.fromtimestamp(session.get("created_at", start_timestamp), tz=timezone.utc).date().isoformat()
|
|
176
|
+
)
|
|
177
|
+
if session_date in all_sessions_data:
|
|
178
|
+
all_sessions_data[session_date][session["session_type"]].append(session)
|
|
179
|
+
|
|
180
|
+
return all_sessions_data
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def get_dates_to_calculate_metrics_for(starting_date: date) -> list[date]:
|
|
184
|
+
"""Return the list of dates to calculate metrics for.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
starting_date (date): The starting date to calculate metrics for.
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
list[date]: The list of dates to calculate metrics for.
|
|
191
|
+
"""
|
|
192
|
+
today = datetime.now(timezone.utc).date()
|
|
193
|
+
days_diff = (today - starting_date).days + 1
|
|
194
|
+
if days_diff <= 0:
|
|
195
|
+
return []
|
|
196
|
+
return [starting_date + timedelta(days=x) for x in range(days_diff)]
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Migration utility to migrate your Agno tables from v1 to v2"""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, List, Optional, Union
|
|
4
|
+
|
|
5
|
+
from sqlalchemy import text
|
|
6
|
+
|
|
7
|
+
from agno.db.mysql.mysql import MySQLDb
|
|
8
|
+
from agno.db.postgres.postgres import PostgresDb
|
|
9
|
+
from agno.db.schemas.memory import UserMemory
|
|
10
|
+
from agno.db.sqlite.sqlite import SqliteDb
|
|
11
|
+
from agno.session import AgentSession, TeamSession, WorkflowSession
|
|
12
|
+
from agno.utils.log import log_error
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def migrate(
|
|
16
|
+
db: Union[PostgresDb, MySQLDb, SqliteDb],
|
|
17
|
+
v1_db_schema: str,
|
|
18
|
+
agent_sessions_table_name: Optional[str] = None,
|
|
19
|
+
team_sessions_table_name: Optional[str] = None,
|
|
20
|
+
workflow_sessions_table_name: Optional[str] = None,
|
|
21
|
+
memories_table_name: Optional[str] = None,
|
|
22
|
+
):
|
|
23
|
+
"""Given a PostgresDb and table names, parse and migrate the tables' content to the corresponding v2 tables.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
db: The database to migrate
|
|
27
|
+
v1_db_schema: The schema of the v1 tables
|
|
28
|
+
agent_sessions_table_name: The name of the agent sessions table. If not provided, the agent sessions table will not be migrated.
|
|
29
|
+
team_sessions_table_name: The name of the team sessions table. If not provided, the team sessions table will not be migrated.
|
|
30
|
+
workflow_sessions_table_name: The name of the workflow sessions table. If not provided, the workflow sessions table will not be migrated.
|
|
31
|
+
workflow_v2_sessions_table_name: The name of the workflow v2 sessions table. If not provided, the workflow v2 sessions table will not be migrated.
|
|
32
|
+
memories_table_name: The name of the memories table. If not provided, the memories table will not be migrated.
|
|
33
|
+
"""
|
|
34
|
+
if agent_sessions_table_name:
|
|
35
|
+
db.migrate_table_from_v1_to_v2(
|
|
36
|
+
v1_db_schema=v1_db_schema,
|
|
37
|
+
v1_table_name=agent_sessions_table_name,
|
|
38
|
+
v1_table_type="agent_sessions",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
if team_sessions_table_name:
|
|
42
|
+
db.migrate_table_from_v1_to_v2(
|
|
43
|
+
v1_db_schema=v1_db_schema,
|
|
44
|
+
v1_table_name=team_sessions_table_name,
|
|
45
|
+
v1_table_type="team_sessions",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
if workflow_sessions_table_name:
|
|
49
|
+
db.migrate_table_from_v1_to_v2(
|
|
50
|
+
v1_db_schema=v1_db_schema,
|
|
51
|
+
v1_table_name=workflow_sessions_table_name,
|
|
52
|
+
v1_table_type="workflow_sessions",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
if memories_table_name:
|
|
56
|
+
db.migrate_table_from_v1_to_v2(
|
|
57
|
+
v1_db_schema=v1_db_schema,
|
|
58
|
+
v1_table_name=memories_table_name,
|
|
59
|
+
v1_table_type="memories",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_all_table_content(db, db_schema: str, table_name: str) -> list[dict[str, Any]]:
|
|
64
|
+
"""Get all content from the given table"""
|
|
65
|
+
try:
|
|
66
|
+
with db.Session() as sess:
|
|
67
|
+
result = sess.execute(text(f"SELECT * FROM {db_schema}.{table_name}"))
|
|
68
|
+
return [row._asdict() for row in result]
|
|
69
|
+
|
|
70
|
+
except Exception as e:
|
|
71
|
+
log_error(f"Error getting all content from table {table_name}: {e}")
|
|
72
|
+
return []
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def parse_agent_sessions(v1_content: List[Dict[str, Any]]) -> List[AgentSession]:
|
|
76
|
+
"""Parse v1 Agent sessions into v2 Agent sessions and Memories"""
|
|
77
|
+
sessions_v2 = []
|
|
78
|
+
|
|
79
|
+
for item in v1_content:
|
|
80
|
+
session = {
|
|
81
|
+
"agent_id": item.get("agent_id"),
|
|
82
|
+
"agent_data": item.get("agent_data"),
|
|
83
|
+
"session_id": item.get("session_id"),
|
|
84
|
+
"user_id": item.get("user_id"),
|
|
85
|
+
"session_data": item.get("session_data"),
|
|
86
|
+
"metadata": item.get("extra_data"),
|
|
87
|
+
"runs": item.get("memory", {}).get("runs"),
|
|
88
|
+
"created_at": item.get("created_at"),
|
|
89
|
+
"updated_at": item.get("updated_at"),
|
|
90
|
+
}
|
|
91
|
+
agent_session = AgentSession.from_dict(session)
|
|
92
|
+
if agent_session is not None:
|
|
93
|
+
sessions_v2.append(agent_session)
|
|
94
|
+
|
|
95
|
+
return sessions_v2
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def parse_team_sessions(v1_content: List[Dict[str, Any]]) -> List[TeamSession]:
|
|
99
|
+
"""Parse v1 Team sessions into v2 Team sessions and Memories"""
|
|
100
|
+
sessions_v2 = []
|
|
101
|
+
|
|
102
|
+
for item in v1_content:
|
|
103
|
+
session = {
|
|
104
|
+
"team_id": item.get("team_id"),
|
|
105
|
+
"team_data": item.get("team_data"),
|
|
106
|
+
"session_id": item.get("session_id"),
|
|
107
|
+
"user_id": item.get("user_id"),
|
|
108
|
+
"session_data": item.get("session_data"),
|
|
109
|
+
"metadata": item.get("extra_data"),
|
|
110
|
+
"runs": item.get("memory", {}).get("runs"),
|
|
111
|
+
"created_at": item.get("created_at"),
|
|
112
|
+
"updated_at": item.get("updated_at"),
|
|
113
|
+
}
|
|
114
|
+
team_session = TeamSession.from_dict(session)
|
|
115
|
+
if team_session is not None:
|
|
116
|
+
sessions_v2.append(team_session)
|
|
117
|
+
|
|
118
|
+
return sessions_v2
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def parse_workflow_sessions(v1_content: List[Dict[str, Any]]) -> List[WorkflowSession]:
|
|
122
|
+
"""Parse v1 Workflow sessions into v2 Workflow sessions"""
|
|
123
|
+
sessions_v2 = []
|
|
124
|
+
|
|
125
|
+
for item in v1_content:
|
|
126
|
+
session = {
|
|
127
|
+
"workflow_id": item.get("workflow_id"),
|
|
128
|
+
"workflow_data": item.get("workflow_data"),
|
|
129
|
+
"session_id": item.get("session_id"),
|
|
130
|
+
"user_id": item.get("user_id"),
|
|
131
|
+
"session_data": item.get("session_data"),
|
|
132
|
+
"metadata": item.get("extra_data"),
|
|
133
|
+
"created_at": item.get("created_at"),
|
|
134
|
+
"updated_at": item.get("updated_at"),
|
|
135
|
+
# Workflow v2 specific fields
|
|
136
|
+
"workflow_name": item.get("workflow_name"),
|
|
137
|
+
"runs": item.get("runs"),
|
|
138
|
+
}
|
|
139
|
+
workflow_session = WorkflowSession.from_dict(session)
|
|
140
|
+
if workflow_session is not None:
|
|
141
|
+
sessions_v2.append(workflow_session)
|
|
142
|
+
|
|
143
|
+
return sessions_v2
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def parse_memories(v1_content: List[Dict[str, Any]]) -> List[UserMemory]:
|
|
147
|
+
"""Parse v1 Memories into v2 Memories"""
|
|
148
|
+
memories_v2 = []
|
|
149
|
+
|
|
150
|
+
for item in v1_content:
|
|
151
|
+
memory = {
|
|
152
|
+
"memory_id": item.get("memory_id"),
|
|
153
|
+
"memory": item.get("memory"),
|
|
154
|
+
"input": item.get("input"),
|
|
155
|
+
"updated_at": item.get("updated_at"),
|
|
156
|
+
"agent_id": item.get("agent_id"),
|
|
157
|
+
"team_id": item.get("team_id"),
|
|
158
|
+
"user_id": item.get("user_id"),
|
|
159
|
+
}
|
|
160
|
+
memories_v2.append(UserMemory.from_dict(memory))
|
|
161
|
+
|
|
162
|
+
return memories_v2
|