@llmops/core 0.6.10-beta.2 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,14 +1,11 @@
1
- const require_db = require('./db-D8otWwZL.cjs');
2
- const require_neon_dialect = require('./neon-dialect-ccr-mLKR.cjs');
1
+ const require_db = require('./db-D3WDjcvd.cjs');
2
+ const require_neon_dialect = require('./neon-dialect-DMClTHvw.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
- database: require_db.any().optional(),
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
- return (0, __better_auth_utils_random.createRandomStringGenerator)("a-z", "A-Z", "0-9")(size || 32);
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,161 +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
1389
  //#endregion
1877
1390
  //#region src/datalayer/guardrailConfigs.ts
1878
1391
  const createGuardrailConfig = require_db.zod_default.object({
@@ -2057,7 +1570,6 @@ const COST_SUMMARY_GROUP_BY = [
2057
1570
  "hour",
2058
1571
  "model",
2059
1572
  "provider",
2060
- "config",
2061
1573
  "endpoint",
2062
1574
  "tags"
2063
1575
  ];
@@ -2079,7 +1591,6 @@ const costSummarySchema = require_db.zod_default.object({
2079
1591
  * Uses sql.ref() to properly quote column names for the database
2080
1592
  */
2081
1593
  const col$1 = (name) => kysely.sql.ref(name);
2082
- const tableCol = (table, name) => kysely.sql.ref(`${table}.${name}`);
2083
1594
  const createLLMRequestsDataLayer = (db) => {
2084
1595
  return {
2085
1596
  batchInsertRequests: async (requests) => {
@@ -2253,25 +1764,6 @@ const createLLMRequestsDataLayer = (db) => {
2253
1764
  kysely.sql`AVG(${col$1("latencyMs")})`.as("avgLatencyMs")
2254
1765
  ]).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
1766
  },
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
1767
  getDailyCosts: async (params) => {
2276
1768
  const result = await dateRangeSchema.safeParseAsync(params);
2277
1769
  if (!result.success) throw new LLMOpsError(`Invalid parameters: ${result.error.message}`);
@@ -2324,11 +1816,6 @@ const createLLMRequestsDataLayer = (db) => {
2324
1816
  kysely.sql`COALESCE(SUM(${col$1("cost")}), 0)`.as("totalCost"),
2325
1817
  kysely.sql`COUNT(*)`.as("requestCount")
2326
1818
  ]).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
1819
  case "endpoint": return baseQuery.select([
2333
1820
  kysely.sql`COALESCE(${col$1("endpoint")}, 'unknown')`.as("groupKey"),
2334
1821
  kysely.sql`COALESCE(SUM(${col$1("cost")}), 0)`.as("totalCost"),
@@ -2939,199 +2426,6 @@ const createProviderGuardrailOverridesDataLayer = (db) => {
2939
2426
  };
2940
2427
  };
2941
2428
 
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
2429
  //#endregion
3136
2430
  //#region src/datalayer/traces.ts
3137
2431
  const col = (name) => kysely.sql.ref(name);
@@ -3411,198 +2705,6 @@ const createTracesDataLayer = (db) => {
3411
2705
  };
3412
2706
  };
3413
2707
 
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
2708
  //#endregion
3607
2709
  //#region src/datalayer/workspaceSettings.ts
3608
2710
  const updateWorkspaceSettings = require_db.zod_default.object({
@@ -3695,11 +2797,7 @@ const createWorkspaceSettingsDataLayer = (db) => {
3695
2797
  */
3696
2798
  function createDataLayer(db) {
3697
2799
  return {
3698
- ...createConfigDataLayer(db),
3699
- ...createConfigVariantDataLayer(db),
3700
2800
  ...createDatasetsDataLayer(db),
3701
- ...createEnvironmentDataLayer(db),
3702
- ...createEnvironmentSecretDataLayer(db),
3703
2801
  ...createGuardrailConfigsDataLayer(db),
3704
2802
  ...createLLMRequestsDataLayer(db),
3705
2803
  ...createPlaygroundDataLayer(db),
@@ -3707,10 +2805,7 @@ function createDataLayer(db) {
3707
2805
  ...createPlaygroundRunsDataLayer(db),
3708
2806
  ...createProviderConfigsDataLayer(db),
3709
2807
  ...createProviderGuardrailOverridesDataLayer(db),
3710
- ...createTargetingRulesDataLayer(db),
3711
2808
  ...createTracesDataLayer(db),
3712
- ...createVariantDataLayer(db),
3713
- ...createVariantVersionsDataLayer(db),
3714
2809
  ...createWorkspaceSettingsDataLayer(db)
3715
2810
  };
3716
2811
  }
@@ -3988,122 +3083,58 @@ function getDefaultPricingProvider() {
3988
3083
  return defaultProvider;
3989
3084
  }
3990
3085
 
3086
+ //#endregion
3087
+ //#region src/telemetry/postgres.ts
3088
+ /**
3089
+ * Create a PostgreSQL-backed telemetry store.
3090
+ *
3091
+ * Usage:
3092
+ * ```ts
3093
+ * import { llmops, pgStore } from '@llmops/sdk'
3094
+ *
3095
+ * const ops = llmops({
3096
+ * telemetry: pgStore(process.env.DATABASE_URL),
3097
+ * })
3098
+ * ```
3099
+ */
3100
+ function createPgStore(connectionString, options) {
3101
+ const schema = options?.schema ?? "llmops";
3102
+ let pool;
3103
+ try {
3104
+ pool = new (require("pg")).Pool({ connectionString });
3105
+ } catch {
3106
+ throw new Error("pgStore requires the \"pg\" package. Install it with: pnpm add pg");
3107
+ }
3108
+ const db = new kysely.Kysely({ dialect: new kysely.PostgresDialect({
3109
+ pool,
3110
+ onCreateConnection: async (connection) => {
3111
+ await connection.executeQuery(kysely.CompiledQuery.raw(`SET search_path TO "${schema}"`));
3112
+ }
3113
+ }) });
3114
+ const llmRequests = createLLMRequestsDataLayer(db);
3115
+ const traces = createTracesDataLayer(db);
3116
+ require_db.logger.debug(`pgStore: initialized with schema "${schema}"`);
3117
+ return {
3118
+ ...llmRequests,
3119
+ ...traces,
3120
+ _db: db
3121
+ };
3122
+ }
3123
+
3991
3124
  //#endregion
3992
3125
  //#region src/manifest/builder.ts
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
3126
  /**
3995
- * Builds the gateway routing manifest from database
3127
+ * Builds the gateway manifest from database
3996
3128
  */
3997
3129
  var ManifestBuilder = class {
3998
3130
  constructor(db) {
3999
3131
  this.db = db;
4000
3132
  }
4001
3133
  /**
4002
- * Build the complete routing manifest from database
3134
+ * Build the manifest from database
4003
3135
  */
4004
3136
  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
- });
3137
+ const [guardrailConfigs, providerGuardrailOverridesData] = await Promise.all([this.db.selectFrom("guardrail_configs").where("enabled", "=", true).selectAll().execute(), this.db.selectFrom("provider_guardrail_overrides").selectAll().execute()]);
4107
3138
  const beforeRequestGuardrails = [];
4108
3139
  const afterRequestGuardrails = [];
4109
3140
  require_db.logger.info(`[ManifestBuilder] Found ${guardrailConfigs.length} enabled guardrail configs`);
@@ -4140,12 +3171,6 @@ var ManifestBuilder = class {
4140
3171
  return {
4141
3172
  version: Date.now(),
4142
3173
  builtAt: (/* @__PURE__ */ new Date()).toISOString(),
4143
- configs: manifestConfigs,
4144
- configsBySlug,
4145
- environments: manifestEnvironments,
4146
- environmentsBySlug,
4147
- routingTable,
4148
- secretToEnvironment,
4149
3174
  guardrails: {
4150
3175
  beforeRequestHook: beforeRequestGuardrails,
4151
3176
  afterRequestHook: afterRequestGuardrails
@@ -4177,11 +3202,7 @@ var ManifestService = class {
4177
3202
  const manifest = await this.cache.getOrSet(MANIFEST_CACHE_KEY, async () => {
4178
3203
  log.info("Building new manifest");
4179
3204
  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");
3205
+ log.info({ version: built.version }, "Manifest built successfully");
4185
3206
  return built;
4186
3207
  }, {
4187
3208
  namespace: MANIFEST_NAMESPACE,
@@ -4224,138 +3245,6 @@ var ManifestService = class {
4224
3245
  }
4225
3246
  };
4226
3247
 
4227
- //#endregion
4228
- //#region src/manifest/router.ts
4229
- /**
4230
- * Router for evaluating the gateway manifest and selecting variants
4231
- */
4232
- var ManifestRouter = class {
4233
- constructor(manifest) {
4234
- this.manifest = manifest;
4235
- }
4236
- /**
4237
- * Resolve a config identifier (UUID or slug) to config ID
4238
- */
4239
- resolveConfigId(configIdOrSlug) {
4240
- if (this.manifest.configs[configIdOrSlug]) return configIdOrSlug;
4241
- return this.manifest.configsBySlug[configIdOrSlug] ?? null;
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);
4321
- }
4322
- const priorities = Array.from(rulesByPriority.keys()).sort((a, b) => b - a);
4323
- if (priorities.length === 0) return null;
4324
- const topPriorityRules = rulesByPriority.get(priorities[0]);
4325
- if (topPriorityRules.length === 1) {
4326
- const rule$1 = topPriorityRules[0];
4327
- return {
4328
- configId,
4329
- environmentId,
4330
- variantId: rule$1.resolvedVersion.variantId,
4331
- version: rule$1.resolvedVersion,
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
- };
4358
-
4359
3248
  //#endregion
4360
3249
  exports.COST_SUMMARY_GROUP_BY = COST_SUMMARY_GROUP_BY;
4361
3250
  exports.CacheService = CacheService;
@@ -4372,7 +3261,6 @@ exports.LLMOPS_USER_ID_HEADER = LLMOPS_USER_ID_HEADER;
4372
3261
  exports.LLMOpsPricingProvider = LLMOpsPricingProvider;
4373
3262
  exports.MS = MS;
4374
3263
  exports.ManifestBuilder = ManifestBuilder;
4375
- exports.ManifestRouter = ManifestRouter;
4376
3264
  exports.ManifestService = ManifestService;
4377
3265
  exports.MemoryCacheBackend = MemoryCacheBackend;
4378
3266
  exports.SCHEMA_METADATA = require_db.SCHEMA_METADATA;
@@ -4382,26 +3270,20 @@ exports.calculateCost = calculateCost;
4382
3270
  exports.chatCompletionCreateParamsBaseSchema = chatCompletionCreateParamsBaseSchema;
4383
3271
  exports.configVariantsSchema = require_db.configVariantsSchema;
4384
3272
  exports.configsSchema = require_db.configsSchema;
4385
- exports.createConfigDataLayer = createConfigDataLayer;
4386
- exports.createConfigVariantDataLayer = createConfigVariantDataLayer;
4387
3273
  exports.createDataLayer = createDataLayer;
4388
3274
  exports.createDatabase = require_db.createDatabase;
4389
3275
  exports.createDatabaseFromConnection = require_db.createDatabaseFromConnection;
4390
3276
  exports.createDatasetsDataLayer = createDatasetsDataLayer;
4391
- exports.createEnvironmentDataLayer = createEnvironmentDataLayer;
4392
- exports.createEnvironmentSecretDataLayer = createEnvironmentSecretDataLayer;
4393
3277
  exports.createGuardrailConfigsDataLayer = createGuardrailConfigsDataLayer;
4394
3278
  exports.createLLMRequestsDataLayer = createLLMRequestsDataLayer;
4395
3279
  exports.createNeonDialect = require_neon_dialect.createNeonDialect;
3280
+ exports.createPgStore = createPgStore;
4396
3281
  exports.createPlaygroundDataLayer = createPlaygroundDataLayer;
4397
3282
  exports.createPlaygroundResultsDataLayer = createPlaygroundResultsDataLayer;
4398
3283
  exports.createPlaygroundRunsDataLayer = createPlaygroundRunsDataLayer;
4399
3284
  exports.createProviderConfigsDataLayer = createProviderConfigsDataLayer;
4400
3285
  exports.createProviderGuardrailOverridesDataLayer = createProviderGuardrailOverridesDataLayer;
4401
- exports.createTargetingRulesDataLayer = createTargetingRulesDataLayer;
4402
3286
  exports.createTracesDataLayer = createTracesDataLayer;
4403
- exports.createVariantDataLayer = createVariantDataLayer;
4404
- exports.createVariantVersionsDataLayer = createVariantVersionsDataLayer;
4405
3287
  exports.createWorkspaceSettingsDataLayer = createWorkspaceSettingsDataLayer;
4406
3288
  exports.datasetRecordsSchema = require_db.datasetRecordsSchema;
4407
3289
  exports.datasetVersionRecordsSchema = require_db.datasetVersionRecordsSchema;
@@ -4420,7 +3302,6 @@ Object.defineProperty(exports, 'gateway', {
4420
3302
  }
4421
3303
  });
4422
3304
  exports.generateId = generateId;
4423
- exports.getAuthClientOptions = require_db.getAuthClientOptions;
4424
3305
  exports.getDefaultPricingProvider = getDefaultPricingProvider;
4425
3306
  exports.getDefaultProviders = getDefaultProviders;
4426
3307
  exports.getMigrations = require_db.getMigrations;