from abc import ABC, abstractmethod from typing import Optional from pydantic import Field from app.agent.base import BaseAgent from app.llm.inference import LLM from app.schema import AgentState, Memory class ReActAgent(BaseAgent, ABC): name: str description: Optional[str] = None system_prompt: Optional[str] = None next_step_prompt: Optional[str] = None llm: Optional[LLM] = Field(default_factory=LLM) memory: Memory = Field(default_factory=Memory) state: AgentState = AgentState.IDLE max_steps: int = 10 current_step: int = 0 @abstractmethod async def think(self) -> bool: """Process current state and decide next action""" @abstractmethod async def act(self) -> str: """Execute decided actions""" async def step(self) -> str: """Execute a single step: think and act.""" should_act = await self.think() if not should_act: return "Thinking complete - no action needed" return await self.act()