agno 2.2.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 +51 -0
- agno/agent/agent.py +10405 -0
- agno/api/__init__.py +0 -0
- agno/api/agent.py +28 -0
- agno/api/api.py +40 -0
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +13 -0
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +16 -0
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/response.py +6 -0
- agno/api/schemas/team.py +16 -0
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +30 -0
- 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/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 +598 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2042 -0
- agno/db/dynamo/schemas.py +314 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1795 -0
- agno/db/firestore/schemas.py +140 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1335 -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 +1160 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1328 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/__init__.py +0 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2026 -0
- agno/db/mongo/mongo.py +1982 -0
- agno/db/mongo/schemas.py +87 -0
- agno/db/mongo/utils.py +259 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +2308 -0
- agno/db/mysql/schemas.py +138 -0
- agno/db/mysql/utils.py +355 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +1927 -0
- agno/db/postgres/postgres.py +2260 -0
- agno/db/postgres/schemas.py +139 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1660 -0
- agno/db/redis/schemas.py +123 -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 +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/schemas/metrics.py +0 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +130 -0
- agno/db/singlestore/singlestore.py +2272 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2293 -0
- agno/db/sqlite/schemas.py +133 -0
- agno/db/sqlite/sqlite.py +2288 -0
- agno/db/sqlite/utils.py +431 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1353 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +116 -0
- agno/debug.py +18 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +834 -0
- agno/eval/performance.py +773 -0
- agno/eval/reliability.py +306 -0
- agno/eval/utils.py +119 -0
- agno/exceptions.py +161 -0
- 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/integrations/__init__.py +0 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -0
- agno/knowledge/chunking/__init__.py +0 -0
- agno/knowledge/chunking/agentic.py +79 -0
- agno/knowledge/chunking/document.py +91 -0
- agno/knowledge/chunking/fixed.py +57 -0
- agno/knowledge/chunking/markdown.py +151 -0
- agno/knowledge/chunking/recursive.py +63 -0
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +86 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/knowledge/document/base.py +58 -0
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/knowledge/embedder/base.py +23 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/knowledge/embedder/fireworks.py +13 -0
- 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/knowledge/embedder/together.py +13 -0
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +1988 -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 +166 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +87 -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 +194 -0
- agno/knowledge/reader/text_reader.py +115 -0
- agno/knowledge/reader/web_search_reader.py +372 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/__init__.py +0 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/reranker/base.py +14 -0
- agno/knowledge/reranker/cohere.py +64 -0
- 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 +189 -0
- agno/media.py +462 -0
- agno/memory/__init__.py +3 -0
- agno/memory/manager.py +1327 -0
- agno/models/__init__.py +0 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +45 -0
- agno/models/anthropic/__init__.py +5 -0
- agno/models/anthropic/claude.py +757 -0
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +701 -0
- agno/models/aws/claude.py +378 -0
- agno/models/azure/__init__.py +18 -0
- agno/models/azure/ai_foundry.py +485 -0
- agno/models/azure/openai_chat.py +131 -0
- agno/models/base.py +2175 -0
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +501 -0
- agno/models/cerebras/cerebras_openai.py +112 -0
- agno/models/cohere/__init__.py +5 -0
- agno/models/cohere/chat.py +389 -0
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +91 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +28 -0
- agno/models/deepseek/__init__.py +5 -0
- agno/models/deepseek/deepseek.py +61 -0
- agno/models/defaults.py +1 -0
- agno/models/fireworks/__init__.py +5 -0
- agno/models/fireworks/fireworks.py +26 -0
- agno/models/google/__init__.py +5 -0
- agno/models/google/gemini.py +1085 -0
- agno/models/groq/__init__.py +5 -0
- agno/models/groq/groq.py +556 -0
- agno/models/huggingface/__init__.py +5 -0
- agno/models/huggingface/huggingface.py +491 -0
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +422 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +26 -0
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +48 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +468 -0
- agno/models/litellm/litellm_openai.py +25 -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 +434 -0
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +475 -0
- agno/models/meta/llama_openai.py +78 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +5 -0
- agno/models/mistral/mistral.py +432 -0
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +54 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +5 -0
- agno/models/nvidia/nvidia.py +28 -0
- agno/models/ollama/__init__.py +5 -0
- agno/models/ollama/chat.py +441 -0
- agno/models/openai/__init__.py +9 -0
- agno/models/openai/chat.py +883 -0
- agno/models/openai/like.py +27 -0
- agno/models/openai/responses.py +1050 -0
- agno/models/openrouter/__init__.py +5 -0
- agno/models/openrouter/openrouter.py +66 -0
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +187 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +81 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +199 -0
- agno/models/sambanova/__init__.py +5 -0
- agno/models/sambanova/sambanova.py +28 -0
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/__init__.py +5 -0
- agno/models/together/together.py +25 -0
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +26 -0
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +70 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +78 -0
- agno/models/xai/__init__.py +3 -0
- agno/models/xai/xai.py +113 -0
- agno/os/__init__.py +3 -0
- agno/os/app.py +876 -0
- agno/os/auth.py +57 -0
- agno/os/config.py +104 -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 +250 -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 +144 -0
- agno/os/interfaces/agui/utils.py +534 -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 +211 -0
- agno/os/interfaces/whatsapp/security.py +53 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +292 -0
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +1763 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +430 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +162 -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 +997 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +515 -0
- agno/os/routers/memory/schemas.py +62 -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/schema.py +1055 -0
- agno/os/settings.py +43 -0
- agno/os/utils.py +630 -0
- agno/py.typed +0 -0
- agno/reasoning/__init__.py +0 -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 +63 -0
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +31 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +787 -0
- agno/run/base.py +229 -0
- agno/run/cancel.py +81 -0
- agno/run/messages.py +32 -0
- agno/run/team.py +753 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +295 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +392 -0
- agno/session/workflow.py +205 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +8793 -0
- agno/tools/__init__.py +10 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +69 -0
- agno/tools/api.py +122 -0
- agno/tools/apify.py +314 -0
- agno/tools/arxiv.py +127 -0
- agno/tools/aws_lambda.py +53 -0
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +89 -0
- 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 +255 -0
- agno/tools/calculator.py +151 -0
- agno/tools/cartesia.py +187 -0
- agno/tools/clickup.py +244 -0
- agno/tools/confluence.py +240 -0
- agno/tools/crawl4ai.py +158 -0
- agno/tools/csv_toolkit.py +185 -0
- agno/tools/dalle.py +110 -0
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +262 -0
- agno/tools/desi_vocal.py +108 -0
- agno/tools/discord.py +161 -0
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +379 -0
- agno/tools/duckduckgo.py +91 -0
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +196 -0
- agno/tools/email.py +67 -0
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +396 -0
- agno/tools/fal.py +127 -0
- agno/tools/file.py +240 -0
- agno/tools/file_generation.py +350 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +143 -0
- agno/tools/function.py +1187 -0
- agno/tools/giphy.py +93 -0
- agno/tools/github.py +1760 -0
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +270 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +674 -0
- agno/tools/googlesearch.py +98 -0
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +77 -0
- agno/tools/jina.py +101 -0
- agno/tools/jira.py +170 -0
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +426 -0
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +90 -0
- agno/tools/lumalab.py +183 -0
- 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/memori.py +339 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +139 -0
- agno/tools/models/__init__.py +0 -0
- 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 +195 -0
- agno/tools/moviepy_video.py +349 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +46 -0
- agno/tools/newspaper4k.py +93 -0
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +202 -0
- agno/tools/openbb.py +160 -0
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +102 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +257 -0
- agno/tools/pubmed.py +188 -0
- agno/tools/python.py +205 -0
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +467 -0
- agno/tools/replicate.py +117 -0
- agno/tools/resend.py +62 -0
- agno/tools/scrapegraph.py +222 -0
- agno/tools/searxng.py +152 -0
- agno/tools/serpapi.py +116 -0
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +53 -0
- agno/tools/slack.py +136 -0
- agno/tools/sleep.py +20 -0
- agno/tools/spider.py +116 -0
- agno/tools/sql.py +154 -0
- agno/tools/streamlit/__init__.py +0 -0
- agno/tools/streamlit/components.py +113 -0
- agno/tools/tavily.py +254 -0
- agno/tools/telegram.py +48 -0
- agno/tools/todoist.py +218 -0
- agno/tools/tool_registry.py +1 -0
- agno/tools/toolkit.py +146 -0
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +274 -0
- agno/tools/twilio.py +186 -0
- 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 +54 -0
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +63 -0
- agno/tools/workflow.py +278 -0
- agno/tools/x.py +335 -0
- agno/tools/yfinance.py +257 -0
- agno/tools/youtube.py +184 -0
- agno/tools/zendesk.py +82 -0
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +382 -0
- agno/utils/__init__.py +0 -0
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +49 -0
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +132 -0
- agno/utils/dttm.py +13 -0
- agno/utils/enum.py +22 -0
- agno/utils/env.py +11 -0
- agno/utils/events.py +696 -0
- agno/utils/format_str.py +16 -0
- agno/utils/functions.py +166 -0
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +74 -0
- agno/utils/json_schema.py +234 -0
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +255 -0
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +352 -0
- agno/utils/merge_dict.py +41 -0
- agno/utils/message.py +118 -0
- agno/utils/models/__init__.py +0 -0
- agno/utils/models/ai_foundry.py +43 -0
- agno/utils/models/claude.py +358 -0
- agno/utils/models/cohere.py +87 -0
- agno/utils/models/llama.py +78 -0
- agno/utils/models/mistral.py +98 -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 +32 -0
- agno/utils/pprint.py +178 -0
- agno/utils/print_response/__init__.py +0 -0
- agno/utils/print_response/agent.py +842 -0
- agno/utils/print_response/team.py +1724 -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/response_iterator.py +17 -0
- agno/utils/safe_formatter.py +24 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +22 -0
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +231 -0
- agno/utils/team.py +139 -0
- agno/utils/timer.py +41 -0
- agno/utils/tools.py +102 -0
- agno/utils/web.py +23 -0
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +25 -0
- agno/vectordb/__init__.py +3 -0
- agno/vectordb/base.py +127 -0
- agno/vectordb/cassandra/__init__.py +5 -0
- agno/vectordb/cassandra/cassandra.py +501 -0
- agno/vectordb/cassandra/extra_param_mixin.py +11 -0
- agno/vectordb/cassandra/index.py +13 -0
- agno/vectordb/chroma/__init__.py +5 -0
- agno/vectordb/chroma/chromadb.py +929 -0
- agno/vectordb/clickhouse/__init__.py +9 -0
- agno/vectordb/clickhouse/clickhousedb.py +835 -0
- agno/vectordb/clickhouse/index.py +9 -0
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1442 -0
- agno/vectordb/distance.py +7 -0
- agno/vectordb/lancedb/__init__.py +6 -0
- agno/vectordb/lancedb/lance_db.py +995 -0
- 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 +4 -0
- agno/vectordb/milvus/milvus.py +1182 -0
- agno/vectordb/mongodb/__init__.py +9 -0
- agno/vectordb/mongodb/mongodb.py +1417 -0
- agno/vectordb/pgvector/__init__.py +12 -0
- agno/vectordb/pgvector/index.py +23 -0
- agno/vectordb/pgvector/pgvector.py +1462 -0
- agno/vectordb/pineconedb/__init__.py +5 -0
- agno/vectordb/pineconedb/pineconedb.py +747 -0
- agno/vectordb/qdrant/__init__.py +5 -0
- agno/vectordb/qdrant/qdrant.py +1134 -0
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/search.py +7 -0
- agno/vectordb/singlestore/__init__.py +10 -0
- agno/vectordb/singlestore/index.py +41 -0
- agno/vectordb/singlestore/singlestore.py +763 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +699 -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 +1005 -0
- agno/workflow/__init__.py +23 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +738 -0
- agno/workflow/loop.py +735 -0
- agno/workflow/parallel.py +824 -0
- agno/workflow/router.py +702 -0
- agno/workflow/step.py +1432 -0
- agno/workflow/steps.py +592 -0
- agno/workflow/types.py +520 -0
- agno/workflow/workflow.py +4321 -0
- agno-2.2.13.dist-info/METADATA +614 -0
- agno-2.2.13.dist-info/RECORD +575 -0
- agno-2.2.13.dist-info/WHEEL +5 -0
- agno-2.2.13.dist-info/licenses/LICENSE +201 -0
- agno-2.2.13.dist-info/top_level.txt +1 -0
agno/tools/jira.py
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, List, Optional, cast
|
|
4
|
+
|
|
5
|
+
from agno.tools import Toolkit
|
|
6
|
+
from agno.utils.log import log_debug, logger
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
from jira import JIRA, Issue
|
|
10
|
+
except ImportError:
|
|
11
|
+
raise ImportError("`jira` not installed. Please install using `pip install jira`")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class JiraTools(Toolkit):
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
server_url: Optional[str] = None,
|
|
18
|
+
username: Optional[str] = None,
|
|
19
|
+
password: Optional[str] = None,
|
|
20
|
+
token: Optional[str] = None,
|
|
21
|
+
enable_get_issue: bool = True,
|
|
22
|
+
enable_create_issue: bool = True,
|
|
23
|
+
enable_search_issues: bool = True,
|
|
24
|
+
enable_add_comment: bool = True,
|
|
25
|
+
enable_add_worklog: bool = True,
|
|
26
|
+
all: bool = False,
|
|
27
|
+
**kwargs,
|
|
28
|
+
):
|
|
29
|
+
self.server_url = server_url or getenv("JIRA_SERVER_URL")
|
|
30
|
+
self.username = username or getenv("JIRA_USERNAME")
|
|
31
|
+
self.password = password or getenv("JIRA_PASSWORD")
|
|
32
|
+
self.token = token or getenv("JIRA_TOKEN")
|
|
33
|
+
|
|
34
|
+
if not self.server_url:
|
|
35
|
+
raise ValueError("JIRA server URL not provided.")
|
|
36
|
+
|
|
37
|
+
# Initialize JIRA client
|
|
38
|
+
if self.token and self.username:
|
|
39
|
+
auth = (self.username, self.token)
|
|
40
|
+
elif self.username and self.password:
|
|
41
|
+
auth = (self.username, self.password)
|
|
42
|
+
else:
|
|
43
|
+
auth = None
|
|
44
|
+
|
|
45
|
+
if auth:
|
|
46
|
+
self.jira = JIRA(server=self.server_url, basic_auth=cast(tuple[str, str], auth))
|
|
47
|
+
else:
|
|
48
|
+
self.jira = JIRA(server=self.server_url)
|
|
49
|
+
|
|
50
|
+
tools: List[Any] = []
|
|
51
|
+
if enable_get_issue or all:
|
|
52
|
+
tools.append(self.get_issue)
|
|
53
|
+
if enable_create_issue or all:
|
|
54
|
+
tools.append(self.create_issue)
|
|
55
|
+
if enable_search_issues or all:
|
|
56
|
+
tools.append(self.search_issues)
|
|
57
|
+
if enable_add_comment or all:
|
|
58
|
+
tools.append(self.add_comment)
|
|
59
|
+
if enable_add_worklog or all:
|
|
60
|
+
tools.append(self.add_worklog)
|
|
61
|
+
|
|
62
|
+
super().__init__(name="jira_tools", tools=tools, **kwargs)
|
|
63
|
+
|
|
64
|
+
def get_issue(self, issue_key: str) -> str:
|
|
65
|
+
"""
|
|
66
|
+
Retrieves issue details from Jira.
|
|
67
|
+
|
|
68
|
+
:param issue_key: The key of the issue to retrieve.
|
|
69
|
+
:return: A JSON string containing issue details.
|
|
70
|
+
"""
|
|
71
|
+
try:
|
|
72
|
+
issue = self.jira.issue(issue_key)
|
|
73
|
+
issue = cast(Issue, issue)
|
|
74
|
+
issue_details = {
|
|
75
|
+
"key": issue.key,
|
|
76
|
+
"project": issue.fields.project.key,
|
|
77
|
+
"issuetype": issue.fields.issuetype.name,
|
|
78
|
+
"reporter": issue.fields.reporter.displayName if issue.fields.reporter else "N/A",
|
|
79
|
+
"summary": issue.fields.summary,
|
|
80
|
+
"description": issue.fields.description or "",
|
|
81
|
+
}
|
|
82
|
+
log_debug(f"Issue details retrieved for {issue_key}: {issue_details}")
|
|
83
|
+
return json.dumps(issue_details)
|
|
84
|
+
except Exception as e:
|
|
85
|
+
logger.error(f"Error retrieving issue {issue_key}: {e}")
|
|
86
|
+
return json.dumps({"error": str(e)})
|
|
87
|
+
|
|
88
|
+
def create_issue(self, project_key: str, summary: str, description: str, issuetype: str = "Task") -> str:
|
|
89
|
+
"""
|
|
90
|
+
Creates a new issue in Jira.
|
|
91
|
+
|
|
92
|
+
:param project_key: The key of the project in which to create the issue.
|
|
93
|
+
:param summary: The summary of the issue.
|
|
94
|
+
:param description: The description of the issue.
|
|
95
|
+
:param issuetype: The type of issue to create.
|
|
96
|
+
:return: A JSON string with the new issue's key and URL.
|
|
97
|
+
"""
|
|
98
|
+
try:
|
|
99
|
+
issue_dict = {
|
|
100
|
+
"project": {"key": project_key},
|
|
101
|
+
"summary": summary,
|
|
102
|
+
"description": description,
|
|
103
|
+
"issuetype": {"name": issuetype},
|
|
104
|
+
}
|
|
105
|
+
new_issue = self.jira.create_issue(fields=issue_dict)
|
|
106
|
+
issue_url = f"{self.server_url}/browse/{new_issue.key}"
|
|
107
|
+
log_debug(f"Issue created with key: {new_issue.key}")
|
|
108
|
+
return json.dumps({"key": new_issue.key, "url": issue_url})
|
|
109
|
+
except Exception as e:
|
|
110
|
+
logger.error(f"Error creating issue in project {project_key}: {e}")
|
|
111
|
+
return json.dumps({"error": str(e)})
|
|
112
|
+
|
|
113
|
+
def search_issues(self, jql_str: str, max_results: int = 50) -> str:
|
|
114
|
+
"""
|
|
115
|
+
Searches for issues using a JQL query.
|
|
116
|
+
|
|
117
|
+
:param jql_str: The JQL query string.
|
|
118
|
+
:param max_results: Maximum number of results to return.
|
|
119
|
+
:return: A JSON string containing a list of dictionaries with issue details.
|
|
120
|
+
"""
|
|
121
|
+
try:
|
|
122
|
+
issues = self.jira.search_issues(jql_str, maxResults=max_results)
|
|
123
|
+
results = []
|
|
124
|
+
for issue in issues:
|
|
125
|
+
issue = cast(Issue, issue)
|
|
126
|
+
issue_details = {
|
|
127
|
+
"key": issue.key,
|
|
128
|
+
"summary": issue.fields.summary,
|
|
129
|
+
"status": issue.fields.status.name,
|
|
130
|
+
"assignee": issue.fields.assignee.displayName if issue.fields.assignee else "Unassigned",
|
|
131
|
+
}
|
|
132
|
+
results.append(issue_details)
|
|
133
|
+
log_debug(f"Found {len(results)} issues for JQL '{jql_str}'")
|
|
134
|
+
return json.dumps(results)
|
|
135
|
+
except Exception as e:
|
|
136
|
+
logger.error(f"Error searching issues with JQL '{jql_str}': {e}")
|
|
137
|
+
return json.dumps([{"error": str(e)}])
|
|
138
|
+
|
|
139
|
+
def add_comment(self, issue_key: str, comment: str) -> str:
|
|
140
|
+
"""
|
|
141
|
+
Adds a comment to an issue.
|
|
142
|
+
|
|
143
|
+
:param issue_key: The key of the issue.
|
|
144
|
+
:param comment: The comment text.
|
|
145
|
+
:return: A JSON string indicating success or containing an error message.
|
|
146
|
+
"""
|
|
147
|
+
try:
|
|
148
|
+
self.jira.add_comment(issue_key, comment)
|
|
149
|
+
log_debug(f"Comment added to issue {issue_key}")
|
|
150
|
+
return json.dumps({"status": "success", "issue_key": issue_key})
|
|
151
|
+
except Exception as e:
|
|
152
|
+
logger.error(f"Error adding comment to issue {issue_key}: {e}")
|
|
153
|
+
return json.dumps({"error": str(e)})
|
|
154
|
+
|
|
155
|
+
def add_worklog(self, issue_key: str, time_spent: str, comment: Optional[str] = None) -> str:
|
|
156
|
+
"""
|
|
157
|
+
Adds a worklog entry to log time spent on a specific Jira issue.
|
|
158
|
+
|
|
159
|
+
:param issue_key: The key of the issue to log work against (e.g., 'PROJ-123').
|
|
160
|
+
:param time_spent: The amount of time spent. Use Jira's format, e.g., '2h', '30m', '1d 4h'.
|
|
161
|
+
:param comment: An optional comment describing the work done.
|
|
162
|
+
:return: A JSON string indicating success or containing an error message.
|
|
163
|
+
"""
|
|
164
|
+
try:
|
|
165
|
+
self.jira.add_worklog(issue=issue_key, timeSpent=time_spent, comment=comment)
|
|
166
|
+
log_debug(f"Worklog of '{time_spent}' added to issue {issue_key}")
|
|
167
|
+
return json.dumps({"status": "success", "issue_key": issue_key, "time_spent": time_spent})
|
|
168
|
+
except Exception as e:
|
|
169
|
+
logger.error(f"Error adding worklog to issue {issue_key}: {e}")
|
|
170
|
+
return json.dumps({"error": str(e)})
|
agno/tools/knowledge.py
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from textwrap import dedent
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.knowledge.document import Document
|
|
6
|
+
from agno.knowledge.knowledge import Knowledge
|
|
7
|
+
from agno.tools import Toolkit
|
|
8
|
+
from agno.utils.log import log_debug, log_error
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class KnowledgeTools(Toolkit):
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
knowledge: Knowledge,
|
|
15
|
+
enable_think: bool = True,
|
|
16
|
+
enable_search: bool = True,
|
|
17
|
+
enable_analyze: bool = True,
|
|
18
|
+
instructions: Optional[str] = None,
|
|
19
|
+
add_instructions: bool = True,
|
|
20
|
+
add_few_shot: bool = False,
|
|
21
|
+
few_shot_examples: Optional[str] = None,
|
|
22
|
+
all: bool = False,
|
|
23
|
+
**kwargs,
|
|
24
|
+
):
|
|
25
|
+
if knowledge is None:
|
|
26
|
+
raise ValueError("knowledge must be provided when using KnowledgeTools")
|
|
27
|
+
|
|
28
|
+
# Add instructions for using this toolkit
|
|
29
|
+
if instructions is None:
|
|
30
|
+
self.instructions = self.DEFAULT_INSTRUCTIONS
|
|
31
|
+
if add_few_shot:
|
|
32
|
+
if few_shot_examples is not None:
|
|
33
|
+
self.instructions += "\n" + few_shot_examples
|
|
34
|
+
else:
|
|
35
|
+
self.instructions += "\n" + self.FEW_SHOT_EXAMPLES
|
|
36
|
+
else:
|
|
37
|
+
self.instructions = instructions
|
|
38
|
+
|
|
39
|
+
# The knowledge to search
|
|
40
|
+
self.knowledge: Knowledge = knowledge
|
|
41
|
+
|
|
42
|
+
tools: List[Any] = []
|
|
43
|
+
if enable_think or all:
|
|
44
|
+
tools.append(self.think)
|
|
45
|
+
if enable_search or all:
|
|
46
|
+
tools.append(self.search_knowledge)
|
|
47
|
+
if enable_analyze or all:
|
|
48
|
+
tools.append(self.analyze)
|
|
49
|
+
|
|
50
|
+
super().__init__(
|
|
51
|
+
name="knowledge_tools",
|
|
52
|
+
tools=tools,
|
|
53
|
+
instructions=self.instructions,
|
|
54
|
+
add_instructions=add_instructions,
|
|
55
|
+
**kwargs,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def think(self, session_state: Dict[str, Any], thought: str) -> str:
|
|
59
|
+
"""Use this tool as a scratchpad to reason about the question, refine your approach, brainstorm search terms, or revise your plan.
|
|
60
|
+
|
|
61
|
+
Call `Think` whenever you need to figure out what to do next, analyze the user's question, or plan your approach.
|
|
62
|
+
You should use this tool as frequently as needed.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
thought: Your thought process and reasoning.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
str: The full log of reasoning and the new thought.
|
|
69
|
+
"""
|
|
70
|
+
try:
|
|
71
|
+
log_debug(f"Thought: {thought}")
|
|
72
|
+
|
|
73
|
+
# Add the thought to the Agent state
|
|
74
|
+
if session_state is None:
|
|
75
|
+
session_state = {}
|
|
76
|
+
if "thoughts" not in session_state:
|
|
77
|
+
session_state["thoughts"] = []
|
|
78
|
+
session_state["thoughts"].append(thought)
|
|
79
|
+
|
|
80
|
+
# Return the full log of thoughts and the new thought
|
|
81
|
+
thoughts = "\n".join([f"- {t}" for t in session_state["thoughts"]])
|
|
82
|
+
formatted_thoughts = dedent(
|
|
83
|
+
f"""Thoughts:
|
|
84
|
+
{thoughts}
|
|
85
|
+
"""
|
|
86
|
+
).strip()
|
|
87
|
+
return formatted_thoughts
|
|
88
|
+
except Exception as e:
|
|
89
|
+
log_error(f"Error recording thought: {e}")
|
|
90
|
+
return f"Error recording thought: {e}"
|
|
91
|
+
|
|
92
|
+
def search_knowledge(self, session_state: Dict[str, Any], query: str) -> str:
|
|
93
|
+
"""Use this tool to search the knowledge base for relevant information.
|
|
94
|
+
After thinking through the question, use this tool as many times as needed to search for relevant information.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
query: The query to search the knowledge base for.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
str: A string containing the response from the knowledge base.
|
|
101
|
+
"""
|
|
102
|
+
try:
|
|
103
|
+
log_debug(f"Searching knowledge base: {query}")
|
|
104
|
+
|
|
105
|
+
# Get the relevant documents from the knowledge base
|
|
106
|
+
relevant_docs: List[Document] = self.knowledge.search(query=query)
|
|
107
|
+
if len(relevant_docs) == 0:
|
|
108
|
+
return "No documents found"
|
|
109
|
+
return json.dumps([doc.to_dict() for doc in relevant_docs])
|
|
110
|
+
except Exception as e:
|
|
111
|
+
log_error(f"Error searching knowledge base: {e}")
|
|
112
|
+
return f"Error searching knowledge base: {e}"
|
|
113
|
+
|
|
114
|
+
def analyze(self, session_state: Dict[str, Any], analysis: str) -> str:
|
|
115
|
+
"""Use this tool to evaluate whether the returned documents are correct and sufficient.
|
|
116
|
+
If not, go back to "Think" or "Search" with refined queries.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
analysis: A thought to think about and log.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
str: The full log of thoughts and the new thought.
|
|
123
|
+
"""
|
|
124
|
+
try:
|
|
125
|
+
log_debug(f"Analysis: {analysis}")
|
|
126
|
+
|
|
127
|
+
# Add the thought to the Agent state
|
|
128
|
+
if session_state is None:
|
|
129
|
+
session_state = {}
|
|
130
|
+
if "analysis" not in session_state:
|
|
131
|
+
session_state["analysis"] = []
|
|
132
|
+
session_state["analysis"].append(analysis)
|
|
133
|
+
|
|
134
|
+
# Return the full log of thoughts and the new thought
|
|
135
|
+
analysis = "\n".join([f"- {a}" for a in session_state["analysis"]])
|
|
136
|
+
formatted_analysis = dedent(
|
|
137
|
+
f"""Analysis:
|
|
138
|
+
{analysis}
|
|
139
|
+
"""
|
|
140
|
+
).strip()
|
|
141
|
+
return formatted_analysis
|
|
142
|
+
except Exception as e:
|
|
143
|
+
log_error(f"Error recording analysis: {e}")
|
|
144
|
+
return f"Error recording analysis: {e}"
|
|
145
|
+
|
|
146
|
+
DEFAULT_INSTRUCTIONS = dedent("""\
|
|
147
|
+
You have access to the Think, Search, and Analyze tools that will help you search your knowledge for relevant information. Use these tools as frequently as needed to find the most relevant information.
|
|
148
|
+
|
|
149
|
+
## How to use the Think, Search, and Analyze tools:
|
|
150
|
+
1. **Think**
|
|
151
|
+
- Purpose: A scratchpad for planning, brainstorming keywords, and refining your approach. You never reveal your "Think" content to the user.
|
|
152
|
+
- Usage: Call `think` whenever you need to figure out what to do next, analyze your approach, or decide new search terms before (or after) you look up documents.
|
|
153
|
+
|
|
154
|
+
2. **Search**
|
|
155
|
+
- Purpose: Executes a query against the knowledge base.
|
|
156
|
+
- Usage: Call `search` with a clear query string whenever you want to retrieve documents or data. You can and should call this tool multiple times in one conversation.
|
|
157
|
+
- For complex topics, use multiple focused searches rather than one broad search
|
|
158
|
+
- Try different phrasing and keywords if initial searches don't yield useful results
|
|
159
|
+
- Use quotes for exact phrases and OR for alternative terms (e.g., "protein synthesis" OR "protein formation")
|
|
160
|
+
|
|
161
|
+
3. **Analyze**
|
|
162
|
+
- Purpose: Evaluate whether the returned documents are correct and sufficient. If not, go back to "Think" or "Search" with refined queries.
|
|
163
|
+
- Usage: Call `analyze` after getting search results to verify the quality and correctness of that information. Consider:
|
|
164
|
+
- Relevance: Do the documents directly address the user's question?
|
|
165
|
+
- Completeness: Is there enough information to provide a thorough answer?
|
|
166
|
+
- Reliability: Are the sources credible and up-to-date?
|
|
167
|
+
- Consistency: Do the documents agree or contradict each other?
|
|
168
|
+
|
|
169
|
+
**Important Guidelines**:
|
|
170
|
+
- Do not include your internal chain-of-thought in direct user responses.
|
|
171
|
+
- Use "Think" to reason internally. These notes are never exposed to the user.
|
|
172
|
+
- Iterate through the cycle (Think → Search → Analyze) as many times as needed until you have a final answer.
|
|
173
|
+
- When you do provide a final answer to the user, be clear, concise, and accurate.
|
|
174
|
+
- If search results are sparse or contradictory, acknowledge limitations in your response.
|
|
175
|
+
- Synthesize information from multiple sources rather than relying on a single document.\
|
|
176
|
+
""")
|
|
177
|
+
|
|
178
|
+
FEW_SHOT_EXAMPLES = dedent("""\
|
|
179
|
+
You can refer to the examples below as guidance for how to use each tool.
|
|
180
|
+
### Examples
|
|
181
|
+
|
|
182
|
+
#### Example 1: Multiple Searches and Analysis
|
|
183
|
+
|
|
184
|
+
User: What are the recommended dietary guidelines for someone with mild hypertension?
|
|
185
|
+
Think: The user is asking about dietary guidelines for mild hypertension. I'll start broad, then refine if needed.
|
|
186
|
+
Search: "dietary guidelines for mild hypertension", "salt intake recommendations for mild hypertension"
|
|
187
|
+
Analyze: I got one document referencing the DASH diet, but it's quite brief. I might need more info about salt intake recommendations specifically.
|
|
188
|
+
Think: Let me refine my search to see if there are official guidelines from recognized health organizations.
|
|
189
|
+
Search: "WHO or American Heart Association guidelines for hypertension", "fruits and vegetables for mild hypertension"
|
|
190
|
+
Analyze: The new documents mention daily sodium limits, recommended fruit/vegetable intake, and more. This seems thorough. I'm ready to formulate the answer.
|
|
191
|
+
|
|
192
|
+
Final Answer: For mild hypertension, the guidelines typically recommend following the DASH diet, which emphasizes ...
|
|
193
|
+
|
|
194
|
+
#### Example 2: Invalid or Insufficient Search Results
|
|
195
|
+
|
|
196
|
+
User: Do you have any documentation on the 'XYZ Project' from last year?
|
|
197
|
+
Think: I'll try searching for 'XYZ Project last year' but if that fails, I'll look for internal code names or older references.
|
|
198
|
+
Search: "XYZ Project last year"
|
|
199
|
+
Analyze: No relevant documents. Let me refine my search to check for 'XYZ Project' in different date ranges or alternate titles.
|
|
200
|
+
Think: Possibly it's under 'XYZ Initiative' or 'XYZ Rollout.' Let's do a second search.
|
|
201
|
+
Search: "XYZ Initiative OR 'XYZ Rollout' from last year"
|
|
202
|
+
Analyze: Found a relevant archive for 'XYZ Initiative'. Looks correct and references last year's timeline. I'll proceed with that info.
|
|
203
|
+
|
|
204
|
+
Final Answer: Yes, we have some archived documentation under the name 'XYZ Initiative.' It includes ...
|
|
205
|
+
|
|
206
|
+
#### Example 3: Synthesizing Complex Information
|
|
207
|
+
|
|
208
|
+
User: How do quantum computers differ from classical computers in terms of performance?
|
|
209
|
+
Think: This is a technical question requiring clear explanations of quantum vs. classical computing performance characteristics.
|
|
210
|
+
Search: "quantum computing performance vs classical computing"
|
|
211
|
+
Analyze: Found general information but need more specifics on actual performance metrics and use cases.
|
|
212
|
+
Think: Let me search for specific quantum advantages and limitations.
|
|
213
|
+
Search: "quantum supremacy examples", "quantum computing limitations"
|
|
214
|
+
Search: "quantum computing speedup for specific algorithms"
|
|
215
|
+
Analyze: Now I have concrete examples of quantum speedup for certain algorithms, limitations for others, and real-world benchmarks.
|
|
216
|
+
|
|
217
|
+
Final Answer: Quantum computers differ from classical computers in three key ways: [synthesized explanation with specific examples]...\
|
|
218
|
+
""")
|