assistant/tests/test_next_step_correction_d...

68 lines
2.4 KiB
Python

"""A normal next call carries only safe schema feedback, without repair calls."""
from types import SimpleNamespace
import pytest
from pydantic import BaseModel, ValidationError
from backend.browser import diagnostics, runner
class Output(BaseModel):
action: list[dict]
def record_error():
try:
Output.model_validate({'PRIVATE-KEY': 'PRIVATE-RESPONSE'})
except ValidationError as error:
diagnostics.schema_error(None, error, Output)
@pytest.fixture
def local(tmp_path, monkeypatch):
monkeypatch.setattr(diagnostics, 'task_doc_dir', lambda _: tmp_path)
async def test_correction_is_added_to_one_normal_call_and_clears_after_success(local):
from browser_use.llm.messages import UserMessage
calls = []
class Base:
async def get_model_output(self, messages):
calls.append(messages)
return SimpleNamespace(action=[])
agent = runner._prospecting_agent_class(Base)()
agent._goal_based = True
original = [UserMessage(content='Current task')]
with diagnostics.run_scope('correction_fixture', 'run_fixture'):
record_error()
await agent.get_model_output(original)
assert len(calls) == 1 and len(original) == 1
hint = calls[0][-1].text
assert 'action' in hint and 'missing' in hint and 'PRIVATE' not in hint
# A framework fallback sees the same correction once, not a growing
# stack of messages or a paid correction loop.
await agent.get_model_output(calls[0])
assert len(calls) == 2 and len(calls[1]) == 2
diagnostics.validated_response('browser')
await agent.get_model_output(original)
assert len(calls) == 3 and calls[2] is original
async def test_other_run_and_legacy_agent_do_not_receive_previous_error(local):
from browser_use.llm.messages import UserMessage
calls = []
class Base:
async def get_model_output(self, messages):
calls.append(messages)
return None
agent = runner._prospecting_agent_class(Base)()
original = [UserMessage(content='Current task')]
with diagnostics.run_scope('first', 'first_run'):
record_error()
await agent.get_model_output(original)
assert calls[-1] is original
agent._goal_based = True
with diagnostics.run_scope('second', 'second_run'):
await agent.get_model_output(original)
assert calls[-1] is original