Swap the Provider, Keep the Agent

The point of FinanceTools: the agent is written once against a fixed tool surface, and the data provider is a configuration choice.

swap_provider.py
"""
Swap the Provider, Keep the Agent
=================================
The point of FinanceTools: the agent is written once against a fixed tool
surface, and the data provider is a configuration choice.

Three ways to pick a provider:
1. `FinanceTools()`                                 -> YFinance() (default, no key)
2. `FinanceTools(provider=FinancialDatasets())`     -> a provider instance (recommended)
3. `FinanceTools(provider="financial_datasets")`    -> registered id, for env/config-driven setups

This example builds the same agent for each configured provider and runs the
same prompt, so you can compare answers side by side.

Run:
    python cookbook/91_tools/finance/03_swap_provider.py            # yfinance only
    FINANCIAL_DATASETS_API_KEY=... python cookbook/91_tools/finance/03_swap_provider.py
"""

from os import getenv

from agno.agent import Agent
from agno.tools.finance import FinanceTools
from agno.tools.finance.providers import FinancialDatasets, YFinance

# ---------------------------------------------------------------------------
# Providers to compare (financialdatasets.ai only when a key is present)
# ---------------------------------------------------------------------------
providers = [YFinance()]
if getenv("FINANCIAL_DATASETS_API_KEY"):
    providers.append(FinancialDatasets())

INSTRUCTIONS = [
    "Lead with the answer, then show the evidence.",
    "State the ticker, currency and the as-of time of the data you used.",
]

# ---------------------------------------------------------------------------
# Create one agent per provider - the agent code is identical
# ---------------------------------------------------------------------------
agents = [
    Agent(
        name=f"Finance Agent ({provider.id})",
        model="openai:gpt-5.6",
        tools=[FinanceTools(provider=provider)],
        instructions=INSTRUCTIONS,
        markdown=True,
    )
    for provider in providers
]

# ---------------------------------------------------------------------------
# Run the same prompt through each
# ---------------------------------------------------------------------------
if __name__ == "__main__":
    for provider, agent in zip(providers, agents):
        print(f"\n===== {provider.name} | status: {provider.status()} =====\n")
        agent.print_response(
            "What is Apple's current price, P/E and market cap?", stream=True
        )

The setup runs Yahoo Finance only. Export FINANCIAL_DATASETS_API_KEY as well to include the second provider; do not set a placeholder key when you only want Yahoo Finance. Tool names and result contracts are shared, but the registered list follows each provider's capabilities, so Financial Datasets omits symbol search and analyst recommendations. status() reports configuration/import readiness rather than a successful live request.

Run the Example

Set up your virtual environment

uv venv --python 3.12
source .venv/bin/activate

Install dependencies

uv pip install -U agno openai yfinance

Export your API keys

export OPENAI_API_KEY="your_openai_api_key_here"

Run the example

Save the code above as swap_provider.py, then run:

python swap_provider.py

Full source: cookbook/91_tools/finance/03_swap_provider.py