@llmops/core 0.1.0-beta.11 → 0.1.0-beta.13

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 ADDED
@@ -0,0 +1,1385 @@
1
+ const require_db = require('./db-CUPUfhtT.cjs');
2
+ let __llmops_gateway = require("@llmops/gateway");
3
+ __llmops_gateway = require_db.__toESM(__llmops_gateway);
4
+ let pino = require("pino");
5
+ pino = require_db.__toESM(pino);
6
+ let __better_auth_utils_random = require("@better-auth/utils/random");
7
+ let node_crypto = require("node:crypto");
8
+
9
+ //#region src/providers/supported-providers.ts
10
+ /**
11
+ * Supported providers - derived from @llmops/gateway providers
12
+ * @see packages/gateway/src/providers/index.ts
13
+ */
14
+ let SupportedProviders = /* @__PURE__ */ function(SupportedProviders$1) {
15
+ SupportedProviders$1["OPENAI"] = "openai";
16
+ SupportedProviders$1["COHERE"] = "cohere";
17
+ SupportedProviders$1["ANTHROPIC"] = "anthropic";
18
+ SupportedProviders$1["AZURE_OPENAI"] = "azure-openai";
19
+ SupportedProviders$1["HUGGINGFACE"] = "huggingface";
20
+ SupportedProviders$1["ANYSCALE"] = "anyscale";
21
+ SupportedProviders$1["PALM"] = "palm";
22
+ SupportedProviders$1["TOGETHER_AI"] = "together-ai";
23
+ SupportedProviders$1["GOOGLE"] = "google";
24
+ SupportedProviders$1["VERTEX_AI"] = "vertex-ai";
25
+ SupportedProviders$1["PERPLEXITY_AI"] = "perplexity-ai";
26
+ SupportedProviders$1["MISTRAL_AI"] = "mistral-ai";
27
+ SupportedProviders$1["DEEPINFRA"] = "deepinfra";
28
+ SupportedProviders$1["NCOMPASS"] = "ncompass";
29
+ SupportedProviders$1["STABILITY_AI"] = "stability-ai";
30
+ SupportedProviders$1["NOMIC"] = "nomic";
31
+ SupportedProviders$1["OLLAMA"] = "ollama";
32
+ SupportedProviders$1["AI21"] = "ai21";
33
+ SupportedProviders$1["BEDROCK"] = "bedrock";
34
+ SupportedProviders$1["GROQ"] = "groq";
35
+ SupportedProviders$1["SEGMIND"] = "segmind";
36
+ SupportedProviders$1["JINA"] = "jina";
37
+ SupportedProviders$1["FIREWORKS_AI"] = "fireworks-ai";
38
+ SupportedProviders$1["WORKERS_AI"] = "workers-ai";
39
+ SupportedProviders$1["REKA_AI"] = "reka-ai";
40
+ SupportedProviders$1["MOONSHOT"] = "moonshot";
41
+ SupportedProviders$1["OPENROUTER"] = "openrouter";
42
+ SupportedProviders$1["LINGYI"] = "lingyi";
43
+ SupportedProviders$1["ZHIPU"] = "zhipu";
44
+ SupportedProviders$1["NOVITA_AI"] = "novita-ai";
45
+ SupportedProviders$1["MONSTERAPI"] = "monsterapi";
46
+ SupportedProviders$1["DEEPSEEK"] = "deepseek";
47
+ SupportedProviders$1["PREDIBASE"] = "predibase";
48
+ SupportedProviders$1["TRITON"] = "triton";
49
+ SupportedProviders$1["VOYAGE"] = "voyage";
50
+ SupportedProviders$1["AZURE_AI"] = "azure-ai";
51
+ SupportedProviders$1["GITHUB"] = "github";
52
+ SupportedProviders$1["DEEPBRICKS"] = "deepbricks";
53
+ SupportedProviders$1["SILICONFLOW"] = "siliconflow";
54
+ SupportedProviders$1["CEREBRAS"] = "cerebras";
55
+ SupportedProviders$1["INFERENCE_NET"] = "inference-net";
56
+ SupportedProviders$1["SAMBANOVA"] = "sambanova";
57
+ SupportedProviders$1["LEMONFOX_AI"] = "lemonfox-ai";
58
+ SupportedProviders$1["UPSTAGE"] = "upstage";
59
+ SupportedProviders$1["LAMBDA"] = "lambda";
60
+ SupportedProviders$1["DASHSCOPE"] = "dashscope";
61
+ SupportedProviders$1["X_AI"] = "x-ai";
62
+ SupportedProviders$1["QDRANT"] = "qdrant";
63
+ SupportedProviders$1["SAGEMAKER"] = "sagemaker";
64
+ SupportedProviders$1["NEBIUS"] = "nebius";
65
+ SupportedProviders$1["RECRAFT_AI"] = "recraft-ai";
66
+ SupportedProviders$1["MILVUS"] = "milvus";
67
+ SupportedProviders$1["REPLICATE"] = "replicate";
68
+ SupportedProviders$1["LEPTON"] = "lepton";
69
+ SupportedProviders$1["KLUSTER_AI"] = "kluster-ai";
70
+ SupportedProviders$1["NSCALE"] = "nscale";
71
+ SupportedProviders$1["HYPERBOLIC"] = "hyperbolic";
72
+ SupportedProviders$1["BYTEZ"] = "bytez";
73
+ SupportedProviders$1["FEATHERLESS_AI"] = "featherless-ai";
74
+ SupportedProviders$1["KRUTRIM"] = "krutrim";
75
+ SupportedProviders$1["AI302"] = "302ai";
76
+ SupportedProviders$1["COMETAPI"] = "cometapi";
77
+ SupportedProviders$1["MATTERAI"] = "matterai";
78
+ SupportedProviders$1["MESHY"] = "meshy";
79
+ SupportedProviders$1["NEXTBIT"] = "nextbit";
80
+ SupportedProviders$1["TRIPO3D"] = "tripo3d";
81
+ SupportedProviders$1["MODAL"] = "modal";
82
+ SupportedProviders$1["Z_AI"] = "z-ai";
83
+ SupportedProviders$1["ORACLE"] = "oracle";
84
+ SupportedProviders$1["IOINTELLIGENCE"] = "iointelligence";
85
+ SupportedProviders$1["AIBADGR"] = "aibadgr";
86
+ return SupportedProviders$1;
87
+ }({});
88
+
89
+ //#endregion
90
+ //#region src/schemas/openai.ts
91
+ const chatCompletionContentPartTextSchema = require_db.object({
92
+ text: require_db.string(),
93
+ type: require_db.literal("text")
94
+ });
95
+ const chatCompletionContentPartImageSchema = require_db.object({
96
+ image_url: require_db.object({
97
+ url: require_db.string(),
98
+ detail: require_db._enum([
99
+ "auto",
100
+ "low",
101
+ "high"
102
+ ]).optional()
103
+ }),
104
+ type: require_db.literal("image_url")
105
+ });
106
+ const chatCompletionContentPartInputAudioSchema = require_db.object({
107
+ input_audio: require_db.object({
108
+ data: require_db.string(),
109
+ format: require_db._enum(["wav", "mp3"])
110
+ }),
111
+ type: require_db.literal("input_audio")
112
+ });
113
+ const chatCompletionContentPartFileSchema = require_db.object({
114
+ file: require_db.object({
115
+ file_data: require_db.string().optional(),
116
+ file_id: require_db.string().optional(),
117
+ filename: require_db.string().optional()
118
+ }),
119
+ type: require_db.literal("file")
120
+ });
121
+ const chatCompletionContentPartRefusalSchema = require_db.object({
122
+ refusal: require_db.string(),
123
+ type: require_db.literal("refusal")
124
+ });
125
+ const chatCompletionContentPartSchema = require_db.union([
126
+ chatCompletionContentPartTextSchema,
127
+ chatCompletionContentPartImageSchema,
128
+ chatCompletionContentPartInputAudioSchema,
129
+ chatCompletionContentPartFileSchema
130
+ ]);
131
+ const chatCompletionDeveloperMessageParamSchema = require_db.object({
132
+ content: require_db.union([require_db.string(), require_db.array(chatCompletionContentPartTextSchema)]),
133
+ role: require_db.literal("developer"),
134
+ name: require_db.string().optional()
135
+ });
136
+ const chatCompletionSystemMessageParamSchema = require_db.object({
137
+ content: require_db.union([require_db.string(), require_db.array(chatCompletionContentPartTextSchema)]),
138
+ role: require_db.literal("system"),
139
+ name: require_db.string().optional()
140
+ });
141
+ const chatCompletionUserMessageParamSchema = require_db.object({
142
+ content: require_db.union([require_db.string(), require_db.array(chatCompletionContentPartSchema)]),
143
+ role: require_db.literal("user"),
144
+ name: require_db.string().optional()
145
+ });
146
+ const chatCompletionMessageToolCallSchema = require_db.object({
147
+ id: require_db.string(),
148
+ function: require_db.object({
149
+ arguments: require_db.string(),
150
+ name: require_db.string()
151
+ }),
152
+ type: require_db.literal("function")
153
+ });
154
+ const chatCompletionAssistantMessageParamSchema = require_db.object({
155
+ role: require_db.literal("assistant"),
156
+ audio: require_db.object({ id: require_db.string() }).optional().nullable(),
157
+ content: require_db.union([require_db.string(), require_db.array(require_db.union([chatCompletionContentPartTextSchema, chatCompletionContentPartRefusalSchema]))]).optional().nullable(),
158
+ function_call: require_db.object({
159
+ arguments: require_db.string(),
160
+ name: require_db.string()
161
+ }).optional().nullable(),
162
+ name: require_db.string().optional(),
163
+ refusal: require_db.string().optional().nullable(),
164
+ tool_calls: require_db.array(chatCompletionMessageToolCallSchema).optional()
165
+ });
166
+ const chatCompletionToolMessageParamSchema = require_db.object({
167
+ content: require_db.union([require_db.string(), require_db.array(chatCompletionContentPartTextSchema)]),
168
+ role: require_db.literal("tool"),
169
+ tool_call_id: require_db.string()
170
+ });
171
+ const chatCompletionFunctionMessageParamSchema = require_db.object({
172
+ content: require_db.string().nullable(),
173
+ name: require_db.string(),
174
+ role: require_db.literal("function")
175
+ });
176
+ const chatCompletionMessageParamSchema = require_db.union([
177
+ chatCompletionDeveloperMessageParamSchema,
178
+ chatCompletionSystemMessageParamSchema,
179
+ chatCompletionUserMessageParamSchema,
180
+ chatCompletionAssistantMessageParamSchema,
181
+ chatCompletionToolMessageParamSchema,
182
+ chatCompletionFunctionMessageParamSchema
183
+ ]);
184
+ const functionDefinitionSchema = require_db.object({
185
+ name: require_db.string(),
186
+ description: require_db.string().optional(),
187
+ parameters: require_db.record(require_db.string(), require_db.any()).optional()
188
+ });
189
+ const chatCompletionFunctionToolSchema = require_db.object({
190
+ function: functionDefinitionSchema,
191
+ type: require_db.literal("function")
192
+ });
193
+ const chatCompletionCustomToolSchema = require_db.object({
194
+ custom: require_db.object({
195
+ name: require_db.string(),
196
+ description: require_db.string().optional(),
197
+ format: require_db.union([require_db.object({ type: require_db.literal("text") }), require_db.object({
198
+ grammar: require_db.object({
199
+ definition: require_db.string(),
200
+ syntax: require_db._enum(["lark", "regex"])
201
+ }),
202
+ type: require_db.literal("grammar")
203
+ })]).optional()
204
+ }),
205
+ type: require_db.literal("custom")
206
+ });
207
+ const chatCompletionToolSchema = require_db.union([chatCompletionFunctionToolSchema, chatCompletionCustomToolSchema]);
208
+ const chatCompletionNamedToolChoiceSchema = require_db.object({
209
+ function: require_db.object({ name: require_db.string() }),
210
+ type: require_db.literal("function")
211
+ });
212
+ const chatCompletionNamedToolChoiceCustomSchema = require_db.object({
213
+ custom: require_db.object({ name: require_db.string() }),
214
+ type: require_db.literal("custom")
215
+ });
216
+ const chatCompletionAllowedToolChoiceSchema = require_db.object({
217
+ allowed_tools: require_db.object({
218
+ mode: require_db._enum(["auto", "required"]),
219
+ tools: require_db.array(require_db.record(require_db.string(), require_db.unknown()))
220
+ }),
221
+ type: require_db.literal("allowed_tools")
222
+ });
223
+ const chatCompletionToolChoiceOptionSchema = require_db.union([
224
+ require_db._enum([
225
+ "none",
226
+ "auto",
227
+ "required"
228
+ ]),
229
+ chatCompletionAllowedToolChoiceSchema,
230
+ chatCompletionNamedToolChoiceSchema,
231
+ chatCompletionNamedToolChoiceCustomSchema
232
+ ]);
233
+ const chatCompletionAudioParamSchema = require_db.object({
234
+ format: require_db._enum([
235
+ "wav",
236
+ "aac",
237
+ "mp3",
238
+ "flac",
239
+ "opus",
240
+ "pcm16"
241
+ ]),
242
+ voice: require_db.union([require_db.string(), require_db._enum([
243
+ "alloy",
244
+ "ash",
245
+ "ballad",
246
+ "coral",
247
+ "echo",
248
+ "sage",
249
+ "shimmer",
250
+ "verse",
251
+ "marin",
252
+ "cedar"
253
+ ])])
254
+ });
255
+ const chatCompletionStreamOptionsSchema = require_db.object({
256
+ include_obfuscation: require_db.boolean().optional(),
257
+ include_usage: require_db.boolean().optional()
258
+ });
259
+ const chatCompletionPredictionContentSchema = require_db.object({
260
+ content: require_db.union([require_db.string(), require_db.array(chatCompletionContentPartTextSchema)]),
261
+ type: require_db.literal("content")
262
+ });
263
+ const responseFormatTextSchema = require_db.object({ type: require_db.literal("text") });
264
+ const responseFormatJSONObjectSchema = require_db.object({ type: require_db.literal("json_object") });
265
+ const responseFormatJSONSchemaSchema = require_db.object({
266
+ type: require_db.literal("json_schema"),
267
+ json_schema: require_db.object({
268
+ name: require_db.string(),
269
+ description: require_db.string().optional(),
270
+ schema: require_db.record(require_db.string(), require_db.any()).optional(),
271
+ strict: require_db.boolean().optional()
272
+ })
273
+ });
274
+ const responseFormatSchema = require_db.union([
275
+ responseFormatTextSchema,
276
+ responseFormatJSONObjectSchema,
277
+ responseFormatJSONSchemaSchema
278
+ ]);
279
+ const webSearchUserLocationSchema = require_db.object({
280
+ approximate: require_db.object({
281
+ city: require_db.string().optional(),
282
+ country: require_db.string().optional(),
283
+ region: require_db.string().optional(),
284
+ timezone: require_db.string().optional()
285
+ }),
286
+ type: require_db.literal("approximate")
287
+ });
288
+ const webSearchOptionsSchema = require_db.object({
289
+ search_context_size: require_db._enum([
290
+ "low",
291
+ "medium",
292
+ "high"
293
+ ]).optional(),
294
+ user_location: webSearchUserLocationSchema.optional().nullable()
295
+ });
296
+ const chatCompletionCreateParamsBaseSchema = require_db.object({
297
+ messages: require_db.array(chatCompletionMessageParamSchema),
298
+ model: require_db.string(),
299
+ audio: chatCompletionAudioParamSchema.optional().nullable(),
300
+ frequency_penalty: require_db.number().min(-2).max(2).optional().nullable(),
301
+ function_call: require_db.union([require_db._enum(["none", "auto"]), require_db.object({ name: require_db.string() })]).optional(),
302
+ functions: require_db.array(require_db.object({
303
+ name: require_db.string(),
304
+ description: require_db.string().optional(),
305
+ parameters: require_db.record(require_db.string(), require_db.any()).optional()
306
+ })).optional(),
307
+ logit_bias: require_db.record(require_db.string(), require_db.number().min(-100).max(100)).optional().nullable(),
308
+ logprobs: require_db.boolean().optional().nullable(),
309
+ max_completion_tokens: require_db.number().positive().optional().nullable(),
310
+ max_tokens: require_db.number().positive().optional().nullable(),
311
+ metadata: require_db.record(require_db.string(), require_db.string()).optional().nullable(),
312
+ modalities: require_db.array(require_db._enum(["text", "audio"])).optional().nullable(),
313
+ n: require_db.number().positive().optional().nullable(),
314
+ parallel_tool_calls: require_db.boolean().optional(),
315
+ prediction: chatCompletionPredictionContentSchema.optional().nullable(),
316
+ presence_penalty: require_db.number().min(-2).max(2).optional().nullable(),
317
+ prompt_cache_key: require_db.string().optional(),
318
+ prompt_cache_retention: require_db._enum(["in-memory", "24h"]).optional().nullable(),
319
+ reasoning_effort: require_db._enum([
320
+ "none",
321
+ "minimal",
322
+ "low",
323
+ "medium",
324
+ "high",
325
+ "xhigh"
326
+ ]).optional().nullable(),
327
+ response_format: responseFormatSchema.optional(),
328
+ safety_identifier: require_db.string().optional(),
329
+ seed: require_db.number().optional().nullable(),
330
+ service_tier: require_db._enum([
331
+ "auto",
332
+ "default",
333
+ "flex",
334
+ "scale",
335
+ "priority"
336
+ ]).optional().nullable(),
337
+ stop: require_db.union([require_db.string(), require_db.array(require_db.string())]).optional().nullable(),
338
+ store: require_db.boolean().optional().nullable(),
339
+ stream: require_db.boolean().optional().nullable(),
340
+ stream_options: chatCompletionStreamOptionsSchema.optional().nullable(),
341
+ temperature: require_db.number().min(0).max(2).optional().nullable(),
342
+ tool_choice: chatCompletionToolChoiceOptionSchema.optional(),
343
+ tools: require_db.array(chatCompletionToolSchema).optional(),
344
+ top_logprobs: require_db.number().min(0).max(20).optional().nullable(),
345
+ top_p: require_db.number().min(0).max(1).optional().nullable(),
346
+ user: require_db.string().optional(),
347
+ verbosity: require_db._enum([
348
+ "low",
349
+ "medium",
350
+ "high"
351
+ ]).optional().nullable(),
352
+ web_search_options: webSearchOptionsSchema.optional()
353
+ });
354
+ /**
355
+ * Schema for variant jsonData - these are the parameters that can be
356
+ * configured per variant to override the default chat completion settings.
357
+ * This is a subset of ChatCompletionCreateParamsBase that makes sense to
358
+ * configure at the variant level (excludes messages which come from the request).
359
+ */
360
+ const variantJsonDataSchema = require_db.object({
361
+ system_prompt: require_db.string().optional(),
362
+ model: require_db.string().optional(),
363
+ audio: chatCompletionAudioParamSchema.optional().nullable(),
364
+ frequency_penalty: require_db.number().min(-2).max(2).optional().nullable(),
365
+ function_call: require_db.union([require_db._enum(["none", "auto"]), require_db.object({ name: require_db.string() })]).optional(),
366
+ functions: require_db.array(require_db.object({
367
+ name: require_db.string(),
368
+ description: require_db.string().optional(),
369
+ parameters: require_db.record(require_db.string(), require_db.any()).optional()
370
+ })).optional(),
371
+ logit_bias: require_db.record(require_db.string(), require_db.number().min(-100).max(100)).optional().nullable(),
372
+ logprobs: require_db.boolean().optional().nullable(),
373
+ max_completion_tokens: require_db.number().positive().optional().nullable(),
374
+ max_tokens: require_db.number().positive().optional().nullable(),
375
+ metadata: require_db.record(require_db.string(), require_db.string()).optional().nullable(),
376
+ modalities: require_db.array(require_db._enum(["text", "audio"])).optional().nullable(),
377
+ n: require_db.number().positive().optional().nullable(),
378
+ parallel_tool_calls: require_db.boolean().optional(),
379
+ prediction: chatCompletionPredictionContentSchema.optional().nullable(),
380
+ presence_penalty: require_db.number().min(-2).max(2).optional().nullable(),
381
+ prompt_cache_key: require_db.string().optional(),
382
+ prompt_cache_retention: require_db._enum(["in-memory", "24h"]).optional().nullable(),
383
+ reasoning_effort: require_db._enum([
384
+ "none",
385
+ "minimal",
386
+ "low",
387
+ "medium",
388
+ "high",
389
+ "xhigh"
390
+ ]).optional().nullable(),
391
+ response_format: responseFormatSchema.optional(),
392
+ safety_identifier: require_db.string().optional(),
393
+ seed: require_db.number().optional().nullable(),
394
+ service_tier: require_db._enum([
395
+ "auto",
396
+ "default",
397
+ "flex",
398
+ "scale",
399
+ "priority"
400
+ ]).optional().nullable(),
401
+ stop: require_db.union([require_db.string(), require_db.array(require_db.string())]).optional().nullable(),
402
+ store: require_db.boolean().optional().nullable(),
403
+ stream: require_db.boolean().optional().nullable(),
404
+ stream_options: chatCompletionStreamOptionsSchema.optional().nullable(),
405
+ temperature: require_db.number().min(0).max(2).optional().nullable(),
406
+ tool_choice: chatCompletionToolChoiceOptionSchema.optional(),
407
+ tools: require_db.array(chatCompletionToolSchema).optional(),
408
+ top_logprobs: require_db.number().min(0).max(20).optional().nullable(),
409
+ top_p: require_db.number().min(0).max(1).optional().nullable(),
410
+ user: require_db.string().optional(),
411
+ verbosity: require_db._enum([
412
+ "low",
413
+ "medium",
414
+ "high"
415
+ ]).optional().nullable(),
416
+ web_search_options: webSearchOptionsSchema.optional()
417
+ });
418
+
419
+ //#endregion
420
+ //#region src/schemas/config.ts
421
+ /**
422
+ * Provider configuration schema
423
+ *
424
+ * This is a flexible schema that allows any provider configuration.
425
+ * The actual provider validation happens at the gateway level.
426
+ * Uses passthrough() to allow provider-specific options.
427
+ */
428
+ const providerConfigSchema = require_db.object({
429
+ apiKey: require_db.string().min(1, "API key is required"),
430
+ customHost: require_db.string().optional(),
431
+ requestTimeout: require_db.number().optional(),
432
+ forwardHeaders: require_db.array(require_db.string()).optional()
433
+ }).passthrough();
434
+ /**
435
+ * Build a partial object schema from SupportedProviders enum
436
+ * Each provider key is optional, allowing users to configure only the providers they need
437
+ */
438
+ const providerEntries = Object.values(SupportedProviders).map((provider) => [provider, providerConfigSchema.optional()]);
439
+ /**
440
+ * Providers configuration - maps supported provider names to their configs
441
+ * All providers are optional, but at least one must be configured
442
+ */
443
+ const providersSchema = require_db.object(Object.fromEntries(providerEntries)).refine((providers) => Object.values(providers).some((v) => v !== void 0 && v !== null), "At least one provider must be configured");
444
+ const authSchema = require_db.object({
445
+ type: require_db.literal("basic"),
446
+ defaultUser: require_db.string(),
447
+ defaultPassword: require_db.string()
448
+ });
449
+ const llmopsConfigSchema = require_db.object({
450
+ database: require_db.any(),
451
+ auth: authSchema,
452
+ basePath: require_db.string().min(1, "Base path is required and cannot be empty").refine((path) => path.startsWith("/"), "Base path must start with a forward slash"),
453
+ providers: providersSchema
454
+ });
455
+ function validateLLMOpsConfig(config) {
456
+ const result = llmopsConfigSchema.safeParse(config);
457
+ if (!result.success) {
458
+ const errorMessages = result.error.issues.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n");
459
+ throw new Error(`LLMOps configuration validation failed:\n${errorMessages}`);
460
+ }
461
+ return result.data;
462
+ }
463
+
464
+ //#endregion
465
+ //#region src/utils/logger.ts
466
+ const logger = (0, pino.default)();
467
+
468
+ //#endregion
469
+ //#region src/utils/id.ts
470
+ const generateId = (size) => {
471
+ return (0, __better_auth_utils_random.createRandomStringGenerator)("a-z", "A-Z", "0-9")(size || 32);
472
+ };
473
+
474
+ //#endregion
475
+ //#region src/error/index.ts
476
+ var LLMOpsError = class extends Error {
477
+ constructor(message, cause) {
478
+ super(message);
479
+ this.name = "LLMOpsError";
480
+ this.message = message;
481
+ this.cause = cause;
482
+ this.stack = "";
483
+ }
484
+ };
485
+
486
+ //#endregion
487
+ //#region src/datalayer/configs.ts
488
+ /**
489
+ * Generate a short unique ID for configs (8 characters, URL-safe)
490
+ * Uses base62 encoding (a-z, A-Z, 0-9) for shorter, readable IDs
491
+ */
492
+ function generateShortId(length = 8) {
493
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
494
+ const bytes = (0, node_crypto.randomBytes)(length);
495
+ let result = "";
496
+ for (let i = 0; i < length; i++) result += chars[bytes[i] % 62];
497
+ return result;
498
+ }
499
+ const createNewConfig = require_db.zod_default.object({ name: require_db.zod_default.string() });
500
+ const updateConfigName = require_db.zod_default.object({
501
+ configId: require_db.zod_default.uuidv4(),
502
+ newName: require_db.zod_default.string()
503
+ });
504
+ const getConfigById = require_db.zod_default.object({ configId: require_db.zod_default.uuidv4() });
505
+ const deleteConfig = require_db.zod_default.object({ configId: require_db.zod_default.uuidv4() });
506
+ const listConfigs = require_db.zod_default.object({
507
+ limit: require_db.zod_default.number().int().positive().optional(),
508
+ offset: require_db.zod_default.number().int().nonnegative().optional()
509
+ });
510
+ const createConfigDataLayer = (db) => {
511
+ return {
512
+ createNewConfig: async (params) => {
513
+ const value = await createNewConfig.safeParseAsync(params);
514
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
515
+ const { name } = value.data;
516
+ return db.insertInto("configs").values({
517
+ id: (0, node_crypto.randomUUID)(),
518
+ slug: generateShortId(),
519
+ name,
520
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
521
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
522
+ }).returningAll().executeTakeFirst();
523
+ },
524
+ updateConfigName: async (params) => {
525
+ const value = await updateConfigName.safeParseAsync(params);
526
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
527
+ const { newName, configId } = value.data;
528
+ return db.updateTable("configs").set({
529
+ name: newName,
530
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
531
+ }).where("id", "=", configId).returningAll().executeTakeFirst();
532
+ },
533
+ getConfigById: async (params) => {
534
+ const value = await getConfigById.safeParseAsync(params);
535
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
536
+ const { configId } = value.data;
537
+ return db.selectFrom("configs").selectAll().where("id", "=", configId).executeTakeFirst();
538
+ },
539
+ deleteConfig: async (params) => {
540
+ const value = await deleteConfig.safeParseAsync(params);
541
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
542
+ const { configId } = value.data;
543
+ return db.deleteFrom("configs").where("id", "=", configId).returningAll().executeTakeFirst();
544
+ },
545
+ listConfigs: async (params) => {
546
+ const value = await listConfigs.safeParseAsync(params || {});
547
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
548
+ const { limit = 100, offset = 0 } = value.data;
549
+ return db.selectFrom("configs").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
550
+ },
551
+ getConfigWithVariants: async (params) => {
552
+ const value = await getConfigById.safeParseAsync(params);
553
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
554
+ const { configId } = value.data;
555
+ const configData = await db.selectFrom("configs").leftJoin("config_variants", "configs.id", "config_variants.configId").leftJoin("variants", "config_variants.variantId", "variants.id").select([
556
+ "configs.id",
557
+ "configs.slug",
558
+ "configs.name",
559
+ "configs.createdAt",
560
+ "configs.updatedAt",
561
+ "variants.id as variantId",
562
+ "variants.name as variantName"
563
+ ]).where("configs.id", "=", configId).execute();
564
+ const variantIds = configData.map((row) => row.variantId).filter((id) => id !== null);
565
+ if (variantIds.length === 0) return configData.map((row) => ({
566
+ ...row,
567
+ provider: null,
568
+ modelName: null,
569
+ jsonData: null
570
+ }));
571
+ const latestVersions = await Promise.all(variantIds.map((variantId) => db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst()));
572
+ const versionMap = new Map(latestVersions.filter((v) => v !== void 0).map((v) => [v.variantId, v]));
573
+ return configData.map((row) => {
574
+ const version = row.variantId ? versionMap.get(row.variantId) : null;
575
+ return {
576
+ ...row,
577
+ provider: version?.provider ?? null,
578
+ modelName: version?.modelName ?? null,
579
+ jsonData: version?.jsonData ?? null
580
+ };
581
+ });
582
+ }
583
+ };
584
+ };
585
+
586
+ //#endregion
587
+ //#region src/datalayer/configVariants.ts
588
+ const createConfigVariant = require_db.zod_default.object({
589
+ configId: require_db.zod_default.string().uuid(),
590
+ variantId: require_db.zod_default.string().uuid()
591
+ });
592
+ const getConfigVariantById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
593
+ const getConfigVariantsByConfigId = require_db.zod_default.object({
594
+ configId: require_db.zod_default.string().uuid(),
595
+ limit: require_db.zod_default.number().int().positive().optional(),
596
+ offset: require_db.zod_default.number().int().nonnegative().optional()
597
+ });
598
+ const getConfigVariantsByVariantId = require_db.zod_default.object({
599
+ variantId: require_db.zod_default.string().uuid(),
600
+ limit: require_db.zod_default.number().int().positive().optional(),
601
+ offset: require_db.zod_default.number().int().nonnegative().optional()
602
+ });
603
+ const deleteConfigVariant = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
604
+ const deleteConfigVariantByIds = require_db.zod_default.object({
605
+ configId: require_db.zod_default.string().uuid(),
606
+ variantId: require_db.zod_default.string().uuid()
607
+ });
608
+ const listConfigVariants = require_db.zod_default.object({
609
+ limit: require_db.zod_default.number().int().positive().optional(),
610
+ offset: require_db.zod_default.number().int().nonnegative().optional()
611
+ });
612
+ const createVariantAndLinkToConfig = require_db.zod_default.object({
613
+ configId: require_db.zod_default.string().uuid(),
614
+ name: require_db.zod_default.string(),
615
+ provider: require_db.zod_default.string(),
616
+ modelName: require_db.zod_default.string(),
617
+ jsonData: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional().default({})
618
+ });
619
+ const getVariantJsonDataForConfig = require_db.zod_default.object({
620
+ configId: require_db.zod_default.string(),
621
+ envSecret: require_db.zod_default.string().optional()
622
+ });
623
+ const createConfigVariantDataLayer = (db) => {
624
+ return {
625
+ createConfigVariant: async (params) => {
626
+ const value = await createConfigVariant.safeParseAsync(params);
627
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
628
+ const { configId, variantId } = value.data;
629
+ return db.insertInto("config_variants").values({
630
+ id: (0, node_crypto.randomUUID)(),
631
+ configId,
632
+ variantId,
633
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
634
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
635
+ }).returningAll().executeTakeFirst();
636
+ },
637
+ getConfigVariantById: async (params) => {
638
+ const value = await getConfigVariantById.safeParseAsync(params);
639
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
640
+ const { id } = value.data;
641
+ return db.selectFrom("config_variants").selectAll().where("id", "=", id).executeTakeFirst();
642
+ },
643
+ getConfigVariantsByConfigId: async (params) => {
644
+ const value = await getConfigVariantsByConfigId.safeParseAsync(params);
645
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
646
+ const { configId, limit = 100, offset = 0 } = value.data;
647
+ return db.selectFrom("config_variants").selectAll().where("configId", "=", configId).orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
648
+ },
649
+ getConfigVariantsByVariantId: async (params) => {
650
+ const value = await getConfigVariantsByVariantId.safeParseAsync(params);
651
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
652
+ const { variantId, limit = 100, offset = 0 } = value.data;
653
+ return db.selectFrom("config_variants").selectAll().where("variantId", "=", variantId).orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
654
+ },
655
+ deleteConfigVariant: async (params) => {
656
+ const value = await deleteConfigVariant.safeParseAsync(params);
657
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
658
+ const { id } = value.data;
659
+ return db.deleteFrom("config_variants").where("id", "=", id).returningAll().executeTakeFirst();
660
+ },
661
+ deleteConfigVariantByIds: async (params) => {
662
+ const value = await deleteConfigVariantByIds.safeParseAsync(params);
663
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
664
+ const { configId, variantId } = value.data;
665
+ return db.deleteFrom("config_variants").where("configId", "=", configId).where("variantId", "=", variantId).returningAll().executeTakeFirst();
666
+ },
667
+ listConfigVariants: async (params) => {
668
+ const value = await listConfigVariants.safeParseAsync(params || {});
669
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
670
+ const { limit = 100, offset = 0 } = value.data;
671
+ return db.selectFrom("config_variants").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
672
+ },
673
+ getConfigVariantWithDetails: async (params) => {
674
+ const value = await getConfigVariantById.safeParseAsync(params);
675
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
676
+ const { id } = value.data;
677
+ const configVariant = await db.selectFrom("config_variants").leftJoin("configs", "config_variants.configId", "configs.id").leftJoin("variants", "config_variants.variantId", "variants.id").select([
678
+ "config_variants.id",
679
+ "config_variants.configId",
680
+ "config_variants.variantId",
681
+ "config_variants.createdAt",
682
+ "config_variants.updatedAt",
683
+ "configs.name as configName",
684
+ "variants.name as variantName"
685
+ ]).where("config_variants.id", "=", id).executeTakeFirst();
686
+ if (!configVariant) return;
687
+ const latestVersion = await db.selectFrom("variant_versions").selectAll().where("variantId", "=", configVariant.variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
688
+ return {
689
+ ...configVariant,
690
+ latestVersion: latestVersion ?? null
691
+ };
692
+ },
693
+ getConfigVariantsWithDetailsByConfigId: async (params) => {
694
+ const value = await getConfigVariantsByConfigId.safeParseAsync(params);
695
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
696
+ const { configId, limit = 100, offset = 0 } = value.data;
697
+ const configVariants = await db.selectFrom("config_variants").leftJoin("variants", "config_variants.variantId", "variants.id").select([
698
+ "config_variants.id",
699
+ "config_variants.configId",
700
+ "config_variants.variantId",
701
+ "config_variants.createdAt",
702
+ "config_variants.updatedAt",
703
+ "variants.name"
704
+ ]).where("config_variants.configId", "=", configId).orderBy("config_variants.createdAt", "desc").limit(limit).offset(offset).execute();
705
+ if (configVariants.length === 0) return [];
706
+ return await Promise.all(configVariants.map(async (cv) => {
707
+ const latestVersion = cv.variantId ? await db.selectFrom("variant_versions").selectAll().where("variantId", "=", cv.variantId).orderBy("version", "desc").limit(1).executeTakeFirst() : null;
708
+ return {
709
+ ...cv,
710
+ provider: latestVersion?.provider ?? null,
711
+ modelName: latestVersion?.modelName ?? null,
712
+ jsonData: latestVersion?.jsonData ?? null,
713
+ latestVersion: latestVersion ?? null
714
+ };
715
+ }));
716
+ },
717
+ createVariantAndLinkToConfig: async (params) => {
718
+ const value = await createVariantAndLinkToConfig.safeParseAsync(params);
719
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
720
+ const { configId, name, provider, modelName, jsonData } = value.data;
721
+ const variantId = (0, node_crypto.randomUUID)();
722
+ const versionId = (0, node_crypto.randomUUID)();
723
+ const now = (/* @__PURE__ */ new Date()).toISOString();
724
+ const variant = await db.insertInto("variants").values({
725
+ id: variantId,
726
+ name,
727
+ createdAt: now,
728
+ updatedAt: now
729
+ }).returningAll().executeTakeFirst();
730
+ if (!variant) throw new LLMOpsError("Failed to create variant");
731
+ const version = await db.insertInto("variant_versions").values({
732
+ id: versionId,
733
+ variantId,
734
+ version: 1,
735
+ provider,
736
+ modelName,
737
+ jsonData: JSON.stringify(jsonData),
738
+ createdAt: now,
739
+ updatedAt: now
740
+ }).returningAll().executeTakeFirst();
741
+ if (!version) throw new LLMOpsError("Failed to create variant version");
742
+ const configVariant = await db.insertInto("config_variants").values({
743
+ id: (0, node_crypto.randomUUID)(),
744
+ configId,
745
+ variantId,
746
+ createdAt: now,
747
+ updatedAt: now
748
+ }).returningAll().executeTakeFirst();
749
+ if (!configVariant) throw new LLMOpsError("Failed to link variant to config");
750
+ return {
751
+ variant,
752
+ version,
753
+ configVariant
754
+ };
755
+ },
756
+ getVariantJsonDataForConfig: async (params) => {
757
+ const value = await getVariantJsonDataForConfig.safeParseAsync(params);
758
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
759
+ const { configId: configIdOrSlug, envSecret } = value.data;
760
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
761
+ let resolvedConfigId;
762
+ if (UUID_REGEX.test(configIdOrSlug)) resolvedConfigId = configIdOrSlug;
763
+ else {
764
+ const config = await db.selectFrom("configs").select("id").where("slug", "=", configIdOrSlug).executeTakeFirst();
765
+ if (!config) throw new LLMOpsError(`Config not found: ${configIdOrSlug}`);
766
+ resolvedConfigId = config.id;
767
+ }
768
+ let environmentId;
769
+ if (envSecret) {
770
+ const secret = await db.selectFrom("environment_secrets").select("environmentId").where("keyValue", "=", envSecret).executeTakeFirst();
771
+ if (!secret) throw new LLMOpsError("Invalid environment secret");
772
+ environmentId = secret.environmentId;
773
+ } else {
774
+ const prodEnv = await db.selectFrom("environments").select("id").where("isProd", "=", true).executeTakeFirst();
775
+ if (!prodEnv) throw new LLMOpsError("No production environment found");
776
+ environmentId = prodEnv.id;
777
+ }
778
+ 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();
779
+ if (!targetingRule) throw new LLMOpsError(`No targeting rule found for config ${resolvedConfigId} in environment ${environmentId}`);
780
+ const configVariant = await db.selectFrom("config_variants").select("variantId").where("id", "=", targetingRule.configVariantId).executeTakeFirst();
781
+ if (!configVariant) throw new LLMOpsError(`No config variant found for ${targetingRule.configVariantId}`);
782
+ let versionData;
783
+ if (targetingRule.variantVersionId) versionData = await db.selectFrom("variant_versions").select([
784
+ "jsonData",
785
+ "provider",
786
+ "modelName",
787
+ "version"
788
+ ]).where("id", "=", targetingRule.variantVersionId).executeTakeFirst();
789
+ else versionData = await db.selectFrom("variant_versions").select([
790
+ "jsonData",
791
+ "provider",
792
+ "modelName",
793
+ "version"
794
+ ]).where("variantId", "=", configVariant.variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
795
+ if (!versionData) throw new LLMOpsError(`No variant version found for variant ${configVariant.variantId}`);
796
+ return versionData;
797
+ }
798
+ };
799
+ };
800
+
801
+ //#endregion
802
+ //#region src/datalayer/environments.ts
803
+ const createNewEnvironment = require_db.zod_default.object({
804
+ name: require_db.zod_default.string(),
805
+ slug: require_db.zod_default.string(),
806
+ isProd: require_db.zod_default.boolean().optional().default(false)
807
+ });
808
+ const updateEnvironment = require_db.zod_default.object({
809
+ environmentId: require_db.zod_default.uuidv4(),
810
+ name: require_db.zod_default.string().optional(),
811
+ slug: require_db.zod_default.string().optional()
812
+ });
813
+ const getEnvironmentById = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
814
+ const getEnvironmentBySlug = require_db.zod_default.object({ slug: require_db.zod_default.string() });
815
+ const deleteEnvironment = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
816
+ const listEnvironments = require_db.zod_default.object({
817
+ limit: require_db.zod_default.number().int().positive().optional(),
818
+ offset: require_db.zod_default.number().int().nonnegative().optional()
819
+ });
820
+ const createEnvironmentDataLayer = (db) => {
821
+ return {
822
+ createNewEnvironment: async (params) => {
823
+ const value = await createNewEnvironment.safeParseAsync(params);
824
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
825
+ const { name, slug, isProd } = value.data;
826
+ return db.insertInto("environments").values({
827
+ id: (0, node_crypto.randomUUID)(),
828
+ name,
829
+ slug,
830
+ isProd,
831
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
832
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
833
+ }).returningAll().executeTakeFirst();
834
+ },
835
+ updateEnvironment: async (params) => {
836
+ const value = await updateEnvironment.safeParseAsync(params);
837
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
838
+ const { environmentId, name, slug } = value.data;
839
+ const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
840
+ if (name !== void 0) updateData.name = name;
841
+ if (slug !== void 0) updateData.slug = slug;
842
+ return db.updateTable("environments").set(updateData).where("id", "=", environmentId).returningAll().executeTakeFirst();
843
+ },
844
+ getEnvironmentById: async (params) => {
845
+ const value = await getEnvironmentById.safeParseAsync(params);
846
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
847
+ const { environmentId } = value.data;
848
+ return db.selectFrom("environments").selectAll().where("id", "=", environmentId).executeTakeFirst();
849
+ },
850
+ getEnvironmentBySlug: async (params) => {
851
+ const value = await getEnvironmentBySlug.safeParseAsync(params);
852
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
853
+ const { slug } = value.data;
854
+ return db.selectFrom("environments").selectAll().where("slug", "=", slug).executeTakeFirst();
855
+ },
856
+ deleteEnvironment: async (params) => {
857
+ const value = await deleteEnvironment.safeParseAsync(params);
858
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
859
+ const { environmentId } = value.data;
860
+ return db.deleteFrom("environments").where("id", "=", environmentId).returningAll().executeTakeFirst();
861
+ },
862
+ listEnvironments: async (params) => {
863
+ const value = await listEnvironments.safeParseAsync(params || {});
864
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
865
+ const { limit = 100, offset = 0 } = value.data;
866
+ return db.selectFrom("environments").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
867
+ },
868
+ countEnvironments: async () => {
869
+ const result = await db.selectFrom("environments").select(db.fn.countAll().as("count")).executeTakeFirst();
870
+ return Number(result?.count ?? 0);
871
+ }
872
+ };
873
+ };
874
+
875
+ //#endregion
876
+ //#region src/datalayer/environmentSecrets.ts
877
+ const createEnvironmentSecret = require_db.zod_default.object({
878
+ environmentId: require_db.zod_default.uuidv4(),
879
+ keyName: require_db.zod_default.string(),
880
+ keyValue: require_db.zod_default.string()
881
+ });
882
+ const updateEnvironmentSecret = require_db.zod_default.object({
883
+ secretId: require_db.zod_default.uuidv4(),
884
+ keyName: require_db.zod_default.string().optional(),
885
+ keyValue: require_db.zod_default.string().optional()
886
+ });
887
+ const getEnvironmentSecretById = require_db.zod_default.object({ secretId: require_db.zod_default.uuidv4() });
888
+ const getSecretsByEnvironmentId = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
889
+ const deleteEnvironmentSecret = require_db.zod_default.object({ secretId: require_db.zod_default.uuidv4() });
890
+ const deleteSecretsByEnvironmentId = require_db.zod_default.object({ environmentId: require_db.zod_default.uuidv4() });
891
+ const listEnvironmentSecrets = require_db.zod_default.object({
892
+ limit: require_db.zod_default.number().int().positive().optional(),
893
+ offset: require_db.zod_default.number().int().nonnegative().optional()
894
+ });
895
+ const createEnvironmentSecretDataLayer = (db) => {
896
+ return {
897
+ createEnvironmentSecret: async (params) => {
898
+ const value = await createEnvironmentSecret.safeParseAsync(params);
899
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
900
+ const { environmentId, keyName, keyValue } = value.data;
901
+ return db.insertInto("environment_secrets").values({
902
+ id: (0, node_crypto.randomUUID)(),
903
+ environmentId,
904
+ keyName,
905
+ keyValue,
906
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
907
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
908
+ }).returningAll().executeTakeFirst();
909
+ },
910
+ updateEnvironmentSecret: async (params) => {
911
+ const value = await updateEnvironmentSecret.safeParseAsync(params);
912
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
913
+ const { secretId, keyName, keyValue } = value.data;
914
+ const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
915
+ if (keyName !== void 0) updateData.keyName = keyName;
916
+ if (keyValue !== void 0) updateData.keyValue = keyValue;
917
+ return db.updateTable("environment_secrets").set(updateData).where("id", "=", secretId).returningAll().executeTakeFirst();
918
+ },
919
+ getEnvironmentSecretById: async (params) => {
920
+ const value = await getEnvironmentSecretById.safeParseAsync(params);
921
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
922
+ const { secretId } = value.data;
923
+ return db.selectFrom("environment_secrets").selectAll().where("id", "=", secretId).executeTakeFirst();
924
+ },
925
+ getSecretsByEnvironmentId: async (params) => {
926
+ const value = await getSecretsByEnvironmentId.safeParseAsync(params);
927
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
928
+ const { environmentId } = value.data;
929
+ return db.selectFrom("environment_secrets").selectAll().where("environmentId", "=", environmentId).orderBy("createdAt", "desc").execute();
930
+ },
931
+ deleteEnvironmentSecret: async (params) => {
932
+ const value = await deleteEnvironmentSecret.safeParseAsync(params);
933
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
934
+ const { secretId } = value.data;
935
+ return db.deleteFrom("environment_secrets").where("id", "=", secretId).returningAll().executeTakeFirst();
936
+ },
937
+ deleteSecretsByEnvironmentId: async (params) => {
938
+ const value = await deleteSecretsByEnvironmentId.safeParseAsync(params);
939
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
940
+ const { environmentId } = value.data;
941
+ return db.deleteFrom("environment_secrets").where("environmentId", "=", environmentId).returningAll().execute();
942
+ },
943
+ listEnvironmentSecrets: async (params) => {
944
+ const value = await listEnvironmentSecrets.safeParseAsync(params || {});
945
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
946
+ const { limit = 100, offset = 0 } = value.data;
947
+ return db.selectFrom("environment_secrets").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
948
+ },
949
+ countEnvironmentSecrets: async () => {
950
+ const result = await db.selectFrom("environment_secrets").select(db.fn.countAll().as("count")).executeTakeFirst();
951
+ return Number(result?.count ?? 0);
952
+ }
953
+ };
954
+ };
955
+
956
+ //#endregion
957
+ //#region src/datalayer/targetingRules.ts
958
+ const createTargetingRule = require_db.zod_default.object({
959
+ environmentId: require_db.zod_default.string().uuid(),
960
+ configId: require_db.zod_default.string().uuid(),
961
+ configVariantId: require_db.zod_default.string().uuid(),
962
+ variantVersionId: require_db.zod_default.string().uuid().nullable().optional(),
963
+ weight: require_db.zod_default.number().int().min(0).max(1e4).optional().default(1e4),
964
+ priority: require_db.zod_default.number().int().optional().default(0),
965
+ enabled: require_db.zod_default.boolean().optional().default(true),
966
+ conditions: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
967
+ });
968
+ const updateTargetingRule = require_db.zod_default.object({
969
+ id: require_db.zod_default.string().uuid(),
970
+ variantVersionId: require_db.zod_default.string().uuid().nullable().optional(),
971
+ weight: require_db.zod_default.number().int().min(0).max(1e4).optional(),
972
+ priority: require_db.zod_default.number().int().optional(),
973
+ enabled: require_db.zod_default.boolean().optional(),
974
+ conditions: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).nullable().optional()
975
+ });
976
+ const getTargetingRuleById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
977
+ const getTargetingRulesByConfigId = require_db.zod_default.object({
978
+ configId: require_db.zod_default.string().uuid(),
979
+ limit: require_db.zod_default.number().int().positive().optional(),
980
+ offset: require_db.zod_default.number().int().nonnegative().optional()
981
+ });
982
+ const getTargetingRulesByEnvironmentId = require_db.zod_default.object({
983
+ environmentId: require_db.zod_default.string().uuid(),
984
+ limit: require_db.zod_default.number().int().positive().optional(),
985
+ offset: require_db.zod_default.number().int().nonnegative().optional()
986
+ });
987
+ const getTargetingRulesByConfigAndEnvironment = require_db.zod_default.object({
988
+ configId: require_db.zod_default.string().uuid(),
989
+ environmentId: require_db.zod_default.string().uuid()
990
+ });
991
+ const deleteTargetingRule = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
992
+ const deleteTargetingRulesByConfigId = require_db.zod_default.object({ configId: require_db.zod_default.string().uuid() });
993
+ const deleteTargetingRulesByEnvironmentId = require_db.zod_default.object({ environmentId: require_db.zod_default.string().uuid() });
994
+ const listTargetingRules = require_db.zod_default.object({
995
+ limit: require_db.zod_default.number().int().positive().optional(),
996
+ offset: require_db.zod_default.number().int().nonnegative().optional()
997
+ });
998
+ const setTargetingForEnvironment = require_db.zod_default.object({
999
+ environmentId: require_db.zod_default.string().uuid(),
1000
+ configId: require_db.zod_default.string().uuid(),
1001
+ configVariantId: require_db.zod_default.string().uuid(),
1002
+ variantVersionId: require_db.zod_default.string().uuid().nullable().optional()
1003
+ });
1004
+ const createTargetingRulesDataLayer = (db) => {
1005
+ return {
1006
+ createTargetingRule: async (params) => {
1007
+ const value = await createTargetingRule.safeParseAsync(params);
1008
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1009
+ const { environmentId, configId, configVariantId, variantVersionId, weight, priority, enabled, conditions } = value.data;
1010
+ return db.insertInto("targeting_rules").values({
1011
+ id: (0, node_crypto.randomUUID)(),
1012
+ environmentId,
1013
+ configId,
1014
+ configVariantId,
1015
+ variantVersionId: variantVersionId ?? null,
1016
+ weight,
1017
+ priority,
1018
+ enabled,
1019
+ conditions: JSON.stringify(conditions ?? {}),
1020
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
1021
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
1022
+ }).returningAll().executeTakeFirst();
1023
+ },
1024
+ updateTargetingRule: async (params) => {
1025
+ const value = await updateTargetingRule.safeParseAsync(params);
1026
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1027
+ const { id, variantVersionId, weight, priority, enabled, conditions } = value.data;
1028
+ const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
1029
+ if (variantVersionId !== void 0) updateData.variantVersionId = variantVersionId;
1030
+ if (weight !== void 0) updateData.weight = weight;
1031
+ if (priority !== void 0) updateData.priority = priority;
1032
+ if (enabled !== void 0) updateData.enabled = enabled;
1033
+ if (conditions !== void 0) updateData.conditions = conditions ? JSON.stringify(conditions) : null;
1034
+ return db.updateTable("targeting_rules").set(updateData).where("id", "=", id).returningAll().executeTakeFirst();
1035
+ },
1036
+ getTargetingRuleById: async (params) => {
1037
+ const value = await getTargetingRuleById.safeParseAsync(params);
1038
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1039
+ const { id } = value.data;
1040
+ return db.selectFrom("targeting_rules").selectAll().where("id", "=", id).executeTakeFirst();
1041
+ },
1042
+ getTargetingRulesByConfigId: async (params) => {
1043
+ const value = await getTargetingRulesByConfigId.safeParseAsync(params);
1044
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1045
+ const { configId, limit = 100, offset = 0 } = value.data;
1046
+ return db.selectFrom("targeting_rules").selectAll().where("configId", "=", configId).where("enabled", "=", true).orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
1047
+ },
1048
+ getTargetingRulesByEnvironmentId: async (params) => {
1049
+ const value = await getTargetingRulesByEnvironmentId.safeParseAsync(params);
1050
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1051
+ const { environmentId, limit = 100, offset = 0 } = value.data;
1052
+ return db.selectFrom("targeting_rules").selectAll().where("environmentId", "=", environmentId).where("enabled", "=", true).orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
1053
+ },
1054
+ getTargetingRulesByConfigAndEnvironment: async (params) => {
1055
+ const value = await getTargetingRulesByConfigAndEnvironment.safeParseAsync(params);
1056
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1057
+ const { configId, environmentId } = value.data;
1058
+ return db.selectFrom("targeting_rules").selectAll().where("configId", "=", configId).where("environmentId", "=", environmentId).where("enabled", "=", true).orderBy("priority", "desc").orderBy("weight", "desc").execute();
1059
+ },
1060
+ deleteTargetingRule: async (params) => {
1061
+ const value = await deleteTargetingRule.safeParseAsync(params);
1062
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1063
+ const { id } = value.data;
1064
+ return db.deleteFrom("targeting_rules").where("id", "=", id).returningAll().executeTakeFirst();
1065
+ },
1066
+ deleteTargetingRulesByConfigId: async (params) => {
1067
+ const value = await deleteTargetingRulesByConfigId.safeParseAsync(params);
1068
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1069
+ const { configId } = value.data;
1070
+ return db.deleteFrom("targeting_rules").where("configId", "=", configId).returningAll().execute();
1071
+ },
1072
+ deleteTargetingRulesByEnvironmentId: async (params) => {
1073
+ const value = await deleteTargetingRulesByEnvironmentId.safeParseAsync(params);
1074
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1075
+ const { environmentId } = value.data;
1076
+ return db.deleteFrom("targeting_rules").where("environmentId", "=", environmentId).returningAll().execute();
1077
+ },
1078
+ listTargetingRules: async (params) => {
1079
+ const value = await listTargetingRules.safeParseAsync(params || {});
1080
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1081
+ const { limit = 100, offset = 0 } = value.data;
1082
+ return db.selectFrom("targeting_rules").selectAll().orderBy("priority", "desc").orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
1083
+ },
1084
+ getTargetingRulesWithDetailsByConfigId: async (params) => {
1085
+ const value = await getTargetingRulesByConfigId.safeParseAsync(params);
1086
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1087
+ const { configId, limit = 100, offset = 0 } = value.data;
1088
+ 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([
1089
+ "targeting_rules.id",
1090
+ "targeting_rules.environmentId",
1091
+ "targeting_rules.configId",
1092
+ "targeting_rules.configVariantId",
1093
+ "targeting_rules.variantVersionId",
1094
+ "targeting_rules.weight",
1095
+ "targeting_rules.priority",
1096
+ "targeting_rules.enabled",
1097
+ "targeting_rules.conditions",
1098
+ "targeting_rules.createdAt",
1099
+ "targeting_rules.updatedAt",
1100
+ "environments.name as environmentName",
1101
+ "environments.slug as environmentSlug",
1102
+ "variants.name as variantName",
1103
+ "config_variants.variantId"
1104
+ ]).where("targeting_rules.configId", "=", configId).orderBy("targeting_rules.priority", "desc").orderBy("targeting_rules.createdAt", "desc").limit(limit).offset(offset).execute();
1105
+ return await Promise.all(rules.map(async (rule) => {
1106
+ let versionInfo = null;
1107
+ if (rule.variantVersionId) versionInfo = await db.selectFrom("variant_versions").select([
1108
+ "provider",
1109
+ "modelName",
1110
+ "version"
1111
+ ]).where("id", "=", rule.variantVersionId).executeTakeFirst();
1112
+ else if (rule.variantId) versionInfo = await db.selectFrom("variant_versions").select([
1113
+ "provider",
1114
+ "modelName",
1115
+ "version"
1116
+ ]).where("variantId", "=", rule.variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
1117
+ return {
1118
+ ...rule,
1119
+ variantProvider: versionInfo?.provider ?? null,
1120
+ variantModelName: versionInfo?.modelName ?? null,
1121
+ pinnedVersion: rule.variantVersionId ? versionInfo?.version : null,
1122
+ latestVersion: !rule.variantVersionId ? versionInfo?.version : null
1123
+ };
1124
+ }));
1125
+ },
1126
+ setTargetingForEnvironment: async (params) => {
1127
+ const value = await setTargetingForEnvironment.safeParseAsync(params);
1128
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1129
+ const { environmentId, configId, configVariantId, variantVersionId } = value.data;
1130
+ const now = (/* @__PURE__ */ new Date()).toISOString();
1131
+ await db.deleteFrom("targeting_rules").where("configId", "=", configId).where("environmentId", "=", environmentId).execute();
1132
+ return db.insertInto("targeting_rules").values({
1133
+ id: (0, node_crypto.randomUUID)(),
1134
+ environmentId,
1135
+ configId,
1136
+ configVariantId,
1137
+ variantVersionId: variantVersionId ?? null,
1138
+ weight: 1e4,
1139
+ priority: 0,
1140
+ enabled: true,
1141
+ conditions: JSON.stringify({}),
1142
+ createdAt: now,
1143
+ updatedAt: now
1144
+ }).returningAll().executeTakeFirst();
1145
+ }
1146
+ };
1147
+ };
1148
+
1149
+ //#endregion
1150
+ //#region src/datalayer/variants.ts
1151
+ const createVariant = require_db.zod_default.object({ name: require_db.zod_default.string() });
1152
+ const updateVariant = require_db.zod_default.object({
1153
+ variantId: require_db.zod_default.string().uuid(),
1154
+ name: require_db.zod_default.string().optional()
1155
+ });
1156
+ const getVariantById = require_db.zod_default.object({ variantId: require_db.zod_default.string().uuid() });
1157
+ const deleteVariant = require_db.zod_default.object({ variantId: require_db.zod_default.string().uuid() });
1158
+ const listVariants = require_db.zod_default.object({
1159
+ limit: require_db.zod_default.number().int().positive().optional(),
1160
+ offset: require_db.zod_default.number().int().nonnegative().optional()
1161
+ });
1162
+ const createVariantDataLayer = (db) => {
1163
+ return {
1164
+ createVariant: async (params) => {
1165
+ const value = await createVariant.safeParseAsync(params);
1166
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1167
+ const { name } = value.data;
1168
+ return db.insertInto("variants").values({
1169
+ id: (0, node_crypto.randomUUID)(),
1170
+ name,
1171
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
1172
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
1173
+ }).returningAll().executeTakeFirst();
1174
+ },
1175
+ updateVariant: async (params) => {
1176
+ const value = await updateVariant.safeParseAsync(params);
1177
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1178
+ const { variantId, ...updates } = value.data;
1179
+ const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
1180
+ if (updates.name) updateData.name = updates.name;
1181
+ return db.updateTable("variants").set(updateData).where("id", "=", variantId).returningAll().executeTakeFirst();
1182
+ },
1183
+ getVariantById: async (params) => {
1184
+ const value = await getVariantById.safeParseAsync(params);
1185
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1186
+ const { variantId } = value.data;
1187
+ return db.selectFrom("variants").selectAll().where("id", "=", variantId).executeTakeFirst();
1188
+ },
1189
+ getVariantWithLatestVersion: async (params) => {
1190
+ const value = await getVariantById.safeParseAsync(params);
1191
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1192
+ const { variantId } = value.data;
1193
+ const variant = await db.selectFrom("variants").selectAll().where("id", "=", variantId).executeTakeFirst();
1194
+ if (!variant) return;
1195
+ const latestVersion = await db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
1196
+ return {
1197
+ ...variant,
1198
+ latestVersion: latestVersion ?? null
1199
+ };
1200
+ },
1201
+ deleteVariant: async (params) => {
1202
+ const value = await deleteVariant.safeParseAsync(params);
1203
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1204
+ const { variantId } = value.data;
1205
+ await db.deleteFrom("variant_versions").where("variantId", "=", variantId).execute();
1206
+ return db.deleteFrom("variants").where("id", "=", variantId).returningAll().executeTakeFirst();
1207
+ },
1208
+ listVariants: async (params) => {
1209
+ const value = await listVariants.safeParseAsync(params || {});
1210
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1211
+ const { limit = 100, offset = 0 } = value.data;
1212
+ return db.selectFrom("variants").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
1213
+ },
1214
+ listVariantsWithLatestVersion: async (params) => {
1215
+ const value = await listVariants.safeParseAsync(params || {});
1216
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1217
+ const { limit = 100, offset = 0 } = value.data;
1218
+ const variants = await db.selectFrom("variants").selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute();
1219
+ if (variants.length === 0) return [];
1220
+ return await Promise.all(variants.map(async (variant) => {
1221
+ const latestVersion = await db.selectFrom("variant_versions").selectAll().where("variantId", "=", variant.id).orderBy("version", "desc").limit(1).executeTakeFirst();
1222
+ return {
1223
+ ...variant,
1224
+ latestVersion: latestVersion ?? null
1225
+ };
1226
+ }));
1227
+ }
1228
+ };
1229
+ };
1230
+
1231
+ //#endregion
1232
+ //#region src/datalayer/variantVersions.ts
1233
+ const createVariantVersion = require_db.zod_default.object({
1234
+ variantId: require_db.zod_default.string().uuid(),
1235
+ provider: require_db.zod_default.string(),
1236
+ modelName: require_db.zod_default.string(),
1237
+ jsonData: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.unknown()).optional().default({})
1238
+ });
1239
+ const getVariantVersionById = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
1240
+ const getVariantVersionsByVariantId = require_db.zod_default.object({
1241
+ variantId: require_db.zod_default.string().uuid(),
1242
+ limit: require_db.zod_default.number().int().positive().optional(),
1243
+ offset: require_db.zod_default.number().int().nonnegative().optional()
1244
+ });
1245
+ const getLatestVariantVersion = require_db.zod_default.object({ variantId: require_db.zod_default.string().uuid() });
1246
+ const getVariantVersionByNumber = require_db.zod_default.object({
1247
+ variantId: require_db.zod_default.string().uuid(),
1248
+ version: require_db.zod_default.number().int().positive()
1249
+ });
1250
+ const deleteVariantVersion = require_db.zod_default.object({ id: require_db.zod_default.string().uuid() });
1251
+ const createVariantVersionsDataLayer = (db) => {
1252
+ return {
1253
+ createVariantVersion: async (params) => {
1254
+ const value = await createVariantVersion.safeParseAsync(params);
1255
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1256
+ const { variantId, provider, modelName, jsonData } = value.data;
1257
+ const newVersionNumber = ((await db.selectFrom("variant_versions").select("version").where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst())?.version ?? 0) + 1;
1258
+ const now = (/* @__PURE__ */ new Date()).toISOString();
1259
+ return db.insertInto("variant_versions").values({
1260
+ id: (0, node_crypto.randomUUID)(),
1261
+ variantId,
1262
+ version: newVersionNumber,
1263
+ provider,
1264
+ modelName,
1265
+ jsonData: JSON.stringify(jsonData),
1266
+ createdAt: now,
1267
+ updatedAt: now
1268
+ }).returningAll().executeTakeFirst();
1269
+ },
1270
+ getVariantVersionById: async (params) => {
1271
+ const value = await getVariantVersionById.safeParseAsync(params);
1272
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1273
+ const { id } = value.data;
1274
+ return db.selectFrom("variant_versions").selectAll().where("id", "=", id).executeTakeFirst();
1275
+ },
1276
+ getVariantVersionsByVariantId: async (params) => {
1277
+ const value = await getVariantVersionsByVariantId.safeParseAsync(params);
1278
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1279
+ const { variantId, limit = 100, offset = 0 } = value.data;
1280
+ return db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(limit).offset(offset).execute();
1281
+ },
1282
+ getLatestVariantVersion: async (params) => {
1283
+ const value = await getLatestVariantVersion.safeParseAsync(params);
1284
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1285
+ const { variantId } = value.data;
1286
+ return db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).orderBy("version", "desc").limit(1).executeTakeFirst();
1287
+ },
1288
+ getVariantVersionByNumber: async (params) => {
1289
+ const value = await getVariantVersionByNumber.safeParseAsync(params);
1290
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1291
+ const { variantId, version } = value.data;
1292
+ return db.selectFrom("variant_versions").selectAll().where("variantId", "=", variantId).where("version", "=", version).executeTakeFirst();
1293
+ },
1294
+ deleteVariantVersion: async (params) => {
1295
+ const value = await deleteVariantVersion.safeParseAsync(params);
1296
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1297
+ const { id } = value.data;
1298
+ return db.deleteFrom("variant_versions").where("id", "=", id).returningAll().executeTakeFirst();
1299
+ },
1300
+ deleteVariantVersionsByVariantId: async (params) => {
1301
+ const value = await getLatestVariantVersion.safeParseAsync(params);
1302
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1303
+ const { variantId } = value.data;
1304
+ return db.deleteFrom("variant_versions").where("variantId", "=", variantId).returningAll().execute();
1305
+ },
1306
+ getVariantVersionWithVariant: async (params) => {
1307
+ const value = await getVariantVersionById.safeParseAsync(params);
1308
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1309
+ const { id } = value.data;
1310
+ return db.selectFrom("variant_versions").innerJoin("variants", "variant_versions.variantId", "variants.id").select([
1311
+ "variant_versions.id",
1312
+ "variant_versions.variantId",
1313
+ "variant_versions.version",
1314
+ "variant_versions.provider",
1315
+ "variant_versions.modelName",
1316
+ "variant_versions.jsonData",
1317
+ "variant_versions.createdAt",
1318
+ "variant_versions.updatedAt",
1319
+ "variants.name as variantName"
1320
+ ]).where("variant_versions.id", "=", id).executeTakeFirst();
1321
+ },
1322
+ getVariantVersionsWithVariantByVariantId: async (params) => {
1323
+ const value = await getVariantVersionsByVariantId.safeParseAsync(params);
1324
+ if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
1325
+ const { variantId, limit = 100, offset = 0 } = value.data;
1326
+ return db.selectFrom("variant_versions").innerJoin("variants", "variant_versions.variantId", "variants.id").select([
1327
+ "variant_versions.id",
1328
+ "variant_versions.variantId",
1329
+ "variant_versions.version",
1330
+ "variant_versions.provider",
1331
+ "variant_versions.modelName",
1332
+ "variant_versions.jsonData",
1333
+ "variant_versions.createdAt",
1334
+ "variant_versions.updatedAt",
1335
+ "variants.name as variantName"
1336
+ ]).where("variant_versions.variantId", "=", variantId).orderBy("variant_versions.version", "desc").limit(limit).offset(offset).execute();
1337
+ }
1338
+ };
1339
+ };
1340
+
1341
+ //#endregion
1342
+ //#region src/datalayer/index.ts
1343
+ const createDataLayer = async (db) => {
1344
+ return {
1345
+ ...createConfigDataLayer(db),
1346
+ ...createConfigVariantDataLayer(db),
1347
+ ...createEnvironmentDataLayer(db),
1348
+ ...createEnvironmentSecretDataLayer(db),
1349
+ ...createTargetingRulesDataLayer(db),
1350
+ ...createVariantDataLayer(db),
1351
+ ...createVariantVersionsDataLayer(db)
1352
+ };
1353
+ };
1354
+
1355
+ //#endregion
1356
+ exports.SCHEMA_METADATA = require_db.SCHEMA_METADATA;
1357
+ exports.SupportedProviders = SupportedProviders;
1358
+ exports.chatCompletionCreateParamsBaseSchema = chatCompletionCreateParamsBaseSchema;
1359
+ exports.configVariantsSchema = require_db.configVariantsSchema;
1360
+ exports.configsSchema = require_db.configsSchema;
1361
+ exports.createDataLayer = createDataLayer;
1362
+ exports.createDatabase = require_db.createDatabase;
1363
+ exports.createDatabaseFromConnection = require_db.createDatabaseFromConnection;
1364
+ exports.detectDatabaseType = require_db.detectDatabaseType;
1365
+ exports.environmentSecretsSchema = require_db.environmentSecretsSchema;
1366
+ exports.environmentsSchema = require_db.environmentsSchema;
1367
+ Object.defineProperty(exports, 'gateway', {
1368
+ enumerable: true,
1369
+ get: function () {
1370
+ return __llmops_gateway.default;
1371
+ }
1372
+ });
1373
+ exports.generateId = generateId;
1374
+ exports.llmopsConfigSchema = llmopsConfigSchema;
1375
+ exports.logger = logger;
1376
+ exports.parsePartialTableData = require_db.parsePartialTableData;
1377
+ exports.parseTableData = require_db.parseTableData;
1378
+ exports.schemas = require_db.schemas;
1379
+ exports.targetingRulesSchema = require_db.targetingRulesSchema;
1380
+ exports.validateLLMOpsConfig = validateLLMOpsConfig;
1381
+ exports.validatePartialTableData = require_db.validatePartialTableData;
1382
+ exports.validateTableData = require_db.validateTableData;
1383
+ exports.variantJsonDataSchema = variantJsonDataSchema;
1384
+ exports.variantVersionsSchema = require_db.variantVersionsSchema;
1385
+ exports.variantsSchema = require_db.variantsSchema;