@llmops/core 0.3.1 → 0.3.2-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.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");
@@ -1458,6 +1458,99 @@ const createEnvironmentSecretDataLayer = (db) => {
1458
1458
  };
1459
1459
  };
1460
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
+
1461
1554
  //#endregion
1462
1555
  //#region src/datalayer/llmRequests.ts
1463
1556
  /**
@@ -1947,6 +2040,111 @@ const createProviderConfigsDataLayer = (db) => {
1947
2040
  };
1948
2041
  };
1949
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
+
1950
2148
  //#endregion
1951
2149
  //#region src/datalayer/targetingRules.ts
1952
2150
  const createTargetingRule = require_db.zod_default.object({
@@ -2420,8 +2618,10 @@ const createDataLayer = async (db) => {
2420
2618
  ...createConfigVariantDataLayer(db),
2421
2619
  ...createEnvironmentDataLayer(db),
2422
2620
  ...createEnvironmentSecretDataLayer(db),
2621
+ ...createGuardrailConfigsDataLayer(db),
2423
2622
  ...createLLMRequestsDataLayer(db),
2424
2623
  ...createProviderConfigsDataLayer(db),
2624
+ ...createProviderGuardrailOverridesDataLayer(db),
2425
2625
  ...createTargetingRulesDataLayer(db),
2426
2626
  ...createVariantDataLayer(db),
2427
2627
  ...createVariantVersionsDataLayer(db),
@@ -2646,14 +2846,16 @@ var ManifestBuilder = class {
2646
2846
  * Build the complete routing manifest from database
2647
2847
  */
2648
2848
  async build() {
2649
- 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([
2650
2850
  this.db.selectFrom("configs").selectAll().execute(),
2651
2851
  this.db.selectFrom("environments").selectAll().execute(),
2652
2852
  this.db.selectFrom("environment_secrets").selectAll().execute(),
2653
2853
  this.db.selectFrom("targeting_rules").where("enabled", "=", true).selectAll().execute(),
2654
2854
  this.db.selectFrom("config_variants").selectAll().execute(),
2655
2855
  this.db.selectFrom("variant_versions").selectAll().execute(),
2656
- 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()
2657
2859
  ]);
2658
2860
  const manifestConfigs = {};
2659
2861
  const configsBySlug = {};
@@ -2746,6 +2948,39 @@ var ManifestBuilder = class {
2746
2948
  if (b.priority !== a.priority) return b.priority - a.priority;
2747
2949
  return b.weight - a.weight;
2748
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
+ }
2749
2984
  return {
2750
2985
  version: Date.now(),
2751
2986
  builtAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -2754,7 +2989,12 @@ var ManifestBuilder = class {
2754
2989
  environments: manifestEnvironments,
2755
2990
  environmentsBySlug,
2756
2991
  routingTable,
2757
- secretToEnvironment
2992
+ secretToEnvironment,
2993
+ guardrails: {
2994
+ beforeRequestHook: beforeRequestGuardrails,
2995
+ afterRequestHook: afterRequestGuardrails
2996
+ },
2997
+ providerGuardrailOverrides
2758
2998
  };
2759
2999
  }
2760
3000
  };
@@ -2978,9 +3218,11 @@ exports.configsSchema = require_db.configsSchema;
2978
3218
  exports.createDataLayer = createDataLayer;
2979
3219
  exports.createDatabase = require_db.createDatabase;
2980
3220
  exports.createDatabaseFromConnection = require_db.createDatabaseFromConnection;
3221
+ exports.createGuardrailConfigsDataLayer = createGuardrailConfigsDataLayer;
2981
3222
  exports.createLLMRequestsDataLayer = createLLMRequestsDataLayer;
2982
3223
  exports.createNeonDialect = require_neon_dialect.createNeonDialect;
2983
3224
  exports.createProviderConfigsDataLayer = createProviderConfigsDataLayer;
3225
+ exports.createProviderGuardrailOverridesDataLayer = createProviderGuardrailOverridesDataLayer;
2984
3226
  exports.createWorkspaceSettingsDataLayer = createWorkspaceSettingsDataLayer;
2985
3227
  exports.detectDatabaseType = require_db.detectDatabaseType;
2986
3228
  exports.dollarsToMicroDollars = dollarsToMicroDollars;
@@ -2998,6 +3240,7 @@ exports.generateId = generateId;
2998
3240
  exports.getAuthClientOptions = require_db.getAuthClientOptions;
2999
3241
  exports.getDefaultPricingProvider = getDefaultPricingProvider;
3000
3242
  exports.getMigrations = require_db.getMigrations;
3243
+ exports.guardrailConfigsSchema = require_db.guardrailConfigsSchema;
3001
3244
  exports.llmRequestsSchema = require_db.llmRequestsSchema;
3002
3245
  exports.llmopsConfigSchema = llmopsConfigSchema;
3003
3246
  exports.logger = require_db.logger;
@@ -3006,6 +3249,7 @@ exports.microDollarsToDollars = microDollarsToDollars;
3006
3249
  exports.parsePartialTableData = require_db.parsePartialTableData;
3007
3250
  exports.parseTableData = require_db.parseTableData;
3008
3251
  exports.providerConfigsSchema = require_db.providerConfigsSchema;
3252
+ exports.providerGuardrailOverridesSchema = require_db.providerGuardrailOverridesSchema;
3009
3253
  exports.runAutoMigrations = require_db.runAutoMigrations;
3010
3254
  exports.schemas = require_db.schemas;
3011
3255
  exports.targetingRulesSchema = require_db.targetingRulesSchema;