@llmops/core 0.3.0 → 0.3.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- const require_db = require('./db-Du2xmkGS.cjs');
2
- const require_neon_dialect = require('./neon-dialect-BR1nZmKX.cjs');
1
+ const require_db = require('./db-CCKBHjuz.cjs');
2
+ const require_neon_dialect = require('./neon-dialect-DmI-frVR.cjs');
3
3
  let __llmops_gateway = require("@llmops/gateway");
4
4
  __llmops_gateway = require_db.__toESM(__llmops_gateway);
5
5
  let kysely = require("kysely");
@@ -358,6 +358,17 @@ const chatCompletionCreateParamsBaseSchema = require_db.object({
358
358
  web_search_options: webSearchOptionsSchema.optional()
359
359
  });
360
360
  /**
361
+ * Schema for variant message - simplified message format for variant config
362
+ */
363
+ const variantMessageSchema = require_db.object({
364
+ role: require_db._enum([
365
+ "system",
366
+ "user",
367
+ "assistant"
368
+ ]),
369
+ content: require_db.string()
370
+ });
371
+ /**
361
372
  * Schema for variant jsonData - these are the parameters that can be
362
373
  * configured per variant to override the default chat completion settings.
363
374
  * This is a subset of ChatCompletionCreateParamsBase that makes sense to
@@ -365,6 +376,7 @@ const chatCompletionCreateParamsBaseSchema = require_db.object({
365
376
  */
