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
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_anthropic_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
"""Check if the model is an Anthropic Claude model with thinking support."""
|
|
12
|
+
is_claude = reasoning_model.__class__.__name__ == "Claude"
|
|
13
|
+
if not is_claude:
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
# Check if provider is Anthropic (not VertexAI)
|
|
17
|
+
is_anthropic_provider = hasattr(reasoning_model, "provider") and reasoning_model.provider == "Anthropic"
|
|
18
|
+
|
|
19
|
+
# Check if thinking parameter is set
|
|
20
|
+
has_thinking = hasattr(reasoning_model, "thinking") and reasoning_model.thinking is not None
|
|
21
|
+
|
|
22
|
+
return is_claude and is_anthropic_provider and has_thinking
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_anthropic_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
26
|
+
"""Get reasoning from an Anthropic Claude model."""
|
|
27
|
+
from agno.run.agent import RunOutput
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
31
|
+
except Exception as e:
|
|
32
|
+
logger.warning(f"Reasoning error: {e}")
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
reasoning_content: str = ""
|
|
36
|
+
redacted_reasoning_content: Optional[str] = None
|
|
37
|
+
|
|
38
|
+
if reasoning_agent_response.messages is not None:
|
|
39
|
+
for msg in reasoning_agent_response.messages:
|
|
40
|
+
if msg.reasoning_content is not None:
|
|
41
|
+
reasoning_content = msg.reasoning_content
|
|
42
|
+
if hasattr(msg, "redacted_reasoning_content") and msg.redacted_reasoning_content is not None:
|
|
43
|
+
redacted_reasoning_content = msg.redacted_reasoning_content
|
|
44
|
+
break
|
|
45
|
+
|
|
46
|
+
return Message(
|
|
47
|
+
role="assistant",
|
|
48
|
+
content=f"<thinking>\n{reasoning_content}\n</thinking>",
|
|
49
|
+
reasoning_content=reasoning_content,
|
|
50
|
+
redacted_reasoning_content=redacted_reasoning_content,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def aget_anthropic_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
55
|
+
"""Get reasoning from an Anthropic Claude model asynchronously."""
|
|
56
|
+
from agno.run.agent import RunOutput
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.warning(f"Reasoning error: {e}")
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
reasoning_content: str = ""
|
|
65
|
+
redacted_reasoning_content: Optional[str] = None
|
|
66
|
+
|
|
67
|
+
if reasoning_agent_response.messages is not None:
|
|
68
|
+
for msg in reasoning_agent_response.messages:
|
|
69
|
+
if msg.reasoning_content is not None:
|
|
70
|
+
reasoning_content = msg.reasoning_content
|
|
71
|
+
if hasattr(msg, "redacted_reasoning_content") and msg.redacted_reasoning_content is not None:
|
|
72
|
+
redacted_reasoning_content = msg.redacted_reasoning_content
|
|
73
|
+
break
|
|
74
|
+
|
|
75
|
+
return Message(
|
|
76
|
+
role="assistant",
|
|
77
|
+
content=f"<thinking>\n{reasoning_content}\n</thinking>",
|
|
78
|
+
reasoning_content=reasoning_content,
|
|
79
|
+
redacted_reasoning_content=redacted_reasoning_content,
|
|
80
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_ai_foundry_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
return reasoning_model.__class__.__name__ == "AzureAIFoundry" and (
|
|
12
|
+
("deepseek" in reasoning_model.id.lower())
|
|
13
|
+
or ("o1" in reasoning_model.id.lower())
|
|
14
|
+
or ("o3" in reasoning_model.id.lower())
|
|
15
|
+
or ("o4" in reasoning_model.id.lower())
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_ai_foundry_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
20
|
+
from agno.run.agent import RunOutput
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
24
|
+
except Exception as e:
|
|
25
|
+
logger.warning(f"Reasoning error: {e}")
|
|
26
|
+
return None
|
|
27
|
+
|
|
28
|
+
reasoning_content: str = ""
|
|
29
|
+
# We use the normal content as no reasoning content is returned
|
|
30
|
+
if reasoning_agent_response.content is not None:
|
|
31
|
+
# Extract content between <think> tags if present
|
|
32
|
+
content = reasoning_agent_response.content
|
|
33
|
+
if "<think>" in content and "</think>" in content:
|
|
34
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
35
|
+
end_idx = content.find("</think>")
|
|
36
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
37
|
+
else:
|
|
38
|
+
reasoning_content = content
|
|
39
|
+
|
|
40
|
+
return Message(
|
|
41
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
async def aget_ai_foundry_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
46
|
+
from agno.run.agent import RunOutput
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
logger.warning(f"Reasoning error: {e}")
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
reasoning_content: str = ""
|
|
55
|
+
if reasoning_agent_response.content is not None:
|
|
56
|
+
# Extract content between <think> tags if present
|
|
57
|
+
content = reasoning_agent_response.content
|
|
58
|
+
if "<think>" in content and "</think>" in content:
|
|
59
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
60
|
+
end_idx = content.find("</think>")
|
|
61
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
62
|
+
else:
|
|
63
|
+
reasoning_content = content
|
|
64
|
+
|
|
65
|
+
return Message(
|
|
66
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
67
|
+
)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_deepseek_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
return reasoning_model.__class__.__name__ == "DeepSeek" and reasoning_model.id.lower() == "deepseek-reasoner"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_deepseek_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
15
|
+
from agno.run.agent import RunOutput
|
|
16
|
+
|
|
17
|
+
# Update system message role to "system"
|
|
18
|
+
for message in messages:
|
|
19
|
+
if message.role == "developer":
|
|
20
|
+
message.role = "system"
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
24
|
+
except Exception as e:
|
|
25
|
+
logger.warning(f"Reasoning error: {e}")
|
|
26
|
+
return None
|
|
27
|
+
|
|
28
|
+
reasoning_content: str = ""
|
|
29
|
+
if reasoning_agent_response.messages is not None:
|
|
30
|
+
for msg in reasoning_agent_response.messages:
|
|
31
|
+
if msg.reasoning_content is not None:
|
|
32
|
+
reasoning_content = msg.reasoning_content
|
|
33
|
+
break
|
|
34
|
+
|
|
35
|
+
return Message(
|
|
36
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def aget_deepseek_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
41
|
+
from agno.run.agent import RunOutput
|
|
42
|
+
|
|
43
|
+
# Update system message role to "system"
|
|
44
|
+
for message in messages:
|
|
45
|
+
if message.role == "developer":
|
|
46
|
+
message.role = "system"
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
logger.warning(f"Reasoning error: {e}")
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
reasoning_content: str = ""
|
|
55
|
+
if reasoning_agent_response.messages is not None:
|
|
56
|
+
for msg in reasoning_agent_response.messages:
|
|
57
|
+
if msg.reasoning_content is not None:
|
|
58
|
+
reasoning_content = msg.reasoning_content
|
|
59
|
+
break
|
|
60
|
+
|
|
61
|
+
return Message(
|
|
62
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
63
|
+
)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from textwrap import dedent
|
|
4
|
+
from typing import Any, Callable, Dict, List, Literal, Optional, Union
|
|
5
|
+
|
|
6
|
+
from agno.models.base import Model
|
|
7
|
+
from agno.reasoning.step import ReasoningSteps
|
|
8
|
+
from agno.tools import Toolkit
|
|
9
|
+
from agno.tools.function import Function
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_default_reasoning_agent(
|
|
13
|
+
reasoning_model: Model,
|
|
14
|
+
min_steps: int,
|
|
15
|
+
max_steps: int,
|
|
16
|
+
tools: Optional[List[Union[Toolkit, Callable, Function, Dict]]] = None,
|
|
17
|
+
tool_call_limit: Optional[int] = None,
|
|
18
|
+
use_json_mode: bool = False,
|
|
19
|
+
telemetry: bool = True,
|
|
20
|
+
debug_mode: bool = False,
|
|
21
|
+
debug_level: Literal[1, 2] = 1,
|
|
22
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
23
|
+
dependencies: Optional[Dict[str, Any]] = None,
|
|
24
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
25
|
+
) -> Optional["Agent"]: # type: ignore # noqa: F821
|
|
26
|
+
from agno.agent import Agent
|
|
27
|
+
|
|
28
|
+
agent = Agent(
|
|
29
|
+
model=reasoning_model,
|
|
30
|
+
description="You are a meticulous, thoughtful, and logical Reasoning Agent who solves complex problems through clear, structured, step-by-step analysis.",
|
|
31
|
+
instructions=dedent(f"""\
|
|
32
|
+
Step 1 - Problem Analysis:
|
|
33
|
+
- Restate the user's task clearly in your own words to ensure full comprehension.
|
|
34
|
+
- Identify explicitly what information is required and what tools or resources might be necessary.
|
|
35
|
+
|
|
36
|
+
Step 2 - Decompose and Strategize:
|
|
37
|
+
- Break down the problem into clearly defined subtasks.
|
|
38
|
+
- Develop at least two distinct strategies or approaches to solving the problem to ensure thoroughness.
|
|
39
|
+
|
|
40
|
+
Step 3 - Intent Clarification and Planning:
|
|
41
|
+
- Clearly articulate the user's intent behind their request.
|
|
42
|
+
- Select the most suitable strategy from Step 2, clearly justifying your choice based on alignment with the user's intent and task constraints.
|
|
43
|
+
- Formulate a detailed step-by-step action plan outlining the sequence of actions needed to solve the problem.
|
|
44
|
+
|
|
45
|
+
Step 4 - Execute the Action Plan:
|
|
46
|
+
For each planned step, document:
|
|
47
|
+
1. **Title**: Concise title summarizing the step.
|
|
48
|
+
2. **Action**: Explicitly state your next action in the first person ('I will...').
|
|
49
|
+
3. **Result**: Execute your action using necessary tools and provide a concise summary of the outcome.
|
|
50
|
+
4. **Reasoning**: Clearly explain your rationale, covering:
|
|
51
|
+
- Necessity: Why this action is required.
|
|
52
|
+
- Considerations: Highlight key considerations, potential challenges, and mitigation strategies.
|
|
53
|
+
- Progression: How this step logically follows from or builds upon previous actions.
|
|
54
|
+
- Assumptions: Explicitly state any assumptions made and justify their validity.
|
|
55
|
+
5. **Next Action**: Clearly select your next step from:
|
|
56
|
+
- **continue**: If further steps are needed.
|
|
57
|
+
- **validate**: When you reach a potential answer, signaling it's ready for validation.
|
|
58
|
+
- **final_answer**: Only if you have confidently validated the solution.
|
|
59
|
+
- **reset**: Immediately restart analysis if a critical error or incorrect result is identified.
|
|
60
|
+
6. **Confidence Score**: Provide a numeric confidence score (0.0–1.0) indicating your certainty in the step's correctness and its outcome.
|
|
61
|
+
|
|
62
|
+
Step 5 - Validation (mandatory before finalizing an answer):
|
|
63
|
+
- Explicitly validate your solution by:
|
|
64
|
+
- Cross-verifying with alternative approaches (developed in Step 2).
|
|
65
|
+
- Using additional available tools or methods to independently confirm accuracy.
|
|
66
|
+
- Clearly document validation results and reasoning behind the validation method chosen.
|
|
67
|
+
- If validation fails or discrepancies arise, explicitly identify errors, reset your analysis, and revise your plan accordingly.
|
|
68
|
+
|
|
69
|
+
Step 6 - Provide the Final Answer:
|
|
70
|
+
- Once thoroughly validated and confident, deliver your solution clearly and succinctly.
|
|
71
|
+
- Restate briefly how your answer addresses the user's original intent and resolves the stated task.
|
|
72
|
+
|
|
73
|
+
General Operational Guidelines:
|
|
74
|
+
- Ensure your analysis remains:
|
|
75
|
+
- **Complete**: Address all elements of the task.
|
|
76
|
+
- **Comprehensive**: Explore diverse perspectives and anticipate potential outcomes.
|
|
77
|
+
- **Logical**: Maintain coherence between all steps.
|
|
78
|
+
- **Actionable**: Present clearly implementable steps and actions.
|
|
79
|
+
- **Insightful**: Offer innovative and unique perspectives where applicable.
|
|
80
|
+
- Always explicitly handle errors and mistakes by resetting or revising steps immediately.
|
|
81
|
+
- Adhere strictly to a minimum of {min_steps} and maximum of {max_steps} steps to ensure effective task resolution.
|
|
82
|
+
- Execute necessary tools proactively and without hesitation, clearly documenting tool usage.
|
|
83
|
+
- Only create a single instance of ReasoningSteps for your response.\
|
|
84
|
+
"""),
|
|
85
|
+
tools=tools,
|
|
86
|
+
tool_call_limit=tool_call_limit,
|
|
87
|
+
output_schema=ReasoningSteps,
|
|
88
|
+
use_json_mode=use_json_mode,
|
|
89
|
+
telemetry=telemetry,
|
|
90
|
+
debug_mode=debug_mode,
|
|
91
|
+
debug_level=debug_level,
|
|
92
|
+
session_state=session_state,
|
|
93
|
+
dependencies=dependencies,
|
|
94
|
+
metadata=metadata,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
return agent
|
agno/reasoning/gemini.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_gemini_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
"""Check if the model is a Gemini model with thinking support."""
|
|
12
|
+
is_gemini_class = reasoning_model.__class__.__name__ == "Gemini"
|
|
13
|
+
if not is_gemini_class:
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
# Check if it's a Gemini 2.5+ model (supports thinking)
|
|
17
|
+
model_id = reasoning_model.id.lower()
|
|
18
|
+
has_thinking_support = "2.5" in model_id
|
|
19
|
+
|
|
20
|
+
# Also check if thinking parameters are set
|
|
21
|
+
# Note: thinking_budget=0 explicitly disables thinking mode per Google's API docs
|
|
22
|
+
has_thinking_budget = (
|
|
23
|
+
hasattr(reasoning_model, "thinking_budget")
|
|
24
|
+
and reasoning_model.thinking_budget is not None
|
|
25
|
+
and reasoning_model.thinking_budget > 0
|
|
26
|
+
)
|
|
27
|
+
has_include_thoughts = hasattr(reasoning_model, "include_thoughts") and reasoning_model.include_thoughts is not None
|
|
28
|
+
|
|
29
|
+
return is_gemini_class and (has_thinking_support or has_thinking_budget or has_include_thoughts)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_gemini_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
33
|
+
"""Get reasoning from a Gemini model."""
|
|
34
|
+
from agno.run.agent import RunOutput
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logger.warning(f"Reasoning error: {e}")
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
reasoning_content: str = ""
|
|
43
|
+
if reasoning_agent_response.messages is not None:
|
|
44
|
+
for msg in reasoning_agent_response.messages:
|
|
45
|
+
if msg.reasoning_content is not None:
|
|
46
|
+
reasoning_content = msg.reasoning_content
|
|
47
|
+
break
|
|
48
|
+
|
|
49
|
+
return Message(
|
|
50
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def aget_gemini_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
55
|
+
"""Get reasoning from a Gemini model asynchronously."""
|
|
56
|
+
from agno.run.agent import RunOutput
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.warning(f"Reasoning error: {e}")
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
reasoning_content: str = ""
|
|
65
|
+
if reasoning_agent_response.messages is not None:
|
|
66
|
+
for msg in reasoning_agent_response.messages:
|
|
67
|
+
if msg.reasoning_content is not None:
|
|
68
|
+
reasoning_content = msg.reasoning_content
|
|
69
|
+
break
|
|
70
|
+
|
|
71
|
+
return Message(
|
|
72
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
73
|
+
)
|
agno/reasoning/groq.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_groq_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
return reasoning_model.__class__.__name__ == "Groq" and "deepseek" in reasoning_model.id.lower()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_groq_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
15
|
+
from agno.run.agent import RunOutput
|
|
16
|
+
|
|
17
|
+
# Update system message role to "system"
|
|
18
|
+
for message in messages:
|
|
19
|
+
if message.role == "developer":
|
|
20
|
+
message.role = "system"
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
24
|
+
except Exception as e:
|
|
25
|
+
logger.warning(f"Reasoning error: {e}")
|
|
26
|
+
return None
|
|
27
|
+
|
|
28
|
+
reasoning_content: str = ""
|
|
29
|
+
if reasoning_agent_response.content is not None:
|
|
30
|
+
# Extract content between <think> tags if present
|
|
31
|
+
content = reasoning_agent_response.content
|
|
32
|
+
if "<think>" in content and "</think>" in content:
|
|
33
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
34
|
+
end_idx = content.find("</think>")
|
|
35
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
36
|
+
else:
|
|
37
|
+
reasoning_content = content
|
|
38
|
+
|
|
39
|
+
return Message(
|
|
40
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def aget_groq_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
45
|
+
from agno.run.agent import RunOutput
|
|
46
|
+
|
|
47
|
+
# Update system message role to "system"
|
|
48
|
+
for message in messages:
|
|
49
|
+
if message.role == "developer":
|
|
50
|
+
message.role = "system"
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
54
|
+
except Exception as e:
|
|
55
|
+
logger.warning(f"Reasoning error: {e}")
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
reasoning_content: str = ""
|
|
59
|
+
if reasoning_agent_response.content is not None:
|
|
60
|
+
# Extract content between <think> tags if present
|
|
61
|
+
content = reasoning_agent_response.content
|
|
62
|
+
if "<think>" in content and "</think>" in content:
|
|
63
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
64
|
+
end_idx = content.find("</think>")
|
|
65
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
66
|
+
else:
|
|
67
|
+
reasoning_content = content
|
|
68
|
+
|
|
69
|
+
return Message(
|
|
70
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
71
|
+
)
|
agno/reasoning/helpers.py
CHANGED
|
@@ -1,11 +1,34 @@
|
|
|
1
|
-
from typing import List
|
|
1
|
+
from typing import Any, Dict, List, Literal, Optional
|
|
2
2
|
|
|
3
|
+
from agno.models.base import Model
|
|
3
4
|
from agno.models.message import Message
|
|
4
5
|
from agno.reasoning.step import NextAction, ReasoningStep
|
|
5
6
|
from agno.run.messages import RunMessages
|
|
6
7
|
from agno.utils.log import logger
|
|
7
8
|
|
|
8
9
|
|
|
10
|
+
def get_reasoning_agent(
|
|
11
|
+
reasoning_model: Model,
|
|
12
|
+
telemetry: bool = False,
|
|
13
|
+
debug_mode: bool = False,
|
|
14
|
+
debug_level: Literal[1, 2] = 1,
|
|
15
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
16
|
+
dependencies: Optional[Dict[str, Any]] = None,
|
|
17
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
18
|
+
) -> "Agent": # type: ignore # noqa: F821
|
|
19
|
+
from agno.agent import Agent
|
|
20
|
+
|
|
21
|
+
return Agent(
|
|
22
|
+
model=reasoning_model,
|
|
23
|
+
telemetry=telemetry,
|
|
24
|
+
debug_mode=debug_mode,
|
|
25
|
+
debug_level=debug_level,
|
|
26
|
+
session_state=session_state,
|
|
27
|
+
dependencies=dependencies,
|
|
28
|
+
metadata=metadata,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
9
32
|
def get_next_action(reasoning_step: ReasoningStep) -> NextAction:
|
|
10
33
|
next_action = reasoning_step.next_action or NextAction.FINAL_ANSWER
|
|
11
34
|
if isinstance(next_action, str):
|
agno/reasoning/ollama.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_ollama_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
return reasoning_model.__class__.__name__ == "Ollama" and (
|
|
12
|
+
"qwq" in reasoning_model.id
|
|
13
|
+
or "deepseek-r1" in reasoning_model.id
|
|
14
|
+
or "qwen2.5-coder" in reasoning_model.id
|
|
15
|
+
or "openthinker" in reasoning_model.id
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_ollama_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
20
|
+
from agno.run.agent import RunOutput
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
24
|
+
except Exception as e:
|
|
25
|
+
logger.warning(f"Reasoning error: {e}")
|
|
26
|
+
return None
|
|
27
|
+
|
|
28
|
+
reasoning_content: str = ""
|
|
29
|
+
# We use the normal content as no reasoning content is returned
|
|
30
|
+
if reasoning_agent_response.content is not None:
|
|
31
|
+
# Extract content between <think> tags if present
|
|
32
|
+
content = reasoning_agent_response.content
|
|
33
|
+
if "<think>" in content and "</think>" in content:
|
|
34
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
35
|
+
end_idx = content.find("</think>")
|
|
36
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
37
|
+
else:
|
|
38
|
+
reasoning_content = content
|
|
39
|
+
|
|
40
|
+
return Message(
|
|
41
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
async def aget_ollama_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
46
|
+
from agno.run.agent import RunOutput
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
logger.warning(f"Reasoning error: {e}")
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
reasoning_content: str = ""
|
|
55
|
+
if reasoning_agent_response.content is not None:
|
|
56
|
+
# Extract content between <think> tags if present
|
|
57
|
+
content = reasoning_agent_response.content
|
|
58
|
+
if "<think>" in content and "</think>" in content:
|
|
59
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
60
|
+
end_idx = content.find("</think>")
|
|
61
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
62
|
+
else:
|
|
63
|
+
reasoning_content = content
|
|
64
|
+
|
|
65
|
+
return Message(
|
|
66
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
67
|
+
)
|
agno/reasoning/openai.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.models.openai.like import OpenAILike
|
|
8
|
+
from agno.utils.log import logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def is_openai_reasoning_model(reasoning_model: Model) -> bool:
|
|
12
|
+
return (
|
|
13
|
+
(
|
|
14
|
+
reasoning_model.__class__.__name__ == "OpenAIChat"
|
|
15
|
+
or reasoning_model.__class__.__name__ == "OpenAIResponses"
|
|
16
|
+
or reasoning_model.__class__.__name__ == "AzureOpenAI"
|
|
17
|
+
)
|
|
18
|
+
and (
|
|
19
|
+
("o4" in reasoning_model.id)
|
|
20
|
+
or ("o3" in reasoning_model.id)
|
|
21
|
+
or ("o1" in reasoning_model.id)
|
|
22
|
+
or ("4.1" in reasoning_model.id)
|
|
23
|
+
or ("4.5" in reasoning_model.id)
|
|
24
|
+
)
|
|
25
|
+
) or (isinstance(reasoning_model, OpenAILike) and "deepseek-r1" in reasoning_model.id.lower())
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_openai_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
29
|
+
from agno.run.agent import RunOutput
|
|
30
|
+
|
|
31
|
+
# Update system message role to "system"
|
|
32
|
+
for message in messages:
|
|
33
|
+
if message.role == "developer":
|
|
34
|
+
message.role = "system"
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logger.warning(f"Reasoning error: {e}")
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
reasoning_content: str = ""
|
|
43
|
+
# We use the normal content as no reasoning content is returned
|
|
44
|
+
if reasoning_agent_response.content is not None:
|
|
45
|
+
# Extract content between <think> tags if present
|
|
46
|
+
content = reasoning_agent_response.content
|
|
47
|
+
if "<think>" in content and "</think>" in content:
|
|
48
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
49
|
+
end_idx = content.find("</think>")
|
|
50
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
51
|
+
else:
|
|
52
|
+
reasoning_content = content
|
|
53
|
+
|
|
54
|
+
return Message(
|
|
55
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def aget_openai_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
60
|
+
from agno.run.agent import RunOutput
|
|
61
|
+
|
|
62
|
+
# Update system message role to "system"
|
|
63
|
+
for message in messages:
|
|
64
|
+
if message.role == "developer":
|
|
65
|
+
message.role = "system"
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
logger.warning(f"Reasoning error: {e}")
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
reasoning_content: str = ""
|
|
74
|
+
if reasoning_agent_response.content is not None:
|
|
75
|
+
# Extract content between <think> tags if present
|
|
76
|
+
content = reasoning_agent_response.content
|
|
77
|
+
if "<think>" in content and "</think>" in content:
|
|
78
|
+
start_idx = content.find("<think>") + len("<think>")
|
|
79
|
+
end_idx = content.find("</think>")
|
|
80
|
+
reasoning_content = content[start_idx:end_idx].strip()
|
|
81
|
+
else:
|
|
82
|
+
reasoning_content = content
|
|
83
|
+
|
|
84
|
+
return Message(
|
|
85
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
86
|
+
)
|
agno/reasoning/step.py
CHANGED
|
@@ -8,12 +8,13 @@ class NextAction(str, Enum):
|
|
|
8
8
|
CONTINUE = "continue"
|
|
9
9
|
VALIDATE = "validate"
|
|
10
10
|
FINAL_ANSWER = "final_answer"
|
|
11
|
+
RESET = "reset"
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class ReasoningStep(BaseModel):
|
|
14
15
|
title: Optional[str] = Field(None, description="A concise title summarizing the step's purpose")
|
|
15
16
|
action: Optional[str] = Field(
|
|
16
|
-
None, description="The action derived from this step. Talk in first person like I will ...
|
|
17
|
+
None, description="The action derived from this step. Talk in first person like I will ..."
|
|
17
18
|
)
|
|
18
19
|
result: Optional[str] = Field(
|
|
19
20
|
None, description="The result of executing the action. Talk in first person like I did this and got ... "
|