@dbx-tools/appkit-model-gateway 0.9.99 → 0.9.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,260 +0,0 @@
1
- /**
2
- * External OpenAI and Anthropic request decoders for AI SDK fallback routes.
3
- *
4
- * @module
5
- */
6
- import { object } from "@dbx-tools/shared-core";
7
- import { dynamicTool, jsonSchema } from "ai";
8
- /** Decode one supported external protocol into AI SDK model messages and tools. */
9
- export function decodeGatewayRequest(protocol, body) {
10
- const messages = protocol === "openai-responses"
11
- ? decodeResponsesMessages(body)
12
- : protocol === "anthropic-messages"
13
- ? decodeAnthropicMessages(body)
14
- : decodeChatMessages(body);
15
- return {
16
- messages: consolidateSystemMessages(messages),
17
- tools: decodeTools(body.tools),
18
- ...numberSetting(body, "max_output_tokens", "max_tokens", "max_tokens_to_sample"),
19
- ...(finiteNumber(body.temperature) !== undefined
20
- ? { temperature: finiteNumber(body.temperature) }
21
- : {}),
22
- ...(finiteNumber(body.top_p) !== undefined ? { topP: finiteNumber(body.top_p) } : {}),
23
- };
24
- }
25
- function decodeResponsesMessages(body) {
26
- const messages = [];
27
- if (typeof body.instructions === "string" && body.instructions.trim()) {
28
- messages.push({ role: "system", content: body.instructions });
29
- }
30
- if (typeof body.input === "string") {
31
- messages.push({ role: "user", content: body.input });
32
- return messages;
33
- }
34
- const toolNames = new Map();
35
- for (const item of arrayRecords(body.input)) {
36
- const type = item.type;
37
- if (type === "function_call" || type === "custom_tool_call") {
38
- const callId = stringValue(item.call_id) ?? stringValue(item.id) ?? crypto.randomUUID();
39
- const toolName = stringValue(item.name) ?? "tool";
40
- toolNames.set(callId, toolName);
41
- messages.push({
42
- role: "assistant",
43
- content: [
44
- {
45
- type: "tool-call",
46
- toolCallId: callId,
47
- toolName,
48
- input: parseToolInput(item.arguments ?? item.input),
49
- },
50
- ],
51
- });
52
- continue;
53
- }
54
- if (type === "function_call_output" || type === "custom_tool_call_output") {
55
- const callId = stringValue(item.call_id) ?? stringValue(item.id) ?? crypto.randomUUID();
56
- messages.push(toolResultMessage(callId, toolNames.get(callId) ?? "tool", item.output));
57
- continue;
58
- }
59
- const role = messageRole(item.role);
60
- if (role)
61
- messages.push({ role, content: contentText(item.content) });
62
- }
63
- return messages;
64
- }
65
- function decodeChatMessages(body) {
66
- const messages = [];
67
- const toolNames = new Map();
68
- for (const message of arrayRecords(body.messages)) {
69
- const role = stringValue(message.role);
70
- if (role === "tool") {
71
- const callId = stringValue(message.tool_call_id) ?? crypto.randomUUID();
72
- messages.push(toolResultMessage(callId, toolNames.get(callId) ?? "tool", message.content));
73
- continue;
74
- }
75
- if (role === "assistant" && Array.isArray(message.tool_calls)) {
76
- const content = [];
77
- const text = contentText(message.content);
78
- if (text)
79
- content.push({ type: "text", text });
80
- for (const toolCall of arrayRecords(message.tool_calls)) {
81
- const fn = record(toolCall.function);
82
- const callId = stringValue(toolCall.id) ?? crypto.randomUUID();
83
- const toolName = stringValue(fn.name) ?? "tool";
84
- toolNames.set(callId, toolName);
85
- content.push({
86
- type: "tool-call",
87
- toolCallId: callId,
88
- toolName,
89
- input: parseToolInput(fn.arguments),
90
- });
91
- }
92
- messages.push({ role: "assistant", content });
93
- continue;
94
- }
95
- const normalized = messageRole(role);
96
- if (normalized)
97
- messages.push({ role: normalized, content: contentText(message.content) });
98
- }
99
- return messages;
100
- }
101
- function decodeAnthropicMessages(body) {
102
- const messages = [];
103
- if (body.system !== undefined) {
104
- const system = contentText(body.system);
105
- if (system)
106
- messages.push({ role: "system", content: system });
107
- }
108
- const toolNames = new Map();
109
- for (const message of arrayRecords(body.messages)) {
110
- const role = stringValue(message.role);
111
- const parts = Array.isArray(message.content) ? message.content : [];
112
- if (role === "assistant") {
113
- const content = [];
114
- for (const part of parts) {
115
- if (!record(part).type || record(part).type === "text") {
116
- const text = contentText(part);
117
- if (text)
118
- content.push({ type: "text", text });
119
- continue;
120
- }
121
- const value = record(part);
122
- if (value.type !== "tool_use")
123
- continue;
124
- const callId = stringValue(value.id) ?? crypto.randomUUID();
125
- const toolName = stringValue(value.name) ?? "tool";
126
- toolNames.set(callId, toolName);
127
- content.push({
128
- type: "tool-call",
129
- toolCallId: callId,
130
- toolName,
131
- input: value.input ?? {},
132
- });
133
- }
134
- messages.push({ role: "assistant", content });
135
- continue;
136
- }
137
- const textParts = [];
138
- for (const part of parts) {
139
- const value = record(part);
140
- if (value.type === "tool_result") {
141
- const callId = stringValue(value.tool_use_id) ?? crypto.randomUUID();
142
- messages.push(toolResultMessage(callId, toolNames.get(callId) ?? "tool", value.content));
143
- }
144
- else {
145
- const text = contentText(part);
146
- if (text)
147
- textParts.push(text);
148
- }
149
- }
150
- if (textParts.length > 0)
151
- messages.push({ role: "user", content: textParts.join("\n") });
152
- }
153
- return messages;
154
- }
155
- function decodeTools(value) {
156
- const tools = {};
157
- for (const entry of arrayRecords(value)) {
158
- const fn = record(entry.function);
159
- const name = stringValue(fn.name) ?? stringValue(entry.name);
160
- if (!name)
161
- continue;
162
- const declaredSchema = record(fn.parameters ?? entry.input_schema);
163
- const schema = Object.keys(declaredSchema).length > 0
164
- ? declaredSchema
165
- : entry.type === "custom"
166
- ? {
167
- type: "object",
168
- properties: { input: { type: "string" } },
169
- required: ["input"],
170
- additionalProperties: false,
171
- }
172
- : { type: "object", properties: {}, additionalProperties: false };
173
- tools[name] = dynamicTool({
174
- description: stringValue(fn.description) ?? stringValue(entry.description),
175
- inputSchema: jsonSchema(schema),
176
- });
177
- }
178
- return tools;
179
- }
180
- function toolResultMessage(callId, toolName, output) {
181
- return {
182
- role: "tool",
183
- content: [
184
- {
185
- type: "tool-result",
186
- toolCallId: callId,
187
- toolName,
188
- output: { type: "text", value: contentText(output) },
189
- },
190
- ],
191
- };
192
- }
193
- function numberSetting(body, ...names) {
194
- for (const name of names) {
195
- const value = finiteNumber(body[name]);
196
- if (value !== undefined)
197
- return { maxOutputTokens: Math.floor(value) };
198
- }
199
- return {};
200
- }
201
- function parseToolInput(value) {
202
- if (typeof value !== "string")
203
- return value ?? {};
204
- try {
205
- return JSON.parse(value);
206
- }
207
- catch {
208
- return { input: value };
209
- }
210
- }
211
- function contentText(value) {
212
- if (typeof value === "string")
213
- return value;
214
- if (!Array.isArray(value)) {
215
- const text = stringValue(record(value).text);
216
- return text ?? (value === undefined || value === null ? "" : JSON.stringify(value));
217
- }
218
- return value
219
- .map((part) => {
220
- if (typeof part === "string")
221
- return part;
222
- const item = record(part);
223
- return (stringValue(item.text) ?? stringValue(item.output_text) ?? stringValue(item.input_text));
224
- })
225
- .filter((text) => text !== undefined)
226
- .join("");
227
- }
228
- function messageRole(value) {
229
- if (value === "system" || value === "developer")
230
- return "system";
231
- if (value === "user" || value === "assistant")
232
- return value;
233
- return undefined;
234
- }
235
- function arrayRecords(value) {
236
- return Array.isArray(value)
237
- ? value.filter((item) => object.isRecord(item))
238
- : [];
239
- }
240
- function record(value) {
241
- return object.isRecord(value) ? value : {};
242
- }
243
- function stringValue(value) {
244
- return typeof value === "string" ? value : undefined;
245
- }
246
- function finiteNumber(value) {
247
- return typeof value === "number" && Number.isFinite(value) ? value : undefined;
248
- }
249
- function consolidateSystemMessages(messages) {
250
- const system = messages
251
- .filter((message) => message.role === "system")
252
- .map((message) => (typeof message.content === "string" ? message.content : ""))
253
- .filter(Boolean)
254
- .join("\n\n");
255
- return [
256
- ...(system ? [{ role: "system", content: system }] : []),
257
- ...messages.filter((message) => message.role !== "system"),
258
- ];
259
- }
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3RvY29scy9kZWNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBbUMsTUFBTSxJQUFJLENBQUM7QUFXOUUsbUZBQW1GO0FBQ25GLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsUUFBd0IsRUFDeEIsSUFBdUM7SUFFdkMsTUFBTSxRQUFRLEdBQ1osUUFBUSxLQUFLLGtCQUFrQjtRQUM3QixDQUFDLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxRQUFRLEtBQUssb0JBQW9CO1lBQ2pDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUM7WUFDL0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLE9BQU87UUFDTCxRQUFRLEVBQUUseUJBQXlCLENBQUMsUUFBUSxDQUFDO1FBQzdDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM5QixHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixDQUFDO1FBQ2pGLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVM7WUFDOUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDakQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFB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LEVBQUUsQ0FBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVFLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7S0FDM0QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dGVybmFsIE9wZW5BSSBhbmQgQW50aHJvcGljIHJlcXVlc3QgZGVjb2RlcnMgZm9yIEFJIFNESyBmYWxsYmFjayByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IENsaWVudFByb3RvY29sIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB7IGR5bmFtaWNUb29sLCBqc29uU2NoZW1hLCB0eXBlIE1vZGVsTWVzc2FnZSwgdHlwZSBUb29sU2V0IH0gZnJvbSBcImFpXCI7XG5cbi8qKiBBSSBTREsgY2FsbCBzZXR0aW5ncyBkZWNvZGVkIGZyb20gYSBnYXRld2F5IHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIERlY29kZWRHYXRld2F5UmVxdWVzdCB7XG4gIHJlYWRvbmx5IG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgcmVhZG9ubHkgdG9vbHM6IFRvb2xTZXQ7XG4gIHJlYWRvbmx5IG1heE91dHB1dFRva2Vucz86IG51bWJlcjtcbiAgcmVhZG9ubHkgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvcFA/OiBudW1iZXI7XG59XG5cbi8qKiBEZWNvZGUgb25lIHN1cHBvcnRlZCBleHRlcm5hbCBwcm90b2NvbCBpbnRvIEFJIFNESyBtb2RlbCBtZXNzYWdlcyBhbmQgdG9vbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlR2F0ZXdheVJlcXVlc3QoXG4gIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogRGVjb2RlZEdhdGV3YXlSZXF1ZXN0IHtcbiAgY29uc3QgbWVzc2FnZXMgPVxuICAgIHByb3RvY29sID09PSBcIm9wZW5haS1yZXNwb25zZXNcIlxuICAgICAgPyBkZWNvZGVSZXNwb25zZXNNZXNzYWdlcyhib2R5KVxuICAgICAgOiBwcm90b2NvbCA9PT0gXCJhbnRocm9waWMtbWVzc2FnZXNcIlxuICAgICAgICA/IGRlY29kZUFudGhyb3BpY01lc3NhZ2VzKGJvZHkpXG4gICAgICAgIDogZGVjb2RlQ2hhdE1lc3NhZ2VzKGJvZHkpO1xuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzOiBjb25zb2xpZGF0ZVN5c3RlbU1lc3NhZ2VzKG1lc3NhZ2VzKSxcbiAgICB0b29sczogZGVjb2RlVG9vbHMoYm9keS50b29scyksXG4gICAgLi4ubnVtYmVyU2V0dGluZyhib2R5LCBcIm1heF9vdXRwdXRfdG9rZW5zXCIsIFwibWF4X3Rva2Vuc1wiLCBcIm1heF90b2tlbnNfdG9fc2FtcGxlXCIpLFxuICAgIC4uLihmaW5pdGVOdW1iZXIoYm9keS50ZW1wZXJhdHVyZSkgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHRlbXBlcmF0dXJlOiBmaW5pdGVOdW1iZXIoYm9keS50ZW1wZXJhdHVyZSkgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKGZpbml0ZU51bWJlcihib2R5LnRvcF9wKSAhPT0gdW5kZWZpbmVkID8geyB0b3BQOiBmaW5pdGVOdW1iZXIoYm9keS50b3BfcCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUmVzcG9uc2VzTWVzc2FnZXMoYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBtZXNzYWdlczogTW9kZWxNZXNzYWdlW10gPSBbXTtcbiAgaWYgKHR5cGVvZiBib2R5Lmluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIiAmJiBib2R5Lmluc3RydWN0aW9ucy50cmltKCkpIHtcbiAgICBtZXNzYWdlcy5wdXNoKHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogYm9keS5pbnN0cnVjdGlvbnMgfSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBib2R5LmlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgbWVzc2FnZXMucHVzaCh7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiBib2R5LmlucHV0IH0pO1xuICAgIHJldHVybiBtZXNzYWdlcztcbiAgfVxuICBjb25zdCB0b29sTmFtZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXlSZWNvcmRzKGJvZHkuaW5wdXQpKSB7XG4gICAgY29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcbiAgICBpZiAodHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIgfHwgdHlwZSA9PT0gXCJjdXN0b21fdG9vbF9jYWxsXCIpIHtcbiAgICAgIGNvbnN0IGNhbGxJZCA9IHN0cmluZ1ZhbHVlKGl0ZW0uY2FsbF9pZCkgPz8gc3RyaW5nVmFsdWUoaXRlbS5pZCkgPz8gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICAgIGNvbnN0IHRvb2xOYW1lID0gc3RyaW5nVmFsdWUoaXRlbS5uYW1lKSA/PyBcInRvb2xcIjtcbiAgICAgIHRvb2xOYW1lcy5zZXQoY2FsbElkLCB0b29sTmFtZSk7XG4gICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBjYWxsSWQsXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXJzZVRvb2xJbnB1dChpdGVtLmFyZ3VtZW50cyA/PyBpdGVtLmlucHV0KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSBhcyBNb2RlbE1lc3NhZ2UpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBcImZ1bmN0aW9uX2NhbGxfb3V0cHV0XCIgfHwgdHlwZSA9PT0gXCJjdXN0b21fdG9vbF9jYWxsX291dHB1dFwiKSB7XG4gICAgICBjb25zdCBjYWxsSWQgPSBzdHJpbmdWYWx1ZShpdGVtLmNhbGxfaWQpID8/IHN0cmluZ1ZhbHVlKGl0ZW0uaWQpID8/IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICBtZXNzYWdlcy5wdXNoKHRvb2xSZXN1bHRNZXNzYWdlKGNhbGxJZCwgdG9vbE5hbWVzLmdldChjYWxsSWQpID8/IFwidG9vbFwiLCBpdGVtLm91dHB1dCkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJvbGUgPSBtZXNzYWdlUm9sZShpdGVtLnJvbGUpO1xuICAgIGlmIChyb2xlKSBtZXNzYWdlcy5wdXNoKHsgcm9sZSwgY29udGVudDogY29udGVudFRleHQoaXRlbS5jb250ZW50KSB9IGFzIE1vZGVsTWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVDaGF0TWVzc2FnZXMoYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBtZXNzYWdlczogTW9kZWxNZXNzYWdlW10gPSBbXTtcbiAgY29uc3QgdG9vbE5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGFycmF5UmVjb3Jkcyhib2R5Lm1lc3NhZ2VzKSkge1xuICAgIGNvbnN0IHJvbGUgPSBzdHJpbmdWYWx1ZShtZXNzYWdlLnJvbGUpO1xuICAgIGlmIChyb2xlID09PSBcInRvb2xcIikge1xuICAgICAgY29uc3QgY2FsbElkID0gc3RyaW5nVmFsdWUobWVzc2FnZS50b29sX2NhbGxfaWQpID8/IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICBtZXNzYWdlcy5wdXNoKHRvb2xSZXN1bHRNZXNzYWdlKGNhbGxJZCwgdG9vbE5hbWVzLmdldChjYWxsSWQpID8/IFwidG9vbFwiLCBtZXNzYWdlLmNvbnRlbnQpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBBcnJheS5pc0FycmF5KG1lc3NhZ2UudG9vbF9jYWxscykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcbiAgICAgIGNvbnN0IHRleHQgPSBjb250ZW50VGV4dChtZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgaWYgKHRleHQpIGNvbnRlbnQucHVzaCh7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH0pO1xuICAgICAgZm9yIChjb25zdCB0b29sQ2FsbCBvZiBhcnJheVJlY29yZHMobWVzc2FnZS50b29sX2NhbGxzKSkge1xuICAgICAgICBjb25zdCBmbiA9IHJlY29yZCh0b29sQ2FsbC5mdW5jdGlvbik7XG4gICAgICAgIGNvbnN0IGNhbGxJZCA9IHN0cmluZ1ZhbHVlKHRvb2xDYWxsLmlkKSA/PyBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHN0cmluZ1ZhbHVlKGZuLm5hbWUpID8/IFwidG9vbFwiO1xuICAgICAgICB0b29sTmFtZXMuc2V0KGNhbGxJZCwgdG9vbE5hbWUpO1xuICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgdG9vbENhbGxJZDogY2FsbElkLFxuICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgIGlucHV0OiBwYXJzZVRvb2xJbnB1dChmbi5hcmd1bWVudHMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50IH0gYXMgTW9kZWxNZXNzYWdlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gbWVzc2FnZVJvbGUocm9sZSk7XG4gICAgaWYgKG5vcm1hbGl6ZWQpIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBub3JtYWxpemVkLCBjb250ZW50OiBjb250ZW50VGV4dChtZXNzYWdlLmNvbnRlbnQpIH0pO1xuICB9XG4gIHJldHVybiBtZXNzYWdlcztcbn1cblxuZnVuY3Rpb24gZGVjb2RlQW50aHJvcGljTWVzc2FnZXMoYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogTW9kZWxNZXNzYWdlW10ge1xuICBjb25zdCBtZXNzYWdlczogTW9kZWxNZXNzYWdlW10gPSBbXTtcbiAgaWYgKGJvZHkuc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzeXN0ZW0gPSBjb250ZW50VGV4dChib2R5LnN5c3RlbSk7XG4gICAgaWYgKHN5c3RlbSkgbWVzc2FnZXMucHVzaCh7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN5c3RlbSB9KTtcbiAgfVxuICBjb25zdCB0b29sTmFtZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgYXJyYXlSZWNvcmRzKGJvZHkubWVzc2FnZXMpKSB7XG4gICAgY29uc3Qgcm9sZSA9IHN0cmluZ1ZhbHVlKG1lc3NhZ2Uucm9sZSk7XG4gICAgY29uc3QgcGFydHMgPSBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkgPyBtZXNzYWdlLmNvbnRlbnQgOiBbXTtcbiAgICBpZiAocm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgICAgY29uc3QgY29udGVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgIGlmICghcmVjb3JkKHBhcnQpLnR5cGUgfHwgcmVjb3JkKHBhcnQpLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGNvbnRlbnRUZXh0KHBhcnQpO1xuICAgICAgICAgIGlmICh0ZXh0KSBjb250ZW50LnB1c2goeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZChwYXJ0KTtcbiAgICAgICAgaWYgKHZhbHVlLnR5cGUgIT09IFwidG9vbF91c2VcIikgY29udGludWU7XG4gICAgICAgIGNvbnN0IGNhbGxJZCA9IHN0cmluZ1ZhbHVlKHZhbHVlLmlkKSA/PyBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHN0cmluZ1ZhbHVlKHZhbHVlLm5hbWUpID8/IFwidG9vbFwiO1xuICAgICAgICB0b29sTmFtZXMuc2V0KGNhbGxJZCwgdG9vbE5hbWUpO1xuICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgdG9vbENhbGxJZDogY2FsbElkLFxuICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgIGlucHV0OiB2YWx1ZS5pbnB1dCA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBtZXNzYWdlcy5wdXNoKHsgcm9sZTogXCJhc3Npc3RhbnRcIiwgY29udGVudCB9IGFzIE1vZGVsTWVzc2FnZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdGV4dFBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmQocGFydCk7XG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gXCJ0b29sX3Jlc3VsdFwiKSB7XG4gICAgICAgIGNvbnN0IGNhbGxJZCA9IHN0cmluZ1ZhbHVlKHZhbHVlLnRvb2xfdXNlX2lkKSA/PyBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICBtZXNzYWdlcy5wdXNoKHRvb2xSZXN1bHRNZXNzYWdlKGNhbGxJZCwgdG9vbE5hbWVzLmdldChjYWxsSWQpID8/IFwidG9vbFwiLCB2YWx1ZS5jb250ZW50KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0ZXh0ID0gY29udGVudFRleHQocGFydCk7XG4gICAgICAgIGlmICh0ZXh0KSB0ZXh0UGFydHMucHVzaCh0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRleHRQYXJ0cy5sZW5ndGggPiAwKSBtZXNzYWdlcy5wdXNoKHsgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHRleHRQYXJ0cy5qb2luKFwiXFxuXCIpIH0pO1xuICB9XG4gIHJldHVybiBtZXNzYWdlcztcbn1cblxuZnVuY3Rpb24gZGVjb2RlVG9vbHModmFsdWU6IHVua25vd24pOiBUb29sU2V0IHtcbiAgY29uc3QgdG9vbHM6IFRvb2xTZXQgPSB7fTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhcnJheVJlY29yZHModmFsdWUpKSB7XG4gICAgY29uc3QgZm4gPSByZWNvcmQoZW50cnkuZnVuY3Rpb24pO1xuICAgIGNvbnN0IG5hbWUgPSBzdHJpbmdWYWx1ZShmbi5uYW1lKSA/PyBzdHJpbmdWYWx1ZShlbnRyeS5uYW1lKTtcbiAgICBpZiAoIW5hbWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlY2xhcmVkU2NoZW1hID0gcmVjb3JkKGZuLnBhcmFtZXRlcnMgPz8gZW50cnkuaW5wdXRfc2NoZW1hKTtcbiAgICBjb25zdCBzY2hlbWEgPVxuICAgICAgT2JqZWN0LmtleXMoZGVjbGFyZWRTY2hlbWEpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBkZWNsYXJlZFNjaGVtYVxuICAgICAgICA6IGVudHJ5LnR5cGUgPT09IFwiY3VzdG9tXCJcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgcHJvcGVydGllczogeyBpbnB1dDogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IFtcImlucHV0XCJdLFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7IHR5cGU6IFwib2JqZWN0XCIsIHByb3BlcnRpZXM6IHt9LCBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UgfTtcbiAgICB0b29sc1tuYW1lXSA9IGR5bmFtaWNUb29sKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdWYWx1ZShmbi5kZXNjcmlwdGlvbikgPz8gc3RyaW5nVmFsdWUoZW50cnkuZGVzY3JpcHRpb24pLFxuICAgICAgaW5wdXRTY2hlbWE6IGpzb25TY2hlbWEoc2NoZW1hKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbmZ1bmN0aW9uIHRvb2xSZXN1bHRNZXNzYWdlKGNhbGxJZDogc3RyaW5nLCB0b29sTmFtZTogc3RyaW5nLCBvdXRwdXQ6IHVua25vd24pOiBNb2RlbE1lc3NhZ2Uge1xuICByZXR1cm4ge1xuICAgIHJvbGU6IFwidG9vbFwiLFxuICAgIGNvbnRlbnQ6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICB0b29sQ2FsbElkOiBjYWxsSWQsXG4gICAgICAgIHRvb2xOYW1lLFxuICAgICAgICBvdXRwdXQ6IHsgdHlwZTogXCJ0ZXh0XCIsIHZhbHVlOiBjb250ZW50VGV4dChvdXRwdXQpIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0gYXMgTW9kZWxNZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBudW1iZXJTZXR0aW5nKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIC4uLm5hbWVzOiByZWFkb25seSBzdHJpbmdbXVxuKTogUGljazxEZWNvZGVkR2F0ZXdheVJlcXVlc3QsIFwibWF4T3V0cHV0VG9rZW5zXCI+IHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBmaW5pdGVOdW1iZXIoYm9keVtuYW1lXSk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiB7IG1heE91dHB1dFRva2VuczogTWF0aC5mbG9vcih2YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIHBhcnNlVG9vbElucHV0KHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZSA/PyB7fTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGlucHV0OiB2YWx1ZSB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRlbnRUZXh0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgdGV4dCA9IHN0cmluZ1ZhbHVlKHJlY29yZCh2YWx1ZSkudGV4dCk7XG4gICAgcmV0dXJuIHRleHQgPz8gKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyBcIlwiIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gdmFsdWVcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBwYXJ0O1xuICAgICAgY29uc3QgaXRlbSA9IHJlY29yZChwYXJ0KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN0cmluZ1ZhbHVlKGl0ZW0udGV4dCkgPz8gc3RyaW5nVmFsdWUoaXRlbS5vdXRwdXRfdGV4dCkgPz8gc3RyaW5nVmFsdWUoaXRlbS5pbnB1dF90ZXh0KVxuICAgICAgKTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHRleHQpOiB0ZXh0IGlzIHN0cmluZyA9PiB0ZXh0ICE9PSB1bmRlZmluZWQpXG4gICAgLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2VSb2xlKHZhbHVlOiB1bmtub3duKTogXCJzeXN0ZW1cIiB8IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIiB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gXCJzeXN0ZW1cIiB8fCB2YWx1ZSA9PT0gXCJkZXZlbG9wZXJcIikgcmV0dXJuIFwic3lzdGVtXCI7XG4gIGlmICh2YWx1ZSA9PT0gXCJ1c2VyXCIgfHwgdmFsdWUgPT09IFwiYXNzaXN0YW50XCIpIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXJyYXlSZWNvcmRzKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiBvYmplY3QuaXNSZWNvcmQoaXRlbSkpXG4gICAgOiBbXTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1ZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29uc29saWRhdGVTeXN0ZW1NZXNzYWdlcyhtZXNzYWdlczogcmVhZG9ubHkgTW9kZWxNZXNzYWdlW10pOiBNb2RlbE1lc3NhZ2VbXSB7XG4gIGNvbnN0IHN5c3RlbSA9IG1lc3NhZ2VzXG4gICAgLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS5yb2xlID09PSBcInN5c3RlbVwiKVxuICAgIC5tYXAoKG1lc3NhZ2UpID0+ICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiID8gbWVzc2FnZS5jb250ZW50IDogXCJcIikpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiXFxuXFxuXCIpO1xuICByZXR1cm4gW1xuICAgIC4uLihzeXN0ZW0gPyAoW3sgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogc3lzdGVtIH1dIGFzIE1vZGVsTWVzc2FnZVtdKSA6IFtdKSxcbiAgICAuLi5tZXNzYWdlcy5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2Uucm9sZSAhPT0gXCJzeXN0ZW1cIiksXG4gIF07XG59XG4iXX0=
@@ -1,18 +0,0 @@
1
- /**
2
- * Streaming and buffered protocol encoders for AI SDK fallback results.
3
- *
4
- * @module
5
- */
6
- import type { ClientProtocol } from "@dbx-tools/shared-model-gateway";
7
- import type { FinishReason, LanguageModelUsage, TextStreamPart, ToolSet, TypedToolCall } from "ai";
8
- /** Completed AI SDK generation data used by non-streaming encoders. */
9
- export interface CompletedGeneration {
10
- readonly text: string;
11
- readonly toolCalls: readonly TypedToolCall<ToolSet>[];
12
- readonly usage: LanguageModelUsage;
13
- readonly finishReason: FinishReason;
14
- }
15
- /** Encode AI SDK events as the requested protocol while preserving backpressure. */
16
- export declare function encodeGatewayStream(protocol: ClientProtocol, model: string, source: AsyncIterable<TextStreamPart<ToolSet>>): ReadableStream<Uint8Array>;
17
- /** Encode a completed AI SDK generation as one protocol-native JSON response. */
18
- export declare function encodeGatewayResponse(protocol: ClientProtocol, model: string, generation: CompletedGeneration): Record<string, unknown>;