| from abc import ABC, abstractmethod |
| from typing import Optional |
|
|
| from pydantic import Field |
|
|
| from app.agent.base import BaseAgent |
| from app.llm 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() |
|
|