139 lines
4.1 KiB
Python
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,
|
|
}
|