366
377
  const variantJsonDataSchema = require_db.object({
367
378
  system_prompt: require_db.string().optional(),
379
+ messages: require_db.array(variantMessageSchema).optional(),
368
380
  model: require_db.string().optional(),
369
381
  audio: chatCompletionAudioParamSchema.optional().nullable(),
370
382
  frequency_penalty: require_db.number().min(-2).max(2).optional().nullable(),
@@ -1446,6 +1458,99 @@ const createEnvironmentSecretDataLayer = (db) => {
1446
1458
  };
1447
1459
  };
1448
1460
 
1461
+ //#endregion
1462
+ //#region src/datalayer/guardrailConfigs.ts
1463
+ const createGuardrailConfig = require_db.zod_default.object({
1464
+ name: require_db.zod_default.string().min(1),
1465
+ pluginId: require_db.zod_default.string().min(1),
1466
+ functionId: require_db.zod_default.string().min(1),
1467
+ hookType: require_db.zod_default.enum(["beforeRequestHook", "afterRequestHook"]),
1468
+ parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional().default({}),
1469
+ enabled: require_db.zod_default.boolean().optional().default(true),
1470
+ priority: require_db.zod_default.number().int().optional().default(0),
1471
+ onFail: require_db.zod_default.enum(["block", "log"]).optional().default("block")
1472
+ });
1473
+ const updateGuardrailConfig = require_db.zod_default.object({
1474
+ id: require_db.zod_default.string().uuid(),
1475
+ name: require_db.zod_default.string().min(1).optional(),
1476
+ hookType: require_db.zod_default.enum(["beforeRequestHook", "afterRequestHook"]).optional(),
1477
+ parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional(),
1478
+ enabled: require_db.zod_default.boolean().optional(),
1479
+ priority: require_db.zod_default.number().int().optional(),
1480
+ onFail: require_db.zod_default.enum(["block", "log"]).optional()
1481
+ });
1482
+ const getGuardrailConfigById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
1483
+ const deleteGuardrailConfig = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
1484
+ const listGuardrailConfigs = require_db.zod_default.object({
1485
+ limit: require_db.zod_default.number().int().positive().optional(),
1486
+ offset: require_db.zod_default.number().int().nonnegative().optional(),
1487
+ hookType: require_db.zod_default.enum(["beforeRequestHook", "afterRequestHook"]).optional(),
1488
+ enabled: require_db.zod_default.boolean().optional()
1489
+ });
1490
+ const createGuardrailConfigsDataLayer = (db) => {
1491
+ return {
1492
+ createGuardrailConfig: async (params) => {
1493
+ const value = await createGuardrailConfig.safeParseAsync(params);
1494
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1495
+ const { name, pluginId, functionId, hookType, parameters, enabled, priority, onFail } = value.data;
1496
+ return db.insertInto("guardrail_configs").values({
1497
+ id: (0, node_crypto.randomUUID)(),
1498
+ name,
1499
+ pluginId,
1500
+ functionId,
1501
+ hookType,
1502
+ parameters: JSON.stringify(parameters),
1503
+ enabled,
1504
+ priority,
1505
+ onFail,
1506
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
1507
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
1508
+ }).returningAll().executeTakeFirst();
1509
+ },
1510
+ updateGuardrailConfig: async (params) => {
1511
+ const value = await updateGuardrailConfig.safeParseAsync(params);
1512
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1513
+ const { id, name, hookType, parameters, enabled, priority, onFail } = value.data;
1514
+ const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
1515
+ if (name !== void 0) updateData.name = name;
1516
+ if (hookType !== void 0) updateData.hookType = hookType;
1517
+ if (parameters !== void 0) updateData.parameters = JSON.stringify(parameters);
1518
+ if (enabled !== void 0) updateData.enabled = enabled;
1519
+ if (priority !== void 0) updateData.priority = priority;
1520
+ if (onFail !== void 0) updateData.onFail = onFail;
1521
+ return db.updateTable("guardrail_configs").set(updateData).where("id", "=", id).returningAll().executeTakeFirst();
1522
+ },
1523
+ getGuardrailConfigById: async (params) => {
1524
+ const value = await getGuardrailConfigById.safeParseAsync(params);
1525
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1526
+ const { id } = value.data;
1527
+ return db.selectFrom("guardrail_configs").selectAll().where("id", "=", id).executeTakeFirst();
1528
+ },
1529
+ deleteGuardrailConfig: async (params) => {
1530
+ const value = await deleteGuardrailConfig.safeParseAsync(params);
1531
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1532
+ const { id } = value.data;
1533
+ return db.deleteFrom("guardrail_configs").where("id", "=", id).returningAll().executeTakeFirst();
1534
+ },
1535
+ listGuardrailConfigs: async (params) => {
1536
+ const value = await listGuardrailConfigs.safeParseAsync(params || {});
1537
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1538
+ const { limit = 100, offset = 0, hookType, enabled } = value.data;
1539
+ let query = db.selectFrom("guardrail_configs").selectAll().orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset);
1540
+ if (hookType !== void 0) query = query.where("hookType", "=", hookType);
1541
+ if (enabled !== void 0) query = query.where("enabled", "=", enabled);
1542
+ return query.execute();
1543
+ },
1544
+ countGuardrailConfigs: async () => {
1545
+ const result = await db.selectFrom("guardrail_configs").select(db.fn.countAll().as("count")).executeTakeFirst();
1546
+ return Number(result?.count ?? 0);
1547
+ },
1548
+ getEnabledGuardrailsByHookType: async (hookType) => {
1549
+ return db.selectFrom("guardrail_configs").selectAll().where("hookType", "=", hookType).where("enabled", "=", true).orderBy("priority", "desc").execute();
1550
+ }
1551
+ };
1552
+ };
1553
+
1449
1554
  //#endregion
1450
1555
  //#region src/datalayer/llmRequests.ts
