Files

139 lines
4.1 KiB
Python

import json
from apps.admin_console.database.repositories.step_repository import StepRepository
def test_android_capture_receipt_survives_cleaning_without_becoming_image_store_id():
receipt = {
"ok": True,
"action": "screenshot",
"verified": True,
"device_serial": "device-under-test",
"trace_path": "artifacts/android/screen.png",
"sha256": "a" * 64,
"captured_at": "2026-10-28T00:00:00Z",
"content": "large file content must not be copied into the task stream",
}
cleaned = StepRepository()._clean_tool_payload(
{"args": {"action": "screenshot"}, "result": json.dumps(receipt)},
"tool",
"android_file",
)
assert cleaned["result"] == {key: value for key, value in receipt.items() if key != "content"}
assert "post_image_name" not in cleaned
wrapped = StepRepository()._clean_tool_payload(
{"result": json.dumps({"outcome": json.dumps(receipt)})}, "tool", "android_file"
)
assert wrapped["result"] == cleaned["result"]
def test_legacy_pause_log_is_normalized_to_failed_llm_trace():
repository = StepRepository()
trace = {
"trace_id": "pause-log",
"type": "log",
"name": "artemis.services.llm",
"status": "success",
"payload": json.dumps(
{
"message": (
"LLM Error: 503 UNAVAILABLE. {'error': {'message': 'High demand'}}. "
"Pausing execution to wait for resume signal..."
)
}
),
}
normalized = repository._normalize_display_trace(trace)
assert normalized["type"] == "llm_call"
assert normalized["name"] == "llm_pause"
assert normalized["status"] == "failed"
assert normalized["payload"]["pause"] is True
assert normalized["payload"]["error"].startswith("503 UNAVAILABLE")
def test_unrelated_log_is_not_presented_as_llm_failure():
repository = StepRepository()
trace = {
"trace_id": "ordinary-log",
"type": "log",
"name": "artemis.services.llm",
"status": "success",
"payload": json.dumps({"message": "LLM request completed"}),
}
normalized = repository._normalize_display_trace(trace)
assert normalized["type"] == "log"
assert normalized["status"] == "success"
def test_retrying_llm_payload_keeps_user_visible_retry_details():
repository = StepRepository()
trace = {
"trace_id": "retry-1",
"type": "llm_call",
"name": "llm_retry",
"status": "retrying",
"payload": json.dumps(
{
"error": "503 UNAVAILABLE: high demand",
"delay": 1.18,
"provider": "openai",
"source": "provider_sdk",
"recoverable": True,
"internal_noise": "do not expose",
}
),
}
normalized = repository._normalize_display_trace(trace)
assert normalized["payload"] == {
"error": "503 UNAVAILABLE: high demand",
"delay": 1.18,
"provider": "openai",
"source": "provider_sdk",
"recoverable": True,
}
def test_terminal_llm_payload_keeps_wait_and_retry_aggregation():
repository = StepRepository()
retries = [
{
"delay": 5.0,
"scheduled_at": 100.0,
"provider": "openai",
"source": "provider_sdk",
}
]
trace = {
"type": "llm_call",
"name": "llm_pause",
"status": "failed",
"payload": json.dumps(
{
"error": "503 UNAVAILABLE",
"pause": True,
"request_id": "request-1",
"provider": "openai",
"waited_seconds": 18.5,
"retries": retries,
"messages": ["private prompt"],
}
),
}
normalized = repository._normalize_display_trace(trace)
assert normalized["payload"] == {
"error": "503 UNAVAILABLE",
"provider": "openai",
"pause": True,
"request_id": "request-1",
"waited_seconds": 18.5,
"retries": retries,
}