33 lines
1.7 KiB
TypeScript
33 lines
1.7 KiB
TypeScript
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();
|
|
});
|
|
});
|