1451
1556
  /**
@@ -1935,6 +2040,111 @@ const createProviderConfigsDataLayer = (db) => {
1935
2040
  };
1936
2041
  };
1937
2042
 
2043
+ //#endregion
2044
+ //#region src/datalayer/providerGuardrailOverrides.ts
2045
+ const createProviderGuardrailOverride = require_db.zod_default.object({
2046
+ providerConfigId: require_db.zod_default.string().uuid(),
2047
+ guardrailConfigId: require_db.zod_default.string().uuid(),
2048
+ enabled: require_db.zod_default.boolean().optional().default(true),
2049
+ parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
2050
+ });
2051
+ const updateProviderGuardrailOverride = require_db.zod_default.object({
2052
+ id: require_db.zod_default.string().uuid(),
2053
+ enabled: require_db.zod_default.boolean().optional(),
2054
+ parameters: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
2055
+ });
2056
+ const getOverrideById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
2057
+ const deleteOverride = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
2058
+ const getOverridesByProviderConfigId = require_db.zod_default.object({ providerConfigId: require_db.zod_default.string().uuid() });
2059
+ const getOverridesByGuardrailConfigId = require_db.zod_default.object({ guardrailConfigId: require_db.zod_default.string().uuid() });
2060
+ const getOverrideByProviderAndGuardrail = require_db.zod_default.object({
2061
+ providerConfigId: require_db.zod_default.string().uuid(),
2062
+ guardrailConfigId: require_db.zod_default.string().uuid()
2063
+ });
2064
+ const createProviderGuardrailOverridesDataLayer = (db) => {
2065
+ return {
2066
+ createProviderGuardrailOverride: async (params) => {
2067
+ const value = await createProviderGuardrailOverride.safeParseAsync(params);
2068
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2069
+ const { providerConfigId, guardrailConfigId, enabled, parameters } = value.data;
2070
+ return db.insertInto("provider_guardrail_overrides").values({
2071
+ id: (0, node_crypto.randomUUID)(),
2072
+ providerConfigId,
2073
+ guardrailConfigId,
2074
+ enabled,
2075
+ parameters: parameters ? JSON.stringify(parameters) : null,
2076
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
2077
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2078
+ }).returningAll().executeTakeFirst();
2079
+ },
2080
+ updateProviderGuardrailOverride: async (params) => {
2081
+ const value = await updateProviderGuardrailOverride.safeParseAsync(params);
2082
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2083
+ const { id, enabled, parameters } = value.data;
2084
+ const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
2085
+ if (enabled !== void 0) updateData.enabled = enabled;
2086
+ if (parameters !== void 0) updateData.parameters = parameters ? JSON.stringify(parameters) : null;
2087
+ return db.updateTable("provider_guardrail_overrides").set(updateData).where("id", "=", id).returningAll().executeTakeFirst();
2088
+ },
2089
+ getOverrideById: async (params) => {
2090
+ const value = await getOverrideById.safeParseAsync(params);
2091
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2092
+ const { id } = value.data;
2093
+ return db.selectFrom("provider_guardrail_overrides").selectAll().where("id", "=", id).executeTakeFirst();
2094
+ },
2095
+ deleteProviderGuardrailOverride: async (params) => {
2096
+ const value = await deleteOverride.safeParseAsync(params);
2097
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2098
+ const { id } = value.data;
2099
+ return db.deleteFrom("provider_guardrail_overrides").where("id", "=", id).returningAll().executeTakeFirst();
2100
+ },
2101
+ getOverridesByProviderConfigId: async (params) => {
2102
+ const value = await getOverridesByProviderConfigId.safeParseAsync(params);
2103
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2104
+ const { providerConfigId } = value.data;
2105
+ return db.selectFrom("provider_guardrail_overrides").selectAll().where("providerConfigId", "=", providerConfigId).execute();
2106
+ },
2107
+ getOverridesByGuardrailConfigId: async (params) => {
2108
+ const value = await getOverridesByGuardrailConfigId.safeParseAsync(params);
2109
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2110
+ const { guardrailConfigId } = value.data;
2111
+ return db.selectFrom("provider_guardrail_overrides").selectAll().where("guardrailConfigId", "=", guardrailConfigId).execute();
2112
+ },
2113
+ getOverrideByProviderAndGuardrail: async (params) => {
2114
+ const value = await getOverrideByProviderAndGuardrail.safeParseAsync(params);
2115
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2116
+ const { providerConfigId, guardrailConfigId } = value.data;
2117
+ return db.selectFrom("provider_guardrail_overrides").selectAll().where("providerConfigId", "=", providerConfigId).where("guardrailConfigId", "=", guardrailConfigId).executeTakeFirst();
2118
+ },
2119
+ upsertProviderGuardrailOverride: async (params) => {
2120
+ const value = await createProviderGuardrailOverride.safeParseAsync(params);
2121
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2122
+ const { providerConfigId, guardrailConfigId, enabled, parameters } = value.data;
2123
+ const existing = await db.selectFrom("provider_guardrail_overrides").selectAll().where("providerConfigId", "=", providerConfigId).where("guardrailConfigId", "=", guardrailConfigId).executeTakeFirst();
2124
+ if (existing) return db.updateTable("provider_guardrail_overrides").set({
2125
+ enabled,
2126
+ parameters: parameters ? JSON.stringify(parameters) : null,
2127
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2128
+ }).where("id", "=", existing.id).returningAll().executeTakeFirst();
2129
+ return db.insertInto("provider_guardrail_overrides").values({
2130
+ id: (0, node_crypto.randomUUID)(),
2131
+ providerConfigId,
2132
+ guardrailConfigId,
2133
+ enabled,
2134
+ parameters: parameters ? JSON.stringify(parameters) : null,
2135
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
2136
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2137
+ }).returningAll().executeTakeFirst();
2138
+ },
2139
+ deleteOverridesByGuardrailConfigId: async (params) => {
2140
+ const value = await getOverridesByGuardrailConfigId.safeParseAsync(params);
2141
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
2142
+ const { guardrailConfigId } = value.data;
2143
+ return db.deleteFrom("provider_guardrail_overrides").where("guardrailConfigId", "=", guardrailConfigId).execute();
2144
+ }
2145
+ };
2146
+ };
2147
+
1938
2148
  //#endregion
1939
2149
  //#region src/datalayer/targetingRules.ts
1940
2150
  const createTargetingRule = require_db.zod_default.object({
@@ -2408,8 +2618,10 @@ const createDataLayer = async (db) => {
2408
2618
  ...createConfigVariantDataLayer(db),
2409
2619
  ...createEnvironmentDataLayer(db),
2410
2620
  ...createEnvironmentSecretDataLayer(db),
2621
+ ...createGuardrailConfigsDataLayer(db),
2411
2622
  ...createLLMRequestsDataLayer(db),
2412
2623
  ...createProviderConfigsDataLayer(db),
2624
+ ...createProviderGuardrailOverridesDataLayer(db),
2413
2625
  ...createTargetingRulesDataLayer(db),
2414
2626
  ...createVariantDataLayer(db),
2415
2627
  ...createVariantVersionsDataLayer(db),
@@ -2634,14 +2846,16 @@ var ManifestBuilder = class {
2634
2846
  * Build the complete routing manifest from database
2635
2847
  */
