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