@revenium/openai 1.0.8
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 +1095 -0
- package/dist/cjs/core/config/azure-config.js +64 -0
- package/dist/cjs/core/config/azure-config.js.map +1 -0
- package/dist/cjs/core/config/index.js +41 -0
- package/dist/cjs/core/config/index.js.map +1 -0
- package/dist/cjs/core/config/loader.js +63 -0
- package/dist/cjs/core/config/loader.js.map +1 -0
- package/dist/cjs/core/config/manager.js +93 -0
- package/dist/cjs/core/config/manager.js.map +1 -0
- package/dist/cjs/core/config/validator.js +73 -0
- package/dist/cjs/core/config/validator.js.map +1 -0
- package/dist/cjs/core/providers/detector.js +140 -0
- package/dist/cjs/core/providers/detector.js.map +1 -0
- package/dist/cjs/core/providers/index.js +18 -0
- package/dist/cjs/core/providers/index.js.map +1 -0
- package/dist/cjs/core/tracking/api-client.js +68 -0
- package/dist/cjs/core/tracking/api-client.js.map +1 -0
- package/dist/cjs/core/tracking/index.js +23 -0
- package/dist/cjs/core/tracking/index.js.map +1 -0
- package/dist/cjs/core/tracking/payload-builder.js +107 -0
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -0
- package/dist/cjs/core/tracking/usage-tracker.js +120 -0
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -0
- package/dist/cjs/core/wrapper/index.js +15 -0
- package/dist/cjs/core/wrapper/index.js.map +1 -0
- package/dist/cjs/core/wrapper/instance-patcher.js +202 -0
- package/dist/cjs/core/wrapper/instance-patcher.js.map +1 -0
- package/dist/cjs/core/wrapper/request-handler.js +317 -0
- package/dist/cjs/core/wrapper/request-handler.js.map +1 -0
- package/dist/cjs/core/wrapper/stream-wrapper.js +82 -0
- package/dist/cjs/core/wrapper/stream-wrapper.js.map +1 -0
- package/dist/cjs/index.js +195 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/function-parameters.js +14 -0
- package/dist/cjs/types/function-parameters.js.map +1 -0
- package/dist/cjs/types/index.js +49 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/openai-augmentation.js +55 -0
- package/dist/cjs/types/openai-augmentation.js.map +1 -0
- package/dist/cjs/types/responses-api.js +30 -0
- package/dist/cjs/types/responses-api.js.map +1 -0
- package/dist/cjs/utils/azure-model-resolver.js +211 -0
- package/dist/cjs/utils/azure-model-resolver.js.map +1 -0
- package/dist/cjs/utils/constants.js +24 -0
- package/dist/cjs/utils/constants.js.map +1 -0
- package/dist/cjs/utils/error-handler.js +194 -0
- package/dist/cjs/utils/error-handler.js.map +1 -0
- package/dist/cjs/utils/metadata-builder.js +184 -0
- package/dist/cjs/utils/metadata-builder.js.map +1 -0
- package/dist/cjs/utils/provider-detection.js +212 -0
- package/dist/cjs/utils/provider-detection.js.map +1 -0
- package/dist/cjs/utils/request-handler-factory.js +185 -0
- package/dist/cjs/utils/request-handler-factory.js.map +1 -0
- package/dist/cjs/utils/stop-reason-mapper.js +70 -0
- package/dist/cjs/utils/stop-reason-mapper.js.map +1 -0
- package/dist/cjs/utils/type-guards.js +175 -0
- package/dist/cjs/utils/type-guards.js.map +1 -0
- package/dist/cjs/utils/url-builder.js +43 -0
- package/dist/cjs/utils/url-builder.js.map +1 -0
- package/dist/esm/core/config/azure-config.js +61 -0
- package/dist/esm/core/config/azure-config.js.map +1 -0
- package/dist/esm/core/config/index.js +13 -0
- package/dist/esm/core/config/index.js.map +1 -0
- package/dist/esm/core/config/loader.js +58 -0
- package/dist/esm/core/config/loader.js.map +1 -0
- package/dist/esm/core/config/manager.js +85 -0
- package/dist/esm/core/config/manager.js.map +1 -0
- package/dist/esm/core/config/validator.js +69 -0
- package/dist/esm/core/config/validator.js.map +1 -0
- package/dist/esm/core/providers/detector.js +134 -0
- package/dist/esm/core/providers/detector.js.map +1 -0
- package/dist/esm/core/providers/index.js +10 -0
- package/dist/esm/core/providers/index.js.map +1 -0
- package/dist/esm/core/tracking/api-client.js +65 -0
- package/dist/esm/core/tracking/api-client.js.map +1 -0
- package/dist/esm/core/tracking/index.js +13 -0
- package/dist/esm/core/tracking/index.js.map +1 -0
- package/dist/esm/core/tracking/payload-builder.js +104 -0
- package/dist/esm/core/tracking/payload-builder.js.map +1 -0
- package/dist/esm/core/tracking/usage-tracker.js +114 -0
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -0
- package/dist/esm/core/wrapper/index.js +9 -0
- package/dist/esm/core/wrapper/index.js.map +1 -0
- package/dist/esm/core/wrapper/instance-patcher.js +199 -0
- package/dist/esm/core/wrapper/instance-patcher.js.map +1 -0
- package/dist/esm/core/wrapper/request-handler.js +310 -0
- package/dist/esm/core/wrapper/request-handler.js.map +1 -0
- package/dist/esm/core/wrapper/stream-wrapper.js +79 -0
- package/dist/esm/core/wrapper/stream-wrapper.js.map +1 -0
- package/dist/esm/index.js +175 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/function-parameters.js +13 -0
- package/dist/esm/types/function-parameters.js.map +1 -0
- package/dist/esm/types/index.js +32 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/openai-augmentation.js +54 -0
- package/dist/esm/types/openai-augmentation.js.map +1 -0
- package/dist/esm/types/responses-api.js +26 -0
- package/dist/esm/types/responses-api.js.map +1 -0
- package/dist/esm/utils/azure-model-resolver.js +204 -0
- package/dist/esm/utils/azure-model-resolver.js.map +1 -0
- package/dist/esm/utils/constants.js +21 -0
- package/dist/esm/utils/constants.js.map +1 -0
- package/dist/esm/utils/error-handler.js +182 -0
- package/dist/esm/utils/error-handler.js.map +1 -0
- package/dist/esm/utils/metadata-builder.js +176 -0
- package/dist/esm/utils/metadata-builder.js.map +1 -0
- package/dist/esm/utils/provider-detection.js +206 -0
- package/dist/esm/utils/provider-detection.js.map +1 -0
- package/dist/esm/utils/request-handler-factory.js +146 -0
- package/dist/esm/utils/request-handler-factory.js.map +1 -0
- package/dist/esm/utils/stop-reason-mapper.js +65 -0
- package/dist/esm/utils/stop-reason-mapper.js.map +1 -0
- package/dist/esm/utils/type-guards.js +158 -0
- package/dist/esm/utils/type-guards.js.map +1 -0
- package/dist/esm/utils/url-builder.js +39 -0
- package/dist/esm/utils/url-builder.js.map +1 -0
- package/dist/types/core/config/azure-config.d.ts +16 -0
- package/dist/types/core/config/azure-config.d.ts.map +1 -0
- package/dist/types/core/config/index.d.ts +11 -0
- package/dist/types/core/config/index.d.ts.map +1 -0
- package/dist/types/core/config/loader.d.ts +20 -0
- package/dist/types/core/config/loader.d.ts.map +1 -0
- package/dist/types/core/config/manager.d.ts +32 -0
- package/dist/types/core/config/manager.d.ts.map +1 -0
- package/dist/types/core/config/validator.d.ts +23 -0
- package/dist/types/core/config/validator.d.ts.map +1 -0
- package/dist/types/core/providers/detector.d.ts +44 -0
- package/dist/types/core/providers/detector.d.ts.map +1 -0
- package/dist/types/core/providers/index.d.ts +9 -0
- package/dist/types/core/providers/index.d.ts.map +1 -0
- package/dist/types/core/tracking/api-client.d.ts +17 -0
- package/dist/types/core/tracking/api-client.d.ts.map +1 -0
- package/dist/types/core/tracking/index.d.ts +11 -0
- package/dist/types/core/tracking/index.d.ts.map +1 -0
- package/dist/types/core/tracking/payload-builder.d.ts +24 -0
- package/dist/types/core/tracking/payload-builder.d.ts.map +1 -0
- package/dist/types/core/tracking/usage-tracker.d.ts +48 -0
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -0
- package/dist/types/core/wrapper/index.d.ts +8 -0
- package/dist/types/core/wrapper/index.d.ts.map +1 -0
- package/dist/types/core/wrapper/instance-patcher.d.ts +33 -0
- package/dist/types/core/wrapper/instance-patcher.d.ts.map +1 -0
- package/dist/types/core/wrapper/request-handler.d.ts +29 -0
- package/dist/types/core/wrapper/request-handler.d.ts.map +1 -0
- package/dist/types/core/wrapper/stream-wrapper.d.ts +13 -0
- package/dist/types/core/wrapper/stream-wrapper.d.ts.map +1 -0
- package/dist/types/index.d.ts +179 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types/function-parameters.d.ts +229 -0
- package/dist/types/types/function-parameters.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +283 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/openai-augmentation.d.ts +226 -0
- package/dist/types/types/openai-augmentation.d.ts.map +1 -0
- package/dist/types/types/responses-api.d.ts +247 -0
- package/dist/types/types/responses-api.d.ts.map +1 -0
- package/dist/types/utils/azure-model-resolver.d.ts +41 -0
- package/dist/types/utils/azure-model-resolver.d.ts.map +1 -0
- package/dist/types/utils/constants.d.ts +4 -0
- package/dist/types/utils/constants.d.ts.map +1 -0
- package/dist/types/utils/error-handler.d.ts +95 -0
- package/dist/types/utils/error-handler.d.ts.map +1 -0
- package/dist/types/utils/metadata-builder.d.ts +64 -0
- package/dist/types/utils/metadata-builder.d.ts.map +1 -0
- package/dist/types/utils/provider-detection.d.ts +51 -0
- package/dist/types/utils/provider-detection.d.ts.map +1 -0
- package/dist/types/utils/request-handler-factory.d.ts +81 -0
- package/dist/types/utils/request-handler-factory.d.ts.map +1 -0
- package/dist/types/utils/stop-reason-mapper.d.ts +29 -0
- package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -0
- package/dist/types/utils/type-guards.d.ts +73 -0
- package/dist/types/utils/type-guards.d.ts.map +1 -0
- package/dist/types/utils/url-builder.d.ts +25 -0
- package/dist/types/utils/url-builder.d.ts.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Core Types Module
|
|
4
|
+
*
|
|
5
|
+
* Central type definitions for the Revenium OpenAI middleware.
|
|
6
|
+
* This module exports all core types used throughout the application.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.Provider = void 0;
|
|
24
|
+
// Re-export function parameter types
|
|
25
|
+
__exportStar(require("./function-parameters.js"), exports);
|
|
26
|
+
// Re-export Responses API types
|
|
27
|
+
__exportStar(require("./responses-api.js"), exports);
|
|
28
|
+
/**
|
|
29
|
+
* Supported AI providers
|
|
30
|
+
*
|
|
31
|
+
* Enumeration of AI providers supported by the Revenium middleware.
|
|
32
|
+
* Used for automatic detection, routing, and provider-specific handling.
|
|
33
|
+
*
|
|
34
|
+
* @public
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* if (providerInfo.provider === Provider.AZURE_OPENAI) {
|
|
38
|
+
* console.log('Using Azure OpenAI');
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
var Provider;
|
|
43
|
+
(function (Provider) {
|
|
44
|
+
/** Standard OpenAI API */
|
|
45
|
+
Provider["OPENAI"] = "OPENAI";
|
|
46
|
+
/** Azure OpenAI Service */
|
|
47
|
+
Provider["AZURE_OPENAI"] = "AZURE_OPENAI";
|
|
48
|
+
})(Provider || (exports.Provider = Provider = {}));
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,qCAAqC;AACrC,2DAAyC;AAEzC,gCAAgC;AAChC,qDAAmC;AA0InC;;;;;;;;;;;;;GAaG;AACH,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,0BAA0B;IAC1B,6BAAiB,CAAA;IACjB,2BAA2B;IAC3B,yCAA6B,CAAA;AAC/B,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TypeScript module augmentation for OpenAI SDK
|
|
4
|
+
*
|
|
5
|
+
* This file extends OpenAI's existing types to include the usageMetadata field
|
|
6
|
+
* through TypeScript's declaration merging feature. This provides seamless
|
|
7
|
+
* integration with the OpenAI SDK, allowing developers to use usageMetadata
|
|
8
|
+
* directly in OpenAI API calls without type casting or additional imports.
|
|
9
|
+
*
|
|
10
|
+
* The augmentation covers all major OpenAI API endpoints including:
|
|
11
|
+
* - Chat completions (streaming and non-streaming)
|
|
12
|
+
* - Embeddings
|
|
13
|
+
* - Future API endpoints as they become available
|
|
14
|
+
*
|
|
15
|
+
* @fileoverview OpenAI SDK type augmentation for Revenium middleware
|
|
16
|
+
* @author Revenium
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*
|
|
19
|
+
* @example Basic usage with chat completions
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import 'revenium-middleware-openai-node';
|
|
22
|
+
* import OpenAI from 'openai';
|
|
23
|
+
*
|
|
24
|
+
* const openai = new OpenAI();
|
|
25
|
+
*
|
|
26
|
+
* const response = await openai.chat.completions.create({
|
|
27
|
+
* model: 'gpt-4o-mini',
|
|
28
|
+
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
29
|
+
* usageMetadata: { // TypeScript recognizes this natively
|
|
30
|
+
* subscriber: {
|
|
31
|
+
* id: 'user-123',
|
|
32
|
+
* email: 'user@my-company.com'
|
|
33
|
+
* },
|
|
34
|
+
* organizationId: 'my-company',
|
|
35
|
+
* productId: 'chat-app',
|
|
36
|
+
* taskType: 'customer-support'
|
|
37
|
+
* }
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example Usage with embeddings
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const embedding = await openai.embeddings.create({
|
|
44
|
+
* model: 'text-embedding-ada-002',
|
|
45
|
+
* input: 'Text to embed',
|
|
46
|
+
* usageMetadata: {
|
|
47
|
+
* subscriber: { id: 'user-456' },
|
|
48
|
+
* productId: 'search-engine',
|
|
49
|
+
* taskType: 'document-indexing'
|
|
50
|
+
* }
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
//# sourceMappingURL=openai-augmentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-augmentation.js","sourceRoot":"","sources":["../../../src/types/openai-augmentation.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Types for OpenAI Responses API support
|
|
4
|
+
*
|
|
5
|
+
* This module defines types for the new OpenAI Responses API that replaces
|
|
6
|
+
* the traditional Chat Completions API. The Responses API provides a unified
|
|
7
|
+
* interface for building agent-like applications with built-in tools and capabilities.
|
|
8
|
+
*
|
|
9
|
+
* Reference: https://platform.openai.com/docs/guides/migrate-to-responses
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.isResponsesRequest = isResponsesRequest;
|
|
13
|
+
exports.isResponsesResponse = isResponsesResponse;
|
|
14
|
+
/**
|
|
15
|
+
* Type guard to check if a request is for Responses API
|
|
16
|
+
*/
|
|
17
|
+
function isResponsesRequest(params) {
|
|
18
|
+
return typeof params === 'object' && params !== null && 'input' in params && 'model' in params;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Type guard to check if a response is from Responses API
|
|
22
|
+
*/
|
|
23
|
+
function isResponsesResponse(response) {
|
|
24
|
+
return (typeof response === 'object' &&
|
|
25
|
+
response !== null &&
|
|
26
|
+
'id' in response &&
|
|
27
|
+
'model' in response &&
|
|
28
|
+
('output' in response || 'usage' in response));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=responses-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses-api.js","sourceRoot":"","sources":["../../../src/types/responses-api.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AA2OH,gDAEC;AAKD,kDAQC;AAlBD;;GAEG;AACH,SAAgB,kBAAkB,CAAC,MAAe;IAChD,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC;AACjG,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAAiB;IACnD,OAAO,CACL,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,KAAK,IAAI;QACjB,IAAI,IAAI,QAAQ;QAChB,OAAO,IAAI,QAAQ;QACnB,CAAC,QAAQ,IAAI,QAAQ,IAAI,OAAO,IAAI,QAAQ,CAAC,CAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveAzureModelName = resolveAzureModelName;
|
|
4
|
+
exports.clearModelNameCache = clearModelNameCache;
|
|
5
|
+
exports.getModelNameCacheStats = getModelNameCacheStats;
|
|
6
|
+
exports.batchResolveModelNames = batchResolveModelNames;
|
|
7
|
+
exports.wouldTransformDeploymentName = wouldTransformDeploymentName;
|
|
8
|
+
const index_js_1 = require("../core/config/index.js");
|
|
9
|
+
const constants_js_1 = require("./constants.js");
|
|
10
|
+
/**
|
|
11
|
+
* Azure Model Name Resolution Module
|
|
12
|
+
*
|
|
13
|
+
* This module maps Azure deployment names to LiteLLM-compatible model names for accurate pricing.
|
|
14
|
+
* Based on learnings from the Python implementation, it uses heuristic pattern matching
|
|
15
|
+
* with fallback strategies to ensure reliable model name resolution.
|
|
16
|
+
*
|
|
17
|
+
* Key patterns observed in real Azure deployments:
|
|
18
|
+
* - "gpt-4o-2024-11-20" → "gpt-4o"
|
|
19
|
+
* - "text-embedding-3-large" → "text-embedding-3-large" (exact match)
|
|
20
|
+
* - "o4-mini" → "gpt-4o-mini"
|
|
21
|
+
* - "gpt4o-prod" → "gpt-4o"
|
|
22
|
+
* - "gpt-35-turbo-dev" → "gpt-3.5-turbo"
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* In-memory cache for resolved model names
|
|
26
|
+
* Using Map for thread-safe operations in Node.js
|
|
27
|
+
*/
|
|
28
|
+
const modelNameCache = new Map();
|
|
29
|
+
/**
|
|
30
|
+
* Cache for failed resolution attempts to avoid repeated warnings
|
|
31
|
+
*/
|
|
32
|
+
const failedResolutionCache = new Set();
|
|
33
|
+
// Global logger
|
|
34
|
+
const logger = (0, index_js_1.getLogger)();
|
|
35
|
+
/**
|
|
36
|
+
* Resolve Azure deployment name to LiteLLM-compatible model name
|
|
37
|
+
*
|
|
38
|
+
* @param deploymentName - Azure deployment name
|
|
39
|
+
* @param useCache - Whether to use cached results (default: true)
|
|
40
|
+
* @returns LiteLLM-compatible model name
|
|
41
|
+
*/
|
|
42
|
+
function resolveAzureModelName(deploymentName, useCache = true) {
|
|
43
|
+
if (!deploymentName) {
|
|
44
|
+
logger.warn('Empty deployment name provided to model resolver');
|
|
45
|
+
return deploymentName;
|
|
46
|
+
}
|
|
47
|
+
// Check cache first
|
|
48
|
+
if (useCache && modelNameCache.has(deploymentName)) {
|
|
49
|
+
const cachedResult = modelNameCache.get(deploymentName);
|
|
50
|
+
logger.debug('Model name resolved from cache', {
|
|
51
|
+
deployment: deploymentName,
|
|
52
|
+
resolved: cachedResult,
|
|
53
|
+
});
|
|
54
|
+
return cachedResult;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const resolved = resolveModelNameHeuristic(deploymentName);
|
|
58
|
+
// Cache the result
|
|
59
|
+
if (useCache) {
|
|
60
|
+
modelNameCache.set(deploymentName, resolved);
|
|
61
|
+
}
|
|
62
|
+
// Log successful resolution
|
|
63
|
+
if (resolved !== deploymentName) {
|
|
64
|
+
logger.debug('Model name resolved via heuristics', {
|
|
65
|
+
deployment: deploymentName,
|
|
66
|
+
resolved,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return resolved;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logger.error('Error during model name resolution', {
|
|
73
|
+
deployment: deploymentName,
|
|
74
|
+
error: error instanceof Error ? error.message : String(error),
|
|
75
|
+
});
|
|
76
|
+
// Fallback to deployment name
|
|
77
|
+
return deploymentName;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Heuristic pattern matching for Azure deployment names
|
|
82
|
+
* Based on real-world patterns observed in the Python implementation
|
|
83
|
+
*
|
|
84
|
+
* @param deploymentName - Azure deployment name
|
|
85
|
+
* @returns LiteLLM-compatible model name
|
|
86
|
+
*/
|
|
87
|
+
function resolveModelNameHeuristic(deploymentName) {
|
|
88
|
+
const nameLower = deploymentName.toLowerCase();
|
|
89
|
+
// GPT-4o family - handle both "gpt-4o" and "o4" patterns
|
|
90
|
+
if (/gpt-?4o/.test(nameLower) || /o4/.test(nameLower)) {
|
|
91
|
+
if (/mini/.test(nameLower))
|
|
92
|
+
return 'gpt-4o-mini';
|
|
93
|
+
return 'gpt-4o';
|
|
94
|
+
}
|
|
95
|
+
// GPT-4 family (non-omni)
|
|
96
|
+
if (/gpt-?4(?!o)/.test(nameLower)) {
|
|
97
|
+
if (/turbo/.test(nameLower))
|
|
98
|
+
return 'gpt-4-turbo';
|
|
99
|
+
if (/vision/.test(nameLower) || /v/.test(nameLower))
|
|
100
|
+
return 'gpt-4-vision-preview';
|
|
101
|
+
return 'gpt-4';
|
|
102
|
+
}
|
|
103
|
+
// GPT-3.5 family
|
|
104
|
+
if (/gpt-?3\.?5/.test(nameLower) || /35-turbo/.test(nameLower) || /gpt-35/.test(nameLower)) {
|
|
105
|
+
if (/instruct/.test(nameLower))
|
|
106
|
+
return 'gpt-3.5-turbo-instruct';
|
|
107
|
+
return 'gpt-3.5-turbo';
|
|
108
|
+
}
|
|
109
|
+
// Embedding models - exact matches work well
|
|
110
|
+
if (/embed/.test(nameLower)) {
|
|
111
|
+
if (/text-embedding-3-large/.test(nameLower))
|
|
112
|
+
return 'text-embedding-3-large';
|
|
113
|
+
if (/text-embedding-3-small/.test(nameLower))
|
|
114
|
+
return 'text-embedding-3-small';
|
|
115
|
+
if (/text-embedding-ada-002/.test(nameLower) || /ada-002/.test(nameLower))
|
|
116
|
+
return 'text-embedding-ada-002';
|
|
117
|
+
if (/3-large/.test(nameLower))
|
|
118
|
+
return 'text-embedding-3-large';
|
|
119
|
+
if (/3-small/.test(nameLower))
|
|
120
|
+
return 'text-embedding-3-small';
|
|
121
|
+
}
|
|
122
|
+
// Ada-002 pattern (can appear without "embed" in deployment name)
|
|
123
|
+
if (/ada-002/.test(nameLower))
|
|
124
|
+
return 'text-embedding-ada-002';
|
|
125
|
+
// DALL-E models
|
|
126
|
+
if (/dall-?e/.test(nameLower)) {
|
|
127
|
+
if (/3/.test(nameLower))
|
|
128
|
+
return 'dall-e-3';
|
|
129
|
+
if (/2/.test(nameLower))
|
|
130
|
+
return 'dall-e-2';
|
|
131
|
+
}
|
|
132
|
+
// Whisper models
|
|
133
|
+
if (/whisper/.test(nameLower))
|
|
134
|
+
return 'whisper-1';
|
|
135
|
+
// TTS models
|
|
136
|
+
if (/tts/.test(nameLower)) {
|
|
137
|
+
if (/hd/.test(nameLower))
|
|
138
|
+
return 'tts-1-hd';
|
|
139
|
+
return 'tts-1';
|
|
140
|
+
}
|
|
141
|
+
if (constants_js_1.knownModels.includes(nameLower))
|
|
142
|
+
return nameLower;
|
|
143
|
+
// No heuristic match found - log warning and use deployment name
|
|
144
|
+
if (!failedResolutionCache.has(deploymentName)) {
|
|
145
|
+
logger.warn(`⚠️ No heuristic match for Azure deployment: ${deploymentName}. Using deployment name for pricing. Consider adding pattern to azure-model-resolver.ts`);
|
|
146
|
+
failedResolutionCache.add(deploymentName);
|
|
147
|
+
}
|
|
148
|
+
return deploymentName;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Clear the model name cache
|
|
152
|
+
* Useful for testing or when deployment configurations change
|
|
153
|
+
*/
|
|
154
|
+
function clearModelNameCache() {
|
|
155
|
+
modelNameCache.clear();
|
|
156
|
+
failedResolutionCache.clear();
|
|
157
|
+
(0, index_js_1.getLogger)().debug('Model name cache cleared');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get cache statistics for monitoring
|
|
161
|
+
*/
|
|
162
|
+
function getModelNameCacheStats() {
|
|
163
|
+
return {
|
|
164
|
+
cacheSize: modelNameCache.size,
|
|
165
|
+
failedResolutionCount: failedResolutionCache.size,
|
|
166
|
+
cacheEntries: Array.from(modelNameCache.entries()).map(([deployment, resolved]) => ({
|
|
167
|
+
deployment,
|
|
168
|
+
resolved,
|
|
169
|
+
})),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Batch resolve multiple deployment names
|
|
174
|
+
* Useful for pre-warming cache or bulk operations
|
|
175
|
+
*
|
|
176
|
+
* @param deploymentNames - Array of deployment names to resolve
|
|
177
|
+
* @returns Map of deployment name to resolved model name
|
|
178
|
+
*/
|
|
179
|
+
function batchResolveModelNames(deploymentNames) {
|
|
180
|
+
const results = new Map();
|
|
181
|
+
logger.debug('Batch resolving model names', {
|
|
182
|
+
count: deploymentNames.length,
|
|
183
|
+
deployments: deploymentNames,
|
|
184
|
+
});
|
|
185
|
+
for (const deployment of deploymentNames) {
|
|
186
|
+
try {
|
|
187
|
+
const resolved = resolveAzureModelName(deployment);
|
|
188
|
+
results.set(deployment, resolved);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
logger.error('Error in batch resolution', {
|
|
192
|
+
deployment,
|
|
193
|
+
error: error instanceof Error ? error.message : String(error),
|
|
194
|
+
});
|
|
195
|
+
results.set(deployment, deployment); // Fallback to original name
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return results;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if a deployment name would be resolved to a different model name
|
|
202
|
+
* Useful for validation and testing
|
|
203
|
+
*
|
|
204
|
+
* @param deploymentName - Azure deployment name
|
|
205
|
+
* @returns true if the deployment name would be transformed
|
|
206
|
+
*/
|
|
207
|
+
function wouldTransformDeploymentName(deploymentName) {
|
|
208
|
+
const resolved = resolveAzureModelName(deploymentName, false); // Don't use cache for this check
|
|
209
|
+
return resolved !== deploymentName;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=azure-model-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-model-resolver.js","sourceRoot":"","sources":["../../../src/utils/azure-model-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ERROR_MESSAGE_PATTERNS_TYPE_CONFIG = exports.MESSAGE_PATTERNS_TYPE_NETWORK = exports.knownModels = void 0;
|
|
4
|
+
// Direct match check for known LiteLLM model names
|
|
5
|
+
exports.knownModels = [
|
|
6
|
+
'gpt-4o',
|
|
7
|
+
'gpt-4o-mini',
|
|
8
|
+
'gpt-4',
|
|
9
|
+
'gpt-4-turbo',
|
|
10
|
+
'gpt-4-vision-preview',
|
|
11
|
+
'gpt-3.5-turbo',
|
|
12
|
+
'gpt-3.5-turbo-instruct',
|
|
13
|
+
'text-embedding-3-large',
|
|
14
|
+
'text-embedding-3-small',
|
|
15
|
+
'text-embedding-ada-002',
|
|
16
|
+
'dall-e-3',
|
|
17
|
+
'dall-e-2',
|
|
18
|
+
'whisper-1',
|
|
19
|
+
'tts-1',
|
|
20
|
+
'tts-1-hd'
|
|
21
|
+
];
|
|
22
|
+
exports.MESSAGE_PATTERNS_TYPE_NETWORK = ["network", "timeout", "ECONNRESET"];
|
|
23
|
+
exports.ERROR_MESSAGE_PATTERNS_TYPE_CONFIG = ["config", "key", "unauthorized"];
|
|
24
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":";;;AAAA,mDAAmD;AACtC,QAAA,WAAW,GAAG;IAC3B,QAAQ;IACR,aAAa;IACb,OAAO;IACP,aAAa;IACb,sBAAsB;IACtB,eAAe;IACf,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,wBAAwB;IACxB,UAAU;IACV,UAAU;IACV,WAAW;IACX,OAAO;IACP,UAAU;CACT,CAAC;AAEW,QAAA,6BAA6B,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACrE,QAAA,kCAAkC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error Handler Utilities
|
|
4
|
+
*
|
|
5
|
+
* Centralized error handling patterns to eliminate repetitive try/catch blocks
|
|
6
|
+
* and provide consistent error logging and recovery strategies.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.NetworkError = exports.ConfigurationError = exports.ValidationError = void 0;
|
|
10
|
+
exports.safeAsyncOperation = safeAsyncOperation;
|
|
11
|
+
exports.safeSyncOperation = safeSyncOperation;
|
|
12
|
+
exports.validateOrThrow = validateOrThrow;
|
|
13
|
+
exports.validateOrUndefined = validateOrUndefined;
|
|
14
|
+
exports.withRetry = withRetry;
|
|
15
|
+
exports.classifyError = classifyError;
|
|
16
|
+
const constants_js_1 = require("./constants.js");
|
|
17
|
+
/**
|
|
18
|
+
* Default error handling strategy
|
|
19
|
+
*/
|
|
20
|
+
const DEFAULT_STRATEGY = {
|
|
21
|
+
logError: true,
|
|
22
|
+
rethrow: true,
|
|
23
|
+
messagePrefix: '',
|
|
24
|
+
fallbackValue: undefined,
|
|
25
|
+
transformError: (error) => (error instanceof Error ? error : new Error(String(error))),
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Safe async operation wrapper with comprehensive error handling
|
|
29
|
+
*
|
|
30
|
+
* @param operation - The async operation to execute
|
|
31
|
+
* @param context - Context information for logging
|
|
32
|
+
* @param strategy - Error handling strategy
|
|
33
|
+
* @param logger - Logger instance
|
|
34
|
+
* @returns Promise with result or fallback value
|
|
35
|
+
*/
|
|
36
|
+
async function safeAsyncOperation(operation, context, strategy = {}, logger) {
|
|
37
|
+
const config = { ...DEFAULT_STRATEGY, ...strategy };
|
|
38
|
+
try {
|
|
39
|
+
return await operation();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const transformedError = config.transformError(error);
|
|
43
|
+
if (config.logError && logger) {
|
|
44
|
+
logger.error(`${config.messagePrefix}${context}`, {
|
|
45
|
+
error: transformedError.message,
|
|
46
|
+
stack: transformedError.stack,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (config.rethrow)
|
|
50
|
+
throw transformedError;
|
|
51
|
+
return config.fallbackValue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Safe sync operation wrapper
|
|
56
|
+
*
|
|
57
|
+
* @param operation - The sync operation to execute
|
|
58
|
+
* @param context - Context information for logging
|
|
59
|
+
* @param strategy - Error handling strategy
|
|
60
|
+
* @param logger - Logger instance
|
|
61
|
+
* @returns Result or fallback value
|
|
62
|
+
*/
|
|
63
|
+
function safeSyncOperation(operation, context, strategy = {}, logger) {
|
|
64
|
+
const config = { ...DEFAULT_STRATEGY, ...strategy };
|
|
65
|
+
try {
|
|
66
|
+
return operation();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
const transformedError = config.transformError(error);
|
|
70
|
+
if (config.logError && logger) {
|
|
71
|
+
logger.error(`${config.messagePrefix}${context}`, {
|
|
72
|
+
error: transformedError.message,
|
|
73
|
+
stack: transformedError.stack,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (config.rethrow)
|
|
77
|
+
throw transformedError;
|
|
78
|
+
return config.fallbackValue;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validation wrapper that provides clear error messages
|
|
83
|
+
*
|
|
84
|
+
* @param value - Value to validate
|
|
85
|
+
* @param validator - Validation function
|
|
86
|
+
* @param errorMessage - Error message if validation fails
|
|
87
|
+
* @returns Validated value
|
|
88
|
+
*/
|
|
89
|
+
function validateOrThrow(value, validator, errorMessage) {
|
|
90
|
+
if (!validator(value))
|
|
91
|
+
throw new Error(errorMessage);
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validation wrapper that returns undefined on failure
|
|
96
|
+
*
|
|
97
|
+
* @param value - Value to validate
|
|
98
|
+
* @param validator - Validation function
|
|
99
|
+
* @param logger - Optional logger for warnings
|
|
100
|
+
* @param context - Context for logging
|
|
101
|
+
* @returns Validated value or undefined
|
|
102
|
+
*/
|
|
103
|
+
function validateOrUndefined(value, validator, logger, context) {
|
|
104
|
+
if (!validator(value)) {
|
|
105
|
+
if (logger && context) {
|
|
106
|
+
logger.warn(`Validation failed: ${context}`, { value });
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a retry wrapper for operations that might fail temporarily
|
|
114
|
+
*
|
|
115
|
+
* @param operation - Operation to retry
|
|
116
|
+
* @param maxRetries - Maximum number of retries
|
|
117
|
+
* @param delayMs - Delay between retries in milliseconds
|
|
118
|
+
* @param logger - Logger for retry attempts
|
|
119
|
+
* @returns Promise with operation result
|
|
120
|
+
*/
|
|
121
|
+
async function withRetry(operation, maxRetries = 3, delayMs = 1000, logger) {
|
|
122
|
+
let lastError;
|
|
123
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
124
|
+
try {
|
|
125
|
+
return await operation();
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
129
|
+
if (attempt === maxRetries) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
if (logger) {
|
|
133
|
+
logger.warn(`Operation failed, retrying (${attempt}/${maxRetries})`, {
|
|
134
|
+
error: lastError.message,
|
|
135
|
+
nextRetryIn: delayMs,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// eslint-disable-next-line no-throw-literal
|
|
142
|
+
throw lastError;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Common error types for better error handling
|
|
146
|
+
*/
|
|
147
|
+
class ValidationError extends Error {
|
|
148
|
+
constructor(message, context) {
|
|
149
|
+
super(message);
|
|
150
|
+
this.context = context;
|
|
151
|
+
this.name = 'ValidationError';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.ValidationError = ValidationError;
|
|
155
|
+
class ConfigurationError extends Error {
|
|
156
|
+
constructor(message, context) {
|
|
157
|
+
super(message);
|
|
158
|
+
this.context = context;
|
|
159
|
+
this.name = 'ConfigurationError';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.ConfigurationError = ConfigurationError;
|
|
163
|
+
class NetworkError extends Error {
|
|
164
|
+
constructor(message, context) {
|
|
165
|
+
super(message);
|
|
166
|
+
this.context = context;
|
|
167
|
+
this.name = 'NetworkError';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.NetworkError = NetworkError;
|
|
171
|
+
/**
|
|
172
|
+
* Error classification utility
|
|
173
|
+
*/
|
|
174
|
+
function classifyError(error) {
|
|
175
|
+
if (error instanceof ValidationError) {
|
|
176
|
+
return { type: 'validation', message: error.message, isRetryable: false };
|
|
177
|
+
}
|
|
178
|
+
if (error instanceof ConfigurationError) {
|
|
179
|
+
return { type: 'configuration', message: error.message, isRetryable: false };
|
|
180
|
+
}
|
|
181
|
+
if (error instanceof NetworkError) {
|
|
182
|
+
return { type: 'network', message: error.message, isRetryable: true };
|
|
183
|
+
}
|
|
184
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
185
|
+
// Classify based on message patterns
|
|
186
|
+
if (constants_js_1.MESSAGE_PATTERNS_TYPE_NETWORK.some(pattern => message.includes(pattern))) {
|
|
187
|
+
return { type: 'network', message, isRetryable: true };
|
|
188
|
+
}
|
|
189
|
+
if (constants_js_1.ERROR_MESSAGE_PATTERNS_TYPE_CONFIG.some(pattern => message.includes(pattern))) {
|
|
190
|
+
return { type: 'configuration', message, isRetryable: false };
|
|
191
|
+
}
|
|
192
|
+
return { type: 'unknown', message, isRetryable: false };
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../src/utils/error-handler.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyCH,gDAuBC;AAWD,8CAuBC;AAUD,0CAOC;AAWD,kDAaC;AAWD,8BA6BC;AAsCD,sCA4BC;AAlPD,iDAAmG;AAkBnG;;GAEG;AACH,MAAM,gBAAgB,GAAoC;IACxD,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,SAAS;IACxB,cAAc,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;CAChG,CAAC;AAEF;;;;;;;;GAQG;AACI,KAAK,UAAU,kBAAkB,CACtC,SAA2B,EAC3B,OAAe,EACf,WAAkC,EAAE,EACpC,MAAe;IAEf,MAAM,MAAM,GAAG,EAAE,GAAG,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,aAAa,GAAG,OAAO,EAAE,EAAE;gBAChD,KAAK,EAAE,gBAAgB,CAAC,OAAO;gBAC/B,KAAK,EAAE,gBAAgB,CAAC,KAAK;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,gBAAgB,CAAC;QAC3C,OAAO,MAAM,CAAC,aAA8B,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAC/B,SAAkB,EAClB,OAAe,EACf,WAAkC,EAAE,EACpC,MAAe;IAEf,MAAM,MAAM,GAAG,EAAE,GAAG,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,aAAa,GAAG,OAAO,EAAE,EAAE;gBAChD,KAAK,EAAE,gBAAgB,CAAC,OAAO;gBAC/B,KAAK,EAAE,gBAAgB,CAAC,KAAK;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,gBAAgB,CAAC;QAC3C,OAAO,MAAM,CAAC,aAA8B,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,eAAe,CAC7B,KAAc,EACd,SAAyC,EACzC,YAAoB;IAEpB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CACjC,KAAc,EACd,SAAyC,EACzC,MAAe,EACf,OAAgB;IAEhB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO;IACT,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,SAAS,CAC7B,SAA2B,EAC3B,aAAqB,CAAC,EACtB,UAAkB,IAAI,EACtB,MAAe;IAEf,IAAI,SAAgB,CAAC;IACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3B,MAAM;YACR,CAAC;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,+BAA+B,OAAO,IAAI,UAAU,GAAG,EAAE;oBACnE,KAAK,EAAE,SAAS,CAAC,OAAO;oBACxB,WAAW,EAAE,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAU,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,KAAK;IACxC,YACE,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AARD,0CAQC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YACE,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AARD,gDAQC;AAED,MAAa,YAAa,SAAQ,KAAK;IACrC,YACE,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAc;IAK1C,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC5E,CAAC;IAED,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,qCAAqC;IACrC,IAAI,4CAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,IAAI,iDAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC"}
|