@dbx-tools/appkit-model-gateway 0.9.99 → 0.9.105
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 +1 -1
- package/index.ts +1 -5
- package/lib/index.d.ts +1 -5
- package/lib/index.js +2 -4
- package/lib/src/translation.js +17 -69
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -10
- package/src/translation.ts +20 -70
- package/lib/src/protocols/decode.d.ts +0 -17
- package/lib/src/protocols/decode.js +0 -260
- package/lib/src/protocols/encode.d.ts +0 -18
- package/lib/src/protocols/encode.js +0 -498
- package/src/protocols/decode.ts +0 -278
- package/src/protocols/encode.ts +0 -515
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ await createApp({
|
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
AppKit mounts the plugin routes under `/api/model-gateway/v1/*`. The
|
|
20
|
-
`@dbx-tools/cli/model-gateway`
|
|
20
|
+
`@dbx-tools/cli/model-gateway` provides foreground server construction and
|
|
21
21
|
standard root compatibility paths.
|
|
22
22
|
|
|
23
23
|
## Connect A Client
|
package/index.ts
CHANGED
|
@@ -3,12 +3,10 @@
|
|
|
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/appkit-model-gateway";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.105";
|
|
7
7
|
export * as gateway from "./src/gateway.ts";
|
|
8
8
|
export * as models from "./src/models.ts";
|
|
9
9
|
export * as plugin from "./src/plugin.ts";
|
|
10
|
-
export * as protocolsDecode from "./src/protocols/decode.ts";
|
|
11
|
-
export * as protocolsEncode from "./src/protocols/encode.ts";
|
|
12
10
|
export * as reasoningAdapt from "./src/reasoning-adapt.ts";
|
|
13
11
|
export * as registry from "./src/registry.ts";
|
|
14
12
|
export * as router from "./src/router.ts";
|
|
@@ -19,8 +17,6 @@ export { ModelGatewayError, ModelGateway } from "./src/gateway.ts";
|
|
|
19
17
|
export type { ModelGatewayOptions } from "./src/gateway.ts";
|
|
20
18
|
export { ModelGatewayPlugin, modelGateway } from "./src/plugin.ts";
|
|
21
19
|
export type { ModelGatewayPluginConfig } from "./src/plugin.ts";
|
|
22
|
-
export type { DecodedGatewayRequest } from "./src/protocols/decode.ts";
|
|
23
|
-
export type { CompletedGeneration } from "./src/protocols/encode.ts";
|
|
24
20
|
export type { AdaptedInferenceBody } from "./src/reasoning-adapt.ts";
|
|
25
21
|
export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
26
22
|
export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.105";
|
|
3
3
|
export * as gateway from "./src/gateway.ts";
|
|
4
4
|
export * as models from "./src/models.ts";
|
|
5
5
|
export * as plugin from "./src/plugin.ts";
|
|
6
|
-
export * as protocolsDecode from "./src/protocols/decode.ts";
|
|
7
|
-
export * as protocolsEncode from "./src/protocols/encode.ts";
|
|
8
6
|
export * as reasoningAdapt from "./src/reasoning-adapt.ts";
|
|
9
7
|
export * as registry from "./src/registry.ts";
|
|
10
8
|
export * as router from "./src/router.ts";
|
|
@@ -15,8 +13,6 @@ export { ModelGatewayError, ModelGateway } from "./src/gateway.ts";
|
|
|
15
13
|
export type { ModelGatewayOptions } from "./src/gateway.ts";
|
|
16
14
|
export { ModelGatewayPlugin, modelGateway } from "./src/plugin.ts";
|
|
17
15
|
export type { ModelGatewayPluginConfig } from "./src/plugin.ts";
|
|
18
|
-
export type { DecodedGatewayRequest } from "./src/protocols/decode.ts";
|
|
19
|
-
export type { CompletedGeneration } from "./src/protocols/encode.ts";
|
|
20
16
|
export type { AdaptedInferenceBody } from "./src/reasoning-adapt.ts";
|
|
21
17
|
export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
22
18
|
export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,12 +2,10 @@
|
|
|
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/appkit-model-gateway";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.105";
|
|
6
6
|
export * as gateway from "./src/gateway.js";
|
|
7
7
|
export * as models from "./src/models.js";
|
|
8
8
|
export * as plugin from "./src/plugin.js";
|
|
9
|
-
export * as protocolsDecode from "./src/protocols/decode.js";
|
|
10
|
-
export * as protocolsEncode from "./src/protocols/encode.js";
|
|
11
9
|
export * as reasoningAdapt from "./src/reasoning-adapt.js";
|
|
12
10
|
export * as registry from "./src/registry.js";
|
|
13
11
|
export * as router from "./src/router.js";
|
|
@@ -18,4 +16,4 @@ export { ModelGatewayError, ModelGateway } from "./src/gateway.js";
|
|
|
18
16
|
export { ModelGatewayPlugin, modelGateway } from "./src/plugin.js";
|
|
19
17
|
export { DatabricksModelRegistry } from "./src/registry.js";
|
|
20
18
|
export { UnsupportedGatewayFeatureError } from "./src/router.js";
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tb2RlbC1nYXRld2F5XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTA1XCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ0FkYXB0IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCAqIGFzIHJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVyIGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zcG9ydCBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlFcnJvciwgTW9kZWxHYXRld2F5IH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZGFwdGVkSW5mZXJlbmNlQm9keSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucywgTW9kZWxSZWdpc3RyeSwgTW9kZWxSZWdpc3RyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB7IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciB9IGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG4iXX0=
|
package/lib/src/translation.js
CHANGED
|
@@ -3,15 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
7
|
-
import { createOpenResponses } from "@ai-sdk/open-responses";
|
|
8
|
-
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
9
6
|
import { getExecutionContext } from "@databricks/appkit";
|
|
10
|
-
import { invoke
|
|
7
|
+
import { invoke } from "@dbx-tools/model";
|
|
8
|
+
import { decodeGatewayRequest } from "@dbx-tools/model-protocol/gateway-decode";
|
|
9
|
+
import { encodeGatewayResponse, encodeGatewayStream, } from "@dbx-tools/model-protocol/gateway-encode";
|
|
10
|
+
import { createDatabricksLanguageModel, } from "@dbx-tools/model-protocol/provider";
|
|
11
11
|
import { log } from "@dbx-tools/shared-core";
|
|
12
12
|
import { streamText } from "ai";
|
|
13
|
-
import { decodeGatewayRequest } from "./protocols/decode.js";
|
|
14
|
-
import { encodeGatewayResponse, encodeGatewayStream } from "./protocols/encode.js";
|
|
15
13
|
const logger = log.logger("appkit/model-gateway/translation");
|
|
16
14
|
/** Translate one request through a provider-owned AI SDK model. */
|
|
17
15
|
export async function translateGatewayRequest(route, body, signal) {
|
|
@@ -87,70 +85,20 @@ async function translationModel(route) {
|
|
|
87
85
|
const client = getExecutionContext().client;
|
|
88
86
|
const host = (await client.config.getHost()).toString();
|
|
89
87
|
const headers = await invoke.authHeaders(client);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
})(route.target.id);
|
|
97
|
-
}
|
|
98
|
-
if (route.target.capabilities.anthropic) {
|
|
99
|
-
logger.debug("selected Anthropic provider", { model: route.target.id });
|
|
100
|
-
return createAnthropic({
|
|
101
|
-
name: "databricks-anthropic",
|
|
102
|
-
baseURL: new URL("serving-endpoints/anthropic/v1", host).toString(),
|
|
103
|
-
authToken: bearerToken(headers),
|
|
104
|
-
headers,
|
|
105
|
-
})(route.target.id);
|
|
106
|
-
}
|
|
107
|
-
logger.debug("selected Chat provider", { model: route.target.id });
|
|
108
|
-
return createOpenAICompatible({
|
|
109
|
-
name: "databricks-chat",
|
|
110
|
-
baseURL: new URL("serving-endpoints", host).toString(),
|
|
111
|
-
headers,
|
|
112
|
-
supportsStructuredOutputs: true,
|
|
113
|
-
fetch: compatibleFetch,
|
|
114
|
-
}).chatModel(route.target.id);
|
|
115
|
-
}
|
|
116
|
-
async function compatibleFetch(input, init) {
|
|
117
|
-
const rewritten = await servingWire.rewriteServingRequest(input, init);
|
|
118
|
-
logger.debug("sending translated Chat request", {
|
|
119
|
-
rewritten: rewritten.input !== input || rewritten.init !== init,
|
|
120
|
-
});
|
|
121
|
-
const response = await fetch(rewritten.input, rewritten.init);
|
|
122
|
-
const responseDetails = {
|
|
123
|
-
contentType: response.headers.get("content-type"),
|
|
124
|
-
status: response.status,
|
|
125
|
-
};
|
|
126
|
-
if (response.ok)
|
|
127
|
-
logger.debug("received translated Chat response", responseDetails);
|
|
128
|
-
else
|
|
129
|
-
logger.warn("translated Chat request failed", responseDetails);
|
|
130
|
-
if (!response.body)
|
|
131
|
-
return response;
|
|
132
|
-
const headers = new Headers(response.headers);
|
|
133
|
-
if (headers.get("content-type")?.includes("text/event-stream")) {
|
|
134
|
-
return new Response(servingWire.rewriteServingResponseStream(response.body), {
|
|
135
|
-
status: response.status,
|
|
136
|
-
statusText: response.statusText,
|
|
137
|
-
headers,
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
const body = servingWire.rewriteServingResponseBody(await response.text());
|
|
141
|
-
headers.delete("content-length");
|
|
142
|
-
return new Response(body, {
|
|
143
|
-
status: response.status,
|
|
144
|
-
statusText: response.statusText,
|
|
88
|
+
const protocol = translationProtocol(route);
|
|
89
|
+
logger.debug("selected translation provider", { model: route.target.id, protocol });
|
|
90
|
+
return createDatabricksLanguageModel({
|
|
91
|
+
modelId: route.target.id,
|
|
92
|
+
protocol,
|
|
93
|
+
host,
|
|
145
94
|
headers,
|
|
146
95
|
});
|
|
147
96
|
}
|
|
148
|
-
function
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return token;
|
|
97
|
+
function translationProtocol(route) {
|
|
98
|
+
if (route.target.capabilities.responses)
|
|
99
|
+
return "responses";
|
|
100
|
+
if (route.target.capabilities.anthropic)
|
|
101
|
+
return "anthropic";
|
|
102
|
+
return "chat";
|
|
155
103
|
}
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsVUFBVSxFQUFvQyxNQUFNLElBQUksQ0FBQztBQUVsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFFOUQsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLEtBQW1CLEVBQ25CLElBQXVDLEVBQ3ZDLE1BQW1CO0lBRW5CLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakUsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtRQUM5QixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7UUFDcEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtRQUNyQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxF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Q0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsMEJBQTBCLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDeEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtRQUMvQixPQUFPO0tBQ1IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQXlDO0lBQzVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUNyRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLGFBQWEsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3RCxJQUFJLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmVyY2VsIEFJIFNESyBmYWxsYmFjayB0cmFuc2xhdGlvbiBiZXR3ZWVuIGV4dGVybmFsIGdhdGV3YXkgcHJvdG9jb2xzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVBbnRocm9waWMgfSBmcm9tIFwiQGFpLXNkay9hbnRocm9waWNcIjtcbmltcG9ydCB7IGNyZWF0ZU9wZW5SZXNwb25zZXMgfSBmcm9tIFwiQGFpLXNkay9vcGVuLXJlc3BvbnNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlT3BlbkFJQ29tcGF0aWJsZSB9IGZyb20gXCJAYWktc2RrL29wZW5haS1jb21wYXRpYmxlXCI7XG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgaW52b2tlLCBzZXJ2aW5nV2lyZSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBHYXRld2F5Um91dGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgc3RyZWFtVGV4dCwgdHlwZSBMYW5ndWFnZU1vZGVsLCB0eXBlIFRvb2xTZXQgfSBmcm9tIFwiYWlcIjtcblxuaW1wb3J0IHsgZGVjb2RlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi9wcm90b2NvbHMvZGVjb2RlLnRzXCI7XG5pbXBvcnQgeyBlbmNvZGVHYXRld2F5UmVzcG9uc2UsIGVuY29kZUdhdGV3YXlTdHJlYW0gfSBmcm9tIFwiLi9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS90cmFuc2xhdGlvblwiKTtcblxuLyoqIFRyYW5zbGF0ZSBvbmUgcmVxdWVzdCB0aHJvdWdoIGEgcHJvdmlkZXItb3duZWQgQUkgU0RLIG1vZGVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KFxuICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVHYXRld2F5UmVxdWVzdChyb3V0ZS5jbGllbnRQcm90b2NvbCwgYm9keSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImRlY29kZWQgcmVxdWVzdFwiLCB7XG4gICAgY2xpZW50UHJvdG9jb2w6IHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgIG1lc3NhZ2VDb3VudDogZGVjb2RlZC5tZXNzYWdlcy5sZW5ndGgsXG4gICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHRvb2xDb3VudDogT2JqZWN0LmtleXMoZGVjb2RlZC50b29scykubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgbW9kZWwgPSBhd2FpdCB0cmFuc2xhdGlvbk1vZGVsKHJvdXRlKTtcbiAgY29uc3QgcmVzdWx0ID0gc3RyZWFtVGV4dCh7XG4gICAgbW9kZWwsXG4gICAgbWVzc2FnZXM6IGRlY29kZWQubWVzc2FnZXMsXG4gICAgYWxsb3dTeXN0ZW1Jbk1lc3NhZ2VzOiB0cnVlLFxuICAgIC4uLihPYmplY3Qua2V5cyhkZWNvZGVkLnRvb2xzKS5sZW5ndGggPiAwID8geyB0b29sczogZGVjb2RlZC50b29scyB9IDoge30pLFxuICAgIC4uLihkZWNvZGVkLm1heE91dHB1dFRva2VucyAhPT0gdW5kZWZpbmVkID8geyBtYXhPdXRwdXRUb2tlbnM6IGRlY29kZWQubWF4T3V0cHV0VG9rZW5zIH0gOiB7fSksXG4gICAgLi4uKGRlY29kZWQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHsgdGVtcGVyYXR1cmU6IGRlY29kZWQudGVtcGVyYXR1cmUgfSA6IHt9KSxcbiAgICAuLi4oZGVjb2RlZC50b3BQICE9PSB1bmRlZmluZWQgPyB7IHRvcFA6IGRlY29kZWQudG9wUCB9IDoge30pLFxuICAgIG1heFJldHJpZXM6IDAsXG4gICAgYWJvcnRTaWduYWw6IHNpZ25hbCxcbiAgICBvbkVycm9yOiAoeyBlcnJvciB9KSA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJzdHJlYW0gZmFpbGVkXCIsIHsgZXJyb3IsIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQgfSk7XG4gICAgfSxcbiAgICBvbkFib3J0OiAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ0cmFuc2xhdGlvbiBhYm9ydGVkXCIsIHsgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCB9KTtcbiAgICB9LFxuICAgIG9uRmluaXNoOiAoeyBmaW5pc2hSZWFzb24sIHVzYWdlIH0pID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInRyYW5zbGF0aW9uIGZpbmlzaGVkXCIsIHtcbiAgICAgICAgZmluaXNoUmVhc29uLFxuICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKGJvZHkuc3RyZWFtID09PSB0cnVlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmV0dXJuaW5nIHRyYW5zbGF0ZWQgc3RyZWFtXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiByb3V0ZS5jbGllbnRQcm90b2NvbCxcbiAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgIGVuY29kZUdhdGV3YXlTdHJlYW0oXG4gICAgICAgIHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgICAgICByb3V0ZS50YXJnZXQuaWQsXG4gICAgICAgIHJlc3VsdC5zdHJlYW0gYXMgQXN5bmNJdGVyYWJsZTxpbXBvcnQoXCJhaVwiKS5UZXh0U3RyZWFtUGFydDxUb29sU2V0Pj4sXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwibm8tY2FjaGVcIixcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvZXZlbnQtc3RyZWFtXCIsXG4gICAgICAgICAgXCJ4LWFjY2VsLWJ1ZmZlcmluZ1wiOiBcIm5vXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCBbdGV4dCwgdG9vbENhbGxzLCB1c2FnZSwgZmluaXNoUmVhc29uXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZXN1bHQudGV4dCxcbiAgICByZXN1bHQudG9vbENhbGxzLFxuICAgIHJlc3VsdC51c2FnZSxcbiAgICByZXN1bHQuZmluaXNoUmVhc29uLFxuICBdKTtcbiAgbG9nZ2VyLmRlYnVnKFwicmV0dXJuaW5nIHRyYW5zbGF0ZWQgcmVzcG9uc2VcIiwge1xuICAgIGNsaWVudFByb3RvY29sOiByb3V0ZS5jbGllbnRQcm90b2NvbCxcbiAgICBmaW5pc2hSZWFzb24sXG4gICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgdG9vbENhbGxDb3VudDogdG9vbENhbGxzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgIGVuY29kZUdhdGV3YXlSZXNwb25zZShyb3V0ZS5jbGllbnRQcm90b2NvbCwgcm91dGUudGFyZ2V0LmlkLCB7XG4gICAgICB0ZXh0LFxuICAgICAgdG9vbENhbGxzOiB0b29sQ2FsbHMgYXMgaW1wb3J0KFwiYWlcIikuVHlwZWRUb29sQ2FsbDxUb29sU2V0PltdLFxuICAgICAgdXNhZ2UsXG4gICAgICBmaW5pc2hSZWFzb24sXG4gICAgfSksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0aW9uTW9kZWwocm91dGU6IEdhdGV3YXlSb3V0ZSk6IFByb21pc2U8TGFuZ3VhZ2VNb2RlbD4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gIGlmIChyb3V0ZS50YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIFJlc3BvbnNlcyBwcm92aWRlclwiLCB7IG1vZGVsOiByb3V0ZS50YXJnZXQuaWQgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZU9wZW5SZXNwb25zZXMoe1xuICAgICAgbmFtZTogXCJkYXRhYnJpY2tzLXJlc3BvbnNlc1wiLFxuICAgICAgdXJsOiBpbnZva2UucmVzcG9uc2VzVXJsKGhvc3QpLFxuICAgICAgaGVhZGVycyxcbiAgICB9KShyb3V0ZS50YXJnZXQuaWQpO1xuICB9XG4gIGlmIChyb3V0ZS50YXJnZXQuY2FwYWJpbGl0aWVzLmFudGhyb3BpYykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIEFudGhyb3BpYyBwcm92aWRlclwiLCB7IG1vZGVsOiByb3V0ZS50YXJnZXQuaWQgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZUFudGhyb3BpYyh7XG4gICAgICBuYW1lOiBcImRhdGFicmlja3MtYW50aHJvcGljXCIsXG4gICAgICBiYXNlVVJMOiBuZXcgVVJMKFwic2VydmluZy1lbmRwb2ludHMvYW50aHJvcGljL3YxXCIsIGhvc3QpLnRvU3RyaW5nKCksXG4gICAgICBhdXRoVG9rZW46IGJlYXJlclRva2VuKGhlYWRlcnMpLFxuICAgICAgaGVhZGVycyxcbiAgICB9KShyb3V0ZS50YXJnZXQuaWQpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIENoYXQgcHJvdmlkZXJcIiwgeyBtb2RlbDogcm91dGUudGFyZ2V0LmlkIH0pO1xuICByZXR1cm4gY3JlYXRlT3BlbkFJQ29tcGF0aWJsZSh7XG4gICAgbmFtZTogXCJkYXRhYnJpY2tzLWNoYXRcIixcbiAgICBiYXNlVVJMOiBuZXcgVVJMKFwic2VydmluZy1lbmRwb2ludHNcIiwgaG9zdCkudG9TdHJpbmcoKSxcbiAgICBoZWFkZXJzLFxuICAgIHN1cHBvcnRzU3RydWN0dXJlZE91dHB1dHM6IHRydWUsXG4gICAgZmV0Y2g6IGNvbXBhdGlibGVGZXRjaCxcbiAgfSkuY2hhdE1vZGVsKHJvdXRlLnRhcmdldC5pZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBhdGlibGVGZXRjaChcbiAgaW5wdXQ6IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPlswXSxcbiAgaW5pdD86IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPlsxXSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgcmV3cml0dGVuID0gYXdhaXQgc2VydmluZ1dpcmUucmV3cml0ZVNlcnZpbmdSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VuZGluZyB0cmFuc2xhdGVkIENoYXQgcmVxdWVzdFwiLCB7XG4gICAgcmV3cml0dGVuOiByZXdyaXR0ZW4uaW5wdXQgIT09IGlucHV0IHx8IHJld3JpdHRlbi5pbml0ICE9PSBpbml0LFxuICB9KTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXdyaXR0ZW4uaW5wdXQsIHJld3JpdHRlbi5pbml0KTtcbiAgY29uc3QgcmVzcG9uc2VEZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgfTtcbiAgaWYgKHJlc3BvbnNlLm9rKSBsb2dnZXIuZGVidWcoXCJyZWNlaXZlZCB0cmFuc2xhdGVkIENoYXQgcmVzcG9uc2VcIiwgcmVzcG9uc2VEZXRhaWxzKTtcbiAgZWxzZSBsb2dnZXIud2FybihcInRyYW5zbGF0ZWQgQ2hhdCByZXF1ZXN0IGZhaWxlZFwiLCByZXNwb25zZURldGFpbHMpO1xuICBpZiAoIXJlc3BvbnNlLmJvZHkpIHJldHVybiByZXNwb25zZTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuICBpZiAoaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LmluY2x1ZGVzKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHNlcnZpbmdXaXJlLnJld3JpdGVTZXJ2aW5nUmVzcG9uc2VTdHJlYW0ocmVzcG9uc2UuYm9keSksIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYm9keSA9IHNlcnZpbmdXaXJlLnJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5KGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1sZW5ndGhcIik7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwge1xuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgaGVhZGVycyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJlYXJlclRva2VuKGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nIHtcbiAgY29uc3QgYXV0aG9yaXphdGlvbiA9IGhlYWRlcnMuYXV0aG9yaXphdGlvbiA/PyBoZWFkZXJzLkF1dGhvcml6YXRpb247XG4gIGNvbnN0IFtzY2hlbWUsIHRva2VuXSA9IGF1dGhvcml6YXRpb24/LnNwbGl0KC9cXHMrLywgMikgPz8gW107XG4gIGlmIChzY2hlbWU/LnRvTG93ZXJDYXNlKCkgIT09IFwiYmVhcmVyXCIgfHwgIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBkaWQgbm90IHByb2R1Y2UgYSBiZWFyZXIgdG9rZW5cIik7XG4gIH1cbiAgcmV0dXJuIHRva2VuO1xufVxuIl19
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLG1CQUFtQixHQUNwQixNQUFNLDBDQUEwQyxDQUFDO0FBQ2xELE9BQU8sRUFDTCw2QkFBNkIsR0FFOUIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFVBQVUsRUFBb0MsTUFBTSxJQUFJLENBQUM7QUFFbEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBRTlELG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxLQUFtQixFQUNuQixJQUF1QyxFQUN2QyxNQUFtQjtJQUVuQixNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7UUFDOUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1FBQ3BDLFlBQVksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07UUFDckMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJO1FBQzVCLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFL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UUFDUixJQUFJO1FBQ0osT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEtBQW1CO0lBQzlDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBQzVELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBQzVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZlcmNlbCBBSSBTREsgZmFsbGJhY2sgdHJhbnNsYXRpb24gYmV0d2VlbiBleHRlcm5hbCBnYXRld2F5IHByb3RvY29scy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGludm9rZSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBkZWNvZGVHYXRld2F5UmVxdWVzdCB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsLXByb3RvY29sL2dhdGV3YXktZGVjb2RlXCI7XG5pbXBvcnQge1xuICBlbmNvZGVHYXRld2F5UmVzcG9uc2UsXG4gIGVuY29kZUdhdGV3YXlTdHJlYW0sXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsLXByb3RvY29sL2dhdGV3YXktZW5jb2RlXCI7XG5pbXBvcnQge1xuICBjcmVhdGVEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbCxcbiAgdHlwZSBEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbFByb3RvY29sLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbC1wcm90b2NvbC9wcm92aWRlclwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgR2F0ZXdheVJvdXRlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB7IHN0cmVhbVRleHQsIHR5cGUgTGFuZ3VhZ2VNb2RlbCwgdHlwZSBUb29sU2V0IH0gZnJvbSBcImFpXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS90cmFuc2xhdGlvblwiKTtcblxuLyoqIFRyYW5zbGF0ZSBvbmUgcmVxdWVzdCB0aHJvdWdoIGEgcHJvdmlkZXItb3duZWQgQUkgU0RLIG1vZGVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KFxuICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVHYXRld2F5UmVxdWVzdChyb3V0ZS5jbGllbnRQcm90b2NvbCwgYm9keSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImRlY29kZWQgcmVxdWVzdFwiLCB7XG4gICAgY2xpZW50UHJvdG9jb2w6IHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgIG1lc3NhZ2VDb3VudDogZGVjb2RlZC5tZXNzYWdlcy5sZW5ndGgsXG4gICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHRvb2xDb3VudDogT2JqZWN0LmtleXMoZGVjb2RlZC50b29scykubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgbW9kZWwgPSBhd2FpdCB0cmFuc2xhdGlvbk1vZGVsKHJvdXRlKTtcbiAgY29uc3QgcmVzdWx0ID0gc3RyZWFtVGV4dCh7XG4gICAgbW9kZWwsXG4gICAgbWVzc2FnZXM6IGRlY29kZWQubWVzc2FnZXMsXG4gICAgYWxsb3dTeXN0ZW1Jbk1lc3NhZ2VzOiB0cnVlLFxuICAgIC4uLihPYmplY3Qua2V5cyhkZWNvZGVkLnRvb2xzKS5sZW5ndGggPiAwID8geyB0b29sczogZGVjb2RlZC50b29scyB9IDoge30pLFxuICAgIC4uLihkZWNvZGVkLm1heE91dHB1dFRva2VucyAhPT0gdW5kZWZpbmVkID8geyBtYXhPdXRwdXRUb2tlbnM6IGRlY29kZWQubWF4T3V0cHV0VG9rZW5zIH0gOiB7fSksXG4gICAgLi4uKGRlY29kZWQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHsgdGVtcGVyYXR1cmU6IGRlY29kZWQudGVtcGVyYXR1cmUgfSA6IHt9KSxcbiAgICAuLi4oZGVjb2RlZC50b3BQICE9PSB1bmRlZmluZWQgPyB7IHRvcFA6IGRlY29kZWQudG9wUCB9IDoge30pLFxuICAgIG1heFJldHJpZXM6IDAsXG4gICAgYWJvcnRTaWduYWw6IHNpZ25hbCxcbiAgICBvbkVycm9yOiAoeyBlcnJvciB9KSA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJzdHJlYW0gZmFpbGVkXCIsIHsgZXJyb3IsIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQgfSk7XG4gICAgfSxcbiAgICBvbkFib3J0OiAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ0cmFuc2xhdGlvbiBhYm9ydGVkXCIsIHsgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCB9KTtcbiAgICB9LFxuICAgIG9uRmluaXNoOiAoeyBmaW5pc2hSZWFzb24sIHVzYWdlIH0pID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInRyYW5zbGF0aW9uIGZpbmlzaGVkXCIsIHtcbiAgICAgICAgZmluaXNoUmVhc29uLFxuICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKGJvZHkuc3RyZWFtID09PSB0cnVlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmV0dXJuaW5nIHRyYW5zbGF0ZWQgc3RyZWFtXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiByb3V0ZS5jbGllbnRQcm90b2NvbCxcbiAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgIGVuY29kZUdhdGV3YXlTdHJlYW0oXG4gICAgICAgIHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgICAgICByb3V0ZS50YXJnZXQuaWQsXG4gICAgICAgIHJlc3VsdC5zdHJlYW0gYXMgQXN5bmNJdGVyYWJsZTxpbXBvcnQoXCJhaVwiKS5UZXh0U3RyZWFtUGFydDxUb29sU2V0Pj4sXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwibm8tY2FjaGVcIixcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvZXZlbnQtc3RyZWFtXCIsXG4gICAgICAgICAgXCJ4LWFjY2VsLWJ1ZmZlcmluZ1wiOiBcIm5vXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCBbdGV4dCwgdG9vbENhbGxzLCB1c2FnZSwgZmluaXNoUmVhc29uXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZXN1bHQudGV4dCxcbiAgICByZXN1bHQudG9vbENhbGxzLFxuICAgIHJlc3VsdC51c2FnZSxcbiAgICByZXN1bHQuZmluaXNoUmVhc29uLFxuICBdKTtcbiAgbG9nZ2VyLmRlYnVnKFwicmV0dXJuaW5nIHRyYW5zbGF0ZWQgcmVzcG9uc2VcIiwge1xuICAgIGNsaWVudFByb3RvY29sOiByb3V0ZS5jbGllbnRQcm90b2NvbCxcbiAgICBmaW5pc2hSZWFzb24sXG4gICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgdG9vbENhbGxDb3VudDogdG9vbENhbGxzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgIGVuY29kZUdhdGV3YXlSZXNwb25zZShyb3V0ZS5jbGllbnRQcm90b2NvbCwgcm91dGUudGFyZ2V0LmlkLCB7XG4gICAgICB0ZXh0LFxuICAgICAgdG9vbENhbGxzOiB0b29sQ2FsbHMgYXMgaW1wb3J0KFwiYWlcIikuVHlwZWRUb29sQ2FsbDxUb29sU2V0PltdLFxuICAgICAgdXNhZ2UsXG4gICAgICBmaW5pc2hSZWFzb24sXG4gICAgfSksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0aW9uTW9kZWwocm91dGU6IEdhdGV3YXlSb3V0ZSk6IFByb21pc2U8TGFuZ3VhZ2VNb2RlbD4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gIGNvbnN0IHByb3RvY29sID0gdHJhbnNsYXRpb25Qcm90b2NvbChyb3V0ZSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIHRyYW5zbGF0aW9uIHByb3ZpZGVyXCIsIHsgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCwgcHJvdG9jb2wgfSk7XG4gIHJldHVybiBjcmVhdGVEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbCh7XG4gICAgbW9kZWxJZDogcm91dGUudGFyZ2V0LmlkLFxuICAgIHByb3RvY29sLFxuICAgIGhvc3QsXG4gICAgaGVhZGVycyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0aW9uUHJvdG9jb2wocm91dGU6IEdhdGV3YXlSb3V0ZSk6IERhdGFicmlja3NMYW5ndWFnZU1vZGVsUHJvdG9jb2wge1xuICBpZiAocm91dGUudGFyZ2V0LmNhcGFiaWxpdGllcy5yZXNwb25zZXMpIHJldHVybiBcInJlc3BvbnNlc1wiO1xuICBpZiAocm91dGUudGFyZ2V0LmNhcGFiaWxpdGllcy5hbnRocm9waWMpIHJldHVybiBcImFudGhyb3BpY1wiO1xuICByZXR1cm4gXCJjaGF0XCI7XG59XG4iXX0=
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/gateway.ts","../src/models.ts","../src/plugin.ts","../src/reasoning-adapt.ts","../src/registry.ts","../src/router.ts","../src/routes.ts","../src/translation.ts","../src/transport.ts","../
|
|
1
|
+
{"root":["../src/gateway.ts","../src/models.ts","../src/plugin.ts","../src/reasoning-adapt.ts","../src/registry.ts","../src/router.ts","../src/routes.ts","../src/translation.ts","../src/transport.ts","../scripts/copy-manifest.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -20,22 +20,19 @@
|
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/express": "^5.0.5",
|
|
23
|
-
"@types/json-schema": "^7",
|
|
24
23
|
"@types/node": "^24.6.0",
|
|
25
24
|
"openai": "^6.16.0",
|
|
26
25
|
"typescript": "^5.9.3",
|
|
27
26
|
"vitest": "3.2.4"
|
|
28
27
|
},
|
|
29
28
|
"dependencies": {
|
|
30
|
-
"@ai-sdk/anthropic": "^4.0.0",
|
|
31
|
-
"@ai-sdk/open-responses": "^2.0.58",
|
|
32
|
-
"@ai-sdk/openai-compatible": "^3.0.62",
|
|
33
29
|
"@databricks/appkit": "0.81.0",
|
|
34
|
-
"@dbx-tools/databricks": "^0.9.
|
|
35
|
-
"@dbx-tools/model": "^0.9.
|
|
36
|
-
"@dbx-tools/
|
|
37
|
-
"@dbx-tools/shared-
|
|
38
|
-
"@dbx-tools/shared-model
|
|
30
|
+
"@dbx-tools/databricks": "^0.9.105",
|
|
31
|
+
"@dbx-tools/model": "^0.9.105",
|
|
32
|
+
"@dbx-tools/model-protocol": "^0.9.105",
|
|
33
|
+
"@dbx-tools/shared-core": "^0.9.105",
|
|
34
|
+
"@dbx-tools/shared-model": "^0.9.105",
|
|
35
|
+
"@dbx-tools/shared-model-gateway": "^0.9.105",
|
|
39
36
|
"ai": "^7.0.0",
|
|
40
37
|
"zod": "4.3.6"
|
|
41
38
|
},
|
|
@@ -89,7 +86,7 @@
|
|
|
89
86
|
"./package.json": "./package.json"
|
|
90
87
|
}
|
|
91
88
|
},
|
|
92
|
-
"version": "0.9.
|
|
89
|
+
"version": "0.9.105",
|
|
93
90
|
"types": "./lib/index.d.ts",
|
|
94
91
|
"dbxToolsConfig": {
|
|
95
92
|
"tags": [
|
package/src/translation.ts
CHANGED
|
@@ -4,18 +4,21 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
8
|
-
import { createOpenResponses } from "@ai-sdk/open-responses";
|
|
9
|
-
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
10
7
|
import { getExecutionContext } from "@databricks/appkit";
|
|
11
|
-
import { invoke
|
|
8
|
+
import { invoke } from "@dbx-tools/model";
|
|
9
|
+
import { decodeGatewayRequest } from "@dbx-tools/model-protocol/gateway-decode";
|
|
10
|
+
import {
|
|
11
|
+
encodeGatewayResponse,
|
|
12
|
+
encodeGatewayStream,
|
|
13
|
+
} from "@dbx-tools/model-protocol/gateway-encode";
|
|
14
|
+
import {
|
|
15
|
+
createDatabricksLanguageModel,
|
|
16
|
+
type DatabricksLanguageModelProtocol,
|
|
17
|
+
} from "@dbx-tools/model-protocol/provider";
|
|
12
18
|
import { log } from "@dbx-tools/shared-core";
|
|
13
19
|
import type { GatewayRoute } from "@dbx-tools/shared-model-gateway";
|
|
14
20
|
import { streamText, type LanguageModel, type ToolSet } from "ai";
|
|
15
21
|
|
|
16
|
-
import { decodeGatewayRequest } from "./protocols/decode.ts";
|
|
17
|
-
import { encodeGatewayResponse, encodeGatewayStream } from "./protocols/encode.ts";
|
|
18
|
-
|
|
19
22
|
const logger = log.logger("appkit/model-gateway/translation");
|
|
20
23
|
|
|
21
24
|
/** Translate one request through a provider-owned AI SDK model. */
|
|
@@ -108,71 +111,18 @@ async function translationModel(route: GatewayRoute): Promise<LanguageModel> {
|
|
|
108
111
|
const client = getExecutionContext().client;
|
|
109
112
|
const host = (await client.config.getHost()).toString();
|
|
110
113
|
const headers = await invoke.authHeaders(client);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
})(route.target.id);
|
|
118
|
-
}
|
|
119
|
-
if (route.target.capabilities.anthropic) {
|
|
120
|
-
logger.debug("selected Anthropic provider", { model: route.target.id });
|
|
121
|
-
return createAnthropic({
|
|
122
|
-
name: "databricks-anthropic",
|
|
123
|
-
baseURL: new URL("serving-endpoints/anthropic/v1", host).toString(),
|
|
124
|
-
authToken: bearerToken(headers),
|
|
125
|
-
headers,
|
|
126
|
-
})(route.target.id);
|
|
127
|
-
}
|
|
128
|
-
logger.debug("selected Chat provider", { model: route.target.id });
|
|
129
|
-
return createOpenAICompatible({
|
|
130
|
-
name: "databricks-chat",
|
|
131
|
-
baseURL: new URL("serving-endpoints", host).toString(),
|
|
132
|
-
headers,
|
|
133
|
-
supportsStructuredOutputs: true,
|
|
134
|
-
fetch: compatibleFetch,
|
|
135
|
-
}).chatModel(route.target.id);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async function compatibleFetch(
|
|
139
|
-
input: Parameters<typeof fetch>[0],
|
|
140
|
-
init?: Parameters<typeof fetch>[1],
|
|
141
|
-
): Promise<Response> {
|
|
142
|
-
const rewritten = await servingWire.rewriteServingRequest(input, init);
|
|
143
|
-
logger.debug("sending translated Chat request", {
|
|
144
|
-
rewritten: rewritten.input !== input || rewritten.init !== init,
|
|
145
|
-
});
|
|
146
|
-
const response = await fetch(rewritten.input, rewritten.init);
|
|
147
|
-
const responseDetails = {
|
|
148
|
-
contentType: response.headers.get("content-type"),
|
|
149
|
-
status: response.status,
|
|
150
|
-
};
|
|
151
|
-
if (response.ok) logger.debug("received translated Chat response", responseDetails);
|
|
152
|
-
else logger.warn("translated Chat request failed", responseDetails);
|
|
153
|
-
if (!response.body) return response;
|
|
154
|
-
const headers = new Headers(response.headers);
|
|
155
|
-
if (headers.get("content-type")?.includes("text/event-stream")) {
|
|
156
|
-
return new Response(servingWire.rewriteServingResponseStream(response.body), {
|
|
157
|
-
status: response.status,
|
|
158
|
-
statusText: response.statusText,
|
|
159
|
-
headers,
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
const body = servingWire.rewriteServingResponseBody(await response.text());
|
|
163
|
-
headers.delete("content-length");
|
|
164
|
-
return new Response(body, {
|
|
165
|
-
status: response.status,
|
|
166
|
-
statusText: response.statusText,
|
|
114
|
+
const protocol = translationProtocol(route);
|
|
115
|
+
logger.debug("selected translation provider", { model: route.target.id, protocol });
|
|
116
|
+
return createDatabricksLanguageModel({
|
|
117
|
+
modelId: route.target.id,
|
|
118
|
+
protocol,
|
|
119
|
+
host,
|
|
167
120
|
headers,
|
|
168
121
|
});
|
|
169
122
|
}
|
|
170
123
|
|
|
171
|
-
function
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
throw new Error("Databricks authentication did not produce a bearer token");
|
|
176
|
-
}
|
|
177
|
-
return token;
|
|
124
|
+
function translationProtocol(route: GatewayRoute): DatabricksLanguageModelProtocol {
|
|
125
|
+
if (route.target.capabilities.responses) return "responses";
|
|
126
|
+
if (route.target.capabilities.anthropic) return "anthropic";
|
|
127
|
+
return "chat";
|
|
178
128
|
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External OpenAI and Anthropic request decoders for AI SDK fallback routes.
|
|
3
|
-
*
|
|
4
|
-
* @module
|
|
5
|
-
*/
|
|
6
|
-
import type { ClientProtocol } from "@dbx-tools/shared-model-gateway";
|
|
7
|
-
import { type ModelMessage, type ToolSet } from "ai";
|
|
8
|
-
/** AI SDK call settings decoded from a gateway request. */
|
|
9
|
-
export interface DecodedGatewayRequest {
|
|
10
|
-
readonly messages: ModelMessage[];
|
|
11
|
-
readonly tools: ToolSet;
|
|
12
|
-
readonly maxOutputTokens?: number;
|
|
13
|
-
readonly temperature?: number;
|
|
14
|
-
readonly topP?: number;
|
|
15
|
-
}
|
|
16
|
-
/** Decode one supported external protocol into AI SDK model messages and tools. */
|
|
17
|
-
export declare function decodeGatewayRequest(protocol: ClientProtocol, body: Readonly<Record<string, unknown>>): DecodedGatewayRequest;
|