import { describe, expect, it } from 'vitest'; import { AiUsageRepository } from '../src/database/ai-usage-repository.js'; import { createTestDb } from './testUtils.js'; describe('AiUsageRepository', () => { it('aggregates cost, tokens, outcomes, and latency by actual model', () => { const db = createTestDb(); const repo = new AiUsageRepository(db); const now = Date.parse('2026-08-09T10:00:00Z'); repo.record({ operation: 'generateReply', requestedModel: 'router', actualModel: 'model-a', outcome: 'success', promptTokens: 100, completionTokens: 20, totalTokens: 120, costUsd: 0.0012, latencyMs: 400, createdAt: now }); repo.record({ operation: 'generateReply', requestedModel: 'model-a', actualModel: 'model-a', outcome: 'refusal', promptTokens: 40, completionTokens: 5, totalTokens: 45, costUsd: 0.0003, latencyMs: 200, createdAt: now }); repo.record({ operation: 'analyzeImage', requestedModel: 'model-b', outcome: 'error', latencyMs: 900, error: 'provider unavailable', createdAt: now }); expect(repo.getSummary(30, now)).toEqual({ days: 30, requests: 3, successes: 1, refusals: 1, errors: 1, promptTokens: 140, completionTokens: 25, totalTokens: 165, costUsd: 0.0015, averageLatencyMs: 500, models: [ { model: 'model-a', requests: 2, successes: 1, refusals: 1, errors: 0, promptTokens: 140, completionTokens: 25, totalTokens: 165, costUsd: 0.0015, averageLatencyMs: 300 }, { model: 'model-b', requests: 1, successes: 0, refusals: 0, errors: 1, promptTokens: 0, completionTokens: 0, totalTokens: 0, costUsd: 0, averageLatencyMs: 900 }, ], }); db.close(); }); });