@llmops/core 0.6.10 → 1.0.0-beta.2
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/dist/{bun-sqlite-dialect-C06VxkTn.cjs → bun-sqlite-dialect-CVUG5QUU.cjs} +1 -1
- package/dist/db/index.cjs +2 -2
- package/dist/db/index.d.cts +1 -1
- package/dist/db/index.d.mts +1 -1
- package/dist/db/index.mjs +1 -1
- package/dist/{db-CdAtHHw5.mjs → db-CZ8KtpL-.mjs} +7 -422
- package/dist/{db-D8otWwZL.cjs → db-DZv0NtMm.cjs} +8 -431
- package/dist/{index-D3onb7gK.d.mts → index-BlFAMkmT.d.mts} +519 -1471
- package/dist/{index-CyVFWq76.d.cts → index-DjIHdwhi.d.cts} +519 -1471
- package/dist/index.cjs +65 -1648
- package/dist/index.d.cts +157 -1663
- package/dist/index.d.mts +157 -1663
- package/dist/index.mjs +65 -1634
- package/dist/{neon-dialect-DIuEesTA.cjs → neon-dialect-BOnuygPe.cjs} +1 -1
- package/dist/{neon-dialect-ccr-mLKR.cjs → neon-dialect-ByrFa9iy.cjs} +1 -1
- package/dist/{node-sqlite-dialect-AU81Qz0n.cjs → node-sqlite-dialect-fwmW40Ar.cjs} +1 -1
- package/package.json +2 -4
package/dist/index.cjs
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
const require_db = require('./db-
|
|
2
|
-
const require_neon_dialect = require('./neon-dialect-
|
|
1
|
+
const require_db = require('./db-DZv0NtMm.cjs');
|
|
2
|
+
const require_neon_dialect = require('./neon-dialect-ByrFa9iy.cjs');
|
|
3
3
|
let __llmops_gateway = require("@llmops/gateway");
|
|
4
4
|
__llmops_gateway = require_db.__toESM(__llmops_gateway);
|
|
5
5
|
let kysely = require("kysely");
|
|
6
6
|
let node_path = require("node:path");
|
|
7
7
|
node_path = require_db.__toESM(node_path);
|
|
8
|
-
let __better_auth_utils_random = require("@better-auth/utils/random");
|
|
9
8
|
let node_crypto = require("node:crypto");
|
|
10
|
-
let json_logic_js = require("json-logic-js");
|
|
11
|
-
json_logic_js = require_db.__toESM(json_logic_js);
|
|
12
9
|
|
|
13
10
|
//#region src/constants/headers.ts
|
|
14
11
|
/**
|
|
@@ -633,9 +630,8 @@ const providersConfigSchema = require_db.array(inlineProviderConfigSchema).optio
|
|
|
633
630
|
* Base schema without refinements (used for transform)
|
|
634
631
|
*/
|
|
635
632
|
const llmopsConfigBaseSchema = require_db.object({
|
|
636
|
-
|
|
633
|
+
telemetry: require_db.any().optional(),
|
|
637
634
|
basePath: require_db.string().min(1, "Base path cannot be empty").refine((path) => path.startsWith("/"), "Base path must start with a forward slash").default("/llmops"),
|
|
638
|
-
schema: require_db.string().optional().default("llmops"),
|
|
639
635
|
providers: providersConfigSchema
|
|
640
636
|
});
|
|
641
637
|
const llmopsConfigSchema = llmopsConfigBaseSchema.transform((config) => ({
|
|
@@ -1160,8 +1156,13 @@ var CacheService = class {
|
|
|
1160
1156
|
|
|
1161
1157
|
//#endregion
|
|
1162
1158
|
//#region src/utils/id.ts
|
|
1159
|
+
const CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
1163
1160
|
const generateId = (size) => {
|
|
1164
|
-
|
|
1161
|
+
const length = size || 32;
|
|
1162
|
+
const bytes = (0, node_crypto.randomBytes)(length);
|
|
1163
|
+
let result = "";
|
|
1164
|
+
for (let i = 0; i < length; i++) result += CHARS[bytes[i] % 62];
|
|
1165
|
+
return result;
|
|
1165
1166
|
};
|
|
1166
1167
|
|
|
1167
1168
|
//#endregion
|
|
@@ -1176,339 +1177,6 @@ var LLMOpsError = class extends Error {
|
|
|
1176
1177
|
}
|
|
1177
1178
|
};
|
|
1178
1179
|
|
|
1179
|
-
//#endregion
|
|
1180
|
-
//#region src/datalayer/configs.ts
|
|
1181
|
-
/**
|
|
1182
|
-
* Generate a short unique ID for configs (8 characters, URL-safe)
|
|
1183
|
-
* Uses base62 encoding (a-z, A-Z, 0-9) for shorter, readable IDs
|
|
1184
|
-
*/
|
|
1185
|
-
function generateShortId(length = 8) {
|
|
1186
|
-
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
1187
|
-
const bytes = (0, node_crypto.randomBytes)(length);
|
|
1188
|
-
let result = "";
|
|
1189
|
-
for (let i = 0; i < length; i++) result += chars[bytes[i] % 62];
|
|
1190
|
-
return result;
|
|
1191
|
-
}
|
|
1192
|
-
const createNewConfig = require_db.zod_default.object({ name: require_db.zod_default.string() });
|
|
1193
|
-
const updateConfigName = require_db.zod_default.object({
|
|
1194
|
-
configId: require_db.zod_default.uuidv4(),
|
|
1195
|
-
newName: require_db.zod_default.string()
|
|
1196
|
-
});
|
|
1197
|
-
const getConfigById = require_db.zod_default.object({ configId: require_db.zod_default.uuidv4() });
|
|
1198
|
-
const deleteConfig = require_db.zod_default.object({ configId: require_db.zod_default.uuidv4() });
|
|
1199
|
-
const listConfigs = require_db.zod_default.object({
|
|
1200
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
1201
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
1202
|
-
});
|
|
1203
|
-
const createConfigDataLayer = (db) => {
|
|
1204
|
-
return {
|
|
1205
|
-
createNewConfig: async (params) => {
|
|
1206
|
-
const value = await createNewConfig.safeParseAsync(params);
|
|
1207
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1208
|
-
const { name } = value.data;
|
|
1209
|
-
return db.insertInto("configs").values({
|
|
1210
|
-
id: (0, node_crypto.randomUUID)(),
|
|
1211
|
-
slug: generateShortId(),
|
|
1212
|
-
name,
|
|
1213
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1214
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1215
|
-
}).returningAll().executeTakeFirst();
|
|
1216
|
-
},
|
|
1217
|
-
updateConfigName: async (params) => {
|
|
1218
|
-
const value = await updateConfigName.safeParseAsync(params);
|
|
1219
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1220
|
-
const { newName, configId } = value.data;
|
|
1221
|
-
return db.updateTable("configs").set({
|
|
1222
|
-
name: newName,
|
|
1223
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1224
|
-
}).where("id", "=", configId).returningAll().executeTakeFirst();
|
|
1225
|
-
},
|
|
1226
|
-
getConfigById: async (params) => {
|
|
1227
|
-
const value = await getConfigById.safeParseAsync(params);
|
|
1228
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1229
|
-
const { configId } = value.data;
|
|
1230
|
-
return db.selectFrom("configs").selectAll().where("id", "=", configId).executeTakeFirst();
|
|
1231
|
-
},
|
|
1232
|
-
deleteConfig: async (params) => {
|
|
1233
|
-
const value = await deleteConfig.safeParseAsync(params);
|
|
1234
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1235
|
-
const { configId } = value.data;
|
|
1236
|
-
return db.deleteFrom("configs").where("id", "=", configId).returningAll().executeTakeFirst();
|
|
1237
|
-
},
|
|
1238
|
-
listConfigs: async (params) => {
|
|
1239
|
-
const value = await listConfigs.safeParseAsync(params || {});
|
|
1240
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1241
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
1242
|
-
return db.selectFrom("configs").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
1243
|
-
},
|
|
1244
|
-
getConfigWithVariants: async (params) => {
|
|
1245
|
-
const value = await getConfigById.safeParseAsync(params);
|
|
1246
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1247
|
-
const { configId } = value.data;
|
|
1248
|
-
const configData = await db.selectFrom("configs").leftJoin("config_variants", "configs.id", "config_variants.configId").leftJoin("variants", "config_variants.variantId", "variants.id").select([
|
|
1249
|
-
"configs.id",
|
|
1250
|
-
"configs.slug",
|
|
1251
|
-
"configs.name",
|
|
1252
|
-
"configs.createdAt",
|
|
1253
|
-
"configs.updatedAt",
|
|
1254
|
-
"variants.id as variantId",
|
|
1255
|
-
"variants.name as variantName"
|
|
1256
|
-
]).where("configs.id", "=", configId).execute();
|
|
1257
|
-
const variantIds = configData.map((row) => row.variantId).filter((id) => id !== null);
|
|
1258
|
-
if (variantIds.length === 0) return configData.map((row) => ({
|
|
1259
|
-
...row,
|
|
1260
|
-
provider: null,
|
|
1261
|
-
modelName: null,
|
|
1262
|
-
jsonData: null,
|
|
1263
|
-
variantVersionId: null
|
|
1264
|
-
}));
|
|
1265
|
-
const latestVersions = await Promise.all(variantIds.map((variantId) => db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst()));
|
|
1266
|
-
const versionMap = new Map(latestVersions.filter((v) => v !== void 0).map((v) => [v.variantId, v]));
|
|
1267
|
-
return configData.map((row) => {
|
|
1268
|
-
const version = row.variantId ? versionMap.get(row.variantId) : null;
|
|
1269
|
-
return {
|
|
1270
|
-
...row,
|
|
1271
|
-
provider: version?.provider ?? null,
|
|
1272
|
-
modelName: version?.modelName ?? null,
|
|
1273
|
-
jsonData: version?.jsonData ?? null,
|
|
1274
|
-
variantVersionId: version?.id ?? null
|
|
1275
|
-
};
|
|
1276
|
-
});
|
|
1277
|
-
}
|
|
1278
|
-
};
|
|
1279
|
-
};
|
|
1280
|
-
|
|
1281
|
-
//#endregion
|
|
1282
|
-
//#region src/datalayer/configVariants.ts
|
|
1283
|
-
const createConfigVariant = require_db.zod_default.object({
|
|
1284
|
-
configId: require_db.zod_default.string().uuid(),
|
|
1285
|
-
variantId: require_db.zod_default.string().uuid()
|
|
1286
|
-
});
|
|
1287
|
-
const getConfigVariantById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
1288
|
-
const getConfigVariantsByConfigId = require_db.zod_default.object({
|
|
1289
|
-
configId: require_db.zod_default.string().uuid(),
|
|
1290
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
1291
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
1292
|
-
});
|
|
1293
|
-
const getConfigVariantsByVariantId = require_db.zod_default.object({
|
|
1294
|
-
variantId: require_db.zod_default.string().uuid(),
|
|
1295
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
1296
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
1297
|
-
});
|
|
1298
|
-
const deleteConfigVariant = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
1299
|
-
const deleteConfigVariantByIds = require_db.zod_default.object({
|
|
1300
|
-
configId: require_db.zod_default.string().uuid(),
|
|
1301
|
-
variantId: require_db.zod_default.string().uuid()
|
|
1302
|
-
});
|
|
1303
|
-
const listConfigVariants = require_db.zod_default.object({
|
|
1304
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
1305
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
1306
|
-
});
|
|
1307
|
-
const createVariantAndLinkToConfig = require_db.zod_default.object({
|
|
1308
|
-
configId: require_db.zod_default.string().uuid(),
|
|
1309
|
-
name: require_db.zod_default.string(),
|
|
1310
|
-
provider: require_db.zod_default.string(),
|
|
1311
|
-
modelName: require_db.zod_default.string(),
|
|
1312
|
-
jsonData: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional().default({})
|
|
1313
|
-
});
|
|
1314
|
-
const getVariantJsonDataForConfig = require_db.zod_default.object({
|
|
1315
|
-
configId: require_db.zod_default.string(),
|
|
1316
|
-
envSecret: require_db.zod_default.string().optional()
|
|
1317
|
-
});
|
|
1318
|
-
const createConfigVariantDataLayer = (db) => {
|
|
1319
|
-
return {
|
|
1320
|
-
createConfigVariant: async (params) => {
|
|
1321
|
-
const value = await createConfigVariant.safeParseAsync(params);
|
|
1322
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1323
|
-
const { configId, variantId } = value.data;
|
|
1324
|
-
return db.insertInto("config_variants").values({
|
|
1325
|
-
id: (0, node_crypto.randomUUID)(),
|
|
1326
|
-
configId,
|
|
1327
|
-
variantId,
|
|
1328
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1329
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1330
|
-
}).returningAll().executeTakeFirst();
|
|
1331
|
-
},
|
|
1332
|
-
getConfigVariantById: async (params) => {
|
|
1333
|
-
const value = await getConfigVariantById.safeParseAsync(params);
|
|
1334
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1335
|
-
const { id } = value.data;
|
|
1336
|
-
return db.selectFrom("config_variants").selectAll().where("id", "=", id).executeTakeFirst();
|
|
1337
|
-
},
|
|
1338
|
-
getConfigVariantsByConfigId: async (params) => {
|
|
1339
|
-
const value = await getConfigVariantsByConfigId.safeParseAsync(params);
|
|
1340
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1341
|
-
const { configId, limit = 100, offset = 0 } = value.data;
|
|
1342
|
-
return db.selectFrom("config_variants").selectAll().where("configId", "=", configId).orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
1343
|
-
},
|
|
1344
|
-
getConfigVariantsByVariantId: async (params) => {
|
|
1345
|
-
const value = await getConfigVariantsByVariantId.safeParseAsync(params);
|
|
1346
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1347
|
-
const { variantId, limit = 100, offset = 0 } = value.data;
|
|
1348
|
-
return db.selectFrom("config_variants").selectAll().where("variantId", "=", variantId).orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
1349
|
-
},
|
|
1350
|
-
deleteConfigVariant: async (params) => {
|
|
1351
|
-
const value = await deleteConfigVariant.safeParseAsync(params);
|
|
1352
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1353
|
-
const { id } = value.data;
|
|
1354
|
-
return db.deleteFrom("config_variants").where("id", "=", id).returningAll().executeTakeFirst();
|
|
1355
|
-
},
|
|
1356
|
-
deleteConfigVariantByIds: async (params) => {
|
|
1357
|
-
const value = await deleteConfigVariantByIds.safeParseAsync(params);
|
|
1358
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1359
|
-
const { configId, variantId } = value.data;
|
|
1360
|
-
return db.deleteFrom("config_variants").where("configId", "=", configId).where("variantId", "=", variantId).returningAll().executeTakeFirst();
|
|
1361
|
-
},
|
|
1362
|
-
listConfigVariants: async (params) => {
|
|
1363
|
-
const value = await listConfigVariants.safeParseAsync(params || {});
|
|
1364
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1365
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
1366
|
-
return db.selectFrom("config_variants").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
1367
|
-
},
|
|
1368
|
-
getConfigVariantWithDetails: async (params) => {
|
|
1369
|
-
const value = await getConfigVariantById.safeParseAsync(params);
|
|
1370
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1371
|
-
const { id } = value.data;
|
|
1372
|
-
const configVariant = await db.selectFrom("config_variants").leftJoin("configs", "config_variants.configId", "configs.id").leftJoin("variants", "config_variants.variantId", "variants.id").select([
|
|
1373
|
-
"config_variants.id",
|
|
1374
|
-
"config_variants.configId",
|
|
1375
|
-
"config_variants.variantId",
|
|
1376
|
-
"config_variants.createdAt",
|
|
1377
|
-
"config_variants.updatedAt",
|
|
1378
|
-
"configs.name as configName",
|
|
1379
|
-
"variants.name as variantName"
|
|
1380
|
-
]).where("config_variants.id", "=", id).executeTakeFirst();
|
|
1381
|
-
if (!configVariant) return;
|
|
1382
|
-
const latestVersion = await db.selectFrom("variant_versions").selectAll().where("variantId", "=", configVariant.variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
|
|
1383
|
-
return {
|
|
1384
|
-
...configVariant,
|
|
1385
|
-
latestVersion: latestVersion ?? null
|
|
1386
|
-
};
|
|
1387
|
-
},
|
|
1388
|
-
getConfigVariantsWithDetailsByConfigId: async (params) => {
|
|
1389
|
-
const value = await getConfigVariantsByConfigId.safeParseAsync(params);
|
|
1390
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1391
|
-
const { configId, limit = 100, offset = 0 } = value.data;
|
|
1392
|
-
const configVariants = await db.selectFrom("config_variants").leftJoin("variants", "config_variants.variantId", "variants.id").select([
|
|
1393
|
-
"config_variants.id",
|
|
1394
|
-
"config_variants.configId",
|
|
1395
|
-
"config_variants.variantId",
|
|
1396
|
-
"config_variants.createdAt",
|
|
1397
|
-
"config_variants.updatedAt",
|
|
1398
|
-
"variants.name"
|
|
1399
|
-
]).where("config_variants.configId", "=", configId).orderBy("config_variants.createdAt", "desc").limit(limit).offset(offset).execute();
|
|
1400
|
-
if (configVariants.length === 0) return [];
|
|
1401
|
-
return await Promise.all(configVariants.map(async (cv) => {
|
|
1402
|
-
const latestVersion = cv.variantId ? await db.selectFrom("variant_versions").selectAll().where("variantId", "=", cv.variantId).orderBy("version", "desc").limit(1).executeTakeFirst() : null;
|
|
1403
|
-
return {
|
|
1404
|
-
...cv,
|
|
1405
|
-
provider: latestVersion?.provider ?? null,
|
|
1406
|
-
modelName: latestVersion?.modelName ?? null,
|
|
1407
|
-
jsonData: latestVersion?.jsonData ?? null,
|
|
1408
|
-
latestVersion: latestVersion ?? null
|
|
1409
|
-
};
|
|
1410
|
-
}));
|
|
1411
|
-
},
|
|
1412
|
-
createVariantAndLinkToConfig: async (params) => {
|
|
1413
|
-
const value = await createVariantAndLinkToConfig.safeParseAsync(params);
|
|
1414
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1415
|
-
const { configId, name, provider, modelName, jsonData } = value.data;
|
|
1416
|
-
const variantId = (0, node_crypto.randomUUID)();
|
|
1417
|
-
const versionId = (0, node_crypto.randomUUID)();
|
|
1418
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1419
|
-
const variant = await db.insertInto("variants").values({
|
|
1420
|
-
id: variantId,
|
|
1421
|
-
name,
|
|
1422
|
-
createdAt: now,
|
|
1423
|
-
updatedAt: now
|
|
1424
|
-
}).returningAll().executeTakeFirst();
|
|
1425
|
-
if (!variant) throw new LLMOpsError("Failed to create variant");
|
|
1426
|
-
const version = await db.insertInto("variant_versions").values({
|
|
1427
|
-
id: versionId,
|
|
1428
|
-
variantId,
|
|
1429
|
-
version: 1,
|
|
1430
|
-
provider,
|
|
1431
|
-
modelName,
|
|
1432
|
-
jsonData: JSON.stringify(jsonData),
|
|
1433
|
-
createdAt: now,
|
|
1434
|
-
updatedAt: now
|
|
1435
|
-
}).returningAll().executeTakeFirst();
|
|
1436
|
-
if (!version) throw new LLMOpsError("Failed to create variant version");
|
|
1437
|
-
const configVariant = await db.insertInto("config_variants").values({
|
|
1438
|
-
id: (0, node_crypto.randomUUID)(),
|
|
1439
|
-
configId,
|
|
1440
|
-
variantId,
|
|
1441
|
-
createdAt: now,
|
|
1442
|
-
updatedAt: now
|
|
1443
|
-
}).returningAll().executeTakeFirst();
|
|
1444
|
-
if (!configVariant) throw new LLMOpsError("Failed to link variant to config");
|
|
1445
|
-
return {
|
|
1446
|
-
variant,
|
|
1447
|
-
version,
|
|
1448
|
-
configVariant
|
|
1449
|
-
};
|
|
1450
|
-
},
|
|
1451
|
-
getVariantJsonDataForConfig: async (params) => {
|
|
1452
|
-
const value = await getVariantJsonDataForConfig.safeParseAsync(params);
|
|
1453
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1454
|
-
const { configId: configIdOrSlug, envSecret } = value.data;
|
|
1455
|
-
const UUID_REGEX$1 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
1456
|
-
let resolvedConfigId;
|
|
1457
|
-
if (UUID_REGEX$1.test(configIdOrSlug)) resolvedConfigId = configIdOrSlug;
|
|
1458
|
-
else {
|
|
1459
|
-
const config = await db.selectFrom("configs").select("id").where("slug", "=", configIdOrSlug).executeTakeFirst();
|
|
1460
|
-
if (!config) throw new LLMOpsError(`Config not found: ${configIdOrSlug}`);
|
|
1461
|
-
resolvedConfigId = config.id;
|
|
1462
|
-
}
|
|
1463
|
-
let environmentId;
|
|
1464
|
-
if (envSecret) {
|
|
1465
|
-
const secret = await db.selectFrom("environment_secrets").select("environmentId").where("keyValue", "=", envSecret).executeTakeFirst();
|
|
1466
|
-
if (!secret) throw new LLMOpsError("Invalid environment secret");
|
|
1467
|
-
environmentId = secret.environmentId;
|
|
1468
|
-
} else {
|
|
1469
|
-
const prodEnv = await db.selectFrom("environments").select("id").where("isProd", "=", true).executeTakeFirst();
|
|
1470
|
-
if (!prodEnv) throw new LLMOpsError("No production environment found");
|
|
1471
|
-
environmentId = prodEnv.id;
|
|
1472
|
-
}
|
|
1473
|
-
const targetingRule = await db.selectFrom("targeting_rules").select(["configVariantId", "variantVersionId"]).where("configId", "=", resolvedConfigId).where("environmentId", "=", environmentId).where("enabled", "=", true).orderBy("priority", "desc").orderBy("weight", "desc").executeTakeFirst();
|
|
1474
|
-
if (!targetingRule) throw new LLMOpsError(`No targeting rule found for config ${resolvedConfigId} in environment ${environmentId}`);
|
|
1475
|
-
const configVariant = await db.selectFrom("config_variants").select("variantId").where("id", "=", targetingRule.configVariantId).executeTakeFirst();
|
|
1476
|
-
if (!configVariant) throw new LLMOpsError(`No config variant found for ${targetingRule.configVariantId}`);
|
|
1477
|
-
let versionData;
|
|
1478
|
-
if (targetingRule.variantVersionId) versionData = await db.selectFrom("variant_versions").select([
|
|
1479
|
-
"jsonData",
|
|
1480
|
-
"provider",
|
|
1481
|
-
"modelName",
|
|
1482
|
-
"version"
|
|
1483
|
-
]).where("id", "=", targetingRule.variantVersionId).executeTakeFirst();
|
|
1484
|
-
else versionData = await db.selectFrom("variant_versions").select([
|
|
1485
|
-
"jsonData",
|
|
1486
|
-
"provider",
|
|
1487
|
-
"modelName",
|
|
1488
|
-
"version"
|
|
1489
|
-
]).where("variantId", "=", configVariant.variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
|
|
1490
|
-
if (!versionData) throw new LLMOpsError(`No variant version found for variant ${configVariant.variantId}`);
|
|
1491
|
-
let finalProvider = versionData.provider;
|
|
1492
|
-
let providerConfigId = null;
|
|
1493
|
-
if (UUID_REGEX$1.test(versionData.provider)) {
|
|
1494
|
-
const providerConfig = await db.selectFrom("provider_configs").select(["id", "providerId"]).where("id", "=", versionData.provider).executeTakeFirst();
|
|
1495
|
-
if (providerConfig) {
|
|
1496
|
-
finalProvider = providerConfig.providerId;
|
|
1497
|
-
providerConfigId = providerConfig.id;
|
|
1498
|
-
}
|
|
1499
|
-
}
|
|
1500
|
-
return {
|
|
1501
|
-
...versionData,
|
|
1502
|
-
provider: finalProvider,
|
|
1503
|
-
providerConfigId,
|
|
1504
|
-
configId: resolvedConfigId,
|
|
1505
|
-
variantId: configVariant.variantId,
|
|
1506
|
-
environmentId
|
|
1507
|
-
};
|
|
1508
|
-
}
|
|
1509
|
-
};
|
|
1510
|
-
};
|
|
1511
|
-
|
|
1512
1180
|
//#endregion
|
|
1513
1181
|
//#region src/datalayer/datasets.ts
|
|
1514
1182
|
const createDataset = require_db.zod_default.object({
|
|
@@ -1718,254 +1386,6 @@ const createDatasetsDataLayer = (db) => {
|
|
|
1718
1386
|
};
|
|
1719
1387
|
};
|
|
1720
1388
|
|
|
1721
|
-
//#endregion
|
|
1722
|
-
//#region src/datalayer/environments.ts
|
|
1723
|
-
const createNewEnvironment = require_db.zod_default.object({
|
|
1724
|
-
name: require_db.zod_default.string(),
|
|
1725
|
-
slug: require_db.zod_default.string(),
|
|
1726
|
-
isProd: require_db.zod_default.boolean().optional().default(false)
|
|
1727
|
-
});
|
|
1728
|
-
const updateEnvironment = require_db.zod_default.object({
|
|
1729
|
-
environmentId: require_db.zod_default.uuidv4(),
|
|
1730
|
-
name: require_db.zod_default.string().optional(),
|
|
1731
|
-
slug: require_db.zod_default.string().optional()
|
|
1732
|
-
});
|
|
1733
|
-
const getEnvironmentById = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
|
|
1734
|
-
const getEnvironmentBySlug = require_db.zod_default.object({ slug: require_db.zod_default.string() });
|
|
1735
|
-
const deleteEnvironment = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
|
|
1736
|
-
const listEnvironments = require_db.zod_default.object({
|
|
1737
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
1738
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
1739
|
-
});
|
|
1740
|
-
const createEnvironmentDataLayer = (db) => {
|
|
1741
|
-
return {
|
|
1742
|
-
createNewEnvironment: async (params) => {
|
|
1743
|
-
const value = await createNewEnvironment.safeParseAsync(params);
|
|
1744
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1745
|
-
const { name, slug, isProd } = value.data;
|
|
1746
|
-
return db.insertInto("environments").values({
|
|
1747
|
-
id: (0, node_crypto.randomUUID)(),
|
|
1748
|
-
name,
|
|
1749
|
-
slug,
|
|
1750
|
-
isProd,
|
|
1751
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1752
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1753
|
-
}).returningAll().executeTakeFirst();
|
|
1754
|
-
},
|
|
1755
|
-
updateEnvironment: async (params) => {
|
|
1756
|
-
const value = await updateEnvironment.safeParseAsync(params);
|
|
1757
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1758
|
-
const { environmentId, name, slug } = value.data;
|
|
1759
|
-
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
1760
|
-
if (name !== void 0) updateData.name = name;
|
|
1761
|
-
if (slug !== void 0) updateData.slug = slug;
|
|
1762
|
-
return db.updateTable("environments").set(updateData).where("id", "=", environmentId).returningAll().executeTakeFirst();
|
|
1763
|
-
},
|
|
1764
|
-
getEnvironmentById: async (params) => {
|
|
1765
|
-
const value = await getEnvironmentById.safeParseAsync(params);
|
|
1766
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1767
|
-
const { environmentId } = value.data;
|
|
1768
|
-
return db.selectFrom("environments").selectAll().where("id", "=", environmentId).executeTakeFirst();
|
|
1769
|
-
},
|
|
1770
|
-
getEnvironmentBySlug: async (params) => {
|
|
1771
|
-
const value = await getEnvironmentBySlug.safeParseAsync(params);
|
|
1772
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1773
|
-
const { slug } = value.data;
|
|
1774
|
-
return db.selectFrom("environments").selectAll().where("slug", "=", slug).executeTakeFirst();
|
|
1775
|
-
},
|
|
1776
|
-
deleteEnvironment: async (params) => {
|
|
1777
|
-
const value = await deleteEnvironment.safeParseAsync(params);
|
|
1778
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1779
|
-
const { environmentId } = value.data;
|
|
1780
|
-
return db.deleteFrom("environments").where("id", "=", environmentId).returningAll().executeTakeFirst();
|
|
1781
|
-
},
|
|
1782
|
-
listEnvironments: async (params) => {
|
|
1783
|
-
const value = await listEnvironments.safeParseAsync(params || {});
|
|
1784
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1785
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
1786
|
-
return db.selectFrom("environments").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
1787
|
-
},
|
|
1788
|
-
countEnvironments: async () => {
|
|
1789
|
-
const result = await db.selectFrom("environments").select(db.fn.countAll().as("count")).executeTakeFirst();
|
|
1790
|
-
return Number(result?.count ?? 0);
|
|
1791
|
-
}
|
|
1792
|
-
};
|
|
1793
|
-
};
|
|
1794
|
-
|
|
1795
|
-
//#endregion
|
|
1796
|
-
//#region src/datalayer/environmentSecrets.ts
|
|
1797
|
-
const createEnvironmentSecret = require_db.zod_default.object({
|
|
1798
|
-
environmentId: require_db.zod_default.uuidv4(),
|
|
1799
|
-
keyName: require_db.zod_default.string(),
|
|
1800
|
-
keyValue: require_db.zod_default.string()
|
|
1801
|
-
});
|
|
1802
|
-
const updateEnvironmentSecret = require_db.zod_default.object({
|
|
1803
|
-
secretId: require_db.zod_default.uuidv4(),
|
|
1804
|
-
keyName: require_db.zod_default.string().optional(),
|
|
1805
|
-
keyValue: require_db.zod_default.string().optional()
|
|
1806
|
-
});
|
|
1807
|
-
const getEnvironmentSecretById = require_db.zod_default.object({ secretId: require_db.zod_default.uuidv4() });
|
|
1808
|
-
const getSecretsByEnvironmentId = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
|
|
1809
|
-
const deleteEnvironmentSecret = require_db.zod_default.object({ secretId: require_db.zod_default.uuidv4() });
|
|
1810
|
-
const deleteSecretsByEnvironmentId = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
|
|
1811
|
-
const listEnvironmentSecrets = require_db.zod_default.object({
|
|
1812
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
1813
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
1814
|
-
});
|
|
1815
|
-
const createEnvironmentSecretDataLayer = (db) => {
|
|
1816
|
-
return {
|
|
1817
|
-
createEnvironmentSecret: async (params) => {
|
|
1818
|
-
const value = await createEnvironmentSecret.safeParseAsync(params);
|
|
1819
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1820
|
-
const { environmentId, keyName, keyValue } = value.data;
|
|
1821
|
-
return db.insertInto("environment_secrets").values({
|
|
1822
|
-
id: (0, node_crypto.randomUUID)(),
|
|
1823
|
-
environmentId,
|
|
1824
|
-
keyName,
|
|
1825
|
-
keyValue,
|
|
1826
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1827
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1828
|
-
}).returningAll().executeTakeFirst();
|
|
1829
|
-
},
|
|
1830
|
-
updateEnvironmentSecret: async (params) => {
|
|
1831
|
-
const value = await updateEnvironmentSecret.safeParseAsync(params);
|
|
1832
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1833
|
-
const { secretId, keyName, keyValue } = value.data;
|
|
1834
|
-
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
1835
|
-
if (keyName !== void 0) updateData.keyName = keyName;
|
|
1836
|
-
if (keyValue !== void 0) updateData.keyValue = keyValue;
|
|
1837
|
-
return db.updateTable("environment_secrets").set(updateData).where("id", "=", secretId).returningAll().executeTakeFirst();
|
|
1838
|
-
},
|
|
1839
|
-
getEnvironmentSecretById: async (params) => {
|
|
1840
|
-
const value = await getEnvironmentSecretById.safeParseAsync(params);
|
|
1841
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1842
|
-
const { secretId } = value.data;
|
|
1843
|
-
return db.selectFrom("environment_secrets").selectAll().where("id", "=", secretId).executeTakeFirst();
|
|
1844
|
-
},
|
|
1845
|
-
getSecretsByEnvironmentId: async (params) => {
|
|
1846
|
-
const value = await getSecretsByEnvironmentId.safeParseAsync(params);
|
|
1847
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1848
|
-
const { environmentId } = value.data;
|
|
1849
|
-
return db.selectFrom("environment_secrets").selectAll().where("environmentId", "=", environmentId).orderBy("createdAt", "desc").execute();
|
|
1850
|
-
},
|
|
1851
|
-
deleteEnvironmentSecret: async (params) => {
|
|
1852
|
-
const value = await deleteEnvironmentSecret.safeParseAsync(params);
|
|
1853
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1854
|
-
const { secretId } = value.data;
|
|
1855
|
-
return db.deleteFrom("environment_secrets").where("id", "=", secretId).returningAll().executeTakeFirst();
|
|
1856
|
-
},
|
|
1857
|
-
deleteSecretsByEnvironmentId: async (params) => {
|
|
1858
|
-
const value = await deleteSecretsByEnvironmentId.safeParseAsync(params);
|
|
1859
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1860
|
-
const { environmentId } = value.data;
|
|
1861
|
-
return db.deleteFrom("environment_secrets").where("environmentId", "=", environmentId).returningAll().execute();
|
|
1862
|
-
},
|
|
1863
|
-
listEnvironmentSecrets: async (params) => {
|
|
1864
|
-
const value = await listEnvironmentSecrets.safeParseAsync(params || {});
|
|
1865
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1866
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
1867
|
-
return db.selectFrom("environment_secrets").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
1868
|
-
},
|
|
1869
|
-
countEnvironmentSecrets: async () => {
|
|
1870
|
-
const result = await db.selectFrom("environment_secrets").select(db.fn.countAll().as("count")).executeTakeFirst();
|
|
1871
|
-
return Number(result?.count ?? 0);
|
|
1872
|
-
}
|
|
1873
|
-
};
|
|
1874
|
-
};
|
|
1875
|
-
|
|
1876
|
-
//#endregion
|
|
1877
|
-
//#region src/datalayer/guardrailConfigs.ts
|
|
1878
|
-
const createGuardrailConfig = require_db.zod_default.object({
|
|
1879
|
-
name: require_db.zod_default.string().min(1),
|
|
1880
|
-
pluginId: require_db.zod_default.string().min(1),
|
|
1881
|
-
functionId: require_db.zod_default.string().min(1),
|
|
1882
|
-
hookType: require_db.zod_default.enum(["beforeRequestHook", "afterRequestHook"]),
|
|
1883
|
-
parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional().default({}),
|
|
1884
|
-
enabled: require_db.zod_default.boolean().optional().default(true),
|
|
1885
|
-
priority: require_db.zod_default.number().int().optional().default(0),
|
|
1886
|
-
onFail: require_db.zod_default.enum(["block", "log"]).optional().default("block")
|
|
1887
|
-
});
|
|
1888
|
-
const updateGuardrailConfig = require_db.zod_default.object({
|
|
1889
|
-
id: require_db.zod_default.string().uuid(),
|
|
1890
|
-
name: require_db.zod_default.string().min(1).optional(),
|
|
1891
|
-
hookType: require_db.zod_default.enum(["beforeRequestHook", "afterRequestHook"]).optional(),
|
|
1892
|
-
parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional(),
|
|
1893
|
-
enabled: require_db.zod_default.boolean().optional(),
|
|
1894
|
-
priority: require_db.zod_default.number().int().optional(),
|
|
1895
|
-
onFail: require_db.zod_default.enum(["block", "log"]).optional()
|
|
1896
|
-
});
|
|
1897
|
-
const getGuardrailConfigById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
1898
|
-
const deleteGuardrailConfig = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
1899
|
-
const listGuardrailConfigs = require_db.zod_default.object({
|
|
1900
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
1901
|
-
offset: require_db.zod_default.number().int().nonnegative().optional(),
|
|
1902
|
-
hookType: require_db.zod_default.enum(["beforeRequestHook", "afterRequestHook"]).optional(),
|
|
1903
|
-
enabled: require_db.zod_default.boolean().optional()
|
|
1904
|
-
});
|
|
1905
|
-
const createGuardrailConfigsDataLayer = (db) => {
|
|
1906
|
-
return {
|
|
1907
|
-
createGuardrailConfig: async (params) => {
|
|
1908
|
-
const value = await createGuardrailConfig.safeParseAsync(params);
|
|
1909
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1910
|
-
const { name, pluginId, functionId, hookType, parameters, enabled, priority, onFail } = value.data;
|
|
1911
|
-
return db.insertInto("guardrail_configs").values({
|
|
1912
|
-
id: (0, node_crypto.randomUUID)(),
|
|
1913
|
-
name,
|
|
1914
|
-
pluginId,
|
|
1915
|
-
functionId,
|
|
1916
|
-
hookType,
|
|
1917
|
-
parameters: JSON.stringify(parameters),
|
|
1918
|
-
enabled,
|
|
1919
|
-
priority,
|
|
1920
|
-
onFail,
|
|
1921
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1922
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1923
|
-
}).returningAll().executeTakeFirst();
|
|
1924
|
-
},
|
|
1925
|
-
updateGuardrailConfig: async (params) => {
|
|
1926
|
-
const value = await updateGuardrailConfig.safeParseAsync(params);
|
|
1927
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1928
|
-
const { id, name, hookType, parameters, enabled, priority, onFail } = value.data;
|
|
1929
|
-
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
1930
|
-
if (name !== void 0) updateData.name = name;
|
|
1931
|
-
if (hookType !== void 0) updateData.hookType = hookType;
|
|
1932
|
-
if (parameters !== void 0) updateData.parameters = JSON.stringify(parameters);
|
|
1933
|
-
if (enabled !== void 0) updateData.enabled = enabled;
|
|
1934
|
-
if (priority !== void 0) updateData.priority = priority;
|
|
1935
|
-
if (onFail !== void 0) updateData.onFail = onFail;
|
|
1936
|
-
return db.updateTable("guardrail_configs").set(updateData).where("id", "=", id).returningAll().executeTakeFirst();
|
|
1937
|
-
},
|
|
1938
|
-
getGuardrailConfigById: async (params) => {
|
|
1939
|
-
const value = await getGuardrailConfigById.safeParseAsync(params);
|
|
1940
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1941
|
-
const { id } = value.data;
|
|
1942
|
-
return db.selectFrom("guardrail_configs").selectAll().where("id", "=", id).executeTakeFirst();
|
|
1943
|
-
},
|
|
1944
|
-
deleteGuardrailConfig: async (params) => {
|
|
1945
|
-
const value = await deleteGuardrailConfig.safeParseAsync(params);
|
|
1946
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1947
|
-
const { id } = value.data;
|
|
1948
|
-
return db.deleteFrom("guardrail_configs").where("id", "=", id).returningAll().executeTakeFirst();
|
|
1949
|
-
},
|
|
1950
|
-
listGuardrailConfigs: async (params) => {
|
|
1951
|
-
const value = await listGuardrailConfigs.safeParseAsync(params || {});
|
|
1952
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1953
|
-
const { limit = 100, offset = 0, hookType, enabled } = value.data;
|
|
1954
|
-
let query = db.selectFrom("guardrail_configs").selectAll().orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset);
|
|
1955
|
-
if (hookType !== void 0) query = query.where("hookType", "=", hookType);
|
|
1956
|
-
if (enabled !== void 0) query = query.where("enabled", "=", enabled);
|
|
1957
|
-
return query.execute();
|
|
1958
|
-
},
|
|
1959
|
-
countGuardrailConfigs: async () => {
|
|
1960
|
-
const result = await db.selectFrom("guardrail_configs").select(db.fn.countAll().as("count")).executeTakeFirst();
|
|
1961
|
-
return Number(result?.count ?? 0);
|
|
1962
|
-
},
|
|
1963
|
-
getEnabledGuardrailsByHookType: async (hookType) => {
|
|
1964
|
-
return db.selectFrom("guardrail_configs").selectAll().where("hookType", "=", hookType).where("enabled", "=", true).orderBy("priority", "desc").execute();
|
|
1965
|
-
}
|
|
1966
|
-
};
|
|
1967
|
-
};
|
|
1968
|
-
|
|
1969
1389
|
//#endregion
|
|
1970
1390
|
//#region src/datalayer/llmRequests.ts
|
|
1971
1391
|
/**
|
|
@@ -2057,7 +1477,6 @@ const COST_SUMMARY_GROUP_BY = [
|
|
|
2057
1477
|
"hour",
|
|
2058
1478
|
"model",
|
|
2059
1479
|
"provider",
|
|
2060
|
-
"config",
|
|
2061
1480
|
"endpoint",
|
|
2062
1481
|
"tags"
|
|
2063
1482
|
];
|
|
@@ -2079,7 +1498,6 @@ const costSummarySchema = require_db.zod_default.object({
|
|
|
2079
1498
|
* Uses sql.ref() to properly quote column names for the database
|
|
2080
1499
|
*/
|
|
2081
1500
|
const col$1 = (name) => kysely.sql.ref(name);
|
|
2082
|
-
const tableCol = (table, name) => kysely.sql.ref(`${table}.${name}`);
|
|
2083
1501
|
const createLLMRequestsDataLayer = (db) => {
|
|
2084
1502
|
return {
|
|
2085
1503
|
batchInsertRequests: async (requests) => {
|
|
@@ -2253,25 +1671,6 @@ const createLLMRequestsDataLayer = (db) => {
|
|
|
2253
1671
|
kysely.sql`AVG(${col$1("latencyMs")})`.as("avgLatencyMs")
|
|
2254
1672
|
]).where(kysely.sql`${col$1("createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${col$1("createdAt")} <= ${endDate.toISOString()}`).groupBy("provider").orderBy(kysely.sql`SUM(${col$1("cost")})`, "desc").execute();
|
|
2255
1673
|
},
|
|
2256
|
-
getCostByConfig: async (params) => {
|
|
2257
|
-
const result = await dateRangeSchema.safeParseAsync(params);
|
|
2258
|
-
if (!result.success) throw new LLMOpsError(`Invalid parameters: ${result.error.message}`);
|
|
2259
|
-
const { startDate, endDate } = result.data;
|
|
2260
|
-
return db.selectFrom("llm_requests").leftJoin("configs", "llm_requests.configId", "configs.id").select([
|
|
2261
|
-
"llm_requests.configId",
|
|
2262
|
-
"configs.name as configName",
|
|
2263
|
-
"configs.slug as configSlug",
|
|
2264
|
-
kysely.sql`COALESCE(SUM(${tableCol("llm_requests", "cost")}), 0)`.as("totalCost"),
|
|
2265
|
-
kysely.sql`COALESCE(SUM(${tableCol("llm_requests", "inputCost")}), 0)`.as("totalInputCost"),
|
|
2266
|
-
kysely.sql`COALESCE(SUM(${tableCol("llm_requests", "outputCost")}), 0)`.as("totalOutputCost"),
|
|
2267
|
-
kysely.sql`COALESCE(SUM(${tableCol("llm_requests", "totalTokens")}), 0)`.as("totalTokens"),
|
|
2268
|
-
kysely.sql`COUNT(*)`.as("requestCount")
|
|
2269
|
-
]).where(kysely.sql`${tableCol("llm_requests", "createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${tableCol("llm_requests", "createdAt")} <= ${endDate.toISOString()}`).groupBy([
|
|
2270
|
-
"llm_requests.configId",
|
|
2271
|
-
"configs.name",
|
|
2272
|
-
"configs.slug"
|
|
2273
|
-
]).orderBy(kysely.sql`SUM(${tableCol("llm_requests", "cost")})`, "desc").execute();
|
|
2274
|
-
},
|
|
2275
1674
|
getDailyCosts: async (params) => {
|
|
2276
1675
|
const result = await dateRangeSchema.safeParseAsync(params);
|
|
2277
1676
|
if (!result.success) throw new LLMOpsError(`Invalid parameters: ${result.error.message}`);
|
|
@@ -2324,11 +1723,6 @@ const createLLMRequestsDataLayer = (db) => {
|
|
|
2324
1723
|
kysely.sql`COALESCE(SUM(${col$1("cost")}), 0)`.as("totalCost"),
|
|
2325
1724
|
kysely.sql`COUNT(*)`.as("requestCount")
|
|
2326
1725
|
]).groupBy("provider").orderBy(kysely.sql`SUM(${col$1("cost")})`, "desc").execute();
|
|
2327
|
-
case "config": return baseQuery.select([
|
|
2328
|
-
kysely.sql`COALESCE(${col$1("configId")}::text, 'no-config')`.as("groupKey"),
|
|
2329
|
-
kysely.sql`COALESCE(SUM(${col$1("cost")}), 0)`.as("totalCost"),
|
|
2330
|
-
kysely.sql`COUNT(*)`.as("requestCount")
|
|
2331
|
-
]).groupBy("configId").orderBy(kysely.sql`SUM(${col$1("cost")})`, "desc").execute();
|
|
2332
1726
|
case "endpoint": return baseQuery.select([
|
|
2333
1727
|
kysely.sql`COALESCE(${col$1("endpoint")}, 'unknown')`.as("groupKey"),
|
|
2334
1728
|
kysely.sql`COALESCE(SUM(${col$1("cost")}), 0)`.as("totalCost"),
|
|
@@ -2701,463 +2095,31 @@ const createPlaygroundRunsDataLayer = (db) => {
|
|
|
2701
2095
|
};
|
|
2702
2096
|
|
|
2703
2097
|
//#endregion
|
|
2704
|
-
//#region src/datalayer/
|
|
2098
|
+
//#region src/datalayer/traces.ts
|
|
2099
|
+
const col = (name) => kysely.sql.ref(name);
|
|
2705
2100
|
/**
|
|
2706
|
-
*
|
|
2707
|
-
* If the base slug already exists, appends -01, -02, etc.
|
|
2101
|
+
* Schema for upserting a trace
|
|
2708
2102
|
*/
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
if (existing.length === 0) return baseSlug;
|
|
2712
|
-
const existingSlugs = new Set(existing.map((e) => e.slug));
|
|
2713
|
-
if (!existingSlugs.has(baseSlug)) return baseSlug;
|
|
2714
|
-
let counter = 1;
|
|
2715
|
-
while (counter < 100) {
|
|
2716
|
-
const candidateSlug = `${baseSlug}-${counter.toString().padStart(2, "0")}`;
|
|
2717
|
-
if (!existingSlugs.has(candidateSlug)) return candidateSlug;
|
|
2718
|
-
counter++;
|
|
2719
|
-
}
|
|
2720
|
-
return `${baseSlug}-${(0, node_crypto.randomUUID)().slice(0, 8)}`;
|
|
2721
|
-
}
|
|
2722
|
-
const createProviderConfig = require_db.zod_default.object({
|
|
2723
|
-
providerId: require_db.zod_default.string().min(1),
|
|
2724
|
-
slug: require_db.zod_default.string().nullable().optional(),
|
|
2725
|
-
name: require_db.zod_default.string().nullable().optional(),
|
|
2726
|
-
config: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()),
|
|
2727
|
-
enabled: require_db.zod_default.boolean().optional().default(true)
|
|
2728
|
-
});
|
|
2729
|
-
const updateProviderConfig = require_db.zod_default.object({
|
|
2730
|
-
id: require_db.zod_default.uuidv4(),
|
|
2731
|
-
slug: require_db.zod_default.string().nullable().optional(),
|
|
2103
|
+
const upsertTraceSchema = require_db.zod_default.object({
|
|
2104
|
+
traceId: require_db.zod_default.string(),
|
|
2732
2105
|
name: require_db.zod_default.string().nullable().optional(),
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
const finalSlug = slug ?? await generateUniqueSlug(db, providerId);
|
|
2751
|
-
return db.insertInto("provider_configs").values({
|
|
2752
|
-
id: (0, node_crypto.randomUUID)(),
|
|
2753
|
-
providerId,
|
|
2754
|
-
slug: finalSlug,
|
|
2755
|
-
name: name ?? null,
|
|
2756
|
-
config: JSON.stringify(config),
|
|
2757
|
-
enabled,
|
|
2758
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2759
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2760
|
-
}).returningAll().executeTakeFirst();
|
|
2761
|
-
},
|
|
2762
|
-
updateProviderConfig: async (params) => {
|
|
2763
|
-
const value = await updateProviderConfig.safeParseAsync(params);
|
|
2764
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2765
|
-
const { id, slug, name, config, enabled } = value.data;
|
|
2766
|
-
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
2767
|
-
if (slug !== void 0) updateData.slug = slug;
|
|
2768
|
-
if (name !== void 0) updateData.name = name;
|
|
2769
|
-
if (config !== void 0) updateData.config = JSON.stringify(config);
|
|
2770
|
-
if (enabled !== void 0) updateData.enabled = enabled;
|
|
2771
|
-
return db.updateTable("provider_configs").set(updateData).where("id", "=", id).returningAll().executeTakeFirst();
|
|
2772
|
-
},
|
|
2773
|
-
getProviderConfigById: async (params) => {
|
|
2774
|
-
const value = await getProviderConfigById.safeParseAsync(params);
|
|
2775
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2776
|
-
const { id } = value.data;
|
|
2777
|
-
return db.selectFrom("provider_configs").selectAll().where("id", "=", id).executeTakeFirst();
|
|
2778
|
-
},
|
|
2779
|
-
getProviderConfigByProviderId: async (params) => {
|
|
2780
|
-
const value = await getProviderConfigByProviderId.safeParseAsync(params);
|
|
2781
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2782
|
-
const { providerId } = value.data;
|
|
2783
|
-
return db.selectFrom("provider_configs").selectAll().where("providerId", "=", providerId).executeTakeFirst();
|
|
2784
|
-
},
|
|
2785
|
-
getProviderConfigBySlug: async (params) => {
|
|
2786
|
-
const value = await getProviderConfigBySlug.safeParseAsync(params);
|
|
2787
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2788
|
-
const { slug } = value.data;
|
|
2789
|
-
return db.selectFrom("provider_configs").selectAll().where("slug", "=", slug).executeTakeFirst();
|
|
2790
|
-
},
|
|
2791
|
-
deleteProviderConfig: async (params) => {
|
|
2792
|
-
const value = await deleteProviderConfig.safeParseAsync(params);
|
|
2793
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2794
|
-
const { id } = value.data;
|
|
2795
|
-
return db.deleteFrom("provider_configs").where("id", "=", id).returningAll().executeTakeFirst();
|
|
2796
|
-
},
|
|
2797
|
-
listProviderConfigs: async (params) => {
|
|
2798
|
-
const value = await listProviderConfigs.safeParseAsync(params || {});
|
|
2799
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2800
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
2801
|
-
return db.selectFrom("provider_configs").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
2802
|
-
},
|
|
2803
|
-
countProviderConfigs: async () => {
|
|
2804
|
-
const result = await db.selectFrom("provider_configs").select(db.fn.countAll().as("count")).executeTakeFirst();
|
|
2805
|
-
return Number(result?.count ?? 0);
|
|
2806
|
-
},
|
|
2807
|
-
upsertProviderConfig: async (params) => {
|
|
2808
|
-
const value = await createProviderConfig.safeParseAsync(params);
|
|
2809
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2810
|
-
const { providerId, slug, name, config, enabled } = value.data;
|
|
2811
|
-
const existing = await db.selectFrom("provider_configs").selectAll().where("providerId", "=", providerId).executeTakeFirst();
|
|
2812
|
-
if (existing) {
|
|
2813
|
-
const finalSlug$1 = slug ?? existing.slug ?? await generateUniqueSlug(db, providerId);
|
|
2814
|
-
return db.updateTable("provider_configs").set({
|
|
2815
|
-
slug: finalSlug$1,
|
|
2816
|
-
name: name ?? existing.name,
|
|
2817
|
-
config: JSON.stringify(config),
|
|
2818
|
-
enabled,
|
|
2819
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2820
|
-
}).where("id", "=", existing.id).returningAll().executeTakeFirst();
|
|
2821
|
-
}
|
|
2822
|
-
const finalSlug = slug ?? await generateUniqueSlug(db, providerId);
|
|
2823
|
-
return db.insertInto("provider_configs").values({
|
|
2824
|
-
id: (0, node_crypto.randomUUID)(),
|
|
2825
|
-
providerId,
|
|
2826
|
-
slug: finalSlug,
|
|
2827
|
-
name: name ?? null,
|
|
2828
|
-
config: JSON.stringify(config),
|
|
2829
|
-
enabled,
|
|
2830
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2831
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2832
|
-
}).returningAll().executeTakeFirst();
|
|
2833
|
-
}
|
|
2834
|
-
};
|
|
2835
|
-
};
|
|
2836
|
-
|
|
2837
|
-
//#endregion
|
|
2838
|
-
//#region src/datalayer/providerGuardrailOverrides.ts
|
|
2839
|
-
const createProviderGuardrailOverride = require_db.zod_default.object({
|
|
2840
|
-
providerConfigId: require_db.zod_default.string().uuid(),
|
|
2841
|
-
guardrailConfigId: require_db.zod_default.string().uuid(),
|
|
2842
|
-
enabled: require_db.zod_default.boolean().optional().default(true),
|
|
2843
|
-
parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
|
|
2844
|
-
});
|
|
2845
|
-
const updateProviderGuardrailOverride = require_db.zod_default.object({
|
|
2846
|
-
id: require_db.zod_default.string().uuid(),
|
|
2847
|
-
enabled: require_db.zod_default.boolean().optional(),
|
|
2848
|
-
parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
|
|
2849
|
-
});
|
|
2850
|
-
const getOverrideById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
2851
|
-
const deleteOverride = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
2852
|
-
const getOverridesByProviderConfigId = require_db.zod_default.object({ providerConfigId: require_db.zod_default.string().uuid() });
|
|
2853
|
-
const getOverridesByGuardrailConfigId = require_db.zod_default.object({ guardrailConfigId: require_db.zod_default.string().uuid() });
|
|
2854
|
-
const getOverrideByProviderAndGuardrail = require_db.zod_default.object({
|
|
2855
|
-
providerConfigId: require_db.zod_default.string().uuid(),
|
|
2856
|
-
guardrailConfigId: require_db.zod_default.string().uuid()
|
|
2857
|
-
});
|
|
2858
|
-
const createProviderGuardrailOverridesDataLayer = (db) => {
|
|
2859
|
-
return {
|
|
2860
|
-
createProviderGuardrailOverride: async (params) => {
|
|
2861
|
-
const value = await createProviderGuardrailOverride.safeParseAsync(params);
|
|
2862
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2863
|
-
const { providerConfigId, guardrailConfigId, enabled, parameters } = value.data;
|
|
2864
|
-
return db.insertInto("provider_guardrail_overrides").values({
|
|
2865
|
-
id: (0, node_crypto.randomUUID)(),
|
|
2866
|
-
providerConfigId,
|
|
2867
|
-
guardrailConfigId,
|
|
2868
|
-
enabled,
|
|
2869
|
-
parameters: parameters ? JSON.stringify(parameters) : null,
|
|
2870
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2871
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2872
|
-
}).returningAll().executeTakeFirst();
|
|
2873
|
-
},
|
|
2874
|
-
updateProviderGuardrailOverride: async (params) => {
|
|
2875
|
-
const value = await updateProviderGuardrailOverride.safeParseAsync(params);
|
|
2876
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2877
|
-
const { id, enabled, parameters } = value.data;
|
|
2878
|
-
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
2879
|
-
if (enabled !== void 0) updateData.enabled = enabled;
|
|
2880
|
-
if (parameters !== void 0) updateData.parameters = parameters ? JSON.stringify(parameters) : null;
|
|
2881
|
-
return db.updateTable("provider_guardrail_overrides").set(updateData).where("id", "=", id).returningAll().executeTakeFirst();
|
|
2882
|
-
},
|
|
2883
|
-
getOverrideById: async (params) => {
|
|
2884
|
-
const value = await getOverrideById.safeParseAsync(params);
|
|
2885
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2886
|
-
const { id } = value.data;
|
|
2887
|
-
return db.selectFrom("provider_guardrail_overrides").selectAll().where("id", "=", id).executeTakeFirst();
|
|
2888
|
-
},
|
|
2889
|
-
deleteProviderGuardrailOverride: async (params) => {
|
|
2890
|
-
const value = await deleteOverride.safeParseAsync(params);
|
|
2891
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2892
|
-
const { id } = value.data;
|
|
2893
|
-
return db.deleteFrom("provider_guardrail_overrides").where("id", "=", id).returningAll().executeTakeFirst();
|
|
2894
|
-
},
|
|
2895
|
-
getOverridesByProviderConfigId: async (params) => {
|
|
2896
|
-
const value = await getOverridesByProviderConfigId.safeParseAsync(params);
|
|
2897
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2898
|
-
const { providerConfigId } = value.data;
|
|
2899
|
-
return db.selectFrom("provider_guardrail_overrides").selectAll().where("providerConfigId", "=", providerConfigId).execute();
|
|
2900
|
-
},
|
|
2901
|
-
getOverridesByGuardrailConfigId: async (params) => {
|
|
2902
|
-
const value = await getOverridesByGuardrailConfigId.safeParseAsync(params);
|
|
2903
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2904
|
-
const { guardrailConfigId } = value.data;
|
|
2905
|
-
return db.selectFrom("provider_guardrail_overrides").selectAll().where("guardrailConfigId", "=", guardrailConfigId).execute();
|
|
2906
|
-
},
|
|
2907
|
-
getOverrideByProviderAndGuardrail: async (params) => {
|
|
2908
|
-
const value = await getOverrideByProviderAndGuardrail.safeParseAsync(params);
|
|
2909
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2910
|
-
const { providerConfigId, guardrailConfigId } = value.data;
|
|
2911
|
-
return db.selectFrom("provider_guardrail_overrides").selectAll().where("providerConfigId", "=", providerConfigId).where("guardrailConfigId", "=", guardrailConfigId).executeTakeFirst();
|
|
2912
|
-
},
|
|
2913
|
-
upsertProviderGuardrailOverride: async (params) => {
|
|
2914
|
-
const value = await createProviderGuardrailOverride.safeParseAsync(params);
|
|
2915
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2916
|
-
const { providerConfigId, guardrailConfigId, enabled, parameters } = value.data;
|
|
2917
|
-
const existing = await db.selectFrom("provider_guardrail_overrides").selectAll().where("providerConfigId", "=", providerConfigId).where("guardrailConfigId", "=", guardrailConfigId).executeTakeFirst();
|
|
2918
|
-
if (existing) return db.updateTable("provider_guardrail_overrides").set({
|
|
2919
|
-
enabled,
|
|
2920
|
-
parameters: parameters ? JSON.stringify(parameters) : null,
|
|
2921
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2922
|
-
}).where("id", "=", existing.id).returningAll().executeTakeFirst();
|
|
2923
|
-
return db.insertInto("provider_guardrail_overrides").values({
|
|
2924
|
-
id: (0, node_crypto.randomUUID)(),
|
|
2925
|
-
providerConfigId,
|
|
2926
|
-
guardrailConfigId,
|
|
2927
|
-
enabled,
|
|
2928
|
-
parameters: parameters ? JSON.stringify(parameters) : null,
|
|
2929
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2930
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2931
|
-
}).returningAll().executeTakeFirst();
|
|
2932
|
-
},
|
|
2933
|
-
deleteOverridesByGuardrailConfigId: async (params) => {
|
|
2934
|
-
const value = await getOverridesByGuardrailConfigId.safeParseAsync(params);
|
|
2935
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2936
|
-
const { guardrailConfigId } = value.data;
|
|
2937
|
-
return db.deleteFrom("provider_guardrail_overrides").where("guardrailConfigId", "=", guardrailConfigId).execute();
|
|
2938
|
-
}
|
|
2939
|
-
};
|
|
2940
|
-
};
|
|
2941
|
-
|
|
2942
|
-
//#endregion
|
|
2943
|
-
//#region src/datalayer/targetingRules.ts
|
|
2944
|
-
const createTargetingRule = require_db.zod_default.object({
|
|
2945
|
-
environmentId: require_db.zod_default.string().uuid(),
|
|
2946
|
-
configId: require_db.zod_default.string().uuid(),
|
|
2947
|
-
configVariantId: require_db.zod_default.string().uuid(),
|
|
2948
|
-
variantVersionId: require_db.zod_default.string().uuid().nullable().optional(),
|
|
2949
|
-
weight: require_db.zod_default.number().int().min(0).max(1e4).optional().default(1e4),
|
|
2950
|
-
priority: require_db.zod_default.number().int().optional().default(0),
|
|
2951
|
-
enabled: require_db.zod_default.boolean().optional().default(true),
|
|
2952
|
-
conditions: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
|
|
2953
|
-
});
|
|
2954
|
-
const updateTargetingRule = require_db.zod_default.object({
|
|
2955
|
-
id: require_db.zod_default.string().uuid(),
|
|
2956
|
-
variantVersionId: require_db.zod_default.string().uuid().nullable().optional(),
|
|
2957
|
-
weight: require_db.zod_default.number().int().min(0).max(1e4).optional(),
|
|
2958
|
-
priority: require_db.zod_default.number().int().optional(),
|
|
2959
|
-
enabled: require_db.zod_default.boolean().optional(),
|
|
2960
|
-
conditions: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
|
|
2961
|
-
});
|
|
2962
|
-
const getTargetingRuleById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
2963
|
-
const getTargetingRulesByConfigId = require_db.zod_default.object({
|
|
2964
|
-
configId: require_db.zod_default.string().uuid(),
|
|
2965
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
2966
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
2967
|
-
});
|
|
2968
|
-
const getTargetingRulesByEnvironmentId = require_db.zod_default.object({
|
|
2969
|
-
environmentId: require_db.zod_default.string().uuid(),
|
|
2970
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
2971
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
2972
|
-
});
|
|
2973
|
-
const getTargetingRulesByConfigAndEnvironment = require_db.zod_default.object({
|
|
2974
|
-
configId: require_db.zod_default.string().uuid(),
|
|
2975
|
-
environmentId: require_db.zod_default.string().uuid()
|
|
2976
|
-
});
|
|
2977
|
-
const deleteTargetingRule = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
2978
|
-
const deleteTargetingRulesByConfigId = require_db.zod_default.object({ configId: require_db.zod_default.string().uuid() });
|
|
2979
|
-
const deleteTargetingRulesByEnvironmentId = require_db.zod_default.object({ environmentId: require_db.zod_default.string().uuid() });
|
|
2980
|
-
const listTargetingRules = require_db.zod_default.object({
|
|
2981
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
2982
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
2983
|
-
});
|
|
2984
|
-
const setTargetingForEnvironment = require_db.zod_default.object({
|
|
2985
|
-
environmentId: require_db.zod_default.string().uuid(),
|
|
2986
|
-
configId: require_db.zod_default.string().uuid(),
|
|
2987
|
-
configVariantId: require_db.zod_default.string().uuid(),
|
|
2988
|
-
variantVersionId: require_db.zod_default.string().uuid().nullable().optional()
|
|
2989
|
-
});
|
|
2990
|
-
const createTargetingRulesDataLayer = (db) => {
|
|
2991
|
-
return {
|
|
2992
|
-
createTargetingRule: async (params) => {
|
|
2993
|
-
const value = await createTargetingRule.safeParseAsync(params);
|
|
2994
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
2995
|
-
const { environmentId, configId, configVariantId, variantVersionId, weight, priority, enabled, conditions } = value.data;
|
|
2996
|
-
return db.insertInto("targeting_rules").values({
|
|
2997
|
-
id: (0, node_crypto.randomUUID)(),
|
|
2998
|
-
environmentId,
|
|
2999
|
-
configId,
|
|
3000
|
-
configVariantId,
|
|
3001
|
-
variantVersionId: variantVersionId ?? null,
|
|
3002
|
-
weight,
|
|
3003
|
-
priority,
|
|
3004
|
-
enabled,
|
|
3005
|
-
conditions: JSON.stringify(conditions ?? {}),
|
|
3006
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3007
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
3008
|
-
}).returningAll().executeTakeFirst();
|
|
3009
|
-
},
|
|
3010
|
-
updateTargetingRule: async (params) => {
|
|
3011
|
-
const value = await updateTargetingRule.safeParseAsync(params);
|
|
3012
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3013
|
-
const { id, variantVersionId, weight, priority, enabled, conditions } = value.data;
|
|
3014
|
-
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
3015
|
-
if (variantVersionId !== void 0) updateData.variantVersionId = variantVersionId;
|
|
3016
|
-
if (weight !== void 0) updateData.weight = weight;
|
|
3017
|
-
if (priority !== void 0) updateData.priority = priority;
|
|
3018
|
-
if (enabled !== void 0) updateData.enabled = enabled;
|
|
3019
|
-
if (conditions !== void 0) updateData.conditions = conditions ? JSON.stringify(conditions) : null;
|
|
3020
|
-
return db.updateTable("targeting_rules").set(updateData).where("id", "=", id).returningAll().executeTakeFirst();
|
|
3021
|
-
},
|
|
3022
|
-
getTargetingRuleById: async (params) => {
|
|
3023
|
-
const value = await getTargetingRuleById.safeParseAsync(params);
|
|
3024
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3025
|
-
const { id } = value.data;
|
|
3026
|
-
return db.selectFrom("targeting_rules").selectAll().where("id", "=", id).executeTakeFirst();
|
|
3027
|
-
},
|
|
3028
|
-
getTargetingRulesByConfigId: async (params) => {
|
|
3029
|
-
const value = await getTargetingRulesByConfigId.safeParseAsync(params);
|
|
3030
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3031
|
-
const { configId, limit = 100, offset = 0 } = value.data;
|
|
3032
|
-
return db.selectFrom("targeting_rules").selectAll().where("configId", "=", configId).where("enabled", "=", true).orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
3033
|
-
},
|
|
3034
|
-
getTargetingRulesByEnvironmentId: async (params) => {
|
|
3035
|
-
const value = await getTargetingRulesByEnvironmentId.safeParseAsync(params);
|
|
3036
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3037
|
-
const { environmentId, limit = 100, offset = 0 } = value.data;
|
|
3038
|
-
return db.selectFrom("targeting_rules").selectAll().where("environmentId", "=", environmentId).where("enabled", "=", true).orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
3039
|
-
},
|
|
3040
|
-
getTargetingRulesByConfigAndEnvironment: async (params) => {
|
|
3041
|
-
const value = await getTargetingRulesByConfigAndEnvironment.safeParseAsync(params);
|
|
3042
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3043
|
-
const { configId, environmentId } = value.data;
|
|
3044
|
-
return db.selectFrom("targeting_rules").selectAll().where("configId", "=", configId).where("environmentId", "=", environmentId).where("enabled", "=", true).orderBy("priority", "desc").orderBy("weight", "desc").execute();
|
|
3045
|
-
},
|
|
3046
|
-
deleteTargetingRule: async (params) => {
|
|
3047
|
-
const value = await deleteTargetingRule.safeParseAsync(params);
|
|
3048
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3049
|
-
const { id } = value.data;
|
|
3050
|
-
return db.deleteFrom("targeting_rules").where("id", "=", id).returningAll().executeTakeFirst();
|
|
3051
|
-
},
|
|
3052
|
-
deleteTargetingRulesByConfigId: async (params) => {
|
|
3053
|
-
const value = await deleteTargetingRulesByConfigId.safeParseAsync(params);
|
|
3054
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3055
|
-
const { configId } = value.data;
|
|
3056
|
-
return db.deleteFrom("targeting_rules").where("configId", "=", configId).returningAll().execute();
|
|
3057
|
-
},
|
|
3058
|
-
deleteTargetingRulesByEnvironmentId: async (params) => {
|
|
3059
|
-
const value = await deleteTargetingRulesByEnvironmentId.safeParseAsync(params);
|
|
3060
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3061
|
-
const { environmentId } = value.data;
|
|
3062
|
-
return db.deleteFrom("targeting_rules").where("environmentId", "=", environmentId).returningAll().execute();
|
|
3063
|
-
},
|
|
3064
|
-
listTargetingRules: async (params) => {
|
|
3065
|
-
const value = await listTargetingRules.safeParseAsync(params || {});
|
|
3066
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3067
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
3068
|
-
return db.selectFrom("targeting_rules").selectAll().orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
3069
|
-
},
|
|
3070
|
-
getTargetingRulesWithDetailsByConfigId: async (params) => {
|
|
3071
|
-
const value = await getTargetingRulesByConfigId.safeParseAsync(params);
|
|
3072
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3073
|
-
const { configId, limit = 100, offset = 0 } = value.data;
|
|
3074
|
-
const rules = await db.selectFrom("targeting_rules").leftJoin("environments", "targeting_rules.environmentId", "environments.id").leftJoin("config_variants", "targeting_rules.configVariantId", "config_variants.id").leftJoin("variants", "config_variants.variantId", "variants.id").select([
|
|
3075
|
-
"targeting_rules.id",
|
|
3076
|
-
"targeting_rules.environmentId",
|
|
3077
|
-
"targeting_rules.configId",
|
|
3078
|
-
"targeting_rules.configVariantId",
|
|
3079
|
-
"targeting_rules.variantVersionId",
|
|
3080
|
-
"targeting_rules.weight",
|
|
3081
|
-
"targeting_rules.priority",
|
|
3082
|
-
"targeting_rules.enabled",
|
|
3083
|
-
"targeting_rules.conditions",
|
|
3084
|
-
"targeting_rules.createdAt",
|
|
3085
|
-
"targeting_rules.updatedAt",
|
|
3086
|
-
"environments.name as environmentName",
|
|
3087
|
-
"environments.slug as environmentSlug",
|
|
3088
|
-
"variants.name as variantName",
|
|
3089
|
-
"config_variants.variantId"
|
|
3090
|
-
]).where("targeting_rules.configId", "=", configId).orderBy("targeting_rules.priority", "desc").orderBy("targeting_rules.createdAt", "desc").limit(limit).offset(offset).execute();
|
|
3091
|
-
return await Promise.all(rules.map(async (rule) => {
|
|
3092
|
-
let versionInfo = null;
|
|
3093
|
-
if (rule.variantVersionId) versionInfo = await db.selectFrom("variant_versions").select([
|
|
3094
|
-
"provider",
|
|
3095
|
-
"modelName",
|
|
3096
|
-
"version"
|
|
3097
|
-
]).where("id", "=", rule.variantVersionId).executeTakeFirst();
|
|
3098
|
-
else if (rule.variantId) versionInfo = await db.selectFrom("variant_versions").select([
|
|
3099
|
-
"provider",
|
|
3100
|
-
"modelName",
|
|
3101
|
-
"version"
|
|
3102
|
-
]).where("variantId", "=", rule.variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
|
|
3103
|
-
return {
|
|
3104
|
-
...rule,
|
|
3105
|
-
variantProvider: versionInfo?.provider ?? null,
|
|
3106
|
-
variantModelName: versionInfo?.modelName ?? null,
|
|
3107
|
-
pinnedVersion: rule.variantVersionId ? versionInfo?.version : null,
|
|
3108
|
-
latestVersion: !rule.variantVersionId ? versionInfo?.version : null
|
|
3109
|
-
};
|
|
3110
|
-
}));
|
|
3111
|
-
},
|
|
3112
|
-
setTargetingForEnvironment: async (params) => {
|
|
3113
|
-
const value = await setTargetingForEnvironment.safeParseAsync(params);
|
|
3114
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3115
|
-
const { environmentId, configId, configVariantId, variantVersionId } = value.data;
|
|
3116
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
3117
|
-
await db.deleteFrom("targeting_rules").where("configId", "=", configId).where("environmentId", "=", environmentId).execute();
|
|
3118
|
-
return db.insertInto("targeting_rules").values({
|
|
3119
|
-
id: (0, node_crypto.randomUUID)(),
|
|
3120
|
-
environmentId,
|
|
3121
|
-
configId,
|
|
3122
|
-
configVariantId,
|
|
3123
|
-
variantVersionId: variantVersionId ?? null,
|
|
3124
|
-
weight: 1e4,
|
|
3125
|
-
priority: 0,
|
|
3126
|
-
enabled: true,
|
|
3127
|
-
conditions: JSON.stringify({}),
|
|
3128
|
-
createdAt: now,
|
|
3129
|
-
updatedAt: now
|
|
3130
|
-
}).returningAll().executeTakeFirst();
|
|
3131
|
-
}
|
|
3132
|
-
};
|
|
3133
|
-
};
|
|
3134
|
-
|
|
3135
|
-
//#endregion
|
|
3136
|
-
//#region src/datalayer/traces.ts
|
|
3137
|
-
const col = (name) => kysely.sql.ref(name);
|
|
3138
|
-
/**
|
|
3139
|
-
* Schema for upserting a trace
|
|
3140
|
-
*/
|
|
3141
|
-
const upsertTraceSchema = require_db.zod_default.object({
|
|
3142
|
-
traceId: require_db.zod_default.string(),
|
|
3143
|
-
name: require_db.zod_default.string().nullable().optional(),
|
|
3144
|
-
sessionId: require_db.zod_default.string().nullable().optional(),
|
|
3145
|
-
userId: require_db.zod_default.string().nullable().optional(),
|
|
3146
|
-
status: require_db.zod_default.enum([
|
|
3147
|
-
"unset",
|
|
3148
|
-
"ok",
|
|
3149
|
-
"error"
|
|
3150
|
-
]).default("unset"),
|
|
3151
|
-
startTime: require_db.zod_default.date(),
|
|
3152
|
-
endTime: require_db.zod_default.date().nullable().optional(),
|
|
3153
|
-
durationMs: require_db.zod_default.number().int().nullable().optional(),
|
|
3154
|
-
spanCount: require_db.zod_default.number().int().default(1),
|
|
3155
|
-
totalInputTokens: require_db.zod_default.number().int().default(0),
|
|
3156
|
-
totalOutputTokens: require_db.zod_default.number().int().default(0),
|
|
3157
|
-
totalTokens: require_db.zod_default.number().int().default(0),
|
|
3158
|
-
totalCost: require_db.zod_default.number().int().default(0),
|
|
3159
|
-
tags: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.string()).default({}),
|
|
3160
|
-
metadata: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).default({})
|
|
2106
|
+
sessionId: require_db.zod_default.string().nullable().optional(),
|
|
2107
|
+
userId: require_db.zod_default.string().nullable().optional(),
|
|
2108
|
+
status: require_db.zod_default.enum([
|
|
2109
|
+
"unset",
|
|
2110
|
+
"ok",
|
|
2111
|
+
"error"
|
|
2112
|
+
]).default("unset"),
|
|
2113
|
+
startTime: require_db.zod_default.date(),
|
|
2114
|
+
endTime: require_db.zod_default.date().nullable().optional(),
|
|
2115
|
+
durationMs: require_db.zod_default.number().int().nullable().optional(),
|
|
2116
|
+
spanCount: require_db.zod_default.number().int().default(1),
|
|
2117
|
+
totalInputTokens: require_db.zod_default.number().int().default(0),
|
|
2118
|
+
totalOutputTokens: require_db.zod_default.number().int().default(0),
|
|
2119
|
+
totalTokens: require_db.zod_default.number().int().default(0),
|
|
2120
|
+
totalCost: require_db.zod_default.number().int().default(0),
|
|
2121
|
+
tags: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.string()).default({}),
|
|
2122
|
+
metadata: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).default({})
|
|
3161
2123
|
});
|
|
3162
2124
|
/**
|
|
3163
2125
|
* Schema for inserting spans
|
|
@@ -3411,198 +2373,6 @@ const createTracesDataLayer = (db) => {
|
|
|
3411
2373
|
};
|
|
3412
2374
|
};
|
|
3413
2375
|
|
|
3414
|
-
//#endregion
|
|
3415
|
-
//#region src/datalayer/variants.ts
|
|
3416
|
-
const createVariant = require_db.zod_default.object({ name: require_db.zod_default.string() });
|
|
3417
|
-
const updateVariant = require_db.zod_default.object({
|
|
3418
|
-
variantId: require_db.zod_default.string().uuid(),
|
|
3419
|
-
name: require_db.zod_default.string().optional()
|
|
3420
|
-
});
|
|
3421
|
-
const getVariantById = require_db.zod_default.object({ variantId: require_db.zod_default.string().uuid() });
|
|
3422
|
-
const deleteVariant = require_db.zod_default.object({ variantId: require_db.zod_default.string().uuid() });
|
|
3423
|
-
const listVariants = require_db.zod_default.object({
|
|
3424
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
3425
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
3426
|
-
});
|
|
3427
|
-
const createVariantDataLayer = (db) => {
|
|
3428
|
-
return {
|
|
3429
|
-
createVariant: async (params) => {
|
|
3430
|
-
const value = await createVariant.safeParseAsync(params);
|
|
3431
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3432
|
-
const { name } = value.data;
|
|
3433
|
-
return db.insertInto("variants").values({
|
|
3434
|
-
id: (0, node_crypto.randomUUID)(),
|
|
3435
|
-
name,
|
|
3436
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3437
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
3438
|
-
}).returningAll().executeTakeFirst();
|
|
3439
|
-
},
|
|
3440
|
-
updateVariant: async (params) => {
|
|
3441
|
-
const value = await updateVariant.safeParseAsync(params);
|
|
3442
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3443
|
-
const { variantId, ...updates } = value.data;
|
|
3444
|
-
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
3445
|
-
if (updates.name) updateData.name = updates.name;
|
|
3446
|
-
return db.updateTable("variants").set(updateData).where("id", "=", variantId).returningAll().executeTakeFirst();
|
|
3447
|
-
},
|
|
3448
|
-
getVariantById: async (params) => {
|
|
3449
|
-
const value = await getVariantById.safeParseAsync(params);
|
|
3450
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3451
|
-
const { variantId } = value.data;
|
|
3452
|
-
return db.selectFrom("variants").selectAll().where("id", "=", variantId).executeTakeFirst();
|
|
3453
|
-
},
|
|
3454
|
-
getVariantWithLatestVersion: async (params) => {
|
|
3455
|
-
const value = await getVariantById.safeParseAsync(params);
|
|
3456
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3457
|
-
const { variantId } = value.data;
|
|
3458
|
-
const variant = await db.selectFrom("variants").selectAll().where("id", "=", variantId).executeTakeFirst();
|
|
3459
|
-
if (!variant) return;
|
|
3460
|
-
const latestVersion = await db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
|
|
3461
|
-
return {
|
|
3462
|
-
...variant,
|
|
3463
|
-
latestVersion: latestVersion ?? null
|
|
3464
|
-
};
|
|
3465
|
-
},
|
|
3466
|
-
deleteVariant: async (params) => {
|
|
3467
|
-
const value = await deleteVariant.safeParseAsync(params);
|
|
3468
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3469
|
-
const { variantId } = value.data;
|
|
3470
|
-
await db.deleteFrom("variant_versions").where("variantId", "=", variantId).execute();
|
|
3471
|
-
return db.deleteFrom("variants").where("id", "=", variantId).returningAll().executeTakeFirst();
|
|
3472
|
-
},
|
|
3473
|
-
listVariants: async (params) => {
|
|
3474
|
-
const value = await listVariants.safeParseAsync(params || {});
|
|
3475
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3476
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
3477
|
-
return db.selectFrom("variants").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
3478
|
-
},
|
|
3479
|
-
listVariantsWithLatestVersion: async (params) => {
|
|
3480
|
-
const value = await listVariants.safeParseAsync(params || {});
|
|
3481
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3482
|
-
const { limit = 100, offset = 0 } = value.data;
|
|
3483
|
-
const variants = await db.selectFrom("variants").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
|
|
3484
|
-
if (variants.length === 0) return [];
|
|
3485
|
-
return await Promise.all(variants.map(async (variant) => {
|
|
3486
|
-
const latestVersion = await db.selectFrom("variant_versions").selectAll().where("variantId", "=", variant.id).orderBy("version", "desc").limit(1).executeTakeFirst();
|
|
3487
|
-
return {
|
|
3488
|
-
...variant,
|
|
3489
|
-
latestVersion: latestVersion ?? null
|
|
3490
|
-
};
|
|
3491
|
-
}));
|
|
3492
|
-
}
|
|
3493
|
-
};
|
|
3494
|
-
};
|
|
3495
|
-
|
|
3496
|
-
//#endregion
|
|
3497
|
-
//#region src/datalayer/variantVersions.ts
|
|
3498
|
-
const createVariantVersion = require_db.zod_default.object({
|
|
3499
|
-
variantId: require_db.zod_default.string().uuid(),
|
|
3500
|
-
provider: require_db.zod_default.string(),
|
|
3501
|
-
modelName: require_db.zod_default.string(),
|
|
3502
|
-
jsonData: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional().default({})
|
|
3503
|
-
});
|
|
3504
|
-
const getVariantVersionById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
3505
|
-
const getVariantVersionsByVariantId = require_db.zod_default.object({
|
|
3506
|
-
variantId: require_db.zod_default.string().uuid(),
|
|
3507
|
-
limit: require_db.zod_default.number().int().positive().optional(),
|
|
3508
|
-
offset: require_db.zod_default.number().int().nonnegative().optional()
|
|
3509
|
-
});
|
|
3510
|
-
const getLatestVariantVersion = require_db.zod_default.object({ variantId: require_db.zod_default.string().uuid() });
|
|
3511
|
-
const getVariantVersionByNumber = require_db.zod_default.object({
|
|
3512
|
-
variantId: require_db.zod_default.string().uuid(),
|
|
3513
|
-
version: require_db.zod_default.number().int().positive()
|
|
3514
|
-
});
|
|
3515
|
-
const deleteVariantVersion = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
|
|
3516
|
-
const createVariantVersionsDataLayer = (db) => {
|
|
3517
|
-
return {
|
|
3518
|
-
createVariantVersion: async (params) => {
|
|
3519
|
-
const value = await createVariantVersion.safeParseAsync(params);
|
|
3520
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3521
|
-
const { variantId, provider, modelName, jsonData } = value.data;
|
|
3522
|
-
const newVersionNumber = ((await db.selectFrom("variant_versions").select("version").where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst())?.version ?? 0) + 1;
|
|
3523
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
3524
|
-
return db.insertInto("variant_versions").values({
|
|
3525
|
-
id: (0, node_crypto.randomUUID)(),
|
|
3526
|
-
variantId,
|
|
3527
|
-
version: newVersionNumber,
|
|
3528
|
-
provider,
|
|
3529
|
-
modelName,
|
|
3530
|
-
jsonData: JSON.stringify(jsonData),
|
|
3531
|
-
createdAt: now,
|
|
3532
|
-
updatedAt: now
|
|
3533
|
-
}).returningAll().executeTakeFirst();
|
|
3534
|
-
},
|
|
3535
|
-
getVariantVersionById: async (params) => {
|
|
3536
|
-
const value = await getVariantVersionById.safeParseAsync(params);
|
|
3537
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3538
|
-
const { id } = value.data;
|
|
3539
|
-
return db.selectFrom("variant_versions").selectAll().where("id", "=", id).executeTakeFirst();
|
|
3540
|
-
},
|
|
3541
|
-
getVariantVersionsByVariantId: async (params) => {
|
|
3542
|
-
const value = await getVariantVersionsByVariantId.safeParseAsync(params);
|
|
3543
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3544
|
-
const { variantId, limit = 100, offset = 0 } = value.data;
|
|
3545
|
-
return db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(limit).offset(offset).execute();
|
|
3546
|
-
},
|
|
3547
|
-
getLatestVariantVersion: async (params) => {
|
|
3548
|
-
const value = await getLatestVariantVersion.safeParseAsync(params);
|
|
3549
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3550
|
-
const { variantId } = value.data;
|
|
3551
|
-
return db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
|
|
3552
|
-
},
|
|
3553
|
-
getVariantVersionByNumber: async (params) => {
|
|
3554
|
-
const value = await getVariantVersionByNumber.safeParseAsync(params);
|
|
3555
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3556
|
-
const { variantId, version } = value.data;
|
|
3557
|
-
return db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).where("version", "=", version).executeTakeFirst();
|
|
3558
|
-
},
|
|
3559
|
-
deleteVariantVersion: async (params) => {
|
|
3560
|
-
const value = await deleteVariantVersion.safeParseAsync(params);
|
|
3561
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3562
|
-
const { id } = value.data;
|
|
3563
|
-
return db.deleteFrom("variant_versions").where("id", "=", id).returningAll().executeTakeFirst();
|
|
3564
|
-
},
|
|
3565
|
-
deleteVariantVersionsByVariantId: async (params) => {
|
|
3566
|
-
const value = await getLatestVariantVersion.safeParseAsync(params);
|
|
3567
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3568
|
-
const { variantId } = value.data;
|
|
3569
|
-
return db.deleteFrom("variant_versions").where("variantId", "=", variantId).returningAll().execute();
|
|
3570
|
-
},
|
|
3571
|
-
getVariantVersionWithVariant: async (params) => {
|
|
3572
|
-
const value = await getVariantVersionById.safeParseAsync(params);
|
|
3573
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3574
|
-
const { id } = value.data;
|
|
3575
|
-
return db.selectFrom("variant_versions").innerJoin("variants", "variant_versions.variantId", "variants.id").select([
|
|
3576
|
-
"variant_versions.id",
|
|
3577
|
-
"variant_versions.variantId",
|
|
3578
|
-
"variant_versions.version",
|
|
3579
|
-
"variant_versions.provider",
|
|
3580
|
-
"variant_versions.modelName",
|
|
3581
|
-
"variant_versions.jsonData",
|
|
3582
|
-
"variant_versions.createdAt",
|
|
3583
|
-
"variant_versions.updatedAt",
|
|
3584
|
-
"variants.name as variantName"
|
|
3585
|
-
]).where("variant_versions.id", "=", id).executeTakeFirst();
|
|
3586
|
-
},
|
|
3587
|
-
getVariantVersionsWithVariantByVariantId: async (params) => {
|
|
3588
|
-
const value = await getVariantVersionsByVariantId.safeParseAsync(params);
|
|
3589
|
-
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
3590
|
-
const { variantId, limit = 100, offset = 0 } = value.data;
|
|
3591
|
-
return db.selectFrom("variant_versions").innerJoin("variants", "variant_versions.variantId", "variants.id").select([
|
|
3592
|
-
"variant_versions.id",
|
|
3593
|
-
"variant_versions.variantId",
|
|
3594
|
-
"variant_versions.version",
|
|
3595
|
-
"variant_versions.provider",
|
|
3596
|
-
"variant_versions.modelName",
|
|
3597
|
-
"variant_versions.jsonData",
|
|
3598
|
-
"variant_versions.createdAt",
|
|
3599
|
-
"variant_versions.updatedAt",
|
|
3600
|
-
"variants.name as variantName"
|
|
3601
|
-
]).where("variant_versions.variantId", "=", variantId).orderBy("variant_versions.version", "desc").limit(limit).offset(offset).execute();
|
|
3602
|
-
}
|
|
3603
|
-
};
|
|
3604
|
-
};
|
|
3605
|
-
|
|
3606
2376
|
//#endregion
|
|
3607
2377
|
//#region src/datalayer/workspaceSettings.ts
|
|
3608
2378
|
const updateWorkspaceSettings = require_db.zod_default.object({
|
|
@@ -3695,22 +2465,12 @@ const createWorkspaceSettingsDataLayer = (db) => {
|
|
|
3695
2465
|
*/
|
|
3696
2466
|
function createDataLayer(db) {
|
|
3697
2467
|
return {
|
|
3698
|
-
...createConfigDataLayer(db),
|
|
3699
|
-
...createConfigVariantDataLayer(db),
|
|
3700
2468
|
...createDatasetsDataLayer(db),
|
|
3701
|
-
...createEnvironmentDataLayer(db),
|
|
3702
|
-
...createEnvironmentSecretDataLayer(db),
|
|
3703
|
-
...createGuardrailConfigsDataLayer(db),
|
|
3704
2469
|
...createLLMRequestsDataLayer(db),
|
|
3705
2470
|
...createPlaygroundDataLayer(db),
|
|
3706
2471
|
...createPlaygroundResultsDataLayer(db),
|
|
3707
2472
|
...createPlaygroundRunsDataLayer(db),
|
|
3708
|
-
...createProviderConfigsDataLayer(db),
|
|
3709
|
-
...createProviderGuardrailOverridesDataLayer(db),
|
|
3710
|
-
...createTargetingRulesDataLayer(db),
|
|
3711
2473
|
...createTracesDataLayer(db),
|
|
3712
|
-
...createVariantDataLayer(db),
|
|
3713
|
-
...createVariantVersionsDataLayer(db),
|
|
3714
2474
|
...createWorkspaceSettingsDataLayer(db)
|
|
3715
2475
|
};
|
|
3716
2476
|
}
|
|
@@ -3989,372 +2749,42 @@ function getDefaultPricingProvider() {
|
|
|
3989
2749
|
}
|
|
3990
2750
|
|
|
3991
2751
|
//#endregion
|
|
3992
|
-
//#region src/
|
|
3993
|
-
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3994
|
-
/**
|
|
3995
|
-
* Builds the gateway routing manifest from database
|
|
3996
|
-
*/
|
|
3997
|
-
var ManifestBuilder = class {
|
|
3998
|
-
constructor(db) {
|
|
3999
|
-
this.db = db;
|
|
4000
|
-
}
|
|
4001
|
-
/**
|
|
4002
|
-
* Build the complete routing manifest from database
|
|
4003
|
-
*/
|
|
4004
|
-
async build() {
|
|
4005
|
-
const [configs, environments, environmentSecrets, targetingRules, configVariants, variantVersions, providerConfigs, guardrailConfigs, providerGuardrailOverridesData] = await Promise.all([
|
|
4006
|
-
this.db.selectFrom("configs").selectAll().execute(),
|
|
4007
|
-
this.db.selectFrom("environments").selectAll().execute(),
|
|
4008
|
-
this.db.selectFrom("environment_secrets").selectAll().execute(),
|
|
4009
|
-
this.db.selectFrom("targeting_rules").where("enabled", "=", true).selectAll().execute(),
|
|
4010
|
-
this.db.selectFrom("config_variants").selectAll().execute(),
|
|
4011
|
-
this.db.selectFrom("variant_versions").selectAll().execute(),
|
|
4012
|
-
this.db.selectFrom("provider_configs").selectAll().execute(),
|
|
4013
|
-
this.db.selectFrom("guardrail_configs").where("enabled", "=", true).selectAll().execute(),
|
|
4014
|
-
this.db.selectFrom("provider_guardrail_overrides").selectAll().execute()
|
|
4015
|
-
]);
|
|
4016
|
-
const manifestConfigs = {};
|
|
4017
|
-
const configsBySlug = {};
|
|
4018
|
-
for (const config of configs) {
|
|
4019
|
-
manifestConfigs[config.id] = {
|
|
4020
|
-
id: config.id,
|
|
4021
|
-
slug: config.slug,
|
|
4022
|
-
name: config.name ?? null
|
|
4023
|
-
};
|
|
4024
|
-
configsBySlug[config.slug] = config.id;
|
|
4025
|
-
}
|
|
4026
|
-
const manifestEnvironments = {};
|
|
4027
|
-
const environmentsBySlug = {};
|
|
4028
|
-
for (const env of environments) {
|
|
4029
|
-
manifestEnvironments[env.id] = {
|
|
4030
|
-
id: env.id,
|
|
4031
|
-
slug: env.slug,
|
|
4032
|
-
name: env.name,
|
|
4033
|
-
isProd: env.isProd
|
|
4034
|
-
};
|
|
4035
|
-
environmentsBySlug[env.slug] = env.id;
|
|
4036
|
-
}
|
|
4037
|
-
const secretToEnvironment = {};
|
|
4038
|
-
for (const secret of environmentSecrets) secretToEnvironment[secret.keyValue] = secret.environmentId;
|
|
4039
|
-
const configVariantMap = new Map(configVariants.map((cv) => [cv.id, cv]));
|
|
4040
|
-
const providerConfigMap = new Map(providerConfigs.map((pc) => [pc.id, pc]));
|
|
4041
|
-
const versionsByVariant = /* @__PURE__ */ new Map();
|
|
4042
|
-
for (const vv of variantVersions) {
|
|
4043
|
-
const list = versionsByVariant.get(vv.variantId) || [];
|
|
4044
|
-
list.push(vv);
|
|
4045
|
-
versionsByVariant.set(vv.variantId, list);
|
|
4046
|
-
}
|
|
4047
|
-
for (const list of versionsByVariant.values()) list.sort((a, b) => b.version - a.version);
|
|
4048
|
-
const versionById = new Map(variantVersions.map((vv) => [vv.id, vv]));
|
|
4049
|
-
const resolveProvider = (provider) => {
|
|
4050
|
-
if (UUID_REGEX.test(provider)) {
|
|
4051
|
-
const pc = providerConfigMap.get(provider);
|
|
4052
|
-
if (pc) return {
|
|
4053
|
-
providerId: pc.providerId,
|
|
4054
|
-
providerConfigId: pc.id
|
|
4055
|
-
};
|
|
4056
|
-
}
|
|
4057
|
-
return {
|
|
4058
|
-
providerId: provider,
|
|
4059
|
-
providerConfigId: null
|
|
4060
|
-
};
|
|
4061
|
-
};
|
|
4062
|
-
const buildVersion = (vv) => {
|
|
4063
|
-
const { providerId, providerConfigId } = resolveProvider(vv.provider);
|
|
4064
|
-
const jsonData = typeof vv.jsonData === "string" ? JSON.parse(vv.jsonData) : vv.jsonData;
|
|
4065
|
-
return {
|
|
4066
|
-
id: vv.id,
|
|
4067
|
-
variantId: vv.variantId,
|
|
4068
|
-
version: vv.version,
|
|
4069
|
-
provider: providerId,
|
|
4070
|
-
providerConfigId,
|
|
4071
|
-
modelName: vv.modelName,
|
|
4072
|
-
jsonData
|
|
4073
|
-
};
|
|
4074
|
-
};
|
|
4075
|
-
const routingTable = {};
|
|
4076
|
-
for (const rule of targetingRules) {
|
|
4077
|
-
const configVariant = configVariantMap.get(rule.configVariantId);
|
|
4078
|
-
if (!configVariant) continue;
|
|
4079
|
-
const variantId = configVariant.variantId;
|
|
4080
|
-
let resolvedVersionData;
|
|
4081
|
-
if (rule.variantVersionId) resolvedVersionData = versionById.get(rule.variantVersionId);
|
|
4082
|
-
else resolvedVersionData = versionsByVariant.get(variantId)?.[0];
|
|
4083
|
-
if (!resolvedVersionData) continue;
|
|
4084
|
-
let conditions = null;
|
|
4085
|
-
if (rule.conditions) {
|
|
4086
|
-
const conditionsObj = typeof rule.conditions === "string" ? JSON.parse(rule.conditions) : rule.conditions;
|
|
4087
|
-
if (conditionsObj && Object.keys(conditionsObj).length > 0) conditions = conditionsObj;
|
|
4088
|
-
}
|
|
4089
|
-
const manifestRule = {
|
|
4090
|
-
id: rule.id,
|
|
4091
|
-
configVariantId: rule.configVariantId,
|
|
4092
|
-
variantVersionId: rule.variantVersionId,
|
|
4093
|
-
weight: rule.weight,
|
|
4094
|
-
priority: rule.priority,
|
|
4095
|
-
enabled: rule.enabled,
|
|
4096
|
-
conditions,
|
|
4097
|
-
resolvedVersion: buildVersion(resolvedVersionData)
|
|
4098
|
-
};
|
|
4099
|
-
if (!routingTable[rule.configId]) routingTable[rule.configId] = {};
|
|
4100
|
-
if (!routingTable[rule.configId][rule.environmentId]) routingTable[rule.configId][rule.environmentId] = [];
|
|
4101
|
-
routingTable[rule.configId][rule.environmentId].push(manifestRule);
|
|
4102
|
-
}
|
|
4103
|
-
for (const configRules of Object.values(routingTable)) for (const envRules of Object.values(configRules)) envRules.sort((a, b) => {
|
|
4104
|
-
if (b.priority !== a.priority) return b.priority - a.priority;
|
|
4105
|
-
return b.weight - a.weight;
|
|
4106
|
-
});
|
|
4107
|
-
const beforeRequestGuardrails = [];
|
|
4108
|
-
const afterRequestGuardrails = [];
|
|
4109
|
-
require_db.logger.info(`[ManifestBuilder] Found ${guardrailConfigs.length} enabled guardrail configs`);
|
|
4110
|
-
for (const guardrail of guardrailConfigs) {
|
|
4111
|
-
const parameters = typeof guardrail.parameters === "string" ? JSON.parse(guardrail.parameters) : guardrail.parameters;
|
|
4112
|
-
const manifestGuardrail = {
|
|
4113
|
-
id: guardrail.id,
|
|
4114
|
-
name: guardrail.name,
|
|
4115
|
-
pluginId: guardrail.pluginId,
|
|
4116
|
-
functionId: guardrail.functionId,
|
|
4117
|
-
hookType: guardrail.hookType,
|
|
4118
|
-
parameters: parameters ?? {},
|
|
4119
|
-
priority: guardrail.priority,
|
|
4120
|
-
onFail: guardrail.onFail
|
|
4121
|
-
};
|
|
4122
|
-
if (guardrail.hookType === "beforeRequestHook") beforeRequestGuardrails.push(manifestGuardrail);
|
|
4123
|
-
else afterRequestGuardrails.push(manifestGuardrail);
|
|
4124
|
-
}
|
|
4125
|
-
beforeRequestGuardrails.sort((a, b) => b.priority - a.priority);
|
|
4126
|
-
afterRequestGuardrails.sort((a, b) => b.priority - a.priority);
|
|
4127
|
-
const providerGuardrailOverrides = {};
|
|
4128
|
-
for (const override of providerGuardrailOverridesData) {
|
|
4129
|
-
const parameters = typeof override.parameters === "string" ? JSON.parse(override.parameters) : override.parameters;
|
|
4130
|
-
const manifestOverride = {
|
|
4131
|
-
id: override.id,
|
|
4132
|
-
providerConfigId: override.providerConfigId,
|
|
4133
|
-
guardrailConfigId: override.guardrailConfigId,
|
|
4134
|
-
enabled: override.enabled,
|
|
4135
|
-
parameters: parameters ?? null
|
|
4136
|
-
};
|
|
4137
|
-
if (!providerGuardrailOverrides[override.providerConfigId]) providerGuardrailOverrides[override.providerConfigId] = [];
|
|
4138
|
-
providerGuardrailOverrides[override.providerConfigId].push(manifestOverride);
|
|
4139
|
-
}
|
|
4140
|
-
return {
|
|
4141
|
-
version: Date.now(),
|
|
4142
|
-
builtAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
4143
|
-
configs: manifestConfigs,
|
|
4144
|
-
configsBySlug,
|
|
4145
|
-
environments: manifestEnvironments,
|
|
4146
|
-
environmentsBySlug,
|
|
4147
|
-
routingTable,
|
|
4148
|
-
secretToEnvironment,
|
|
4149
|
-
guardrails: {
|
|
4150
|
-
beforeRequestHook: beforeRequestGuardrails,
|
|
4151
|
-
afterRequestHook: afterRequestGuardrails
|
|
4152
|
-
},
|
|
4153
|
-
providerGuardrailOverrides
|
|
4154
|
-
};
|
|
4155
|
-
}
|
|
4156
|
-
};
|
|
4157
|
-
|
|
4158
|
-
//#endregion
|
|
4159
|
-
//#region src/manifest/service.ts
|
|
4160
|
-
const MANIFEST_CACHE_KEY = "manifest";
|
|
4161
|
-
const MANIFEST_NAMESPACE = "gateway";
|
|
4162
|
-
const DEFAULT_TTL_MS = 300 * 1e3;
|
|
4163
|
-
const log = require_db.logger.child({ module: "ManifestService" });
|
|
4164
|
-
var ManifestService = class {
|
|
4165
|
-
builder;
|
|
4166
|
-
constructor(cache, db, ttlMs = DEFAULT_TTL_MS) {
|
|
4167
|
-
this.cache = cache;
|
|
4168
|
-
this.ttlMs = ttlMs;
|
|
4169
|
-
this.builder = new ManifestBuilder(db);
|
|
4170
|
-
log.debug({ ttlMs }, "ManifestService initialized");
|
|
4171
|
-
}
|
|
4172
|
-
/**
|
|
4173
|
-
* Get the current manifest, building if necessary
|
|
4174
|
-
*/
|
|
4175
|
-
async getManifest() {
|
|
4176
|
-
log.debug("Getting manifest from cache or building");
|
|
4177
|
-
const manifest = await this.cache.getOrSet(MANIFEST_CACHE_KEY, async () => {
|
|
4178
|
-
log.info("Building new manifest");
|
|
4179
|
-
const built = await this.builder.build();
|
|
4180
|
-
log.info({
|
|
4181
|
-
version: built.version,
|
|
4182
|
-
configCount: Object.keys(built.configs).length,
|
|
4183
|
-
environmentCount: Object.keys(built.environments).length
|
|
4184
|
-
}, "Manifest built successfully");
|
|
4185
|
-
return built;
|
|
4186
|
-
}, {
|
|
4187
|
-
namespace: MANIFEST_NAMESPACE,
|
|
4188
|
-
ttl: this.ttlMs
|
|
4189
|
-
});
|
|
4190
|
-
log.debug({ version: manifest.version }, "Manifest retrieved");
|
|
4191
|
-
return manifest;
|
|
4192
|
-
}
|
|
4193
|
-
/**
|
|
4194
|
-
* Force invalidate the manifest (called on mutations)
|
|
4195
|
-
*/
|
|
4196
|
-
async invalidate() {
|
|
4197
|
-
log.info("Invalidating manifest cache");
|
|
4198
|
-
await this.cache.delete(MANIFEST_CACHE_KEY, MANIFEST_NAMESPACE);
|
|
4199
|
-
}
|
|
4200
|
-
/**
|
|
4201
|
-
* Invalidate and immediately rebuild (atomic refresh)
|
|
4202
|
-
*/
|
|
4203
|
-
async refresh() {
|
|
4204
|
-
log.info("Refreshing manifest (invalidate + rebuild)");
|
|
4205
|
-
await this.invalidate();
|
|
4206
|
-
return this.getManifest();
|
|
4207
|
-
}
|
|
4208
|
-
/**
|
|
4209
|
-
* Get manifest version without fetching full manifest
|
|
4210
|
-
* Useful for checking if manifest is stale
|
|
4211
|
-
*/
|
|
4212
|
-
async getVersion() {
|
|
4213
|
-
const version = (await this.cache.get(MANIFEST_CACHE_KEY, MANIFEST_NAMESPACE))?.version ?? null;
|
|
4214
|
-
log.debug({ version }, "Got manifest version");
|
|
4215
|
-
return version;
|
|
4216
|
-
}
|
|
4217
|
-
/**
|
|
4218
|
-
* Check if manifest exists in cache
|
|
4219
|
-
*/
|
|
4220
|
-
async hasManifest() {
|
|
4221
|
-
const exists = await this.cache.has(MANIFEST_CACHE_KEY, MANIFEST_NAMESPACE);
|
|
4222
|
-
log.debug({ exists }, "Checked manifest existence");
|
|
4223
|
-
return exists;
|
|
4224
|
-
}
|
|
4225
|
-
};
|
|
4226
|
-
|
|
4227
|
-
//#endregion
|
|
4228
|
-
//#region src/manifest/router.ts
|
|
2752
|
+
//#region src/telemetry/postgres.ts
|
|
4229
2753
|
/**
|
|
4230
|
-
*
|
|
2754
|
+
* Create a PostgreSQL-backed telemetry store.
|
|
2755
|
+
*
|
|
2756
|
+
* Usage:
|
|
2757
|
+
* ```ts
|
|
2758
|
+
* import { llmops, pgStore } from '@llmops/sdk'
|
|
2759
|
+
*
|
|
2760
|
+
* const ops = llmops({
|
|
2761
|
+
* telemetry: pgStore(process.env.DATABASE_URL),
|
|
2762
|
+
* })
|
|
2763
|
+
* ```
|
|
4231
2764
|
*/
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
* Resolve environment from secret value
|
|
4245
|
-
*/
|
|
4246
|
-
resolveEnvironmentFromSecret(secretValue) {
|
|
4247
|
-
return this.manifest.secretToEnvironment[secretValue] ?? null;
|
|
4248
|
-
}
|
|
4249
|
-
/**
|
|
4250
|
-
* Get production environment ID
|
|
4251
|
-
*/
|
|
4252
|
-
getProductionEnvironmentId() {
|
|
4253
|
-
for (const env of Object.values(this.manifest.environments)) if (env.isProd) return env.id;
|
|
4254
|
-
return null;
|
|
4255
|
-
}
|
|
4256
|
-
/**
|
|
4257
|
-
* Get environment by ID
|
|
4258
|
-
*/
|
|
4259
|
-
getEnvironment(environmentId) {
|
|
4260
|
-
return this.manifest.environments[environmentId] ?? null;
|
|
4261
|
-
}
|
|
4262
|
-
/**
|
|
4263
|
-
* Get config by ID
|
|
4264
|
-
*/
|
|
4265
|
-
getConfig(configId) {
|
|
4266
|
-
return this.manifest.configs[configId] ?? null;
|
|
4267
|
-
}
|
|
4268
|
-
/**
|
|
4269
|
-
* Route a request to the appropriate variant version (first match wins)
|
|
4270
|
-
*/
|
|
4271
|
-
route(configIdOrSlug, environmentId, context = {}) {
|
|
4272
|
-
const configId = this.resolveConfigId(configIdOrSlug);
|
|
4273
|
-
if (!configId) return null;
|
|
4274
|
-
const rules = this.manifest.routingTable[configId]?.[environmentId];
|
|
4275
|
-
if (!rules || rules.length === 0) return null;
|
|
4276
|
-
const evalContext = {
|
|
4277
|
-
...context,
|
|
4278
|
-
timestamp: context.timestamp ?? Date.now()
|
|
4279
|
-
};
|
|
4280
|
-
for (const rule of rules) {
|
|
4281
|
-
if (!rule.enabled) continue;
|
|
4282
|
-
if (rule.conditions) try {
|
|
4283
|
-
if (!json_logic_js.default.apply(rule.conditions, evalContext)) continue;
|
|
4284
|
-
} catch (error) {
|
|
4285
|
-
console.warn(`JSONLogic evaluation error for rule ${rule.id}:`, error);
|
|
4286
|
-
continue;
|
|
4287
|
-
}
|
|
4288
|
-
return {
|
|
4289
|
-
configId,
|
|
4290
|
-
environmentId,
|
|
4291
|
-
variantId: rule.resolvedVersion.variantId,
|
|
4292
|
-
version: rule.resolvedVersion,
|
|
4293
|
-
rule
|
|
4294
|
-
};
|
|
4295
|
-
}
|
|
4296
|
-
return null;
|
|
4297
|
-
}
|
|
4298
|
-
/**
|
|
4299
|
-
* Route with weighted random selection among matching rules of same priority
|
|
4300
|
-
*/
|
|
4301
|
-
routeWithWeights(configIdOrSlug, environmentId, context = {}) {
|
|
4302
|
-
const configId = this.resolveConfigId(configIdOrSlug);
|
|
4303
|
-
if (!configId) return null;
|
|
4304
|
-
const rules = this.manifest.routingTable[configId]?.[environmentId];
|
|
4305
|
-
if (!rules || rules.length === 0) return null;
|
|
4306
|
-
const evalContext = {
|
|
4307
|
-
...context,
|
|
4308
|
-
timestamp: context.timestamp ?? Date.now()
|
|
4309
|
-
};
|
|
4310
|
-
const rulesByPriority = /* @__PURE__ */ new Map();
|
|
4311
|
-
for (const rule$1 of rules) {
|
|
4312
|
-
if (!rule$1.enabled) continue;
|
|
4313
|
-
if (rule$1.conditions) try {
|
|
4314
|
-
if (!json_logic_js.default.apply(rule$1.conditions, evalContext)) continue;
|
|
4315
|
-
} catch {
|
|
4316
|
-
continue;
|
|
4317
|
-
}
|
|
4318
|
-
const list = rulesByPriority.get(rule$1.priority) || [];
|
|
4319
|
-
list.push(rule$1);
|
|
4320
|
-
rulesByPriority.set(rule$1.priority, list);
|
|
2765
|
+
function createPgStore(connectionString, options) {
|
|
2766
|
+
const schema = options?.schema ?? "llmops";
|
|
2767
|
+
let pool;
|
|
2768
|
+
try {
|
|
2769
|
+
pool = new (require("pg")).Pool({ connectionString });
|
|
2770
|
+
} catch {
|
|
2771
|
+
throw new Error("pgStore requires the \"pg\" package. Install it with: pnpm add pg");
|
|
2772
|
+
}
|
|
2773
|
+
const db = new kysely.Kysely({ dialect: new kysely.PostgresDialect({
|
|
2774
|
+
pool,
|
|
2775
|
+
onCreateConnection: async (connection) => {
|
|
2776
|
+
await connection.executeQuery(kysely.CompiledQuery.raw(`SET search_path TO "${schema}"`));
|
|
4321
2777
|
}
|
|
4322
|
-
|
|
4323
|
-
|
|
4324
|
-
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
rule: rule$1
|
|
4333
|
-
};
|
|
4334
|
-
}
|
|
4335
|
-
const totalWeight = topPriorityRules.reduce((sum, r) => sum + r.weight, 0);
|
|
4336
|
-
if (totalWeight === 0) return null;
|
|
4337
|
-
let random = Math.random() * totalWeight;
|
|
4338
|
-
for (const rule$1 of topPriorityRules) {
|
|
4339
|
-
random -= rule$1.weight;
|
|
4340
|
-
if (random <= 0) return {
|
|
4341
|
-
configId,
|
|
4342
|
-
environmentId,
|
|
4343
|
-
variantId: rule$1.resolvedVersion.variantId,
|
|
4344
|
-
version: rule$1.resolvedVersion,
|
|
4345
|
-
rule: rule$1
|
|
4346
|
-
};
|
|
4347
|
-
}
|
|
4348
|
-
const rule = topPriorityRules[0];
|
|
4349
|
-
return {
|
|
4350
|
-
configId,
|
|
4351
|
-
environmentId,
|
|
4352
|
-
variantId: rule.resolvedVersion.variantId,
|
|
4353
|
-
version: rule.resolvedVersion,
|
|
4354
|
-
rule
|
|
4355
|
-
};
|
|
4356
|
-
}
|
|
4357
|
-
};
|
|
2778
|
+
}) });
|
|
2779
|
+
const llmRequests = createLLMRequestsDataLayer(db);
|
|
2780
|
+
const traces = createTracesDataLayer(db);
|
|
2781
|
+
require_db.logger.debug(`pgStore: initialized with schema "${schema}"`);
|
|
2782
|
+
return {
|
|
2783
|
+
...llmRequests,
|
|
2784
|
+
...traces,
|
|
2785
|
+
_db: db
|
|
2786
|
+
};
|
|
2787
|
+
}
|
|
4358
2788
|
|
|
4359
2789
|
//#endregion
|
|
4360
2790
|
exports.COST_SUMMARY_GROUP_BY = COST_SUMMARY_GROUP_BY;
|
|
@@ -4371,9 +2801,6 @@ exports.LLMOPS_TRACE_NAME_HEADER = LLMOPS_TRACE_NAME_HEADER;
|
|
|
4371
2801
|
exports.LLMOPS_USER_ID_HEADER = LLMOPS_USER_ID_HEADER;
|
|
4372
2802
|
exports.LLMOpsPricingProvider = LLMOpsPricingProvider;
|
|
4373
2803
|
exports.MS = MS;
|
|
4374
|
-
exports.ManifestBuilder = ManifestBuilder;
|
|
4375
|
-
exports.ManifestRouter = ManifestRouter;
|
|
4376
|
-
exports.ManifestService = ManifestService;
|
|
4377
2804
|
exports.MemoryCacheBackend = MemoryCacheBackend;
|
|
4378
2805
|
exports.SCHEMA_METADATA = require_db.SCHEMA_METADATA;
|
|
4379
2806
|
exports.SupportedProviders = SupportedProviders;
|
|
@@ -4382,26 +2809,17 @@ exports.calculateCost = calculateCost;
|
|
|
4382
2809
|
exports.chatCompletionCreateParamsBaseSchema = chatCompletionCreateParamsBaseSchema;
|
|
4383
2810
|
exports.configVariantsSchema = require_db.configVariantsSchema;
|
|
4384
2811
|
exports.configsSchema = require_db.configsSchema;
|
|
4385
|
-
exports.createConfigDataLayer = createConfigDataLayer;
|
|
4386
|
-
exports.createConfigVariantDataLayer = createConfigVariantDataLayer;
|
|
4387
2812
|
exports.createDataLayer = createDataLayer;
|
|
4388
2813
|
exports.createDatabase = require_db.createDatabase;
|
|
4389
2814
|
exports.createDatabaseFromConnection = require_db.createDatabaseFromConnection;
|
|
4390
2815
|
exports.createDatasetsDataLayer = createDatasetsDataLayer;
|
|
4391
|
-
exports.createEnvironmentDataLayer = createEnvironmentDataLayer;
|
|
4392
|
-
exports.createEnvironmentSecretDataLayer = createEnvironmentSecretDataLayer;
|
|
4393
|
-
exports.createGuardrailConfigsDataLayer = createGuardrailConfigsDataLayer;
|
|
4394
2816
|
exports.createLLMRequestsDataLayer = createLLMRequestsDataLayer;
|
|
4395
2817
|
exports.createNeonDialect = require_neon_dialect.createNeonDialect;
|
|
2818
|
+
exports.createPgStore = createPgStore;
|
|
4396
2819
|
exports.createPlaygroundDataLayer = createPlaygroundDataLayer;
|
|
4397
2820
|
exports.createPlaygroundResultsDataLayer = createPlaygroundResultsDataLayer;
|
|
4398
2821
|
exports.createPlaygroundRunsDataLayer = createPlaygroundRunsDataLayer;
|
|
4399
|
-
exports.createProviderConfigsDataLayer = createProviderConfigsDataLayer;
|
|
4400
|
-
exports.createProviderGuardrailOverridesDataLayer = createProviderGuardrailOverridesDataLayer;
|
|
4401
|
-
exports.createTargetingRulesDataLayer = createTargetingRulesDataLayer;
|
|
4402
2822
|
exports.createTracesDataLayer = createTracesDataLayer;
|
|
4403
|
-
exports.createVariantDataLayer = createVariantDataLayer;
|
|
4404
|
-
exports.createVariantVersionsDataLayer = createVariantVersionsDataLayer;
|
|
4405
2823
|
exports.createWorkspaceSettingsDataLayer = createWorkspaceSettingsDataLayer;
|
|
4406
2824
|
exports.datasetRecordsSchema = require_db.datasetRecordsSchema;
|
|
4407
2825
|
exports.datasetVersionRecordsSchema = require_db.datasetVersionRecordsSchema;
|
|
@@ -4420,7 +2838,6 @@ Object.defineProperty(exports, 'gateway', {
|
|
|
4420
2838
|
}
|
|
4421
2839
|
});
|
|
4422
2840
|
exports.generateId = generateId;
|
|
4423
|
-
exports.getAuthClientOptions = require_db.getAuthClientOptions;
|
|
4424
2841
|
exports.getDefaultPricingProvider = getDefaultPricingProvider;
|
|
4425
2842
|
exports.getDefaultProviders = getDefaultProviders;
|
|
4426
2843
|
exports.getMigrations = require_db.getMigrations;
|