@dbx-tools/appkit-model-gateway 0.9.99 → 0.9.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/index.ts +1 -5
- package/lib/index.d.ts +1 -5
- package/lib/index.js +2 -4
- package/lib/src/translation.js +17 -69
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -10
- package/src/translation.ts +20 -70
- package/lib/src/protocols/decode.d.ts +0 -17
- package/lib/src/protocols/decode.js +0 -260
- package/lib/src/protocols/encode.d.ts +0 -18
- package/lib/src/protocols/encode.js +0 -498
- package/src/protocols/decode.ts +0 -278
- package/src/protocols/encode.ts +0 -515
|
@@ -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>;
|