- Replace broad tradingagents/**/*.py E501 ignore with targeted
per-file ignores for agent files (LLM prompts), alpha_vantage_indicator,
y_finance (description strings), and reflection (prompt constant)
- Fix the two genuine logic-code E501 violations: break long log message
in stockstats_utils.py and ternary in yfinance_news.py
- Correct pytest version bound to >=8.3.0 (stable floor)
- Add ruff>=0.9.0 as dev dependency for local linter execution
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Reorganise cli/main.py imports: move load_dotenv() after all imports
so isort can sort cleanly; removes need for global E402 ignore
- Remove dead graph.process_signal() call (discarded LLM result)
- Drop E501 and E402 from global ruff ignore; fix resulting violations
in cli/main.py and cli/utils.py; add per-file E501 ignore for
tradingagents/** where LLM system prompt strings are intentionally long
- Remove # noqa: I001 from alpha_vantage.py; let isort sort alphabetically
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Restore alpha_vantage.py facade with explicit re-exports and __all__
- Restore agent_utils.py tool facade imports and expand __all__ to cover
all public names (prevents auto-fixer stripping re-exports in future)
- Consolidate fragmented per-function import blocks in interface.py into
single blocks; add combine-as-imports = true to ruff isort config
- Enable F403, F405, F841 in Ruff (remove from ignore list) and fix all
resulting violations: replace star imports in cli/main.py, setup.py,
and trading_graph.py with explicit imports; drop unused live/decision
assignments
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Apply review suggestions: use concise `or` pattern for API key
resolution, consolidate tests into parameterized subTest, move
import to module level per PEP 8.
GoogleClient now accepts the unified `api_key` parameter used by
OpenAI and Anthropic clients, mapping it to the provider-specific
`google_api_key` that ChatGoogleGenerativeAI expects. Legacy
`google_api_key` still works for backward compatibility.
Resolves TODO.md item #2 (inconsistent parameter handling).
Add effort parameter (high/medium/low) for Claude 4.5+ and 4.6 models,
consistent with OpenAI reasoning_effort and Google thinking_level.
Also add content normalization for Anthropic responses.
- Point requirements.txt to pyproject.toml as single source of truth
- Resolve welcome.txt path relative to module for CLI portability
- Include cli/static files in package build
- Extract shared normalize_content for OpenAI Responses API and
Gemini 3 list-format responses into base_client.py
- Update README install and CLI usage instructions
Enable use_responses_api for native OpenAI provider, which supports
reasoning_effort with function tools across all model families.
Removes the UnifiedChatOpenAI subclass workaround.
Closes#403
- Add http_client and http_async_client parameters to all LLM clients
- OpenAIClient, GoogleClient, AnthropicClient now support custom httpx clients
- Fixes SSL certificate verification errors on Windows Conda environments
- Users can now pass custom httpx.Client with verify=False or custom certs
Fixes#369
- OpenAI: add GPT-5.4, GPT-5.4 Pro; remove o-series and legacy GPT-4o
- Anthropic: add Claude Opus 4.6, Sonnet 4.6; remove legacy 4.1/4.0/3.x
- Google: add Gemini 3.1 Pro, 3.1 Flash Lite; remove deprecated
gemini-3-pro-preview and Gemini 2.0 series
- xAI: clean up model list to match current API
- Simplify UnifiedChatOpenAI GPT-5 temperature handling
- Add missing tradingagents/__init__.py (fixes pip install building)
Add _clean_dataframe() to normalize stock DataFrames before stockstats:
coerce invalid dates/prices, drop rows missing Close, fill price gaps.
Also add on_bad_lines="skip" to all cached CSV reads.
LLMs (especially smaller models) sometimes pass multiple indicator
names as a single comma-separated string instead of making separate
tool calls. Split and process each individually at the tool boundary.
InvestDebateState was missing bull_history, bear_history, judge_decision.
RiskDebateState was missing aggressive_history, conservative_history,
neutral_history, latest_speaker, judge_decision. This caused KeyError
in _log_state() and reflection, especially with edge-case config values.
Prevents UnicodeEncodeError on Windows where the default encoding
(cp1252/gbk) cannot handle Unicode characters in LLM output.
Closes#77, closes#114, closes#126, closes#215, closes#332