@dbx-tools/appkit-model-gateway 0.9.43 → 0.9.46
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/dist/plugins/model-gateway/manifest.json +13 -0
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/gateway.d.ts +2 -0
- package/lib/src/gateway.js +15 -6
- package/package.json +6 -6
- package/src/gateway.ts +16 -5
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://databricks.github.io/appkit/schemas/plugin-manifest.schema.json",
|
|
3
|
+
"name": "modelGateway",
|
|
4
|
+
"displayName": "Model Gateway",
|
|
5
|
+
"description": "OpenAI, Anthropic, Codex, and AI Gateway compatibility backed by Databricks",
|
|
6
|
+
"author": "dbx-tools",
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"stability": "beta",
|
|
9
|
+
"resources": {
|
|
10
|
+
"required": [],
|
|
11
|
+
"optional": []
|
|
12
|
+
}
|
|
13
|
+
}
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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.46";
|
|
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";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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.46";
|
|
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";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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.46";
|
|
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";
|
|
@@ -18,4 +18,4 @@ export { ModelGatewayError, ModelGateway } from "./src/gateway.js";
|
|
|
18
18
|
export { ModelGatewayPlugin, modelGateway } from "./src/plugin.js";
|
|
19
19
|
export { DatabricksModelRegistry } from "./src/registry.js";
|
|
20
20
|
export { UnsupportedGatewayFeatureError } from "./src/router.js";
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjQ2XCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3RvY29sc0RlY29kZSBmcm9tIFwiLi9zcmMvcHJvdG9jb2xzL2RlY29kZS50c1wiO1xuZXhwb3J0ICogYXMgcHJvdG9jb2xzRW5jb2RlIGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdBZGFwdCBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgKiBhcyByZWdpc3RyeSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlciBmcm9tIFwiLi9zcmMvcm91dGVyLnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXMgZnJvbSBcIi4vc3JjL3JvdXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNsYXRpb24gZnJvbSBcIi4vc3JjL3RyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5RXJyb3IsIE1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZEdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3Byb3RvY29scy9kZWNvZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29tcGxldGVkR2VuZXJhdGlvbiB9IGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkYXB0ZWRJbmZlcmVuY2VCb2R5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zLCBNb2RlbFJlZ2lzdHJ5LCBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
|
package/lib/src/gateway.d.ts
CHANGED
|
@@ -27,3 +27,5 @@ export declare class ModelGateway {
|
|
|
27
27
|
refresh(): Promise<void>;
|
|
28
28
|
private forward;
|
|
29
29
|
}
|
|
30
|
+
/** Remove an explicit null temperature while preserving omitted and numeric values. */
|
|
31
|
+
export declare function sanitizeInferenceBody(body: Readonly<Record<string, unknown>>): Readonly<Record<string, unknown>>;
|
package/lib/src/gateway.js
CHANGED
|
@@ -43,14 +43,15 @@ export class ModelGateway {
|
|
|
43
43
|
}
|
|
44
44
|
/** Resolve and execute one inference request. */
|
|
45
45
|
async inference(protocol, body, headers, signal) {
|
|
46
|
-
const
|
|
46
|
+
const sanitizedBody = sanitizeInferenceBody(body);
|
|
47
|
+
const requestedModel = requiredModel(sanitizedBody.model);
|
|
47
48
|
logger.debug("resolving request", {
|
|
48
49
|
clientProtocol: protocol,
|
|
49
50
|
model: requestedModel,
|
|
50
51
|
originator: headers.get("originator") ?? undefined,
|
|
51
|
-
stream:
|
|
52
|
+
stream: sanitizedBody.stream === true,
|
|
52
53
|
});
|
|
53
|
-
const features = requestedFeatures(
|
|
54
|
+
const features = requestedFeatures(sanitizedBody);
|
|
54
55
|
const target = await this.registry.resolve(requestedModel, {
|
|
55
56
|
...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
|
|
56
57
|
...(features.tools ? { requiresTools: true } : {}),
|
|
@@ -69,11 +70,11 @@ export class ModelGateway {
|
|
|
69
70
|
model: target.id,
|
|
70
71
|
upstreamProtocol: route.upstreamProtocol,
|
|
71
72
|
});
|
|
72
|
-
const adapted = adaptInferenceReasoning(target.id,
|
|
73
|
+
const adapted = adaptInferenceReasoning(target.id, sanitizedBody);
|
|
73
74
|
let response = await this.forward(route, adapted.body, headers, signal);
|
|
74
75
|
const retryBody = await learnAndAdaptReasoningRetry({
|
|
75
76
|
model: target.id,
|
|
76
|
-
body,
|
|
77
|
+
body: sanitizedBody,
|
|
77
78
|
response,
|
|
78
79
|
previousWireEffort: adapted.wireEffort,
|
|
79
80
|
});
|
|
@@ -106,6 +107,14 @@ export class ModelGateway {
|
|
|
106
107
|
return fetchDatabricks({ route, body, headers, signal });
|
|
107
108
|
}
|
|
108
109
|
}
|
|
110
|
+
/** Remove an explicit null temperature while preserving omitted and numeric values. */
|
|
111
|
+
export function sanitizeInferenceBody(body) {
|
|
112
|
+
if (body.temperature !== null)
|
|
113
|
+
return body;
|
|
114
|
+
const sanitized = { ...body };
|
|
115
|
+
delete sanitized.temperature;
|
|
116
|
+
return sanitized;
|
|
117
|
+
}
|
|
109
118
|
function requiredModel(value) {
|
|
110
119
|
if (typeof value !== "string" || !value.trim()) {
|
|
111
120
|
throw new ModelGatewayError(400, "Request body must include a non-empty model");
|
|
@@ -124,4 +133,4 @@ function logResponse(upstreamProtocol, model, response) {
|
|
|
124
133
|
else
|
|
125
134
|
logger.warn("upstream request failed", details);
|
|
126
135
|
}
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RixPQUFPLEVBQ0wsdUJBQXVCLEdBR3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQVFsRCwrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLGlCQUFrQixTQUFRLEtBQUs7SUFFL0I7SUFEWCxZQUNXLE1BQWMsRUFDdkIsT0FBZTtRQUVmLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhOLFdBQU0sR0FBTixNQUFNLENBQVE7UUFJdkIsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFFRCx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLFlBQVk7SUFDTixRQUFRLENBQWdCO0lBRXpDLFlBQVksVUFBK0IsRUFBRSxFQUFFLFFBQXdCO1FBQ3JFLE1BQU0sZUFBZSxHQUF5QjtZQUM1QyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxT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Q3ZCLGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsRUFBRTtRQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7O1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdG9jb2wtaW5kZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5pbXBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCB9IGZyb20gXCIuL21vZGVscy50c1wiO1xuaW1wb3J0IHsgYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcsIGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSB9IGZyb20gXCIuL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuaW1wb3J0IHtcbiAgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnksXG4gIHR5cGUgTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyxcbn0gZnJvbSBcIi4vcmVnaXN0cnkudHNcIjtcbmltcG9ydCB7IGlzQ29kZXhPcmlnaW5hdG9yLCByZXF1ZXN0ZWRGZWF0dXJlcywgcmVzb2x2ZVJvdXRlIH0gZnJvbSBcIi4vcm91dGVyLnRzXCI7XG5pbXBvcnQgeyB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdCB9IGZyb20gXCIuL3RyYW5zbGF0aW9uLnRzXCI7XG5pbXBvcnQgeyBmZXRjaERhdGFicmlja3MsIGdhdGV3YXlSZXNwb25zZUhlYWRlcnMgfSBmcm9tIFwiLi90cmFuc3BvcnQudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5XCIpO1xuXG4vKiogTW9kZWwgZ2F0ZXdheSBydW50aW1lIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsR2F0ZXdheU9wdGlvbnMge1xuICByZWFkb25seSBjYWNoZVR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeSA/PyBuZXcgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIGxpdmUgT3BlbkFJIG1vZGVsIGxpc3QsIGluY2x1ZGluZyBDb2RleCBtZXRhZGF0YSB3aGVuIHJlcXVlc3RlZC4gKi9cbiAgYXN5bmMgbW9kZWxzKG9yaWdpbmF0b3I/OiBzdHJpbmcsIHNlYXJjaD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxMaXN0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjb2RleCA9IGlzQ29kZXhPcmlnaW5hdG9yKG9yaWdpbmF0b3IpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RpbmcgbW9kZWxzXCIsIHsgY29kZXgsIHNlYXJjaCB9KTtcbiAgICBjb25zdCB0YXJnZXRzID0gc2VhcmNoPy50cmltKClcbiAgICAgID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5zZWFyY2goc2VhcmNoLnRyaW0oKSlcbiAgICAgIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkIG1vZGVsc1wiLCB7IGNvZGV4LCBjb3VudDogdGFyZ2V0cy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIGxpc3RNb2RlbHNQYXlsb2FkKHRhcmdldHMsIGNvZGV4KTtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGFuZCBleGVjdXRlIG9uZSBpbmZlcmVuY2UgcmVxdWVzdC4gKi9cbiAgYXN5bmMgaW5mZXJlbmNlKFxuICAgIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdGVkTW9kZWwgPSByZXF1aXJlZE1vZGVsKGJvZHkubW9kZWwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmluZyByZXF1ZXN0XCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiByZXF1ZXN0ZWRNb2RlbCxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gcmVxdWVzdGVkRmVhdHVyZXMoYm9keSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHJlcXVlc3RlZE1vZGVsLCB7XG4gICAgICAuLi4ocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIiA/IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSA6IHt9KSxcbiAgICAgIC4uLihmZWF0dXJlcy50b29scyA/IHsgcmVxdWlyZXNUb29sczogdHJ1ZSB9IDoge30pLFxuICAgIH0pO1xuICAgIGlmICghdGFyZ2V0KSB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDA0LCBgTW9kZWwgbm90IGZvdW5kOiAke3JlcXVlc3RlZE1vZGVsfWApO1xuICAgIGNvbnN0IHJvdXRlID0gcmVzb2x2ZVJvdXRlKHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIHJlcXVlc3RlZE1vZGVsLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgdGFyZ2V0LFxuICAgIH0pO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJvdXRlZFwiLCB7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFkYXB0ZWQgPSBhZGFwdEluZmVyZW5jZVJlYXNvbmluZyh0YXJnZXQuaWQsIGJvZHkpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9yd2FyZChyb3V0ZSwgYWRhcHRlZC5ib2R5LCBoZWFkZXJzLCBzaWduYWwpO1xuICAgIGNvbnN0IHJldHJ5Qm9keSA9IGF3YWl0IGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSh7XG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgYm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IGZvcndhcmRlZCA9IGdhdGV3YXlSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgZm9yd2FyZGVkLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogZm9yd2FyZGVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZnJlc2ggdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBtb2RlbCBjYXRhbG9ndWUuICovXG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGluZyBtb2RlbCBjYXRhbG9ndWVcIik7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmb3J3YXJkKFxuICAgIHJvdXRlOiBHYXRld2F5Um91dGUsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChyb3V0ZS51cHN0cmVhbVByb3RvY29sID09PSBcImFpLXNka1wiKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3Qocm91dGUsIGJvZHksIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaERhdGFicmlja3MoeyByb3V0ZSwgYm9keSwgaGVhZGVycywgc2lnbmFsIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkTW9kZWwodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8ICF2YWx1ZS50cmltKCkpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBcIlJlcXVlc3QgYm9keSBtdXN0IGluY2x1ZGUgYSBub24tZW1wdHkgbW9kZWxcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gbG9nUmVzcG9uc2UodXBzdHJlYW1Qcm90b2NvbDogc3RyaW5nLCBtb2RlbDogc3RyaW5nLCByZXNwb25zZTogUmVzcG9uc2UpOiB2b2lkIHtcbiAgY29uc3QgZGV0YWlscyA9IHtcbiAgICBjb250ZW50VHlwZTogcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIiksXG4gICAgbW9kZWwsXG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdXBzdHJlYW1Qcm90b2NvbCxcbiAgfTtcbiAgaWYgKHJlc3BvbnNlLm9rKSBsb2dnZXIuZGVidWcoXCJ1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgZWxzZSBsb2dnZXIud2FybihcInVwc3RyZWFtIHJlcXVlc3QgZmFpbGVkXCIsIGRldGFpbHMpO1xufVxuIl19
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RixPQUFPLEVBQ0wsdUJBQXVCLEdBR3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQVFsRCwrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLGlCQUFrQixTQUFRLEtBQUs7SUFFL0I7SUFEWCxZQUNXLE1BQWMsRUFDdkIsT0FBZTtRQUVmLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhOLFdBQU0sR0FBTixNQUFNLENBQVE7UUFJdkIsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFFRCx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLFlBQVk7SUFDTixRQUFRLENBQWdCO0lBRXpDLFlBQVksVUFBK0IsRUFBRSxFQUFFLFFBQXdCO1FBQ3JFLE1BQU0sZUFBZSxHQUF5QjtZQUM1QyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxT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QU0sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxRQUFrQjtJQUM5RSxNQUFNLE9BQU8sR0FBRztRQUNkLFdBQVcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDakQsS0FBSztRQUNMLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixnQkFBZ0I7S0FDakIsQ0FBQztJQUNGLElBQUksUUFBUSxDQUFDLEVBQUU7UUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDOztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByb3RvY29sLWluZGVwZW5kZW50IGdhdGV3YXkgc2VydmljZSB1c2VkIGJ5IHBsdWdpbiBhbmQgc3RhbmRhbG9uZSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudFByb3RvY29sLFxuICBHYXRld2F5Um91dGUsXG4gIE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlLFxuICBNb2RlbExpc3RSZXNwb25zZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuaW1wb3J0IHsgbGlzdE1vZGVsc1BheWxvYWQgfSBmcm9tIFwiLi9tb2RlbHMudHNcIjtcbmltcG9ydCB7IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nLCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkgfSBmcm9tIFwiLi9yZWFzb25pbmctYWRhcHQudHNcIjtcbmltcG9ydCB7XG4gIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnksXG4gIHR5cGUgTW9kZWxSZWdpc3RyeU9wdGlvbnMsXG59IGZyb20gXCIuL3JlZ2lzdHJ5LnRzXCI7XG5pbXBvcnQgeyBpc0NvZGV4T3JpZ2luYXRvciwgcmVxdWVzdGVkRmVhdHVyZXMsIHJlc29sdmVSb3V0ZSB9IGZyb20gXCIuL3JvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbn1cblxuLyoqIEVycm9yIGNhcnJ5aW5nIGFuIEhUVFAgc3RhdHVzIGFuZCBwcm90b2NvbC1zYWZlIG1lc3NhZ2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJNb2RlbEdhdGV3YXlFcnJvclwiO1xuICB9XG59XG5cbi8qKiBBcHBLaXQtc2NvcGVkIG1vZGVsIGdhdGV3YXkgd2l0aCBkeW5hbWljIG1vZGVsIGRpc2NvdmVyeSBhbmQgc3RyZWFtaW5nIGluZmVyZW5jZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXkge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5OiBNb2RlbFJlZ2lzdHJ5O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsR2F0ZXdheU9wdGlvbnMgPSB7fSwgcmVnaXN0cnk/OiBNb2RlbFJlZ2lzdHJ5KSB7XG4gICAgY29uc3QgcmVnaXN0cnlPcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgICAgIC4uLihvcHRpb25zLmNhY2hlVHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IG9wdGlvbnMuY2FjaGVUdGxNcyB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMub3ZlcnJpZGVzID8geyBvdmVycmlkZXM6IG9wdGlvbnMub3ZlcnJpZGVzIH0gOiB7fSksXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnkgPz8gbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHJlZ2lzdHJ5T3B0aW9ucyk7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IHNlYXJjaD8udHJpbSgpXG4gICAgICA/IGF3YWl0IHRoaXMucmVnaXN0cnkuc2VhcmNoKHNlYXJjaC50cmltKCkpXG4gICAgICA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBtb2RlbHNcIiwgeyBjb2RleCwgY291bnQ6IHRhcmdldHMubGVuZ3RoIH0pO1xuICAgIHJldHVybiBsaXN0TW9kZWxzUGF5bG9hZCh0YXJnZXRzLCBjb2RleCk7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBhbmQgZXhlY3V0ZSBvbmUgaW5mZXJlbmNlIHJlcXVlc3QuICovXG4gIGFzeW5jIGluZmVyZW5jZShcbiAgICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNhbml0aXplZEJvZHkgPSBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoYm9keSk7XG4gICAgY29uc3QgcmVxdWVzdGVkTW9kZWwgPSByZXF1aXJlZE1vZGVsKHNhbml0aXplZEJvZHkubW9kZWwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmluZyByZXF1ZXN0XCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiByZXF1ZXN0ZWRNb2RlbCxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBzdHJlYW06IHNhbml0aXplZEJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gcmVxdWVzdGVkRmVhdHVyZXMoc2FuaXRpemVkQm9keSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHJlcXVlc3RlZE1vZGVsLCB7XG4gICAgICAuLi4ocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIiA/IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSA6IHt9KSxcbiAgICAgIC4uLihmZWF0dXJlcy50b29scyA/IHsgcmVxdWlyZXNUb29sczogdHJ1ZSB9IDoge30pLFxuICAgIH0pO1xuICAgIGlmICghdGFyZ2V0KSB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDA0LCBgTW9kZWwgbm90IGZvdW5kOiAke3JlcXVlc3RlZE1vZGVsfWApO1xuICAgIGNvbnN0IHJvdXRlID0gcmVzb2x2ZVJvdXRlKHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIHJlcXVlc3RlZE1vZGVsLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIGZlYXR1cmVzLFxuICAgICAgdGFyZ2V0LFxuICAgIH0pO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJvdXRlZFwiLCB7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFkYXB0ZWQgPSBhZGFwdEluZmVyZW5jZVJlYXNvbmluZyh0YXJnZXQuaWQsIHNhbml0aXplZEJvZHkpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9yd2FyZChyb3V0ZSwgYWRhcHRlZC5ib2R5LCBoZWFkZXJzLCBzaWduYWwpO1xuICAgIGNvbnN0IHJldHJ5Qm9keSA9IGF3YWl0IGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSh7XG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgYm9keTogc2FuaXRpemVkQm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IGZvcndhcmRlZCA9IGdhdGV3YXlSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgZm9yd2FyZGVkLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogZm9yd2FyZGVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZnJlc2ggdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBtb2RlbCBjYXRhbG9ndWUuICovXG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGluZyBtb2RlbCBjYXRhbG9ndWVcIik7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmb3J3YXJkKFxuICAgIHJvdXRlOiBHYXRld2F5Um91dGUsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChyb3V0ZS51cHN0cmVhbVByb3RvY29sID09PSBcImFpLXNka1wiKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3Qocm91dGUsIGJvZHksIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaERhdGFicmlja3MoeyByb3V0ZSwgYm9keSwgaGVhZGVycywgc2lnbmFsIH0pO1xuICB9XG59XG5cbi8qKiBSZW1vdmUgYW4gZXhwbGljaXQgbnVsbCB0ZW1wZXJhdHVyZSB3aGlsZSBwcmVzZXJ2aW5nIG9taXR0ZWQgYW5kIG51bWVyaWMgdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSW5mZXJlbmNlQm9keShcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgaWYgKGJvZHkudGVtcGVyYXR1cmUgIT09IG51bGwpIHJldHVybiBib2R5O1xuICBjb25zdCBzYW5pdGl6ZWQgPSB7IC4uLmJvZHkgfTtcbiAgZGVsZXRlIHNhbml0aXplZC50ZW1wZXJhdHVyZTtcbiAgcmV0dXJuIHNhbml0aXplZDtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZWRNb2RlbCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgIXZhbHVlLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwiUmVxdWVzdCBib2R5IG11c3QgaW5jbHVkZSBhIG5vbi1lbXB0eSBtb2RlbFwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWUudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBsb2dSZXNwb25zZSh1cHN0cmVhbVByb3RvY29sOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcsIHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBkZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBtb2RlbCxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICB9O1xuICBpZiAocmVzcG9uc2Uub2spIGxvZ2dlci5kZWJ1ZyhcInVwc3RyZWFtIHJlc3BvbnNlXCIsIGRldGFpbHMpO1xuICBlbHNlIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVxdWVzdCBmYWlsZWRcIiwgZGV0YWlscyk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
"@ai-sdk/open-responses": "^2.0.58",
|
|
32
32
|
"@ai-sdk/openai-compatible": "^3.0.62",
|
|
33
33
|
"@databricks/appkit": "0.81.0",
|
|
34
|
-
"@dbx-tools/databricks": "^0.9.
|
|
35
|
-
"@dbx-tools/model": "^0.9.
|
|
36
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
37
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
38
|
-
"@dbx-tools/shared-model-gateway": "^0.9.
|
|
34
|
+
"@dbx-tools/databricks": "^0.9.46",
|
|
35
|
+
"@dbx-tools/model": "^0.9.46",
|
|
36
|
+
"@dbx-tools/shared-core": "^0.9.46",
|
|
37
|
+
"@dbx-tools/shared-model": "^0.9.46",
|
|
38
|
+
"@dbx-tools/shared-model-gateway": "^0.9.46",
|
|
39
39
|
"ai": "^7.0.0",
|
|
40
40
|
"zod": "4.3.6"
|
|
41
41
|
},
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"./package.json": "./package.json"
|
|
90
90
|
}
|
|
91
91
|
},
|
|
92
|
-
"version": "0.9.
|
|
92
|
+
"version": "0.9.46",
|
|
93
93
|
"types": "./lib/index.d.ts",
|
|
94
94
|
"dbxToolsConfig": {
|
|
95
95
|
"tags": [
|
package/src/gateway.ts
CHANGED
|
@@ -73,14 +73,15 @@ export class ModelGateway {
|
|
|
73
73
|
headers: Headers,
|
|
74
74
|
signal: AbortSignal,
|
|
75
75
|
): Promise<Response> {
|
|
76
|
-
const
|
|
76
|
+
const sanitizedBody = sanitizeInferenceBody(body);
|
|
77
|
+
const requestedModel = requiredModel(sanitizedBody.model);
|
|
77
78
|
logger.debug("resolving request", {
|
|
78
79
|
clientProtocol: protocol,
|
|
79
80
|
model: requestedModel,
|
|
80
81
|
originator: headers.get("originator") ?? undefined,
|
|
81
|
-
stream:
|
|
82
|
+
stream: sanitizedBody.stream === true,
|
|
82
83
|
});
|
|
83
|
-
const features = requestedFeatures(
|
|
84
|
+
const features = requestedFeatures(sanitizedBody);
|
|
84
85
|
const target = await this.registry.resolve(requestedModel, {
|
|
85
86
|
...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
|
|
86
87
|
...(features.tools ? { requiresTools: true } : {}),
|
|
@@ -99,11 +100,11 @@ export class ModelGateway {
|
|
|
99
100
|
upstreamProtocol: route.upstreamProtocol,
|
|
100
101
|
});
|
|
101
102
|
|
|
102
|
-
const adapted = adaptInferenceReasoning(target.id,
|
|
103
|
+
const adapted = adaptInferenceReasoning(target.id, sanitizedBody);
|
|
103
104
|
let response = await this.forward(route, adapted.body, headers, signal);
|
|
104
105
|
const retryBody = await learnAndAdaptReasoningRetry({
|
|
105
106
|
model: target.id,
|
|
106
|
-
body,
|
|
107
|
+
body: sanitizedBody,
|
|
107
108
|
response,
|
|
108
109
|
previousWireEffort: adapted.wireEffort,
|
|
109
110
|
});
|
|
@@ -145,6 +146,16 @@ export class ModelGateway {
|
|
|
145
146
|
}
|
|
146
147
|
}
|
|
147
148
|
|
|
149
|
+
/** Remove an explicit null temperature while preserving omitted and numeric values. */
|
|
150
|
+
export function sanitizeInferenceBody(
|
|
151
|
+
body: Readonly<Record<string, unknown>>,
|
|
152
|
+
): Readonly<Record<string, unknown>> {
|
|
153
|
+
if (body.temperature !== null) return body;
|
|
154
|
+
const sanitized = { ...body };
|
|
155
|
+
delete sanitized.temperature;
|
|
156
|
+
return sanitized;
|
|
157
|
+
}
|
|
158
|
+
|
|
148
159
|
function requiredModel(value: unknown): string {
|
|
149
160
|
if (typeof value !== "string" || !value.trim()) {
|
|
150
161
|
throw new ModelGatewayError(400, "Request body must include a non-empty model");
|