diff --git a/.gitignore b/.gitignore index 9a2904a9..db13733f 100644 --- a/.gitignore +++ b/.gitignore @@ -217,3 +217,6 @@ __marimo__/ # Cache **/data_cache/ +.kiro/ +ralph-kiro.sh +progress.txt diff --git a/.kiro/specs/active/024-generic-agent-interface-contrib/tasks.md b/.kiro/specs/active/024-generic-agent-interface-contrib/tasks.md index 5913f34d..940deccc 100644 --- a/.kiro/specs/active/024-generic-agent-interface-contrib/tasks.md +++ b/.kiro/specs/active/024-generic-agent-interface-contrib/tasks.md @@ -11,7 +11,7 @@ No standardized input/output contract for agents. Hard to swap, compose, or benc ## Tasks - [x] 1. Define AgentInput schema: ticker, date, context (market data, news, fundamentals) - [x] 2. Define AgentOutput schema: rating (5-tier), confidence, price_targets, thesis, risk_factors -- [ ] 3. Create BaseAgent abstract class with analyze(input) -> output contract +- [x] 3. Create BaseAgent abstract class with analyze(input) -> output contract - [ ] 4. Refactor existing agents (fundamentals, sentiment, news, technical) to implement BaseAgent - [ ] 5. Create AgentRegistry for pluggable agent discovery - [ ] 6. Add agent benchmarking: compare outputs across different LLM backends diff --git a/tradingagents/agents/__init__.py b/tradingagents/agents/__init__.py index 26aca721..c485fb04 100644 --- a/tradingagents/agents/__init__.py +++ b/tradingagents/agents/__init__.py @@ -1,3 +1,4 @@ +from .base_agent import BaseAgent from .utils.agent_utils import create_msg_delete from .utils.agent_states import AgentState, InvestDebateState, RiskDebateState from .utils.memory import FinancialSituationMemory @@ -21,6 +22,7 @@ from .managers.portfolio_manager import create_portfolio_manager from .trader.trader import create_trader __all__ = [ + "BaseAgent", "FinancialSituationMemory", "AgentState", "AgentInput", diff --git a/tradingagents/agents/base_agent.py b/tradingagents/agents/base_agent.py new file mode 100644 index 00000000..81630ab2 --- /dev/null +++ b/tradingagents/agents/base_agent.py @@ -0,0 +1,23 @@ +"""Abstract base class for trading agents with a standardized analyze contract.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod + +from .utils.schemas import AgentInput, AgentOutput + + +class BaseAgent(ABC): + """Base class all trading agents must implement. + + Subclasses provide ``analyze`` which accepts an :class:`AgentInput` and + returns an :class:`AgentOutput`, ensuring a uniform contract across every + agent in the system. + """ + + name: str = "unnamed_agent" + + @abstractmethod + def analyze(self, agent_input: AgentInput) -> AgentOutput: + """Run analysis and return a standardized output.""" + ...