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/tools/python.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import functools
|
|
2
2
|
import runpy
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Optional
|
|
4
|
+
from typing import Any, List, Optional
|
|
5
5
|
|
|
6
6
|
from agno.tools import Toolkit
|
|
7
|
-
from agno.utils.log import logger
|
|
7
|
+
from agno.utils.log import log_debug, log_info, logger
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
@functools.lru_cache(maxsize=None)
|
|
@@ -16,35 +16,27 @@ class PythonTools(Toolkit):
|
|
|
16
16
|
def __init__(
|
|
17
17
|
self,
|
|
18
18
|
base_dir: Optional[Path] = None,
|
|
19
|
-
save_and_run: bool = True,
|
|
20
|
-
pip_install: bool = False,
|
|
21
|
-
run_code: bool = False,
|
|
22
|
-
list_files: bool = False,
|
|
23
|
-
run_files: bool = False,
|
|
24
|
-
read_files: bool = False,
|
|
25
19
|
safe_globals: Optional[dict] = None,
|
|
26
20
|
safe_locals: Optional[dict] = None,
|
|
21
|
+
**kwargs,
|
|
27
22
|
):
|
|
28
|
-
super().__init__(name="python_tools")
|
|
29
|
-
|
|
30
23
|
self.base_dir: Path = base_dir or Path.cwd()
|
|
31
24
|
|
|
32
25
|
# Restricted global and local scope
|
|
33
26
|
self.safe_globals: dict = safe_globals or globals()
|
|
34
27
|
self.safe_locals: dict = safe_locals or locals()
|
|
35
28
|
|
|
36
|
-
|
|
37
|
-
self.
|
|
38
|
-
|
|
39
|
-
self.
|
|
40
|
-
|
|
41
|
-
self.
|
|
42
|
-
|
|
43
|
-
self.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
self.register(self.list_files)
|
|
29
|
+
tools: List[Any] = [
|
|
30
|
+
self.save_to_file_and_run,
|
|
31
|
+
self.run_python_code,
|
|
32
|
+
self.pip_install_package,
|
|
33
|
+
self.uv_pip_install_package,
|
|
34
|
+
self.run_python_file_return_variable,
|
|
35
|
+
self.read_file,
|
|
36
|
+
self.list_files,
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
super().__init__(name="python_tools", tools=tools, **kwargs)
|
|
48
40
|
|
|
49
41
|
def save_to_file_and_run(
|
|
50
42
|
self, file_name: str, code: str, variable_to_return: Optional[str] = None, overwrite: bool = True
|
|
@@ -64,21 +56,21 @@ class PythonTools(Toolkit):
|
|
|
64
56
|
try:
|
|
65
57
|
warn()
|
|
66
58
|
file_path = self.base_dir.joinpath(file_name)
|
|
67
|
-
|
|
59
|
+
log_debug(f"Saving code to {file_path}")
|
|
68
60
|
if not file_path.parent.exists():
|
|
69
61
|
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
70
62
|
if file_path.exists() and not overwrite:
|
|
71
63
|
return f"File {file_name} already exists"
|
|
72
|
-
file_path.write_text(code)
|
|
73
|
-
|
|
74
|
-
|
|
64
|
+
file_path.write_text(code, encoding="utf-8")
|
|
65
|
+
log_info(f"Saved: {file_path}")
|
|
66
|
+
log_info(f"Running {file_path}")
|
|
75
67
|
globals_after_run = runpy.run_path(str(file_path), init_globals=self.safe_globals, run_name="__main__")
|
|
76
68
|
|
|
77
69
|
if variable_to_return:
|
|
78
70
|
variable_value = globals_after_run.get(variable_to_return)
|
|
79
71
|
if variable_value is None:
|
|
80
72
|
return f"Variable {variable_to_return} not found"
|
|
81
|
-
|
|
73
|
+
log_debug(f"Variable {variable_to_return} value: {variable_value}")
|
|
82
74
|
return str(variable_value)
|
|
83
75
|
else:
|
|
84
76
|
return f"successfully ran {str(file_path)}"
|
|
@@ -99,13 +91,13 @@ class PythonTools(Toolkit):
|
|
|
99
91
|
warn()
|
|
100
92
|
file_path = self.base_dir.joinpath(file_name)
|
|
101
93
|
|
|
102
|
-
|
|
94
|
+
log_info(f"Running {file_path}")
|
|
103
95
|
globals_after_run = runpy.run_path(str(file_path), init_globals=self.safe_globals, run_name="__main__")
|
|
104
96
|
if variable_to_return:
|
|
105
97
|
variable_value = globals_after_run.get(variable_to_return)
|
|
106
98
|
if variable_value is None:
|
|
107
99
|
return f"Variable {variable_to_return} not found"
|
|
108
|
-
|
|
100
|
+
log_debug(f"Variable {variable_to_return} value: {variable_value}")
|
|
109
101
|
return str(variable_value)
|
|
110
102
|
else:
|
|
111
103
|
return f"successfully ran {str(file_path)}"
|
|
@@ -120,9 +112,9 @@ class PythonTools(Toolkit):
|
|
|
120
112
|
:return: The contents of the file if successful, otherwise returns an error message.
|
|
121
113
|
"""
|
|
122
114
|
try:
|
|
123
|
-
|
|
115
|
+
log_info(f"Reading file: {file_name}")
|
|
124
116
|
file_path = self.base_dir.joinpath(file_name)
|
|
125
|
-
contents = file_path.read_text()
|
|
117
|
+
contents = file_path.read_text(encoding="utf-8")
|
|
126
118
|
return str(contents)
|
|
127
119
|
except Exception as e:
|
|
128
120
|
logger.error(f"Error reading file: {e}")
|
|
@@ -134,7 +126,7 @@ class PythonTools(Toolkit):
|
|
|
134
126
|
:return: Comma separated list of files in the base directory.
|
|
135
127
|
"""
|
|
136
128
|
try:
|
|
137
|
-
|
|
129
|
+
log_info(f"Reading files in : {self.base_dir}")
|
|
138
130
|
files = [str(file_path.name) for file_path in self.base_dir.iterdir()]
|
|
139
131
|
return ", ".join(files)
|
|
140
132
|
except Exception as e:
|
|
@@ -155,14 +147,14 @@ class PythonTools(Toolkit):
|
|
|
155
147
|
try:
|
|
156
148
|
warn()
|
|
157
149
|
|
|
158
|
-
|
|
150
|
+
log_debug(f"Running code:\n\n{code}\n\n")
|
|
159
151
|
exec(code, self.safe_globals, self.safe_locals)
|
|
160
152
|
|
|
161
153
|
if variable_to_return:
|
|
162
154
|
variable_value = self.safe_locals.get(variable_to_return)
|
|
163
155
|
if variable_value is None:
|
|
164
156
|
return f"Variable {variable_to_return} not found"
|
|
165
|
-
|
|
157
|
+
log_debug(f"Variable {variable_to_return} value: {variable_value}")
|
|
166
158
|
return str(variable_value)
|
|
167
159
|
else:
|
|
168
160
|
return "successfully ran python code"
|
|
@@ -181,7 +173,7 @@ class PythonTools(Toolkit):
|
|
|
181
173
|
try:
|
|
182
174
|
warn()
|
|
183
175
|
|
|
184
|
-
|
|
176
|
+
log_debug(f"Installing package {package_name}")
|
|
185
177
|
import subprocess
|
|
186
178
|
import sys
|
|
187
179
|
|
|
@@ -190,3 +182,24 @@ class PythonTools(Toolkit):
|
|
|
190
182
|
except Exception as e:
|
|
191
183
|
logger.error(f"Error installing package {package_name}: {e}")
|
|
192
184
|
return f"Error installing package {package_name}: {e}"
|
|
185
|
+
|
|
186
|
+
def uv_pip_install_package(self, package_name: str) -> str:
|
|
187
|
+
"""This function installs a package using uv and pip in the current environment.
|
|
188
|
+
If successful, returns a success message.
|
|
189
|
+
If failed, returns an error message.
|
|
190
|
+
|
|
191
|
+
:param package_name: The name of the package to install.
|
|
192
|
+
:return: success message if successful, otherwise returns an error message.
|
|
193
|
+
"""
|
|
194
|
+
try:
|
|
195
|
+
warn()
|
|
196
|
+
|
|
197
|
+
log_debug(f"Installing package {package_name}")
|
|
198
|
+
import subprocess
|
|
199
|
+
import sys
|
|
200
|
+
|
|
201
|
+
subprocess.check_call([sys.executable, "-m", "uv", "pip", "install", package_name])
|
|
202
|
+
return f"successfully installed package {package_name}"
|
|
203
|
+
except Exception as e:
|
|
204
|
+
logger.error(f"Error installing package {package_name}: {e}")
|
|
205
|
+
return f"Error installing package {package_name}: {e}"
|
agno/tools/reasoning.py
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
from textwrap import dedent
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
from agno.reasoning.step import NextAction, ReasoningStep
|
|
5
|
+
from agno.tools import Toolkit
|
|
6
|
+
from agno.utils.log import log_debug, log_error
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ReasoningTools(Toolkit):
|
|
10
|
+
def __init__(
|
|
11
|
+
self,
|
|
12
|
+
enable_think: bool = True,
|
|
13
|
+
enable_analyze: bool = True,
|
|
14
|
+
all: bool = False,
|
|
15
|
+
instructions: Optional[str] = None,
|
|
16
|
+
add_instructions: bool = False,
|
|
17
|
+
add_few_shot: bool = False,
|
|
18
|
+
few_shot_examples: Optional[str] = None,
|
|
19
|
+
**kwargs,
|
|
20
|
+
):
|
|
21
|
+
"""A toolkit that provides step-by-step reasoning tools: Think and Analyze."""
|
|
22
|
+
|
|
23
|
+
# Add instructions for using this toolkit
|
|
24
|
+
if instructions is None:
|
|
25
|
+
self.instructions = "<reasoning_instructions>\n" + self.DEFAULT_INSTRUCTIONS
|
|
26
|
+
if add_few_shot:
|
|
27
|
+
if few_shot_examples is not None:
|
|
28
|
+
self.instructions += "\n" + few_shot_examples
|
|
29
|
+
else:
|
|
30
|
+
self.instructions += "\n" + self.FEW_SHOT_EXAMPLES
|
|
31
|
+
self.instructions += "\n</reasoning_instructions>\n"
|
|
32
|
+
else:
|
|
33
|
+
self.instructions = instructions
|
|
34
|
+
|
|
35
|
+
tools: List[Any] = []
|
|
36
|
+
# Prefer new flags; fallback to legacy ones
|
|
37
|
+
if all or enable_think:
|
|
38
|
+
tools.append(self.think)
|
|
39
|
+
if all or enable_analyze:
|
|
40
|
+
tools.append(self.analyze)
|
|
41
|
+
|
|
42
|
+
super().__init__(
|
|
43
|
+
name="reasoning_tools",
|
|
44
|
+
instructions=self.instructions,
|
|
45
|
+
add_instructions=add_instructions,
|
|
46
|
+
tools=tools,
|
|
47
|
+
**kwargs,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def think(
|
|
51
|
+
self,
|
|
52
|
+
session_state: Dict[str, Any],
|
|
53
|
+
title: str,
|
|
54
|
+
thought: str,
|
|
55
|
+
action: Optional[str] = None,
|
|
56
|
+
confidence: float = 0.8,
|
|
57
|
+
) -> str:
|
|
58
|
+
"""Use this tool as a scratchpad to reason about the question and work through it step-by-step.
|
|
59
|
+
This tool will help you break down complex problems into logical steps and track the reasoning process.
|
|
60
|
+
You can call it as many times as needed. These internal thoughts are never revealed to the user.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
title: A concise title for this step
|
|
64
|
+
thought: Your detailed thought for this step
|
|
65
|
+
action: What you'll do based on this thought
|
|
66
|
+
confidence: How confident you are about this thought (0.0 to 1.0)
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
A list of previous thoughts and the new thought
|
|
70
|
+
"""
|
|
71
|
+
try:
|
|
72
|
+
log_debug(f"Thought about {title}")
|
|
73
|
+
|
|
74
|
+
# Create a reasoning step
|
|
75
|
+
reasoning_step = ReasoningStep(
|
|
76
|
+
title=title,
|
|
77
|
+
reasoning=thought,
|
|
78
|
+
action=action,
|
|
79
|
+
next_action=NextAction.CONTINUE,
|
|
80
|
+
confidence=confidence,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
current_run_id = session_state.get("current_run_id", None)
|
|
84
|
+
|
|
85
|
+
# Add this step to the Agent's session state
|
|
86
|
+
if session_state is None:
|
|
87
|
+
session_state = {}
|
|
88
|
+
if "reasoning_steps" not in session_state:
|
|
89
|
+
session_state["reasoning_steps"] = {}
|
|
90
|
+
if current_run_id not in session_state["reasoning_steps"]:
|
|
91
|
+
session_state["reasoning_steps"][current_run_id] = []
|
|
92
|
+
session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
|
|
93
|
+
|
|
94
|
+
# Return all previous reasoning_steps and the new reasoning_step
|
|
95
|
+
if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
|
|
96
|
+
formatted_reasoning_steps = ""
|
|
97
|
+
for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
|
|
98
|
+
step_parsed = ReasoningStep.model_validate_json(step)
|
|
99
|
+
step_str = dedent(f"""\
|
|
100
|
+
Step {i}:
|
|
101
|
+
Title: {step_parsed.title}
|
|
102
|
+
Reasoning: {step_parsed.reasoning}
|
|
103
|
+
Action: {step_parsed.action}
|
|
104
|
+
Confidence: {step_parsed.confidence}
|
|
105
|
+
""")
|
|
106
|
+
formatted_reasoning_steps += step_str + "\n"
|
|
107
|
+
return formatted_reasoning_steps.strip()
|
|
108
|
+
return reasoning_step.model_dump_json()
|
|
109
|
+
except Exception as e:
|
|
110
|
+
log_error(f"Error recording thought: {e}")
|
|
111
|
+
return f"Error recording thought: {e}"
|
|
112
|
+
|
|
113
|
+
def analyze(
|
|
114
|
+
self,
|
|
115
|
+
session_state: Dict[str, Any],
|
|
116
|
+
title: str,
|
|
117
|
+
result: str,
|
|
118
|
+
analysis: str,
|
|
119
|
+
next_action: str = "continue",
|
|
120
|
+
confidence: float = 0.8,
|
|
121
|
+
) -> str:
|
|
122
|
+
"""Use this tool to analyze results from a reasoning step and determine next actions.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
title: A concise title for this analysis step
|
|
126
|
+
result: The outcome of the previous action
|
|
127
|
+
analysis: Your analysis of the results
|
|
128
|
+
next_action: What to do next ("continue", "validate", or "final_answer")
|
|
129
|
+
confidence: How confident you are in this analysis (0.0 to 1.0)
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
A list of previous thoughts and the new analysis
|
|
133
|
+
"""
|
|
134
|
+
try:
|
|
135
|
+
log_debug(f"Analyzed {title}")
|
|
136
|
+
|
|
137
|
+
# Map string next_action to enum
|
|
138
|
+
next_action_enum = NextAction.CONTINUE
|
|
139
|
+
if next_action.lower() == "validate":
|
|
140
|
+
next_action_enum = NextAction.VALIDATE
|
|
141
|
+
elif next_action.lower() in ["final", "final_answer", "finalize"]:
|
|
142
|
+
next_action_enum = NextAction.FINAL_ANSWER
|
|
143
|
+
|
|
144
|
+
# Create a reasoning step for the analysis
|
|
145
|
+
reasoning_step = ReasoningStep(
|
|
146
|
+
title=title,
|
|
147
|
+
result=result,
|
|
148
|
+
reasoning=analysis,
|
|
149
|
+
next_action=next_action_enum,
|
|
150
|
+
confidence=confidence,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
current_run_id = session_state.get("current_run_id", None)
|
|
154
|
+
# Add this step to the Agent's session state
|
|
155
|
+
if session_state is None:
|
|
156
|
+
session_state = {}
|
|
157
|
+
if "reasoning_steps" not in session_state:
|
|
158
|
+
session_state["reasoning_steps"] = {}
|
|
159
|
+
if current_run_id not in session_state["reasoning_steps"]:
|
|
160
|
+
session_state["reasoning_steps"][current_run_id] = []
|
|
161
|
+
session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
|
|
162
|
+
|
|
163
|
+
# Return all previous reasoning_steps and the new reasoning_step
|
|
164
|
+
if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
|
|
165
|
+
formatted_reasoning_steps = ""
|
|
166
|
+
for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
|
|
167
|
+
step_parsed = ReasoningStep.model_validate_json(step)
|
|
168
|
+
step_str = dedent(f"""\
|
|
169
|
+
Step {i}:
|
|
170
|
+
Title: {step_parsed.title}
|
|
171
|
+
Reasoning: {step_parsed.reasoning}
|
|
172
|
+
Action: {step_parsed.action}
|
|
173
|
+
Confidence: {step_parsed.confidence}
|
|
174
|
+
""")
|
|
175
|
+
formatted_reasoning_steps += step_str + "\n"
|
|
176
|
+
return formatted_reasoning_steps.strip()
|
|
177
|
+
return reasoning_step.model_dump_json()
|
|
178
|
+
except Exception as e:
|
|
179
|
+
log_error(f"Error recording analysis: {e}")
|
|
180
|
+
return f"Error recording analysis: {e}"
|
|
181
|
+
|
|
182
|
+
# --------------------------------------------------------------------------------
|
|
183
|
+
# Default instructions and few-shot examples
|
|
184
|
+
# --------------------------------------------------------------------------------
|
|
185
|
+
|
|
186
|
+
DEFAULT_INSTRUCTIONS = dedent(
|
|
187
|
+
"""\
|
|
188
|
+
You have access to the `think` and `analyze` tools to work through problems step-by-step and structure your thought process. You must ALWAYS `think` before making tool calls or generating a response.
|
|
189
|
+
|
|
190
|
+
1. **Think** (scratchpad):
|
|
191
|
+
- Purpose: Use the `think` tool as a scratchpad to break down complex problems, outline steps, and decide on immediate actions within your reasoning flow. Use this to structure your internal monologue.
|
|
192
|
+
- Usage: Call `think` before making tool calls or generating a response. Explain your reasoning and specify the intended action (e.g., "make a tool call", "perform calculation", "ask clarifying question").
|
|
193
|
+
|
|
194
|
+
2. **Analyze** (evaluation):
|
|
195
|
+
- Purpose: Evaluate the result of a think step or a set of tool calls. Assess if the result is expected, sufficient, or requires further investigation.
|
|
196
|
+
- Usage: Call `analyze` after a set of tool calls. Determine the `next_action` based on your analysis: `continue` (more reasoning needed), `validate` (seek external confirmation/validation if possible), or `final_answer` (ready to conclude).
|
|
197
|
+
- Explain your reasoning highlighting whether the result is correct/sufficient.
|
|
198
|
+
|
|
199
|
+
## IMPORTANT GUIDELINES
|
|
200
|
+
- **Always Think First:** You MUST use the `think` tool before making tool calls or generating a response.
|
|
201
|
+
- **Iterate to Solve:** Use the `think` and `analyze` tools iteratively to build a clear reasoning path. The typical flow is `Think` -> [`Tool Calls` if needed] -> [`Analyze` if needed] -> ... -> `final_answer`. Repeat this cycle until you reach a satisfactory conclusion.
|
|
202
|
+
- **Make multiple tool calls in parallel:** After a `think` step, you can make multiple tool calls in parallel.
|
|
203
|
+
- **Keep Thoughts Internal:** The reasoning steps (thoughts and analyses) are for your internal process only. Do not share them directly with the user.
|
|
204
|
+
- **Conclude Clearly:** When your analysis determines the `next_action` is `final_answer`, provide a concise and accurate final answer to the user."""
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
FEW_SHOT_EXAMPLES = dedent(
|
|
208
|
+
"""
|
|
209
|
+
Below are examples demonstrating how to use the `think` and `analyze` tools.
|
|
210
|
+
|
|
211
|
+
### Examples
|
|
212
|
+
|
|
213
|
+
**Example 1: Simple Fact Retrieval**
|
|
214
|
+
|
|
215
|
+
*User Request:* How many continents are there on Earth?
|
|
216
|
+
|
|
217
|
+
*Agent's Internal Process:*
|
|
218
|
+
|
|
219
|
+
```tool_call
|
|
220
|
+
think(
|
|
221
|
+
title="Understand Request",
|
|
222
|
+
thought="The user wants to know the standard number of continents on Earth. This is a common piece of knowledge.",
|
|
223
|
+
action="Recall or verify the number of continents.",
|
|
224
|
+
confidence=0.95
|
|
225
|
+
)
|
|
226
|
+
```
|
|
227
|
+
*--(Agent internally recalls the fact)--*
|
|
228
|
+
```tool_call
|
|
229
|
+
analyze(
|
|
230
|
+
title="Evaluate Fact",
|
|
231
|
+
result="Standard geographical models list 7 continents: Africa, Antarctica, Asia, Australia, Europe, North America, South America.",
|
|
232
|
+
analysis="The recalled information directly answers the user's question accurately.",
|
|
233
|
+
next_action="final_answer",
|
|
234
|
+
confidence=1.0
|
|
235
|
+
)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
*Agent's Final Answer to User:*
|
|
239
|
+
There are 7 continents on Earth: Africa, Antarctica, Asia, Australia, Europe, North America, and South America.
|
|
240
|
+
|
|
241
|
+
**Example 2: Multi-Step Information Gathering**
|
|
242
|
+
|
|
243
|
+
*User Request:* What is the capital of France and its current population?
|
|
244
|
+
|
|
245
|
+
*Agent's Internal Process:*
|
|
246
|
+
|
|
247
|
+
```tool_call
|
|
248
|
+
think(
|
|
249
|
+
title="Plan Information Retrieval",
|
|
250
|
+
thought="The user needs two pieces of information: the capital of France and its current population. I should use external tools (like search) to find the most up-to-date and accurate information.",
|
|
251
|
+
action="First, search for the capital of France.",
|
|
252
|
+
confidence=0.95
|
|
253
|
+
)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
*Perform multiple tool calls in parallel*
|
|
257
|
+
*--(Tool call 1: search(query="capital of France"))--*
|
|
258
|
+
*--(Tool call 2: search(query="population of Paris current"))--*
|
|
259
|
+
*--(Tool Result 1: "Paris")--*
|
|
260
|
+
*--(Tool Result 2: "Approximately 2.1 million (city proper, estimate for early 2024)")--*
|
|
261
|
+
|
|
262
|
+
```tool_call
|
|
263
|
+
analyze(
|
|
264
|
+
title="Analyze Capital Search Result",
|
|
265
|
+
result="The search result indicates Paris is the capital of France.",
|
|
266
|
+
analysis="This provides the first piece of requested information. Now I need to find the population of Paris.",
|
|
267
|
+
next_action="continue",
|
|
268
|
+
confidence=1.0
|
|
269
|
+
)
|
|
270
|
+
```
|
|
271
|
+
```tool_call
|
|
272
|
+
analyze(
|
|
273
|
+
title="Analyze Population Search Result",
|
|
274
|
+
result="The search provided an estimated population figure for Paris.",
|
|
275
|
+
analysis="I now have both the capital and its estimated population. I can provide the final answer.",
|
|
276
|
+
next_action="final_answer",
|
|
277
|
+
confidence=0.9
|
|
278
|
+
)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
*Agent's Final Answer to User:*
|
|
282
|
+
The capital of France is Paris. Its estimated population (city proper) is approximately 2.1 million as of early 2024."""
|
|
283
|
+
)
|