@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.
Files changed (44) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +63 -0
  3. package/index.ts +28 -0
  4. package/lib/index.d.ts +24 -0
  5. package/lib/index.js +21 -0
  6. package/lib/scripts/copy-manifest.d.ts +1 -0
  7. package/lib/scripts/copy-manifest.js +14 -0
  8. package/lib/src/gateway.d.ts +29 -0
  9. package/lib/src/gateway.js +127 -0
  10. package/lib/src/manifest.json +13 -0
  11. package/lib/src/models.d.ts +10 -0
  12. package/lib/src/models.js +119 -0
  13. package/lib/src/plugin.d.ts +32 -0
  14. package/lib/src/plugin.js +70 -0
  15. package/lib/src/protocols/decode.d.ts +17 -0
  16. package/lib/src/protocols/decode.js +262 -0
  17. package/lib/src/protocols/encode.d.ts +18 -0
  18. package/lib/src/protocols/encode.js +498 -0
  19. package/lib/src/reasoning-adapt.d.ts +27 -0
  20. package/lib/src/reasoning-adapt.js +61 -0
  21. package/lib/src/registry.d.ts +32 -0
  22. package/lib/src/registry.js +167 -0
  23. package/lib/src/router.d.ts +18 -0
  24. package/lib/src/router.js +139 -0
  25. package/lib/src/routes.d.ts +14 -0
  26. package/lib/src/routes.js +158 -0
  27. package/lib/src/translation.d.ts +8 -0
  28. package/lib/src/translation.js +156 -0
  29. package/lib/src/transport.d.ts +19 -0
  30. package/lib/src/transport.js +168 -0
  31. package/lib/tsconfig.tsbuildinfo +1 -0
  32. package/package.json +150 -0
  33. package/src/gateway.ts +167 -0
  34. package/src/manifest.json +13 -0
  35. package/src/models.ts +152 -0
  36. package/src/plugin.ts +95 -0
  37. package/src/protocols/decode.ts +281 -0
  38. package/src/protocols/encode.ts +515 -0
  39. package/src/reasoning-adapt.ts +87 -0
  40. package/src/registry.ts +225 -0
  41. package/src/router.ts +174 -0
  42. package/src/routes.ts +181 -0
  43. package/src/translation.ts +178 -0
  44. 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"}