@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 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` package owns foreground server construction and
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.99";
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.99";
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.99";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEtBQUssY0FBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45Ljk5XCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3RvY29sc0RlY29kZSBmcm9tIFwiLi9zcmMvcHJvdG9jb2xzL2RlY29kZS50c1wiO1xuZXhwb3J0ICogYXMgcHJvdG9jb2xzRW5jb2RlIGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdBZGFwdCBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgKiBhcyByZWdpc3RyeSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlciBmcm9tIFwiLi9zcmMvcm91dGVyLnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXMgZnJvbSBcIi4vc3JjL3JvdXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNsYXRpb24gZnJvbSBcIi4vc3JjL3RyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5RXJyb3IsIE1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZEdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3Byb3RvY29scy9kZWNvZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29tcGxldGVkR2VuZXJhdGlvbiB9IGZyb20gXCIuL3NyYy9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkYXB0ZWRJbmZlcmVuY2VCb2R5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zLCBNb2RlbFJlZ2lzdHJ5LCBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tb2RlbC1nYXRld2F5XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTA1XCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ0FkYXB0IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCAqIGFzIHJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVyIGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zcG9ydCBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlFcnJvciwgTW9kZWxHYXRld2F5IH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZGFwdGVkSW5mZXJlbmNlQm9keSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucywgTW9kZWxSZWdpc3RyeSwgTW9kZWxSZWdpc3RyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB7IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciB9IGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG4iXX0=
@@ -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, servingWire } from "@dbx-tools/model";
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
- if (route.target.capabilities.responses) {
91
- logger.debug("selected Responses provider", { model: route.target.id });
92
- return createOpenResponses({
93
- name: "databricks-responses",
94
- url: invoke.responsesUrl(host),
95
- headers,
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 bearerToken(headers) {
149
- const authorization = headers.authorization ?? headers.Authorization;
150
- const [scheme, token] = authorization?.split(/\s+/, 2) ?? [];
151
- if (scheme?.toLowerCase() !== "bearer" || !token) {
152
- throw new Error("Databricks authentication did not produce a bearer token");
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=
@@ -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","../src/protocols/decode.ts","../src/protocols/encode.ts","../scripts/copy-manifest.ts","../index.ts"],"version":"5.9.3"}
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.99",
35
- "@dbx-tools/model": "^0.9.99",
36
- "@dbx-tools/shared-core": "^0.9.99",
37
- "@dbx-tools/shared-model": "^0.9.99",
38
- "@dbx-tools/shared-model-gateway": "^0.9.99",
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.99",
89
+ "version": "0.9.105",
93
90
  "types": "./lib/index.d.ts",
94
91
  "dbxToolsConfig": {
95
92
  "tags": [
@@ -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, servingWire } from "@dbx-tools/model";
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
- if (route.target.capabilities.responses) {
112
- logger.debug("selected Responses provider", { model: route.target.id });
113
- return createOpenResponses({
114
- name: "databricks-responses",
115
- url: invoke.responsesUrl(host),
116
- headers,
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 bearerToken(headers: Readonly<Record<string, string>>): string {
172
- const authorization = headers.authorization ?? headers.Authorization;
173
- const [scheme, token] = authorization?.split(/\s+/, 2) ?? [];
174
- if (scheme?.toLowerCase() !== "bearer" || !token) {
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;