Spaces:
Build error
Build error
""" | |
ReadOnlyAgent - A specialized version of CodeActAgent that only uses read-only tools. | |
""" | |
import os | |
from typing import TYPE_CHECKING | |
if TYPE_CHECKING: | |
from litellm import ChatCompletionToolParam | |
from openhands.events.action import Action | |
from openhands.llm.llm import ModelResponse | |
from openhands.agenthub.codeact_agent.codeact_agent import CodeActAgent | |
from openhands.agenthub.readonly_agent import ( | |
function_calling as readonly_function_calling, | |
) | |
from openhands.core.config import AgentConfig | |
from openhands.core.logger import openhands_logger as logger | |
from openhands.llm.llm import LLM | |
from openhands.utils.prompt import PromptManager | |
class ReadOnlyAgent(CodeActAgent): | |
VERSION = '1.0' | |
""" | |
The ReadOnlyAgent is a specialized version of CodeActAgent that only uses read-only tools. | |
This agent is designed for safely exploring codebases without making any changes. | |
It only has access to tools that don't modify the system: grep, glob, view, think, finish, web_read. | |
Use this agent when you want to: | |
1. Explore a codebase to understand its structure | |
2. Search for specific patterns or code | |
3. Research without making any changes | |
When you're ready to make changes, switch to the regular CodeActAgent. | |
""" | |
def __init__( | |
self, | |
llm: LLM, | |
config: AgentConfig, | |
) -> None: | |
"""Initializes a new instance of the ReadOnlyAgent class. | |
Parameters: | |
- llm (LLM): The llm to be used by this agent | |
- config (AgentConfig): The configuration for this agent | |
""" | |
# Initialize the CodeActAgent class; some of it is overridden with class methods | |
super().__init__(llm, config) | |
logger.debug( | |
f'TOOLS loaded for ReadOnlyAgent: {", ".join([tool.get("function").get("name") for tool in self.tools])}' | |
) | |
def prompt_manager(self) -> PromptManager: | |
# Set up our own prompt manager | |
if self._prompt_manager is None: | |
self._prompt_manager = PromptManager( | |
prompt_dir=os.path.join(os.path.dirname(__file__), 'prompts'), | |
) | |
return self._prompt_manager | |
def _get_tools(self) -> list['ChatCompletionToolParam']: | |
# Override the tools to only include read-only tools | |
# Get the read-only tools from our own function_calling module | |
return readonly_function_calling.get_tools() | |
def set_mcp_tools(self, mcp_tools: list[dict]) -> None: | |
"""Sets the list of MCP tools for the agent. | |
Args: | |
- mcp_tools (list[dict]): The list of MCP tools. | |
""" | |
logger.warning( | |
'ReadOnlyAgent does not support MCP tools. MCP tools will be ignored by the agent.' | |
) | |
def response_to_actions(self, response: 'ModelResponse') -> list['Action']: | |
return readonly_function_calling.response_to_actions( | |
response, mcp_tool_names=list(self.mcp_tools.keys()) | |
) | |