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/db/base.py
ADDED
|
@@ -0,0 +1,946 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from datetime import date, datetime
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
|
|
5
|
+
from uuid import uuid4
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from agno.tracing.schemas import Span, Trace
|
|
9
|
+
|
|
10
|
+
from agno.db.schemas import UserMemory
|
|
11
|
+
from agno.db.schemas.culture import CulturalKnowledge
|
|
12
|
+
from agno.db.schemas.evals import EvalFilterType, EvalRunRecord, EvalType
|
|
13
|
+
from agno.db.schemas.knowledge import KnowledgeRow
|
|
14
|
+
from agno.session import Session
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SessionType(str, Enum):
|
|
18
|
+
AGENT = "agent"
|
|
19
|
+
TEAM = "team"
|
|
20
|
+
WORKFLOW = "workflow"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class BaseDb(ABC):
|
|
24
|
+
"""Base abstract class for all our Database implementations."""
|
|
25
|
+
|
|
26
|
+
# We assume the database to be up to date with the 2.0.0 release
|
|
27
|
+
default_schema_version = "2.0.0"
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
session_table: Optional[str] = None,
|
|
32
|
+
culture_table: Optional[str] = None,
|
|
33
|
+
memory_table: Optional[str] = None,
|
|
34
|
+
metrics_table: Optional[str] = None,
|
|
35
|
+
eval_table: Optional[str] = None,
|
|
36
|
+
knowledge_table: Optional[str] = None,
|
|
37
|
+
traces_table: Optional[str] = None,
|
|
38
|
+
spans_table: Optional[str] = None,
|
|
39
|
+
versions_table: Optional[str] = None,
|
|
40
|
+
id: Optional[str] = None,
|
|
41
|
+
):
|
|
42
|
+
self.id = id or str(uuid4())
|
|
43
|
+
self.session_table_name = session_table or "agno_sessions"
|
|
44
|
+
self.culture_table_name = culture_table or "agno_culture"
|
|
45
|
+
self.memory_table_name = memory_table or "agno_memories"
|
|
46
|
+
self.metrics_table_name = metrics_table or "agno_metrics"
|
|
47
|
+
self.eval_table_name = eval_table or "agno_eval_runs"
|
|
48
|
+
self.knowledge_table_name = knowledge_table or "agno_knowledge"
|
|
49
|
+
self.trace_table_name = traces_table or "agno_traces"
|
|
50
|
+
self.span_table_name = spans_table or "agno_spans"
|
|
51
|
+
self.versions_table_name = versions_table or "agno_schema_versions"
|
|
52
|
+
|
|
53
|
+
@abstractmethod
|
|
54
|
+
def table_exists(self, table_name: str) -> bool:
|
|
55
|
+
raise NotImplementedError
|
|
56
|
+
|
|
57
|
+
def _create_all_tables(self) -> None:
|
|
58
|
+
"""Create all tables for this database."""
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
# --- Schema Version ---
|
|
62
|
+
@abstractmethod
|
|
63
|
+
def get_latest_schema_version(self, table_name: str):
|
|
64
|
+
raise NotImplementedError
|
|
65
|
+
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def upsert_schema_version(self, table_name: str, version: str):
|
|
68
|
+
"""Upsert the schema version into the database."""
|
|
69
|
+
raise NotImplementedError
|
|
70
|
+
|
|
71
|
+
# --- Sessions ---
|
|
72
|
+
@abstractmethod
|
|
73
|
+
def delete_session(self, session_id: str) -> bool:
|
|
74
|
+
raise NotImplementedError
|
|
75
|
+
|
|
76
|
+
@abstractmethod
|
|
77
|
+
def delete_sessions(self, session_ids: List[str]) -> None:
|
|
78
|
+
raise NotImplementedError
|
|
79
|
+
|
|
80
|
+
@abstractmethod
|
|
81
|
+
def get_session(
|
|
82
|
+
self,
|
|
83
|
+
session_id: str,
|
|
84
|
+
session_type: SessionType,
|
|
85
|
+
user_id: Optional[str] = None,
|
|
86
|
+
deserialize: Optional[bool] = True,
|
|
87
|
+
) -> Optional[Union[Session, Dict[str, Any]]]:
|
|
88
|
+
raise NotImplementedError
|
|
89
|
+
|
|
90
|
+
@abstractmethod
|
|
91
|
+
def get_sessions(
|
|
92
|
+
self,
|
|
93
|
+
session_type: SessionType,
|
|
94
|
+
user_id: Optional[str] = None,
|
|
95
|
+
component_id: Optional[str] = None,
|
|
96
|
+
session_name: Optional[str] = None,
|
|
97
|
+
start_timestamp: Optional[int] = None,
|
|
98
|
+
end_timestamp: Optional[int] = None,
|
|
99
|
+
limit: Optional[int] = None,
|
|
100
|
+
page: Optional[int] = None,
|
|
101
|
+
sort_by: Optional[str] = None,
|
|
102
|
+
sort_order: Optional[str] = None,
|
|
103
|
+
deserialize: Optional[bool] = True,
|
|
104
|
+
) -> Union[List[Session], Tuple[List[Dict[str, Any]], int]]:
|
|
105
|
+
raise NotImplementedError
|
|
106
|
+
|
|
107
|
+
@abstractmethod
|
|
108
|
+
def rename_session(
|
|
109
|
+
self,
|
|
110
|
+
session_id: str,
|
|
111
|
+
session_type: SessionType,
|
|
112
|
+
session_name: str,
|
|
113
|
+
deserialize: Optional[bool] = True,
|
|
114
|
+
) -> Optional[Union[Session, Dict[str, Any]]]:
|
|
115
|
+
raise NotImplementedError
|
|
116
|
+
|
|
117
|
+
@abstractmethod
|
|
118
|
+
def upsert_session(
|
|
119
|
+
self, session: Session, deserialize: Optional[bool] = True
|
|
120
|
+
) -> Optional[Union[Session, Dict[str, Any]]]:
|
|
121
|
+
raise NotImplementedError
|
|
122
|
+
|
|
123
|
+
@abstractmethod
|
|
124
|
+
def upsert_sessions(
|
|
125
|
+
self,
|
|
126
|
+
sessions: List[Session],
|
|
127
|
+
deserialize: Optional[bool] = True,
|
|
128
|
+
preserve_updated_at: bool = False,
|
|
129
|
+
) -> List[Union[Session, Dict[str, Any]]]:
|
|
130
|
+
"""Bulk upsert multiple sessions for improved performance on large datasets."""
|
|
131
|
+
raise NotImplementedError
|
|
132
|
+
|
|
133
|
+
# --- Memory ---
|
|
134
|
+
@abstractmethod
|
|
135
|
+
def clear_memories(self) -> None:
|
|
136
|
+
raise NotImplementedError
|
|
137
|
+
|
|
138
|
+
@abstractmethod
|
|
139
|
+
def delete_user_memory(self, memory_id: str, user_id: Optional[str] = None) -> None:
|
|
140
|
+
raise NotImplementedError
|
|
141
|
+
|
|
142
|
+
@abstractmethod
|
|
143
|
+
def delete_user_memories(self, memory_ids: List[str], user_id: Optional[str] = None) -> None:
|
|
144
|
+
raise NotImplementedError
|
|
145
|
+
|
|
146
|
+
@abstractmethod
|
|
147
|
+
def get_all_memory_topics(self, user_id: Optional[str] = None) -> List[str]:
|
|
148
|
+
raise NotImplementedError
|
|
149
|
+
|
|
150
|
+
@abstractmethod
|
|
151
|
+
def get_user_memory(
|
|
152
|
+
self,
|
|
153
|
+
memory_id: str,
|
|
154
|
+
deserialize: Optional[bool] = True,
|
|
155
|
+
user_id: Optional[str] = None,
|
|
156
|
+
) -> Optional[Union[UserMemory, Dict[str, Any]]]:
|
|
157
|
+
raise NotImplementedError
|
|
158
|
+
|
|
159
|
+
@abstractmethod
|
|
160
|
+
def get_user_memories(
|
|
161
|
+
self,
|
|
162
|
+
user_id: Optional[str] = None,
|
|
163
|
+
agent_id: Optional[str] = None,
|
|
164
|
+
team_id: Optional[str] = None,
|
|
165
|
+
topics: Optional[List[str]] = None,
|
|
166
|
+
search_content: Optional[str] = None,
|
|
167
|
+
limit: Optional[int] = None,
|
|
168
|
+
page: Optional[int] = None,
|
|
169
|
+
sort_by: Optional[str] = None,
|
|
170
|
+
sort_order: Optional[str] = None,
|
|
171
|
+
deserialize: Optional[bool] = True,
|
|
172
|
+
) -> Union[List[UserMemory], Tuple[List[Dict[str, Any]], int]]:
|
|
173
|
+
raise NotImplementedError
|
|
174
|
+
|
|
175
|
+
@abstractmethod
|
|
176
|
+
def get_user_memory_stats(
|
|
177
|
+
self,
|
|
178
|
+
limit: Optional[int] = None,
|
|
179
|
+
page: Optional[int] = None,
|
|
180
|
+
user_id: Optional[str] = None,
|
|
181
|
+
) -> Tuple[List[Dict[str, Any]], int]:
|
|
182
|
+
raise NotImplementedError
|
|
183
|
+
|
|
184
|
+
@abstractmethod
|
|
185
|
+
def upsert_user_memory(
|
|
186
|
+
self, memory: UserMemory, deserialize: Optional[bool] = True
|
|
187
|
+
) -> Optional[Union[UserMemory, Dict[str, Any]]]:
|
|
188
|
+
raise NotImplementedError
|
|
189
|
+
|
|
190
|
+
@abstractmethod
|
|
191
|
+
def upsert_memories(
|
|
192
|
+
self,
|
|
193
|
+
memories: List[UserMemory],
|
|
194
|
+
deserialize: Optional[bool] = True,
|
|
195
|
+
preserve_updated_at: bool = False,
|
|
196
|
+
) -> List[Union[UserMemory, Dict[str, Any]]]:
|
|
197
|
+
"""Bulk upsert multiple memories for improved performance on large datasets."""
|
|
198
|
+
raise NotImplementedError
|
|
199
|
+
|
|
200
|
+
# --- Metrics ---
|
|
201
|
+
@abstractmethod
|
|
202
|
+
def get_metrics(
|
|
203
|
+
self,
|
|
204
|
+
starting_date: Optional[date] = None,
|
|
205
|
+
ending_date: Optional[date] = None,
|
|
206
|
+
) -> Tuple[List[Dict[str, Any]], Optional[int]]:
|
|
207
|
+
raise NotImplementedError
|
|
208
|
+
|
|
209
|
+
@abstractmethod
|
|
210
|
+
def calculate_metrics(self) -> Optional[Any]:
|
|
211
|
+
raise NotImplementedError
|
|
212
|
+
|
|
213
|
+
# --- Knowledge ---
|
|
214
|
+
@abstractmethod
|
|
215
|
+
def delete_knowledge_content(self, id: str):
|
|
216
|
+
"""Delete a knowledge row from the database.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
id (str): The ID of the knowledge row to delete.
|
|
220
|
+
"""
|
|
221
|
+
raise NotImplementedError
|
|
222
|
+
|
|
223
|
+
@abstractmethod
|
|
224
|
+
def get_knowledge_content(self, id: str) -> Optional[KnowledgeRow]:
|
|
225
|
+
"""Get a knowledge row from the database.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
id (str): The ID of the knowledge row to get.
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
Optional[KnowledgeRow]: The knowledge row, or None if it doesn't exist.
|
|
232
|
+
"""
|
|
233
|
+
raise NotImplementedError
|
|
234
|
+
|
|
235
|
+
@abstractmethod
|
|
236
|
+
def get_knowledge_contents(
|
|
237
|
+
self,
|
|
238
|
+
limit: Optional[int] = None,
|
|
239
|
+
page: Optional[int] = None,
|
|
240
|
+
sort_by: Optional[str] = None,
|
|
241
|
+
sort_order: Optional[str] = None,
|
|
242
|
+
) -> Tuple[List[KnowledgeRow], int]:
|
|
243
|
+
"""Get all knowledge contents from the database.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
limit (Optional[int]): The maximum number of knowledge contents to return.
|
|
247
|
+
page (Optional[int]): The page number.
|
|
248
|
+
sort_by (Optional[str]): The column to sort by.
|
|
249
|
+
sort_order (Optional[str]): The order to sort by.
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
Tuple[List[KnowledgeRow], int]: The knowledge contents and total count.
|
|
253
|
+
|
|
254
|
+
Raises:
|
|
255
|
+
Exception: If an error occurs during retrieval.
|
|
256
|
+
"""
|
|
257
|
+
raise NotImplementedError
|
|
258
|
+
|
|
259
|
+
@abstractmethod
|
|
260
|
+
def upsert_knowledge_content(self, knowledge_row: KnowledgeRow):
|
|
261
|
+
"""Upsert knowledge content in the database.
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
knowledge_row (KnowledgeRow): The knowledge row to upsert.
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Optional[KnowledgeRow]: The upserted knowledge row, or None if the operation fails.
|
|
268
|
+
"""
|
|
269
|
+
raise NotImplementedError
|
|
270
|
+
|
|
271
|
+
# --- Evals ---
|
|
272
|
+
@abstractmethod
|
|
273
|
+
def create_eval_run(self, eval_run: EvalRunRecord) -> Optional[EvalRunRecord]:
|
|
274
|
+
raise NotImplementedError
|
|
275
|
+
|
|
276
|
+
@abstractmethod
|
|
277
|
+
def delete_eval_runs(self, eval_run_ids: List[str]) -> None:
|
|
278
|
+
raise NotImplementedError
|
|
279
|
+
|
|
280
|
+
@abstractmethod
|
|
281
|
+
def get_eval_run(
|
|
282
|
+
self, eval_run_id: str, deserialize: Optional[bool] = True
|
|
283
|
+
) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
|
|
284
|
+
raise NotImplementedError
|
|
285
|
+
|
|
286
|
+
@abstractmethod
|
|
287
|
+
def get_eval_runs(
|
|
288
|
+
self,
|
|
289
|
+
limit: Optional[int] = None,
|
|
290
|
+
page: Optional[int] = None,
|
|
291
|
+
sort_by: Optional[str] = None,
|
|
292
|
+
sort_order: Optional[str] = None,
|
|
293
|
+
agent_id: Optional[str] = None,
|
|
294
|
+
team_id: Optional[str] = None,
|
|
295
|
+
workflow_id: Optional[str] = None,
|
|
296
|
+
model_id: Optional[str] = None,
|
|
297
|
+
filter_type: Optional[EvalFilterType] = None,
|
|
298
|
+
eval_type: Optional[List[EvalType]] = None,
|
|
299
|
+
deserialize: Optional[bool] = True,
|
|
300
|
+
) -> Union[List[EvalRunRecord], Tuple[List[Dict[str, Any]], int]]:
|
|
301
|
+
raise NotImplementedError
|
|
302
|
+
|
|
303
|
+
@abstractmethod
|
|
304
|
+
def rename_eval_run(
|
|
305
|
+
self, eval_run_id: str, name: str, deserialize: Optional[bool] = True
|
|
306
|
+
) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
|
|
307
|
+
raise NotImplementedError
|
|
308
|
+
|
|
309
|
+
# --- Traces ---
|
|
310
|
+
@abstractmethod
|
|
311
|
+
def upsert_trace(self, trace: "Trace") -> None:
|
|
312
|
+
"""Create or update a single trace record in the database.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
trace: The Trace object to store (one per trace_id).
|
|
316
|
+
"""
|
|
317
|
+
raise NotImplementedError
|
|
318
|
+
|
|
319
|
+
@abstractmethod
|
|
320
|
+
def get_trace(
|
|
321
|
+
self,
|
|
322
|
+
trace_id: Optional[str] = None,
|
|
323
|
+
run_id: Optional[str] = None,
|
|
324
|
+
session_id: Optional[str] = None,
|
|
325
|
+
user_id: Optional[str] = None,
|
|
326
|
+
agent_id: Optional[str] = None,
|
|
327
|
+
):
|
|
328
|
+
"""Get a single trace by trace_id or other filters.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
trace_id: The unique trace identifier.
|
|
332
|
+
run_id: Filter by run ID (returns first match).
|
|
333
|
+
session_id: Filter by session ID (returns first match).
|
|
334
|
+
user_id: Filter by user ID (returns first match).
|
|
335
|
+
agent_id: Filter by agent ID (returns first match).
|
|
336
|
+
|
|
337
|
+
Returns:
|
|
338
|
+
Optional[Trace]: The trace if found, None otherwise.
|
|
339
|
+
|
|
340
|
+
Note:
|
|
341
|
+
If multiple filters are provided, trace_id takes precedence.
|
|
342
|
+
For other filters, the most recent trace is returned.
|
|
343
|
+
"""
|
|
344
|
+
raise NotImplementedError
|
|
345
|
+
|
|
346
|
+
@abstractmethod
|
|
347
|
+
def get_traces(
|
|
348
|
+
self,
|
|
349
|
+
run_id: Optional[str] = None,
|
|
350
|
+
session_id: Optional[str] = None,
|
|
351
|
+
user_id: Optional[str] = None,
|
|
352
|
+
agent_id: Optional[str] = None,
|
|
353
|
+
team_id: Optional[str] = None,
|
|
354
|
+
workflow_id: Optional[str] = None,
|
|
355
|
+
status: Optional[str] = None,
|
|
356
|
+
start_time: Optional[datetime] = None,
|
|
357
|
+
end_time: Optional[datetime] = None,
|
|
358
|
+
limit: Optional[int] = 20,
|
|
359
|
+
page: Optional[int] = 1,
|
|
360
|
+
) -> tuple[List, int]:
|
|
361
|
+
"""Get traces matching the provided filters with pagination.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
run_id: Filter by run ID.
|
|
365
|
+
session_id: Filter by session ID.
|
|
366
|
+
user_id: Filter by user ID.
|
|
367
|
+
agent_id: Filter by agent ID.
|
|
368
|
+
team_id: Filter by team ID.
|
|
369
|
+
workflow_id: Filter by workflow ID.
|
|
370
|
+
status: Filter by status (OK, ERROR).
|
|
371
|
+
start_time: Filter traces starting after this datetime.
|
|
372
|
+
end_time: Filter traces ending before this datetime.
|
|
373
|
+
limit: Maximum number of traces to return per page.
|
|
374
|
+
page: Page number (1-indexed).
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
tuple[List[Trace], int]: Tuple of (list of matching traces with datetime fields, total count).
|
|
378
|
+
"""
|
|
379
|
+
raise NotImplementedError
|
|
380
|
+
|
|
381
|
+
@abstractmethod
|
|
382
|
+
def get_trace_stats(
|
|
383
|
+
self,
|
|
384
|
+
user_id: Optional[str] = None,
|
|
385
|
+
agent_id: Optional[str] = None,
|
|
386
|
+
team_id: Optional[str] = None,
|
|
387
|
+
workflow_id: Optional[str] = None,
|
|
388
|
+
start_time: Optional[datetime] = None,
|
|
389
|
+
end_time: Optional[datetime] = None,
|
|
390
|
+
limit: Optional[int] = 20,
|
|
391
|
+
page: Optional[int] = 1,
|
|
392
|
+
) -> tuple[List[Dict[str, Any]], int]:
|
|
393
|
+
"""Get trace statistics grouped by session.
|
|
394
|
+
|
|
395
|
+
Args:
|
|
396
|
+
user_id: Filter by user ID.
|
|
397
|
+
agent_id: Filter by agent ID.
|
|
398
|
+
team_id: Filter by team ID.
|
|
399
|
+
workflow_id: Filter by workflow ID.
|
|
400
|
+
start_time: Filter sessions with traces created after this datetime.
|
|
401
|
+
end_time: Filter sessions with traces created before this datetime.
|
|
402
|
+
limit: Maximum number of sessions to return per page.
|
|
403
|
+
page: Page number (1-indexed).
|
|
404
|
+
|
|
405
|
+
Returns:
|
|
406
|
+
tuple[List[Dict], int]: Tuple of (list of session stats dicts, total count).
|
|
407
|
+
Each dict contains: session_id, user_id, agent_id, team_id, total_traces,
|
|
408
|
+
first_trace_at (datetime), last_trace_at (datetime).
|
|
409
|
+
"""
|
|
410
|
+
raise NotImplementedError
|
|
411
|
+
|
|
412
|
+
# --- Spans ---
|
|
413
|
+
@abstractmethod
|
|
414
|
+
def create_span(self, span: "Span") -> None:
|
|
415
|
+
"""Create a single span in the database.
|
|
416
|
+
|
|
417
|
+
Args:
|
|
418
|
+
span: The Span object to store.
|
|
419
|
+
"""
|
|
420
|
+
raise NotImplementedError
|
|
421
|
+
|
|
422
|
+
@abstractmethod
|
|
423
|
+
def create_spans(self, spans: List) -> None:
|
|
424
|
+
"""Create multiple spans in the database as a batch.
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
spans: List of Span objects to store.
|
|
428
|
+
"""
|
|
429
|
+
raise NotImplementedError
|
|
430
|
+
|
|
431
|
+
@abstractmethod
|
|
432
|
+
def get_span(self, span_id: str):
|
|
433
|
+
"""Get a single span by its span_id.
|
|
434
|
+
|
|
435
|
+
Args:
|
|
436
|
+
span_id: The unique span identifier.
|
|
437
|
+
|
|
438
|
+
Returns:
|
|
439
|
+
Optional[Span]: The span if found, None otherwise.
|
|
440
|
+
"""
|
|
441
|
+
raise NotImplementedError
|
|
442
|
+
|
|
443
|
+
@abstractmethod
|
|
444
|
+
def get_spans(
|
|
445
|
+
self,
|
|
446
|
+
trace_id: Optional[str] = None,
|
|
447
|
+
parent_span_id: Optional[str] = None,
|
|
448
|
+
limit: Optional[int] = 1000,
|
|
449
|
+
) -> List:
|
|
450
|
+
"""Get spans matching the provided filters.
|
|
451
|
+
|
|
452
|
+
Args:
|
|
453
|
+
trace_id: Filter by trace ID.
|
|
454
|
+
parent_span_id: Filter by parent span ID.
|
|
455
|
+
limit: Maximum number of spans to return.
|
|
456
|
+
|
|
457
|
+
Returns:
|
|
458
|
+
List[Span]: List of matching spans.
|
|
459
|
+
"""
|
|
460
|
+
raise NotImplementedError
|
|
461
|
+
|
|
462
|
+
# --- Cultural Knowledge ---
|
|
463
|
+
@abstractmethod
|
|
464
|
+
def clear_cultural_knowledge(self) -> None:
|
|
465
|
+
raise NotImplementedError
|
|
466
|
+
|
|
467
|
+
@abstractmethod
|
|
468
|
+
def delete_cultural_knowledge(self, id: str) -> None:
|
|
469
|
+
raise NotImplementedError
|
|
470
|
+
|
|
471
|
+
@abstractmethod
|
|
472
|
+
def get_cultural_knowledge(self, id: str) -> Optional[CulturalKnowledge]:
|
|
473
|
+
raise NotImplementedError
|
|
474
|
+
|
|
475
|
+
@abstractmethod
|
|
476
|
+
def get_all_cultural_knowledge(
|
|
477
|
+
self,
|
|
478
|
+
name: Optional[str] = None,
|
|
479
|
+
limit: Optional[int] = None,
|
|
480
|
+
page: Optional[int] = None,
|
|
481
|
+
sort_by: Optional[str] = None,
|
|
482
|
+
sort_order: Optional[str] = None,
|
|
483
|
+
agent_id: Optional[str] = None,
|
|
484
|
+
team_id: Optional[str] = None,
|
|
485
|
+
) -> Optional[List[CulturalKnowledge]]:
|
|
486
|
+
raise NotImplementedError
|
|
487
|
+
|
|
488
|
+
@abstractmethod
|
|
489
|
+
def upsert_cultural_knowledge(self, cultural_knowledge: CulturalKnowledge) -> Optional[CulturalKnowledge]:
|
|
490
|
+
raise NotImplementedError
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
class AsyncBaseDb(ABC):
|
|
494
|
+
"""Base abstract class for all our async database implementations."""
|
|
495
|
+
|
|
496
|
+
def __init__(
|
|
497
|
+
self,
|
|
498
|
+
id: Optional[str] = None,
|
|
499
|
+
session_table: Optional[str] = None,
|
|
500
|
+
memory_table: Optional[str] = None,
|
|
501
|
+
metrics_table: Optional[str] = None,
|
|
502
|
+
eval_table: Optional[str] = None,
|
|
503
|
+
knowledge_table: Optional[str] = None,
|
|
504
|
+
traces_table: Optional[str] = None,
|
|
505
|
+
spans_table: Optional[str] = None,
|
|
506
|
+
culture_table: Optional[str] = None,
|
|
507
|
+
versions_table: Optional[str] = None,
|
|
508
|
+
):
|
|
509
|
+
self.id = id or str(uuid4())
|
|
510
|
+
self.session_table_name = session_table or "agno_sessions"
|
|
511
|
+
self.memory_table_name = memory_table or "agno_memories"
|
|
512
|
+
self.metrics_table_name = metrics_table or "agno_metrics"
|
|
513
|
+
self.eval_table_name = eval_table or "agno_eval_runs"
|
|
514
|
+
self.knowledge_table_name = knowledge_table or "agno_knowledge"
|
|
515
|
+
self.trace_table_name = traces_table or "agno_traces"
|
|
516
|
+
self.span_table_name = spans_table or "agno_spans"
|
|
517
|
+
self.culture_table_name = culture_table or "agno_culture"
|
|
518
|
+
self.versions_table_name = versions_table or "agno_schema_versions"
|
|
519
|
+
|
|
520
|
+
@abstractmethod
|
|
521
|
+
async def table_exists(self, table_name: str) -> bool:
|
|
522
|
+
"""Check if a table with the given name exists in this database.
|
|
523
|
+
|
|
524
|
+
Default implementation returns True if the table name is configured.
|
|
525
|
+
Subclasses should override this to perform actual existence checks.
|
|
526
|
+
|
|
527
|
+
Args:
|
|
528
|
+
table_name: Name of the table to check
|
|
529
|
+
|
|
530
|
+
Returns:
|
|
531
|
+
bool: True if the table exists, False otherwise
|
|
532
|
+
"""
|
|
533
|
+
raise NotImplementedError
|
|
534
|
+
|
|
535
|
+
@abstractmethod
|
|
536
|
+
async def get_latest_schema_version(self, table_name: str) -> str:
|
|
537
|
+
raise NotImplementedError
|
|
538
|
+
|
|
539
|
+
@abstractmethod
|
|
540
|
+
async def upsert_schema_version(self, table_name: str, version: str):
|
|
541
|
+
"""Upsert the schema version into the database."""
|
|
542
|
+
raise NotImplementedError
|
|
543
|
+
|
|
544
|
+
# --- Sessions ---
|
|
545
|
+
@abstractmethod
|
|
546
|
+
async def delete_session(self, session_id: str) -> bool:
|
|
547
|
+
raise NotImplementedError
|
|
548
|
+
|
|
549
|
+
@abstractmethod
|
|
550
|
+
async def delete_sessions(self, session_ids: List[str]) -> None:
|
|
551
|
+
raise NotImplementedError
|
|
552
|
+
|
|
553
|
+
@abstractmethod
|
|
554
|
+
async def get_session(
|
|
555
|
+
self,
|
|
556
|
+
session_id: str,
|
|
557
|
+
session_type: SessionType,
|
|
558
|
+
user_id: Optional[str] = None,
|
|
559
|
+
deserialize: Optional[bool] = True,
|
|
560
|
+
) -> Optional[Union[Session, Dict[str, Any]]]:
|
|
561
|
+
raise NotImplementedError
|
|
562
|
+
|
|
563
|
+
@abstractmethod
|
|
564
|
+
async def get_sessions(
|
|
565
|
+
self,
|
|
566
|
+
session_type: Optional[SessionType] = None,
|
|
567
|
+
user_id: Optional[str] = None,
|
|
568
|
+
component_id: Optional[str] = None,
|
|
569
|
+
session_name: Optional[str] = None,
|
|
570
|
+
start_timestamp: Optional[int] = None,
|
|
571
|
+
end_timestamp: Optional[int] = None,
|
|
572
|
+
limit: Optional[int] = None,
|
|
573
|
+
page: Optional[int] = None,
|
|
574
|
+
sort_by: Optional[str] = None,
|
|
575
|
+
sort_order: Optional[str] = None,
|
|
576
|
+
deserialize: Optional[bool] = True,
|
|
577
|
+
) -> Union[List[Session], Tuple[List[Dict[str, Any]], int]]:
|
|
578
|
+
raise NotImplementedError
|
|
579
|
+
|
|
580
|
+
@abstractmethod
|
|
581
|
+
async def rename_session(
|
|
582
|
+
self,
|
|
583
|
+
session_id: str,
|
|
584
|
+
session_type: SessionType,
|
|
585
|
+
session_name: str,
|
|
586
|
+
deserialize: Optional[bool] = True,
|
|
587
|
+
) -> Optional[Union[Session, Dict[str, Any]]]:
|
|
588
|
+
raise NotImplementedError
|
|
589
|
+
|
|
590
|
+
@abstractmethod
|
|
591
|
+
async def upsert_session(
|
|
592
|
+
self, session: Session, deserialize: Optional[bool] = True
|
|
593
|
+
) -> Optional[Union[Session, Dict[str, Any]]]:
|
|
594
|
+
raise NotImplementedError
|
|
595
|
+
|
|
596
|
+
# --- Memory ---
|
|
597
|
+
@abstractmethod
|
|
598
|
+
async def clear_memories(self) -> None:
|
|
599
|
+
raise NotImplementedError
|
|
600
|
+
|
|
601
|
+
@abstractmethod
|
|
602
|
+
async def delete_user_memory(self, memory_id: str, user_id: Optional[str] = None) -> None:
|
|
603
|
+
raise NotImplementedError
|
|
604
|
+
|
|
605
|
+
@abstractmethod
|
|
606
|
+
async def delete_user_memories(self, memory_ids: List[str], user_id: Optional[str] = None) -> None:
|
|
607
|
+
raise NotImplementedError
|
|
608
|
+
|
|
609
|
+
@abstractmethod
|
|
610
|
+
async def get_all_memory_topics(self, user_id: Optional[str] = None) -> List[str]:
|
|
611
|
+
raise NotImplementedError
|
|
612
|
+
|
|
613
|
+
@abstractmethod
|
|
614
|
+
async def get_user_memory(
|
|
615
|
+
self,
|
|
616
|
+
memory_id: str,
|
|
617
|
+
deserialize: Optional[bool] = True,
|
|
618
|
+
user_id: Optional[str] = None,
|
|
619
|
+
) -> Optional[Union[UserMemory, Dict[str, Any]]]:
|
|
620
|
+
raise NotImplementedError
|
|
621
|
+
|
|
622
|
+
@abstractmethod
|
|
623
|
+
async def get_user_memories(
|
|
624
|
+
self,
|
|
625
|
+
user_id: Optional[str] = None,
|
|
626
|
+
agent_id: Optional[str] = None,
|
|
627
|
+
team_id: Optional[str] = None,
|
|
628
|
+
topics: Optional[List[str]] = None,
|
|
629
|
+
search_content: Optional[str] = None,
|
|
630
|
+
limit: Optional[int] = None,
|
|
631
|
+
page: Optional[int] = None,
|
|
632
|
+
sort_by: Optional[str] = None,
|
|
633
|
+
sort_order: Optional[str] = None,
|
|
634
|
+
deserialize: Optional[bool] = True,
|
|
635
|
+
) -> Union[List[UserMemory], Tuple[List[Dict[str, Any]], int]]:
|
|
636
|
+
raise NotImplementedError
|
|
637
|
+
|
|
638
|
+
@abstractmethod
|
|
639
|
+
async def get_user_memory_stats(
|
|
640
|
+
self,
|
|
641
|
+
limit: Optional[int] = None,
|
|
642
|
+
page: Optional[int] = None,
|
|
643
|
+
user_id: Optional[str] = None,
|
|
644
|
+
) -> Tuple[List[Dict[str, Any]], int]:
|
|
645
|
+
raise NotImplementedError
|
|
646
|
+
|
|
647
|
+
@abstractmethod
|
|
648
|
+
async def upsert_user_memory(
|
|
649
|
+
self, memory: UserMemory, deserialize: Optional[bool] = True
|
|
650
|
+
) -> Optional[Union[UserMemory, Dict[str, Any]]]:
|
|
651
|
+
raise NotImplementedError
|
|
652
|
+
|
|
653
|
+
# --- Metrics ---
|
|
654
|
+
@abstractmethod
|
|
655
|
+
async def get_metrics(
|
|
656
|
+
self, starting_date: Optional[date] = None, ending_date: Optional[date] = None
|
|
657
|
+
) -> Tuple[List[Dict[str, Any]], Optional[int]]:
|
|
658
|
+
raise NotImplementedError
|
|
659
|
+
|
|
660
|
+
@abstractmethod
|
|
661
|
+
async def calculate_metrics(self) -> Optional[Any]:
|
|
662
|
+
raise NotImplementedError
|
|
663
|
+
|
|
664
|
+
# --- Knowledge ---
|
|
665
|
+
@abstractmethod
|
|
666
|
+
async def delete_knowledge_content(self, id: str):
|
|
667
|
+
"""Delete a knowledge row from the database.
|
|
668
|
+
|
|
669
|
+
Args:
|
|
670
|
+
id (str): The ID of the knowledge row to delete.
|
|
671
|
+
"""
|
|
672
|
+
raise NotImplementedError
|
|
673
|
+
|
|
674
|
+
@abstractmethod
|
|
675
|
+
async def get_knowledge_content(self, id: str) -> Optional[KnowledgeRow]:
|
|
676
|
+
"""Get a knowledge row from the database.
|
|
677
|
+
|
|
678
|
+
Args:
|
|
679
|
+
id (str): The ID of the knowledge row to get.
|
|
680
|
+
|
|
681
|
+
Returns:
|
|
682
|
+
Optional[KnowledgeRow]: The knowledge row, or None if it doesn't exist.
|
|
683
|
+
"""
|
|
684
|
+
raise NotImplementedError
|
|
685
|
+
|
|
686
|
+
@abstractmethod
|
|
687
|
+
async def get_knowledge_contents(
|
|
688
|
+
self,
|
|
689
|
+
limit: Optional[int] = None,
|
|
690
|
+
page: Optional[int] = None,
|
|
691
|
+
sort_by: Optional[str] = None,
|
|
692
|
+
sort_order: Optional[str] = None,
|
|
693
|
+
) -> Tuple[List[KnowledgeRow], int]:
|
|
694
|
+
"""Get all knowledge contents from the database.
|
|
695
|
+
|
|
696
|
+
Args:
|
|
697
|
+
limit (Optional[int]): The maximum number of knowledge contents to return.
|
|
698
|
+
page (Optional[int]): The page number.
|
|
699
|
+
sort_by (Optional[str]): The column to sort by.
|
|
700
|
+
sort_order (Optional[str]): The order to sort by.
|
|
701
|
+
|
|
702
|
+
Returns:
|
|
703
|
+
Tuple[List[KnowledgeRow], int]: The knowledge contents and total count.
|
|
704
|
+
|
|
705
|
+
Raises:
|
|
706
|
+
Exception: If an error occurs during retrieval.
|
|
707
|
+
"""
|
|
708
|
+
raise NotImplementedError
|
|
709
|
+
|
|
710
|
+
@abstractmethod
|
|
711
|
+
async def upsert_knowledge_content(self, knowledge_row: KnowledgeRow):
|
|
712
|
+
"""Upsert knowledge content in the database.
|
|
713
|
+
|
|
714
|
+
Args:
|
|
715
|
+
knowledge_row (KnowledgeRow): The knowledge row to upsert.
|
|
716
|
+
|
|
717
|
+
Returns:
|
|
718
|
+
Optional[KnowledgeRow]: The upserted knowledge row, or None if the operation fails.
|
|
719
|
+
"""
|
|
720
|
+
raise NotImplementedError
|
|
721
|
+
|
|
722
|
+
# --- Evals ---
|
|
723
|
+
@abstractmethod
|
|
724
|
+
async def create_eval_run(self, eval_run: EvalRunRecord) -> Optional[EvalRunRecord]:
|
|
725
|
+
raise NotImplementedError
|
|
726
|
+
|
|
727
|
+
@abstractmethod
|
|
728
|
+
async def delete_eval_runs(self, eval_run_ids: List[str]) -> None:
|
|
729
|
+
raise NotImplementedError
|
|
730
|
+
|
|
731
|
+
@abstractmethod
|
|
732
|
+
async def get_eval_run(
|
|
733
|
+
self, eval_run_id: str, deserialize: Optional[bool] = True
|
|
734
|
+
) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
|
|
735
|
+
raise NotImplementedError
|
|
736
|
+
|
|
737
|
+
@abstractmethod
|
|
738
|
+
async def get_eval_runs(
|
|
739
|
+
self,
|
|
740
|
+
limit: Optional[int] = None,
|
|
741
|
+
page: Optional[int] = None,
|
|
742
|
+
sort_by: Optional[str] = None,
|
|
743
|
+
sort_order: Optional[str] = None,
|
|
744
|
+
agent_id: Optional[str] = None,
|
|
745
|
+
team_id: Optional[str] = None,
|
|
746
|
+
workflow_id: Optional[str] = None,
|
|
747
|
+
model_id: Optional[str] = None,
|
|
748
|
+
filter_type: Optional[EvalFilterType] = None,
|
|
749
|
+
eval_type: Optional[List[EvalType]] = None,
|
|
750
|
+
deserialize: Optional[bool] = True,
|
|
751
|
+
) -> Union[List[EvalRunRecord], Tuple[List[Dict[str, Any]], int]]:
|
|
752
|
+
raise NotImplementedError
|
|
753
|
+
|
|
754
|
+
@abstractmethod
|
|
755
|
+
async def rename_eval_run(
|
|
756
|
+
self, eval_run_id: str, name: str, deserialize: Optional[bool] = True
|
|
757
|
+
) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
|
|
758
|
+
raise NotImplementedError
|
|
759
|
+
|
|
760
|
+
# --- Traces ---
|
|
761
|
+
@abstractmethod
|
|
762
|
+
async def upsert_trace(self, trace) -> None:
|
|
763
|
+
"""Create or update a single trace record in the database.
|
|
764
|
+
|
|
765
|
+
Args:
|
|
766
|
+
trace: The Trace object to update (one per trace_id).
|
|
767
|
+
"""
|
|
768
|
+
raise NotImplementedError
|
|
769
|
+
|
|
770
|
+
@abstractmethod
|
|
771
|
+
async def get_trace(
|
|
772
|
+
self,
|
|
773
|
+
trace_id: Optional[str] = None,
|
|
774
|
+
run_id: Optional[str] = None,
|
|
775
|
+
session_id: Optional[str] = None,
|
|
776
|
+
user_id: Optional[str] = None,
|
|
777
|
+
agent_id: Optional[str] = None,
|
|
778
|
+
):
|
|
779
|
+
"""Get a single trace by trace_id or other filters.
|
|
780
|
+
|
|
781
|
+
Args:
|
|
782
|
+
trace_id: The unique trace identifier.
|
|
783
|
+
run_id: Filter by run ID (returns first match).
|
|
784
|
+
session_id: Filter by session ID (returns first match).
|
|
785
|
+
user_id: Filter by user ID (returns first match).
|
|
786
|
+
agent_id: Filter by agent ID (returns first match).
|
|
787
|
+
|
|
788
|
+
Returns:
|
|
789
|
+
Optional[Trace]: The trace if found, None otherwise.
|
|
790
|
+
|
|
791
|
+
Note:
|
|
792
|
+
If multiple filters are provided, trace_id takes precedence.
|
|
793
|
+
For other filters, the most recent trace is returned.
|
|
794
|
+
"""
|
|
795
|
+
raise NotImplementedError
|
|
796
|
+
|
|
797
|
+
@abstractmethod
|
|
798
|
+
async def get_traces(
|
|
799
|
+
self,
|
|
800
|
+
run_id: Optional[str] = None,
|
|
801
|
+
session_id: Optional[str] = None,
|
|
802
|
+
user_id: Optional[str] = None,
|
|
803
|
+
agent_id: Optional[str] = None,
|
|
804
|
+
team_id: Optional[str] = None,
|
|
805
|
+
workflow_id: Optional[str] = None,
|
|
806
|
+
status: Optional[str] = None,
|
|
807
|
+
start_time: Optional[datetime] = None,
|
|
808
|
+
end_time: Optional[datetime] = None,
|
|
809
|
+
limit: Optional[int] = 20,
|
|
810
|
+
page: Optional[int] = 1,
|
|
811
|
+
) -> tuple[List, int]:
|
|
812
|
+
"""Get traces matching the provided filters with pagination.
|
|
813
|
+
|
|
814
|
+
Args:
|
|
815
|
+
run_id: Filter by run ID.
|
|
816
|
+
session_id: Filter by session ID.
|
|
817
|
+
user_id: Filter by user ID.
|
|
818
|
+
agent_id: Filter by agent ID.
|
|
819
|
+
team_id: Filter by team ID.
|
|
820
|
+
workflow_id: Filter by workflow ID.
|
|
821
|
+
status: Filter by status (OK, ERROR).
|
|
822
|
+
start_time: Filter traces starting after this datetime.
|
|
823
|
+
end_time: Filter traces ending before this datetime.
|
|
824
|
+
limit: Maximum number of traces to return per page.
|
|
825
|
+
page: Page number (1-indexed).
|
|
826
|
+
|
|
827
|
+
Returns:
|
|
828
|
+
tuple[List[Trace], int]: Tuple of (list of matching traces with datetime fields, total count).
|
|
829
|
+
"""
|
|
830
|
+
raise NotImplementedError
|
|
831
|
+
|
|
832
|
+
@abstractmethod
|
|
833
|
+
async def get_trace_stats(
|
|
834
|
+
self,
|
|
835
|
+
user_id: Optional[str] = None,
|
|
836
|
+
agent_id: Optional[str] = None,
|
|
837
|
+
team_id: Optional[str] = None,
|
|
838
|
+
workflow_id: Optional[str] = None,
|
|
839
|
+
start_time: Optional[datetime] = None,
|
|
840
|
+
end_time: Optional[datetime] = None,
|
|
841
|
+
limit: Optional[int] = 20,
|
|
842
|
+
page: Optional[int] = 1,
|
|
843
|
+
) -> tuple[List[Dict[str, Any]], int]:
|
|
844
|
+
"""Get trace statistics grouped by session.
|
|
845
|
+
|
|
846
|
+
Args:
|
|
847
|
+
user_id: Filter by user ID.
|
|
848
|
+
agent_id: Filter by agent ID.
|
|
849
|
+
team_id: Filter by team ID.
|
|
850
|
+
workflow_id: Filter by workflow ID.
|
|
851
|
+
start_time: Filter sessions with traces created after this datetime.
|
|
852
|
+
end_time: Filter sessions with traces created before this datetime.
|
|
853
|
+
limit: Maximum number of sessions to return per page.
|
|
854
|
+
page: Page number (1-indexed).
|
|
855
|
+
|
|
856
|
+
Returns:
|
|
857
|
+
tuple[List[Dict], int]: Tuple of (list of session stats dicts, total count).
|
|
858
|
+
Each dict contains: session_id, user_id, agent_id, team_id, total_traces,
|
|
859
|
+
first_trace_at (datetime), last_trace_at (datetime).
|
|
860
|
+
"""
|
|
861
|
+
raise NotImplementedError
|
|
862
|
+
|
|
863
|
+
# --- Spans ---
|
|
864
|
+
@abstractmethod
|
|
865
|
+
async def create_span(self, span) -> None:
|
|
866
|
+
"""Create a single span in the database.
|
|
867
|
+
|
|
868
|
+
Args:
|
|
869
|
+
span: The Span object to store.
|
|
870
|
+
"""
|
|
871
|
+
raise NotImplementedError
|
|
872
|
+
|
|
873
|
+
@abstractmethod
|
|
874
|
+
async def create_spans(self, spans: List) -> None:
|
|
875
|
+
"""Create multiple spans in the database as a batch.
|
|
876
|
+
|
|
877
|
+
Args:
|
|
878
|
+
spans: List of Span objects to store.
|
|
879
|
+
"""
|
|
880
|
+
raise NotImplementedError
|
|
881
|
+
|
|
882
|
+
@abstractmethod
|
|
883
|
+
async def get_span(self, span_id: str):
|
|
884
|
+
"""Get a single span by its span_id.
|
|
885
|
+
|
|
886
|
+
Args:
|
|
887
|
+
span_id: The unique span identifier.
|
|
888
|
+
|
|
889
|
+
Returns:
|
|
890
|
+
Optional[Span]: The span if found, None otherwise.
|
|
891
|
+
"""
|
|
892
|
+
raise NotImplementedError
|
|
893
|
+
|
|
894
|
+
@abstractmethod
|
|
895
|
+
async def get_spans(
|
|
896
|
+
self,
|
|
897
|
+
trace_id: Optional[str] = None,
|
|
898
|
+
parent_span_id: Optional[str] = None,
|
|
899
|
+
limit: Optional[int] = 1000,
|
|
900
|
+
) -> List:
|
|
901
|
+
"""Get spans matching the provided filters.
|
|
902
|
+
|
|
903
|
+
Args:
|
|
904
|
+
trace_id: Filter by trace ID.
|
|
905
|
+
parent_span_id: Filter by parent span ID.
|
|
906
|
+
limit: Maximum number of spans to return.
|
|
907
|
+
|
|
908
|
+
Returns:
|
|
909
|
+
List[Span]: List of matching spans.
|
|
910
|
+
"""
|
|
911
|
+
raise NotImplementedError
|
|
912
|
+
|
|
913
|
+
# --- Cultural Notions ---
|
|
914
|
+
@abstractmethod
|
|
915
|
+
async def clear_cultural_knowledge(self) -> None:
|
|
916
|
+
raise NotImplementedError
|
|
917
|
+
|
|
918
|
+
@abstractmethod
|
|
919
|
+
async def delete_cultural_knowledge(self, id: str) -> None:
|
|
920
|
+
raise NotImplementedError
|
|
921
|
+
|
|
922
|
+
@abstractmethod
|
|
923
|
+
async def get_cultural_knowledge(
|
|
924
|
+
self, id: str, deserialize: Optional[bool] = True
|
|
925
|
+
) -> Optional[Union[CulturalKnowledge, Dict[str, Any]]]:
|
|
926
|
+
raise NotImplementedError
|
|
927
|
+
|
|
928
|
+
@abstractmethod
|
|
929
|
+
async def get_all_cultural_knowledge(
|
|
930
|
+
self,
|
|
931
|
+
agent_id: Optional[str] = None,
|
|
932
|
+
team_id: Optional[str] = None,
|
|
933
|
+
name: Optional[str] = None,
|
|
934
|
+
limit: Optional[int] = None,
|
|
935
|
+
page: Optional[int] = None,
|
|
936
|
+
sort_by: Optional[str] = None,
|
|
937
|
+
sort_order: Optional[str] = None,
|
|
938
|
+
deserialize: Optional[bool] = True,
|
|
939
|
+
) -> Union[List[CulturalKnowledge], Tuple[List[Dict[str, Any]], int]]:
|
|
940
|
+
raise NotImplementedError
|
|
941
|
+
|
|
942
|
+
@abstractmethod
|
|
943
|
+
async def upsert_cultural_knowledge(
|
|
944
|
+
self, cultural_knowledge: CulturalKnowledge, deserialize: Optional[bool] = True
|
|
945
|
+
) -> Optional[Union[CulturalKnowledge, Dict[str, Any]]]:
|
|
946
|
+
raise NotImplementedError
|