| from types import SimpleNamespace |
|
|
| import pytest |
|
|
| from agent.core import telemetry |
|
|
|
|
| class FakeSession: |
| def __init__(self): |
| self.events = [] |
|
|
| async def send_event(self, event): |
| self.events.append(event) |
|
|
|
|
| def test_extract_usage_reads_hf_router_cache_write_tokens(): |
| response = SimpleNamespace( |
| usage=SimpleNamespace( |
| prompt_tokens=100, |
| completion_tokens=10, |
| total_tokens=110, |
| prompt_tokens_details=SimpleNamespace( |
| cached_tokens=80, |
| cache_write_tokens=20, |
| ), |
| ) |
| ) |
|
|
| usage = telemetry.extract_usage(response) |
|
|
| assert usage["cache_read_tokens"] == 80 |
| assert usage["cache_creation_tokens"] == 20 |
|
|
|
|
| @pytest.mark.asyncio |
| async def test_record_hf_job_complete_emits_runtime_cost(monkeypatch): |
| async def fake_catalog(): |
| return {"a100-large": 4.0} |
|
|
| monkeypatch.setattr(telemetry, "hf_jobs_price_catalog", fake_catalog) |
| monkeypatch.setattr(telemetry.time, "monotonic", lambda: 130.0) |
| session = FakeSession() |
|
|
| await telemetry.record_hf_job_complete( |
| session, |
| SimpleNamespace(id="job-1"), |
| flavor="a100-large", |
| final_status="COMPLETED", |
| submit_ts=100.0, |
| ) |
|
|
| event = session.events[0] |
| assert event.event_type == "hf_job_complete" |
| assert event.data["wall_time_s"] == 30 |
| assert event.data["billable_seconds_estimate"] == 30 |
| assert event.data["price_usd_per_hour"] == 4.0 |
| assert event.data["estimated_cost_usd"] == round(4.0 * 30 / 3600, 4) |
| assert event.data["cost_estimate_source"] == "runtime_price_catalog" |
|
|
|
|
| @pytest.mark.asyncio |
| async def test_record_hf_job_complete_keeps_unknown_hardware_countable(monkeypatch): |
| async def fake_catalog(): |
| return {} |
|
|
| monkeypatch.setattr(telemetry, "hf_jobs_price_catalog", fake_catalog) |
| monkeypatch.setattr(telemetry.time, "monotonic", lambda: 160.0) |
| session = FakeSession() |
|
|
| await telemetry.record_hf_job_complete( |
| session, |
| SimpleNamespace(id="job-2"), |
| flavor="future-gpu", |
| final_status="FAILED", |
| submit_ts=100.0, |
| ) |
|
|
| data = session.events[0].data |
| assert data["wall_time_s"] == 60 |
| assert data["billable_seconds_estimate"] == 60 |
| assert data["price_usd_per_hour"] is None |
| assert data["estimated_cost_usd"] is None |
| assert data["cost_estimate_source"] == "unknown_price" |
|
|