agno 0.1.2__py3-none-any.whl → 2.3.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +249 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +147 -0
- agno/os/interfaces/agui/utils.py +574 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
from os import getenv
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
import requests
|
|
5
|
+
|
|
6
|
+
from agno.tools import Toolkit
|
|
7
|
+
from agno.utils.log import log_error
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class FinancialDatasetsTools(Toolkit):
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
api_key: Optional[str] = None,
|
|
14
|
+
**kwargs,
|
|
15
|
+
):
|
|
16
|
+
"""Initialize the Financial Datasets Tools.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
api_key: API key for Financial Datasets API (optional, can be set via environment variable)
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
self.api_key: Optional[str] = api_key or getenv("FINANCIAL_DATASETS_API_KEY")
|
|
23
|
+
if not self.api_key:
|
|
24
|
+
log_error(
|
|
25
|
+
"FINANCIAL_DATASETS_API_KEY not set. Please set the FINANCIAL_DATASETS_API_KEY environment variable."
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
self.base_url = "https://api.financialdatasets.ai"
|
|
29
|
+
|
|
30
|
+
tools: List[Any] = [
|
|
31
|
+
# Financial statements
|
|
32
|
+
self.get_income_statements,
|
|
33
|
+
self.get_balance_sheets,
|
|
34
|
+
self.get_cash_flow_statements,
|
|
35
|
+
self.get_segmented_financials,
|
|
36
|
+
self.get_financial_metrics,
|
|
37
|
+
# Company info
|
|
38
|
+
self.get_company_info,
|
|
39
|
+
# Market data
|
|
40
|
+
self.get_stock_prices,
|
|
41
|
+
self.get_earnings,
|
|
42
|
+
# Ownership data
|
|
43
|
+
self.get_insider_trades,
|
|
44
|
+
self.get_institutional_ownership,
|
|
45
|
+
# News
|
|
46
|
+
self.get_news,
|
|
47
|
+
# SEC filings
|
|
48
|
+
self.get_sec_filings,
|
|
49
|
+
# Crypto
|
|
50
|
+
self.get_crypto_prices,
|
|
51
|
+
# Search
|
|
52
|
+
self.search_tickers,
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
super().__init__(name="financial_datasets_tools", tools=tools, **kwargs)
|
|
56
|
+
|
|
57
|
+
def _make_request(self, endpoint: str, params: Dict[str, Any]) -> str:
|
|
58
|
+
"""
|
|
59
|
+
Makes a request to the Financial Datasets API.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
endpoint: API endpoint to call
|
|
63
|
+
params: Query parameters for the request
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
JSON response from the API
|
|
67
|
+
"""
|
|
68
|
+
if not self.api_key:
|
|
69
|
+
log_error("No API key provided. Cannot make request.")
|
|
70
|
+
return "API key not set"
|
|
71
|
+
|
|
72
|
+
headers = {"X-API-KEY": self.api_key}
|
|
73
|
+
url = f"{self.base_url}/{endpoint}"
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
response = requests.get(url, headers=headers, params=params)
|
|
77
|
+
response.raise_for_status()
|
|
78
|
+
return response.text
|
|
79
|
+
except requests.exceptions.RequestException as e:
|
|
80
|
+
log_error(f"Error making request to {url}: {str(e)}")
|
|
81
|
+
return f"Error making request to {url}: {str(e)}"
|
|
82
|
+
|
|
83
|
+
# Financial Statements
|
|
84
|
+
def get_income_statements(self, ticker: str, period: str = "annual", limit: int = 10) -> str:
|
|
85
|
+
"""
|
|
86
|
+
Get income statements for a ticker.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
ticker: Stock ticker symbol
|
|
90
|
+
period: 'annual', 'quarterly', or 'ttm'
|
|
91
|
+
limit: Number of statements to return
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Dictionary containing income statements
|
|
95
|
+
"""
|
|
96
|
+
params = {"ticker": ticker, "period": period, "limit": limit}
|
|
97
|
+
return self._make_request("financials/income-statements", params)
|
|
98
|
+
|
|
99
|
+
def get_balance_sheets(self, ticker: str, period: str = "annual", limit: int = 10) -> str:
|
|
100
|
+
"""
|
|
101
|
+
Get balance sheets for a ticker.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
ticker: Stock ticker symbol
|
|
105
|
+
period: 'annual', 'quarterly', or 'ttm'
|
|
106
|
+
limit: Number of statements to return
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
Dictionary containing balance sheets
|
|
110
|
+
"""
|
|
111
|
+
params = {"ticker": ticker, "period": period, "limit": limit}
|
|
112
|
+
return self._make_request("financials/balance-sheets", params)
|
|
113
|
+
|
|
114
|
+
def get_cash_flow_statements(self, ticker: str, period: str = "annual", limit: int = 10) -> str:
|
|
115
|
+
"""
|
|
116
|
+
Get cash flow statements for a ticker.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
ticker: Stock ticker symbol
|
|
120
|
+
period: 'annual', 'quarterly', or 'ttm'
|
|
121
|
+
limit: Number of statements to return
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
Dictionary containing cash flow statements
|
|
125
|
+
"""
|
|
126
|
+
params = {"ticker": ticker, "period": period, "limit": limit}
|
|
127
|
+
return self._make_request("financials/cash-flow-statements", params)
|
|
128
|
+
|
|
129
|
+
# Other API endpoints from the documentation
|
|
130
|
+
|
|
131
|
+
def get_company_info(self, ticker: str) -> str:
|
|
132
|
+
"""
|
|
133
|
+
Get company information for a ticker.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
ticker: Stock ticker symbol
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
Dictionary containing company information
|
|
140
|
+
"""
|
|
141
|
+
params = {"ticker": ticker}
|
|
142
|
+
return self._make_request("company", params)
|
|
143
|
+
|
|
144
|
+
def get_crypto_prices(self, symbol: str, interval: str = "1d", limit: int = 100) -> str:
|
|
145
|
+
"""
|
|
146
|
+
Get cryptocurrency prices.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
symbol: Cryptocurrency symbol (e.g., 'BTC')
|
|
150
|
+
interval: Price interval (e.g., '1d', '1h')
|
|
151
|
+
limit: Number of price points to return
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Dictionary containing crypto prices
|
|
155
|
+
"""
|
|
156
|
+
params = {"symbol": symbol, "interval": interval, "limit": limit}
|
|
157
|
+
return self._make_request("crypto/prices", params)
|
|
158
|
+
|
|
159
|
+
def get_earnings(self, ticker: str, limit: int = 10) -> str:
|
|
160
|
+
"""
|
|
161
|
+
Get earnings data for a ticker.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
ticker: Stock ticker symbol
|
|
165
|
+
limit: Number of earnings reports to return
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Dictionary containing earnings data
|
|
169
|
+
"""
|
|
170
|
+
params = {"ticker": ticker, "limit": limit}
|
|
171
|
+
return self._make_request("earnings", params)
|
|
172
|
+
|
|
173
|
+
def get_financial_metrics(self, ticker: str) -> str:
|
|
174
|
+
"""
|
|
175
|
+
Get financial metrics for a ticker.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
ticker: Stock ticker symbol
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
Dictionary containing financial metrics
|
|
182
|
+
"""
|
|
183
|
+
params = {"ticker": ticker}
|
|
184
|
+
return self._make_request("financials/metrics", params)
|
|
185
|
+
|
|
186
|
+
def get_insider_trades(self, ticker: str, limit: int = 50) -> str:
|
|
187
|
+
"""
|
|
188
|
+
Get insider trades for a ticker.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
ticker: Stock ticker symbol
|
|
192
|
+
limit: Number of trades to return
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
Dictionary containing insider trades
|
|
196
|
+
"""
|
|
197
|
+
params = {"ticker": ticker, "limit": limit}
|
|
198
|
+
return self._make_request("insider-trades", params)
|
|
199
|
+
|
|
200
|
+
def get_institutional_ownership(self, ticker: str) -> str:
|
|
201
|
+
"""
|
|
202
|
+
Get institutional ownership data for a ticker.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
ticker: Stock ticker symbol
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
Dictionary containing institutional ownership data
|
|
209
|
+
"""
|
|
210
|
+
params = {"ticker": ticker}
|
|
211
|
+
return self._make_request("institutional-ownership", params)
|
|
212
|
+
|
|
213
|
+
def get_news(self, ticker: Optional[str] = None, limit: int = 50) -> str:
|
|
214
|
+
"""
|
|
215
|
+
Get market news, optionally filtered by ticker.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
ticker: Stock ticker symbol (optional)
|
|
219
|
+
limit: Number of news items to return
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Dictionary containing news items
|
|
223
|
+
"""
|
|
224
|
+
params: Dict[str, Any] = {"limit": limit}
|
|
225
|
+
if ticker:
|
|
226
|
+
params["ticker"] = ticker
|
|
227
|
+
return self._make_request("news", params)
|
|
228
|
+
|
|
229
|
+
def get_stock_prices(self, ticker: str, interval: str = "1d", limit: int = 100) -> str:
|
|
230
|
+
"""
|
|
231
|
+
Get stock prices for a ticker.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
ticker: Stock ticker symbol
|
|
235
|
+
interval: Price interval (e.g., '1d', '1h')
|
|
236
|
+
limit: Number of price points to return
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
Dictionary containing stock prices
|
|
240
|
+
"""
|
|
241
|
+
params = {"ticker": ticker, "interval": interval, "limit": limit}
|
|
242
|
+
return self._make_request("prices", params)
|
|
243
|
+
|
|
244
|
+
def search_tickers(self, query: str, limit: int = 10) -> str:
|
|
245
|
+
"""
|
|
246
|
+
Search for tickers based on a query.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
query: Search query
|
|
250
|
+
limit: Maximum number of results to return
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
Dictionary containing search results
|
|
254
|
+
"""
|
|
255
|
+
params = {"query": query, "limit": limit}
|
|
256
|
+
return self._make_request("search", params)
|
|
257
|
+
|
|
258
|
+
def get_sec_filings(self, ticker: str, form_type: Optional[str] = None, limit: int = 50) -> str:
|
|
259
|
+
"""
|
|
260
|
+
Get SEC filings for a ticker.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
ticker: Stock ticker symbol
|
|
264
|
+
form_type: Type of SEC form (e.g., '10-K', '10-Q')
|
|
265
|
+
limit: Number of filings to return
|
|
266
|
+
|
|
267
|
+
Returns:
|
|
268
|
+
Dictionary containing SEC filings
|
|
269
|
+
"""
|
|
270
|
+
params: Dict[str, Any] = {"ticker": ticker, "limit": limit}
|
|
271
|
+
if form_type:
|
|
272
|
+
params["form_type"] = form_type
|
|
273
|
+
return self._make_request("sec-filings", params)
|
|
274
|
+
|
|
275
|
+
def get_segmented_financials(self, ticker: str, period: str = "annual", limit: int = 10) -> str:
|
|
276
|
+
"""
|
|
277
|
+
Get segmented financials for a ticker.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
ticker: Stock ticker symbol
|
|
281
|
+
period: 'annual' or 'quarterly'
|
|
282
|
+
limit: Number of reports to return
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
Dictionary containing segmented financials
|
|
286
|
+
"""
|
|
287
|
+
params = {"ticker": ticker, "period": period, "limit": limit}
|
|
288
|
+
return self._make_request("financials/segmented", params)
|
agno/tools/firecrawl.py
CHANGED
|
@@ -1,57 +1,94 @@
|
|
|
1
1
|
import json
|
|
2
|
+
from os import getenv
|
|
2
3
|
from typing import Any, Dict, List, Optional
|
|
3
4
|
|
|
4
5
|
from agno.tools import Toolkit
|
|
6
|
+
from agno.utils.log import log_error
|
|
5
7
|
|
|
6
8
|
try:
|
|
7
|
-
from firecrawl import FirecrawlApp
|
|
9
|
+
from firecrawl import FirecrawlApp # type: ignore[attr-defined]
|
|
10
|
+
from firecrawl.types import ScrapeOptions
|
|
8
11
|
except ImportError:
|
|
9
12
|
raise ImportError("`firecrawl-py` not installed. Please install using `pip install firecrawl-py`")
|
|
10
13
|
|
|
11
14
|
|
|
15
|
+
class CustomJSONEncoder(json.JSONEncoder):
|
|
16
|
+
"""Custom JSON encoder that handles non-serializable types by converting them to strings."""
|
|
17
|
+
|
|
18
|
+
def default(self, obj):
|
|
19
|
+
try:
|
|
20
|
+
return super().default(obj)
|
|
21
|
+
except TypeError:
|
|
22
|
+
return str(obj)
|
|
23
|
+
|
|
24
|
+
|
|
12
25
|
class FirecrawlTools(Toolkit):
|
|
26
|
+
"""
|
|
27
|
+
Firecrawl is a tool for scraping and crawling websites.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
api_key (Optional[str]): The API key to use for the Firecrawl app.
|
|
31
|
+
enable_scrape (bool): Enable website scraping functionality. Default is True.
|
|
32
|
+
enable_crawl (bool): Enable website crawling functionality. Default is False.
|
|
33
|
+
enable_mapping (bool): Enable website mapping functionality. Default is False.
|
|
34
|
+
enable_search (bool): Enable web search functionality. Default is False.
|
|
35
|
+
all (bool): Enable all tools. Overrides individual flags when True. Default is False.
|
|
36
|
+
formats (Optional[List[str]]): The formats to use for the Firecrawl app.
|
|
37
|
+
limit (int): The maximum number of pages to crawl.
|
|
38
|
+
poll_interval (int): Polling interval for crawl operations.
|
|
39
|
+
search_params (Optional[Dict[str, Any]]): Parameters for search operations.
|
|
40
|
+
api_url (Optional[str]): The API URL to use for the Firecrawl app.
|
|
41
|
+
"""
|
|
42
|
+
|
|
13
43
|
def __init__(
|
|
14
44
|
self,
|
|
15
45
|
api_key: Optional[str] = None,
|
|
46
|
+
enable_scrape: bool = True,
|
|
47
|
+
enable_crawl: bool = False,
|
|
48
|
+
enable_mapping: bool = False,
|
|
49
|
+
enable_search: bool = False,
|
|
50
|
+
all: bool = False,
|
|
16
51
|
formats: Optional[List[str]] = None,
|
|
17
52
|
limit: int = 10,
|
|
18
|
-
|
|
19
|
-
|
|
53
|
+
poll_interval: int = 30,
|
|
54
|
+
search_params: Optional[Dict[str, Any]] = None,
|
|
55
|
+
api_url: Optional[str] = "https://api.firecrawl.dev",
|
|
56
|
+
**kwargs,
|
|
20
57
|
):
|
|
21
|
-
|
|
58
|
+
self.api_key: Optional[str] = api_key or getenv("FIRECRAWL_API_KEY")
|
|
59
|
+
if not self.api_key:
|
|
60
|
+
log_error("FIRECRAWL_API_KEY not set. Please set the FIRECRAWL_API_KEY environment variable.")
|
|
22
61
|
|
|
23
|
-
self.api_key: Optional[str] = api_key
|
|
24
62
|
self.formats: Optional[List[str]] = formats
|
|
25
63
|
self.limit: int = limit
|
|
26
|
-
self.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
64
|
+
self.poll_interval: int = poll_interval
|
|
65
|
+
self.app: FirecrawlApp = FirecrawlApp(api_key=self.api_key, api_url=api_url)
|
|
66
|
+
self.search_params = search_params
|
|
67
|
+
|
|
68
|
+
tools: List[Any] = []
|
|
69
|
+
if all or enable_scrape:
|
|
70
|
+
tools.append(self.scrape_website)
|
|
71
|
+
if all or enable_crawl:
|
|
72
|
+
tools.append(self.crawl_website)
|
|
73
|
+
if all or enable_mapping:
|
|
74
|
+
tools.append(self.map_website)
|
|
75
|
+
if all or enable_search:
|
|
76
|
+
tools.append(self.search_web)
|
|
77
|
+
|
|
78
|
+
super().__init__(name="firecrawl_tools", tools=tools, **kwargs)
|
|
36
79
|
|
|
37
80
|
def scrape_website(self, url: str) -> str:
|
|
38
|
-
"""Use this function to
|
|
81
|
+
"""Use this function to scrape a website using Firecrawl.
|
|
39
82
|
|
|
40
83
|
Args:
|
|
41
84
|
url (str): The URL to scrape.
|
|
42
|
-
|
|
43
|
-
Returns:
|
|
44
|
-
The results of the scraping.
|
|
45
85
|
"""
|
|
46
|
-
if url is None:
|
|
47
|
-
return "No URL provided"
|
|
48
|
-
|
|
49
86
|
params = {}
|
|
50
87
|
if self.formats:
|
|
51
88
|
params["formats"] = self.formats
|
|
52
89
|
|
|
53
|
-
scrape_result = self.app.
|
|
54
|
-
return json.dumps(scrape_result)
|
|
90
|
+
scrape_result = self.app.scrape(url, **params)
|
|
91
|
+
return json.dumps(scrape_result.model_dump(), cls=CustomJSONEncoder)
|
|
55
92
|
|
|
56
93
|
def crawl_website(self, url: str, limit: Optional[int] = None) -> str:
|
|
57
94
|
"""Use this function to Crawls a website using Firecrawl.
|
|
@@ -63,14 +100,52 @@ class FirecrawlTools(Toolkit):
|
|
|
63
100
|
Returns:
|
|
64
101
|
The results of the crawling.
|
|
65
102
|
"""
|
|
66
|
-
if url is None:
|
|
67
|
-
return "No URL provided"
|
|
68
|
-
|
|
69
103
|
params: Dict[str, Any] = {}
|
|
70
|
-
if self.limit
|
|
71
|
-
params["limit"] = self.limit
|
|
72
|
-
|
|
73
|
-
|
|
104
|
+
if self.limit is not None:
|
|
105
|
+
params["limit"] = self.limit
|
|
106
|
+
elif limit is not None:
|
|
107
|
+
params["limit"] = limit
|
|
108
|
+
if self.formats:
|
|
109
|
+
params["scrape_options"] = ScrapeOptions(formats=self.formats) # type: ignore
|
|
110
|
+
|
|
111
|
+
params["poll_interval"] = self.poll_interval
|
|
74
112
|
|
|
75
|
-
crawl_result = self.app.
|
|
76
|
-
return json.dumps(crawl_result)
|
|
113
|
+
crawl_result = self.app.crawl(url, **params)
|
|
114
|
+
return json.dumps(crawl_result.model_dump(), cls=CustomJSONEncoder)
|
|
115
|
+
|
|
116
|
+
def map_website(self, url: str) -> str:
|
|
117
|
+
"""Use this function to Map a website using Firecrawl.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
url (str): The URL to map.
|
|
121
|
+
|
|
122
|
+
"""
|
|
123
|
+
map_result = self.app.map(url)
|
|
124
|
+
return json.dumps(map_result.model_dump(), cls=CustomJSONEncoder)
|
|
125
|
+
|
|
126
|
+
def search_web(self, query: str, limit: Optional[int] = None):
|
|
127
|
+
"""Use this function to search for the web using Firecrawl.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
query (str): The query to search for.
|
|
131
|
+
limit (int): The maximum number of results to return.
|
|
132
|
+
"""
|
|
133
|
+
params: Dict[str, Any] = {}
|
|
134
|
+
if self.limit is not None:
|
|
135
|
+
params["limit"] = self.limit
|
|
136
|
+
elif limit is not None:
|
|
137
|
+
params["limit"] = limit
|
|
138
|
+
if self.formats:
|
|
139
|
+
params["scrape_options"] = ScrapeOptions(formats=self.formats) # type: ignore
|
|
140
|
+
if self.search_params:
|
|
141
|
+
params.update(self.search_params)
|
|
142
|
+
|
|
143
|
+
search_result = self.app.search(query, **params)
|
|
144
|
+
|
|
145
|
+
if hasattr(search_result, "success"):
|
|
146
|
+
if search_result.success:
|
|
147
|
+
return json.dumps(search_result.data, cls=CustomJSONEncoder)
|
|
148
|
+
else:
|
|
149
|
+
return f"Error searching with the Firecrawl tool: {search_result.error}"
|
|
150
|
+
else:
|
|
151
|
+
return json.dumps(search_result.model_dump(), cls=CustomJSONEncoder)
|