@theihtisham/budget-llm 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.env.example +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +293 -0
  4. package/dist/config.d.ts +77 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +246 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/database.d.ts +24 -0
  9. package/dist/database.d.ts.map +1 -0
  10. package/dist/database.js +414 -0
  11. package/dist/database.js.map +1 -0
  12. package/dist/providers.d.ts +20 -0
  13. package/dist/providers.d.ts.map +1 -0
  14. package/dist/providers.js +208 -0
  15. package/dist/providers.js.map +1 -0
  16. package/dist/proxy.d.ts +7 -0
  17. package/dist/proxy.d.ts.map +1 -0
  18. package/dist/proxy.js +181 -0
  19. package/dist/proxy.js.map +1 -0
  20. package/dist/rate-limiter.d.ts +8 -0
  21. package/dist/rate-limiter.d.ts.map +1 -0
  22. package/dist/rate-limiter.js +72 -0
  23. package/dist/rate-limiter.js.map +1 -0
  24. package/dist/router.d.ts +33 -0
  25. package/dist/router.d.ts.map +1 -0
  26. package/dist/router.js +186 -0
  27. package/dist/router.js.map +1 -0
  28. package/dist/server.d.ts +3 -0
  29. package/dist/server.d.ts.map +1 -0
  30. package/dist/server.js +705 -0
  31. package/dist/server.js.map +1 -0
  32. package/dist/task-classifier.d.ts +4 -0
  33. package/dist/task-classifier.d.ts.map +1 -0
  34. package/dist/task-classifier.js +123 -0
  35. package/dist/task-classifier.js.map +1 -0
  36. package/dist/types.d.ts +205 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +46 -0
  39. package/dist/types.js.map +1 -0
  40. package/dist/utils/encryption.d.ts +4 -0
  41. package/dist/utils/encryption.d.ts.map +1 -0
  42. package/dist/utils/encryption.js +40 -0
  43. package/dist/utils/encryption.js.map +1 -0
  44. package/package.json +63 -0
  45. package/src/config.ts +254 -0
  46. package/src/database.ts +496 -0
  47. package/src/providers.ts +315 -0
  48. package/src/proxy.ts +226 -0
  49. package/src/rate-limiter.ts +81 -0
  50. package/src/router.ts +228 -0
  51. package/src/server.ts +754 -0
  52. package/src/task-classifier.ts +134 -0
  53. package/src/types/sql.js.d.ts +27 -0
  54. package/src/types.ts +258 -0
  55. package/src/utils/encryption.ts +36 -0
  56. package/tests/config.test.ts +85 -0
  57. package/tests/database.test.ts +194 -0
  58. package/tests/encryption.test.ts +57 -0
  59. package/tests/rate-limiter.test.ts +83 -0
  60. package/tests/router.test.ts +182 -0
  61. package/tests/server.test.ts +253 -0
  62. package/tests/setup.ts +15 -0
  63. package/tests/task-classifier.test.ts +117 -0
  64. package/tsconfig.json +25 -0
  65. package/vitest.config.ts +15 -0
