autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
89 lines (88 loc) • 2.4 kB
TypeScript
/**
* TokenUsageStore — Token 消耗持久化存储 (Drizzle ORM)
*
* 写入 AI 调用的 token 用量记录到 SQLite token_usage 表。
* 提供近 7 日按日/按来源的聚合查询。
*
* Drizzle 迁移策略:
* - INSERT 使用 drizzle 类型安全 API(列名编译期检查)
* - 聚合查询保留预编译 raw SQL(DATE() / GROUP BY computed-column
* 在 drizzle query builder 中不够直观,保持原有高效预编译语句)
*/
import type { DrizzleDB } from '../../infrastructure/database/drizzle/index.js';
/** Token usage record input */
interface TokenRecord {
source: string;
dimension?: string;
provider?: string;
model?: string;
inputTokens: number;
outputTokens: number;
durationMs?: number;
toolCalls?: number;
sessionId?: string;
}
/** Daily aggregation row */
interface DailyRow {
date: string;
input_tokens: number;
output_tokens: number;
total_tokens: number;
call_count: number;
}
/** Source aggregation row */
interface BySourceRow {
source: string;
input_tokens: number;
output_tokens: number;
total_tokens: number;
call_count: number;
}
/** Summary row */
interface SummaryRow {
input_tokens: number;
output_tokens: number;
total_tokens: number;
call_count: number;
}
/** 7-day report data */
interface ReportData {
daily: DailyRow[];
bySource: BySourceRow[];
summary: SummaryRow & {
avg_per_call: number;
};
}
export declare class TokenUsageStore {
#private;
/** @param db — raw better-sqlite3 instance */
constructor(db: import('better-sqlite3').Database, drizzle?: DrizzleDB);
/**
* 记录一次 AI 调用的 token 消耗
* ★ 使用 drizzle 类型安全 INSERT — 列名拼写编译期检查
*/
record(record: TokenRecord): void;
/**
* 近 7 日按日聚合统计
* @returns >}
*/
getLast7DaysDaily(): DailyRow[];
/**
* 近 7 日按来源 (source) 聚合统计
* @returns >}
*/
getLast7DaysBySource(): BySourceRow[];
/**
* 近 7 日总计
* @returns }
*/
getLast7DaysSummary(): SummaryRow & {
avg_per_call: number;
};
/**
* 获取完整的 7 日报告(前端一次拉取)
* 带 10s 内存缓存,避免高频请求重复查询
*/
getLast7DaysReport(): ReportData;
}
export {};