@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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +630 -0
  3. package/dist/client.d.ts +17 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +713 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +42 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +332 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/constants.d.ts +15 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +101 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/index.d.ts +42 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +189 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/prompt-extraction.d.ts +11 -0
  20. package/dist/prompt-extraction.d.ts.map +1 -0
  21. package/dist/prompt-extraction.js +201 -0
  22. package/dist/prompt-extraction.js.map +1 -0
  23. package/dist/tracking.d.ts +47 -0
  24. package/dist/tracking.d.ts.map +1 -0
  25. package/dist/tracking.js +299 -0
  26. package/dist/tracking.js.map +1 -0
  27. package/dist/types.d.ts +348 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +3 -0
  30. package/dist/types.js.map +1 -0
  31. package/dist/utils/circuit-breaker.d.ts +114 -0
  32. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  33. package/dist/utils/circuit-breaker.js +216 -0
  34. package/dist/utils/circuit-breaker.js.map +1 -0
  35. package/dist/utils/error-handling.d.ts +166 -0
  36. package/dist/utils/error-handling.d.ts.map +1 -0
  37. package/dist/utils/error-handling.js +306 -0
  38. package/dist/utils/error-handling.js.map +1 -0
  39. package/dist/utils/logger-types.d.ts +171 -0
  40. package/dist/utils/logger-types.d.ts.map +1 -0
  41. package/dist/utils/logger-types.js +210 -0
  42. package/dist/utils/logger-types.js.map +1 -0
  43. package/dist/utils/provider-detection.d.ts +43 -0
  44. package/dist/utils/provider-detection.d.ts.map +1 -0
  45. package/dist/utils/provider-detection.js +103 -0
  46. package/dist/utils/provider-detection.js.map +1 -0
  47. package/dist/utils/stop-reason.d.ts +58 -0
  48. package/dist/utils/stop-reason.d.ts.map +1 -0
  49. package/dist/utils/stop-reason.js +136 -0
  50. package/dist/utils/stop-reason.js.map +1 -0
  51. package/dist/utils/summary-printer.d.ts +23 -0
  52. package/dist/utils/summary-printer.d.ts.map +1 -0
  53. package/dist/utils/summary-printer.js +234 -0
  54. package/dist/utils/summary-printer.js.map +1 -0
  55. package/dist/utils/trace-fields.d.ts +10 -0
  56. package/dist/utils/trace-fields.d.ts.map +1 -0
  57. package/dist/utils/trace-fields.js +117 -0
  58. package/dist/utils/trace-fields.js.map +1 -0
  59. package/dist/utils/validation.d.ts +121 -0
  60. package/dist/utils/validation.d.ts.map +1 -0
  61. package/dist/utils/validation.js +451 -0
  62. package/dist/utils/validation.js.map +1 -0
  63. package/examples/README.md +321 -0
  64. package/examples/litellm-basic.ts +240 -0
  65. package/examples/litellm-streaming.ts +309 -0
  66. package/examples/prompt-capture.ts +128 -0
  67. 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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"}