Add attention inbox and AI usage observability
This commit is contained in:
1 parent
ca59ba0f1f
commit
83b5f1f5b6
30 files changed
+702
-28
No files matched your search
@@ -0,0 +1,32 @@
|
||||
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();
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user