@@ -0,0 +1,24 @@
1
+ import { Database as SqlJsDatabase } from 'sql.js';
2
+ import type { CostRecord, CostSummary, BudgetStatus, BudgetConfig, CacheEntry, DashboardData } from './types';
3
+ /**
4
+ * Get or initialize the database. sql.js is async so we init once.
5
+ */
6
+ export declare function initDb(): Promise<SqlJsDatabase>;
7
+ /**
8
+ * Synchronous access — throws if not initialized yet.
9
+ * Call initDb() during server startup before using this.
10
+ */
11
+ export declare function getDb(): SqlJsDatabase;
12
+ export declare function insertCostRecord(record: CostRecord): void;
13
+ export declare function getDailySpend(): number;
14
+ export declare function getMonthlySpend(): number;
15
+ export declare function getBudgetStatus(config: BudgetConfig): BudgetStatus;
16
+ export declare function getCostSummary(days?: number): CostSummary;
17
+ export declare function getCacheEntry(promptHash: string): CacheEntry | null;
18
+ export declare function setCacheEntry(entry: CacheEntry): void;
19
+ export declare function clearCache(): number;
20
+ export declare function getBudgetConfig(): BudgetConfig;
21
+ export declare function setBudgetConfig(config: Partial<BudgetConfig>): void;
22
+ export declare function getDashboardData(): DashboardData;
23
+ export declare function closeDb(): void;
24
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AAI9D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAiC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAc,MAAM,SAAS,CAAC;AAMzJ;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,CA6BrD;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,aAAa,CAKrC;AAuGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAuBzD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAQxC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAiBlE;AAED,wBAAgB,cAAc,CAAC,IAAI,SAAK,GAAG,WAAW,CAwGrD;AAID,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAmCnE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAoBrD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAOnC;AAID,wBAAgB,eAAe,IAAI,YAAY,CAU9C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAkBnE;AAID,wBAAgB,gBAAgB,IAAI,aAAa,CAkDhD;AAID,wBAAgB,OAAO,IAAI,IAAI,CAU9B"}
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initDb = initDb;
7
+ exports.getDb = getDb;
8
+ exports.insertCostRecord = insertCostRecord;
9
+ exports.getDailySpend = getDailySpend;
10
+ exports.getMonthlySpend = getMonthlySpend;
11
+ exports.getBudgetStatus = getBudgetStatus;
12
+ exports.getCostSummary = getCostSummary;
13
+ exports.getCacheEntry = getCacheEntry;
14
+ exports.setCacheEntry = setCacheEntry;
15
+ exports.clearCache = clearCache;
16
+ exports.getBudgetConfig = getBudgetConfig;
17
+ exports.setBudgetConfig = setBudgetConfig;
18
+ exports.getDashboardData = getDashboardData;
19
+ exports.closeDb = closeDb;
20
+ const sql_js_1 = __importDefault(require("sql.js"));
21
+ const fs_1 = __importDefault(require("fs"));
22
+ const path_1 = __importDefault(require("path"));
23
+ const config_1 = require("./config");
24
+ let db = null;
25
+ let dbPath = '';
26
+ let saveTimer = null;
27
+ /**
28
+ * Get or initialize the database. sql.js is async so we init once.
29
+ */
30
+ async function initDb() {
31
+ if (db)
32
+ return db;
33
+ dbPath = (0, config_1.getDbPath)();
34
+ const dir = path_1.default.dirname(dbPath);
35
+ if (!fs_1.default.existsSync(dir)) {
36
+ fs_1.default.mkdirSync(dir, { recursive: true });
37
+ }
38
+ const SQL = await (0, sql_js_1.default)();
39
+ // Load existing database if it exists
40
+ if (fs_1.default.existsSync(dbPath)) {
41
+ const fileBuffer = fs_1.default.readFileSync(dbPath);
42
+ db = new SQL.Database(fileBuffer);
43
+ }
44
+ else {
45
+ db = new SQL.Database();
46
+ }
47
+ migrate(db);
48
+ config_1.log.info('Database initialized and migrated');
49
+ // Auto-save every 5 seconds if dirty
50
+ saveTimer = setInterval(() => {
51
+ saveDb();
52
+ }, 5000).unref();
53
+ return db;
54
+ }
55
+ /**
56
+ * Synchronous access — throws if not initialized yet.
57
+ * Call initDb() during server startup before using this.
58
+ */
59
+ function getDb() {
60
+ if (!db) {
61
+ throw new Error('Database not initialized. Call initDb() first.');
62
+ }
63
+ return db;
64
+ }
65
+ function migrate(database) {
66
+ database.run(`
67
+ CREATE TABLE IF NOT EXISTS cost_records (
68
+ id TEXT PRIMARY KEY,
69
+ request_id TEXT NOT NULL,
70
+ timestamp TEXT NOT NULL,
71
+ provider TEXT NOT NULL,
72
+ model TEXT NOT NULL,
73
+ task_type TEXT NOT NULL,
74
+ input_tokens INTEGER NOT NULL,
75
+ output_tokens INTEGER NOT NULL,
76
+ input_cost REAL NOT NULL,
77
+ output_cost REAL NOT NULL,
78
+ total_cost REAL NOT NULL,
79
+ latency_ms INTEGER NOT NULL,
80
+ cached INTEGER NOT NULL DEFAULT 0
81
+ );
82
+ `);
83
+ database.run(`CREATE INDEX IF NOT EXISTS idx_cost_timestamp ON cost_records(timestamp);`);
84
+ database.run(`CREATE INDEX IF NOT EXISTS idx_cost_provider ON cost_records(provider);`);
85
+ database.run(`CREATE INDEX IF NOT EXISTS idx_cost_model ON cost_records(model);`);
86
+ database.run(`
87
+ CREATE TABLE IF NOT EXISTS cache_entries (
88
+ prompt_hash TEXT PRIMARY KEY,
89
+ model TEXT NOT NULL,
90
+ provider TEXT NOT NULL,
91
+ response TEXT NOT NULL,
92
+ input_tokens INTEGER NOT NULL,
93
+ output_tokens INTEGER NOT NULL,
94
+ cost REAL NOT NULL,
95
+ created_at INTEGER NOT NULL,
96
+ expires_at INTEGER NOT NULL,
97
+ hit_count INTEGER NOT NULL DEFAULT 0
98
+ );
99
+ `);
100
+ database.run(`CREATE INDEX IF NOT EXISTS idx_cache_expires ON cache_entries(expires_at);`);
101
+ database.run(`
102
+ CREATE TABLE IF NOT EXISTS budget_config (
103
+ key TEXT PRIMARY KEY,
104
+ value TEXT NOT NULL
105
+ );
106
+ `);
107
+ database.run(`
108
+ CREATE TABLE IF NOT EXISTS api_keys (
109
+ provider TEXT PRIMARY KEY,
110
+ encrypted_key TEXT NOT NULL,
111
+ updated_at TEXT NOT NULL
112
+ );
113
+ `);
114
+ config_1.log.info('Database initialized and migrated');
115
+ }
116
+ function saveDb() {
117
+ if (!db || !dbPath)
118
+ return;
119
+ try {
120
+ const data = db.export();
121
+ const buffer = Buffer.from(data);
122
+ fs_1.default.writeFileSync(dbPath, buffer);
123
+ }
124
+ catch (err) {
125
+ config_1.log.error('Failed to save database', err);
126
+ }
127
+ }
128
+ // ---- Helper to query single row ----
129
+ function queryOne(sql, params = []) {
130
+ const database = getDb();
131
+ const stmt = database.prepare(sql);
132
+ stmt.bind(params);
133
+ try {
134
+ if (stmt.step()) {
135
+ const row = stmt.getAsObject();
136
+ return row;
137
+ }
138
+ return null;
139
+ }
140
+ finally {
141
+ stmt.free();
142
+ }
143
+ }
144
+ function queryAll(sql, params = []) {
145
+ const database = getDb();
146
+ const stmt = database.prepare(sql);
147
+ stmt.bind(params);
148
+ const results = [];
149
+ try {
150
+ while (stmt.step()) {
151
+ results.push(stmt.getAsObject());
152
+ }
153
+ return results;
154
+ }
155
+ finally {
156
+ stmt.free();
157
+ }
158
+ }
159
+ // ---- Cost Record Operations ----
160
+ function insertCostRecord(record) {
161
+ const database = getDb();
162
+ database.run(`INSERT INTO cost_records (id, request_id, timestamp, provider, model, task_type,
163
+ input_tokens, output_tokens, input_cost, output_cost, total_cost, latency_ms, cached)
164
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
165
+ record.id,
166
+ record.requestId,
167
+ record.timestamp,
168
+ record.provider,
169
+ record.model,
170
+ record.taskType,
171
+ record.inputTokens,
172
+ record.outputTokens,
173
+ record.inputCost,
174
+ record.outputCost,
175
+ record.totalCost,
176
+ record.latencyMs,
177
+ record.cached ? 1 : 0,
178
+ ]);
179
+ saveDb();
180
+ }
181
+ function getDailySpend() {
182
+ const todayStr = new Date().toISOString().slice(0, 10);
183
+ const row = queryOne(`SELECT COALESCE(SUM(total_cost), 0) as spent FROM cost_records WHERE timestamp >= ?`, [todayStr]);
184
+ return row?.spent ?? 0;
185
+ }
186
+ function getMonthlySpend() {
187
+ const now = new Date();
188
+ const monthStart = new Date(now.getFullYear(), now.getMonth(), 1).toISOString();
189
+ const row = queryOne(`SELECT COALESCE(SUM(total_cost), 0) as spent FROM cost_records WHERE timestamp >= ?`, [monthStart]);
190
+ return row?.spent ?? 0;
191
+ }
192
+ function getBudgetStatus(config) {
193
+ const dailySpent = getDailySpend();
194
+ const monthlySpent = getMonthlySpend();
195
+ return {
196
+ daily: {
197
+ spent: dailySpent,
198
+ limit: config.dailyBudget,
199
+ remaining: Math.max(0, config.dailyBudget - dailySpent),
200
+ percentUsed: config.dailyBudget > 0 ? (dailySpent / config.dailyBudget) * 100 : 0,
201
+ },
202
+ monthly: {
203
+ spent: monthlySpent,
204
+ limit: config.monthlyBudget,
205
+ remaining: Math.max(0, config.monthlyBudget - monthlySpent),
206
+ percentUsed: config.monthlyBudget > 0 ? (monthlySpent / config.monthlyBudget) * 100 : 0,
207
+ },
208
+ };
209
+ }
210
+ function getCostSummary(days = 30) {
211
+ const since = new Date(Date.now() - days * 86400000).toISOString();
212
+ const total = queryOne(`SELECT
213
+ COALESCE(SUM(total_cost), 0) as totalSpent,
214
+ COUNT(*) as totalRequests,
215
+ COALESCE(SUM(input_tokens), 0) as totalInputTokens,
216
+ COALESCE(SUM(output_tokens), 0) as totalOutputTokens,
217
+ COALESCE(SUM(CASE WHEN cached = 1 THEN 1 ELSE 0 END), 0) as cacheHits,
218
+ COALESCE(AVG(latency_ms), 0) as averageLatencyMs
219
+ FROM cost_records
220
+ WHERE timestamp >= ?`, [since]);
221
+ const providerRows = queryAll(`SELECT provider,
222
+ COALESCE(SUM(total_cost), 0) as totalSpent,
223
+ COUNT(*) as requestCount,
224
+ COALESCE(SUM(input_tokens), 0) as inputTokens,
225
+ COALESCE(SUM(output_tokens), 0) as outputTokens
226
+ FROM cost_records
227
+ WHERE timestamp >= ?
228
+ GROUP BY provider`, [since]);
229
+ const modelRows = queryAll(`SELECT model,
230
+ COALESCE(SUM(total_cost), 0) as totalSpent,
231
+ COUNT(*) as requestCount,
232
+ COALESCE(SUM(input_tokens), 0) as inputTokens,
233
+ COALESCE(SUM(output_tokens), 0) as outputTokens,
234
+ COALESCE(AVG(latency_ms), 0) as averageLatencyMs
235
+ FROM cost_records
236
+ WHERE timestamp >= ?
237
+ GROUP BY model`, [since]);
238
+ const totalSpent = total?.totalSpent ?? 0;
239
+ const totalRequests = total?.totalRequests ?? 0;
240
+ const totalInputTokens = total?.totalInputTokens ?? 0;
241
+ const totalOutputTokens = total?.totalOutputTokens ?? 0;
242
+ const cacheHits = total?.cacheHits ?? 0;
243
+ const averageLatencyMs = total?.averageLatencyMs ?? 0;
244
+ const gpt4OutputCost = (totalOutputTokens / 1000000) * 30;
245
+ const gpt4InputCost = (totalInputTokens / 1000000) * 10;
246
+ const savingsVsGpt4 = Math.max(0, (gpt4InputCost + gpt4OutputCost) - totalSpent);
247
+ const byProvider = {};
248
+ for (const row of providerRows) {
249
+ byProvider[row.provider] = {
250
+ totalSpent: row.totalSpent,
251
+ requestCount: row.requestCount,
252
+ inputTokens: row.inputTokens,
253
+ outputTokens: row.outputTokens,
254
+ };
255
+ }
256
+ const byModel = {};
257
+ for (const row of modelRows) {
258
+ byModel[row.model] = {
259
+ totalSpent: row.totalSpent,
260
+ requestCount: row.requestCount,
261
+ inputTokens: row.inputTokens,
262
+ outputTokens: row.outputTokens,
263
+ averageLatencyMs: row.averageLatencyMs,
264
+ };
265
+ }
266
+ return {
267
+ totalSpent,
268
+ totalRequests,
269
+ totalInputTokens,
270
+ totalOutputTokens,
271
+ cacheHitRate: totalRequests > 0 ? cacheHits / totalRequests : 0,
272
+ averageLatencyMs,
273
+ byProvider: byProvider,
274
+ byModel,
275
+ savingsVsGpt4,
276
+ };
277
+ }
278
+ // ---- Cache Operations ----
279
+ function getCacheEntry(promptHash) {
280
+ const database = getDb();
281
+ const now = Date.now();
282
+ // Clean expired entries
283
+ database.run('DELETE FROM cache_entries WHERE expires_at < ?', [now]);
284
+ const row = queryOne(`SELECT prompt_hash, model, provider, response, input_tokens, output_tokens,
285
+ cost, created_at, expires_at, hit_count
286
+ FROM cache_entries WHERE prompt_hash = ? AND expires_at > ?`, [promptHash, now]);
287
+ if (row) {
288
+ database.run('UPDATE cache_entries SET hit_count = hit_count + 1 WHERE prompt_hash = ?', [promptHash]);
289
+ const entry = {
290
+ promptHash: row['prompt_hash'],
291
+ model: row['model'],
292
+ provider: row['provider'],
293
+ response: row['response'],
294
+ inputTokens: row['input_tokens'],
295
+ outputTokens: row['output_tokens'],
296
+ cost: row['cost'],
297
+ createdAt: row['created_at'],
298
+ expiresAt: row['expires_at'],
299
+ hitCount: (row['hit_count'] ?? 0) + 1,
300
+ };
301
+ return entry;
302
+ }
303
+ return null;
304
+ }
305
+ function setCacheEntry(entry) {
306
+ const database = getDb();
307
+ database.run(`INSERT OR REPLACE INTO cache_entries
308
+ (prompt_hash, model, provider, response, input_tokens, output_tokens, cost, created_at, expires_at, hit_count)
309
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
310
+ entry.promptHash,
311
+ entry.model,
312
+ entry.provider,
313
+ entry.response,
314
+ entry.inputTokens,
315
+ entry.outputTokens,
316
+ entry.cost,
317
+ entry.createdAt,
318
+ entry.expiresAt,
319
+ entry.hitCount,
320
+ ]);
321
+ saveDb();
322
+ }
323
+ function clearCache() {
324
+ const database = getDb();
325
+ // Get count before clearing
326
+ const countRow = queryOne('SELECT COUNT(*) as cnt FROM cache_entries');
327
+ database.run('DELETE FROM cache_entries');
328
+ saveDb();
329
+ return countRow?.cnt ?? 0;
330
+ }
331
+ // ---- Budget Config Operations ----
332
+ function getBudgetConfig() {
333
+ const dailyRow = queryOne("SELECT value FROM budget_config WHERE key = 'dailyBudget'");
334
+ const monthlyRow = queryOne("SELECT value FROM budget_config WHERE key = 'monthlyBudget'");
335
+ const capRow = queryOne("SELECT value FROM budget_config WHERE key = 'perRequestCap'");
336
+ return {
337
+ dailyBudget: dailyRow ? parseFloat(dailyRow.value) : 10,
338
+ monthlyBudget: monthlyRow ? parseFloat(monthlyRow.value) : 200,
339
+ perRequestCap: capRow ? parseFloat(capRow.value) : 1,
340
+ };
341
+ }
342
+ function setBudgetConfig(config) {
343
+ const database = getDb();
344
+ if (config.dailyBudget !== undefined) {
345
+ database.run("INSERT OR REPLACE INTO budget_config (key, value) VALUES ('dailyBudget', ?)", [
346
+ config.dailyBudget.toString(),
347
+ ]);
348
+ }
349
+ if (config.monthlyBudget !== undefined) {
350
+ database.run("INSERT OR REPLACE INTO budget_config (key, value) VALUES ('monthlyBudget', ?)", [
351
+ config.monthlyBudget.toString(),
352
+ ]);
353
+ }
354
+ if (config.perRequestCap !== undefined) {
355
+ database.run("INSERT OR REPLACE INTO budget_config (key, value) VALUES ('perRequestCap', ?)", [
356
+ config.perRequestCap.toString(),
357
+ ]);
358
+ }
359
+ saveDb();
360
+ }
361
+ // ---- Dashboard Data ----
362
+ function getDashboardData() {
363
+ const summary = getCostSummary(30);
364
+ const budget = getBudgetStatus(getBudgetConfig());
365
+ const recentReqRows = queryAll(`SELECT timestamp as time, model, provider, task_type as taskType,
366
+ total_cost as cost, (input_tokens + output_tokens) as tokens, cached
367
+ FROM cost_records
368
+ ORDER BY timestamp DESC
369
+ LIMIT 50`);
370
+ const recentReqs = recentReqRows.map((r) => ({
371
+ time: r['time'],
372
+ model: r['model'],
373
+ provider: r['provider'],
374
+ taskType: r['taskType'],
375
+ cost: r['cost'],
376
+ tokens: r['tokens'],
377
+ cached: Boolean(r['cached']),
378
+ }));
379
+ const costByDay = queryAll(`SELECT DATE(timestamp) as date, SUM(total_cost) as cost, COUNT(*) as requests
380
+ FROM cost_records
381
+ WHERE timestamp >= datetime('now', '-30 days')
382
+ GROUP BY DATE(timestamp)
383
+ ORDER BY date DESC`);
384
+ const modelDist = queryAll(`SELECT model, COUNT(*) as count, SUM(total_cost) as cost
385
+ FROM cost_records
386
+ WHERE timestamp >= datetime('now', '-30 days')
387
+ GROUP BY model
388
+ ORDER BY count DESC`);
389
+ return {
390
+ overview: {
391
+ totalSpent: summary.totalSpent,
392
+ totalRequests: summary.totalRequests,
393
+ totalSaved: summary.savingsVsGpt4,
394
+ cacheHitRate: summary.cacheHitRate,
395
+ },
396
+ budget,
397
+ recentRequests: recentReqs,
398
+ costByDay,
399
+ modelDistribution: modelDist,
400
+ };
401
+ }
402
+ // ---- Cleanup ----
403
+ function closeDb() {
404
+ if (saveTimer) {
405
+ clearInterval(saveTimer);
406
+ saveTimer = null;
407
+ }
408
+ if (db) {
409
+ saveDb();
410
+ db.close();
411
+ db = null;
412
+ }
413
+ }
414
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ProviderId, ChatMessage, ProxyResponse } from './types';
2
+ interface ProviderResponse {
3
+ content: string;
4
+ model: string;
5
+ inputTokens: number;
6
+ outputTokens: number;
7
+ finishReason: string;
8
+ }
9
+ /**
10
+ * Send a chat completion request to a specific provider.
11
+ * Translates the unified request format into the provider's native API format.
12
+ */
13
+ export declare function sendToProvider(providerId: ProviderId, model: string, messages: ChatMessage[], options: {
14
+ temperature?: number;
15
+ max_tokens?: number;
16
+ top_p?: number;
17
+ }): Promise<ProviderResponse>;
18
+ export declare function buildProxyResponse(providerResponse: ProviderResponse, providerId: ProviderId, requestId: string): ProxyResponse;
19
+ export {};
20
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAkB,MAAM,SAAS,CAAC;AAGtF,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,gBAAgB,CAAC,CAoB3B;AA2ND,wBAAgB,kBAAkB,CAChC,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM,GAChB,aAAa,CA6Cf"}