@ank1015/llm-sdk-adapters 0.0.1

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.
@@ -0,0 +1,344 @@
1
+ /**
2
+ * SQLite-based Usage Adapter
3
+ *
4
+ * Stores LLM usage data in ~/.llm/global/usages/messages.db
5
+ */
6
+ import { existsSync, mkdirSync } from 'node:fs';
7
+ import { homedir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import Database from 'better-sqlite3';
10
+ /** Default directory for storing database */
11
+ const DEFAULT_USAGES_DIR = join(homedir(), '.llm', 'global', 'usages');
12
+ /** Default database file name */
13
+ const DEFAULT_DB_NAME = 'messages.db';
14
+ /**
15
+ * Convert a database row to a BaseAssistantMessage
16
+ */
17
+ function rowToMessage(row) {
18
+ const message = {
19
+ role: 'assistant',
20
+ id: row.id,
21
+ api: row.api,
22
+ model: {
23
+ id: row.model_id,
24
+ name: row.model_name,
25
+ api: row.api,
26
+ // These fields are not stored, provide defaults
27
+ baseUrl: '',
28
+ reasoning: false,
29
+ input: [],
30
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
31
+ contextWindow: 0,
32
+ maxTokens: 0,
33
+ tools: [],
34
+ },
35
+ message: JSON.parse(row.native_message_json),
36
+ timestamp: row.timestamp,
37
+ duration: row.duration,
38
+ stopReason: row.stop_reason,
39
+ content: JSON.parse(row.content_json),
40
+ usage: {
41
+ input: row.input_tokens,
42
+ output: row.output_tokens,
43
+ cacheRead: row.cache_read_tokens,
44
+ cacheWrite: row.cache_write_tokens,
45
+ totalTokens: row.total_tokens,
46
+ cost: {
47
+ input: row.cost_input,
48
+ output: row.cost_output,
49
+ cacheRead: row.cost_cache_read,
50
+ cacheWrite: row.cost_cache_write,
51
+ total: row.cost_total,
52
+ },
53
+ },
54
+ };
55
+ // Only set errorMessage if it exists
56
+ if (row.error_message !== null) {
57
+ message.errorMessage = row.error_message;
58
+ }
59
+ return message;
60
+ }
61
+ /**
62
+ * SQLite-based implementation of UsageAdapter.
63
+ */
64
+ export class SqliteUsageAdapter {
65
+ db = null;
66
+ dbPath;
67
+ constructor(dbPath) {
68
+ const usagesDir = DEFAULT_USAGES_DIR;
69
+ this.dbPath = dbPath ?? join(usagesDir, DEFAULT_DB_NAME);
70
+ // Ensure directory exists
71
+ const dir = this.dbPath.substring(0, this.dbPath.lastIndexOf('/'));
72
+ if (!existsSync(dir)) {
73
+ mkdirSync(dir, { recursive: true });
74
+ }
75
+ }
76
+ /**
77
+ * Initialize the database connection.
78
+ */
79
+ getDb() {
80
+ if (this.db)
81
+ return this.db;
82
+ this.db = new Database(this.dbPath);
83
+ // Enable WAL mode for better concurrent access
84
+ this.db.pragma('journal_mode = WAL');
85
+ // Create messages table
86
+ this.db.exec(`
87
+ CREATE TABLE IF NOT EXISTS messages (
88
+ id TEXT PRIMARY KEY,
89
+ api TEXT NOT NULL,
90
+ model_id TEXT NOT NULL,
91
+ model_name TEXT NOT NULL,
92
+ timestamp INTEGER NOT NULL,
93
+ duration INTEGER NOT NULL,
94
+ stop_reason TEXT NOT NULL,
95
+ error_message TEXT,
96
+ input_tokens INTEGER NOT NULL,
97
+ output_tokens INTEGER NOT NULL,
98
+ cache_read_tokens INTEGER NOT NULL,
99
+ cache_write_tokens INTEGER NOT NULL,
100
+ total_tokens INTEGER NOT NULL,
101
+ cost_input REAL NOT NULL,
102
+ cost_output REAL NOT NULL,
103
+ cost_cache_read REAL NOT NULL,
104
+ cost_cache_write REAL NOT NULL,
105
+ cost_total REAL NOT NULL,
106
+ content_json TEXT NOT NULL,
107
+ native_message_json TEXT NOT NULL,
108
+ created_at INTEGER DEFAULT (strftime('%s', 'now'))
109
+ )
110
+ `);
111
+ // Create indexes for common queries
112
+ this.db.exec(`
113
+ CREATE INDEX IF NOT EXISTS idx_messages_api ON messages(api);
114
+ CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp);
115
+ CREATE INDEX IF NOT EXISTS idx_messages_model_id ON messages(model_id);
116
+ `);
117
+ return this.db;
118
+ }
119
+ async track(message) {
120
+ const db = this.getDb();
121
+ const stmt = db.prepare(`
122
+ INSERT OR REPLACE INTO messages (
123
+ id, api, model_id, model_name, timestamp, duration, stop_reason, error_message,
124
+ input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, total_tokens,
125
+ cost_input, cost_output, cost_cache_read, cost_cache_write, cost_total,
126
+ content_json, native_message_json
127
+ ) VALUES (
128
+ ?, ?, ?, ?, ?, ?, ?, ?,
129
+ ?, ?, ?, ?, ?,
130
+ ?, ?, ?, ?, ?,
131
+ ?, ?
132
+ )
133
+ `);
134
+ stmt.run(message.id, message.api, message.model.id, message.model.name, message.timestamp, message.duration, message.stopReason, message.errorMessage ?? null, message.usage.input, message.usage.output, message.usage.cacheRead, message.usage.cacheWrite, message.usage.totalTokens, message.usage.cost.input, message.usage.cost.output, message.usage.cost.cacheRead, message.usage.cost.cacheWrite, message.usage.cost.total, JSON.stringify(message.content), JSON.stringify(message.message));
135
+ }
136
+ async getMessage(id) {
137
+ const db = this.getDb();
138
+ const stmt = db.prepare('SELECT * FROM messages WHERE id = ?');
139
+ const row = stmt.get(id);
140
+ if (!row)
141
+ return undefined;
142
+ return rowToMessage(row);
143
+ }
144
+ async getMessages(filters) {
145
+ const db = this.getDb();
146
+ let query = 'SELECT * FROM messages WHERE 1=1';
147
+ const params = [];
148
+ if (filters?.api) {
149
+ query += ' AND api = ?';
150
+ params.push(filters.api);
151
+ }
152
+ if (filters?.modelId) {
153
+ query += ' AND model_id = ?';
154
+ params.push(filters.modelId);
155
+ }
156
+ if (filters?.startTime) {
157
+ query += ' AND timestamp >= ?';
158
+ params.push(filters.startTime);
159
+ }
160
+ if (filters?.endTime) {
161
+ query += ' AND timestamp <= ?';
162
+ params.push(filters.endTime);
163
+ }
164
+ query += ' ORDER BY timestamp DESC';
165
+ if (filters?.limit) {
166
+ query += ' LIMIT ?';
167
+ params.push(filters.limit);
168
+ }
169
+ if (filters?.offset) {
170
+ query += ' OFFSET ?';
171
+ params.push(filters.offset);
172
+ }
173
+ const stmt = db.prepare(query);
174
+ const rows = stmt.all(...params);
175
+ return rows.map((row) => rowToMessage(row));
176
+ }
177
+ async deleteMessage(id) {
178
+ const db = this.getDb();
179
+ const stmt = db.prepare('DELETE FROM messages WHERE id = ?');
180
+ const result = stmt.run(id);
181
+ return result.changes > 0;
182
+ }
183
+ async getStats(filters) {
184
+ const db = this.getDb();
185
+ let whereClause = 'WHERE 1=1';
186
+ const params = [];
187
+ if (filters?.api) {
188
+ whereClause += ' AND api = ?';
189
+ params.push(filters.api);
190
+ }
191
+ if (filters?.modelId) {
192
+ whereClause += ' AND model_id = ?';
193
+ params.push(filters.modelId);
194
+ }
195
+ if (filters?.startTime) {
196
+ whereClause += ' AND timestamp >= ?';
197
+ params.push(filters.startTime);
198
+ }
199
+ if (filters?.endTime) {
200
+ whereClause += ' AND timestamp <= ?';
201
+ params.push(filters.endTime);
202
+ }
203
+ // Get totals
204
+ const totalsStmt = db.prepare(`
205
+ SELECT
206
+ COUNT(*) as total_messages,
207
+ COALESCE(SUM(input_tokens), 0) as input_tokens,
208
+ COALESCE(SUM(output_tokens), 0) as output_tokens,
209
+ COALESCE(SUM(cache_read_tokens), 0) as cache_read_tokens,
210
+ COALESCE(SUM(cache_write_tokens), 0) as cache_write_tokens,
211
+ COALESCE(SUM(total_tokens), 0) as total_tokens,
212
+ COALESCE(SUM(cost_input), 0) as cost_input,
213
+ COALESCE(SUM(cost_output), 0) as cost_output,
214
+ COALESCE(SUM(cost_cache_read), 0) as cost_cache_read,
215
+ COALESCE(SUM(cost_cache_write), 0) as cost_cache_write,
216
+ COALESCE(SUM(cost_total), 0) as cost_total
217
+ FROM messages ${whereClause}
218
+ `);
219
+ const totals = totalsStmt.get(...params);
220
+ // Get by API
221
+ const byApiStmt = db.prepare(`
222
+ SELECT
223
+ api,
224
+ COUNT(*) as messages,
225
+ COALESCE(SUM(input_tokens), 0) as input_tokens,
226
+ COALESCE(SUM(output_tokens), 0) as output_tokens,
227
+ COALESCE(SUM(cache_read_tokens), 0) as cache_read_tokens,
228
+ COALESCE(SUM(cache_write_tokens), 0) as cache_write_tokens,
229
+ COALESCE(SUM(total_tokens), 0) as total_tokens,
230
+ COALESCE(SUM(cost_input), 0) as cost_input,
231
+ COALESCE(SUM(cost_output), 0) as cost_output,
232
+ COALESCE(SUM(cost_cache_read), 0) as cost_cache_read,
233
+ COALESCE(SUM(cost_cache_write), 0) as cost_cache_write,
234
+ COALESCE(SUM(cost_total), 0) as cost_total
235
+ FROM messages ${whereClause}
236
+ GROUP BY api
237
+ `);
238
+ const byApiRows = byApiStmt.all(...params);
239
+ const byApi = {};
240
+ for (const row of byApiRows) {
241
+ byApi[row.api] = {
242
+ messages: row.messages,
243
+ tokens: {
244
+ input: row.input_tokens,
245
+ output: row.output_tokens,
246
+ cacheRead: row.cache_read_tokens,
247
+ cacheWrite: row.cache_write_tokens,
248
+ total: row.total_tokens,
249
+ },
250
+ cost: {
251
+ input: row.cost_input,
252
+ output: row.cost_output,
253
+ cacheRead: row.cost_cache_read,
254
+ cacheWrite: row.cost_cache_write,
255
+ total: row.cost_total,
256
+ },
257
+ };
258
+ }
259
+ // Get by Model
260
+ const byModelStmt = db.prepare(`
261
+ SELECT
262
+ model_id,
263
+ api,
264
+ model_name,
265
+ COUNT(*) as messages,
266
+ COALESCE(SUM(input_tokens), 0) as input_tokens,
267
+ COALESCE(SUM(output_tokens), 0) as output_tokens,
268
+ COALESCE(SUM(cache_read_tokens), 0) as cache_read_tokens,
269
+ COALESCE(SUM(cache_write_tokens), 0) as cache_write_tokens,
270
+ COALESCE(SUM(total_tokens), 0) as total_tokens,
271
+ COALESCE(SUM(cost_input), 0) as cost_input,
272
+ COALESCE(SUM(cost_output), 0) as cost_output,
273
+ COALESCE(SUM(cost_cache_read), 0) as cost_cache_read,
274
+ COALESCE(SUM(cost_cache_write), 0) as cost_cache_write,
275
+ COALESCE(SUM(cost_total), 0) as cost_total
276
+ FROM messages ${whereClause}
277
+ GROUP BY model_id
278
+ `);
279
+ const byModelRows = byModelStmt.all(...params);
280
+ const byModel = {};
281
+ for (const row of byModelRows) {
282
+ byModel[row.model_id] = {
283
+ api: row.api,
284
+ modelName: row.model_name,
285
+ messages: row.messages,
286
+ tokens: {
287
+ input: row.input_tokens,
288
+ output: row.output_tokens,
289
+ cacheRead: row.cache_read_tokens,
290
+ cacheWrite: row.cache_write_tokens,
291
+ total: row.total_tokens,
292
+ },
293
+ cost: {
294
+ input: row.cost_input,
295
+ output: row.cost_output,
296
+ cacheRead: row.cost_cache_read,
297
+ cacheWrite: row.cost_cache_write,
298
+ total: row.cost_total,
299
+ },
300
+ };
301
+ }
302
+ return {
303
+ totalMessages: totals.total_messages,
304
+ tokens: {
305
+ input: totals.input_tokens,
306
+ output: totals.output_tokens,
307
+ cacheRead: totals.cache_read_tokens,
308
+ cacheWrite: totals.cache_write_tokens,
309
+ total: totals.total_tokens,
310
+ },
311
+ cost: {
312
+ input: totals.cost_input,
313
+ output: totals.cost_output,
314
+ cacheRead: totals.cost_cache_read,
315
+ cacheWrite: totals.cost_cache_write,
316
+ total: totals.cost_total,
317
+ },
318
+ byApi,
319
+ byModel,
320
+ };
321
+ }
322
+ /**
323
+ * Close the database connection.
324
+ */
325
+ close() {
326
+ if (this.db) {
327
+ this.db.close();
328
+ this.db = null;
329
+ }
330
+ }
331
+ /**
332
+ * Get the database file path.
333
+ */
334
+ getDbPath() {
335
+ return this.dbPath;
336
+ }
337
+ }
338
+ /**
339
+ * Create a SqliteUsageAdapter with the default database path.
340
+ */
341
+ export function createSqliteUsageAdapter(dbPath) {
342
+ return new SqliteUsageAdapter(dbPath);
343
+ }
344
+ //# sourceMappingURL=sqlite-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-usage.js","sourceRoot":"","sources":["../src/sqlite-usage.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@ank1015/llm-sdk-adapters",
3
+ "version": "0.0.1",
4
+ "description": "Node.js adapter implementations for @ank1015/llm-sdk (file-based keys, SQLite usage, JSONL sessions)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "keywords": [
18
+ "llm",
19
+ "sdk",
20
+ "adapters",
21
+ "sqlite",
22
+ "keys",
23
+ "sessions"
24
+ ],
25
+ "license": "MIT",
26
+ "dependencies": {
27
+ "better-sqlite3": "^11.0.0",
28
+ "@ank1015/llm-types": "^0.0.1",
29
+ "@ank1015/llm-core": "^0.0.1"
30
+ },
31
+ "devDependencies": {
32
+ "@anthropic-ai/claude-agent-sdk": "^0.2.42",
33
+ "@types/better-sqlite3": "^7.6.11",
34
+ "vitest": "^2.1.0"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc",
38
+ "dev": "tsc --watch",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest",
41
+ "test:unit": "vitest run tests/unit",
42
+ "test:integration": "vitest run tests/integration",
43
+ "keys-ui": "node dist/keys-ui.js",
44
+ "typecheck": "tsc --noEmit",
45
+ "lint": "echo 'No linter configured yet'",
46
+ "clean": "rm -rf dist *.tsbuildinfo"
47
+ }
48
+ }