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/storage/agent/yaml.py
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import time
|
|
2
|
-
from dataclasses import asdict
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from typing import List, Optional, Union
|
|
5
|
-
|
|
6
|
-
import yaml
|
|
7
|
-
|
|
8
|
-
from agno.storage.agent.base import AgentStorage
|
|
9
|
-
from agno.storage.agent.session import AgentSession
|
|
10
|
-
from agno.utils.log import logger
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class YamlAgentStorage(AgentStorage):
|
|
14
|
-
def __init__(self, dir_path: Union[str, Path]):
|
|
15
|
-
self.dir_path = Path(dir_path)
|
|
16
|
-
self.dir_path.mkdir(parents=True, exist_ok=True)
|
|
17
|
-
|
|
18
|
-
def serialize(self, data: dict) -> str:
|
|
19
|
-
return yaml.dump(data, default_flow_style=False)
|
|
20
|
-
|
|
21
|
-
def deserialize(self, data: str) -> dict:
|
|
22
|
-
return yaml.safe_load(data)
|
|
23
|
-
|
|
24
|
-
def create(self) -> None:
|
|
25
|
-
"""Create the storage if it doesn't exist."""
|
|
26
|
-
if not self.dir_path.exists():
|
|
27
|
-
self.dir_path.mkdir(parents=True, exist_ok=True)
|
|
28
|
-
|
|
29
|
-
def read(self, session_id: str, user_id: Optional[str] = None) -> Optional[AgentSession]:
|
|
30
|
-
"""Read an AgentSession from storage."""
|
|
31
|
-
try:
|
|
32
|
-
with open(self.dir_path / f"{session_id}.yaml", "r", encoding="utf-8") as f:
|
|
33
|
-
data = self.deserialize(f.read())
|
|
34
|
-
if user_id and data["user_id"] != user_id:
|
|
35
|
-
return None
|
|
36
|
-
return AgentSession.from_dict(data)
|
|
37
|
-
except FileNotFoundError:
|
|
38
|
-
return None
|
|
39
|
-
|
|
40
|
-
def get_all_session_ids(self, user_id: Optional[str] = None, agent_id: Optional[str] = None) -> List[str]:
|
|
41
|
-
"""Get all session IDs, optionally filtered by user_id and/or agent_id."""
|
|
42
|
-
session_ids = []
|
|
43
|
-
for file in self.dir_path.glob("*.yaml"):
|
|
44
|
-
with open(file, "r", encoding="utf-8") as f:
|
|
45
|
-
data = self.deserialize(f.read())
|
|
46
|
-
if (not user_id or data["user_id"] == user_id) and (not agent_id or data["agent_id"] == agent_id):
|
|
47
|
-
session_ids.append(data["session_id"])
|
|
48
|
-
return session_ids
|
|
49
|
-
|
|
50
|
-
def get_all_sessions(self, user_id: Optional[str] = None, agent_id: Optional[str] = None) -> List[AgentSession]:
|
|
51
|
-
"""Get all sessions, optionally filtered by user_id and/or agent_id."""
|
|
52
|
-
sessions = []
|
|
53
|
-
for file in self.dir_path.glob("*.yaml"):
|
|
54
|
-
with open(file, "r", encoding="utf-8") as f:
|
|
55
|
-
data = self.deserialize(f.read())
|
|
56
|
-
if (not user_id or data["user_id"] == user_id) and (not agent_id or data["agent_id"] == agent_id):
|
|
57
|
-
_agent_session = AgentSession.from_dict(data)
|
|
58
|
-
if _agent_session is not None:
|
|
59
|
-
sessions.append(_agent_session)
|
|
60
|
-
return sessions
|
|
61
|
-
|
|
62
|
-
def upsert(self, session: AgentSession) -> Optional[AgentSession]:
|
|
63
|
-
"""Insert or update an AgentSession in storage."""
|
|
64
|
-
try:
|
|
65
|
-
data = asdict(session)
|
|
66
|
-
data["updated_at"] = int(time.time())
|
|
67
|
-
if "created_at" not in data:
|
|
68
|
-
data["created_at"] = data["updated_at"]
|
|
69
|
-
|
|
70
|
-
with open(self.dir_path / f"{session.session_id}.yaml", "w", encoding="utf-8") as f:
|
|
71
|
-
f.write(self.serialize(data))
|
|
72
|
-
return session
|
|
73
|
-
except Exception as e:
|
|
74
|
-
logger.error(f"Error upserting session: {e}")
|
|
75
|
-
return None
|
|
76
|
-
|
|
77
|
-
def delete_session(self, session_id: Optional[str] = None):
|
|
78
|
-
"""Delete a session from storage."""
|
|
79
|
-
if session_id is None:
|
|
80
|
-
return
|
|
81
|
-
try:
|
|
82
|
-
(self.dir_path / f"{session_id}.yaml").unlink(missing_ok=True)
|
|
83
|
-
except Exception as e:
|
|
84
|
-
logger.error(f"Error deleting session: {e}")
|
|
85
|
-
|
|
86
|
-
def drop(self) -> None:
|
|
87
|
-
"""Drop all sessions from storage."""
|
|
88
|
-
for file in self.dir_path.glob("*.yaml"):
|
|
89
|
-
file.unlink()
|
|
90
|
-
|
|
91
|
-
def upgrade_schema(self) -> None:
|
|
92
|
-
"""Upgrade the schema of the storage."""
|
|
93
|
-
pass
|
|
File without changes
|
agno/storage/workflow/base.py
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
|
|
4
|
-
from agno.storage.workflow.session import WorkflowSession
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class WorkflowStorage(ABC):
|
|
8
|
-
@abstractmethod
|
|
9
|
-
def create(self) -> None:
|
|
10
|
-
raise NotImplementedError
|
|
11
|
-
|
|
12
|
-
@abstractmethod
|
|
13
|
-
def read(self, session_id: str, user_id: Optional[str] = None) -> Optional[WorkflowSession]:
|
|
14
|
-
raise NotImplementedError
|
|
15
|
-
|
|
16
|
-
@abstractmethod
|
|
17
|
-
def get_all_session_ids(self, user_id: Optional[str] = None, workflow_id: Optional[str] = None) -> List[str]:
|
|
18
|
-
raise NotImplementedError
|
|
19
|
-
|
|
20
|
-
@abstractmethod
|
|
21
|
-
def get_all_sessions(
|
|
22
|
-
self, user_id: Optional[str] = None, workflow_id: Optional[str] = None
|
|
23
|
-
) -> List[WorkflowSession]:
|
|
24
|
-
raise NotImplementedError
|
|
25
|
-
|
|
26
|
-
@abstractmethod
|
|
27
|
-
def upsert(self, session: WorkflowSession) -> Optional[WorkflowSession]:
|
|
28
|
-
raise NotImplementedError
|
|
29
|
-
|
|
30
|
-
@abstractmethod
|
|
31
|
-
def delete_session(self, session_id: Optional[str] = None):
|
|
32
|
-
raise NotImplementedError
|
|
33
|
-
|
|
34
|
-
@abstractmethod
|
|
35
|
-
def drop(self) -> None:
|
|
36
|
-
raise NotImplementedError
|
|
37
|
-
|
|
38
|
-
@abstractmethod
|
|
39
|
-
def upgrade_schema(self) -> None:
|
|
40
|
-
raise NotImplementedError
|
agno/storage/workflow/mongodb.py
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
from datetime import datetime, timezone
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
from uuid import UUID
|
|
4
|
-
|
|
5
|
-
try:
|
|
6
|
-
from pymongo import MongoClient
|
|
7
|
-
from pymongo.collection import Collection
|
|
8
|
-
from pymongo.database import Database
|
|
9
|
-
from pymongo.errors import PyMongoError
|
|
10
|
-
except ImportError:
|
|
11
|
-
raise ImportError("`pymongo` not installed. Please install it with `pip install pymongo`")
|
|
12
|
-
|
|
13
|
-
from agno.storage.workflow.base import WorkflowStorage
|
|
14
|
-
from agno.storage.workflow.session import WorkflowSession
|
|
15
|
-
from agno.utils.log import logger
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class MongoWorkflowStorage(WorkflowStorage):
|
|
19
|
-
def __init__(
|
|
20
|
-
self,
|
|
21
|
-
collection_name: str,
|
|
22
|
-
db_url: Optional[str] = None,
|
|
23
|
-
db_name: str = "agno",
|
|
24
|
-
client: Optional[MongoClient] = None,
|
|
25
|
-
):
|
|
26
|
-
"""
|
|
27
|
-
This class provides workflow storage using MongoDB.
|
|
28
|
-
|
|
29
|
-
Args:
|
|
30
|
-
collection_name: Name of the collection to store workflow sessions
|
|
31
|
-
db_url: MongoDB connection URL
|
|
32
|
-
db_name: Name of the database
|
|
33
|
-
client: Optional existing MongoDB client
|
|
34
|
-
schema_version: Version of the schema to use
|
|
35
|
-
auto_upgrade_schema: Whether to automatically upgrade the schema
|
|
36
|
-
"""
|
|
37
|
-
self._client: Optional[MongoClient] = client
|
|
38
|
-
if self._client is None and db_url is not None:
|
|
39
|
-
self._client = MongoClient(db_url)
|
|
40
|
-
elif self._client is None:
|
|
41
|
-
self._client = MongoClient()
|
|
42
|
-
|
|
43
|
-
if self._client is None:
|
|
44
|
-
raise ValueError("Must provide either db_url or client")
|
|
45
|
-
|
|
46
|
-
self.collection_name: str = collection_name
|
|
47
|
-
self.db_name: str = db_name
|
|
48
|
-
|
|
49
|
-
self.db: Database = self._client[self.db_name]
|
|
50
|
-
self.collection: Collection = self.db[self.collection_name]
|
|
51
|
-
|
|
52
|
-
def create(self) -> None:
|
|
53
|
-
"""Create necessary indexes for the collection"""
|
|
54
|
-
try:
|
|
55
|
-
# Create indexes
|
|
56
|
-
self.collection.create_index("session_id", unique=True)
|
|
57
|
-
self.collection.create_index("user_id")
|
|
58
|
-
self.collection.create_index("workflow_id")
|
|
59
|
-
self.collection.create_index("created_at")
|
|
60
|
-
except PyMongoError as e:
|
|
61
|
-
logger.error(f"Error creating indexes: {e}")
|
|
62
|
-
raise
|
|
63
|
-
|
|
64
|
-
def read(self, session_id: str, user_id: Optional[str] = None) -> Optional[WorkflowSession]:
|
|
65
|
-
"""Read a workflow session from MongoDB
|
|
66
|
-
Args:
|
|
67
|
-
session_id: ID of the session to read
|
|
68
|
-
user_id: ID of the user to read
|
|
69
|
-
Returns:
|
|
70
|
-
WorkflowSession: The session if found, otherwise None
|
|
71
|
-
"""
|
|
72
|
-
try:
|
|
73
|
-
query = {"session_id": session_id}
|
|
74
|
-
if user_id:
|
|
75
|
-
query["user_id"] = user_id
|
|
76
|
-
|
|
77
|
-
doc = self.collection.find_one(query)
|
|
78
|
-
if doc:
|
|
79
|
-
# Remove MongoDB _id before converting to WorkflowSession
|
|
80
|
-
doc.pop("_id", None)
|
|
81
|
-
return WorkflowSession.from_dict(doc)
|
|
82
|
-
return None
|
|
83
|
-
except PyMongoError as e:
|
|
84
|
-
logger.error(f"Error reading session: {e}")
|
|
85
|
-
return None
|
|
86
|
-
|
|
87
|
-
def get_all_session_ids(self, user_id: Optional[str] = None, workflow_id: Optional[str] = None) -> List[str]:
|
|
88
|
-
"""Get all session IDs matching the criteria
|
|
89
|
-
Args:
|
|
90
|
-
user_id: ID of the user to read
|
|
91
|
-
workflow_id: ID of the workflow to read
|
|
92
|
-
Returns:
|
|
93
|
-
List[str]: List of session IDs
|
|
94
|
-
"""
|
|
95
|
-
try:
|
|
96
|
-
query = {}
|
|
97
|
-
if user_id is not None:
|
|
98
|
-
query["user_id"] = user_id
|
|
99
|
-
if workflow_id is not None:
|
|
100
|
-
query["workflow_id"] = workflow_id
|
|
101
|
-
|
|
102
|
-
cursor = self.collection.find(query, {"session_id": 1}).sort("created_at", -1)
|
|
103
|
-
|
|
104
|
-
return [str(doc["session_id"]) for doc in cursor]
|
|
105
|
-
except PyMongoError as e:
|
|
106
|
-
logger.error(f"Error getting session IDs: {e}")
|
|
107
|
-
return []
|
|
108
|
-
|
|
109
|
-
def get_all_sessions(
|
|
110
|
-
self, user_id: Optional[str] = None, workflow_id: Optional[str] = None
|
|
111
|
-
) -> List[WorkflowSession]:
|
|
112
|
-
"""Get all sessions matching the criteria
|
|
113
|
-
Args:
|
|
114
|
-
user_id: ID of the user to read
|
|
115
|
-
workflow_id: ID of the workflow to read
|
|
116
|
-
Returns:
|
|
117
|
-
List[WorkflowSession]: List of sessions
|
|
118
|
-
"""
|
|
119
|
-
try:
|
|
120
|
-
query = {}
|
|
121
|
-
if user_id is not None:
|
|
122
|
-
query["user_id"] = user_id
|
|
123
|
-
if workflow_id is not None:
|
|
124
|
-
query["workflow_id"] = workflow_id
|
|
125
|
-
|
|
126
|
-
cursor = self.collection.find(query).sort("created_at", -1)
|
|
127
|
-
sessions = []
|
|
128
|
-
for doc in cursor:
|
|
129
|
-
# Remove MongoDB _id before converting to WorkflowSession
|
|
130
|
-
doc.pop("_id", None)
|
|
131
|
-
_workflow_session = WorkflowSession.from_dict(doc)
|
|
132
|
-
if _workflow_session is not None:
|
|
133
|
-
sessions.append(_workflow_session)
|
|
134
|
-
return sessions
|
|
135
|
-
except PyMongoError as e:
|
|
136
|
-
logger.error(f"Error getting sessions: {e}")
|
|
137
|
-
return []
|
|
138
|
-
|
|
139
|
-
def upsert(self, session: WorkflowSession, create_and_retry: bool = True) -> Optional[WorkflowSession]:
|
|
140
|
-
"""Upsert a workflow session
|
|
141
|
-
Args:
|
|
142
|
-
session: WorkflowSession to upsert
|
|
143
|
-
create_and_retry: Whether to create a new session if the session_id already exists
|
|
144
|
-
Returns:
|
|
145
|
-
WorkflowSession: The session if upserted, otherwise None
|
|
146
|
-
"""
|
|
147
|
-
try:
|
|
148
|
-
# Convert session to dict and add timestamps
|
|
149
|
-
session_dict = session.to_dict()
|
|
150
|
-
now = datetime.now(timezone.utc)
|
|
151
|
-
timestamp = int(now.timestamp())
|
|
152
|
-
|
|
153
|
-
# Handle UUID serialization
|
|
154
|
-
if isinstance(session.session_id, UUID):
|
|
155
|
-
session_dict["session_id"] = str(session.session_id)
|
|
156
|
-
|
|
157
|
-
# Add version field for optimistic locking
|
|
158
|
-
if "_version" not in session_dict:
|
|
159
|
-
session_dict["_version"] = 1
|
|
160
|
-
else:
|
|
161
|
-
session_dict["_version"] += 1
|
|
162
|
-
|
|
163
|
-
update_data = {**session_dict, "updated_at": timestamp}
|
|
164
|
-
|
|
165
|
-
# For new documents, set created_at
|
|
166
|
-
query = {"session_id": session_dict["session_id"]}
|
|
167
|
-
|
|
168
|
-
doc = self.collection.find_one(query)
|
|
169
|
-
if not doc:
|
|
170
|
-
update_data["created_at"] = timestamp
|
|
171
|
-
|
|
172
|
-
result = self.collection.update_one(query, {"$set": update_data}, upsert=True)
|
|
173
|
-
|
|
174
|
-
if result.acknowledged:
|
|
175
|
-
return self.read(session_id=session_dict["session_id"])
|
|
176
|
-
return None
|
|
177
|
-
|
|
178
|
-
except PyMongoError as e:
|
|
179
|
-
logger.error(f"Error upserting session: {e}")
|
|
180
|
-
return None
|
|
181
|
-
|
|
182
|
-
def delete_session(self, session_id: Optional[str] = None) -> None:
|
|
183
|
-
"""Delete a workflow session
|
|
184
|
-
Args:
|
|
185
|
-
session_id: ID of the session to delete
|
|
186
|
-
Returns:
|
|
187
|
-
None
|
|
188
|
-
"""
|
|
189
|
-
if session_id is None:
|
|
190
|
-
logger.warning("No session_id provided for deletion")
|
|
191
|
-
return
|
|
192
|
-
|
|
193
|
-
try:
|
|
194
|
-
result = self.collection.delete_one({"session_id": session_id})
|
|
195
|
-
if result.deleted_count == 0:
|
|
196
|
-
logger.debug(f"No session found with session_id: {session_id}")
|
|
197
|
-
else:
|
|
198
|
-
logger.debug(f"Successfully deleted session with session_id: {session_id}")
|
|
199
|
-
except PyMongoError as e:
|
|
200
|
-
logger.error(f"Error deleting session: {e}")
|
|
201
|
-
|
|
202
|
-
def drop(self) -> None:
|
|
203
|
-
"""Drop the collection
|
|
204
|
-
Returns:
|
|
205
|
-
None
|
|
206
|
-
"""
|
|
207
|
-
try:
|
|
208
|
-
self.collection.drop()
|
|
209
|
-
except PyMongoError as e:
|
|
210
|
-
logger.error(f"Error dropping collection: {e}")
|
|
211
|
-
|
|
212
|
-
def upgrade_schema(self) -> None:
|
|
213
|
-
"""Placeholder for schema upgrades"""
|
|
214
|
-
pass
|
|
215
|
-
|
|
216
|
-
def __deepcopy__(self, memo):
|
|
217
|
-
"""Create a deep copy of the MongoWorkflowStorage instance"""
|
|
218
|
-
from copy import deepcopy
|
|
219
|
-
|
|
220
|
-
# Create a new instance without calling __init__
|
|
221
|
-
cls = self.__class__
|
|
222
|
-
copied_obj = cls.__new__(cls)
|
|
223
|
-
memo[id(self)] = copied_obj
|
|
224
|
-
|
|
225
|
-
# Deep copy attributes
|
|
226
|
-
for k, v in self.__dict__.items():
|
|
227
|
-
if k in {"_client", "db", "collection"}:
|
|
228
|
-
# Reuse MongoDB connections without copying
|
|
229
|
-
setattr(copied_obj, k, v)
|
|
230
|
-
else:
|
|
231
|
-
setattr(copied_obj, k, deepcopy(v, memo))
|
|
232
|
-
|
|
233
|
-
return copied_obj
|