fix: address Gemini re-review feedback

- 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>
This commit is contained in:
Alex Korbonits 2026-04-12 22:28:18 -07:00
parent 264e792295
commit f0d7e6824f
4 changed files with 33 additions and 20 deletions

View File

@ -1,18 +1,14 @@
import datetime import datetime
import time
from collections import deque
from functools import wraps from functools import wraps
from pathlib import Path from pathlib import Path
import typer import typer
from dotenv import load_dotenv from dotenv import load_dotenv
from rich.console import Console
# Load environment variables from .env file
load_dotenv()
import time
from collections import deque
from rich import box from rich import box
from rich.align import Align from rich.align import Align
from rich.console import Console
from rich.layout import Layout from rich.layout import Layout
from rich.live import Live from rich.live import Live
from rich.markdown import Markdown from rich.markdown import Markdown
@ -38,6 +34,9 @@ from cli.utils import (
from tradingagents.default_config import DEFAULT_CONFIG from tradingagents.default_config import DEFAULT_CONFIG
from tradingagents.graph.trading_graph import TradingAgentsGraph from tradingagents.graph.trading_graph import TradingAgentsGraph
# Load environment variables from .env file
load_dotenv()
console = Console() console = Console()
app = typer.Typer( app = typer.Typer(
@ -477,7 +476,9 @@ def get_user_selections():
welcome_content = f"{welcome_ascii}\n" welcome_content = f"{welcome_ascii}\n"
welcome_content += "[bold green]TradingAgents: Multi-Agents LLM Financial Trading Framework - CLI[/bold green]\n\n" welcome_content += "[bold green]TradingAgents: Multi-Agents LLM Financial Trading Framework - CLI[/bold green]\n\n"
welcome_content += "[bold]Workflow Steps:[/bold]\n" welcome_content += "[bold]Workflow Steps:[/bold]\n"
welcome_content += "I. Analyst Team → II. Research Team → III. Trader → IV. Risk Management → V. Portfolio Management\n\n" welcome_content += (
"I. Analyst Team → II. Research Team → III. Trader → IV. Risk Management → V. Portfolio Management\n\n"
)
welcome_content += ( welcome_content += (
"[dim]Built by [Tauric Research](https://github.com/TauricResearch)[/dim]" "[dim]Built by [Tauric Research](https://github.com/TauricResearch)[/dim]"
) )
@ -510,7 +511,8 @@ def get_user_selections():
console.print( console.print(
create_question_box( create_question_box(
"Step 1: Ticker Symbol", "Step 1: Ticker Symbol",
"Enter the exact ticker symbol to analyze, including exchange suffix when needed (examples: SPY, CNC.TO, 7203.T, 0700.HK)", "Enter the exact ticker symbol to analyze, including exchange suffix when needed"
" (examples: SPY, CNC.TO, 7203.T, 0700.HK)",
"SPY", "SPY",
) )
) )
@ -728,7 +730,8 @@ def save_report_to_disk(final_state, ticker: str, save_path: Path):
sections.append(f"## V. Portfolio Manager Decision\n\n### Portfolio Manager\n{risk['judge_decision']}") sections.append(f"## V. Portfolio Manager Decision\n\n### Portfolio Manager\n{risk['judge_decision']}")
# Write consolidated report # Write consolidated report
header = f"# Trading Analysis Report: {ticker}\n\nGenerated: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" generated = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
header = f"# Trading Analysis Report: {ticker}\n\nGenerated: {generated}\n\n"
(save_path / "complete_report.md").write_text(header + "\n\n".join(sections)) (save_path / "complete_report.md").write_text(header + "\n\n".join(sections))
return save_path / "complete_report.md" return save_path / "complete_report.md"
@ -771,7 +774,10 @@ def display_complete_report(final_state):
# III. Trading Team # III. Trading Team
if final_state.get("trader_investment_plan"): if final_state.get("trader_investment_plan"):
console.print(Panel("[bold]III. Trading Team Plan[/bold]", border_style="yellow")) console.print(Panel("[bold]III. Trading Team Plan[/bold]", border_style="yellow"))
console.print(Panel(Markdown(final_state["trader_investment_plan"]), title="Trader", border_style="blue", padding=(1, 2))) console.print(Panel(
Markdown(final_state["trader_investment_plan"]),
title="Trader", border_style="blue", padding=(1, 2),
))
# IV. Risk Management Team # IV. Risk Management Team
if final_state.get("risk_debate_state"): if final_state.get("risk_debate_state"):
@ -791,7 +797,10 @@ def display_complete_report(final_state):
# V. Portfolio Manager Decision # V. Portfolio Manager Decision
if risk.get("judge_decision"): if risk.get("judge_decision"):
console.print(Panel("[bold]V. Portfolio Manager Decision[/bold]", border_style="green")) console.print(Panel("[bold]V. Portfolio Manager Decision[/bold]", border_style="green"))
console.print(Panel(Markdown(risk["judge_decision"]), title="Portfolio Manager", border_style="blue", padding=(1, 2))) console.print(Panel(
Markdown(risk["judge_decision"]),
title="Portfolio Manager", border_style="blue", padding=(1, 2),
))
def update_research_team_status(status): def update_research_team_status(status):
@ -1162,9 +1171,7 @@ def run_analysis():
trace.append(chunk) trace.append(chunk)
# Get final state and decision
final_state = trace[-1] final_state = trace[-1]
graph.process_signal(final_state["final_trade_decision"])
# Update all agent statuses to completed # Update all agent statuses to completed
for agent in message_buffer.agent_status: for agent in message_buffer.agent_status:

View File

@ -83,7 +83,11 @@ def select_analysts() -> List[AnalystType]:
choices=[ choices=[
questionary.Choice(display, value=value) for display, value in ANALYST_ORDER questionary.Choice(display, value=value) for display, value in ANALYST_ORDER
], ],
instruction="\n- Press Space to select/unselect analysts\n- Press 'a' to select/unselect all\n- Press Enter when done", instruction=(
"\n- Press Space to select/unselect analysts"
"\n- Press 'a' to select/unselect all"
"\n- Press Enter when done"
),
validate=lambda x: len(x) > 0 or "You must select at least one analyst.", validate=lambda x: len(x) > 0 or "You must select at least one analyst.",
style=questionary.Style( style=questionary.Style(
[ [

View File

@ -46,13 +46,15 @@ line-length = 120
[tool.ruff.lint] [tool.ruff.lint]
select = ["E", "F", "I"] select = ["E", "F", "I"]
ignore = ["E501", "E402", "E731"] ignore = ["E731"]
[tool.ruff.lint.isort] [tool.ruff.lint.isort]
combine-as-imports = true combine-as-imports = true
[tool.ruff.lint.per-file-ignores] [tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"] "__init__.py" = ["F401"]
# LLM system prompt strings are intentionally long; wrapping them reduces readability.
"tradingagents/**/*.py" = ["E501"]
[tool.uv] [tool.uv]

View File

@ -1,17 +1,17 @@
# Import functions from specialized modules # Import functions from specialized modules
from .alpha_vantage_stock import get_stock # noqa: I001
from .alpha_vantage_indicator import get_indicator
from .alpha_vantage_fundamentals import ( from .alpha_vantage_fundamentals import (
get_fundamentals,
get_balance_sheet, get_balance_sheet,
get_cashflow, get_cashflow,
get_fundamentals,
get_income_statement, get_income_statement,
) )
from .alpha_vantage_indicator import get_indicator
from .alpha_vantage_news import ( from .alpha_vantage_news import (
get_news,
get_global_news, get_global_news,
get_insider_transactions, get_insider_transactions,
get_news,
) )
from .alpha_vantage_stock import get_stock
__all__ = [ __all__ = [
"get_stock", "get_stock",