From b30e3f14a71fe20ba89db9ba5c1dcb738ee43d35 Mon Sep 17 00:00:00 2001 From: Alex Korbonits Date: Sun, 12 Apr 2026 14:04:26 -0700 Subject: [PATCH] ci: add Ruff config, pre-commit hooks, and GitHub Actions lint workflow - Add [tool.ruff] config to pyproject.toml (E/F/I rules, 120-char limit, per-file ignores for __init__.py) - Add .pre-commit-config.yaml with ruff lint + format hooks - Add .github/workflows/lint.yml triggering on PRs and pushes to main - Auto-fix 90 violations (unsorted imports, unused imports, f-strings) Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/lint.yml | 17 ++++++ .pre-commit-config.yaml | 7 +++ cli/announcements.py | 1 + cli/main.py | 36 ++++++----- cli/models.py | 2 - cli/stats_handler.py | 4 +- cli/utils.py | 4 +- main.py | 6 +- pyproject.toml | 13 ++++ test.py | 3 +- tradingagents/__init__.py | 1 + tradingagents/agents/__init__.py | 15 ++--- .../agents/analysts/fundamentals_analyst.py | 3 +- .../agents/analysts/market_analyst.py | 2 +- tradingagents/agents/analysts/news_analyst.py | 2 +- .../agents/analysts/social_media_analyst.py | 2 +- tradingagents/agents/utils/agent_states.py | 3 +- tradingagents/agents/utils/agent_utils.py | 17 ------ .../agents/utils/core_stock_tools.py | 4 +- .../agents/utils/fundamental_data_tools.py | 4 +- tradingagents/agents/utils/memory.py | 5 +- tradingagents/agents/utils/news_data_tools.py | 5 +- .../utils/technical_indicators_tools.py | 5 +- tradingagents/dataflows/alpha_vantage.py | 4 -- .../dataflows/alpha_vantage_common.py | 7 ++- .../dataflows/alpha_vantage_indicator.py | 2 + tradingagents/dataflows/alpha_vantage_news.py | 1 + .../dataflows/alpha_vantage_stock.py | 4 +- tradingagents/dataflows/config.py | 3 +- tradingagents/dataflows/interface.py | 61 +++++++++++++------ tradingagents/dataflows/stockstats_utils.py | 9 +-- tradingagents/dataflows/utils.py | 7 +-- tradingagents/dataflows/y_finance.py | 10 +-- tradingagents/dataflows/yfinance_news.py | 3 +- tradingagents/graph/__init__.py | 4 +- tradingagents/graph/propagation.py | 4 +- tradingagents/graph/setup.py | 1 + tradingagents/graph/trading_graph.py | 31 ++++------ tradingagents/llm_clients/base_client.py | 2 +- tradingagents/llm_clients/factory.py | 4 +- tradingagents/llm_clients/validators.py | 1 - 41 files changed, 184 insertions(+), 135 deletions(-) create mode 100644 .github/workflows/lint.yml create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..fe58f73b --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,17 @@ +name: Lint + +on: + push: + branches: [main] + pull_request: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v5 + - run: uv python install 3.10 + - run: uv pip install ruff + - run: uv run ruff check . + - run: uv run ruff format --check . diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..700cbc40 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,7 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.12.2 + hooks: + - id: ruff + args: [--fix] + - id: ruff-format diff --git a/cli/announcements.py b/cli/announcements.py index 5947cee5..3ff70159 100644 --- a/cli/announcements.py +++ b/cli/announcements.py @@ -1,4 +1,5 @@ import getpass + import requests from rich.console import Console from rich.panel import Panel diff --git a/cli/main.py b/cli/main.py index 29294d8d..86de3bfd 100644 --- a/cli/main.py +++ b/cli/main.py @@ -1,34 +1,32 @@ -from typing import Optional import datetime -import typer -from pathlib import Path from functools import wraps -from rich.console import Console +from pathlib import Path + +import typer from dotenv import load_dotenv +from rich.console import Console # Load environment variables from .env file load_dotenv() -from rich.panel import Panel -from rich.spinner import Spinner -from rich.live import Live -from rich.columns import Columns -from rich.markdown import Markdown -from rich.layout import Layout -from rich.text import Text -from rich.table import Table -from collections import deque import time -from rich.tree import Tree +from collections import deque + from rich import box from rich.align import Align +from rich.layout import Layout +from rich.live import Live +from rich.markdown import Markdown +from rich.panel import Panel from rich.rule import Rule +from rich.spinner import Spinner +from rich.table import Table +from rich.text import Text -from tradingagents.graph.trading_graph import TradingAgentsGraph -from tradingagents.default_config import DEFAULT_CONFIG -from cli.models import AnalystType -from cli.utils import * -from cli.announcements import fetch_announcements, display_announcements +from cli.announcements import display_announcements, fetch_announcements from cli.stats_handler import StatsCallbackHandler +from cli.utils import * +from tradingagents.default_config import DEFAULT_CONFIG +from tradingagents.graph.trading_graph import TradingAgentsGraph console = Console() diff --git a/cli/models.py b/cli/models.py index f68c3da1..83922d7a 100644 --- a/cli/models.py +++ b/cli/models.py @@ -1,6 +1,4 @@ from enum import Enum -from typing import List, Optional, Dict -from pydantic import BaseModel class AnalystType(str, Enum): diff --git a/cli/stats_handler.py b/cli/stats_handler.py index 10734cc3..d3b47a32 100644 --- a/cli/stats_handler.py +++ b/cli/stats_handler.py @@ -1,9 +1,9 @@ import threading -from typing import Any, Dict, List, Union +from typing import Any, Dict, List from langchain_core.callbacks import BaseCallbackHandler -from langchain_core.outputs import LLMResult from langchain_core.messages import AIMessage +from langchain_core.outputs import LLMResult class StatsCallbackHandler(BaseCallbackHandler): diff --git a/cli/utils.py b/cli/utils.py index e071ce06..a281616b 100644 --- a/cli/utils.py +++ b/cli/utils.py @@ -1,6 +1,6 @@ -import questionary -from typing import List, Optional, Tuple, Dict +from typing import List, Tuple +import questionary from rich.console import Console from cli.models import AnalystType diff --git a/main.py b/main.py index c94fde32..7df38d0c 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,8 @@ -from tradingagents.graph.trading_graph import TradingAgentsGraph -from tradingagents.default_config import DEFAULT_CONFIG - from dotenv import load_dotenv +from tradingagents.default_config import DEFAULT_CONFIG +from tradingagents.graph.trading_graph import TradingAgentsGraph + # Load environment variables from .env file load_dotenv() diff --git a/pyproject.toml b/pyproject.toml index 98385e32..88a575c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,3 +40,16 @@ include = ["tradingagents*", "cli*"] [tool.setuptools.package-data] cli = ["static/*"] + +[tool.ruff] +line-length = 120 + +[tool.ruff.lint] +select = ["E", "F", "I"] +ignore = ["E501", "E402", "E731", "F403", "F405", "F841"] + +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["F401"] + +[tool.uv] +# Install with: uv sync diff --git a/test.py b/test.py index b73783e1..9ddbcdd2 100644 --- a/test.py +++ b/test.py @@ -1,5 +1,6 @@ import time -from tradingagents.dataflows.y_finance import get_YFin_data_online, get_stock_stats_indicators_window, get_balance_sheet as get_yfinance_balance_sheet, get_cashflow as get_yfinance_cashflow, get_income_statement as get_yfinance_income_statement, get_insider_transactions as get_yfinance_insider_transactions + +from tradingagents.dataflows.y_finance import get_stock_stats_indicators_window print("Testing optimized implementation with 30-day lookback:") start_time = time.time() diff --git a/tradingagents/__init__.py b/tradingagents/__init__.py index 43a2b439..fdb3d34f 100644 --- a/tradingagents/__init__.py +++ b/tradingagents/__init__.py @@ -1,2 +1,3 @@ import os + os.environ.setdefault("PYTHONUTF8", "1") diff --git a/tradingagents/agents/__init__.py b/tradingagents/agents/__init__.py index 1f03642c..ddc51307 100644 --- a/tradingagents/agents/__init__.py +++ b/tradingagents/agents/__init__.py @@ -1,23 +1,18 @@ -from .utils.agent_utils import create_msg_delete -from .utils.agent_states import AgentState, InvestDebateState, RiskDebateState -from .utils.memory import FinancialSituationMemory - from .analysts.fundamentals_analyst import create_fundamentals_analyst from .analysts.market_analyst import create_market_analyst from .analysts.news_analyst import create_news_analyst from .analysts.social_media_analyst import create_social_media_analyst - +from .managers.portfolio_manager import create_portfolio_manager +from .managers.research_manager import create_research_manager from .researchers.bear_researcher import create_bear_researcher from .researchers.bull_researcher import create_bull_researcher - from .risk_mgmt.aggressive_debator import create_aggressive_debator from .risk_mgmt.conservative_debator import create_conservative_debator from .risk_mgmt.neutral_debator import create_neutral_debator - -from .managers.research_manager import create_research_manager -from .managers.portfolio_manager import create_portfolio_manager - from .trader.trader import create_trader +from .utils.agent_states import AgentState, InvestDebateState, RiskDebateState +from .utils.agent_utils import create_msg_delete +from .utils.memory import FinancialSituationMemory __all__ = [ "FinancialSituationMemory", diff --git a/tradingagents/agents/analysts/fundamentals_analyst.py b/tradingagents/agents/analysts/fundamentals_analyst.py index 6aa49cf3..d972dd9c 100644 --- a/tradingagents/agents/analysts/fundamentals_analyst.py +++ b/tradingagents/agents/analysts/fundamentals_analyst.py @@ -1,14 +1,13 @@ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder + from tradingagents.agents.utils.agent_utils import ( build_instrument_context, get_balance_sheet, get_cashflow, get_fundamentals, get_income_statement, - get_insider_transactions, get_language_instruction, ) -from tradingagents.dataflows.config import get_config def create_fundamentals_analyst(llm): diff --git a/tradingagents/agents/analysts/market_analyst.py b/tradingagents/agents/analysts/market_analyst.py index fef8f751..1b9a1c1f 100644 --- a/tradingagents/agents/analysts/market_analyst.py +++ b/tradingagents/agents/analysts/market_analyst.py @@ -1,11 +1,11 @@ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder + from tradingagents.agents.utils.agent_utils import ( build_instrument_context, get_indicators, get_language_instruction, get_stock_data, ) -from tradingagents.dataflows.config import get_config def create_market_analyst(llm): diff --git a/tradingagents/agents/analysts/news_analyst.py b/tradingagents/agents/analysts/news_analyst.py index e0fe93c5..09a50a37 100644 --- a/tradingagents/agents/analysts/news_analyst.py +++ b/tradingagents/agents/analysts/news_analyst.py @@ -1,11 +1,11 @@ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder + from tradingagents.agents.utils.agent_utils import ( build_instrument_context, get_global_news, get_language_instruction, get_news, ) -from tradingagents.dataflows.config import get_config def create_news_analyst(llm): diff --git a/tradingagents/agents/analysts/social_media_analyst.py b/tradingagents/agents/analysts/social_media_analyst.py index 34a53c46..40da7f1e 100644 --- a/tradingagents/agents/analysts/social_media_analyst.py +++ b/tradingagents/agents/analysts/social_media_analyst.py @@ -1,6 +1,6 @@ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder + from tradingagents.agents.utils.agent_utils import build_instrument_context, get_language_instruction, get_news -from tradingagents.dataflows.config import get_config def create_social_media_analyst(llm): diff --git a/tradingagents/agents/utils/agent_states.py b/tradingagents/agents/utils/agent_states.py index 6423b936..5f7ad7f9 100644 --- a/tradingagents/agents/utils/agent_states.py +++ b/tradingagents/agents/utils/agent_states.py @@ -1,6 +1,7 @@ from typing import Annotated -from typing_extensions import TypedDict + from langgraph.graph import MessagesState +from typing_extensions import TypedDict # Researcher team state diff --git a/tradingagents/agents/utils/agent_utils.py b/tradingagents/agents/utils/agent_utils.py index 4ba40a80..0725210c 100644 --- a/tradingagents/agents/utils/agent_utils.py +++ b/tradingagents/agents/utils/agent_utils.py @@ -1,23 +1,6 @@ from langchain_core.messages import HumanMessage, RemoveMessage # Import tools from separate utility files -from tradingagents.agents.utils.core_stock_tools import ( - get_stock_data -) -from tradingagents.agents.utils.technical_indicators_tools import ( - get_indicators -) -from tradingagents.agents.utils.fundamental_data_tools import ( - get_fundamentals, - get_balance_sheet, - get_cashflow, - get_income_statement -) -from tradingagents.agents.utils.news_data_tools import ( - get_news, - get_insider_transactions, - get_global_news -) def get_language_instruction() -> str: diff --git a/tradingagents/agents/utils/core_stock_tools.py b/tradingagents/agents/utils/core_stock_tools.py index 3a416622..bd5cabfa 100644 --- a/tradingagents/agents/utils/core_stock_tools.py +++ b/tradingagents/agents/utils/core_stock_tools.py @@ -1,5 +1,7 @@ -from langchain_core.tools import tool from typing import Annotated + +from langchain_core.tools import tool + from tradingagents.dataflows.interface import route_to_vendor diff --git a/tradingagents/agents/utils/fundamental_data_tools.py b/tradingagents/agents/utils/fundamental_data_tools.py index 47f6f2eb..667c3756 100644 --- a/tradingagents/agents/utils/fundamental_data_tools.py +++ b/tradingagents/agents/utils/fundamental_data_tools.py @@ -1,5 +1,7 @@ -from langchain_core.tools import tool from typing import Annotated + +from langchain_core.tools import tool + from tradingagents.dataflows.interface import route_to_vendor diff --git a/tradingagents/agents/utils/memory.py b/tradingagents/agents/utils/memory.py index d278b3c3..12dfe1a8 100644 --- a/tradingagents/agents/utils/memory.py +++ b/tradingagents/agents/utils/memory.py @@ -4,9 +4,10 @@ Uses BM25 (Best Matching 25) algorithm for retrieval - no API calls, no token limits, works offline with any LLM provider. """ -from rank_bm25 import BM25Okapi -from typing import List, Tuple import re +from typing import List, Tuple + +from rank_bm25 import BM25Okapi class FinancialSituationMemory: diff --git a/tradingagents/agents/utils/news_data_tools.py b/tradingagents/agents/utils/news_data_tools.py index 781e793c..1c457ab7 100644 --- a/tradingagents/agents/utils/news_data_tools.py +++ b/tradingagents/agents/utils/news_data_tools.py @@ -1,7 +1,10 @@ -from langchain_core.tools import tool from typing import Annotated + +from langchain_core.tools import tool + from tradingagents.dataflows.interface import route_to_vendor + @tool def get_news( ticker: Annotated[str, "Ticker symbol"], diff --git a/tradingagents/agents/utils/technical_indicators_tools.py b/tradingagents/agents/utils/technical_indicators_tools.py index a3dda5a5..aa8955b0 100644 --- a/tradingagents/agents/utils/technical_indicators_tools.py +++ b/tradingagents/agents/utils/technical_indicators_tools.py @@ -1,7 +1,10 @@ -from langchain_core.tools import tool from typing import Annotated + +from langchain_core.tools import tool + from tradingagents.dataflows.interface import route_to_vendor + @tool def get_indicators( symbol: Annotated[str, "ticker symbol of the company"], diff --git a/tradingagents/dataflows/alpha_vantage.py b/tradingagents/dataflows/alpha_vantage.py index b2be1d61..0210c33e 100644 --- a/tradingagents/dataflows/alpha_vantage.py +++ b/tradingagents/dataflows/alpha_vantage.py @@ -1,5 +1 @@ # Import functions from specialized modules -from .alpha_vantage_stock import get_stock -from .alpha_vantage_indicator import get_indicator -from .alpha_vantage_fundamentals import get_fundamentals, get_balance_sheet, get_cashflow, get_income_statement -from .alpha_vantage_news import get_news, get_global_news, get_insider_transactions \ No newline at end of file diff --git a/tradingagents/dataflows/alpha_vantage_common.py b/tradingagents/dataflows/alpha_vantage_common.py index 409ff29e..90de31fd 100644 --- a/tradingagents/dataflows/alpha_vantage_common.py +++ b/tradingagents/dataflows/alpha_vantage_common.py @@ -1,10 +1,11 @@ -import os -import requests -import pandas as pd import json +import os from datetime import datetime from io import StringIO +import pandas as pd +import requests + API_BASE_URL = "https://www.alphavantage.co/query" def get_api_key() -> str: diff --git a/tradingagents/dataflows/alpha_vantage_indicator.py b/tradingagents/dataflows/alpha_vantage_indicator.py index 6225b9bb..b4943a9f 100644 --- a/tradingagents/dataflows/alpha_vantage_indicator.py +++ b/tradingagents/dataflows/alpha_vantage_indicator.py @@ -1,5 +1,6 @@ from .alpha_vantage_common import _make_api_request + def get_indicator( symbol: str, indicator: str, @@ -25,6 +26,7 @@ def get_indicator( String containing indicator values and description """ from datetime import datetime + from dateutil.relativedelta import relativedelta supported_indicators = { diff --git a/tradingagents/dataflows/alpha_vantage_news.py b/tradingagents/dataflows/alpha_vantage_news.py index 4cf7bb0e..48162762 100644 --- a/tradingagents/dataflows/alpha_vantage_news.py +++ b/tradingagents/dataflows/alpha_vantage_news.py @@ -1,5 +1,6 @@ from .alpha_vantage_common import _make_api_request, format_datetime_for_api + def get_news(ticker, start_date, end_date) -> dict[str, str] | str: """Returns live and historical market news & sentiment data from premier news outlets worldwide. diff --git a/tradingagents/dataflows/alpha_vantage_stock.py b/tradingagents/dataflows/alpha_vantage_stock.py index ffd3570b..72e86522 100644 --- a/tradingagents/dataflows/alpha_vantage_stock.py +++ b/tradingagents/dataflows/alpha_vantage_stock.py @@ -1,5 +1,7 @@ from datetime import datetime -from .alpha_vantage_common import _make_api_request, _filter_csv_by_date_range + +from .alpha_vantage_common import _filter_csv_by_date_range, _make_api_request + def get_stock( symbol: str, diff --git a/tradingagents/dataflows/config.py b/tradingagents/dataflows/config.py index 5819494a..8aef8b6a 100644 --- a/tradingagents/dataflows/config.py +++ b/tradingagents/dataflows/config.py @@ -1,6 +1,7 @@ -import tradingagents.default_config as default_config from typing import Dict, Optional +import tradingagents.default_config as default_config + # Use default config but allow it to be overridden _config: Optional[Dict] = None diff --git a/tradingagents/dataflows/interface.py b/tradingagents/dataflows/interface.py index 0caf4b68..045321b8 100644 --- a/tradingagents/dataflows/interface.py +++ b/tradingagents/dataflows/interface.py @@ -1,31 +1,56 @@ -from typing import Annotated # Import from vendor-specific modules -from .y_finance import ( - get_YFin_data_online, - get_stock_stats_indicators_window, - get_fundamentals as get_yfinance_fundamentals, - get_balance_sheet as get_yfinance_balance_sheet, - get_cashflow as get_yfinance_cashflow, - get_income_statement as get_yfinance_income_statement, - get_insider_transactions as get_yfinance_insider_transactions, +from .alpha_vantage import ( + get_balance_sheet as get_alpha_vantage_balance_sheet, +) +from .alpha_vantage import ( + get_cashflow as get_alpha_vantage_cashflow, +) +from .alpha_vantage import ( + get_fundamentals as get_alpha_vantage_fundamentals, +) +from .alpha_vantage import ( + get_global_news as get_alpha_vantage_global_news, +) +from .alpha_vantage import ( + get_income_statement as get_alpha_vantage_income_statement, +) +from .alpha_vantage import ( + get_indicator as get_alpha_vantage_indicator, +) +from .alpha_vantage import ( + get_insider_transactions as get_alpha_vantage_insider_transactions, +) +from .alpha_vantage import ( + get_news as get_alpha_vantage_news, ) -from .yfinance_news import get_news_yfinance, get_global_news_yfinance from .alpha_vantage import ( get_stock as get_alpha_vantage_stock, - get_indicator as get_alpha_vantage_indicator, - get_fundamentals as get_alpha_vantage_fundamentals, - get_balance_sheet as get_alpha_vantage_balance_sheet, - get_cashflow as get_alpha_vantage_cashflow, - get_income_statement as get_alpha_vantage_income_statement, - get_insider_transactions as get_alpha_vantage_insider_transactions, - get_news as get_alpha_vantage_news, - get_global_news as get_alpha_vantage_global_news, ) from .alpha_vantage_common import AlphaVantageRateLimitError # Configuration and routing logic from .config import get_config +from .y_finance import ( + get_balance_sheet as get_yfinance_balance_sheet, +) +from .y_finance import ( + get_cashflow as get_yfinance_cashflow, +) +from .y_finance import ( + get_fundamentals as get_yfinance_fundamentals, +) +from .y_finance import ( + get_income_statement as get_yfinance_income_statement, +) +from .y_finance import ( + get_insider_transactions as get_yfinance_insider_transactions, +) +from .y_finance import ( + get_stock_stats_indicators_window, + get_YFin_data_online, +) +from .yfinance_news import get_global_news_yfinance, get_news_yfinance # Tools organized by category TOOLS_CATEGORIES = { diff --git a/tradingagents/dataflows/stockstats_utils.py b/tradingagents/dataflows/stockstats_utils.py index 50747883..27acaa09 100644 --- a/tradingagents/dataflows/stockstats_utils.py +++ b/tradingagents/dataflows/stockstats_utils.py @@ -1,12 +1,13 @@ -import time import logging +import os +import time +from typing import Annotated import pandas as pd import yfinance as yf -from yfinance.exceptions import YFRateLimitError from stockstats import wrap -from typing import Annotated -import os +from yfinance.exceptions import YFRateLimitError + from .config import get_config logger = logging.getLogger(__name__) diff --git a/tradingagents/dataflows/utils.py b/tradingagents/dataflows/utils.py index 4523de19..0f971021 100644 --- a/tradingagents/dataflows/utils.py +++ b/tradingagents/dataflows/utils.py @@ -1,9 +1,8 @@ -import os -import json -import pandas as pd -from datetime import date, timedelta, datetime +from datetime import date, datetime, timedelta from typing import Annotated +import pandas as pd + SavePathType = Annotated[str, "File path to save data. If None, data is not saved."] def save_output(data: pd.DataFrame, tag: str, save_path: SavePathType = None) -> None: diff --git a/tradingagents/dataflows/y_finance.py b/tradingagents/dataflows/y_finance.py index 8f9bfe71..ca6dcc3c 100644 --- a/tradingagents/dataflows/y_finance.py +++ b/tradingagents/dataflows/y_finance.py @@ -1,10 +1,12 @@ -from typing import Annotated from datetime import datetime -from dateutil.relativedelta import relativedelta +from typing import Annotated + import pandas as pd import yfinance as yf -import os -from .stockstats_utils import StockstatsUtils, _clean_dataframe, yf_retry, load_ohlcv, filter_financials_by_date +from dateutil.relativedelta import relativedelta + +from .stockstats_utils import StockstatsUtils, filter_financials_by_date, load_ohlcv, yf_retry + def get_YFin_data_online( symbol: Annotated[str, "ticker symbol of the company"], diff --git a/tradingagents/dataflows/yfinance_news.py b/tradingagents/dataflows/yfinance_news.py index dd1046f5..4f6fa458 100644 --- a/tradingagents/dataflows/yfinance_news.py +++ b/tradingagents/dataflows/yfinance_news.py @@ -1,7 +1,8 @@ """yfinance-based news data fetching functions.""" -import yfinance as yf from datetime import datetime + +import yfinance as yf from dateutil.relativedelta import relativedelta from .stockstats_utils import yf_retry diff --git a/tradingagents/graph/__init__.py b/tradingagents/graph/__init__.py index 80982c19..901edddd 100644 --- a/tradingagents/graph/__init__.py +++ b/tradingagents/graph/__init__.py @@ -1,11 +1,11 @@ # TradingAgents/graph/__init__.py -from .trading_graph import TradingAgentsGraph from .conditional_logic import ConditionalLogic -from .setup import GraphSetup from .propagation import Propagator from .reflection import Reflector +from .setup import GraphSetup from .signal_processing import SignalProcessor +from .trading_graph import TradingAgentsGraph __all__ = [ "TradingAgentsGraph", diff --git a/tradingagents/graph/propagation.py b/tradingagents/graph/propagation.py index 0fd10c0c..f3cd0625 100644 --- a/tradingagents/graph/propagation.py +++ b/tradingagents/graph/propagation.py @@ -1,8 +1,8 @@ # TradingAgents/graph/propagation.py -from typing import Dict, Any, List, Optional +from typing import Any, Dict, List, Optional + from tradingagents.agents.utils.agent_states import ( - AgentState, InvestDebateState, RiskDebateState, ) diff --git a/tradingagents/graph/setup.py b/tradingagents/graph/setup.py index ae90489c..dfdf4f37 100644 --- a/tradingagents/graph/setup.py +++ b/tradingagents/graph/setup.py @@ -1,6 +1,7 @@ # TradingAgents/graph/setup.py from typing import Any, Dict + from langgraph.graph import END, START, StateGraph from langgraph.prebuilt import ToolNode diff --git a/tradingagents/graph/trading_graph.py b/tradingagents/graph/trading_graph.py index 8e18f9c4..6e8bcdde 100644 --- a/tradingagents/graph/trading_graph.py +++ b/tradingagents/graph/trading_graph.py @@ -1,42 +1,35 @@ # TradingAgents/graph/trading_graph.py +import json import os from pathlib import Path -import json -from datetime import date -from typing import Dict, Any, Tuple, List, Optional +from typing import Any, Dict, List, Optional from langgraph.prebuilt import ToolNode -from tradingagents.llm_clients import create_llm_client - from tradingagents.agents import * -from tradingagents.default_config import DEFAULT_CONFIG -from tradingagents.agents.utils.memory import FinancialSituationMemory -from tradingagents.agents.utils.agent_states import ( - AgentState, - InvestDebateState, - RiskDebateState, -) -from tradingagents.dataflows.config import set_config # Import the new abstract tool methods from agent_utils from tradingagents.agents.utils.agent_utils import ( - get_stock_data, - get_indicators, - get_fundamentals, get_balance_sheet, get_cashflow, + get_fundamentals, + get_global_news, get_income_statement, - get_news, + get_indicators, get_insider_transactions, - get_global_news + get_news, + get_stock_data, ) +from tradingagents.agents.utils.memory import FinancialSituationMemory +from tradingagents.dataflows.config import set_config +from tradingagents.default_config import DEFAULT_CONFIG +from tradingagents.llm_clients import create_llm_client from .conditional_logic import ConditionalLogic -from .setup import GraphSetup from .propagation import Propagator from .reflection import Reflector +from .setup import GraphSetup from .signal_processing import SignalProcessor diff --git a/tradingagents/llm_clients/base_client.py b/tradingagents/llm_clients/base_client.py index f29d713d..c3a78705 100644 --- a/tradingagents/llm_clients/base_client.py +++ b/tradingagents/llm_clients/base_client.py @@ -1,6 +1,6 @@ +import warnings from abc import ABC, abstractmethod from typing import Any, Optional -import warnings def normalize_content(response): diff --git a/tradingagents/llm_clients/factory.py b/tradingagents/llm_clients/factory.py index 93c2a7d3..dfb9a507 100644 --- a/tradingagents/llm_clients/factory.py +++ b/tradingagents/llm_clients/factory.py @@ -1,9 +1,9 @@ from typing import Optional -from .base_client import BaseLLMClient -from .openai_client import OpenAIClient from .anthropic_client import AnthropicClient +from .base_client import BaseLLMClient from .google_client import GoogleClient +from .openai_client import OpenAIClient def create_llm_client( diff --git a/tradingagents/llm_clients/validators.py b/tradingagents/llm_clients/validators.py index 4e6d457b..ede61cbf 100644 --- a/tradingagents/llm_clients/validators.py +++ b/tradingagents/llm_clients/validators.py @@ -2,7 +2,6 @@ from .model_catalog import get_known_models - VALID_MODELS = { provider: models for provider, models in get_known_models().items()