@dbx-tools/appkit-model-gateway 0.9.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +63 -0
- package/index.ts +28 -0
- package/lib/index.d.ts +24 -0
- package/lib/index.js +21 -0
- package/lib/scripts/copy-manifest.d.ts +1 -0
- package/lib/scripts/copy-manifest.js +14 -0
- package/lib/src/gateway.d.ts +29 -0
- package/lib/src/gateway.js +127 -0
- package/lib/src/manifest.json +13 -0
- package/lib/src/models.d.ts +10 -0
- package/lib/src/models.js +119 -0
- package/lib/src/plugin.d.ts +32 -0
- package/lib/src/plugin.js +70 -0
- package/lib/src/protocols/decode.d.ts +17 -0
- package/lib/src/protocols/decode.js +262 -0
- package/lib/src/protocols/encode.d.ts +18 -0
- package/lib/src/protocols/encode.js +498 -0
- package/lib/src/reasoning-adapt.d.ts +27 -0
- package/lib/src/reasoning-adapt.js +61 -0
- package/lib/src/registry.d.ts +32 -0
- package/lib/src/registry.js +167 -0
- package/lib/src/router.d.ts +18 -0
- package/lib/src/router.js +139 -0
- package/lib/src/routes.d.ts +14 -0
- package/lib/src/routes.js +158 -0
- package/lib/src/translation.d.ts +8 -0
- package/lib/src/translation.js +156 -0
- package/lib/src/transport.d.ts +19 -0
- package/lib/src/transport.js +168 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +150 -0
- package/src/gateway.ts +167 -0
- package/src/manifest.json +13 -0
- package/src/models.ts +152 -0
- package/src/plugin.ts +95 -0
- package/src/protocols/decode.ts +281 -0
- package/src/protocols/encode.ts +515 -0
- package/src/reasoning-adapt.ts +87 -0
- package/src/registry.ts +225 -0
- package/src/router.ts +174 -0
- package/src/routes.ts +181 -0
- package/src/translation.ts +178 -0
- package/src/transport.ts +182 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express adapters for the shared model-gateway service.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { Readable } from "node:stream";
|
|
7
|
+
import { pipeline } from "node:stream/promises";
|
|
8
|
+
import { log } from "@dbx-tools/shared-core";
|
|
9
|
+
import { ModelGatewayError } from "./gateway.js";
|
|
10
|
+
import { UnsupportedGatewayFeatureError } from "./router.js";
|
|
11
|
+
const logger = log.logger("appkit/model-gateway/http");
|
|
12
|
+
/** Send the lightweight compatibility health response. */
|
|
13
|
+
export function sendHealth(response) {
|
|
14
|
+
response.json({ ready: true });
|
|
15
|
+
}
|
|
16
|
+
/** Send the active principal's dynamic model catalogue. */
|
|
17
|
+
export async function sendModels(gateway, request, response) {
|
|
18
|
+
const startedAt = Date.now();
|
|
19
|
+
logger.debug("models request", requestContext(request));
|
|
20
|
+
try {
|
|
21
|
+
const payload = await gateway.models(request.header("originator"), optionalSearch(request.query.search));
|
|
22
|
+
response.json(payload);
|
|
23
|
+
logger.debug("models response", {
|
|
24
|
+
...requestContext(request),
|
|
25
|
+
elapsedMs: Date.now() - startedAt,
|
|
26
|
+
status: response.statusCode,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logger.error("models request failed", {
|
|
31
|
+
...requestContext(request),
|
|
32
|
+
elapsedMs: Date.now() - startedAt,
|
|
33
|
+
error,
|
|
34
|
+
});
|
|
35
|
+
sendError("openai-responses", response, error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Execute and stream one model request through Express with cancellation. */
|
|
39
|
+
export async function sendInference(gateway, protocol, request, response) {
|
|
40
|
+
const startedAt = Date.now();
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const abort = () => {
|
|
43
|
+
if (response.writableEnded)
|
|
44
|
+
return;
|
|
45
|
+
logger.debug("client disconnected", {
|
|
46
|
+
...requestContext(request),
|
|
47
|
+
elapsedMs: Date.now() - startedAt,
|
|
48
|
+
protocol,
|
|
49
|
+
});
|
|
50
|
+
controller.abort(new Error("Model gateway client disconnected"));
|
|
51
|
+
};
|
|
52
|
+
request.once("aborted", abort);
|
|
53
|
+
response.once("close", abort);
|
|
54
|
+
try {
|
|
55
|
+
const body = record(request.body);
|
|
56
|
+
logger.debug("inference request", {
|
|
57
|
+
...requestContext(request),
|
|
58
|
+
model: typeof body.model === "string" ? body.model : undefined,
|
|
59
|
+
protocol,
|
|
60
|
+
stream: body.stream === true,
|
|
61
|
+
});
|
|
62
|
+
const upstream = await gateway.inference(protocol, body, requestHeaders(request), controller.signal);
|
|
63
|
+
response.status(upstream.status);
|
|
64
|
+
upstream.headers.forEach((value, name) => response.setHeader(name, value));
|
|
65
|
+
if (!upstream.body) {
|
|
66
|
+
response.end();
|
|
67
|
+
logger.debug("inference response", {
|
|
68
|
+
...requestContext(request),
|
|
69
|
+
elapsedMs: Date.now() - startedAt,
|
|
70
|
+
protocol,
|
|
71
|
+
status: upstream.status,
|
|
72
|
+
upstreamProtocol: upstream.headers.get("x-dbx-tools-upstream"),
|
|
73
|
+
});
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
await pipeline(Readable.fromWeb(upstream.body), response);
|
|
77
|
+
logger.debug("inference stream completed", {
|
|
78
|
+
...requestContext(request),
|
|
79
|
+
elapsedMs: Date.now() - startedAt,
|
|
80
|
+
protocol,
|
|
81
|
+
status: upstream.status,
|
|
82
|
+
upstreamProtocol: upstream.headers.get("x-dbx-tools-upstream"),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (controller.signal.aborted) {
|
|
87
|
+
response.destroy();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
logger.error("inference request failed", {
|
|
91
|
+
...requestContext(request),
|
|
92
|
+
elapsedMs: Date.now() - startedAt,
|
|
93
|
+
error,
|
|
94
|
+
protocol,
|
|
95
|
+
});
|
|
96
|
+
if (response.headersSent) {
|
|
97
|
+
response.destroy(error instanceof Error ? error : undefined);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
sendError(protocol, response, error);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
request.off("aborted", abort);
|
|
104
|
+
response.off("close", abort);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function sendError(protocol, response, error) {
|
|
108
|
+
const status = error instanceof ModelGatewayError || error instanceof UnsupportedGatewayFeatureError
|
|
109
|
+
? error.status
|
|
110
|
+
: 500;
|
|
111
|
+
const message = error instanceof Error ? error.message : "Model gateway request failed";
|
|
112
|
+
if (protocol === "anthropic-messages") {
|
|
113
|
+
response.status(status).json({
|
|
114
|
+
type: "error",
|
|
115
|
+
error: { type: status < 500 ? "invalid_request_error" : "api_error", message },
|
|
116
|
+
});
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
response.status(status).json({
|
|
120
|
+
error: {
|
|
121
|
+
message,
|
|
122
|
+
type: status < 500 ? "invalid_request_error" : "api_error",
|
|
123
|
+
code: status,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function requestHeaders(request) {
|
|
128
|
+
const headers = new Headers();
|
|
129
|
+
for (const [name, raw] of Object.entries(request.headers)) {
|
|
130
|
+
if (typeof raw === "string")
|
|
131
|
+
headers.set(name, raw);
|
|
132
|
+
else if (Array.isArray(raw))
|
|
133
|
+
headers.set(name, raw.join(", "));
|
|
134
|
+
}
|
|
135
|
+
return headers;
|
|
136
|
+
}
|
|
137
|
+
function record(value) {
|
|
138
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
throw new ModelGatewayError(400, "Request body must be a JSON object");
|
|
142
|
+
}
|
|
143
|
+
function optionalSearch(value) {
|
|
144
|
+
if (value === undefined)
|
|
145
|
+
return undefined;
|
|
146
|
+
if (typeof value !== "string") {
|
|
147
|
+
throw new ModelGatewayError(400, "search must be a string");
|
|
148
|
+
}
|
|
149
|
+
return value;
|
|
150
|
+
}
|
|
151
|
+
function requestContext(request) {
|
|
152
|
+
return {
|
|
153
|
+
method: request.method,
|
|
154
|
+
path: request.path,
|
|
155
|
+
requestId: request.header("x-request-id") ?? request.header("request-id"),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTdDLE9BQU8sRUFBZ0IsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUV2RCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxRQUEwQjtJQUNuRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FDOUIsT0FBcUIsRUFDckIsT0FBd0IsRUFDeEIsUUFBMEI7SUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUNsQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUM1QixjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FDckMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsTUFBTSxD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SSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztLQUMxRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcyBhZGFwdGVycyBmb3IgdGhlIHNoYXJlZCBtb2RlbC1nYXRld2F5IHNlcnZpY2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gXCJub2RlOnN0cmVhbS9wcm9taXNlc1wiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQ2xpZW50UHJvdG9jb2wgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBNb2RlbEdhdGV3YXksIE1vZGVsR2F0ZXdheUVycm9yIH0gZnJvbSBcIi4vZ2F0ZXdheS50c1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yIH0gZnJvbSBcIi4vcm91dGVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9odHRwXCIpO1xuXG4vKiogU2VuZCB0aGUgbGlnaHR3ZWlnaHQgY29tcGF0aWJpbGl0eSBoZWFsdGggcmVzcG9uc2UuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZEhlYWx0aChyZXNwb25zZTogZXhwcmVzcy5SZXNwb25zZSk6IHZvaWQge1xuICByZXNwb25zZS5qc29uKHsgcmVhZHk6IHRydWUgfSk7XG59XG5cbi8qKiBTZW5kIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgZHluYW1pYyBtb2RlbCBjYXRhbG9ndWUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZE1vZGVscyhcbiAgZ2F0ZXdheTogTW9kZWxHYXRld2F5LFxuICByZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QsXG4gIHJlc3BvbnNlOiBleHByZXNzLlJlc3BvbnNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vZGVscyByZXF1ZXN0XCIsIHJlcXVlc3RDb250ZXh0KHJlcXVlc3QpKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZ2F0ZXdheS5tb2RlbHMoXG4gICAgICByZXF1ZXN0LmhlYWRlcihcIm9yaWdpbmF0b3JcIiksXG4gICAgICBvcHRpb25hbFNlYXJjaChyZXF1ZXN0LnF1ZXJ5LnNlYXJjaCksXG4gICAgKTtcbiAgICByZXNwb25zZS5qc29uKHBheWxvYWQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcIm1vZGVscyByZXNwb25zZVwiLCB7XG4gICAgICAuLi5yZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoXCJtb2RlbHMgcmVxdWVzdCBmYWlsZWRcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICBlcnJvcixcbiAgICB9KTtcbiAgICBzZW5kRXJyb3IoXCJvcGVuYWktcmVzcG9uc2VzXCIsIHJlc3BvbnNlLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqIEV4ZWN1dGUgYW5kIHN0cmVhbSBvbmUgbW9kZWwgcmVxdWVzdCB0aHJvdWdoIEV4cHJlc3Mgd2l0aCBjYW5jZWxsYXRpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEluZmVyZW5jZShcbiAgZ2F0ZXdheTogTW9kZWxHYXRld2F5LFxuICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gIHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzcG9uc2U6IGV4cHJlc3MuUmVzcG9uc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgYWJvcnQgPSAoKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLndyaXRhYmxlRW5kZWQpIHJldHVybjtcbiAgICBsb2dnZXIuZGVidWcoXCJjbGllbnQgZGlzY29ubmVjdGVkXCIsIHtcbiAgICAgIC4uLnJlcXVlc3RDb250ZXh0KHJlcXVlc3QpLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgcHJvdG9jb2wsXG4gICAgfSk7XG4gICAgY29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoXCJNb2RlbCBnYXRld2F5IGNsaWVudCBkaXNjb25uZWN0ZWRcIikpO1xuICB9O1xuICByZXF1ZXN0Lm9uY2UoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgcmVzcG9uc2Uub25jZShcImNsb3NlXCIsIGFib3J0KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBib2R5ID0gcmVjb3JkKHJlcXVlc3QuYm9keSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiaW5mZXJlbmNlIHJlcXVlc3RcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBtb2RlbDogdHlwZW9mIGJvZHkubW9kZWwgPT09IFwic3RyaW5nXCIgPyBib2R5Lm1vZGVsIDogdW5kZWZpbmVkLFxuICAgICAgcHJvdG9jb2wsXG4gICAgICBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gYXdhaXQgZ2F0ZXdheS5pbmZlcmVuY2UoXG4gICAgICBwcm90b2NvbCxcbiAgICAgIGJvZHksXG4gICAgICByZXF1ZXN0SGVhZGVycyhyZXF1ZXN0KSxcbiAgICAgIGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICk7XG4gICAgcmVzcG9uc2Uuc3RhdHVzKHVwc3RyZWFtLnN0YXR1cyk7XG4gICAgdXBzdHJlYW0uaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4gcmVzcG9uc2Uuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKSk7XG4gICAgaWYgKCF1cHN0cmVhbS5ib2R5KSB7XG4gICAgICByZXNwb25zZS5lbmQoKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImluZmVyZW5jZSByZXNwb25zZVwiLCB7XG4gICAgICAgIC4uLnJlcXVlc3RDb250ZXh0KHJlcXVlc3QpLFxuICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBzdGF0dXM6IHVwc3RyZWFtLnN0YXR1cyxcbiAgICAgICAgdXBzdHJlYW1Qcm90b2NvbDogdXBzdHJlYW0uaGVhZGVycy5nZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBwaXBlbGluZShSZWFkYWJsZS5mcm9tV2ViKHVwc3RyZWFtLmJvZHkgYXMgbmV2ZXIpLCByZXNwb25zZSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiaW5mZXJlbmNlIHN0cmVhbSBjb21wbGV0ZWRcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIHN0YXR1czogdXBzdHJlYW0uc3RhdHVzLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogdXBzdHJlYW0uaGVhZGVycy5nZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiKSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmVzcG9uc2UuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2dnZXIuZXJyb3IoXCJpbmZlcmVuY2UgcmVxdWVzdCBmYWlsZWRcIiwge1xuICAgICAgLi4ucmVxdWVzdENvbnRleHQocmVxdWVzdCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICBlcnJvcixcbiAgICAgIHByb3RvY29sLFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzcG9uc2UuZGVzdHJveShlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZW5kRXJyb3IocHJvdG9jb2wsIHJlc3BvbnNlLCBlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgcmVxdWVzdC5vZmYoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgICByZXNwb25zZS5vZmYoXCJjbG9zZVwiLCBhYm9ydCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VuZEVycm9yKHByb3RvY29sOiBDbGllbnRQcm90b2NvbCwgcmVzcG9uc2U6IGV4cHJlc3MuUmVzcG9uc2UsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IHN0YXR1cyA9XG4gICAgZXJyb3IgaW5zdGFuY2VvZiBNb2RlbEdhdGV3YXlFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvclxuICAgICAgPyBlcnJvci5zdGF0dXNcbiAgICAgIDogNTAwO1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIk1vZGVsIGdhdGV3YXkgcmVxdWVzdCBmYWlsZWRcIjtcbiAgaWYgKHByb3RvY29sID09PSBcImFudGhyb3BpYy1tZXNzYWdlc1wiKSB7XG4gICAgcmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykuanNvbih7XG4gICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICBlcnJvcjogeyB0eXBlOiBzdGF0dXMgPCA1MDAgPyBcImludmFsaWRfcmVxdWVzdF9lcnJvclwiIDogXCJhcGlfZXJyb3JcIiwgbWVzc2FnZSB9LFxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICByZXNwb25zZS5zdGF0dXMoc3RhdHVzKS5qc29uKHtcbiAgICBlcnJvcjoge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIHR5cGU6IHN0YXR1cyA8IDUwMCA/IFwiaW52YWxpZF9yZXF1ZXN0X2Vycm9yXCIgOiBcImFwaV9lcnJvclwiLFxuICAgICAgY29kZTogc3RhdHVzLFxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SGVhZGVycyhyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpOiBIZWFkZXJzIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGZvciAoY29uc3QgW25hbWUsIHJhd10gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdC5oZWFkZXJzKSkge1xuICAgIGlmICh0eXBlb2YgcmF3ID09PSBcInN0cmluZ1wiKSBoZWFkZXJzLnNldChuYW1lLCByYXcpO1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgaGVhZGVycy5zZXQobmFtZSwgcmF3LmpvaW4oXCIsIFwiKSk7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbmZ1bmN0aW9uIHJlY29yZCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cbiAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJSZXF1ZXN0IGJvZHkgbXVzdCBiZSBhIEpTT04gb2JqZWN0XCIpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25hbFNlYXJjaCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJzZWFyY2ggbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RDb250ZXh0KHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIHBhdGg6IHJlcXVlc3QucGF0aCxcbiAgICByZXF1ZXN0SWQ6IHJlcXVlc3QuaGVhZGVyKFwieC1yZXF1ZXN0LWlkXCIpID8/IHJlcXVlc3QuaGVhZGVyKFwicmVxdWVzdC1pZFwiKSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel AI SDK fallback translation between external gateway protocols.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { GatewayRoute } from "@dbx-tools/shared-model-gateway";
|
|
7
|
+
/** Translate one request through a provider-owned AI SDK model. */
|
|
8
|
+
export declare function translateGatewayRequest(route: GatewayRoute, body: Readonly<Record<string, unknown>>, signal: AbortSignal): Promise<Response>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel AI SDK fallback translation between external gateway protocols.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
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
|
+
import { getExecutionContext } from "@databricks/appkit";
|
|
10
|
+
import { invoke, servingWire } from "@dbx-tools/model";
|
|
11
|
+
import { log } from "@dbx-tools/shared-core";
|
|
12
|
+
import { streamText } from "ai";
|
|
13
|
+
import { decodeGatewayRequest } from "./protocols/decode.js";
|
|
14
|
+
import { encodeGatewayResponse, encodeGatewayStream } from "./protocols/encode.js";
|
|
15
|
+
const logger = log.logger("appkit/model-gateway/translation");
|
|
16
|
+
/** Translate one request through a provider-owned AI SDK model. */
|
|
17
|
+
export async function translateGatewayRequest(route, body, signal) {
|
|
18
|
+
const decoded = decodeGatewayRequest(route.clientProtocol, body);
|
|
19
|
+
logger.debug("decoded request", {
|
|
20
|
+
clientProtocol: route.clientProtocol,
|
|
21
|
+
messageCount: decoded.messages.length,
|
|
22
|
+
model: route.target.id,
|
|
23
|
+
stream: body.stream === true,
|
|
24
|
+
toolCount: Object.keys(decoded.tools).length,
|
|
25
|
+
});
|
|
26
|
+
const model = await translationModel(route);
|
|
27
|
+
const result = streamText({
|
|
28
|
+
model,
|
|
29
|
+
messages: decoded.messages,
|
|
30
|
+
allowSystemInMessages: true,
|
|
31
|
+
...(Object.keys(decoded.tools).length > 0 ? { tools: decoded.tools } : {}),
|
|
32
|
+
...(decoded.maxOutputTokens !== undefined ? { maxOutputTokens: decoded.maxOutputTokens } : {}),
|
|
33
|
+
...(decoded.temperature !== undefined ? { temperature: decoded.temperature } : {}),
|
|
34
|
+
...(decoded.topP !== undefined ? { topP: decoded.topP } : {}),
|
|
35
|
+
maxRetries: 0,
|
|
36
|
+
abortSignal: signal,
|
|
37
|
+
onError: ({ error }) => {
|
|
38
|
+
logger.error("stream failed", { error, model: route.target.id });
|
|
39
|
+
},
|
|
40
|
+
onAbort: () => {
|
|
41
|
+
logger.debug("translation aborted", { model: route.target.id });
|
|
42
|
+
},
|
|
43
|
+
onFinish: ({ finishReason, usage }) => {
|
|
44
|
+
logger.debug("translation finished", {
|
|
45
|
+
finishReason,
|
|
46
|
+
inputTokens: usage.inputTokens,
|
|
47
|
+
model: route.target.id,
|
|
48
|
+
outputTokens: usage.outputTokens,
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
if (body.stream === true) {
|
|
53
|
+
logger.debug("returning translated stream", {
|
|
54
|
+
clientProtocol: route.clientProtocol,
|
|
55
|
+
model: route.target.id,
|
|
56
|
+
});
|
|
57
|
+
return new Response(encodeGatewayStream(route.clientProtocol, route.target.id, result.stream), {
|
|
58
|
+
headers: {
|
|
59
|
+
"cache-control": "no-cache",
|
|
60
|
+
"content-type": "text/event-stream",
|
|
61
|
+
"x-accel-buffering": "no",
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const [text, toolCalls, usage, finishReason] = await Promise.all([
|
|
66
|
+
result.text,
|
|
67
|
+
result.toolCalls,
|
|
68
|
+
result.usage,
|
|
69
|
+
result.finishReason,
|
|
70
|
+
]);
|
|
71
|
+
logger.debug("returning translated response", {
|
|
72
|
+
clientProtocol: route.clientProtocol,
|
|
73
|
+
finishReason,
|
|
74
|
+
inputTokens: usage.inputTokens,
|
|
75
|
+
model: route.target.id,
|
|
76
|
+
outputTokens: usage.outputTokens,
|
|
77
|
+
toolCallCount: toolCalls.length,
|
|
78
|
+
});
|
|
79
|
+
return Response.json(encodeGatewayResponse(route.clientProtocol, route.target.id, {
|
|
80
|
+
text,
|
|
81
|
+
toolCalls: toolCalls,
|
|
82
|
+
usage,
|
|
83
|
+
finishReason,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
async function translationModel(route) {
|
|
87
|
+
const client = getExecutionContext().client;
|
|
88
|
+
const host = (await client.config.getHost()).toString();
|
|
89
|
+
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,
|
|
145
|
+
headers,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
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;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsVUFBVSxFQUFvQyxNQUFNLElBQUksQ0FBQztBQUVsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFFOUQsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLEtBQW1CLEVBQ25CLElBQXVDLEVBQ3ZDLE1BQW1CO0lBRW5CLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakUsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtRQUM5QixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7UUFDcEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtRQUNyQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxF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Q0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsMEJBQTBCLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDeEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtRQUMvQixPQUFPO0tBQ1IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQXlDO0lBQzVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUNyRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLGFBQWEsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3RCxJQUFJLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmVyY2VsIEFJIFNESyBmYWxsYmFjayB0cmFuc2xhdGlvbiBiZXR3ZWVuIGV4dGVybmFsIGdhdGV3YXkgcHJvdG9jb2xzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVBbnRocm9waWMgfSBmcm9tIFwiQGFpLXNkay9hbnRocm9waWNcIjtcbmltcG9ydCB7IGNyZWF0ZU9wZW5SZXNwb25zZXMgfSBmcm9tIFwiQGFpLXNkay9vcGVuLXJlc3BvbnNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlT3BlbkFJQ29tcGF0aWJsZSB9IGZyb20gXCJAYWktc2RrL29wZW5haS1jb21wYXRpYmxlXCI7XG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgaW52b2tlLCBzZXJ2aW5nV2lyZSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBHYXRld2F5Um91dGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgc3RyZWFtVGV4dCwgdHlwZSBMYW5ndWFnZU1vZGVsLCB0eXBlIFRvb2xTZXQgfSBmcm9tIFwiYWlcIjtcblxuaW1wb3J0IHsgZGVjb2RlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi9wcm90b2NvbHMvZGVjb2RlLnRzXCI7XG5pbXBvcnQgeyBlbmNvZGVHYXRld2F5UmVzcG9uc2UsIGVuY29kZUdhdGV3YXlTdHJlYW0gfSBmcm9tIFwiLi9wcm90b2NvbHMvZW5jb2RlLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS90cmFuc2xhdGlvblwiKTtcblxuLyoqIFRyYW5zbGF0ZSBvbmUgcmVxdWVzdCB0aHJvdWdoIGEgcHJvdmlkZXItb3duZWQgQUkgU0RLIG1vZGVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KFxuICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVHYXRld2F5UmVxdWVzdChyb3V0ZS5jbGllbnRQcm90b2NvbCwgYm9keSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImRlY29kZWQgcmVxdWVzdFwiLCB7XG4gICAgY2xpZW50UHJvdG9jb2w6IHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgIG1lc3NhZ2VDb3VudDogZGVjb2RlZC5tZXNzYWdlcy5sZW5ndGgsXG4gICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHRvb2xDb3VudDogT2JqZWN0LmtleXMoZGVjb2RlZC50b29scykubGVuZ3RoLFxuICB9KTtcbiAgY29uc3QgbW9kZWwgPSBhd2FpdCB0cmFuc2xhdGlvbk1vZGVsKHJvdXRlKTtcbiAgY29uc3QgcmVzdWx0ID0gc3RyZWFtVGV4dCh7XG4gICAgbW9kZWwsXG4gICAgbWVzc2FnZXM6IGRlY29kZWQubWVzc2FnZXMsXG4gICAgYWxsb3dTeXN0ZW1Jbk1lc3NhZ2VzOiB0cnVlLFxuICAgIC4uLihPYmplY3Qua2V5cyhkZWNvZGVkLnRvb2xzKS5sZW5ndGggPiAwID8geyB0b29sczogZGVjb2RlZC50b29scyB9IDoge30pLFxuICAgIC4uLihkZWNvZGVkLm1heE91dHB1dFRva2VucyAhPT0gdW5kZWZpbmVkID8geyBtYXhPdXRwdXRUb2tlbnM6IGRlY29kZWQubWF4T3V0cHV0VG9rZW5zIH0gOiB7fSksXG4gICAgLi4uKGRlY29kZWQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHsgdGVtcGVyYXR1cmU6IGRlY29kZWQudGVtcGVyYXR1cmUgfSA6IHt9KSxcbiAgICAuLi4oZGVjb2RlZC50b3BQICE9PSB1bmRlZmluZWQgPyB7IHRvcFA6IGRlY29kZWQudG9wUCB9IDoge30pLFxuICAgIG1heFJldHJpZXM6IDAsXG4gICAgYWJvcnRTaWduYWw6IHNpZ25hbCxcbiAgICBvbkVycm9yOiAoeyBlcnJvciB9KSA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJzdHJlYW0gZmFpbGVkXCIsIHsgZXJyb3IsIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQgfSk7XG4gICAgfSxcbiAgICBvbkFib3J0OiAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ0cmFuc2xhdGlvbiBhYm9ydGVkXCIsIHsgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCB9KTtcbiAgICB9LFxuICAgIG9uRmluaXNoOiAoeyBmaW5pc2hSZWFzb24sIHVzYWdlIH0pID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInRyYW5zbGF0aW9uIGZpbmlzaGVkXCIsIHtcbiAgICAgICAgZmluaXNoUmVhc29uLFxuICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKGJvZHkuc3RyZWFtID09PSB0cnVlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmV0dXJuaW5nIHRyYW5zbGF0ZWQgc3RyZWFtXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiByb3V0ZS5jbGllbnRQcm90b2NvbCxcbiAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgIGVuY29kZUdhdGV3YXlTdHJlYW0oXG4gICAgICAgIHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgICAgICByb3V0ZS50YXJnZXQuaWQsXG4gICAgICAgIHJlc3VsdC5zdHJlYW0gYXMgQXN5bmNJdGVyYWJsZTxpbXBvcnQoXCJhaVwiKS5UZXh0U3RyZWFtUGFydDxUb29sU2V0Pj4sXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwibm8tY2FjaGVcIixcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvZXZlbnQtc3RyZWFtXCIsXG4gICAgICAgICAgXCJ4LWFjY2VsLWJ1ZmZlcmluZ1wiOiBcIm5vXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCBbdGV4dCwgdG9vbENhbGxzLCB1c2FnZSwgZmluaXNoUmVhc29uXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZXN1bHQudGV4dCxcbiAgICByZXN1bHQudG9vbENhbGxzLFxuICAgIHJlc3VsdC51c2FnZSxcbiAgICByZXN1bHQuZmluaXNoUmVhc29uLFxuICBdKTtcbiAgbG9nZ2VyLmRlYnVnKFwicmV0dXJuaW5nIHRyYW5zbGF0ZWQgcmVzcG9uc2VcIiwge1xuICAgIGNsaWVudFByb3RvY29sOiByb3V0ZS5jbGllbnRQcm90b2NvbCxcbiAgICBmaW5pc2hSZWFzb24sXG4gICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgdG9vbENhbGxDb3VudDogdG9vbENhbGxzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgIGVuY29kZUdhdGV3YXlSZXNwb25zZShyb3V0ZS5jbGllbnRQcm90b2NvbCwgcm91dGUudGFyZ2V0LmlkLCB7XG4gICAgICB0ZXh0LFxuICAgICAgdG9vbENhbGxzOiB0b29sQ2FsbHMgYXMgaW1wb3J0KFwiYWlcIikuVHlwZWRUb29sQ2FsbDxUb29sU2V0PltdLFxuICAgICAgdXNhZ2UsXG4gICAgICBmaW5pc2hSZWFzb24sXG4gICAgfSksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0aW9uTW9kZWwocm91dGU6IEdhdGV3YXlSb3V0ZSk6IFByb21pc2U8TGFuZ3VhZ2VNb2RlbD4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gIGlmIChyb3V0ZS50YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIFJlc3BvbnNlcyBwcm92aWRlclwiLCB7IG1vZGVsOiByb3V0ZS50YXJnZXQuaWQgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZU9wZW5SZXNwb25zZXMoe1xuICAgICAgbmFtZTogXCJkYXRhYnJpY2tzLXJlc3BvbnNlc1wiLFxuICAgICAgdXJsOiBpbnZva2UucmVzcG9uc2VzVXJsKGhvc3QpLFxuICAgICAgaGVhZGVycyxcbiAgICB9KShyb3V0ZS50YXJnZXQuaWQpO1xuICB9XG4gIGlmIChyb3V0ZS50YXJnZXQuY2FwYWJpbGl0aWVzLmFudGhyb3BpYykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIEFudGhyb3BpYyBwcm92aWRlclwiLCB7IG1vZGVsOiByb3V0ZS50YXJnZXQuaWQgfSk7XG4gICAgcmV0dXJuIGNyZWF0ZUFudGhyb3BpYyh7XG4gICAgICBuYW1lOiBcImRhdGFicmlja3MtYW50aHJvcGljXCIsXG4gICAgICBiYXNlVVJMOiBuZXcgVVJMKFwic2VydmluZy1lbmRwb2ludHMvYW50aHJvcGljL3YxXCIsIGhvc3QpLnRvU3RyaW5nKCksXG4gICAgICBhdXRoVG9rZW46IGJlYXJlclRva2VuKGhlYWRlcnMpLFxuICAgICAgaGVhZGVycyxcbiAgICB9KShyb3V0ZS50YXJnZXQuaWQpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIENoYXQgcHJvdmlkZXJcIiwgeyBtb2RlbDogcm91dGUudGFyZ2V0LmlkIH0pO1xuICByZXR1cm4gY3JlYXRlT3BlbkFJQ29tcGF0aWJsZSh7XG4gICAgbmFtZTogXCJkYXRhYnJpY2tzLWNoYXRcIixcbiAgICBiYXNlVVJMOiBuZXcgVVJMKFwic2VydmluZy1lbmRwb2ludHNcIiwgaG9zdCkudG9TdHJpbmcoKSxcbiAgICBoZWFkZXJzLFxuICAgIHN1cHBvcnRzU3RydWN0dXJlZE91dHB1dHM6IHRydWUsXG4gICAgZmV0Y2g6IGNvbXBhdGlibGVGZXRjaCxcbiAgfSkuY2hhdE1vZGVsKHJvdXRlLnRhcmdldC5pZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBhdGlibGVGZXRjaChcbiAgaW5wdXQ6IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPlswXSxcbiAgaW5pdD86IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPlsxXSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgcmV3cml0dGVuID0gYXdhaXQgc2VydmluZ1dpcmUucmV3cml0ZVNlcnZpbmdSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VuZGluZyB0cmFuc2xhdGVkIENoYXQgcmVxdWVzdFwiLCB7XG4gICAgcmV3cml0dGVuOiByZXdyaXR0ZW4uaW5wdXQgIT09IGlucHV0IHx8IHJld3JpdHRlbi5pbml0ICE9PSBpbml0LFxuICB9KTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXdyaXR0ZW4uaW5wdXQsIHJld3JpdHRlbi5pbml0KTtcbiAgY29uc3QgcmVzcG9uc2VEZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgfTtcbiAgaWYgKHJlc3BvbnNlLm9rKSBsb2dnZXIuZGVidWcoXCJyZWNlaXZlZCB0cmFuc2xhdGVkIENoYXQgcmVzcG9uc2VcIiwgcmVzcG9uc2VEZXRhaWxzKTtcbiAgZWxzZSBsb2dnZXIud2FybihcInRyYW5zbGF0ZWQgQ2hhdCByZXF1ZXN0IGZhaWxlZFwiLCByZXNwb25zZURldGFpbHMpO1xuICBpZiAoIXJlc3BvbnNlLmJvZHkpIHJldHVybiByZXNwb25zZTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuICBpZiAoaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LmluY2x1ZGVzKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHNlcnZpbmdXaXJlLnJld3JpdGVTZXJ2aW5nUmVzcG9uc2VTdHJlYW0ocmVzcG9uc2UuYm9keSksIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYm9keSA9IHNlcnZpbmdXaXJlLnJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5KGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1sZW5ndGhcIik7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwge1xuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgaGVhZGVycyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJlYXJlclRva2VuKGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nIHtcbiAgY29uc3QgYXV0aG9yaXphdGlvbiA9IGhlYWRlcnMuYXV0aG9yaXphdGlvbiA/PyBoZWFkZXJzLkF1dGhvcml6YXRpb247XG4gIGNvbnN0IFtzY2hlbWUsIHRva2VuXSA9IGF1dGhvcml6YXRpb24/LnNwbGl0KC9cXHMrLywgMikgPz8gW107XG4gIGlmIChzY2hlbWU/LnRvTG93ZXJDYXNlKCkgIT09IFwiYmVhcmVyXCIgfHwgIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBkaWQgbm90IHByb2R1Y2UgYSBiZWFyZXIgdG9rZW5cIik7XG4gIH1cbiAgcmV0dXJuIHRva2VuO1xufVxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated streaming transport for direct Databricks gateway routes.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { GatewayRoute } from "@dbx-tools/shared-model-gateway";
|
|
7
|
+
/** Inputs for one direct Databricks protocol request. */
|
|
8
|
+
export interface DatabricksTransportRequest {
|
|
9
|
+
readonly route: GatewayRoute;
|
|
10
|
+
readonly body: Readonly<Record<string, unknown>>;
|
|
11
|
+
readonly headers: Headers;
|
|
12
|
+
readonly signal: AbortSignal;
|
|
13
|
+
}
|
|
14
|
+
/** Execute a direct route with SDK-owned authentication and an unbuffered response body. */
|
|
15
|
+
export declare function fetchDatabricks(request: DatabricksTransportRequest): Promise<Response>;
|
|
16
|
+
/** Copy only response headers that belong to the public model protocol. */
|
|
17
|
+
export declare function gatewayResponseHeaders(upstream: Headers): Headers;
|
|
18
|
+
/** Resolve the exact upstream URL for a deterministic direct route. */
|
|
19
|
+
export declare function upstreamUrl(host: string, route: GatewayRoute): string;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated streaming transport for direct Databricks gateway routes.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { getExecutionContext } from "@databricks/appkit";
|
|
7
|
+
import { workspaceClient } from "@dbx-tools/databricks";
|
|
8
|
+
import { invoke } from "@dbx-tools/model";
|
|
9
|
+
import { log } from "@dbx-tools/shared-core";
|
|
10
|
+
const logger = log.logger("appkit/model-gateway/transport");
|
|
11
|
+
const ERROR_PREVIEW_BYTES = 8 * 1024;
|
|
12
|
+
const BLOCKED_REQUEST_HEADERS = new Set([
|
|
13
|
+
"accept-encoding",
|
|
14
|
+
"authorization",
|
|
15
|
+
"connection",
|
|
16
|
+
"content-length",
|
|
17
|
+
"cookie",
|
|
18
|
+
"host",
|
|
19
|
+
"proxy-authorization",
|
|
20
|
+
"transfer-encoding",
|
|
21
|
+
"x-api-key",
|
|
22
|
+
]);
|
|
23
|
+
const BLOCKED_RESPONSE_HEADERS = new Set([
|
|
24
|
+
"connection",
|
|
25
|
+
"content-encoding",
|
|
26
|
+
"content-length",
|
|
27
|
+
"keep-alive",
|
|
28
|
+
"proxy-authenticate",
|
|
29
|
+
"proxy-authorization",
|
|
30
|
+
"set-cookie",
|
|
31
|
+
"te",
|
|
32
|
+
"trailer",
|
|
33
|
+
"transfer-encoding",
|
|
34
|
+
"upgrade",
|
|
35
|
+
]);
|
|
36
|
+
/** Execute a direct route with SDK-owned authentication and an unbuffered response body. */
|
|
37
|
+
export async function fetchDatabricks(request) {
|
|
38
|
+
const client = getExecutionContext().client;
|
|
39
|
+
const host = (await client.config.getHost()).toString();
|
|
40
|
+
const headers = new Headers({ "content-type": "application/json" });
|
|
41
|
+
request.headers.forEach((value, name) => {
|
|
42
|
+
const normalized = name.toLowerCase();
|
|
43
|
+
if (!BLOCKED_REQUEST_HEADERS.has(normalized) && !normalized.startsWith("x-forwarded-")) {
|
|
44
|
+
headers.set(name, value);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
await client.config.authenticate(headers);
|
|
48
|
+
const url = upstreamUrl(host, request.route);
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
const body = JSON.stringify({ ...request.body, model: request.route.upstreamModel });
|
|
51
|
+
logger.debug("sending upstream request", {
|
|
52
|
+
model: request.route.upstreamModel,
|
|
53
|
+
path: new URL(url).pathname,
|
|
54
|
+
stream: request.body.stream === true,
|
|
55
|
+
upstreamProtocol: request.route.upstreamProtocol,
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
let response = await fetch(url, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
headers,
|
|
61
|
+
body,
|
|
62
|
+
signal: request.signal,
|
|
63
|
+
});
|
|
64
|
+
if (response.status === 401 &&
|
|
65
|
+
(await workspaceClient.refreshWorkspaceClientAuthentication(client))) {
|
|
66
|
+
logger.debug("retrying rejected upstream credential", {
|
|
67
|
+
model: request.route.upstreamModel,
|
|
68
|
+
upstreamProtocol: request.route.upstreamProtocol,
|
|
69
|
+
});
|
|
70
|
+
await response.body?.cancel();
|
|
71
|
+
headers.delete("authorization");
|
|
72
|
+
headers.delete("x-databricks-workspace-id");
|
|
73
|
+
await client.config.authenticate(headers);
|
|
74
|
+
response = await fetch(url, {
|
|
75
|
+
method: "POST",
|
|
76
|
+
headers,
|
|
77
|
+
body,
|
|
78
|
+
signal: request.signal,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const details = {
|
|
82
|
+
elapsedMs: Date.now() - startedAt,
|
|
83
|
+
model: request.route.upstreamModel,
|
|
84
|
+
requestId: response.headers.get("x-request-id") ?? response.headers.get("x-databricks-request-id"),
|
|
85
|
+
status: response.status,
|
|
86
|
+
upstreamProtocol: request.route.upstreamProtocol,
|
|
87
|
+
};
|
|
88
|
+
if (response.ok) {
|
|
89
|
+
logger.debug("received upstream response", details);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
logger.warn("upstream response failed", details);
|
|
93
|
+
void logUpstreamFailureBody(response.clone(), details);
|
|
94
|
+
}
|
|
95
|
+
return response;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logger.error("upstream fetch failed", {
|
|
99
|
+
elapsedMs: Date.now() - startedAt,
|
|
100
|
+
error,
|
|
101
|
+
model: request.route.upstreamModel,
|
|
102
|
+
upstreamProtocol: request.route.upstreamProtocol,
|
|
103
|
+
});
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Copy only response headers that belong to the public model protocol. */
|
|
108
|
+
export function gatewayResponseHeaders(upstream) {
|
|
109
|
+
const headers = new Headers();
|
|
110
|
+
upstream.forEach((value, name) => {
|
|
111
|
+
if (!BLOCKED_RESPONSE_HEADERS.has(name.toLowerCase()))
|
|
112
|
+
headers.set(name, value);
|
|
113
|
+
});
|
|
114
|
+
return headers;
|
|
115
|
+
}
|
|
116
|
+
/** Resolve the exact upstream URL for a deterministic direct route. */
|
|
117
|
+
export function upstreamUrl(host, route) {
|
|
118
|
+
switch (route.upstreamProtocol) {
|
|
119
|
+
case "databricks-ai-gateway-codex":
|
|
120
|
+
return invoke.aiGatewayCodexResponsesUrl(host);
|
|
121
|
+
case "databricks-responses":
|
|
122
|
+
return invoke.responsesUrl(host);
|
|
123
|
+
case "databricks-open-responses":
|
|
124
|
+
return invoke.openResponsesUrl(host);
|
|
125
|
+
case "databricks-chat":
|
|
126
|
+
return invoke.chatCompletionsUrl(host);
|
|
127
|
+
case "databricks-anthropic":
|
|
128
|
+
return invoke.anthropicMessagesUrl(host);
|
|
129
|
+
case "databricks-embeddings":
|
|
130
|
+
return invoke.invocationsUrl(host, route.upstreamModel);
|
|
131
|
+
case "ai-sdk":
|
|
132
|
+
throw new Error("AI SDK routes do not use the direct Databricks transport");
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function logUpstreamFailureBody(response, details) {
|
|
136
|
+
const reader = response.body?.getReader();
|
|
137
|
+
if (!reader)
|
|
138
|
+
return;
|
|
139
|
+
const decoder = new TextDecoder();
|
|
140
|
+
let preview = "";
|
|
141
|
+
let bytes = 0;
|
|
142
|
+
try {
|
|
143
|
+
while (bytes < ERROR_PREVIEW_BYTES) {
|
|
144
|
+
const chunk = await reader.read();
|
|
145
|
+
if (chunk.done)
|
|
146
|
+
break;
|
|
147
|
+
const remaining = ERROR_PREVIEW_BYTES - bytes;
|
|
148
|
+
const value = chunk.value.subarray(0, remaining);
|
|
149
|
+
bytes += value.byteLength;
|
|
150
|
+
preview += decoder.decode(value, { stream: true });
|
|
151
|
+
if (value.byteLength < chunk.value.byteLength)
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
preview += decoder.decode();
|
|
155
|
+
logger.warn("upstream error body", {
|
|
156
|
+
...details,
|
|
157
|
+
preview,
|
|
158
|
+
truncated: bytes >= ERROR_PREVIEW_BYTES,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
logger.debug("could not read upstream error body", { ...details, error });
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
await reader.cancel().catch(() => undefined);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQzVELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUVyQyxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3RDLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsTUFBTTtJQUNOLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsV0FBVztDQUNaLENBQUMsQ0FBQztBQUVILE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdkMsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsWUFBWTtJQUNaLElBQUk7SUFDSixTQUFTO0lBQ1QsbUJBQW1CO0lBQ25CLFNBQVM7Q0FDVixDQUFDLENBQUM7QUFVSCw0RkFBNEY7QUFDNUYsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsT0FBbUM7SUFDdkUsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMs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QU8sS0FBSyxHQUFHLG1CQUFtQixFQUFFLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsSUFBSTtnQkFBRSxNQUFNO1lBQ3RCLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakQsS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVTtnQkFBRSxNQUFNO1FBQ3ZELENBQUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDakMsR0FBRyxPQUFPO1lBQ1YsT0FBTztZQUNQLFNBQVMsRUFBRSxLQUFLLElBQUksbUJBQW1CO1NBQ3hDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGhlbnRpY2F0ZWQgc3RyZWFtaW5nIHRyYW5zcG9ydCBmb3IgZGlyZWN0IERhdGFicmlja3MgZ2F0ZXdheSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBpbnZva2UgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgR2F0ZXdheVJvdXRlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3RyYW5zcG9ydFwiKTtcbmNvbnN0IEVSUk9SX1BSRVZJRVdfQllURVMgPSA4ICogMTAyNDtcblxuY29uc3QgQkxPQ0tFRF9SRVFVRVNUX0hFQURFUlMgPSBuZXcgU2V0KFtcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwiY29ubmVjdGlvblwiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwiY29va2llXCIsXG4gIFwiaG9zdFwiLFxuICBcInByb3h5LWF1dGhvcml6YXRpb25cIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcIngtYXBpLWtleVwiLFxuXSk7XG5cbmNvbnN0IEJMT0NLRURfUkVTUE9OU0VfSEVBREVSUyA9IG5ldyBTZXQoW1xuICBcImNvbm5lY3Rpb25cIixcbiAgXCJjb250ZW50LWVuY29kaW5nXCIsXG4gIFwiY29udGVudC1sZW5ndGhcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwicHJveHktYXV0aGVudGljYXRlXCIsXG4gIFwicHJveHktYXV0aG9yaXphdGlvblwiLFxuICBcInNldC1jb29raWVcIixcbiAgXCJ0ZVwiLFxuICBcInRyYWlsZXJcIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcInVwZ3JhZGVcIixcbl0pO1xuXG4vKiogSW5wdXRzIGZvciBvbmUgZGlyZWN0IERhdGFicmlja3MgcHJvdG9jb2wgcmVxdWVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3Qge1xuICByZWFkb25seSByb3V0ZTogR2F0ZXdheVJvdXRlO1xuICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBFeGVjdXRlIGEgZGlyZWN0IHJvdXRlIHdpdGggU0RLLW93bmVkIGF1dGhlbnRpY2F0aW9uIGFuZCBhbiB1bmJ1ZmZlcmVkIHJlc3BvbnNlIGJvZHkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhYnJpY2tzKHJlcXVlc3Q6IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KTtcbiAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIUJMT0NLRURfUkVRVUVTVF9IRUFERVJTLmhhcyhub3JtYWxpemVkKSAmJiAhbm9ybWFsaXplZC5zdGFydHNXaXRoKFwieC1mb3J3YXJkZWQtXCIpKSB7XG4gICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgY2xpZW50LmNvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gIGNvbnN0IHVybCA9IHVwc3RyZWFtVXJsKGhvc3QsIHJlcXVlc3Qucm91dGUpO1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyAuLi5yZXF1ZXN0LmJvZHksIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbmRpbmcgdXBzdHJlYW0gcmVxdWVzdFwiLCB7XG4gICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICBwYXRoOiBuZXcgVVJMKHVybCkucGF0aG5hbWUsXG4gICAgc3RyZWFtOiByZXF1ZXN0LmJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgfSk7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICAoYXdhaXQgd29ya3NwYWNlQ2xpZW50LnJlZnJlc2hXb3Jrc3BhY2VDbGllbnRBdXRoZW50aWNhdGlvbihjbGllbnQpKVxuICAgICkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmV0cnlpbmcgcmVqZWN0ZWQgdXBzdHJlYW0gY3JlZGVudGlhbFwiLCB7XG4gICAgICAgIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwsXG4gICAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICBoZWFkZXJzLmRlbGV0ZShcImF1dGhvcml6YXRpb25cIik7XG4gICAgICBoZWFkZXJzLmRlbGV0ZShcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIik7XG4gICAgICBhd2FpdCBjbGllbnQuY29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHksXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIG1vZGVsOiByZXF1ZXN0LnJvdXRlLnVwc3RyZWFtTW9kZWwsXG4gICAgICByZXF1ZXN0SWQ6XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwieC1yZXF1ZXN0LWlkXCIpID8/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwieC1kYXRhYnJpY2tzLXJlcXVlc3QtaWRcIiksXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9O1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVjZWl2ZWQgdXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVzcG9uc2UgZmFpbGVkXCIsIGRldGFpbHMpO1xuICAgICAgdm9pZCBsb2dVcHN0cmVhbUZhaWx1cmVCb2R5KHJlc3BvbnNlLmNsb25lKCksIGRldGFpbHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKFwidXBzdHJlYW0gZmV0Y2ggZmFpbGVkXCIsIHtcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIGVycm9yLFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogQ29weSBvbmx5IHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIHB1YmxpYyBtb2RlbCBwcm90b2NvbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRld2F5UmVzcG9uc2VIZWFkZXJzKHVwc3RyZWFtOiBIZWFkZXJzKTogSGVhZGVycyB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICB1cHN0cmVhbS5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIGlmICghQkxPQ0tFRF9SRVNQT05TRV9IRUFERVJTLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqIFJlc29sdmUgdGhlIGV4YWN0IHVwc3RyZWFtIFVSTCBmb3IgYSBkZXRlcm1pbmlzdGljIGRpcmVjdCByb3V0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHN0cmVhbVVybChob3N0OiBzdHJpbmcsIHJvdXRlOiBHYXRld2F5Um91dGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiZGF0YWJyaWNrcy1haS1nYXRld2F5LWNvZGV4XCI6XG4gICAgICByZXR1cm4gaW52b2tlLmFpR2F0ZXdheUNvZGV4UmVzcG9uc2VzVXJsKGhvc3QpO1xuICAgIGNhc2UgXCJkYXRhYnJpY2tzLXJlc3BvbnNlc1wiOlxuICAgICAgcmV0dXJuIGludm9rZS5yZXNwb25zZXNVcmwoaG9zdCk7XG4gICAgY2FzZSBcImRhdGFicmlja3Mtb3Blbi1yZXNwb25zZXNcIjpcbiAgICAgIHJldHVybiBpbnZva2Uub3BlblJlc3BvbnNlc1VybChob3N0KTtcbiAgICBjYXNlIFwiZGF0YWJyaWNrcy1jaGF0XCI6XG4gICAgICByZXR1cm4gaW52b2tlLmNoYXRDb21wbGV0aW9uc1VybChob3N0KTtcbiAgICBjYXNlIFwiZGF0YWJyaWNrcy1hbnRocm9waWNcIjpcbiAgICAgIHJldHVybiBpbnZva2UuYW50aHJvcGljTWVzc2FnZXNVcmwoaG9zdCk7XG4gICAgY2FzZSBcImRhdGFicmlja3MtZW1iZWRkaW5nc1wiOlxuICAgICAgcmV0dXJuIGludm9rZS5pbnZvY2F0aW9uc1VybChob3N0LCByb3V0ZS51cHN0cmVhbU1vZGVsKTtcbiAgICBjYXNlIFwiYWktc2RrXCI6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBSSBTREsgcm91dGVzIGRvIG5vdCB1c2UgdGhlIGRpcmVjdCBEYXRhYnJpY2tzIHRyYW5zcG9ydFwiKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dVcHN0cmVhbUZhaWx1cmVCb2R5KFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpO1xuICBpZiAoIXJlYWRlcikgcmV0dXJuO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBwcmV2aWV3ID0gXCJcIjtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoYnl0ZXMgPCBFUlJPUl9QUkVWSUVXX0JZVEVTKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoY2h1bmsuZG9uZSkgYnJlYWs7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBFUlJPUl9QUkVWSUVXX0JZVEVTIC0gYnl0ZXM7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNodW5rLnZhbHVlLnN1YmFycmF5KDAsIHJlbWFpbmluZyk7XG4gICAgICBieXRlcyArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgcHJldmlldyArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICBpZiAodmFsdWUuYnl0ZUxlbmd0aCA8IGNodW5rLnZhbHVlLmJ5dGVMZW5ndGgpIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2aWV3ICs9IGRlY29kZXIuZGVjb2RlKCk7XG4gICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSBlcnJvciBib2R5XCIsIHtcbiAgICAgIC4uLmRldGFpbHMsXG4gICAgICBwcmV2aWV3LFxuICAgICAgdHJ1bmNhdGVkOiBieXRlcyA+PSBFUlJPUl9QUkVWSUVXX0JZVEVTLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNvdWxkIG5vdCByZWFkIHVwc3RyZWFtIGVycm9yIGJvZHlcIiwgeyAuLi5kZXRhaWxzLCBlcnJvciB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +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"}
|