38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
from typing import List
|
|
|
|
from pydantic import Field
|
|
|
|
from app.agent.toolcall import ToolCallAgent
|
|
from app.prompt.swe import NEXT_STEP_TEMPLATE, SYSTEM_PROMPT
|
|
from app.tool import Bash, StrReplaceEditor, Terminate, ToolCollection
|
|
|
|
|
|
class SWEAgent(ToolCallAgent):
|
|
"""An agent that implements the SWEAgent paradigm for executing code and natural conversations."""
|
|
|
|
name: str = "swe"
|
|
description: str = "an autonomous AI programmer that interacts directly with the computer to solve tasks."
|
|
|
|
system_prompt: str = SYSTEM_PROMPT
|
|
next_step_prompt: str = NEXT_STEP_TEMPLATE
|
|
|
|
available_tools: ToolCollection = ToolCollection(
|
|
Bash(), StrReplaceEditor(), Terminate()
|
|
)
|
|
special_tool_names: List[str] = Field(default_factory=lambda: [Terminate().name])
|
|
|
|
max_steps: int = 30
|
|
|
|
bash: Bash = Field(default_factory=Bash)
|
|
working_dir: str = "."
|
|
|
|
async def think(self) -> bool:
|
|
"""Process current state and decide next action"""
|
|
# Update working directory
|
|
self.working_dir = await self.bash.execute("pwd")
|
|
self.next_step_prompt = self.next_step_prompt.format(
|
|
current_dir=self.working_dir
|
|
)
|
|
|
|
return await super().think()
|