2636
2848
  async build() {
2637
- const [configs, environments, environmentSecrets, targetingRules, configVariants, variantVersions, providerConfigs] = await Promise.all([
2849
+ const [configs, environments, environmentSecrets, targetingRules, configVariants, variantVersions, providerConfigs, guardrailConfigs, providerGuardrailOverridesData] = await Promise.all([
2638
2850
  this.db.selectFrom("configs").selectAll().execute(),
2639
2851
  this.db.selectFrom("environments").selectAll().execute(),
2640
2852
  this.db.selectFrom("environment_secrets").selectAll().execute(),
2641
2853
  this.db.selectFrom("targeting_rules").where("enabled", "=", true).selectAll().execute(),
2642
2854
  this.db.selectFrom("config_variants").selectAll().execute(),
2643
2855
  this.db.selectFrom("variant_versions").selectAll().execute(),
2644
- this.db.selectFrom("provider_configs").selectAll().execute()
2856
+ this.db.selectFrom("provider_configs").selectAll().execute(),
2857
+ this.db.selectFrom("guardrail_configs").where("enabled", "=", true).selectAll().execute(),
2858
+ this.db.selectFrom("provider_guardrail_overrides").selectAll().execute()
2645
2859
  ]);
2646
2860
  const manifestConfigs = {};
2647
2861
  const configsBySlug = {};
@@ -2734,6 +2948,39 @@ var ManifestBuilder = class {
2734
2948
  if (b.priority !== a.priority) return b.priority - a.priority;
2735
2949
  return b.weight - a.weight;
2736
2950
  });
2951
+ const beforeRequestGuardrails = [];
2952
+ const afterRequestGuardrails = [];
2953
+ require_db.logger.info(`[ManifestBuilder] Found ${guardrailConfigs.length} enabled guardrail configs`);
2954
+ for (const guardrail of guardrailConfigs) {
2955
+ const parameters = typeof guardrail.parameters === "string" ? JSON.parse(guardrail.parameters) : guardrail.parameters;
2956
+ const manifestGuardrail = {
2957
+ id: guardrail.id,
2958
+ name: guardrail.name,
2959
+ pluginId: guardrail.pluginId,
2960
+ functionId: guardrail.functionId,
2961
+ hookType: guardrail.hookType,
2962
+ parameters: parameters ?? {},
2963
+ priority: guardrail.priority,
2964
+ onFail: guardrail.onFail
2965
+ };
2966
+ if (guardrail.hookType === "beforeRequestHook") beforeRequestGuardrails.push(manifestGuardrail);
2967
+ else afterRequestGuardrails.push(manifestGuardrail);
2968
+ }
2969
+ beforeRequestGuardrails.sort((a, b) => b.priority - a.priority);
2970
+ afterRequestGuardrails.sort((a, b) => b.priority - a.priority);
2971
+ const providerGuardrailOverrides = {};
2972
+ for (const override of providerGuardrailOverridesData) {
2973
+ const parameters = typeof override.parameters === "string" ? JSON.parse(override.parameters) : override.parameters;
2974
+ const manifestOverride = {
2975
+ id: override.id,
2976
+ providerConfigId: override.providerConfigId,
2977
+ guardrailConfigId: override.guardrailConfigId,
2978
+ enabled: override.enabled,
2979
+ parameters: parameters ?? null
2980
+ };
2981
+ if (!providerGuardrailOverrides[override.providerConfigId]) providerGuardrailOverrides[override.providerConfigId] = [];
2982
+ providerGuardrailOverrides[override.providerConfigId].push(manifestOverride);
2983
+ }
2737
2984
  return {
2738
2985
  version: Date.now(),
2739
2986
  builtAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -2742,7 +2989,12 @@ var ManifestBuilder = class {
2742
2989
  environments: manifestEnvironments,
2743
2990
  environmentsBySlug,
2744
2991
  routingTable,
2745
- secretToEnvironment
2992
+ secretToEnvironment,
2993
+ guardrails: {
2994
+ beforeRequestHook: beforeRequestGuardrails,
2995
+ afterRequestHook: afterRequestGuardrails
2996
+ },
2997
+ providerGuardrailOverrides
2746
2998
  };
2747
2999
  }
2748
3000
  };
@@ -2966,9 +3218,11 @@ exports.configsSchema = require_db.configsSchema;
2966
3218
  exports.createDataLayer = createDataLayer;
2967
3219
  exports.createDatabase = require_db.createDatabase;
2968
3220
  exports.createDatabaseFromConnection = require_db.createDatabaseFromConnection;
3221
+ exports.createGuardrailConfigsDataLayer = createGuardrailConfigsDataLayer;
2969
3222
  exports.createLLMRequestsDataLayer = createLLMRequestsDataLayer;
2970
3223
  exports.createNeonDialect = require_neon_dialect.createNeonDialect;
2971
3224
  exports.createProviderConfigsDataLayer = createProviderConfigsDataLayer;
3225
+ exports.createProviderGuardrailOverridesDataLayer = createProviderGuardrailOverridesDataLayer;
2972
3226
  exports.createWorkspaceSettingsDataLayer = createWorkspaceSettingsDataLayer;
2973
3227
  exports.detectDatabaseType = require_db.detectDatabaseType;
2974
3228
  exports.dollarsToMicroDollars = dollarsToMicroDollars;
@@ -2986,6 +3240,7 @@ exports.generateId = generateId;
2986
3240
  exports.getAuthClientOptions = require_db.getAuthClientOptions;
2987
3241
  exports.getDefaultPricingProvider = getDefaultPricingProvider;
2988
3242
  exports.getMigrations = require_db.getMigrations;
3243
+ exports.guardrailConfigsSchema = require_db.guardrailConfigsSchema;
2989
3244
  exports.llmRequestsSchema = require_db.llmRequestsSchema;
2990
3245
  exports.llmopsConfigSchema = llmopsConfigSchema;
2991
3246
  exports.logger = require_db.logger;
@@ -2994,6 +3249,7 @@ exports.microDollarsToDollars = microDollarsToDollars;
2994
3249
  exports.parsePartialTableData = require_db.parsePartialTableData;
2995
3250
  exports.parseTableData = require_db.parseTableData;
2996
3251
  exports.providerConfigsSchema = require_db.providerConfigsSchema;
3252
+ exports.providerGuardrailOverridesSchema = require_db.providerGuardrailOverridesSchema;
2997
3253
  exports.runAutoMigrations = require_db.runAutoMigrations;
2998
3254
  exports.schemas = require_db.schemas;
2999
3255
  exports.targetingRulesSchema = require_db.targetingRulesSchema;