@dbx-tools/shared-model-gateway 0.9.40 → 0.9.43
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/README.md +22 -0
- package/exports.ts +1 -0
- package/index.ts +5 -1
- package/lib/exports.d.ts +1 -0
- package/lib/exports.js +2 -1
- package/lib/index.d.ts +5 -1
- package/lib/index.js +5 -2
- package/lib/src/contracts.d.ts +72 -25
- package/lib/src/contracts.js +87 -73
- package/lib/src/models.d.ts +103 -11
- package/lib/src/models.js +2 -1
- package/lib/src/options.d.ts +42 -0
- package/lib/src/options.js +44 -0
- package/lib/src/upstream.d.ts +12 -0
- package/lib/src/upstream.js +32 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -2
- package/src/contracts.ts +107 -87
- package/src/models.ts +1 -0
- package/src/options.ts +59 -0
- package/src/upstream.ts +35 -0
package/README.md
CHANGED
|
@@ -54,8 +54,30 @@ The `models` module covers OpenAI, Codex, Anthropic, embedding, and error
|
|
|
54
54
|
payloads. The `contracts` module covers model capabilities and deterministic
|
|
55
55
|
route-selection inputs and results.
|
|
56
56
|
|
|
57
|
+
## Configure The Gateway
|
|
58
|
+
|
|
59
|
+
`ModelGatewayOptionsSchema` owns server defaults and validation. The derived
|
|
60
|
+
`ModelGatewayCliOptionsSchema` adds `runtimeInfo` and requires a non-zero port
|
|
61
|
+
for foreground and service commands:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import {
|
|
65
|
+
ModelGatewayOptionsSchema,
|
|
66
|
+
resolveModelGatewayOptions,
|
|
67
|
+
} from "@dbx-tools/shared-model-gateway/options";
|
|
68
|
+
|
|
69
|
+
const options = resolveModelGatewayOptions({
|
|
70
|
+
host: "localhost",
|
|
71
|
+
port: 4400,
|
|
72
|
+
bodyLimit: "100mb",
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
ModelGatewayOptionsSchema.parse(options);
|
|
76
|
+
```
|
|
77
|
+
|
|
57
78
|
## Package API
|
|
58
79
|
|
|
59
80
|
- `client` creates the model-discovery client and typed HTTP errors.
|
|
60
81
|
- `models` validates public model, embedding, and error payloads.
|
|
61
82
|
- `contracts` validates shared routing and capability values.
|
|
83
|
+
- `options` validates shared server and CLI configuration.
|
package/exports.ts
CHANGED
package/index.ts
CHANGED
|
@@ -3,14 +3,18 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model-gateway";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.43";
|
|
7
7
|
export * as client from "./src/client.ts";
|
|
8
8
|
export * as contracts from "./src/contracts.ts";
|
|
9
9
|
export * as models from "./src/models.ts";
|
|
10
|
+
export * as options from "./src/options.ts";
|
|
11
|
+
export * as upstream from "./src/upstream.ts";
|
|
10
12
|
export { ModelGatewayClientError } from "./src/client.ts";
|
|
11
13
|
export type { ModelGatewayClientOptions, ListModelsOptions, ModelGatewayClient } from "./src/client.ts";
|
|
12
14
|
export { ClientProtocolSchema, UpstreamProtocolSchema, ModelCapabilitiesSchema, ModelTargetSchema, RequestedFeaturesSchema, GatewayRouteSchema, ModelCapabilityOverrideSchema, ResolveRouteInputSchema } from "./src/contracts.ts";
|
|
13
15
|
export type { ClientProtocol, UpstreamProtocol, ModelCapabilities, ModelTarget, RequestedFeatures, GatewayRoute, ModelCapabilityOverride, ResolveRouteInput } from "./src/contracts.ts";
|
|
14
16
|
export { OpenAIModelCapabilitiesSchema, OpenAIModelSchema, OpenAIModelListResponseSchema, CodexReasoningLevelSchema, CodexTruncationPolicySchema, CodexModelSchema, CodexModelListResponseSchema, ModelListResponseSchema, EmbeddingRequestSchema, EmbeddingDataSchema, EmbeddingUsageSchema, EmbeddingResponseSchema, OpenAIErrorResponseSchema, AnthropicErrorResponseSchema, GatewayErrorResponseSchema } from "./src/models.ts";
|
|
15
17
|
export type { OpenAIModelCapabilities, OpenAIModel, OpenAIModelListResponse, CodexReasoningLevel, CodexTruncationPolicy, CodexModel, CodexModelListResponse, ModelListResponse, EmbeddingRequest, EmbeddingData, EmbeddingUsage, EmbeddingResponse, OpenAIErrorResponse, AnthropicErrorResponse, GatewayErrorResponse } from "./src/models.ts";
|
|
18
|
+
export { ModelGatewayOptionsSchema, ModelGatewayCliOptionsSchema, MODEL_GATEWAY_DEFAULTS } from "./src/options.ts";
|
|
19
|
+
export type { ModelGatewayOptions, ResolvedModelGatewayOptions, ModelGatewayCliOptions } from "./src/options.ts";
|
|
16
20
|
export * from "./exports.ts";
|
package/lib/exports.d.ts
CHANGED
package/lib/exports.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { createModelGatewayClient } from "./src/client.js";
|
|
2
|
-
|
|
2
|
+
export { upstreamUrl } from "./src/upstream.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4cG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgY3JlYXRlTW9kZWxHYXRld2F5Q2xpZW50IH0gZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0IHsgdXBzdHJlYW1VcmwgfSBmcm9tIFwiLi9zcmMvdXBzdHJlYW0udHNcIjtcbiJdfQ==
|
package/lib/index.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model-gateway";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.43";
|
|
3
3
|
export * as client from "./src/client.ts";
|
|
4
4
|
export * as contracts from "./src/contracts.ts";
|
|
5
5
|
export * as models from "./src/models.ts";
|
|
6
|
+
export * as options from "./src/options.ts";
|
|
7
|
+
export * as upstream from "./src/upstream.ts";
|
|
6
8
|
export { ModelGatewayClientError } from "./src/client.ts";
|
|
7
9
|
export type { ModelGatewayClientOptions, ListModelsOptions, ModelGatewayClient } from "./src/client.ts";
|
|
8
10
|
export { ClientProtocolSchema, UpstreamProtocolSchema, ModelCapabilitiesSchema, ModelTargetSchema, RequestedFeaturesSchema, GatewayRouteSchema, ModelCapabilityOverrideSchema, ResolveRouteInputSchema } from "./src/contracts.ts";
|
|
9
11
|
export type { ClientProtocol, UpstreamProtocol, ModelCapabilities, ModelTarget, RequestedFeatures, GatewayRoute, ModelCapabilityOverride, ResolveRouteInput } from "./src/contracts.ts";
|
|
10
12
|
export { OpenAIModelCapabilitiesSchema, OpenAIModelSchema, OpenAIModelListResponseSchema, CodexReasoningLevelSchema, CodexTruncationPolicySchema, CodexModelSchema, CodexModelListResponseSchema, ModelListResponseSchema, EmbeddingRequestSchema, EmbeddingDataSchema, EmbeddingUsageSchema, EmbeddingResponseSchema, OpenAIErrorResponseSchema, AnthropicErrorResponseSchema, GatewayErrorResponseSchema } from "./src/models.ts";
|
|
11
13
|
export type { OpenAIModelCapabilities, OpenAIModel, OpenAIModelListResponse, CodexReasoningLevel, CodexTruncationPolicy, CodexModel, CodexModelListResponse, ModelListResponse, EmbeddingRequest, EmbeddingData, EmbeddingUsage, EmbeddingResponse, OpenAIErrorResponse, AnthropicErrorResponse, GatewayErrorResponse } from "./src/models.ts";
|
|
14
|
+
export { ModelGatewayOptionsSchema, ModelGatewayCliOptionsSchema, MODEL_GATEWAY_DEFAULTS } from "./src/options.ts";
|
|
15
|
+
export type { ModelGatewayOptions, ResolvedModelGatewayOptions, ModelGatewayCliOptions } from "./src/options.ts";
|
|
12
16
|
export * from "./exports.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model-gateway";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.43";
|
|
6
6
|
export * as client from "./src/client.js";
|
|
7
7
|
export * as contracts from "./src/contracts.js";
|
|
8
8
|
export * as models from "./src/models.js";
|
|
9
|
+
export * as options from "./src/options.js";
|
|
10
|
+
export * as upstream from "./src/upstream.js";
|
|
9
11
|
export { ModelGatewayClientError } from "./src/client.js";
|
|
10
12
|
export { ClientProtocolSchema, UpstreamProtocolSchema, ModelCapabilitiesSchema, ModelTargetSchema, RequestedFeaturesSchema, GatewayRouteSchema, ModelCapabilityOverrideSchema, ResolveRouteInputSchema } from "./src/contracts.js";
|
|
11
13
|
export { OpenAIModelCapabilitiesSchema, OpenAIModelSchema, OpenAIModelListResponseSchema, CodexReasoningLevelSchema, CodexTruncationPolicySchema, CodexModelSchema, CodexModelListResponseSchema, ModelListResponseSchema, EmbeddingRequestSchema, EmbeddingDataSchema, EmbeddingUsageSchema, EmbeddingResponseSchema, OpenAIErrorResponseSchema, AnthropicErrorResponseSchema, GatewayErrorResponseSchema } from "./src/models.js";
|
|
14
|
+
export { ModelGatewayOptionsSchema, ModelGatewayCliOptionsSchema, MODEL_GATEWAY_DEFAULTS } from "./src/options.js";
|
|
12
15
|
export * from "./exports.js";
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsNkJBQTZCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuTyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsaUJBQWlCLEVBQUUsNkJBQTZCLEVBQUUseUJBQXlCLEVBQUUsMkJBQTJCLEVBQUUsZ0JBQWdCLEVBQUUsNEJBQTRCLEVBQUUsdUJBQXVCLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsNEJBQTRCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwYSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsNEJBQTRCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40M1wiO1xuZXhwb3J0ICogYXMgY2xpZW50IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbnRyYWN0cyBmcm9tIFwiLi9zcmMvY29udHJhY3RzLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgb3B0aW9ucyBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogYXMgdXBzdHJlYW0gZnJvbSBcIi4vc3JjL3Vwc3RyZWFtLnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlDbGllbnRFcnJvciB9IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5Q2xpZW50T3B0aW9ucywgTGlzdE1vZGVsc09wdGlvbnMsIE1vZGVsR2F0ZXdheUNsaWVudCB9IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCB7IENsaWVudFByb3RvY29sU2NoZW1hLCBVcHN0cmVhbVByb3RvY29sU2NoZW1hLCBNb2RlbENhcGFiaWxpdGllc1NjaGVtYSwgTW9kZWxUYXJnZXRTY2hlbWEsIFJlcXVlc3RlZEZlYXR1cmVzU2NoZW1hLCBHYXRld2F5Um91dGVTY2hlbWEsIE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlU2NoZW1hLCBSZXNvbHZlUm91dGVJbnB1dFNjaGVtYSB9IGZyb20gXCIuL3NyYy9jb250cmFjdHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2xpZW50UHJvdG9jb2wsIFVwc3RyZWFtUHJvdG9jb2wsIE1vZGVsQ2FwYWJpbGl0aWVzLCBNb2RlbFRhcmdldCwgUmVxdWVzdGVkRmVhdHVyZXMsIEdhdGV3YXlSb3V0ZSwgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsIFJlc29sdmVSb3V0ZUlucHV0IH0gZnJvbSBcIi4vc3JjL2NvbnRyYWN0cy50c1wiO1xuZXhwb3J0IHsgT3BlbkFJTW9kZWxDYXBhYmlsaXRpZXNTY2hlbWEsIE9wZW5BSU1vZGVsU2NoZW1hLCBPcGVuQUlNb2RlbExpc3RSZXNwb25zZVNjaGVtYSwgQ29kZXhSZWFzb25pbmdMZXZlbFNjaGVtYSwgQ29kZXhUcnVuY2F0aW9uUG9saWN5U2NoZW1hLCBDb2RleE1vZGVsU2NoZW1hLCBDb2RleE1vZGVsTGlzdFJlc3BvbnNlU2NoZW1hLCBNb2RlbExpc3RSZXNwb25zZVNjaGVtYSwgRW1iZWRkaW5nUmVxdWVzdFNjaGVtYSwgRW1iZWRkaW5nRGF0YVNjaGVtYSwgRW1iZWRkaW5nVXNhZ2VTY2hlbWEsIEVtYmVkZGluZ1Jlc3BvbnNlU2NoZW1hLCBPcGVuQUlFcnJvclJlc3BvbnNlU2NoZW1hLCBBbnRocm9waWNFcnJvclJlc3BvbnNlU2NoZW1hLCBHYXRld2F5RXJyb3JSZXNwb25zZVNjaGVtYSB9IGZyb20gXCIuL3NyYy9tb2RlbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3BlbkFJTW9kZWxDYXBhYmlsaXRpZXMsIE9wZW5BSU1vZGVsLCBPcGVuQUlNb2RlbExpc3RSZXNwb25zZSwgQ29kZXhSZWFzb25pbmdMZXZlbCwgQ29kZXhUcnVuY2F0aW9uUG9saWN5LCBDb2RleE1vZGVsLCBDb2RleE1vZGVsTGlzdFJlc3BvbnNlLCBNb2RlbExpc3RSZXNwb25zZSwgRW1iZWRkaW5nUmVxdWVzdCwgRW1iZWRkaW5nRGF0YSwgRW1iZWRkaW5nVXNhZ2UsIEVtYmVkZGluZ1Jlc3BvbnNlLCBPcGVuQUlFcnJvclJlc3BvbnNlLCBBbnRocm9waWNFcnJvclJlc3BvbnNlLCBHYXRld2F5RXJyb3JSZXNwb25zZSB9IGZyb20gXCIuL3NyYy9tb2RlbHMudHNcIjtcbmV4cG9ydCB7IE1vZGVsR2F0ZXdheU9wdGlvbnNTY2hlbWEsIE1vZGVsR2F0ZXdheUNsaU9wdGlvbnNTY2hlbWEsIE1PREVMX0dBVEVXQVlfREVGQVVMVFMgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbEdhdGV3YXlPcHRpb25zLCBSZXNvbHZlZE1vZGVsR2F0ZXdheU9wdGlvbnMsIE1vZGVsR2F0ZXdheUNsaU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
|
package/lib/src/contracts.d.ts
CHANGED
|
@@ -4,16 +4,13 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { z } from "zod";
|
|
7
|
-
/** Client protocol accepted by the gateway. */
|
|
8
7
|
export declare const ClientProtocolSchema: z.ZodEnum<{
|
|
9
8
|
"openai-responses": "openai-responses";
|
|
10
9
|
"openai-chat": "openai-chat";
|
|
11
10
|
"anthropic-messages": "anthropic-messages";
|
|
12
11
|
"openai-embeddings": "openai-embeddings";
|
|
13
12
|
}>;
|
|
14
|
-
/** Client protocol accepted by the gateway. */
|
|
15
13
|
export type ClientProtocol = z.infer<typeof ClientProtocolSchema>;
|
|
16
|
-
/** Upstream protocol selected by capability routing. */
|
|
17
14
|
export declare const UpstreamProtocolSchema: z.ZodEnum<{
|
|
18
15
|
"databricks-ai-gateway-codex": "databricks-ai-gateway-codex";
|
|
19
16
|
"databricks-responses": "databricks-responses";
|
|
@@ -23,9 +20,7 @@ export declare const UpstreamProtocolSchema: z.ZodEnum<{
|
|
|
23
20
|
"databricks-embeddings": "databricks-embeddings";
|
|
24
21
|
"ai-sdk": "ai-sdk";
|
|
25
22
|
}>;
|
|
26
|
-
/** Upstream protocol selected by capability routing. */
|
|
27
23
|
export type UpstreamProtocol = z.infer<typeof UpstreamProtocolSchema>;
|
|
28
|
-
/** Capabilities used to determine whether a request can remain on a direct path. */
|
|
29
24
|
export declare const ModelCapabilitiesSchema: z.ZodObject<{
|
|
30
25
|
responses: z.ZodBoolean;
|
|
31
26
|
openResponses: z.ZodBoolean;
|
|
@@ -41,9 +36,7 @@ export declare const ModelCapabilitiesSchema: z.ZodObject<{
|
|
|
41
36
|
structuredOutput: z.ZodBoolean;
|
|
42
37
|
webSearch: z.ZodBoolean;
|
|
43
38
|
}, z.core.$strip>;
|
|
44
|
-
/** Capabilities used to determine whether a request can remain on a direct path. */
|
|
45
39
|
export type ModelCapabilities = z.infer<typeof ModelCapabilitiesSchema>;
|
|
46
|
-
/** One discovered model plus every alias accepted by the gateway. */
|
|
47
40
|
export declare const ModelTargetSchema: z.ZodObject<{
|
|
48
41
|
id: z.ZodString;
|
|
49
42
|
aliases: z.ZodArray<z.ZodString>;
|
|
@@ -63,10 +56,23 @@ export declare const ModelTargetSchema: z.ZodObject<{
|
|
|
63
56
|
speed: z.ZodOptional<z.ZodNumber>;
|
|
64
57
|
cost: z.ZodOptional<z.ZodNumber>;
|
|
65
58
|
}, z.core.$strip>>;
|
|
66
|
-
class: z.ZodOptional<z.
|
|
59
|
+
class: z.ZodOptional<z.ZodEnum<{
|
|
60
|
+
"chat-thinking": "chat-thinking";
|
|
61
|
+
"chat-balanced": "chat-balanced";
|
|
62
|
+
"chat-fast": "chat-fast";
|
|
63
|
+
embedding: "embedding";
|
|
64
|
+
}>>;
|
|
67
65
|
serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
68
66
|
modelServiceName: z.ZodOptional<z.ZodString>;
|
|
69
|
-
reasoningEfforts: z.ZodOptional<z.ZodArray<z.
|
|
67
|
+
reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
68
|
+
none: "none";
|
|
69
|
+
minimal: "minimal";
|
|
70
|
+
low: "low";
|
|
71
|
+
medium: "medium";
|
|
72
|
+
high: "high";
|
|
73
|
+
xhigh: "xhigh";
|
|
74
|
+
max: "max";
|
|
75
|
+
}>>>;
|
|
70
76
|
status: z.ZodOptional<z.ZodObject<{
|
|
71
77
|
deprecated: z.ZodDefault<z.ZodBoolean>;
|
|
72
78
|
}, z.core.$strip>>;
|
|
@@ -87,11 +93,17 @@ export declare const ModelTargetSchema: z.ZodObject<{
|
|
|
87
93
|
structuredOutput: z.ZodBoolean;
|
|
88
94
|
webSearch: z.ZodBoolean;
|
|
89
95
|
}, z.core.$strip>;
|
|
90
|
-
reasoningEfforts: z.ZodArray<z.
|
|
96
|
+
reasoningEfforts: z.ZodArray<z.ZodEnum<{
|
|
97
|
+
none: "none";
|
|
98
|
+
minimal: "minimal";
|
|
99
|
+
low: "low";
|
|
100
|
+
medium: "medium";
|
|
101
|
+
high: "high";
|
|
102
|
+
xhigh: "xhigh";
|
|
103
|
+
max: "max";
|
|
104
|
+
}>>;
|
|
91
105
|
}, z.core.$strip>;
|
|
92
|
-
/** One discovered model plus every alias accepted by the gateway. */
|
|
93
106
|
export type ModelTarget = z.infer<typeof ModelTargetSchema>;
|
|
94
|
-
/** Request features that constrain direct protocol routes. */
|
|
95
107
|
export declare const RequestedFeaturesSchema: z.ZodObject<{
|
|
96
108
|
background: z.ZodBoolean;
|
|
97
109
|
customTools: z.ZodBoolean;
|
|
@@ -104,9 +116,7 @@ export declare const RequestedFeaturesSchema: z.ZodObject<{
|
|
|
104
116
|
unsupportedOpenResponsesTools: z.ZodBoolean;
|
|
105
117
|
webSearch: z.ZodBoolean;
|
|
106
118
|
}, z.core.$strip>;
|
|
107
|
-
/** Request features that constrain direct protocol routes. */
|
|
108
119
|
export type RequestedFeatures = z.infer<typeof RequestedFeaturesSchema>;
|
|
109
|
-
/** Deterministic route selected for one gateway request. */
|
|
110
120
|
export declare const GatewayRouteSchema: z.ZodObject<{
|
|
111
121
|
clientProtocol: z.ZodEnum<{
|
|
112
122
|
"openai-responses": "openai-responses";
|
|
@@ -142,10 +152,23 @@ export declare const GatewayRouteSchema: z.ZodObject<{
|
|
|
142
152
|
speed: z.ZodOptional<z.ZodNumber>;
|
|
143
153
|
cost: z.ZodOptional<z.ZodNumber>;
|
|
144
154
|
}, z.core.$strip>>;
|
|
145
|
-
class: z.ZodOptional<z.
|
|
155
|
+
class: z.ZodOptional<z.ZodEnum<{
|
|
156
|
+
"chat-thinking": "chat-thinking";
|
|
157
|
+
"chat-balanced": "chat-balanced";
|
|
158
|
+
"chat-fast": "chat-fast";
|
|
159
|
+
embedding: "embedding";
|
|
160
|
+
}>>;
|
|
146
161
|
serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
147
162
|
modelServiceName: z.ZodOptional<z.ZodString>;
|
|
148
|
-
reasoningEfforts: z.ZodOptional<z.ZodArray<z.
|
|
163
|
+
reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
164
|
+
none: "none";
|
|
165
|
+
minimal: "minimal";
|
|
166
|
+
low: "low";
|
|
167
|
+
medium: "medium";
|
|
168
|
+
high: "high";
|
|
169
|
+
xhigh: "xhigh";
|
|
170
|
+
max: "max";
|
|
171
|
+
}>>>;
|
|
149
172
|
status: z.ZodOptional<z.ZodObject<{
|
|
150
173
|
deprecated: z.ZodDefault<z.ZodBoolean>;
|
|
151
174
|
}, z.core.$strip>>;
|
|
@@ -166,15 +189,21 @@ export declare const GatewayRouteSchema: z.ZodObject<{
|
|
|
166
189
|
structuredOutput: z.ZodBoolean;
|
|
167
190
|
webSearch: z.ZodBoolean;
|
|
168
191
|
}, z.core.$strip>;
|
|
169
|
-
reasoningEfforts: z.ZodArray<z.
|
|
192
|
+
reasoningEfforts: z.ZodArray<z.ZodEnum<{
|
|
193
|
+
none: "none";
|
|
194
|
+
minimal: "minimal";
|
|
195
|
+
low: "low";
|
|
196
|
+
medium: "medium";
|
|
197
|
+
high: "high";
|
|
198
|
+
xhigh: "xhigh";
|
|
199
|
+
max: "max";
|
|
200
|
+
}>>;
|
|
170
201
|
}, z.core.$strip>;
|
|
171
202
|
upstreamModel: z.ZodString;
|
|
172
203
|
translateRequest: z.ZodBoolean;
|
|
173
204
|
translateResponse: z.ZodBoolean;
|
|
174
205
|
}, z.core.$strip>;
|
|
175
|
-
/** Deterministic route selected for one gateway request. */
|
|
176
206
|
export type GatewayRoute = z.infer<typeof GatewayRouteSchema>;
|
|
177
|
-
/** Typed capability changes for one dynamically discovered model. */
|
|
178
207
|
export declare const ModelCapabilityOverrideSchema: z.ZodObject<{
|
|
179
208
|
model: z.ZodString;
|
|
180
209
|
capabilities: z.ZodObject<{
|
|
@@ -193,9 +222,7 @@ export declare const ModelCapabilityOverrideSchema: z.ZodObject<{
|
|
|
193
222
|
webSearch: z.ZodOptional<z.ZodBoolean>;
|
|
194
223
|
}, z.core.$strip>;
|
|
195
224
|
}, z.core.$strip>;
|
|
196
|
-
/** Typed capability changes for one dynamically discovered model. */
|
|
197
225
|
export type ModelCapabilityOverride = z.infer<typeof ModelCapabilityOverrideSchema>;
|
|
198
|
-
/** Inputs required to select one deterministic gateway route. */
|
|
199
226
|
export declare const ResolveRouteInputSchema: z.ZodObject<{
|
|
200
227
|
clientProtocol: z.ZodEnum<{
|
|
201
228
|
"openai-responses": "openai-responses";
|
|
@@ -236,10 +263,23 @@ export declare const ResolveRouteInputSchema: z.ZodObject<{
|
|
|
236
263
|
speed: z.ZodOptional<z.ZodNumber>;
|
|
237
264
|
cost: z.ZodOptional<z.ZodNumber>;
|
|
238
265
|
}, z.core.$strip>>;
|
|
239
|
-
class: z.ZodOptional<z.
|
|
266
|
+
class: z.ZodOptional<z.ZodEnum<{
|
|
267
|
+
"chat-thinking": "chat-thinking";
|
|
268
|
+
"chat-balanced": "chat-balanced";
|
|
269
|
+
"chat-fast": "chat-fast";
|
|
270
|
+
embedding: "embedding";
|
|
271
|
+
}>>;
|
|
240
272
|
serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
241
273
|
modelServiceName: z.ZodOptional<z.ZodString>;
|
|
242
|
-
reasoningEfforts: z.ZodOptional<z.ZodArray<z.
|
|
274
|
+
reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
275
|
+
none: "none";
|
|
276
|
+
minimal: "minimal";
|
|
277
|
+
low: "low";
|
|
278
|
+
medium: "medium";
|
|
279
|
+
high: "high";
|
|
280
|
+
xhigh: "xhigh";
|
|
281
|
+
max: "max";
|
|
282
|
+
}>>>;
|
|
243
283
|
status: z.ZodOptional<z.ZodObject<{
|
|
244
284
|
deprecated: z.ZodDefault<z.ZodBoolean>;
|
|
245
285
|
}, z.core.$strip>>;
|
|
@@ -260,8 +300,15 @@ export declare const ResolveRouteInputSchema: z.ZodObject<{
|
|
|
260
300
|
structuredOutput: z.ZodBoolean;
|
|
261
301
|
webSearch: z.ZodBoolean;
|
|
262
302
|
}, z.core.$strip>;
|
|
263
|
-
reasoningEfforts: z.ZodArray<z.
|
|
303
|
+
reasoningEfforts: z.ZodArray<z.ZodEnum<{
|
|
304
|
+
none: "none";
|
|
305
|
+
minimal: "minimal";
|
|
306
|
+
low: "low";
|
|
307
|
+
medium: "medium";
|
|
308
|
+
high: "high";
|
|
309
|
+
xhigh: "xhigh";
|
|
310
|
+
max: "max";
|
|
311
|
+
}>>;
|
|
264
312
|
}, z.core.$strip>;
|
|
265
313
|
}, z.core.$strip>;
|
|
266
|
-
/** Inputs required to select one deterministic gateway route. */
|
|
267
314
|
export type ResolveRouteInput = z.infer<typeof ResolveRouteInputSchema>;
|
package/lib/src/contracts.js
CHANGED
|
@@ -5,15 +5,11 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { model } from "@dbx-tools/shared-model";
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"openai-embeddings",
|
|
14
|
-
]);
|
|
15
|
-
/** Upstream protocol selected by capability routing. */
|
|
16
|
-
export const UpstreamProtocolSchema = z.enum([
|
|
8
|
+
export const ClientProtocolSchema = z
|
|
9
|
+
.enum(["openai-responses", "openai-chat", "anthropic-messages", "openai-embeddings"])
|
|
10
|
+
.describe("Client protocol accepted by the gateway.");
|
|
11
|
+
export const UpstreamProtocolSchema = z
|
|
12
|
+
.enum([
|
|
17
13
|
"databricks-ai-gateway-codex",
|
|
18
14
|
"databricks-responses",
|
|
19
15
|
"databricks-open-responses",
|
|
@@ -21,67 +17,85 @@ export const UpstreamProtocolSchema = z.enum([
|
|
|
21
17
|
"databricks-anthropic",
|
|
22
18
|
"databricks-embeddings",
|
|
23
19
|
"ai-sdk",
|
|
24
|
-
])
|
|
25
|
-
|
|
26
|
-
export const ModelCapabilitiesSchema = z
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
export const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
20
|
+
])
|
|
21
|
+
.describe("Upstream protocol selected by capability routing.");
|
|
22
|
+
export const ModelCapabilitiesSchema = z
|
|
23
|
+
.object({
|
|
24
|
+
responses: z.boolean().describe("True when the model can serve the Databricks Responses API."),
|
|
25
|
+
openResponses: z.boolean().describe("True when the model can serve OpenAI Responses."),
|
|
26
|
+
chat: z.boolean().describe("True when the model can serve Chat Completions."),
|
|
27
|
+
anthropic: z.boolean().describe("True when the model can serve Anthropic Messages."),
|
|
28
|
+
embeddings: z.boolean().describe("True when the model can serve embeddings."),
|
|
29
|
+
aiGatewayCodex: z
|
|
30
|
+
.boolean()
|
|
31
|
+
.describe("True when the model is reachable through AI Gateway Codex."),
|
|
32
|
+
tools: z.boolean().describe("True when the model accepts tools."),
|
|
33
|
+
reasoning: z.boolean().describe("True when the model accepts reasoning effort."),
|
|
34
|
+
streaming: z.boolean().describe("True when the model can stream tokens."),
|
|
35
|
+
parallelTools: z.boolean().describe("True when the model can run multiple tools in one turn."),
|
|
36
|
+
customTools: z.boolean().describe("True when the model accepts custom tool definitions."),
|
|
37
|
+
structuredOutput: z.boolean().describe("True when the model can return structured output."),
|
|
38
|
+
webSearch: z.boolean().describe("True when the model can use web search."),
|
|
39
|
+
})
|
|
40
|
+
.describe("Capabilities used to determine whether a request can remain on a direct path.");
|
|
41
|
+
export const ModelTargetSchema = z
|
|
42
|
+
.object({
|
|
43
|
+
id: z.string().min(1).describe("Canonical model id advertised by the gateway."),
|
|
44
|
+
aliases: z.array(z.string().min(1)).describe("Additional names that resolve to this model."),
|
|
45
|
+
displayName: z.string().min(1).describe("Human-readable label shown to clients."),
|
|
46
|
+
family: z.string().optional().describe("Detected model family used for grouping."),
|
|
47
|
+
modelServiceName: z
|
|
48
|
+
.string()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Canonical model-service name for metadata lookup."),
|
|
51
|
+
endpoint: model.ServingEndpointSummarySchema.optional().describe("Normalized serving endpoint backing this target, when discovered."),
|
|
52
|
+
capabilities: ModelCapabilitiesSchema.describe("Protocol and feature capabilities for this target."),
|
|
53
|
+
reasoningEfforts: z
|
|
54
|
+
.array(model.ReasoningEffortSchema)
|
|
55
|
+
.describe("Reasoning effort values this target accepts."),
|
|
56
|
+
})
|
|
57
|
+
.describe("One discovered model plus every alias accepted by the gateway.");
|
|
58
|
+
export const RequestedFeaturesSchema = z
|
|
59
|
+
.object({
|
|
60
|
+
background: z.boolean().describe("True when the client requested a background run."),
|
|
61
|
+
customTools: z.boolean().describe("True when the request includes custom tools."),
|
|
62
|
+
parallelTools: z.boolean().describe("True when the request asks for parallel tool calls."),
|
|
63
|
+
previousResponse: z.boolean().describe("True when the request continues a stored response."),
|
|
64
|
+
reasoning: z.boolean().describe("True when the request sets reasoning effort."),
|
|
65
|
+
storage: z
|
|
66
|
+
.boolean()
|
|
67
|
+
.describe("True when the request asks the provider to persist the response."),
|
|
68
|
+
structuredOutput: z.boolean().describe("True when the request requires structured output."),
|
|
69
|
+
tools: z.boolean().describe("True when the request includes tools."),
|
|
70
|
+
unsupportedOpenResponsesTools: z
|
|
71
|
+
.boolean()
|
|
72
|
+
.describe("True when tools cannot ride the Open Responses fast path."),
|
|
73
|
+
webSearch: z.boolean().describe("True when the request includes web search."),
|
|
74
|
+
})
|
|
75
|
+
.describe("Request features that constrain direct protocol routes.");
|
|
76
|
+
export const GatewayRouteSchema = z
|
|
77
|
+
.object({
|
|
78
|
+
clientProtocol: ClientProtocolSchema.describe("Protocol the caller used."),
|
|
79
|
+
upstreamProtocol: UpstreamProtocolSchema.describe("Protocol selected for the upstream call."),
|
|
80
|
+
target: ModelTargetSchema.describe("Discovered model this request will invoke."),
|
|
81
|
+
upstreamModel: z.string().min(1).describe("Model identifier sent to the upstream provider."),
|
|
82
|
+
translateRequest: z.boolean().describe("True when the request body must be translated."),
|
|
83
|
+
translateResponse: z.boolean().describe("True when the response body must be translated."),
|
|
84
|
+
})
|
|
85
|
+
.describe("Deterministic route selected for one gateway request.");
|
|
86
|
+
export const ModelCapabilityOverrideSchema = z
|
|
87
|
+
.object({
|
|
88
|
+
model: z.string().min(1).describe("Model id or alias whose capabilities are overridden."),
|
|
89
|
+
capabilities: ModelCapabilitiesSchema.partial().describe("Capability flags to merge onto the discovered model."),
|
|
90
|
+
})
|
|
91
|
+
.describe("Typed capability changes for one dynamically discovered model.");
|
|
92
|
+
export const ResolveRouteInputSchema = z
|
|
93
|
+
.object({
|
|
94
|
+
clientProtocol: ClientProtocolSchema.describe("Protocol the caller used."),
|
|
95
|
+
requestedModel: z.string().min(1).describe("Model id or alias requested by the caller."),
|
|
96
|
+
originator: z.string().optional().describe("Optional Originator header, such as codex."),
|
|
97
|
+
features: RequestedFeaturesSchema.describe("Request features that constrain routing."),
|
|
98
|
+
target: ModelTargetSchema.describe("Discovered model selected for this request."),
|
|
99
|
+
})
|
|
100
|
+
.describe("Inputs required to select one deterministic gateway route.");
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyYWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQztLQUNsQyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztLQUNwRixRQUFRLENBQUMsMENBQTBDLENBQUMsQ0FBQztBQUl4RCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDO0tBQ3BDLElBQUksQ0FBQztJQUNKLDZCQUE2QjtJQUM3QixzQkFBc0I7SUFDdEIsMkJBQTJCO0lBQzNCLGlCQUFpQjtJQUNqQixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLFFBQVE7Q0FDVCxDQUFDO0tBQ0QsUUFBUSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7QUFJakUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQztLQUNyQyxNQUFNLENBQUM7SUFDTixTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyw2REFBNkQsQ0FBQztJQUM5RixhQUFhLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpREFBaUQsQ0FBQztJQUN0RixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpREFBaUQsQ0FBQztJQUM3RSxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxtREFBbUQsQ0FBQztJQUNwRixVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FB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QUN0RCxzREFBc0QsQ0FDdkQ7Q0FDRixDQUFDO0tBQ0QsUUFBUSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7QUFJOUUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQztLQUNyQyxNQUFNLENBQUM7SUFDTixjQUFjLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDO0lBQzFFLGNBQWMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQztJQUN4RixVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQztJQUN4RixRQUFRLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxDQUFDLDBDQUEwQyxDQUFDO0lBQ3RGLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsNkNBQTZDLENBQUM7Q0FDbEYsQ0FBQztLQUNELFFBQVEsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgbW9kZWwtZ2F0ZXdheSByb3V0aW5nIGNvbnRyYWN0cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBDbGllbnRQcm90b2NvbFNjaGVtYSA9IHpcbiAgLmVudW0oW1wib3BlbmFpLXJlc3BvbnNlc1wiLCBcIm9wZW5haS1jaGF0XCIsIFwiYW50aHJvcGljLW1lc3NhZ2VzXCIsIFwib3BlbmFpLWVtYmVkZGluZ3NcIl0pXG4gIC5kZXNjcmliZShcIkNsaWVudCBwcm90b2NvbCBhY2NlcHRlZCBieSB0aGUgZ2F0ZXdheS5cIik7XG5cbmV4cG9ydCB0eXBlIENsaWVudFByb3RvY29sID0gei5pbmZlcjx0eXBlb2YgQ2xpZW50UHJvdG9jb2xTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgVXBzdHJlYW1Qcm90b2NvbFNjaGVtYSA9IHpcbiAgLmVudW0oW1xuICAgIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCIsXG4gICAgXCJkYXRhYnJpY2tzLXJlc3BvbnNlc1wiLFxuICAgIFwiZGF0YWJyaWNrcy1vcGVuLXJlc3BvbnNlc1wiLFxuICAgIFwiZGF0YWJyaWNrcy1jaGF0XCIsXG4gICAgXCJkYXRhYnJpY2tzLWFudGhyb3BpY1wiLFxuICAgIFwiZGF0YWJyaWNrcy1lbWJlZGRpbmdzXCIsXG4gICAgXCJhaS1zZGtcIixcbiAgXSlcbiAgLmRlc2NyaWJlKFwiVXBzdHJlYW0gcHJvdG9jb2wgc2VsZWN0ZWQgYnkgY2FwYWJpbGl0eSByb3V0aW5nLlwiKTtcblxuZXhwb3J0IHR5cGUgVXBzdHJlYW1Qcm90b2NvbCA9IHouaW5mZXI8dHlwZW9mIFVwc3RyZWFtUHJvdG9jb2xTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgTW9kZWxDYXBhYmlsaXRpZXNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHJlc3BvbnNlczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIG1vZGVsIGNhbiBzZXJ2ZSB0aGUgRGF0YWJyaWNrcyBSZXNwb25zZXMgQVBJLlwiKSxcbiAgICBvcGVuUmVzcG9uc2VzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgbW9kZWwgY2FuIHNlcnZlIE9wZW5BSSBSZXNwb25zZXMuXCIpLFxuICAgIGNoYXQ6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIHRoZSBtb2RlbCBjYW4gc2VydmUgQ2hhdCBDb21wbGV0aW9ucy5cIiksXG4gICAgYW50aHJvcGljOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgbW9kZWwgY2FuIHNlcnZlIEFudGhyb3BpYyBNZXNzYWdlcy5cIiksXG4gICAgZW1iZWRkaW5nczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIG1vZGVsIGNhbiBzZXJ2ZSBlbWJlZGRpbmdzLlwiKSxcbiAgICBhaUdhdGV3YXlDb2RleDogelxuICAgICAgLmJvb2xlYW4oKVxuICAgICAgLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIHRoZSBtb2RlbCBpcyByZWFjaGFibGUgdGhyb3VnaCBBSSBHYXRld2F5IENvZGV4LlwiKSxcbiAgICB0b29sczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIG1vZGVsIGFjY2VwdHMgdG9vbHMuXCIpLFxuICAgIHJlYXNvbmluZzogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIG1vZGVsIGFjY2VwdHMgcmVhc29uaW5nIGVmZm9ydC5cIiksXG4gICAgc3RyZWFtaW5nOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgbW9kZWwgY2FuIHN0cmVhbSB0b2tlbnMuXCIpLFxuICAgIHBhcmFsbGVsVG9vbHM6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIHRoZSBtb2RlbCBjYW4gcnVuIG11bHRpcGxlIHRvb2xzIGluIG9uZSB0dXJuLlwiKSxcbiAgICBjdXN0b21Ub29sczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIG1vZGVsIGFjY2VwdHMgY3VzdG9tIHRvb2wgZGVmaW5pdGlvbnMuXCIpLFxuICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIHRoZSBtb2RlbCBjYW4gcmV0dXJuIHN0cnVjdHVyZWQgb3V0cHV0LlwiKSxcbiAgICB3ZWJTZWFyY2g6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIHRoZSBtb2RlbCBjYW4gdXNlIHdlYiBzZWFyY2guXCIpLFxuICB9KVxuICAuZGVzY3JpYmUoXCJDYXBhYmlsaXRpZXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlcXVlc3QgY2FuIHJlbWFpbiBvbiBhIGRpcmVjdCBwYXRoLlwiKTtcblxuZXhwb3J0IHR5cGUgTW9kZWxDYXBhYmlsaXRpZXMgPSB6LmluZmVyPHR5cGVvZiBNb2RlbENhcGFiaWxpdGllc1NjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBNb2RlbFRhcmdldFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgaWQ6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiQ2Fub25pY2FsIG1vZGVsIGlkIGFkdmVydGlzZWQgYnkgdGhlIGdhdGV3YXkuXCIpLFxuICAgIGFsaWFzZXM6IHouYXJyYXkoei5zdHJpbmcoKS5taW4oMSkpLmRlc2NyaWJlKFwiQWRkaXRpb25hbCBuYW1lcyB0aGF0IHJlc29sdmUgdG8gdGhpcyBtb2RlbC5cIiksXG4gICAgZGlzcGxheU5hbWU6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiSHVtYW4tcmVhZGFibGUgbGFiZWwgc2hvd24gdG8gY2xpZW50cy5cIiksXG4gICAgZmFtaWx5OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJEZXRlY3RlZCBtb2RlbCBmYW1pbHkgdXNlZCBmb3IgZ3JvdXBpbmcuXCIpLFxuICAgIG1vZGVsU2VydmljZU5hbWU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkNhbm9uaWNhbCBtb2RlbC1zZXJ2aWNlIG5hbWUgZm9yIG1ldGFkYXRhIGxvb2t1cC5cIiksXG4gICAgZW5kcG9pbnQ6IG1vZGVsLlNlcnZpbmdFbmRwb2ludFN1bW1hcnlTY2hlbWEub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICAgIFwiTm9ybWFsaXplZCBzZXJ2aW5nIGVuZHBvaW50IGJhY2tpbmcgdGhpcyB0YXJnZXQsIHdoZW4gZGlzY292ZXJlZC5cIixcbiAgICApLFxuICAgIGNhcGFiaWxpdGllczogTW9kZWxDYXBhYmlsaXRpZXNTY2hlbWEuZGVzY3JpYmUoXG4gICAgICBcIlByb3RvY29sIGFuZCBmZWF0dXJlIGNhcGFiaWxpdGllcyBmb3IgdGhpcyB0YXJnZXQuXCIsXG4gICAgKSxcbiAgICByZWFzb25pbmdFZmZvcnRzOiB6XG4gICAgICAuYXJyYXkobW9kZWwuUmVhc29uaW5nRWZmb3J0U2NoZW1hKVxuICAgICAgLmRlc2NyaWJlKFwiUmVhc29uaW5nIGVmZm9ydCB2YWx1ZXMgdGhpcyB0YXJnZXQgYWNjZXB0cy5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIk9uZSBkaXNjb3ZlcmVkIG1vZGVsIHBsdXMgZXZlcnkgYWxpYXMgYWNjZXB0ZWQgYnkgdGhlIGdhdGV3YXkuXCIpO1xuXG5leHBvcnQgdHlwZSBNb2RlbFRhcmdldCA9IHouaW5mZXI8dHlwZW9mIE1vZGVsVGFyZ2V0U2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IFJlcXVlc3RlZEZlYXR1cmVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBiYWNrZ3JvdW5kOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgY2xpZW50IHJlcXVlc3RlZCBhIGJhY2tncm91bmQgcnVuLlwiKSxcbiAgICBjdXN0b21Ub29sczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIHJlcXVlc3QgaW5jbHVkZXMgY3VzdG9tIHRvb2xzLlwiKSxcbiAgICBwYXJhbGxlbFRvb2xzOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgcmVxdWVzdCBhc2tzIGZvciBwYXJhbGxlbCB0b29sIGNhbGxzLlwiKSxcbiAgICBwcmV2aW91c1Jlc3BvbnNlOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgcmVxdWVzdCBjb250aW51ZXMgYSBzdG9yZWQgcmVzcG9uc2UuXCIpLFxuICAgIHJlYXNvbmluZzogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIHJlcXVlc3Qgc2V0cyByZWFzb25pbmcgZWZmb3J0LlwiKSxcbiAgICBzdG9yYWdlOiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIHJlcXVlc3QgYXNrcyB0aGUgcHJvdmlkZXIgdG8gcGVyc2lzdCB0aGUgcmVzcG9uc2UuXCIpLFxuICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIHRoZSByZXF1ZXN0IHJlcXVpcmVzIHN0cnVjdHVyZWQgb3V0cHV0LlwiKSxcbiAgICB0b29sczogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIHJlcXVlc3QgaW5jbHVkZXMgdG9vbHMuXCIpLFxuICAgIHVuc3VwcG9ydGVkT3BlblJlc3BvbnNlc1Rvb2xzOiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdG9vbHMgY2Fubm90IHJpZGUgdGhlIE9wZW4gUmVzcG9uc2VzIGZhc3QgcGF0aC5cIiksXG4gICAgd2ViU2VhcmNoOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgcmVxdWVzdCBpbmNsdWRlcyB3ZWIgc2VhcmNoLlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiUmVxdWVzdCBmZWF0dXJlcyB0aGF0IGNvbnN0cmFpbiBkaXJlY3QgcHJvdG9jb2wgcm91dGVzLlwiKTtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdGVkRmVhdHVyZXMgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0ZWRGZWF0dXJlc1NjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBHYXRld2F5Um91dGVTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGNsaWVudFByb3RvY29sOiBDbGllbnRQcm90b2NvbFNjaGVtYS5kZXNjcmliZShcIlByb3RvY29sIHRoZSBjYWxsZXIgdXNlZC5cIiksXG4gICAgdXBzdHJlYW1Qcm90b2NvbDogVXBzdHJlYW1Qcm90b2NvbFNjaGVtYS5kZXNjcmliZShcIlByb3RvY29sIHNlbGVjdGVkIGZvciB0aGUgdXBzdHJlYW0gY2FsbC5cIiksXG4gICAgdGFyZ2V0OiBNb2RlbFRhcmdldFNjaGVtYS5kZXNjcmliZShcIkRpc2NvdmVyZWQgbW9kZWwgdGhpcyByZXF1ZXN0IHdpbGwgaW52b2tlLlwiKSxcbiAgICB1cHN0cmVhbU1vZGVsOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZShcIk1vZGVsIGlkZW50aWZpZXIgc2VudCB0byB0aGUgdXBzdHJlYW0gcHJvdmlkZXIuXCIpLFxuICAgIHRyYW5zbGF0ZVJlcXVlc3Q6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIHRoZSByZXF1ZXN0IGJvZHkgbXVzdCBiZSB0cmFuc2xhdGVkLlwiKSxcbiAgICB0cmFuc2xhdGVSZXNwb25zZTogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIHJlc3BvbnNlIGJvZHkgbXVzdCBiZSB0cmFuc2xhdGVkLlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiRGV0ZXJtaW5pc3RpYyByb3V0ZSBzZWxlY3RlZCBmb3Igb25lIGdhdGV3YXkgcmVxdWVzdC5cIik7XG5cbmV4cG9ydCB0eXBlIEdhdGV3YXlSb3V0ZSA9IHouaW5mZXI8dHlwZW9mIEdhdGV3YXlSb3V0ZVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbW9kZWw6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiTW9kZWwgaWQgb3IgYWxpYXMgd2hvc2UgY2FwYWJpbGl0aWVzIGFyZSBvdmVycmlkZGVuLlwiKSxcbiAgICBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0aWVzU2NoZW1hLnBhcnRpYWwoKS5kZXNjcmliZShcbiAgICAgIFwiQ2FwYWJpbGl0eSBmbGFncyB0byBtZXJnZSBvbnRvIHRoZSBkaXNjb3ZlcmVkIG1vZGVsLlwiLFxuICAgICksXG4gIH0pXG4gIC5kZXNjcmliZShcIlR5cGVkIGNhcGFiaWxpdHkgY2hhbmdlcyBmb3Igb25lIGR5bmFtaWNhbGx5IGRpc2NvdmVyZWQgbW9kZWwuXCIpO1xuXG5leHBvcnQgdHlwZSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZSA9IHouaW5mZXI8dHlwZW9mIE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlU2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IFJlc29sdmVSb3V0ZUlucHV0U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBjbGllbnRQcm90b2NvbDogQ2xpZW50UHJvdG9jb2xTY2hlbWEuZGVzY3JpYmUoXCJQcm90b2NvbCB0aGUgY2FsbGVyIHVzZWQuXCIpLFxuICAgIHJlcXVlc3RlZE1vZGVsOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZShcIk1vZGVsIGlkIG9yIGFsaWFzIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLlwiKSxcbiAgICBvcmlnaW5hdG9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJPcHRpb25hbCBPcmlnaW5hdG9yIGhlYWRlciwgc3VjaCBhcyBjb2RleC5cIiksXG4gICAgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzU2NoZW1hLmRlc2NyaWJlKFwiUmVxdWVzdCBmZWF0dXJlcyB0aGF0IGNvbnN0cmFpbiByb3V0aW5nLlwiKSxcbiAgICB0YXJnZXQ6IE1vZGVsVGFyZ2V0U2NoZW1hLmRlc2NyaWJlKFwiRGlzY292ZXJlZCBtb2RlbCBzZWxlY3RlZCBmb3IgdGhpcyByZXF1ZXN0LlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiSW5wdXRzIHJlcXVpcmVkIHRvIHNlbGVjdCBvbmUgZGV0ZXJtaW5pc3RpYyBnYXRld2F5IHJvdXRlLlwiKTtcblxuZXhwb3J0IHR5cGUgUmVzb2x2ZVJvdXRlSW5wdXQgPSB6LmluZmVyPHR5cGVvZiBSZXNvbHZlUm91dGVJbnB1dFNjaGVtYT47XG4iXX0=
|