132 lines
4.2 KiB
Python
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
|