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/twilio.py
CHANGED
|
@@ -3,7 +3,7 @@ from os import getenv
|
|
|
3
3
|
from typing import Any, Dict, List, Optional
|
|
4
4
|
|
|
5
5
|
from agno.tools import Toolkit
|
|
6
|
-
from agno.utils.log import logger
|
|
6
|
+
from agno.utils.log import log_info, logger
|
|
7
7
|
|
|
8
8
|
try:
|
|
9
9
|
from twilio.base.exceptions import TwilioRestException
|
|
@@ -22,6 +22,11 @@ class TwilioTools(Toolkit):
|
|
|
22
22
|
region: Optional[str] = None,
|
|
23
23
|
edge: Optional[str] = None,
|
|
24
24
|
debug: bool = False,
|
|
25
|
+
enable_send_sms: bool = True,
|
|
26
|
+
enable_get_call_details: bool = True,
|
|
27
|
+
enable_list_messages: bool = True,
|
|
28
|
+
all: bool = False,
|
|
29
|
+
**kwargs,
|
|
25
30
|
):
|
|
26
31
|
"""Initialize the Twilio toolkit.
|
|
27
32
|
|
|
@@ -38,8 +43,6 @@ class TwilioTools(Toolkit):
|
|
|
38
43
|
edge: Optional Twilio edge location (e.g. 'sydney')
|
|
39
44
|
debug: Enable debug logging
|
|
40
45
|
"""
|
|
41
|
-
super().__init__(name="twilio")
|
|
42
|
-
|
|
43
46
|
# Get credentials from environment if not provided
|
|
44
47
|
self.account_sid = account_sid or getenv("TWILIO_ACCOUNT_SID")
|
|
45
48
|
self.auth_token = auth_token or getenv("TWILIO_AUTH_TOKEN")
|
|
@@ -84,9 +87,15 @@ class TwilioTools(Toolkit):
|
|
|
84
87
|
logging.basicConfig()
|
|
85
88
|
self.client.http_client.logger.setLevel(logging.INFO)
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
tools: List[Any] = []
|
|
91
|
+
if all or enable_send_sms:
|
|
92
|
+
tools.append(self.send_sms)
|
|
93
|
+
if all or enable_get_call_details:
|
|
94
|
+
tools.append(self.get_call_details)
|
|
95
|
+
if all or enable_list_messages:
|
|
96
|
+
tools.append(self.list_messages)
|
|
97
|
+
|
|
98
|
+
super().__init__(name="twilio", tools=tools, **kwargs)
|
|
90
99
|
|
|
91
100
|
@staticmethod
|
|
92
101
|
def validate_phone_number(phone: str) -> bool:
|
|
@@ -114,7 +123,7 @@ class TwilioTools(Toolkit):
|
|
|
114
123
|
return "Error: Message body cannot be empty"
|
|
115
124
|
|
|
116
125
|
message = self.client.messages.create(to=to, from_=from_, body=body)
|
|
117
|
-
|
|
126
|
+
log_info(f"SMS sent. SID: {message.sid}, to: {to}")
|
|
118
127
|
return f"Message sent successfully. SID: {message.sid}"
|
|
119
128
|
except TwilioRestException as e:
|
|
120
129
|
logger.error(f"Failed to send SMS to {to}: {e}")
|
|
@@ -132,7 +141,7 @@ class TwilioTools(Toolkit):
|
|
|
132
141
|
"""
|
|
133
142
|
try:
|
|
134
143
|
call = self.client.calls(call_sid).fetch()
|
|
135
|
-
|
|
144
|
+
log_info(f"Fetched details for call SID: {call_sid}")
|
|
136
145
|
return {
|
|
137
146
|
"to": call.to,
|
|
138
147
|
"from": call.from_,
|
|
@@ -170,7 +179,7 @@ class TwilioTools(Toolkit):
|
|
|
170
179
|
"date_sent": str(message.date_sent),
|
|
171
180
|
}
|
|
172
181
|
)
|
|
173
|
-
|
|
182
|
+
log_info(f"Retrieved {len(messages)} messages")
|
|
174
183
|
return messages
|
|
175
184
|
except TwilioRestException as e:
|
|
176
185
|
logger.error(f"Failed to list messages: {e}")
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from textwrap import dedent
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from agno.tools import Toolkit
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class UserControlFlowTools(Toolkit):
|
|
8
|
+
def __init__(
|
|
9
|
+
self,
|
|
10
|
+
instructions: Optional[str] = None,
|
|
11
|
+
add_instructions: bool = True,
|
|
12
|
+
enable_get_user_input: bool = True,
|
|
13
|
+
all: bool = False,
|
|
14
|
+
**kwargs,
|
|
15
|
+
):
|
|
16
|
+
"""A toolkit that provides the ability for the agent to interrupt the agent run and interact with the user."""
|
|
17
|
+
|
|
18
|
+
if instructions is None:
|
|
19
|
+
self.instructions = self.DEFAULT_INSTRUCTIONS
|
|
20
|
+
else:
|
|
21
|
+
self.instructions = instructions
|
|
22
|
+
|
|
23
|
+
tools = []
|
|
24
|
+
if all or enable_get_user_input:
|
|
25
|
+
tools.append(self.get_user_input)
|
|
26
|
+
|
|
27
|
+
super().__init__(
|
|
28
|
+
name="user_control_flow_tools",
|
|
29
|
+
instructions=self.instructions,
|
|
30
|
+
add_instructions=add_instructions,
|
|
31
|
+
tools=tools,
|
|
32
|
+
**kwargs,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def get_user_input(self, user_input_fields: list[dict]) -> str:
|
|
36
|
+
"""Use this tool to get user input for the given fields. Provide all the fields that you require the user to fill in, as if they were filling in a form.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
user_input_fields (list[dict[str, str]]): A list of dictionaries, each containing the following keys:
|
|
40
|
+
- field_name: The name of the field to get input for.
|
|
41
|
+
- field_type: The type of the field to get input for. Only valid python types are supported (e.g. str, int, float, bool, list, dict, etc.).
|
|
42
|
+
- field_description: A description of the field to get input for.
|
|
43
|
+
|
|
44
|
+
"""
|
|
45
|
+
# Nothing needs to be executed here, the agent logic will interrupt the run and wait for the user input
|
|
46
|
+
return "User input received"
|
|
47
|
+
|
|
48
|
+
# --------------------------------------------------------------------------------
|
|
49
|
+
# Default instructions
|
|
50
|
+
# --------------------------------------------------------------------------------
|
|
51
|
+
|
|
52
|
+
DEFAULT_INSTRUCTIONS = dedent(
|
|
53
|
+
"""\
|
|
54
|
+
You have access to the `get_user_input` tool to get user input for the given fields.
|
|
55
|
+
|
|
56
|
+
1. **Get User Input**:
|
|
57
|
+
- Purpose: When you have call a tool/function where you don't have enough information, don't say you can't do it, just use the `get_user_input` tool to get the information you need from the user.
|
|
58
|
+
- Usage: Call `get_user_input` with the fields you require the user to fill in for you to continue your task.
|
|
59
|
+
|
|
60
|
+
## IMPORTANT GUIDELINES
|
|
61
|
+
- **Don't respond and ask the user for information.** Just use the `get_user_input` tool to get the information you need from the user.
|
|
62
|
+
- **Don't make up information you don't have.** If you don't have the information, use the `get_user_input` tool to get the information you need from the user.
|
|
63
|
+
- **Include only the required fields.** Include only the required fields in the `user_input_fields` parameter of the `get_user_input` tool. Don't include fields you already have the information for.
|
|
64
|
+
- **Provide a clear and concise description of the field.** Clearly describe the field in the `field_description` parameter of the `user_input_fields` parameter of the `get_user_input` tool.
|
|
65
|
+
- **Provide a type for the field.** Fill the `field_type` parameter of the `user_input_fields` parameter of the `get_user_input` tool with the type of the field.
|
|
66
|
+
|
|
67
|
+
## INPUT VALIDATION AND CONVERSION
|
|
68
|
+
- **Boolean fields**: Only explicit positive responses are considered True:
|
|
69
|
+
* True values: 'true', 'yes', 'y', '1', 'on', 't', 'True', 'YES', 'Y', 'T'
|
|
70
|
+
* False values: Everything else including 'false', 'no', 'n', '0', 'off', 'f', empty strings, unanswered fields, or any other input
|
|
71
|
+
* **CRITICAL**: Empty/unanswered fields should be treated as False (not selected)
|
|
72
|
+
- **Users can leave fields unanswered.** Empty responses are valid and should be treated as False for boolean fields.
|
|
73
|
+
- **NEVER ask for the same field twice.** Once you receive ANY user input for a field (including empty strings), accept it and move on.
|
|
74
|
+
- **DO NOT validate or re-request input.** Accept whatever the user provides and convert it appropriately.
|
|
75
|
+
- **Proceed with only the fields that were explicitly answered as True.** Skip or ignore fields that are False/unanswered.
|
|
76
|
+
- **Complete the task immediately after receiving all user inputs, do not ask for confirmation or re-validation.**
|
|
77
|
+
"""
|
|
78
|
+
)
|
agno/tools/valyu.py
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.tools import Toolkit
|
|
6
|
+
from agno.utils.log import log_debug, log_error, log_warning
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
from valyu import Valyu
|
|
10
|
+
except ImportError:
|
|
11
|
+
raise ImportError("`valyu` not installed. Please install using `pip install valyu`")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ValyuTools(Toolkit):
|
|
15
|
+
"""
|
|
16
|
+
Valyu is a toolkit for academic and web search capabilities.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
api_key (Optional[str]): Valyu API key. Retrieved from VALYU_API_KEY env variable if not provided.
|
|
20
|
+
enable_academic_search (bool): Enable academic sources search functionality. Default is True.
|
|
21
|
+
enable_web_search (bool): Enable web search functionality. Default is True.
|
|
22
|
+
enable_paper_search (bool): Enable search within paper functionality. Default is True.
|
|
23
|
+
all (bool): Enable all tools. Overrides individual flags when True. Default is False.
|
|
24
|
+
text_length (int): Maximum length of text content per result. Default is 1000.
|
|
25
|
+
max_results (int): Maximum number of results to return. Default is 10.
|
|
26
|
+
relevance_threshold (float): Minimum relevance score for results. Default is 0.5.
|
|
27
|
+
content_category (Optional[str]): Content category for filtering.
|
|
28
|
+
search_start_date (Optional[str]): Start date for search filtering (YYYY-MM-DD).
|
|
29
|
+
search_end_date (Optional[str]): End date for search filtering (YYYY-MM-DD).
|
|
30
|
+
search_domains (Optional[List[str]]): List of domains to search within.
|
|
31
|
+
sources (Optional[List[str]]): List of specific sources to search.
|
|
32
|
+
max_price (float): Maximum price for API calls. Default is 30.0.
|
|
33
|
+
tool_call_mode (bool): Enable tool call mode. Default is False.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
api_key: Optional[str] = None,
|
|
39
|
+
enable_academic_search: bool = True,
|
|
40
|
+
enable_web_search: bool = True,
|
|
41
|
+
enable_paper_search: bool = True,
|
|
42
|
+
all: bool = False,
|
|
43
|
+
text_length: int = 1000,
|
|
44
|
+
max_results: int = 10,
|
|
45
|
+
relevance_threshold: float = 0.5,
|
|
46
|
+
content_category: Optional[str] = None,
|
|
47
|
+
search_start_date: Optional[str] = None,
|
|
48
|
+
search_end_date: Optional[str] = None,
|
|
49
|
+
search_domains: Optional[List[str]] = None,
|
|
50
|
+
sources: Optional[List[str]] = None,
|
|
51
|
+
max_price: float = 30.0,
|
|
52
|
+
tool_call_mode: bool = False,
|
|
53
|
+
**kwargs,
|
|
54
|
+
):
|
|
55
|
+
self.api_key = api_key or getenv("VALYU_API_KEY")
|
|
56
|
+
if not self.api_key:
|
|
57
|
+
raise ValueError("VALYU_API_KEY not set. Please set the VALYU_API_KEY environment variable.")
|
|
58
|
+
|
|
59
|
+
self.valyu = Valyu(api_key=self.api_key)
|
|
60
|
+
self.text_length = text_length
|
|
61
|
+
self.max_results = max_results
|
|
62
|
+
self.relevance_threshold = relevance_threshold
|
|
63
|
+
self.max_price = max_price
|
|
64
|
+
self.content_category = content_category
|
|
65
|
+
self.search_start_date = search_start_date
|
|
66
|
+
self.search_end_date = search_end_date
|
|
67
|
+
self.search_domains = search_domains
|
|
68
|
+
self.sources = sources
|
|
69
|
+
self.tool_call_mode = tool_call_mode
|
|
70
|
+
|
|
71
|
+
tools: List[Any] = []
|
|
72
|
+
if all or enable_academic_search:
|
|
73
|
+
tools.append(self.search_academic_sources)
|
|
74
|
+
if all or enable_web_search:
|
|
75
|
+
tools.append(self.search_web)
|
|
76
|
+
if all or enable_paper_search:
|
|
77
|
+
tools.append(self.search_within_paper)
|
|
78
|
+
|
|
79
|
+
super().__init__(name="valyu_search", tools=tools, **kwargs)
|
|
80
|
+
|
|
81
|
+
def _parse_results(self, results: List[Any]) -> str:
|
|
82
|
+
parsed_results = []
|
|
83
|
+
for result in results:
|
|
84
|
+
result_dict = {}
|
|
85
|
+
|
|
86
|
+
# Essential fields
|
|
87
|
+
if hasattr(result, "url") and result.url:
|
|
88
|
+
result_dict["url"] = result.url
|
|
89
|
+
if hasattr(result, "title") and result.title:
|
|
90
|
+
result_dict["title"] = result.title
|
|
91
|
+
if hasattr(result, "source") and result.source:
|
|
92
|
+
result_dict["source"] = result.source
|
|
93
|
+
if hasattr(result, "relevance_score"):
|
|
94
|
+
result_dict["relevance_score"] = result.relevance_score
|
|
95
|
+
|
|
96
|
+
# Content with length limiting
|
|
97
|
+
if hasattr(result, "content") and result.content:
|
|
98
|
+
content = result.content
|
|
99
|
+
if self.text_length and len(content) > self.text_length:
|
|
100
|
+
content = content[: self.text_length] + "..."
|
|
101
|
+
result_dict["content"] = content
|
|
102
|
+
|
|
103
|
+
# Additional metadata
|
|
104
|
+
if hasattr(result, "description") and result.description:
|
|
105
|
+
result_dict["description"] = result.description
|
|
106
|
+
|
|
107
|
+
parsed_results.append(result_dict)
|
|
108
|
+
|
|
109
|
+
return json.dumps(parsed_results, indent=2)
|
|
110
|
+
|
|
111
|
+
def _valyu_search(
|
|
112
|
+
self,
|
|
113
|
+
query: str,
|
|
114
|
+
search_type: str,
|
|
115
|
+
content_category: Optional[str] = None,
|
|
116
|
+
sources: Optional[List[str]] = None,
|
|
117
|
+
start_date: Optional[str] = None,
|
|
118
|
+
end_date: Optional[str] = None,
|
|
119
|
+
) -> str:
|
|
120
|
+
try:
|
|
121
|
+
search_params = {
|
|
122
|
+
"query": query,
|
|
123
|
+
"search_type": search_type,
|
|
124
|
+
"max_num_results": self.max_results,
|
|
125
|
+
"is_tool_call": self.tool_call_mode,
|
|
126
|
+
"relevance_threshold": self.relevance_threshold,
|
|
127
|
+
"max_price": self.max_price,
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
# Add optional parameters
|
|
131
|
+
if sources or self.sources:
|
|
132
|
+
search_params["included_sources"] = sources or self.sources
|
|
133
|
+
if content_category or self.content_category:
|
|
134
|
+
search_params["category"] = content_category or self.content_category
|
|
135
|
+
if start_date or self.search_start_date:
|
|
136
|
+
search_params["start_date"] = start_date or self.search_start_date
|
|
137
|
+
if end_date or self.search_end_date:
|
|
138
|
+
search_params["end_date"] = end_date or self.search_end_date
|
|
139
|
+
|
|
140
|
+
log_debug(f"Valyu search parameters: {search_params}")
|
|
141
|
+
response = self.valyu.search(**search_params)
|
|
142
|
+
|
|
143
|
+
if not response.success:
|
|
144
|
+
log_error(f"Valyu search API error: {response.error}")
|
|
145
|
+
return f"Error: {response.error or 'Search request failed'}"
|
|
146
|
+
|
|
147
|
+
return self._parse_results(response.results or [])
|
|
148
|
+
|
|
149
|
+
except Exception as e:
|
|
150
|
+
error_msg = f"Valyu search failed: {str(e)}"
|
|
151
|
+
log_error(error_msg)
|
|
152
|
+
return f"Error: {error_msg}"
|
|
153
|
+
|
|
154
|
+
def search_academic_sources(
|
|
155
|
+
self,
|
|
156
|
+
query: str,
|
|
157
|
+
start_date: Optional[str] = None,
|
|
158
|
+
end_date: Optional[str] = None,
|
|
159
|
+
) -> str:
|
|
160
|
+
"""Search academic sources (ArXiv, PubMed, academic publishers).
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
query: Research question or topic
|
|
164
|
+
start_date: Filter papers after this date (YYYY-MM-DD)
|
|
165
|
+
end_date: Filter papers before this date (YYYY-MM-DD)
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
JSON array of academic papers
|
|
169
|
+
"""
|
|
170
|
+
sources = ["valyu/valyu-arxiv", "valyu/valyu-pubmed", "wiley/wiley-finance-papers", "wiley/wiley-finance-books"]
|
|
171
|
+
|
|
172
|
+
return self._valyu_search(
|
|
173
|
+
query=query,
|
|
174
|
+
search_type="proprietary",
|
|
175
|
+
sources=sources,
|
|
176
|
+
start_date=start_date,
|
|
177
|
+
end_date=end_date,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
def search_web(
|
|
181
|
+
self,
|
|
182
|
+
query: str,
|
|
183
|
+
start_date: Optional[str] = None,
|
|
184
|
+
end_date: Optional[str] = None,
|
|
185
|
+
content_category: Optional[str] = None,
|
|
186
|
+
) -> str:
|
|
187
|
+
"""Search web sources for real-time information.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
query: Search query
|
|
191
|
+
start_date: Filter content after this date (YYYY-MM-DD)
|
|
192
|
+
end_date: Filter content before this date (YYYY-MM-DD)
|
|
193
|
+
content_category: Description of the category of the query
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
JSON array of web search results
|
|
197
|
+
"""
|
|
198
|
+
return self._valyu_search(
|
|
199
|
+
query=query,
|
|
200
|
+
search_type="web",
|
|
201
|
+
content_category=content_category,
|
|
202
|
+
start_date=start_date,
|
|
203
|
+
end_date=end_date,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
def search_within_paper(
|
|
207
|
+
self,
|
|
208
|
+
paper_url: str,
|
|
209
|
+
query: str,
|
|
210
|
+
) -> str:
|
|
211
|
+
"""Search within a specific ArXiv paper.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
paper_url: ArXiv paper URL
|
|
215
|
+
query: Search query
|
|
216
|
+
Returns:
|
|
217
|
+
JSON array of relevant sections from the paper
|
|
218
|
+
"""
|
|
219
|
+
# Validate ArXiv URL
|
|
220
|
+
if not paper_url.startswith("https:/"):
|
|
221
|
+
log_warning(f"Invalid paper URL: {paper_url}")
|
|
222
|
+
return "Error: Invalid paper URL format"
|
|
223
|
+
|
|
224
|
+
return self._valyu_search(
|
|
225
|
+
query=query,
|
|
226
|
+
search_type="proprietary",
|
|
227
|
+
sources=[paper_url],
|
|
228
|
+
)
|