feat(01-02): register Tradier in vendor routing and create options tools

- Add Tradier to VENDOR_LIST, TOOLS_CATEGORIES (options_chain), and VENDOR_METHODS
- Update route_to_vendor to catch TradierRateLimitError for fallback
- Add options_chain: tradier to DEFAULT_CONFIG data_vendors
- Create options_tools.py with @tool decorated get_options_chain and get_options_expirations
- Add TRADIER_API_KEY and TRADIER_SANDBOX to .env.example
This commit is contained in:
Filipe Salvio 2026-03-29 20:33:32 -03:00
parent 212c8497f2
commit 18e1e99d46
4 changed files with 74 additions and 1 deletions

View File

@ -4,3 +4,7 @@ GOOGLE_API_KEY=
ANTHROPIC_API_KEY=
XAI_API_KEY=
OPENROUTER_API_KEY=
# Options Data Providers
TRADIER_API_KEY=
TRADIER_SANDBOX=false

View File

@ -0,0 +1,48 @@
from langchain_core.tools import tool
from typing import Annotated
from tradingagents.dataflows.interface import route_to_vendor
@tool
def get_options_chain(
symbol: Annotated[str, "ticker symbol of the company"],
min_dte: Annotated[int, "minimum days to expiration"] = 0,
max_dte: Annotated[int, "maximum days to expiration"] = 50,
) -> str:
"""
Retrieve options chain data with Greeks and IV for a given ticker symbol.
Returns strikes, expirations, bid/ask, volume, OI, 1st-order Greeks
(Delta, Gamma, Theta, Vega, Rho), and implied volatility (bid_iv,
mid_iv, ask_iv, smv_vol) filtered by DTE range.
Args:
symbol (str): Ticker symbol of the company, e.g. AAPL, TSLA
min_dte (int): Minimum days to expiration (default 0)
max_dte (int): Maximum days to expiration (default 50)
Returns:
str: A formatted dataframe containing options chain data with Greeks and IV.
"""
return route_to_vendor("get_options_chain", symbol, min_dte, max_dte)
@tool
def get_options_expirations(
symbol: Annotated[str, "ticker symbol of the company"],
min_dte: Annotated[int, "minimum days to expiration"] = 0,
max_dte: Annotated[int, "maximum days to expiration"] = 50,
) -> str:
"""
Retrieve available options expiration dates for a given ticker symbol,
filtered by DTE range.
Args:
symbol (str): Ticker symbol of the company, e.g. AAPL, TSLA
min_dte (int): Minimum days to expiration (default 0)
max_dte (int): Maximum days to expiration (default 50)
Returns:
str: Comma-separated list of expiration dates (YYYY-MM-DD format).
"""
result = route_to_vendor("get_options_expirations", symbol, min_dte, max_dte)
if isinstance(result, list):
return ", ".join(result)
return str(result)

View File

@ -23,6 +23,11 @@ from .alpha_vantage import (
get_global_news as get_alpha_vantage_global_news,
)
from .alpha_vantage_common import AlphaVantageRateLimitError
from .tradier import (
get_options_chain as get_tradier_options_chain,
get_options_expirations as get_tradier_options_expirations,
)
from .tradier_common import TradierRateLimitError
# Configuration and routing logic
from .config import get_config
@ -57,12 +62,20 @@ TOOLS_CATEGORIES = {
"get_global_news",
"get_insider_transactions",
]
},
"options_chain": {
"description": "Options chain data with Greeks and IV",
"tools": [
"get_options_chain",
"get_options_expirations",
]
}
}
VENDOR_LIST = [
"yfinance",
"alpha_vantage",
"tradier",
]
# Mapping of methods to their vendor-specific implementations
@ -107,6 +120,13 @@ VENDOR_METHODS = {
"alpha_vantage": get_alpha_vantage_insider_transactions,
"yfinance": get_yfinance_insider_transactions,
},
# options_chain
"get_options_chain": {
"tradier": get_tradier_options_chain,
},
"get_options_expirations": {
"tradier": get_tradier_options_expirations,
},
}
def get_category_for_method(method: str) -> str:
@ -156,7 +176,7 @@ def route_to_vendor(method: str, *args, **kwargs):
try:
return impl_func(*args, **kwargs)
except AlphaVantageRateLimitError:
except (AlphaVantageRateLimitError, TradierRateLimitError):
continue # Only rate limits trigger fallback
raise RuntimeError(f"No available vendor for '{method}'")

View File

@ -27,6 +27,7 @@ DEFAULT_CONFIG = {
"technical_indicators": "yfinance", # Options: alpha_vantage, yfinance
"fundamental_data": "yfinance", # Options: alpha_vantage, yfinance
"news_data": "yfinance", # Options: alpha_vantage, yfinance
"options_chain": "tradier", # Options: tradier
},
# Tool-level configuration (takes precedence over category-level)
"tool_vendors": {