mirror of
https://github.com/All-Hands-AI/OpenHands.git
synced 2026-04-29 03:00:45 -04:00
* CodeActAgent: fix message prep if prompt caching is not supported * fix python version in regen tests workflow * fix in conftest "mock_completion" method * add disable_vision to LLMConfig; revert change in message parsing in llm.py * format messages in several files for completion * refactored message(s) formatting (llm.py); added vision_is_active() * fix a unit test * regenerate: added LOG_TO_FILE and FORCE_REGENERATE env flags * try to fix path to logs folder in workflow * llm: prevent index error * try FORCE_USE_LLM in regenerate * tweaks everywhere... * fix 2 random unit test errors :( * added FORCE_REGENERATE_TESTS=true to regenerate CLI * fix test_lint_file_fail_typescript again * double-quotes for env vars in workflow; llm logger set to debug * fix typo in regenerate * regenerate iterations now 20; applied iteration counter fix by Li * regenerate: pass FORCE_REGENERATE flag into env * fixes for int tests. several mock files updated. * browsing_agent: fix response_parser.py adding ) to empty response * test_browse_internet: fix skipif and revert obsolete mock files * regenerate: fi bracketing for http server start/kill conditions * disable test_browse_internet for CodeAct*Agents; mock files updated after merge * missed to include more mock files earlier * reverts after review feedback from Li * forgot one * browsing agent test, partial fixes and updated mock files * test_browse_internet works in my WSL now! * adapt unit test test_prompt_caching.py * add DEBUG to regenerate workflow command * convert regenerate workflow params to inputs * more integration test mock files updated * more files * test_prompt_caching: restored test_prompt_caching_headers purpose * file_ops: fix potential exception, like "cross device copy"; fixed mock files accordingly * reverts/changes wrt feedback from xingyao * updated docs and config template * code cleanup wrt review feedback
97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
|
|
from agenthub.codeact_agent.codeact_agent import CodeActAgent
|
|
from openhands.core.config import AgentConfig, LLMConfig
|
|
from openhands.core.message import TextContent
|
|
from openhands.events.observation.commands import (
|
|
CmdOutputObservation,
|
|
IPythonRunCellObservation,
|
|
)
|
|
from openhands.events.observation.delegate import AgentDelegateObservation
|
|
from openhands.events.observation.error import ErrorObservation
|
|
from openhands.llm.llm import LLM
|
|
|
|
|
|
@pytest.fixture
|
|
def agent() -> CodeActAgent:
|
|
agent = CodeActAgent(llm=LLM(LLMConfig()), config=AgentConfig())
|
|
agent.llm = Mock()
|
|
agent.llm.config = Mock()
|
|
agent.llm.config.max_message_chars = 100
|
|
return agent
|
|
|
|
|
|
def test_cmd_output_observation_message(agent: CodeActAgent):
|
|
obs = CmdOutputObservation(
|
|
command='echo hello', content='Command output', command_id=1, exit_code=0
|
|
)
|
|
|
|
result = agent.get_observation_message(obs)
|
|
|
|
assert result is not None
|
|
assert result.role == 'user'
|
|
assert len(result.content) == 1
|
|
assert isinstance(result.content[0], TextContent)
|
|
assert 'OBSERVATION:' in result.content[0].text
|
|
assert 'Command output' in result.content[0].text
|
|
assert 'Command 1 finished with exit code 0' in result.content[0].text
|
|
|
|
|
|
def test_ipython_run_cell_observation_message(agent: CodeActAgent):
|
|
obs = IPythonRunCellObservation(
|
|
code='plt.plot()',
|
|
content='IPython output\n',
|
|
)
|
|
|
|
result = agent.get_observation_message(obs)
|
|
|
|
assert result is not None
|
|
assert result.role == 'user'
|
|
assert len(result.content) == 1
|
|
assert isinstance(result.content[0], TextContent)
|
|
assert 'OBSERVATION:' in result.content[0].text
|
|
assert 'IPython output' in result.content[0].text
|
|
assert (
|
|
' already displayed to user'
|
|
in result.content[0].text
|
|
)
|
|
assert 'ABC123' not in result.content[0].text
|
|
|
|
|
|
def test_agent_delegate_observation_message(agent: CodeActAgent):
|
|
obs = AgentDelegateObservation(
|
|
content='Content', outputs={'content': 'Delegated agent output'}
|
|
)
|
|
|
|
result = agent.get_observation_message(obs)
|
|
|
|
assert result is not None
|
|
assert result.role == 'user'
|
|
assert len(result.content) == 1
|
|
assert isinstance(result.content[0], TextContent)
|
|
assert 'OBSERVATION:' in result.content[0].text
|
|
assert 'Delegated agent output' in result.content[0].text
|
|
|
|
|
|
def test_error_observation_message(agent: CodeActAgent):
|
|
obs = ErrorObservation('Error message')
|
|
|
|
result = agent.get_observation_message(obs)
|
|
|
|
assert result is not None
|
|
assert result.role == 'user'
|
|
assert len(result.content) == 1
|
|
assert isinstance(result.content[0], TextContent)
|
|
assert 'OBSERVATION:' in result.content[0].text
|
|
assert 'Error message' in result.content[0].text
|
|
assert 'Error occurred in processing last action' in result.content[0].text
|
|
|
|
|
|
def test_unknown_observation_message(agent: CodeActAgent):
|
|
obs = Mock()
|
|
|
|
with pytest.raises(ValueError, match='Unknown observation type:'):
|
|
agent.get_observation_message(obs)
|