ai-experiments 2.1.3 → 2.3.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.
- package/CHANGELOG.md +9 -0
- package/README.md +13 -1
- package/package.json +16 -16
- package/src/clickhouse-storage.ts +698 -0
- package/src/decide.ts +8 -10
- package/src/experiment.ts +12 -12
- package/src/index.ts +13 -3
- package/src/tracking.ts +3 -3
- package/test/cartesian.test.ts +287 -0
- package/test/clickhouse-storage.test.ts +470 -0
- package/test/decide.test.ts +414 -0
- package/test/experiment.test.ts +473 -0
- package/test/tracking.test.ts +347 -0
- package/vitest.config.ts +34 -0
- package/.turbo/turbo-build.log +0 -4
- package/LICENSE +0 -21
- package/dist/cartesian.d.ts +0 -140
- package/dist/cartesian.d.ts.map +0 -1
- package/dist/cartesian.js +0 -216
- package/dist/cartesian.js.map +0 -1
- package/dist/chdb-storage.d.ts +0 -135
- package/dist/chdb-storage.d.ts.map +0 -1
- package/dist/chdb-storage.js +0 -468
- package/dist/chdb-storage.js.map +0 -1
- package/dist/decide.d.ts +0 -152
- package/dist/decide.d.ts.map +0 -1
- package/dist/decide.js +0 -329
- package/dist/decide.js.map +0 -1
- package/dist/experiment.d.ts +0 -53
- package/dist/experiment.d.ts.map +0 -1
- package/dist/experiment.js +0 -292
- package/dist/experiment.js.map +0 -1
- package/dist/index.d.ts +0 -16
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -21
- package/dist/index.js.map +0 -1
- package/dist/tracking.d.ts +0 -159
- package/dist/tracking.d.ts.map +0 -1
- package/dist/tracking.js +0 -310
- package/dist/tracking.js.map +0 -1
- package/dist/types.d.ts +0 -198
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -5
- package/dist/types.js.map +0 -1
- package/src/cartesian.js +0 -215
- package/src/chdb-storage.js +0 -464
- package/src/chdb-storage.ts +0 -567
- package/src/decide.js +0 -328
- package/src/experiment.js +0 -291
- package/src/index.js +0 -20
- package/src/tracking.js +0 -309
- package/src/types.js +0 -4
package/dist/chdb-storage.js
DELETED
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ClickHouse storage backend for AI experiments using chdb (embedded ClickHouse)
|
|
3
|
-
*
|
|
4
|
-
* Design: Single flat table where experiment events are the atomic unit.
|
|
5
|
-
* Cartesian product results, variant comparisons, and winner analysis
|
|
6
|
-
* are all derived via aggregation queries.
|
|
7
|
-
*
|
|
8
|
-
* This maximizes compression and enables fast analytical queries across
|
|
9
|
-
* thousands of experiment runs.
|
|
10
|
-
*/
|
|
11
|
-
import { Session } from 'chdb';
|
|
12
|
-
const CREATE_TABLE_SQL = `
|
|
13
|
-
CREATE TABLE IF NOT EXISTS experiments (
|
|
14
|
-
-- Event identity
|
|
15
|
-
eventId String,
|
|
16
|
-
eventType LowCardinality(String),
|
|
17
|
-
timestamp DateTime64(3),
|
|
18
|
-
|
|
19
|
-
-- Experiment context
|
|
20
|
-
experimentId String,
|
|
21
|
-
experimentName String DEFAULT '',
|
|
22
|
-
|
|
23
|
-
-- Variant context
|
|
24
|
-
variantId String DEFAULT '',
|
|
25
|
-
variantName String DEFAULT '',
|
|
26
|
-
|
|
27
|
-
-- Cartesian product dimensions (stored as JSON for flexibility)
|
|
28
|
-
dimensions String DEFAULT '{}',
|
|
29
|
-
|
|
30
|
-
-- Execution data
|
|
31
|
-
runId String DEFAULT '',
|
|
32
|
-
success UInt8 DEFAULT 1,
|
|
33
|
-
durationMs UInt32 DEFAULT 0,
|
|
34
|
-
|
|
35
|
-
-- Result data
|
|
36
|
-
result String DEFAULT '{}',
|
|
37
|
-
metricName LowCardinality(String) DEFAULT '',
|
|
38
|
-
metricValue Float64 DEFAULT 0,
|
|
39
|
-
|
|
40
|
-
-- Error tracking
|
|
41
|
-
errorMessage String DEFAULT '',
|
|
42
|
-
errorStack String DEFAULT '',
|
|
43
|
-
|
|
44
|
-
-- Metadata
|
|
45
|
-
metadata String DEFAULT '{}'
|
|
46
|
-
)
|
|
47
|
-
ENGINE = MergeTree()
|
|
48
|
-
ORDER BY (experimentId, variantId, timestamp, eventId)
|
|
49
|
-
SETTINGS index_granularity = 8192
|
|
50
|
-
`;
|
|
51
|
-
export class ChdbStorage {
|
|
52
|
-
options;
|
|
53
|
-
session;
|
|
54
|
-
initialized = false;
|
|
55
|
-
eventCounter = 0;
|
|
56
|
-
constructor(options = {}) {
|
|
57
|
-
this.options = options;
|
|
58
|
-
this.session = new Session(options.dataPath ?? './.experiments-chdb');
|
|
59
|
-
}
|
|
60
|
-
async init() {
|
|
61
|
-
if (this.initialized)
|
|
62
|
-
return;
|
|
63
|
-
if (this.options.autoInit !== false) {
|
|
64
|
-
this.session.query(CREATE_TABLE_SQL);
|
|
65
|
-
}
|
|
66
|
-
this.initialized = true;
|
|
67
|
-
}
|
|
68
|
-
escapeString(s) {
|
|
69
|
-
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
70
|
-
}
|
|
71
|
-
toJson(value) {
|
|
72
|
-
return JSON.stringify(value ?? {});
|
|
73
|
-
}
|
|
74
|
-
parseJson(value) {
|
|
75
|
-
try {
|
|
76
|
-
return JSON.parse(value || '{}');
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return {};
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
nextEventId() {
|
|
83
|
-
return `evt-${Date.now()}-${++this.eventCounter}`;
|
|
84
|
-
}
|
|
85
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
86
|
-
// TrackingBackend Implementation
|
|
87
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
88
|
-
async track(event) {
|
|
89
|
-
await this.init();
|
|
90
|
-
const eventId = this.nextEventId();
|
|
91
|
-
const timestamp = event.timestamp.toISOString();
|
|
92
|
-
const data = event.data;
|
|
93
|
-
// Extract standard fields from event data
|
|
94
|
-
const experimentId = String(data.experimentId ?? '');
|
|
95
|
-
const experimentName = String(data.experimentName ?? '');
|
|
96
|
-
const variantId = String(data.variantId ?? '');
|
|
97
|
-
const variantName = String(data.variantName ?? '');
|
|
98
|
-
const runId = String(data.runId ?? '');
|
|
99
|
-
const success = data.success !== false ? 1 : 0;
|
|
100
|
-
const durationMs = Number(data.duration ?? data.durationMs ?? 0);
|
|
101
|
-
const metricName = String(data.metricName ?? '');
|
|
102
|
-
const metricValue = Number(data.metricValue ?? 0);
|
|
103
|
-
const errorMessage = data.error instanceof Error ? data.error.message : String(data.errorMessage ?? '');
|
|
104
|
-
const errorStack = data.error instanceof Error ? (data.error.stack ?? '') : '';
|
|
105
|
-
// Extract dimensions (for cartesian product tracking)
|
|
106
|
-
const dimensions = data.dimensions ?? data.config ?? {};
|
|
107
|
-
const result = data.result ?? {};
|
|
108
|
-
const metadata = data.metadata ?? {};
|
|
109
|
-
this.session.query(`
|
|
110
|
-
INSERT INTO experiments (
|
|
111
|
-
eventId, eventType, timestamp,
|
|
112
|
-
experimentId, experimentName,
|
|
113
|
-
variantId, variantName,
|
|
114
|
-
dimensions, runId, success, durationMs,
|
|
115
|
-
result, metricName, metricValue,
|
|
116
|
-
errorMessage, errorStack, metadata
|
|
117
|
-
) VALUES (
|
|
118
|
-
'${eventId}', '${event.type}', '${timestamp}',
|
|
119
|
-
'${this.escapeString(experimentId)}', '${this.escapeString(experimentName)}',
|
|
120
|
-
'${this.escapeString(variantId)}', '${this.escapeString(variantName)}',
|
|
121
|
-
'${this.escapeString(this.toJson(dimensions))}',
|
|
122
|
-
'${this.escapeString(runId)}', ${success}, ${durationMs},
|
|
123
|
-
'${this.escapeString(this.toJson(result))}',
|
|
124
|
-
'${this.escapeString(metricName)}', ${metricValue},
|
|
125
|
-
'${this.escapeString(errorMessage)}', '${this.escapeString(errorStack)}',
|
|
126
|
-
'${this.escapeString(this.toJson(metadata))}'
|
|
127
|
-
)
|
|
128
|
-
`);
|
|
129
|
-
}
|
|
130
|
-
async flush() {
|
|
131
|
-
// chdb writes are synchronous, nothing to flush
|
|
132
|
-
}
|
|
133
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
134
|
-
// Experiment Result Storage (direct API)
|
|
135
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
136
|
-
async storeResult(result) {
|
|
137
|
-
await this.track({
|
|
138
|
-
type: 'variant.complete',
|
|
139
|
-
timestamp: result.completedAt,
|
|
140
|
-
data: {
|
|
141
|
-
experimentId: result.experimentId,
|
|
142
|
-
variantId: result.variantId,
|
|
143
|
-
variantName: result.variantName,
|
|
144
|
-
runId: result.runId,
|
|
145
|
-
success: result.success,
|
|
146
|
-
duration: result.duration,
|
|
147
|
-
result: result.result,
|
|
148
|
-
metricValue: result.metricValue,
|
|
149
|
-
error: result.error,
|
|
150
|
-
metadata: result.metadata,
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
async storeResults(results) {
|
|
155
|
-
for (const result of results) {
|
|
156
|
-
await this.storeResult(result);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
160
|
-
// Analytics Queries
|
|
161
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
162
|
-
/**
|
|
163
|
-
* Get all experiments
|
|
164
|
-
*/
|
|
165
|
-
async getExperiments() {
|
|
166
|
-
await this.init();
|
|
167
|
-
const result = this.session.query(`
|
|
168
|
-
SELECT
|
|
169
|
-
experimentId,
|
|
170
|
-
any(experimentName) AS experimentName,
|
|
171
|
-
uniq(variantId) AS variantCount,
|
|
172
|
-
count() AS runCount,
|
|
173
|
-
min(timestamp) AS firstRun,
|
|
174
|
-
max(timestamp) AS lastRun
|
|
175
|
-
FROM experiments
|
|
176
|
-
WHERE experimentId != '' AND eventType = 'variant.complete'
|
|
177
|
-
GROUP BY experimentId
|
|
178
|
-
ORDER BY lastRun DESC
|
|
179
|
-
`, 'JSONEachRow');
|
|
180
|
-
if (!result.trim())
|
|
181
|
-
return [];
|
|
182
|
-
return result.trim().split('\n')
|
|
183
|
-
.filter(Boolean)
|
|
184
|
-
.map(line => JSON.parse(line));
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Get variant performance for an experiment
|
|
188
|
-
*/
|
|
189
|
-
async getVariantStats(experimentId) {
|
|
190
|
-
await this.init();
|
|
191
|
-
const result = this.session.query(`
|
|
192
|
-
SELECT
|
|
193
|
-
variantId,
|
|
194
|
-
any(variantName) AS variantName,
|
|
195
|
-
count() AS runCount,
|
|
196
|
-
countIf(success = 1) AS successCount,
|
|
197
|
-
countIf(success = 1) / count() AS successRate,
|
|
198
|
-
avg(durationMs) AS avgDuration,
|
|
199
|
-
avg(metricValue) AS avgMetric,
|
|
200
|
-
min(metricValue) AS minMetric,
|
|
201
|
-
max(metricValue) AS maxMetric
|
|
202
|
-
FROM experiments
|
|
203
|
-
WHERE experimentId = '${this.escapeString(experimentId)}'
|
|
204
|
-
AND eventType = 'variant.complete'
|
|
205
|
-
GROUP BY variantId
|
|
206
|
-
ORDER BY avgMetric DESC
|
|
207
|
-
`, 'JSONEachRow');
|
|
208
|
-
if (!result.trim())
|
|
209
|
-
return [];
|
|
210
|
-
return result.trim().split('\n')
|
|
211
|
-
.filter(Boolean)
|
|
212
|
-
.map(line => {
|
|
213
|
-
const row = JSON.parse(line);
|
|
214
|
-
return {
|
|
215
|
-
...row,
|
|
216
|
-
runCount: Number(row.runCount),
|
|
217
|
-
successCount: Number(row.successCount),
|
|
218
|
-
successRate: Number(row.successRate),
|
|
219
|
-
avgDuration: Number(row.avgDuration),
|
|
220
|
-
avgMetric: Number(row.avgMetric),
|
|
221
|
-
minMetric: Number(row.minMetric),
|
|
222
|
-
maxMetric: Number(row.maxMetric),
|
|
223
|
-
};
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Get the best performing variant for an experiment
|
|
228
|
-
*/
|
|
229
|
-
async getBestVariant(experimentId, options = {}) {
|
|
230
|
-
const { metric = 'avgMetric', minimumRuns = 1 } = options;
|
|
231
|
-
await this.init();
|
|
232
|
-
const orderBy = metric === 'avgDuration' ? 'ASC' : 'DESC';
|
|
233
|
-
const metricExpr = metric === 'successRate'
|
|
234
|
-
? 'countIf(success = 1) / count()'
|
|
235
|
-
: metric === 'avgDuration'
|
|
236
|
-
? 'avg(durationMs)'
|
|
237
|
-
: 'avg(metricValue)';
|
|
238
|
-
const result = this.session.query(`
|
|
239
|
-
SELECT
|
|
240
|
-
variantId,
|
|
241
|
-
any(variantName) AS variantName,
|
|
242
|
-
${metricExpr} AS metricValue,
|
|
243
|
-
count() AS runCount
|
|
244
|
-
FROM experiments
|
|
245
|
-
WHERE experimentId = '${this.escapeString(experimentId)}'
|
|
246
|
-
AND eventType = 'variant.complete'
|
|
247
|
-
GROUP BY variantId
|
|
248
|
-
HAVING runCount >= ${minimumRuns}
|
|
249
|
-
ORDER BY metricValue ${orderBy}
|
|
250
|
-
LIMIT 1
|
|
251
|
-
`, 'JSONEachRow');
|
|
252
|
-
if (!result.trim())
|
|
253
|
-
return null;
|
|
254
|
-
const firstLine = result.trim().split('\n')[0];
|
|
255
|
-
if (!firstLine)
|
|
256
|
-
return null;
|
|
257
|
-
const row = JSON.parse(firstLine);
|
|
258
|
-
return {
|
|
259
|
-
variantId: row.variantId,
|
|
260
|
-
variantName: row.variantName,
|
|
261
|
-
metricValue: Number(row.metricValue),
|
|
262
|
-
runCount: Number(row.runCount),
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Get cartesian product analysis - performance by dimension values
|
|
267
|
-
*/
|
|
268
|
-
async getCartesianAnalysis(experimentId, dimension) {
|
|
269
|
-
await this.init();
|
|
270
|
-
const result = this.session.query(`
|
|
271
|
-
SELECT
|
|
272
|
-
JSONExtractString(dimensions, '${this.escapeString(dimension)}') AS dimensionValue,
|
|
273
|
-
count() AS runCount,
|
|
274
|
-
avg(metricValue) AS avgMetric,
|
|
275
|
-
countIf(success = 1) / count() AS successRate
|
|
276
|
-
FROM experiments
|
|
277
|
-
WHERE experimentId = '${this.escapeString(experimentId)}'
|
|
278
|
-
AND eventType = 'variant.complete'
|
|
279
|
-
AND dimensionValue != ''
|
|
280
|
-
GROUP BY dimensionValue
|
|
281
|
-
ORDER BY avgMetric DESC
|
|
282
|
-
`, 'JSONEachRow');
|
|
283
|
-
if (!result.trim())
|
|
284
|
-
return [];
|
|
285
|
-
return result.trim().split('\n')
|
|
286
|
-
.filter(Boolean)
|
|
287
|
-
.map(line => {
|
|
288
|
-
const row = JSON.parse(line);
|
|
289
|
-
return {
|
|
290
|
-
dimensionValue: row.dimensionValue,
|
|
291
|
-
runCount: Number(row.runCount),
|
|
292
|
-
avgMetric: Number(row.avgMetric),
|
|
293
|
-
successRate: Number(row.successRate),
|
|
294
|
-
};
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Get multi-dimensional cartesian analysis
|
|
299
|
-
*/
|
|
300
|
-
async getCartesianGrid(experimentId, dimensions) {
|
|
301
|
-
await this.init();
|
|
302
|
-
const dimExtracts = dimensions.map(d => `JSONExtractString(dimensions, '${this.escapeString(d)}') AS dim_${d}`).join(', ');
|
|
303
|
-
const dimGroupBy = dimensions.map(d => `dim_${d}`).join(', ');
|
|
304
|
-
const result = this.session.query(`
|
|
305
|
-
SELECT
|
|
306
|
-
${dimExtracts},
|
|
307
|
-
count() AS runCount,
|
|
308
|
-
avg(metricValue) AS avgMetric,
|
|
309
|
-
countIf(success = 1) / count() AS successRate
|
|
310
|
-
FROM experiments
|
|
311
|
-
WHERE experimentId = '${this.escapeString(experimentId)}'
|
|
312
|
-
AND eventType = 'variant.complete'
|
|
313
|
-
GROUP BY ${dimGroupBy}
|
|
314
|
-
ORDER BY avgMetric DESC
|
|
315
|
-
`, 'JSONEachRow');
|
|
316
|
-
if (!result.trim())
|
|
317
|
-
return [];
|
|
318
|
-
return result.trim().split('\n')
|
|
319
|
-
.filter(Boolean)
|
|
320
|
-
.map(line => {
|
|
321
|
-
const row = JSON.parse(line);
|
|
322
|
-
const dims = {};
|
|
323
|
-
for (const d of dimensions) {
|
|
324
|
-
dims[d] = row[`dim_${d}`];
|
|
325
|
-
}
|
|
326
|
-
return {
|
|
327
|
-
dimensions: dims,
|
|
328
|
-
runCount: Number(row.runCount),
|
|
329
|
-
avgMetric: Number(row.avgMetric),
|
|
330
|
-
successRate: Number(row.successRate),
|
|
331
|
-
};
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Get time series of experiment metrics
|
|
336
|
-
*/
|
|
337
|
-
async getTimeSeries(experimentId, options = {}) {
|
|
338
|
-
const { interval = 'day', variantId } = options;
|
|
339
|
-
await this.init();
|
|
340
|
-
const dateFunc = interval === 'hour'
|
|
341
|
-
? 'toStartOfHour(timestamp)'
|
|
342
|
-
: interval === 'week'
|
|
343
|
-
? 'toStartOfWeek(timestamp)'
|
|
344
|
-
: 'toStartOfDay(timestamp)';
|
|
345
|
-
const variantFilter = variantId
|
|
346
|
-
? `AND variantId = '${this.escapeString(variantId)}'`
|
|
347
|
-
: '';
|
|
348
|
-
const result = this.session.query(`
|
|
349
|
-
SELECT
|
|
350
|
-
${dateFunc} AS period,
|
|
351
|
-
count() AS runCount,
|
|
352
|
-
avg(metricValue) AS avgMetric,
|
|
353
|
-
countIf(success = 1) / count() AS successRate
|
|
354
|
-
FROM experiments
|
|
355
|
-
WHERE experimentId = '${this.escapeString(experimentId)}'
|
|
356
|
-
AND eventType = 'variant.complete'
|
|
357
|
-
${variantFilter}
|
|
358
|
-
GROUP BY period
|
|
359
|
-
ORDER BY period ASC
|
|
360
|
-
`, 'JSONEachRow');
|
|
361
|
-
if (!result.trim())
|
|
362
|
-
return [];
|
|
363
|
-
return result.trim().split('\n')
|
|
364
|
-
.filter(Boolean)
|
|
365
|
-
.map(line => {
|
|
366
|
-
const row = JSON.parse(line);
|
|
367
|
-
return {
|
|
368
|
-
period: row.period,
|
|
369
|
-
runCount: Number(row.runCount),
|
|
370
|
-
avgMetric: Number(row.avgMetric),
|
|
371
|
-
successRate: Number(row.successRate),
|
|
372
|
-
};
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Get raw events for an experiment
|
|
377
|
-
*/
|
|
378
|
-
async getEvents(experimentId, options = {}) {
|
|
379
|
-
const { eventType, variantId, limit = 100 } = options;
|
|
380
|
-
await this.init();
|
|
381
|
-
const filters = [`experimentId = '${this.escapeString(experimentId)}'`];
|
|
382
|
-
if (eventType)
|
|
383
|
-
filters.push(`eventType = '${this.escapeString(eventType)}'`);
|
|
384
|
-
if (variantId)
|
|
385
|
-
filters.push(`variantId = '${this.escapeString(variantId)}'`);
|
|
386
|
-
const result = this.session.query(`
|
|
387
|
-
SELECT
|
|
388
|
-
eventType,
|
|
389
|
-
timestamp,
|
|
390
|
-
experimentId,
|
|
391
|
-
experimentName,
|
|
392
|
-
variantId,
|
|
393
|
-
variantName,
|
|
394
|
-
dimensions,
|
|
395
|
-
runId,
|
|
396
|
-
success,
|
|
397
|
-
durationMs,
|
|
398
|
-
result,
|
|
399
|
-
metricName,
|
|
400
|
-
metricValue,
|
|
401
|
-
errorMessage,
|
|
402
|
-
metadata
|
|
403
|
-
FROM experiments
|
|
404
|
-
WHERE ${filters.join(' AND ')}
|
|
405
|
-
ORDER BY timestamp DESC
|
|
406
|
-
LIMIT ${limit}
|
|
407
|
-
`, 'JSONEachRow');
|
|
408
|
-
if (!result.trim())
|
|
409
|
-
return [];
|
|
410
|
-
return result.trim().split('\n')
|
|
411
|
-
.filter(Boolean)
|
|
412
|
-
.map(line => {
|
|
413
|
-
const row = JSON.parse(line);
|
|
414
|
-
return {
|
|
415
|
-
type: row.eventType,
|
|
416
|
-
timestamp: new Date(row.timestamp),
|
|
417
|
-
data: {
|
|
418
|
-
experimentId: row.experimentId,
|
|
419
|
-
experimentName: row.experimentName,
|
|
420
|
-
variantId: row.variantId,
|
|
421
|
-
variantName: row.variantName,
|
|
422
|
-
dimensions: this.parseJson(row.dimensions),
|
|
423
|
-
runId: row.runId,
|
|
424
|
-
success: row.success === 1,
|
|
425
|
-
duration: row.durationMs,
|
|
426
|
-
result: this.parseJson(row.result),
|
|
427
|
-
metricName: row.metricName,
|
|
428
|
-
metricValue: row.metricValue,
|
|
429
|
-
errorMessage: row.errorMessage,
|
|
430
|
-
metadata: this.parseJson(row.metadata),
|
|
431
|
-
},
|
|
432
|
-
};
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* Raw SQL query access for custom analytics
|
|
437
|
-
*/
|
|
438
|
-
query(sql, format = 'JSONEachRow') {
|
|
439
|
-
return this.session.query(sql, format);
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Close the storage (cleanup)
|
|
443
|
-
*/
|
|
444
|
-
close() {
|
|
445
|
-
// Session cleanup handled by chdb
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* Create a chdb storage backend for experiments
|
|
450
|
-
*
|
|
451
|
-
* @example
|
|
452
|
-
* ```ts
|
|
453
|
-
* import { configureTracking } from 'ai-experiments'
|
|
454
|
-
* import { createChdbBackend } from 'ai-experiments/storage'
|
|
455
|
-
*
|
|
456
|
-
* const storage = createChdbBackend({ dataPath: './.my-experiments' })
|
|
457
|
-
*
|
|
458
|
-
* configureTracking({ backend: storage })
|
|
459
|
-
*
|
|
460
|
-
* // Later: analyze results
|
|
461
|
-
* const best = await storage.getBestVariant('my-experiment')
|
|
462
|
-
* console.log(`Best variant: ${best.variantName} (${best.metricValue})`)
|
|
463
|
-
* ```
|
|
464
|
-
*/
|
|
465
|
-
export function createChdbBackend(options) {
|
|
466
|
-
return new ChdbStorage(options);
|
|
467
|
-
}
|
|
468
|
-
//# sourceMappingURL=chdb-storage.js.map
|
package/dist/chdb-storage.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chdb-storage.js","sourceRoot":"","sources":["../src/chdb-storage.ts"],"names":[],"mappings":"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"}
|
package/dist/decide.d.ts
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Decision making utilities
|
|
3
|
-
*/
|
|
4
|
-
import type { DecideOptions, DecisionResult } from './types.js';
|
|
5
|
-
/**
|
|
6
|
-
* Make a decision by evaluating and scoring multiple options
|
|
7
|
-
*
|
|
8
|
-
* Scores each option and returns the best one (highest score).
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```ts
|
|
12
|
-
* import { decide } from 'ai-experiments'
|
|
13
|
-
*
|
|
14
|
-
* // Simple decision with sync scoring
|
|
15
|
-
* const result = await decide({
|
|
16
|
-
* options: ['apple', 'banana', 'orange'],
|
|
17
|
-
* score: (fruit) => {
|
|
18
|
-
* const prices = { apple: 1.5, banana: 0.5, orange: 2.0 }
|
|
19
|
-
* return 1 / prices[fruit] // Lower price = higher score
|
|
20
|
-
* },
|
|
21
|
-
* })
|
|
22
|
-
* console.log(result.selected) // 'banana'
|
|
23
|
-
*
|
|
24
|
-
* // Decision with async scoring (AI-based)
|
|
25
|
-
* const result = await decide({
|
|
26
|
-
* options: [
|
|
27
|
-
* { prompt: 'Summarize in one sentence' },
|
|
28
|
-
* { prompt: 'Provide a detailed summary' },
|
|
29
|
-
* { prompt: 'Extract key points only' },
|
|
30
|
-
* ],
|
|
31
|
-
* score: async (option) => {
|
|
32
|
-
* const result = await ai.generate(option)
|
|
33
|
-
* return evaluateQuality(result)
|
|
34
|
-
* },
|
|
35
|
-
* context: 'Choosing best summarization approach',
|
|
36
|
-
* })
|
|
37
|
-
*
|
|
38
|
-
* // Get all options sorted by score
|
|
39
|
-
* const result = await decide({
|
|
40
|
-
* options: ['fast', 'accurate', 'balanced'],
|
|
41
|
-
* score: (approach) => evaluateApproach(approach),
|
|
42
|
-
* returnAll: true,
|
|
43
|
-
* })
|
|
44
|
-
* console.log(result.allOptions)
|
|
45
|
-
* // [
|
|
46
|
-
* // { option: 'balanced', score: 0.9 },
|
|
47
|
-
* // { option: 'accurate', score: 0.85 },
|
|
48
|
-
* // { option: 'fast', score: 0.7 },
|
|
49
|
-
* // ]
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export declare function decide<T>(options: DecideOptions<T>): Promise<DecisionResult<T>>;
|
|
53
|
-
/**
|
|
54
|
-
* Weighted random selection from options
|
|
55
|
-
*
|
|
56
|
-
* Each option has a weight, and selection probability is proportional to weight.
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```ts
|
|
60
|
-
* import { decideWeighted } from 'ai-experiments'
|
|
61
|
-
*
|
|
62
|
-
* const result = decideWeighted([
|
|
63
|
-
* { value: 'A', weight: 0.7 }, // 70% chance
|
|
64
|
-
* { value: 'B', weight: 0.2 }, // 20% chance
|
|
65
|
-
* { value: 'C', weight: 0.1 }, // 10% chance
|
|
66
|
-
* ])
|
|
67
|
-
*
|
|
68
|
-
* console.log(result) // Most likely 'A', but could be B or C
|
|
69
|
-
* ```
|
|
70
|
-
*/
|
|
71
|
-
export declare function decideWeighted<T>(options: Array<{
|
|
72
|
-
value: T;
|
|
73
|
-
weight: number;
|
|
74
|
-
}>): T;
|
|
75
|
-
/**
|
|
76
|
-
* Epsilon-greedy decision strategy
|
|
77
|
-
*
|
|
78
|
-
* With probability epsilon, select a random option (exploration).
|
|
79
|
-
* Otherwise, select the best option by score (exploitation).
|
|
80
|
-
*
|
|
81
|
-
* @example
|
|
82
|
-
* ```ts
|
|
83
|
-
* import { decideEpsilonGreedy } from 'ai-experiments'
|
|
84
|
-
*
|
|
85
|
-
* const result = await decideEpsilonGreedy({
|
|
86
|
-
* options: ['model-a', 'model-b', 'model-c'],
|
|
87
|
-
* score: async (model) => await evaluateModel(model),
|
|
88
|
-
* epsilon: 0.1, // 10% exploration, 90% exploitation
|
|
89
|
-
* })
|
|
90
|
-
* ```
|
|
91
|
-
*/
|
|
92
|
-
export declare function decideEpsilonGreedy<T>(options: DecideOptions<T> & {
|
|
93
|
-
epsilon: number;
|
|
94
|
-
}): Promise<DecisionResult<T>>;
|
|
95
|
-
/**
|
|
96
|
-
* Thompson sampling decision strategy
|
|
97
|
-
*
|
|
98
|
-
* Bayesian approach to balancing exploration and exploitation.
|
|
99
|
-
* Each option has a Beta distribution representing our belief about its true score.
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```ts
|
|
103
|
-
* import { decideThompsonSampling } from 'ai-experiments'
|
|
104
|
-
*
|
|
105
|
-
* // Track successes and failures for each option
|
|
106
|
-
* const priors = {
|
|
107
|
-
* 'variant-a': { alpha: 10, beta: 5 }, // 10 successes, 5 failures
|
|
108
|
-
* 'variant-b': { alpha: 8, beta: 3 }, // 8 successes, 3 failures
|
|
109
|
-
* 'variant-c': { alpha: 2, beta: 2 }, // 2 successes, 2 failures (uncertain)
|
|
110
|
-
* }
|
|
111
|
-
*
|
|
112
|
-
* const result = decideThompsonSampling(['variant-a', 'variant-b', 'variant-c'], priors)
|
|
113
|
-
* // More likely to select 'variant-b' (higher rate) but will sometimes explore 'variant-c'
|
|
114
|
-
* ```
|
|
115
|
-
*/
|
|
116
|
-
export declare function decideThompsonSampling<T extends string>(options: T[], priors: Record<T, {
|
|
117
|
-
alpha: number;
|
|
118
|
-
beta: number;
|
|
119
|
-
}>): T;
|
|
120
|
-
/**
|
|
121
|
-
* Upper Confidence Bound (UCB) decision strategy
|
|
122
|
-
*
|
|
123
|
-
* Select the option with the highest upper confidence bound.
|
|
124
|
-
* Balances exploration and exploitation using confidence intervals.
|
|
125
|
-
*
|
|
126
|
-
* @example
|
|
127
|
-
* ```ts
|
|
128
|
-
* import { decideUCB } from 'ai-experiments'
|
|
129
|
-
*
|
|
130
|
-
* const stats = {
|
|
131
|
-
* 'variant-a': { mean: 0.85, count: 100 },
|
|
132
|
-
* 'variant-b': { mean: 0.82, count: 50 }, // Less data, higher uncertainty
|
|
133
|
-
* 'variant-c': { mean: 0.78, count: 10 }, // Very uncertain
|
|
134
|
-
* }
|
|
135
|
-
*
|
|
136
|
-
* const result = decideUCB(['variant-a', 'variant-b', 'variant-c'], stats, {
|
|
137
|
-
* explorationFactor: 2.0,
|
|
138
|
-
* totalCount: 160,
|
|
139
|
-
* })
|
|
140
|
-
* // Might select variant-c to explore more, despite lower mean
|
|
141
|
-
* ```
|
|
142
|
-
*/
|
|
143
|
-
export declare function decideUCB<T extends string>(options: T[], stats: Record<T, {
|
|
144
|
-
mean: number;
|
|
145
|
-
count: number;
|
|
146
|
-
}>, config: {
|
|
147
|
-
/** Exploration factor (typically 1-2) */
|
|
148
|
-
explorationFactor: number;
|
|
149
|
-
/** Total number of trials across all options */
|
|
150
|
-
totalCount: number;
|
|
151
|
-
}): T;
|
|
152
|
-
//# sourceMappingURL=decide.d.ts.map
|
package/dist/decide.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decide.d.ts","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CA2C5B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3C,CAAC,CA0BH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CA6C5B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,OAAO,EAAE,CAAC,EAAE,EACZ,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,CAAC,CA+BH;AAuDD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EACxC,OAAO,EAAE,CAAC,EAAE,EACZ,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,MAAM,EAAE;IACN,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAA;IACzB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAA;CACnB,GACA,CAAC,CAwCH"}
|