Files
2026-07-13 13:12:33 +08:00

132 lines
4.2 KiB
Python

"""Tests for cost provenance in structured decision logs."""
from types import SimpleNamespace
from opensquilla.engine.runtime import TurnRunner
from opensquilla.engine.types import DoneEvent
def test_decision_log_savings_telemetry_carries_cost_source(monkeypatch) -> None:
captured = {}
def fake_write_decision_entry(entry):
captured["entry"] = entry
monkeypatch.setattr(
"opensquilla.engine.runtime.write_decision_entry",
fake_write_decision_entry,
)
runner = TurnRunner(provider_selector=None)
runner._emit_decision_entry(
turn_id="turn-1",
session_key="agent:main:session",
session_id="session-id",
message="hello",
final_prompt="system",
tool_defs=[],
turn_obj=SimpleNamespace(metadata={}),
provider=SimpleNamespace(),
resolved_model="claude-opus-4-7",
turn_started_at=0.0,
done_event=DoneEvent(
input_tokens=100,
output_tokens=10,
cost_usd=0.004,
billed_cost=0.004,
cost_source="provider_billed",
),
)
entry = captured["entry"]
assert entry.savings.cost_usd == 0.004
assert entry.savings.billed_cost_usd == 0.004
assert entry.savings.cost_source == "provider_billed"
def test_decision_log_normalizes_tokenized_zero_cost_turns_as_unavailable(monkeypatch) -> None:
captured = {}
def fake_write_decision_entry(entry):
captured["entry"] = entry
monkeypatch.setattr(
"opensquilla.engine.runtime.write_decision_entry",
fake_write_decision_entry,
)
runner = TurnRunner(provider_selector=None)
runner._emit_decision_entry(
turn_id="turn-2",
session_key="agent:main:session",
session_id="session-id",
message="hello",
final_prompt="system",
tool_defs=[],
turn_obj=SimpleNamespace(metadata={}),
provider=SimpleNamespace(),
resolved_model="local/free",
turn_started_at=0.0,
done_event=DoneEvent(
input_tokens=100,
output_tokens=10,
cost_usd=0.0,
billed_cost=0.0,
cost_source="none",
),
)
entry = captured["entry"]
assert entry.savings.cost_usd == 0.0
assert entry.savings.billed_cost_usd == 0.0
assert entry.savings.cost_source == "unavailable"
def test_decision_log_carries_vision_followup_metadata(monkeypatch) -> None:
captured = {}
def fake_write_decision_entry(entry):
captured["entry"] = entry
monkeypatch.setattr(
"opensquilla.engine.runtime.write_decision_entry",
fake_write_decision_entry,
)
runner = TurnRunner(provider_selector=None)
runner._emit_decision_entry(
turn_id="turn-3",
session_key="agent:main:session",
session_id="session-id",
message="For the previous image, continue.",
final_prompt="system",
tool_defs=[],
turn_obj=SimpleNamespace(
metadata={
"image_route_reason": "gate_history",
"router_vision_followup_gate_decision": "needs_image",
"router_vision_followup_gate_confidence": 0.92,
"router_vision_followup_gate_reason": (
"references previous image with private detail from local image"
),
"router_vision_followup_gate_source": "llm",
"router_vision_followup_gate_model": "deepseek/deepseek-v4-flash",
"router_vision_followup_needs_image": True,
}
),
provider=SimpleNamespace(),
resolved_model="moonshotai/kimi-k2.6",
turn_started_at=0.0,
done_event=DoneEvent(input_tokens=100, output_tokens=10),
)
entry = captured["entry"]
assert entry.image_route_reason == "gate_history"
assert entry.vision_followup_gate_decision == "needs_image"
assert entry.vision_followup_gate_confidence == 0.92
assert entry.vision_followup_gate_reason == "llm_needs_image"
assert "private detail" not in entry.vision_followup_gate_reason
assert entry.vision_followup_gate_source == "llm"
assert entry.vision_followup_gate_model == "deepseek/deepseek-v4-flash"
assert entry.vision_followup_needs_image is True