@revenium/litellm 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +630 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +713 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +332 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +15 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +101 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +189 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt-extraction.d.ts +11 -0
- package/dist/prompt-extraction.d.ts.map +1 -0
- package/dist/prompt-extraction.js +201 -0
- package/dist/prompt-extraction.js.map +1 -0
- package/dist/tracking.d.ts +47 -0
- package/dist/tracking.d.ts.map +1 -0
- package/dist/tracking.js +299 -0
- package/dist/tracking.js.map +1 -0
- package/dist/types.d.ts +348 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +114 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +216 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/error-handling.d.ts +166 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js +306 -0
- package/dist/utils/error-handling.js.map +1 -0
- package/dist/utils/logger-types.d.ts +171 -0
- package/dist/utils/logger-types.d.ts.map +1 -0
- package/dist/utils/logger-types.js +210 -0
- package/dist/utils/logger-types.js.map +1 -0
- package/dist/utils/provider-detection.d.ts +43 -0
- package/dist/utils/provider-detection.d.ts.map +1 -0
- package/dist/utils/provider-detection.js +103 -0
- package/dist/utils/provider-detection.js.map +1 -0
- package/dist/utils/stop-reason.d.ts +58 -0
- package/dist/utils/stop-reason.d.ts.map +1 -0
- package/dist/utils/stop-reason.js +136 -0
- package/dist/utils/stop-reason.js.map +1 -0
- package/dist/utils/summary-printer.d.ts +23 -0
- package/dist/utils/summary-printer.d.ts.map +1 -0
- package/dist/utils/summary-printer.js +234 -0
- package/dist/utils/summary-printer.js.map +1 -0
- package/dist/utils/trace-fields.d.ts +10 -0
- package/dist/utils/trace-fields.d.ts.map +1 -0
- package/dist/utils/trace-fields.js +117 -0
- package/dist/utils/trace-fields.js.map +1 -0
- package/dist/utils/validation.d.ts +121 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +451 -0
- package/dist/utils/validation.js.map +1 -0
- package/examples/README.md +321 -0
- package/examples/litellm-basic.ts +240 -0
- package/examples/litellm-streaming.ts +309 -0
- package/examples/prompt-capture.ts +128 -0
- package/package.json +85 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation utilities for type-safe input handling
|
|
4
|
+
*
|
|
5
|
+
* This module provides runtime validation to replace 'any' types
|
|
6
|
+
* with proper type checking and validation.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.isObject = isObject;
|
|
10
|
+
exports.isString = isString;
|
|
11
|
+
exports.isNumber = isNumber;
|
|
12
|
+
exports.isBoolean = isBoolean;
|
|
13
|
+
exports.validateString = validateString;
|
|
14
|
+
exports.validateNumber = validateNumber;
|
|
15
|
+
exports.validateBoolean = validateBoolean;
|
|
16
|
+
exports.validateHeaders = validateHeaders;
|
|
17
|
+
exports.validateUsageMetadata = validateUsageMetadata;
|
|
18
|
+
exports.validateReveniumConfig = validateReveniumConfig;
|
|
19
|
+
exports.validateStreamChunk = validateStreamChunk;
|
|
20
|
+
exports.validateLiteLLMRequest = validateLiteLLMRequest;
|
|
21
|
+
exports.validateLiteLLMUrl = validateLiteLLMUrl;
|
|
22
|
+
const constants_1 = require("../constants");
|
|
23
|
+
/**
|
|
24
|
+
* Type guard for checking if a value is a non-null object
|
|
25
|
+
*/
|
|
26
|
+
function isObject(value) {
|
|
27
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Type guard for checking if a value is a string
|
|
31
|
+
*/
|
|
32
|
+
function isString(value) {
|
|
33
|
+
return typeof value === "string";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Type guard for checking if a value is a number
|
|
37
|
+
*/
|
|
38
|
+
function isNumber(value) {
|
|
39
|
+
return typeof value === "number" && !isNaN(value);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Type guard for checking if a value is a boolean
|
|
43
|
+
*/
|
|
44
|
+
function isBoolean(value) {
|
|
45
|
+
return typeof value === "boolean";
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate and extract string from unknown value
|
|
49
|
+
* @param value - Value to validate
|
|
50
|
+
* @param defaultValue - Default value if validation fails
|
|
51
|
+
* @returns Validated string or default
|
|
52
|
+
*/
|
|
53
|
+
function validateString(value, defaultValue = "") {
|
|
54
|
+
return isString(value) ? value : defaultValue;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate and extract number from unknown value
|
|
58
|
+
* @param value - Value to validate
|
|
59
|
+
* @param defaultValue - Default value if validation fails
|
|
60
|
+
* @returns Validated number or default
|
|
61
|
+
*/
|
|
62
|
+
function validateNumber(value, defaultValue = 0) {
|
|
63
|
+
return isNumber(value) ? value : defaultValue;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate and extract boolean from unknown value
|
|
67
|
+
* @param value - Value to validate
|
|
68
|
+
* @param defaultValue - Default value if validation fails
|
|
69
|
+
* @returns Validated boolean or default
|
|
70
|
+
*/
|
|
71
|
+
function validateBoolean(value, defaultValue = false) {
|
|
72
|
+
return isBoolean(value) ? value : defaultValue;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validate HTTP headers object
|
|
76
|
+
* @param headers - Headers to validate
|
|
77
|
+
* @returns Validated headers record
|
|
78
|
+
*/
|
|
79
|
+
function validateHeaders(headers) {
|
|
80
|
+
if (!isObject(headers))
|
|
81
|
+
return {};
|
|
82
|
+
const validHeaders = {};
|
|
83
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
84
|
+
if (isString(key) && isString(value)) {
|
|
85
|
+
validHeaders[key] = value;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return validHeaders;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validate usage metadata object
|
|
92
|
+
* @param metadata - Metadata to validate
|
|
93
|
+
* @returns Validated usage metadata
|
|
94
|
+
*/
|
|
95
|
+
function validateUsageMetadata(metadata) {
|
|
96
|
+
if (!isObject(metadata))
|
|
97
|
+
return {};
|
|
98
|
+
const validated = {};
|
|
99
|
+
// Validate string fields
|
|
100
|
+
for (const field of constants_1.stringFields) {
|
|
101
|
+
const value = metadata[field];
|
|
102
|
+
if (isString(value) && value?.trim()?.length > 0) {
|
|
103
|
+
validated[field] = value?.trim();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Validate number fields
|
|
107
|
+
const responseQualityScore = metadata
|
|
108
|
+
.responseQualityScore;
|
|
109
|
+
if (isNumber(responseQualityScore) &&
|
|
110
|
+
responseQualityScore >= 0 &&
|
|
111
|
+
responseQualityScore <= 1) {
|
|
112
|
+
validated.responseQualityScore = responseQualityScore;
|
|
113
|
+
}
|
|
114
|
+
return validated;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Validate Revenium configuration object with enhanced error reporting
|
|
118
|
+
* @param config - Configuration to validate
|
|
119
|
+
* @returns Detailed validation result
|
|
120
|
+
*/
|
|
121
|
+
function validateReveniumConfig(config) {
|
|
122
|
+
const errors = [];
|
|
123
|
+
const warnings = [];
|
|
124
|
+
const suggestions = [];
|
|
125
|
+
if (!isObject(config)) {
|
|
126
|
+
return {
|
|
127
|
+
isValid: false,
|
|
128
|
+
errors: ["Configuration must be an object"],
|
|
129
|
+
warnings: [],
|
|
130
|
+
suggestions: [
|
|
131
|
+
"Ensure you are passing a valid configuration object with required fields",
|
|
132
|
+
],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const cfg = config;
|
|
136
|
+
// Validate required API key
|
|
137
|
+
if (!isString(cfg?.reveniumMeteringApiKey)) {
|
|
138
|
+
errors.push("reveniumMeteringApiKey is required and must be a string");
|
|
139
|
+
suggestions.push("Set REVENIUM_METERING_API_KEY environment variable or provide reveniumMeteringApiKey in config");
|
|
140
|
+
}
|
|
141
|
+
else if (!cfg?.reveniumMeteringApiKey?.trim()) {
|
|
142
|
+
errors.push("reveniumMeteringApiKey cannot be empty");
|
|
143
|
+
}
|
|
144
|
+
else if (!cfg?.reveniumMeteringApiKey?.startsWith("hak_")) {
|
|
145
|
+
errors.push('reveniumMeteringApiKey must start with "hak_"');
|
|
146
|
+
suggestions.push("Obtain a valid Revenium API key from your Revenium dashboard");
|
|
147
|
+
}
|
|
148
|
+
else if (cfg?.reveniumMeteringApiKey?.length < 20) {
|
|
149
|
+
warnings.push("reveniumMeteringApiKey appears to be too short - verify it is correct");
|
|
150
|
+
}
|
|
151
|
+
// Validate Revenium base URL
|
|
152
|
+
if (!isString(cfg?.reveniumMeteringBaseUrl)) {
|
|
153
|
+
errors.push("reveniumMeteringBaseUrl is required and must be a string");
|
|
154
|
+
}
|
|
155
|
+
else if (!cfg?.reveniumMeteringBaseUrl?.trim()) {
|
|
156
|
+
errors.push("reveniumMeteringBaseUrl cannot be empty");
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
try {
|
|
160
|
+
const url = new URL(cfg.reveniumMeteringBaseUrl);
|
|
161
|
+
if (!url.protocol.startsWith(constants_1.URL_PROTOCOL)) {
|
|
162
|
+
errors.push("reveniumMeteringBaseUrl must use HTTP or HTTPS protocol");
|
|
163
|
+
}
|
|
164
|
+
if (url.hostname === constants_1.HOSTNAME || url.hostname === constants_1.HOSTNAME_IP) {
|
|
165
|
+
warnings.push("Using localhost for Revenium API - ensure this is intended for development");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
errors.push("reveniumMeteringBaseUrl must be a valid URL");
|
|
170
|
+
suggestions.push("Use format: https://api.revenium.ai");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Validate LiteLLM proxy URL
|
|
174
|
+
if (!isString(cfg?.litellmProxyUrl)) {
|
|
175
|
+
errors.push("litellmProxyUrl is required and must be a string");
|
|
176
|
+
suggestions.push("Set LITELLM_PROXY_URL environment variable or provide litellmProxyUrl in config");
|
|
177
|
+
}
|
|
178
|
+
else if (!cfg?.litellmProxyUrl?.trim()) {
|
|
179
|
+
errors.push("litellmProxyUrl cannot be empty");
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
try {
|
|
183
|
+
const url = new URL(cfg?.litellmProxyUrl);
|
|
184
|
+
if (!url.protocol.startsWith(constants_1.URL_PROTOCOL)) {
|
|
185
|
+
errors.push("litellmProxyUrl must use HTTP or HTTPS protocol");
|
|
186
|
+
}
|
|
187
|
+
// Check for common LiteLLM endpoints
|
|
188
|
+
if (constants_1.PATHNAME_URL.some((path) => url.pathname.includes(path))) {
|
|
189
|
+
warnings.push("litellmProxyUrl includes endpoint path - ensure this is correct");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
errors.push("litellmProxyUrl must be a valid URL");
|
|
194
|
+
suggestions.push("Use format: http://localhost:4000 or https://your-litellm-proxy.com");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Validate optional fields with enhanced checks
|
|
198
|
+
if (cfg?.litellmApiKey !== undefined && !isString(cfg?.litellmApiKey)) {
|
|
199
|
+
errors.push("litellmApiKey must be a string if provided");
|
|
200
|
+
}
|
|
201
|
+
else if (cfg?.litellmApiKey?.trim()?.length === 0) {
|
|
202
|
+
warnings.push("litellmApiKey is empty - proxy authentication may fail");
|
|
203
|
+
}
|
|
204
|
+
if (cfg?.organizationId !== undefined && !isString(cfg?.organizationId)) {
|
|
205
|
+
errors.push("organizationId must be a string if provided");
|
|
206
|
+
}
|
|
207
|
+
else if (cfg?.organizationId?.trim()?.length === 0) {
|
|
208
|
+
warnings.push("organizationId is empty");
|
|
209
|
+
}
|
|
210
|
+
if (cfg?.apiTimeout !== undefined && !isNumber(cfg?.apiTimeout)) {
|
|
211
|
+
errors.push("apiTimeout must be a number if provided");
|
|
212
|
+
}
|
|
213
|
+
else if (cfg?.apiTimeout !== undefined && cfg?.apiTimeout < 1000) {
|
|
214
|
+
errors.push("apiTimeout must be at least 1000ms");
|
|
215
|
+
}
|
|
216
|
+
else if (cfg?.apiTimeout !== undefined && cfg?.apiTimeout > 60000) {
|
|
217
|
+
errors.push("apiTimeout must not exceed 60000ms");
|
|
218
|
+
}
|
|
219
|
+
else if (cfg?.apiTimeout !== undefined && cfg?.apiTimeout < 3000) {
|
|
220
|
+
warnings.push("apiTimeout is very low - may cause timeouts for slow networks");
|
|
221
|
+
}
|
|
222
|
+
if (cfg?.failSilent !== undefined && !isBoolean(cfg?.failSilent)) {
|
|
223
|
+
errors.push("failSilent must be a boolean if provided");
|
|
224
|
+
}
|
|
225
|
+
if (cfg?.maxRetries !== undefined && !isNumber(cfg?.maxRetries)) {
|
|
226
|
+
errors.push("maxRetries must be a number if provided");
|
|
227
|
+
}
|
|
228
|
+
else if (cfg?.maxRetries !== undefined && cfg?.maxRetries < 0) {
|
|
229
|
+
errors.push("maxRetries cannot be negative");
|
|
230
|
+
}
|
|
231
|
+
else if (cfg?.maxRetries !== undefined && cfg?.maxRetries > 10) {
|
|
232
|
+
errors.push("maxRetries should not exceed 10");
|
|
233
|
+
}
|
|
234
|
+
else if (cfg?.maxRetries !== undefined && cfg?.maxRetries === 0) {
|
|
235
|
+
warnings.push("maxRetries is 0 - no retry attempts will be made");
|
|
236
|
+
}
|
|
237
|
+
if (errors.length > 0)
|
|
238
|
+
return { isValid: false, errors, warnings, suggestions };
|
|
239
|
+
// Build validated config
|
|
240
|
+
const validatedConfig = {
|
|
241
|
+
reveniumMeteringApiKey: cfg?.reveniumMeteringApiKey,
|
|
242
|
+
reveniumMeteringBaseUrl: cfg?.reveniumMeteringBaseUrl,
|
|
243
|
+
litellmProxyUrl: cfg?.litellmProxyUrl,
|
|
244
|
+
litellmApiKey: isString(cfg?.litellmApiKey)
|
|
245
|
+
? cfg?.litellmApiKey
|
|
246
|
+
: undefined,
|
|
247
|
+
organizationId: isString(cfg?.organizationId)
|
|
248
|
+
? cfg?.organizationId
|
|
249
|
+
: undefined,
|
|
250
|
+
apiTimeout: isNumber(cfg?.apiTimeout) ? cfg?.apiTimeout : undefined,
|
|
251
|
+
failSilent: isBoolean(cfg?.failSilent) ? cfg?.failSilent : undefined,
|
|
252
|
+
maxRetries: isNumber(cfg?.maxRetries) ? cfg?.maxRetries : undefined,
|
|
253
|
+
};
|
|
254
|
+
return {
|
|
255
|
+
isValid: true,
|
|
256
|
+
errors: [],
|
|
257
|
+
warnings,
|
|
258
|
+
config: validatedConfig,
|
|
259
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Validate stream chunk data
|
|
264
|
+
* @param chunk - Chunk data to validate
|
|
265
|
+
* @returns Validated chunk or null if invalid
|
|
266
|
+
*/
|
|
267
|
+
function validateStreamChunk(chunk) {
|
|
268
|
+
if (!isObject(chunk))
|
|
269
|
+
return null;
|
|
270
|
+
const validated = {};
|
|
271
|
+
// Validate usage
|
|
272
|
+
const usage = chunk.usage;
|
|
273
|
+
if (isObject(usage)) {
|
|
274
|
+
validated.usage = {
|
|
275
|
+
prompt_tokens: validateNumber(usage.prompt_tokens),
|
|
276
|
+
completion_tokens: validateNumber(usage.completion_tokens),
|
|
277
|
+
total_tokens: validateNumber(usage.total_tokens),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Validate choices
|
|
281
|
+
const choices = chunk.choices;
|
|
282
|
+
if (Array.isArray(choices)) {
|
|
283
|
+
validated.choices = choices.map((choice) => {
|
|
284
|
+
if (!isObject(choice))
|
|
285
|
+
return {};
|
|
286
|
+
const validatedChoice = {};
|
|
287
|
+
const finishReason = choice.finish_reason;
|
|
288
|
+
if (isString(finishReason))
|
|
289
|
+
validatedChoice.finish_reason = finishReason;
|
|
290
|
+
const delta = choice.delta;
|
|
291
|
+
if (isObject(delta)) {
|
|
292
|
+
const content = delta.content;
|
|
293
|
+
if (isString(content))
|
|
294
|
+
validatedChoice.delta = { content };
|
|
295
|
+
}
|
|
296
|
+
return validatedChoice;
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
// Validate Groq-specific usage
|
|
300
|
+
const xGroq = chunk.x_groq;
|
|
301
|
+
if (isObject(xGroq)) {
|
|
302
|
+
const groqUsage = xGroq.usage;
|
|
303
|
+
if (isObject(groqUsage)) {
|
|
304
|
+
validated.x_groq = {
|
|
305
|
+
usage: {
|
|
306
|
+
prompt_tokens: validateNumber(groqUsage.prompt_tokens),
|
|
307
|
+
completion_tokens: validateNumber(groqUsage.completion_tokens),
|
|
308
|
+
total_tokens: validateNumber(groqUsage.total_tokens),
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return validated;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Validate LiteLLM request data
|
|
317
|
+
* @param requestData - Request data to validate
|
|
318
|
+
* @param endpointType - Type of endpoint (chat or embeddings)
|
|
319
|
+
* @returns Validation result
|
|
320
|
+
*/
|
|
321
|
+
function validateLiteLLMRequest(requestData, endpointType) {
|
|
322
|
+
const errors = [];
|
|
323
|
+
const warnings = [];
|
|
324
|
+
if (!isObject(requestData))
|
|
325
|
+
return {
|
|
326
|
+
isValid: false,
|
|
327
|
+
errors: ["Request data must be an object"],
|
|
328
|
+
warnings: [],
|
|
329
|
+
};
|
|
330
|
+
const data = requestData;
|
|
331
|
+
// Validate model field (required for both endpoints)
|
|
332
|
+
if (!isString(data?.model))
|
|
333
|
+
errors.push("model field is required and must be a string");
|
|
334
|
+
else if (data?.model?.trim()?.length === 0)
|
|
335
|
+
errors.push("model field cannot be empty");
|
|
336
|
+
if (endpointType === "chat") {
|
|
337
|
+
// Validate chat completion specific fields
|
|
338
|
+
if (!Array.isArray(data?.messages)) {
|
|
339
|
+
errors.push("messages field is required and must be an array for chat completions");
|
|
340
|
+
}
|
|
341
|
+
else if (data?.messages?.length === 0) {
|
|
342
|
+
errors.push("messages array cannot be empty");
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// Validate message structure
|
|
346
|
+
data?.messages?.forEach((message, index) => {
|
|
347
|
+
if (!isObject(message)) {
|
|
348
|
+
errors.push(`Message at index ${index} must be an object`);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
const msg = message;
|
|
352
|
+
if (!isString(msg?.role)) {
|
|
353
|
+
errors.push(`Message at index ${index} must have a role field`);
|
|
354
|
+
}
|
|
355
|
+
else if (!constants_1.SUPPORTED_ROLES.includes(msg?.role)) {
|
|
356
|
+
warnings.push(`Message at index ${index} has unusual role: ${msg?.role}`);
|
|
357
|
+
}
|
|
358
|
+
if (!isString(msg?.content)) {
|
|
359
|
+
warnings.push(`Message at index ${index} content should be a string or null`);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
// Validate optional chat parameters
|
|
364
|
+
if (!isNumber(data?.temperature)) {
|
|
365
|
+
warnings.push("temperature should be a number");
|
|
366
|
+
}
|
|
367
|
+
else if (data?.temperature < 0 || data?.temperature > 2) {
|
|
368
|
+
warnings.push("temperature should be between 0 and 2");
|
|
369
|
+
}
|
|
370
|
+
if (!isNumber(data?.max_tokens))
|
|
371
|
+
warnings.push("max_tokens should be a number");
|
|
372
|
+
else if (data?.max_tokens <= 0)
|
|
373
|
+
warnings.push("max_tokens should be positive");
|
|
374
|
+
if (!isBoolean(data?.stream))
|
|
375
|
+
warnings.push("stream should be a boolean");
|
|
376
|
+
}
|
|
377
|
+
else if (endpointType === "embeddings") {
|
|
378
|
+
// Validate embeddings specific fields
|
|
379
|
+
if (!isString(data?.input) && !Array.isArray(data?.input)) {
|
|
380
|
+
errors.push("input field must be a string or array of strings");
|
|
381
|
+
}
|
|
382
|
+
else if (Array.isArray(data?.input)) {
|
|
383
|
+
if (data?.input?.length === 0) {
|
|
384
|
+
errors.push("input array cannot be empty");
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
data.input.forEach((item, index) => {
|
|
388
|
+
if (!isString(item)) {
|
|
389
|
+
errors.push(`Input item at index ${index} must be a string`);
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (!isNumber(data?.dimensions))
|
|
395
|
+
warnings.push("dimensions should be a number");
|
|
396
|
+
else if (data?.dimensions <= 0)
|
|
397
|
+
warnings.push("dimensions should be positive");
|
|
398
|
+
}
|
|
399
|
+
return {
|
|
400
|
+
isValid: errors.length === 0,
|
|
401
|
+
errors,
|
|
402
|
+
warnings,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Validate URL for LiteLLM proxy requests
|
|
407
|
+
* @param url - URL to validate
|
|
408
|
+
* @param proxyUrl - Configured proxy URL
|
|
409
|
+
* @returns Validation result
|
|
410
|
+
*/
|
|
411
|
+
function validateLiteLLMUrl(url, proxyUrl) {
|
|
412
|
+
const errors = [];
|
|
413
|
+
try {
|
|
414
|
+
const requestUrl = new URL(url);
|
|
415
|
+
const configuredProxyUrl = new URL(proxyUrl);
|
|
416
|
+
// Check hostname and port match
|
|
417
|
+
if (requestUrl.hostname !== configuredProxyUrl.hostname) {
|
|
418
|
+
errors.push(`Request hostname ${requestUrl.hostname} does not match configured proxy ${configuredProxyUrl.hostname}`);
|
|
419
|
+
}
|
|
420
|
+
if (requestUrl.port !== configuredProxyUrl.port) {
|
|
421
|
+
errors.push(`Request port ${requestUrl.port} does not match configured proxy port ${configuredProxyUrl.port}`);
|
|
422
|
+
}
|
|
423
|
+
// Determine endpoint type
|
|
424
|
+
let endpointType;
|
|
425
|
+
if (requestUrl.pathname.endsWith("/chat/completions") ||
|
|
426
|
+
requestUrl.pathname.endsWith("/v1/chat/completions")) {
|
|
427
|
+
endpointType = "chat";
|
|
428
|
+
}
|
|
429
|
+
else if (requestUrl.pathname.endsWith("/embeddings") ||
|
|
430
|
+
requestUrl.pathname.endsWith("/v1/embeddings")) {
|
|
431
|
+
endpointType = "embeddings";
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
errors.push(`Unsupported endpoint: ${requestUrl.pathname}`);
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
isValid: errors.length === 0,
|
|
438
|
+
errors,
|
|
439
|
+
endpointType,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
return {
|
|
444
|
+
isValid: false,
|
|
445
|
+
errors: [
|
|
446
|
+
`Invalid URL format: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
447
|
+
],
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|