Changelog
All notable changes to TradingAgents are documented here.
The format is based on Keep a Changelog,
and this project follows Semantic Versioning.
Breaking changes within the 0.x line are called out explicitly.
[0.3.1] — 2026-07-05
Correctness and stability patch: data look-ahead, graph-router crash-safety,
checkpoint identity, crypto sentiment sources, and configurable resilience.
Fixed
- Alpha Vantage look-ahead filter now runs. The fundamentals payload is a
JSON string, so the dict-only guard skipped filtering and future-dated reports
leaked into historical runs; parse before filtering. (#1115, @zachthebird)
- News analyst prompt matches the tool. The prompt advertised
get_news(query, ...) but the tool takes a ticker; aligned to stop
hallucinated free-text query calls. (#1116, @shcheuk)
- Shared debate/risk routers can’t crash mid-run. Both routers return more
targets than any one edge mapped; every edge now shares the complete path map,
so a fall-through under prompt/i18n/refactor drift stays routable.
(#1088, @Fr3ya, @sa7an7, @Sushanth012)
- Checkpoint resume respects graph shape. The thread id folds in selected
analysts, debate/risk depth, and asset mode, so a resume under different
choices no longer continues the wrong graph. (#1089, @bossjoker1, @Ghraven)
- Crypto sentiment sources resolve. StockTwits lists crypto as
<BASE>.X
(Yahoo’s BTC-USD 404s) and Reddit needs the base symbol to match; the social
path now maps crypto correctly for both. (#1113, @suremadoreai)
Added
- Configurable LLM retry budget.
llm_max_retries /
TRADINGAGENTS_LLM_MAX_RETRIES is forwarded to every provider, so a transient
429 burst no longer aborts a run. (#1091, @yanggaome)
- Bedrock API-key auth.
AWS_BEARER_TOKEN_BEDROCK authenticates Amazon
Bedrock without AWS access keys and takes precedence over an ambient
AWS_PROFILE. (#1103, @praxstack)
- Latest Claude models. Added Claude Sonnet 5 (
claude-sonnet-5) and
Fable 5 (claude-fable-5); effort control now covers the Claude 5 line.
[0.3.0] — 2026-06-22
Stabilization and extensibility release: a CI gate, a unified verified
data-access contract, a provider and data-vendor registry, and a maintenance
sweep that hardened config precedence, the model catalog, data resilience, and
structured output.
Added
- CI gate. GitHub Actions runs the pytest suite across Python 3.10-3.13,
strict
ruff, and a clean-install smoke that imports the package and CLI to
catch undeclared dependencies. (#994, #197)
- Provider registry. OpenAI-compatible providers register as a single spec,
and a generic
openai_compatible endpoint covers vLLM, LM Studio, and relays.
Adds NVIDIA NIM, Kimi, Groq, Mistral, and a native Amazon Bedrock client.
- Macro and prediction-market vendors. FRED macro indicators and Polymarket
event probabilities, surfaced to the news and macro analysts.
- Programmatic report output.
TradingAgentsGraph.save_reports() writes the
same report tree the CLI produces, for headless and API runs. (#1037)
- Env-configurable reasoning depth via
TRADINGAGENTS_OPENAI_REASONING_EFFORT,
TRADINGAGENTS_GOOGLE_THINKING_LEVEL, and TRADINGAGENTS_ANTHROPIC_EFFORT,
each gated to the models that accept it.
Changed
- Verified data-access contract. Symbol normalization on every vendor path
(identity, returns, CLI, news); the configured vendor list is the exact
resolution chain with no silent fallback to unselected vendors; a typed
VendorError taxonomy; look-ahead-safe news windows; stale-OHLCV rejection;
inclusive yfinance date ranges.
- Config precedence. An explicit
TRADINGAGENTS_* value or CLI flag now wins
over interactive defaults for debate and risk round counts,
--checkpoint / --no-checkpoint, and the Docker provider profile; invalid
boolean env values fail loudly. (#975, #976, #977)
- Current-generation model catalog. Refreshed provider lineups; retired
gpt-4.1, Claude Sonnet 4.5, and the Gemini 2.5 line.
- Optional vendors degrade instead of aborting a run: a failed macro or
prediction-market lookup returns a no-data sentinel.
- Analyst prompts lead with the current date so tool-call date ranges anchor
to the run date rather than the model’s training cutoff. (#836)
Fixed
- Instrument identity. Deterministic ticker-to-company resolution prevents
wrong-company hallucination, and a verified market-data snapshot grounds price
and indicator claims. (#814, #830)
- Social and market data sources. Reddit RSS-first with 429 backoff,
StockTwits transport hardening, and Alpha Vantage timeout plus
key-versus-rate-limit handling.
- Structured output. Local OpenAI-compatible servers no longer reject
object-form
tool_choice; a thinking model that returns no parsed result falls
back to free text; null-ish strings in optional price fields coerce to None.
(#1038, #1051, #1057)
Removed
- The no-op
analyst_concurrency_limit config knob; parallel analyst execution
is planned for a later release. (#979)
- The unused committed
uv.lock. (#1030)
Contributors
Thanks to everyone who shaped this release through code, design, and reports:
@CadeYu, @Zavianx, @weijianz-opc, @naltun, @brahmasky, @nik2208, @thieucong98, @Derekko-web, @LukiPrince, @Eddieargenal, @Ghraven, @ms32035, @yting27, @nyxst4ck, @KenCheung-AIxFinance, @yangyusheng2n, @fareloj, @haosenwang1018, @octo-patch, @seifenk, @CaoYuhaoCarl, @mihailnica10, @Dado-hash, @Handsomemikezzz, @ydhawesome, @macd2, @AyushKar2005, @wildhuman, @robert23kim, @bngness, @tedix-rodrigo, @malaccan, @rfalken78, @dengli1971-droid, @proofconcept39, @prasta1, @liximin, @jeffhuen, @mazar, @soyangelromero, @CNQQC, @dovetaill, @fperdigon, @gyx09212214-prog, @RSXLX.
[0.2.5] — 2026-05-11
Added
- Grounded Sentiment Analyst. The renamed
sentiment_analyst now reads
real Yahoo News, StockTwits, and Reddit data before generating its report,
replacing the prior flow that could fabricate social posts under prompt
pressure. (#557, #607)
- MiniMax provider with the full M2.x catalog (M2.7 / M2.5 / M2.1 / M2
plus highspeed variants, 204K context). Dual-region: Global
(
MINIMAX_API_KEY) and China (MINIMAX_CN_API_KEY).
- Dual-region Qwen and GLM with separate keys per region — international
(
DASHSCOPE_API_KEY, ZHIPU_API_KEY) and China (DASHSCOPE_CN_API_KEY,
ZHIPU_CN_API_KEY), selectable via a secondary region prompt. (#758)
TRADINGAGENTS_* env-var configurability for DEFAULT_CONFIG. Override
llm_provider, deep/quick model IDs, backend_url, output_language,
debate-round counts, checkpoint flag, and benchmark ticker via .env with
type-aware coercion (string / int / bool). (#602)
- Interactive API-key detection in the CLI. When the selected provider’s
key is missing, the CLI prompts for it and persists the value to
.env
so the analysis run continues without restart.
- Remote Ollama support.
OLLAMA_BASE_URL points the CLI and the
programmatic client at a remote ollama-serve. The CLI surfaces the
resolved endpoint and warns on common malformed inputs. Adds a
"Custom model ID" option for models pulled via ollama pull. (#648, #768)
- Configurable news-fetch parameters in
DEFAULT_CONFIG — per-ticker
article limit, macro headline limit, lookback window, and macro search
queries. (#606, #683)
- Configurable alpha benchmark for non-US tickers. Replaces hardcoded
SPY with regional indices for
.NS (^NSEI), .T (^N225), .HK (^HSI),
.L (^FTSE), .TO (^GSPTSE), .AX (^AXJO), .BO (^BSESN); explicit
benchmark_ticker override available. Eliminates FX drift dominating
alpha for non-USD listings. (#628, #684)
- Multi-language output covers every user-facing agent — researchers,
risk debators, research manager, and trader, ending the previous
partial-localization reports. (#575)
- Model catalog refresh. OpenAI GPT-5.5 frontier, Anthropic Claude Opus
4.7, Gemini 3.1 Flash-Lite GA, xAI Grok 4.20, Qwen 3.6 line. Versioned IDs
only; auto-shifting aliases moved to the
"Custom model ID" option.
Changed
- Sentiment Analyst is now consistently named across the CLI dropdown,
status panel, and final reports (previously the backend was renamed but
the CLI still said “Social Analyst”). The
AnalystType.SOCIAL = "social"
wire value is kept for saved-config back-compat.
Fixed
- Structured output works on DeepSeek V4 / reasoner and MiniMax M2.x.
Those providers reject
tool_choice per their tool-calling docs; the
binding flow now skips it automatically via a capability table.
pip install . installations pick up the project .env when running
the CLI as a console script. (#747)
- Reports save end-to-end — streamed chunks were previously dropped from
complete_report.md. (#719, #736)
- Ticker prompt preserves exchange suffixes (
.SH, .SZ, .SS, .HK,
.T, etc.) for A-share, HK, Tokyo, and other non-US flows. (#770)
- Docker permission errors no longer block first-run write to
~/.tradingagents/. (#519, #627, #672, #771)
- Config state no longer leaks between runs when sub-dicts are mutated;
set_config partial updates preserve sibling defaults. (#788)
max_recur_limit config actually applies — previously read but not
forwarded to the propagator. (#764)
- Missing-API-key error names the exact env var to set. (#680)
- Quieter startup — suppressed the noisy upstream
LangChainPendingDeprecationWarning from langgraph-checkpoint; will be
removed once that package ships its fix.
Security
- Ticker path-traversal validation at every filesystem-path site (cache,
checkpoint database, results) so a malicious ticker cannot escape its
intended directory. (#618)
0.2.4 — 2026-04-25
Added
- Structured-output decision agents. Research Manager, Trader, and Portfolio
Manager now use
llm.with_structured_output(Schema) on their primary call
and return typed Pydantic instances. Each provider’s native structured-output
mode is used (json_schema for OpenAI / xAI, response_schema for Gemini,
tool-use for Anthropic, function-calling for OpenAI-compatible providers).
Render helpers preserve the existing markdown shape so memory log, CLI
display, and saved reports keep working unchanged. (#434)
- LangGraph checkpoint resume — opt-in via
--checkpoint. State is saved
after each node so crashed or interrupted runs resume from the last
successful step. Per-ticker SQLite databases under
~/.tradingagents/cache/checkpoints/. --clear-checkpoints resets them. (#594)
- Persistent decision log replacing the per-agent BM25 memory. Decisions
are stored automatically at the end of
propagate(); the next same-ticker
run resolves prior pending entries with realised return, alpha vs SPY, and
a one-paragraph reflection. Override path with TRADINGAGENTS_MEMORY_LOG_PATH.
Optional memory_log_max_entries config caps resolved entries; pending
entries are never pruned. (#578, #563, #564, #579)
- DeepSeek, Qwen (Alibaba DashScope), GLM (Zhipu), and Azure OpenAI
providers, plus dynamic OpenRouter model selection.
- Docker support — multi-stage build with separate dev and runtime images.
scripts/smoke_structured_output.py — diagnostic that exercises the
three structured-output agents against any provider so contributors can
verify their setup with one command.
- 5-tier rating scale (Buy / Overweight / Hold / Underweight / Sell) used
consistently by Research Manager, Portfolio Manager, signal processor, and
the memory log; Trader keeps 3-tier (Buy / Hold / Sell) since transaction
direction is naturally ternary.
- Pytest fixtures — lazy LLM client imports plus placeholder API keys so
the test suite runs cleanly without credentials. (#588)
Changed
backend_url default is now None rather than the OpenAI URL. Each
provider client falls back to its native default. The previous default
leaked the OpenAI URL into non-OpenAI clients (e.g. Gemini), producing
malformed request URLs for Python users who switched providers without
overriding backend_url. The CLI flow is unaffected.
- All file I/O passes explicit
encoding="utf-8" so Windows users no longer
hit UnicodeEncodeError with the cp1252 default. (#543, #550, #576)
- Cache and log directories moved to
~/.tradingagents/ to resolve Docker
permission issues. (#519)
SignalProcessor reads the rating from the Portfolio Manager’s rendered
markdown via a deterministic heuristic — no extra LLM call.
- OpenAI structured-output calls default to
method="function_calling" to
avoid noisy PydanticSerializationUnexpectedValue warnings emitted by
langchain-openai’s Responses-API parse path. Same typed result, no warnings.
Fixed
- Empty memory no longer triggers fabricated past-lessons in agent prompts;
the memory-log redesign makes this structurally impossible since only the
Portfolio Manager consults memory and only when entries exist. (#572)
- Tool-call logging processes every chunk message, not just the last one, and
memory score normalization handles empty score arrays. (#534, #531)
Removed
FinancialSituationMemory (the per-agent BM25 system) and the dead
reflect_and_remember() plumbing; subsumed by the persistent decision log.
- Hardcoded Google endpoint that caused 404 when
langchain-google-genai
changed its API path. (#493, #496)
Contributors
Thanks to everyone who shaped this release through code, design, and reports:
- @claytonbrown — checkpoint resume (#594), test fixtures (#588), design feedback on cost tracking (#582) and structured validation (#583)
- @Bcardo — memory-log redesign (#579), empty-memory hallucination report (#572), encoding fix proposal (#570)
- @voidborne-d — memory persistence design (#564), portfolio manager state fix (#503)
- @mannubaveja007 — structured-output feature request (#434)
- @kelder66 — RAM-only memory issue (#563)
- @Gujiassh — tool-call logging fix (#534), test stub PR (#533)
- @iuyup — memory score normalization fix (#531)
- @kaihg — Google base_url fix (#496)
- @32ryh98yfe — Gemini 404 report (#493)
- @uppb — OpenRouter dynamic model selection (#482)
- @guoz14 — OpenRouter limited-model report (#337)
- @samchenku — indicator name normalization (#490)
- @JasonOA888 — y_finance pandas import fix (#488)
- @tiffanychum — stale import cleanup (#499)
- @zaizou — Docker permission issue (#519)
- @Stosman123, @mauropuga, @hotwind2015 — Windows encoding bug reports (#543, #550, #576)
- @nnishad, @atharvajoshi01 — encoding fix proposals (#568, #549)
0.2.3 — 2026-03-29
Added
- Multi-language output for analyst reports and final decisions, with a
CLI selector. Internal agent debate stays in English for reasoning quality. (#472)
- GPT-5.4 family models in the default catalog, with deep/quick model split.
- Unified model catalog as a single source of truth for CLI options and
provider validation.
Changed
base_url is forwarded to Google and Anthropic clients so corporate proxies
work consistently across providers. (#427)
- Standardised the Google
api_key parameter to the unified api_key form.
Fixed
- Backtesting fetchers no longer leak look-ahead data when
curr_date is in
the middle of a fetched window. (#475)
- Invalid indicator names from the LLM are caught at the tool boundary instead
of crashing the run. (#429)
- yfinance news fetchers respect the same exponential-backoff retry as price
fetchers. (#445)
Contributors
0.2.2 — 2026-03-22
Added
- Five-tier rating scale (Buy / Overweight / Hold / Underweight / Sell)
introduced for the Portfolio Manager.
- Anthropic effort level support for Claude models.
- OpenAI Responses API path for native OpenAI models.
Changed
risk_manager renamed to portfolio_manager to match the role description
shown in the CLI display.
- Exchange-qualified tickers (e.g.
7203.T, BRK.B) preserved across all
agent prompts and tool calls.
- Process-level UTF-8 default attempted for cross-platform consistency
(note: this approach did not actually take effect; replaced in v0.2.4 with
explicit per-call
encoding="utf-8" arguments).
Fixed
- yfinance rate-limit errors are retried with exponential backoff. (#426)
- HTTP client SSL customisation is supported for environments that need
custom certificate bundles. (#379)
- Report-section writes handle list-of-string content gracefully.
Contributors
0.2.1 — 2026-03-15
Security
- Patched
langchain-core vulnerability (LangGrinch). (#335)
- Removed
chainlit dependency affected by CVE-2026-22218.
Added
pyproject.toml build-system configuration; the project now installs via
modern packaging tooling.
Removed
setup.py — dependencies consolidated to pyproject.toml.
Fixed
- Risk manager reads the correct fundamental report source. (#341)
- All
open() calls receive an explicit UTF-8 encoding (initial pass).
get_indicators tool handles comma-separated indicator names from the LLM. (#368)
Propagation initialises every debate-state field so risk debaters never
see missing keys.
- Stock data parsing tolerates malformed CSVs and NaN values.
- Conditional debate logic respects the configured round count. (#361)
Contributors
- @RinZ27 —
langchain-core security patch (#335)
- @Ljx-007 — risk manager fundamental-report fix (#341)
- @makk9 — debate-rounds config issue (#361)
0.2.0 — 2026-02-04
This is the largest release since the initial public version. The framework
moved from single-provider to a multi-provider architecture and grew several
production-ready surfaces.
Added
- Multi-provider LLM support (OpenAI, Google, Anthropic, xAI, OpenRouter,
Ollama) via a factory pattern, with provider-specific thinking configurations.
- Alpha Vantage integration as a configurable primary data provider, with
yfinance as a community-stability fallback.
- Footer statistics in the CLI: real-time tracking of LLM calls, tool
calls, and token usage via LangChain callbacks.
- Post-analysis report saving — the framework writes per-section markdown
files (analyst reports, debate transcripts, final decision) when a run
completes.
- Announcements panel — fetches updates from
api.tauric.ai/v1/announcements
for the CLI welcome screen.
- Tool fallbacks so a single vendor outage does not stop the pipeline.
Changed
- Risky / Safe risk debaters renamed to Aggressive / Conservative for
consistency with the displayed agent labels.
- Default data vendor switched to balance reliability and quota across
community deployments.
- Ollama and OpenRouter model lists updated; default endpoints clarified.
Fixed
- Analyst status tracking and message deduplication in the live display.
- Infinite-loop guard in the agent loop; reflection and logging hardened.
- Various data-vendor implementation bugs and tool-signature mismatches.
Contributors
This release is the first with substantial outside contributions; many community
PRs from late 2025 also landed here.
- @luohy15 — Alpha Vantage data-vendor integration (#235)
- @EdwardoSunny — yfinance fetching optimisations (#245)
- @Mirza-Samad-Ahmed-Baig — infinite-loop guard, reflection, and logging fixes (#89)
- @ZeroAct — saved results path support (#29)
- @Zhongyi-Lu —
.env gitignore (#49)
- @csoboy — local Ollama setup (#53)
- @chauhang — initial Docker support attempt (#47, later reverted; the merged Docker support shipped in v0.2.4)
0.1.1 — 2025-06-07
Removed
- Static site assets that had been bundled with v0.1.0; the public site now
lives separately.
0.1.0 — 2025-06-05
Added
- Initial public release of the TradingAgents multi-agent trading
framework: market / sentiment / news / fundamentals analysts; bull and bear
researchers; trader; aggressive, conservative, and neutral risk debaters;
portfolio manager. LangGraph orchestration, yfinance data, per-agent
BM25 memory, single-provider OpenAI integration, interactive CLI.