@providerprotocol/ai 0.0.33 → 0.0.35
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 +542 -3
- package/dist/anthropic/index.d.ts +2 -1
- package/dist/anthropic/index.js +151 -145
- package/dist/anthropic/index.js.map +1 -1
- package/dist/cerebras/index.d.ts +392 -0
- package/dist/cerebras/index.js +648 -0
- package/dist/cerebras/index.js.map +1 -0
- package/dist/chunk-3GWM5GR3.js +153 -0
- package/dist/chunk-3GWM5GR3.js.map +1 -0
- package/dist/chunk-4OGB7JZA.js +157 -0
- package/dist/chunk-4OGB7JZA.js.map +1 -0
- package/dist/chunk-7DXVRILR.js +49 -0
- package/dist/chunk-7DXVRILR.js.map +1 -0
- package/dist/{chunk-3C7O2RNO.js → chunk-A2IM7PGT.js} +6 -4
- package/dist/{chunk-3C7O2RNO.js.map → chunk-A2IM7PGT.js.map} +1 -1
- package/dist/{chunk-3D6XGGVG.js → chunk-ARVM24K2.js} +2 -2
- package/dist/{chunk-4J6OFUKX.js → chunk-AY55T37A.js} +70 -162
- package/dist/chunk-AY55T37A.js.map +1 -0
- package/dist/{chunk-ILR2D5PN.js → chunk-BRP5XJ6Q.js} +2 -86
- package/dist/chunk-BRP5XJ6Q.js.map +1 -0
- package/dist/chunk-C4JP64VW.js +298 -0
- package/dist/chunk-C4JP64VW.js.map +1 -0
- package/dist/chunk-COS4ON4G.js +111 -0
- package/dist/chunk-COS4ON4G.js.map +1 -0
- package/dist/chunk-ETBFOLQN.js +34 -0
- package/dist/chunk-ETBFOLQN.js.map +1 -0
- package/dist/chunk-HB4ZIH3T.js +31 -0
- package/dist/chunk-HB4ZIH3T.js.map +1 -0
- package/dist/chunk-I53CI6ZZ.js +142 -0
- package/dist/chunk-I53CI6ZZ.js.map +1 -0
- package/dist/chunk-IDZOVWP3.js +29 -0
- package/dist/chunk-IDZOVWP3.js.map +1 -0
- package/dist/chunk-JA3UZALR.js +88 -0
- package/dist/chunk-JA3UZALR.js.map +1 -0
- package/dist/{chunk-WAKD3OO5.js → chunk-N5DX5JW3.js} +31 -31
- package/dist/chunk-N5DX5JW3.js.map +1 -0
- package/dist/chunk-OIEWDFQU.js +97 -0
- package/dist/chunk-OIEWDFQU.js.map +1 -0
- package/dist/{chunk-TOJCZMVU.js → chunk-PMK5LZ5Z.js} +40 -40
- package/dist/chunk-PMK5LZ5Z.js.map +1 -0
- package/dist/chunk-UFFJDYCE.js +94 -0
- package/dist/chunk-UFFJDYCE.js.map +1 -0
- package/dist/chunk-VGKZIGVI.js +222 -0
- package/dist/chunk-VGKZIGVI.js.map +1 -0
- package/dist/chunk-VOEWHQUB.js +31 -0
- package/dist/chunk-VOEWHQUB.js.map +1 -0
- package/dist/{chunk-KUPF5KHT.js → chunk-Y5H7C5J4.js} +2 -2
- package/dist/chunk-ZI67WIQS.js +30 -0
- package/dist/chunk-ZI67WIQS.js.map +1 -0
- package/dist/{embedding-D2BYIehX.d.ts → embedding-CW6SaOOz.d.ts} +1 -1
- package/dist/google/index.d.ts +2 -1
- package/dist/google/index.js +202 -199
- package/dist/google/index.js.map +1 -1
- package/dist/groq/index.d.ts +410 -0
- package/dist/groq/index.js +649 -0
- package/dist/groq/index.js.map +1 -0
- package/dist/http/index.d.ts +3 -2
- package/dist/http/index.js +5 -4
- package/dist/image-stream-C0ciACM2.d.ts +11 -0
- package/dist/index.d.ts +8 -118
- package/dist/index.js +518 -767
- package/dist/index.js.map +1 -1
- package/dist/{llm-BQJZj3cD.d.ts → llm-DwbUK7un.d.ts} +12 -1632
- package/dist/middleware/logging/index.d.ts +76 -0
- package/dist/middleware/logging/index.js +74 -0
- package/dist/middleware/logging/index.js.map +1 -0
- package/dist/middleware/parsed-object/index.d.ts +45 -0
- package/dist/middleware/parsed-object/index.js +73 -0
- package/dist/middleware/parsed-object/index.js.map +1 -0
- package/dist/middleware/pubsub/index.d.ts +104 -0
- package/dist/middleware/pubsub/index.js +230 -0
- package/dist/middleware/pubsub/index.js.map +1 -0
- package/dist/middleware/pubsub/server/express/index.d.ts +52 -0
- package/dist/middleware/pubsub/server/express/index.js +11 -0
- package/dist/middleware/pubsub/server/express/index.js.map +1 -0
- package/dist/middleware/pubsub/server/fastify/index.d.ts +53 -0
- package/dist/middleware/pubsub/server/fastify/index.js +11 -0
- package/dist/middleware/pubsub/server/fastify/index.js.map +1 -0
- package/dist/middleware/pubsub/server/h3/index.d.ts +56 -0
- package/dist/middleware/pubsub/server/h3/index.js +11 -0
- package/dist/middleware/pubsub/server/h3/index.js.map +1 -0
- package/dist/middleware/pubsub/server/index.d.ts +78 -0
- package/dist/middleware/pubsub/server/index.js +34 -0
- package/dist/middleware/pubsub/server/index.js.map +1 -0
- package/dist/middleware/pubsub/server/webapi/index.d.ts +53 -0
- package/dist/middleware/pubsub/server/webapi/index.js +11 -0
- package/dist/middleware/pubsub/server/webapi/index.js.map +1 -0
- package/dist/ollama/index.d.ts +2 -1
- package/dist/ollama/index.js +48 -45
- package/dist/ollama/index.js.map +1 -1
- package/dist/openai/index.d.ts +2 -1
- package/dist/openai/index.js +319 -313
- package/dist/openai/index.js.map +1 -1
- package/dist/openrouter/index.d.ts +2 -1
- package/dist/openrouter/index.js +379 -383
- package/dist/openrouter/index.js.map +1 -1
- package/dist/proxy/index.d.ts +10 -914
- package/dist/proxy/index.js +275 -1007
- package/dist/proxy/index.js.map +1 -1
- package/dist/proxy/server/express/index.d.ts +161 -0
- package/dist/proxy/server/express/index.js +24 -0
- package/dist/proxy/server/express/index.js.map +1 -0
- package/dist/proxy/server/fastify/index.d.ts +162 -0
- package/dist/proxy/server/fastify/index.js +24 -0
- package/dist/proxy/server/fastify/index.js.map +1 -0
- package/dist/proxy/server/h3/index.d.ts +189 -0
- package/dist/proxy/server/h3/index.js +28 -0
- package/dist/proxy/server/h3/index.js.map +1 -0
- package/dist/proxy/server/index.d.ts +151 -0
- package/dist/proxy/server/index.js +48 -0
- package/dist/proxy/server/index.js.map +1 -0
- package/dist/proxy/server/webapi/index.d.ts +278 -0
- package/dist/proxy/server/webapi/index.js +32 -0
- package/dist/proxy/server/webapi/index.js.map +1 -0
- package/dist/responses/index.d.ts +650 -0
- package/dist/responses/index.js +930 -0
- package/dist/responses/index.js.map +1 -0
- package/dist/{retry-8Ch-WWgX.d.ts → retry-YayV42GV.d.ts} +1 -1
- package/dist/stream-CecfVCPO.d.ts +1632 -0
- package/dist/types-C8Gciizr.d.ts +168 -0
- package/dist/utils/index.d.ts +53 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/xai/index.d.ts +2 -1
- package/dist/xai/index.js +310 -310
- package/dist/xai/index.js.map +1 -1
- package/package.json +94 -4
- package/dist/chunk-4J6OFUKX.js.map +0 -1
- package/dist/chunk-ILR2D5PN.js.map +0 -1
- package/dist/chunk-TOJCZMVU.js.map +0 -1
- package/dist/chunk-WAKD3OO5.js.map +0 -1
- /package/dist/{chunk-3D6XGGVG.js.map → chunk-ARVM24K2.js.map} +0 -0
- /package/dist/{chunk-KUPF5KHT.js.map → chunk-Y5H7C5J4.js.map} +0 -0
package/dist/openai/index.js
CHANGED
|
@@ -1,70 +1,42 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Image
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-N5DX5JW3.js";
|
|
4
|
+
import {
|
|
5
|
+
parseSSEStream
|
|
6
|
+
} from "../chunk-PMK5LZ5Z.js";
|
|
4
7
|
import {
|
|
5
8
|
parseJsonResponse
|
|
6
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-A2IM7PGT.js";
|
|
7
10
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
resolveApiKey
|
|
12
|
+
} from "../chunk-ARVM24K2.js";
|
|
13
|
+
import {
|
|
14
|
+
createProvider
|
|
15
|
+
} from "../chunk-JA3UZALR.js";
|
|
11
16
|
import {
|
|
12
17
|
AssistantMessage,
|
|
13
|
-
createProvider,
|
|
14
18
|
generateId,
|
|
15
19
|
isAssistantMessage,
|
|
16
20
|
isToolResultMessage,
|
|
17
21
|
isUserMessage
|
|
18
|
-
} from "../chunk-
|
|
19
|
-
import {
|
|
20
|
-
parseSSEStream
|
|
21
|
-
} from "../chunk-TOJCZMVU.js";
|
|
22
|
-
import {
|
|
23
|
-
resolveApiKey
|
|
24
|
-
} from "../chunk-3D6XGGVG.js";
|
|
22
|
+
} from "../chunk-BRP5XJ6Q.js";
|
|
25
23
|
import {
|
|
26
|
-
ErrorCode,
|
|
27
|
-
ModalityType,
|
|
28
|
-
UPPError,
|
|
29
24
|
doFetch,
|
|
30
25
|
doStreamFetch,
|
|
31
26
|
normalizeHttpError,
|
|
32
27
|
toError
|
|
33
|
-
} from "../chunk-
|
|
28
|
+
} from "../chunk-AY55T37A.js";
|
|
29
|
+
import {
|
|
30
|
+
ErrorCode,
|
|
31
|
+
ModalityType,
|
|
32
|
+
UPPError
|
|
33
|
+
} from "../chunk-COS4ON4G.js";
|
|
34
|
+
import {
|
|
35
|
+
StreamEventType,
|
|
36
|
+
objectDelta
|
|
37
|
+
} from "../chunk-6S222DHN.js";
|
|
34
38
|
|
|
35
39
|
// src/providers/openai/transform.completions.ts
|
|
36
|
-
function transformRequest(request, modelId) {
|
|
37
|
-
const params = request.params ?? {};
|
|
38
|
-
const openaiRequest = {
|
|
39
|
-
...params,
|
|
40
|
-
model: modelId,
|
|
41
|
-
messages: transformMessages(request.messages, request.system)
|
|
42
|
-
};
|
|
43
|
-
if (request.tools && request.tools.length > 0) {
|
|
44
|
-
openaiRequest.tools = request.tools.map(transformTool);
|
|
45
|
-
}
|
|
46
|
-
if (request.structure) {
|
|
47
|
-
const schema = {
|
|
48
|
-
type: "object",
|
|
49
|
-
properties: request.structure.properties,
|
|
50
|
-
required: request.structure.required,
|
|
51
|
-
...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
|
|
52
|
-
};
|
|
53
|
-
if (request.structure.description) {
|
|
54
|
-
schema.description = request.structure.description;
|
|
55
|
-
}
|
|
56
|
-
openaiRequest.response_format = {
|
|
57
|
-
type: "json_schema",
|
|
58
|
-
json_schema: {
|
|
59
|
-
name: "json_response",
|
|
60
|
-
description: request.structure.description,
|
|
61
|
-
schema,
|
|
62
|
-
strict: true
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return openaiRequest;
|
|
67
|
-
}
|
|
68
40
|
function normalizeSystem(system) {
|
|
69
41
|
if (system === void 0 || system === null) return void 0;
|
|
70
42
|
if (typeof system === "string") return system;
|
|
@@ -101,85 +73,9 @@ function normalizeSystem(system) {
|
|
|
101
73
|
}
|
|
102
74
|
return texts.length > 0 ? texts.join("\n\n") : void 0;
|
|
103
75
|
}
|
|
104
|
-
function transformMessages(messages, system) {
|
|
105
|
-
const result = [];
|
|
106
|
-
const normalizedSystem = normalizeSystem(system);
|
|
107
|
-
if (normalizedSystem) {
|
|
108
|
-
result.push({
|
|
109
|
-
role: "system",
|
|
110
|
-
content: normalizedSystem
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
for (const message of messages) {
|
|
114
|
-
if (isToolResultMessage(message)) {
|
|
115
|
-
const toolMessages = transformToolResults(message);
|
|
116
|
-
result.push(...toolMessages);
|
|
117
|
-
} else {
|
|
118
|
-
const transformed = transformMessage(message);
|
|
119
|
-
if (transformed) {
|
|
120
|
-
result.push(transformed);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return result;
|
|
125
|
-
}
|
|
126
76
|
function filterValidContent(content) {
|
|
127
77
|
return content.filter((c) => c && typeof c.type === "string");
|
|
128
78
|
}
|
|
129
|
-
function transformMessage(message) {
|
|
130
|
-
if (isUserMessage(message)) {
|
|
131
|
-
const validContent = filterValidContent(message.content);
|
|
132
|
-
if (validContent.length === 1 && validContent[0]?.type === "text") {
|
|
133
|
-
return {
|
|
134
|
-
role: "user",
|
|
135
|
-
content: validContent[0].text
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
return {
|
|
139
|
-
role: "user",
|
|
140
|
-
content: validContent.map(transformContentBlock)
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
if (isAssistantMessage(message)) {
|
|
144
|
-
const validContent = filterValidContent(message.content);
|
|
145
|
-
const textContent = validContent.filter((c) => c.type === "text").map((c) => c.text).join("");
|
|
146
|
-
const assistantMessage = {
|
|
147
|
-
role: "assistant",
|
|
148
|
-
content: textContent || null
|
|
149
|
-
};
|
|
150
|
-
if (message.toolCalls && message.toolCalls.length > 0) {
|
|
151
|
-
assistantMessage.tool_calls = message.toolCalls.map((call) => ({
|
|
152
|
-
id: call.toolCallId,
|
|
153
|
-
type: "function",
|
|
154
|
-
function: {
|
|
155
|
-
name: call.toolName,
|
|
156
|
-
arguments: JSON.stringify(call.arguments)
|
|
157
|
-
}
|
|
158
|
-
}));
|
|
159
|
-
}
|
|
160
|
-
return assistantMessage;
|
|
161
|
-
}
|
|
162
|
-
if (isToolResultMessage(message)) {
|
|
163
|
-
const results = message.results.map((result) => ({
|
|
164
|
-
role: "tool",
|
|
165
|
-
tool_call_id: result.toolCallId,
|
|
166
|
-
content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
|
|
167
|
-
}));
|
|
168
|
-
return results[0] ?? null;
|
|
169
|
-
}
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
function transformToolResults(message) {
|
|
173
|
-
if (!isToolResultMessage(message)) {
|
|
174
|
-
const single = transformMessage(message);
|
|
175
|
-
return single ? [single] : [];
|
|
176
|
-
}
|
|
177
|
-
return message.results.map((result) => ({
|
|
178
|
-
role: "tool",
|
|
179
|
-
tool_call_id: result.toolCallId,
|
|
180
|
-
content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
|
|
181
|
-
}));
|
|
182
|
-
}
|
|
183
79
|
function transformContentBlock(block) {
|
|
184
80
|
switch (block.type) {
|
|
185
81
|
case "text":
|
|
@@ -240,6 +136,82 @@ function transformContentBlock(block) {
|
|
|
240
136
|
throw new Error(`Unsupported content type: ${block.type}`);
|
|
241
137
|
}
|
|
242
138
|
}
|
|
139
|
+
function transformMessage(message) {
|
|
140
|
+
if (isUserMessage(message)) {
|
|
141
|
+
const validContent = filterValidContent(message.content);
|
|
142
|
+
if (validContent.length === 1 && validContent[0]?.type === "text") {
|
|
143
|
+
return {
|
|
144
|
+
role: "user",
|
|
145
|
+
content: validContent[0].text
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
role: "user",
|
|
150
|
+
content: validContent.map(transformContentBlock)
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (isAssistantMessage(message)) {
|
|
154
|
+
const validContent = filterValidContent(message.content);
|
|
155
|
+
const textContent = validContent.filter((c) => c.type === "text").map((c) => c.text).join("");
|
|
156
|
+
const assistantMessage = {
|
|
157
|
+
role: "assistant",
|
|
158
|
+
content: textContent || null
|
|
159
|
+
};
|
|
160
|
+
if (message.toolCalls && message.toolCalls.length > 0) {
|
|
161
|
+
assistantMessage.tool_calls = message.toolCalls.map((call) => ({
|
|
162
|
+
id: call.toolCallId,
|
|
163
|
+
type: "function",
|
|
164
|
+
function: {
|
|
165
|
+
name: call.toolName,
|
|
166
|
+
arguments: JSON.stringify(call.arguments)
|
|
167
|
+
}
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
return assistantMessage;
|
|
171
|
+
}
|
|
172
|
+
if (isToolResultMessage(message)) {
|
|
173
|
+
const results = message.results.map((result) => ({
|
|
174
|
+
role: "tool",
|
|
175
|
+
tool_call_id: result.toolCallId,
|
|
176
|
+
content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
|
|
177
|
+
}));
|
|
178
|
+
return results[0] ?? null;
|
|
179
|
+
}
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
function transformToolResults(message) {
|
|
183
|
+
if (!isToolResultMessage(message)) {
|
|
184
|
+
const single = transformMessage(message);
|
|
185
|
+
return single ? [single] : [];
|
|
186
|
+
}
|
|
187
|
+
return message.results.map((result) => ({
|
|
188
|
+
role: "tool",
|
|
189
|
+
tool_call_id: result.toolCallId,
|
|
190
|
+
content: typeof result.result === "string" ? result.result : JSON.stringify(result.result)
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
function transformMessages(messages, system) {
|
|
194
|
+
const result = [];
|
|
195
|
+
const normalizedSystem = normalizeSystem(system);
|
|
196
|
+
if (normalizedSystem) {
|
|
197
|
+
result.push({
|
|
198
|
+
role: "system",
|
|
199
|
+
content: normalizedSystem
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
for (const message of messages) {
|
|
203
|
+
if (isToolResultMessage(message)) {
|
|
204
|
+
const toolMessages = transformToolResults(message);
|
|
205
|
+
result.push(...toolMessages);
|
|
206
|
+
} else {
|
|
207
|
+
const transformed = transformMessage(message);
|
|
208
|
+
if (transformed) {
|
|
209
|
+
result.push(transformed);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
243
215
|
function extractToolOptions(tool) {
|
|
244
216
|
const openaiMeta = tool.metadata?.openai;
|
|
245
217
|
return { strict: openaiMeta?.strict };
|
|
@@ -261,6 +233,38 @@ function transformTool(tool) {
|
|
|
261
233
|
}
|
|
262
234
|
};
|
|
263
235
|
}
|
|
236
|
+
function transformRequest(request, modelId) {
|
|
237
|
+
const params = request.params ?? {};
|
|
238
|
+
const openaiRequest = {
|
|
239
|
+
...params,
|
|
240
|
+
model: modelId,
|
|
241
|
+
messages: transformMessages(request.messages, request.system)
|
|
242
|
+
};
|
|
243
|
+
if (request.tools && request.tools.length > 0) {
|
|
244
|
+
openaiRequest.tools = request.tools.map(transformTool);
|
|
245
|
+
}
|
|
246
|
+
if (request.structure) {
|
|
247
|
+
const schema = {
|
|
248
|
+
type: "object",
|
|
249
|
+
properties: request.structure.properties,
|
|
250
|
+
required: request.structure.required,
|
|
251
|
+
...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
|
|
252
|
+
};
|
|
253
|
+
if (request.structure.description) {
|
|
254
|
+
schema.description = request.structure.description;
|
|
255
|
+
}
|
|
256
|
+
openaiRequest.response_format = {
|
|
257
|
+
type: "json_schema",
|
|
258
|
+
json_schema: {
|
|
259
|
+
name: "json_response",
|
|
260
|
+
description: request.structure.description,
|
|
261
|
+
schema,
|
|
262
|
+
strict: true
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
return openaiRequest;
|
|
267
|
+
}
|
|
264
268
|
function transformResponse(data) {
|
|
265
269
|
const choice = data.choices[0];
|
|
266
270
|
if (!choice) {
|
|
@@ -640,10 +644,9 @@ function createCompletionsLLMHandler() {
|
|
|
640
644
|
}
|
|
641
645
|
const uppEvents = transformStreamEvent(chunk, state);
|
|
642
646
|
for (const event of uppEvents) {
|
|
647
|
+
yield event;
|
|
643
648
|
if (request.structure && event.type === StreamEventType.TextDelta) {
|
|
644
649
|
yield objectDelta(event.delta.text ?? "", event.index);
|
|
645
|
-
} else {
|
|
646
|
-
yield event;
|
|
647
650
|
}
|
|
648
651
|
}
|
|
649
652
|
}
|
|
@@ -669,44 +672,6 @@ function createCompletionsLLMHandler() {
|
|
|
669
672
|
}
|
|
670
673
|
|
|
671
674
|
// src/providers/openai/transform.responses.ts
|
|
672
|
-
function transformRequest2(request, modelId) {
|
|
673
|
-
const params = request.params ?? {};
|
|
674
|
-
const { tools: builtInTools, ...restParams } = params;
|
|
675
|
-
const openaiRequest = {
|
|
676
|
-
...restParams,
|
|
677
|
-
model: modelId,
|
|
678
|
-
input: transformInputItems(request.messages, request.system)
|
|
679
|
-
};
|
|
680
|
-
const functionTools = request.tools?.map(transformTool2) ?? [];
|
|
681
|
-
const allTools = [
|
|
682
|
-
...functionTools,
|
|
683
|
-
...builtInTools ?? []
|
|
684
|
-
];
|
|
685
|
-
if (allTools.length > 0) {
|
|
686
|
-
openaiRequest.tools = allTools;
|
|
687
|
-
}
|
|
688
|
-
if (request.structure) {
|
|
689
|
-
const schema = {
|
|
690
|
-
type: "object",
|
|
691
|
-
properties: request.structure.properties,
|
|
692
|
-
required: request.structure.required,
|
|
693
|
-
...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
|
|
694
|
-
};
|
|
695
|
-
if (request.structure.description) {
|
|
696
|
-
schema.description = request.structure.description;
|
|
697
|
-
}
|
|
698
|
-
openaiRequest.text = {
|
|
699
|
-
format: {
|
|
700
|
-
type: "json_schema",
|
|
701
|
-
name: "json_response",
|
|
702
|
-
description: request.structure.description,
|
|
703
|
-
schema,
|
|
704
|
-
strict: true
|
|
705
|
-
}
|
|
706
|
-
};
|
|
707
|
-
}
|
|
708
|
-
return openaiRequest;
|
|
709
|
-
}
|
|
710
675
|
function normalizeSystem2(system) {
|
|
711
676
|
if (system === void 0 || system === null) return void 0;
|
|
712
677
|
if (typeof system === "string") return system;
|
|
@@ -743,30 +708,69 @@ function normalizeSystem2(system) {
|
|
|
743
708
|
}
|
|
744
709
|
return texts.length > 0 ? texts.join("\n\n") : void 0;
|
|
745
710
|
}
|
|
746
|
-
function
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
711
|
+
function filterValidContent2(content) {
|
|
712
|
+
return content.filter((c) => c && typeof c.type === "string");
|
|
713
|
+
}
|
|
714
|
+
function transformContentPart(block) {
|
|
715
|
+
switch (block.type) {
|
|
716
|
+
case "text":
|
|
717
|
+
return { type: "input_text", text: block.text };
|
|
718
|
+
case "image": {
|
|
719
|
+
const imageBlock = block;
|
|
720
|
+
if (imageBlock.source.type === "base64") {
|
|
721
|
+
return {
|
|
722
|
+
type: "input_image",
|
|
723
|
+
image_url: `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
if (imageBlock.source.type === "url") {
|
|
727
|
+
return {
|
|
728
|
+
type: "input_image",
|
|
729
|
+
image_url: imageBlock.source.url
|
|
730
|
+
};
|
|
731
|
+
}
|
|
732
|
+
if (imageBlock.source.type === "bytes") {
|
|
733
|
+
const base64 = Buffer.from(imageBlock.source.data).toString("base64");
|
|
734
|
+
return {
|
|
735
|
+
type: "input_image",
|
|
736
|
+
image_url: `data:${imageBlock.mimeType};base64,${base64}`
|
|
737
|
+
};
|
|
738
|
+
}
|
|
739
|
+
throw new Error("Unknown image source type");
|
|
740
|
+
}
|
|
741
|
+
case "document": {
|
|
742
|
+
const documentBlock = block;
|
|
743
|
+
if (documentBlock.mimeType !== "application/pdf") {
|
|
744
|
+
throw new UPPError(
|
|
745
|
+
"OpenAI Responses API only supports PDF documents",
|
|
746
|
+
ErrorCode.InvalidRequest,
|
|
747
|
+
"openai",
|
|
748
|
+
ModalityType.LLM
|
|
749
|
+
);
|
|
750
|
+
}
|
|
751
|
+
if (documentBlock.source.type === "base64") {
|
|
752
|
+
return {
|
|
753
|
+
type: "input_file",
|
|
754
|
+
filename: documentBlock.title ?? "document.pdf",
|
|
755
|
+
file_data: `data:application/pdf;base64,${documentBlock.source.data}`
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
if (documentBlock.source.type === "url") {
|
|
759
|
+
return {
|
|
760
|
+
type: "input_file",
|
|
761
|
+
file_url: documentBlock.source.url
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
throw new UPPError(
|
|
765
|
+
"Unknown document source type",
|
|
766
|
+
ErrorCode.InvalidRequest,
|
|
767
|
+
"openai",
|
|
768
|
+
ModalityType.LLM
|
|
769
|
+
);
|
|
764
770
|
}
|
|
771
|
+
default:
|
|
772
|
+
throw new Error(`Unsupported content type: ${block.type}`);
|
|
765
773
|
}
|
|
766
|
-
return result;
|
|
767
|
-
}
|
|
768
|
-
function filterValidContent2(content) {
|
|
769
|
-
return content.filter((c) => c && typeof c.type === "string");
|
|
770
774
|
}
|
|
771
775
|
function transformMessage2(message) {
|
|
772
776
|
if (isUserMessage(message)) {
|
|
@@ -848,66 +852,27 @@ function transformMessage2(message) {
|
|
|
848
852
|
}
|
|
849
853
|
return [];
|
|
850
854
|
}
|
|
851
|
-
function
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
if (imageBlock.source.type === "bytes") {
|
|
870
|
-
const base64 = Buffer.from(imageBlock.source.data).toString("base64");
|
|
871
|
-
return {
|
|
872
|
-
type: "input_image",
|
|
873
|
-
image_url: `data:${imageBlock.mimeType};base64,${base64}`
|
|
874
|
-
};
|
|
875
|
-
}
|
|
876
|
-
throw new Error("Unknown image source type");
|
|
877
|
-
}
|
|
878
|
-
case "document": {
|
|
879
|
-
const documentBlock = block;
|
|
880
|
-
if (documentBlock.mimeType !== "application/pdf") {
|
|
881
|
-
throw new UPPError(
|
|
882
|
-
"OpenAI Responses API only supports PDF documents",
|
|
883
|
-
ErrorCode.InvalidRequest,
|
|
884
|
-
"openai",
|
|
885
|
-
ModalityType.LLM
|
|
886
|
-
);
|
|
887
|
-
}
|
|
888
|
-
if (documentBlock.source.type === "base64") {
|
|
889
|
-
return {
|
|
890
|
-
type: "input_file",
|
|
891
|
-
filename: documentBlock.title ?? "document.pdf",
|
|
892
|
-
file_data: `data:application/pdf;base64,${documentBlock.source.data}`
|
|
893
|
-
};
|
|
894
|
-
}
|
|
895
|
-
if (documentBlock.source.type === "url") {
|
|
896
|
-
return {
|
|
897
|
-
type: "input_file",
|
|
898
|
-
file_url: documentBlock.source.url
|
|
899
|
-
};
|
|
900
|
-
}
|
|
901
|
-
throw new UPPError(
|
|
902
|
-
"Unknown document source type",
|
|
903
|
-
ErrorCode.InvalidRequest,
|
|
904
|
-
"openai",
|
|
905
|
-
ModalityType.LLM
|
|
906
|
-
);
|
|
855
|
+
function transformInputItems(messages, system) {
|
|
856
|
+
const result = [];
|
|
857
|
+
const normalizedSystem = normalizeSystem2(system);
|
|
858
|
+
if (normalizedSystem) {
|
|
859
|
+
result.push({
|
|
860
|
+
type: "message",
|
|
861
|
+
role: "system",
|
|
862
|
+
content: normalizedSystem
|
|
863
|
+
});
|
|
864
|
+
}
|
|
865
|
+
for (const message of messages) {
|
|
866
|
+
const items = transformMessage2(message);
|
|
867
|
+
result.push(...items);
|
|
868
|
+
}
|
|
869
|
+
if (result.length === 1 && result[0]?.type === "message") {
|
|
870
|
+
const item = result[0];
|
|
871
|
+
if (item.role === "user" && typeof item.content === "string") {
|
|
872
|
+
return item.content;
|
|
907
873
|
}
|
|
908
|
-
default:
|
|
909
|
-
throw new Error(`Unsupported content type: ${block.type}`);
|
|
910
874
|
}
|
|
875
|
+
return result;
|
|
911
876
|
}
|
|
912
877
|
function extractToolOptions2(tool) {
|
|
913
878
|
const openaiMeta = tool.metadata?.openai;
|
|
@@ -928,6 +893,44 @@ function transformTool2(tool) {
|
|
|
928
893
|
...strict !== void 0 ? { strict } : {}
|
|
929
894
|
};
|
|
930
895
|
}
|
|
896
|
+
function transformRequest2(request, modelId) {
|
|
897
|
+
const params = request.params ?? {};
|
|
898
|
+
const { tools: builtInTools, ...restParams } = params;
|
|
899
|
+
const openaiRequest = {
|
|
900
|
+
...restParams,
|
|
901
|
+
model: modelId,
|
|
902
|
+
input: transformInputItems(request.messages, request.system)
|
|
903
|
+
};
|
|
904
|
+
const functionTools = request.tools?.map(transformTool2) ?? [];
|
|
905
|
+
const allTools = [
|
|
906
|
+
...functionTools,
|
|
907
|
+
...builtInTools ?? []
|
|
908
|
+
];
|
|
909
|
+
if (allTools.length > 0) {
|
|
910
|
+
openaiRequest.tools = allTools;
|
|
911
|
+
}
|
|
912
|
+
if (request.structure) {
|
|
913
|
+
const schema = {
|
|
914
|
+
type: "object",
|
|
915
|
+
properties: request.structure.properties,
|
|
916
|
+
required: request.structure.required,
|
|
917
|
+
...request.structure.additionalProperties !== void 0 ? { additionalProperties: request.structure.additionalProperties } : { additionalProperties: false }
|
|
918
|
+
};
|
|
919
|
+
if (request.structure.description) {
|
|
920
|
+
schema.description = request.structure.description;
|
|
921
|
+
}
|
|
922
|
+
openaiRequest.text = {
|
|
923
|
+
format: {
|
|
924
|
+
type: "json_schema",
|
|
925
|
+
name: "json_response",
|
|
926
|
+
description: request.structure.description,
|
|
927
|
+
schema,
|
|
928
|
+
strict: true
|
|
929
|
+
}
|
|
930
|
+
};
|
|
931
|
+
}
|
|
932
|
+
return openaiRequest;
|
|
933
|
+
}
|
|
931
934
|
function transformResponse2(data) {
|
|
932
935
|
const content = [];
|
|
933
936
|
const toolCalls = [];
|
|
@@ -1005,7 +1008,6 @@ function transformResponse2(data) {
|
|
|
1005
1008
|
status: data.status,
|
|
1006
1009
|
response_id: responseId,
|
|
1007
1010
|
functionCallItems: functionCallItems.length > 0 ? functionCallItems : void 0,
|
|
1008
|
-
// Store encrypted reasoning content for multi-turn context (stateless mode)
|
|
1009
1011
|
reasoningEncryptedContent
|
|
1010
1012
|
}
|
|
1011
1013
|
}
|
|
@@ -1489,10 +1491,9 @@ function createResponsesLLMHandler() {
|
|
|
1489
1491
|
}
|
|
1490
1492
|
const uppEvents = transformStreamEvent2(event, state);
|
|
1491
1493
|
for (const uppEvent of uppEvents) {
|
|
1494
|
+
yield uppEvent;
|
|
1492
1495
|
if (request.structure && uppEvent.type === StreamEventType.TextDelta) {
|
|
1493
1496
|
yield objectDelta(uppEvent.delta.text ?? "", uppEvent.index);
|
|
1494
|
-
} else {
|
|
1495
|
-
yield uppEvent;
|
|
1496
1497
|
}
|
|
1497
1498
|
}
|
|
1498
1499
|
}
|
|
@@ -1624,41 +1625,34 @@ function getCapabilities(modelId) {
|
|
|
1624
1625
|
maxImages: isDalle2 ? 10 : isGptImage ? 10 : 1
|
|
1625
1626
|
};
|
|
1626
1627
|
}
|
|
1627
|
-
function
|
|
1628
|
-
|
|
1628
|
+
function transformResponse3(data) {
|
|
1629
|
+
const images = data.data.map((item) => {
|
|
1630
|
+
let image;
|
|
1631
|
+
if (item.b64_json) {
|
|
1632
|
+
image = Image.fromBase64(item.b64_json, "image/png");
|
|
1633
|
+
} else if (item.url) {
|
|
1634
|
+
image = Image.fromUrl(item.url, "image/png");
|
|
1635
|
+
} else {
|
|
1636
|
+
throw new UPPError(
|
|
1637
|
+
"No image data in response",
|
|
1638
|
+
ErrorCode.ProviderError,
|
|
1639
|
+
"openai",
|
|
1640
|
+
ModalityType.Image
|
|
1641
|
+
);
|
|
1642
|
+
}
|
|
1643
|
+
return {
|
|
1644
|
+
image,
|
|
1645
|
+
metadata: item.revised_prompt ? { openai: { revised_prompt: item.revised_prompt } } : void 0
|
|
1646
|
+
};
|
|
1647
|
+
});
|
|
1629
1648
|
return {
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
ErrorCode.InvalidRequest,
|
|
1638
|
-
"openai",
|
|
1639
|
-
ModalityType.Image
|
|
1640
|
-
);
|
|
1641
|
-
}
|
|
1642
|
-
const capabilities = getCapabilities(modelId);
|
|
1643
|
-
const model = {
|
|
1644
|
-
modelId,
|
|
1645
|
-
capabilities,
|
|
1646
|
-
get provider() {
|
|
1647
|
-
return providerRef;
|
|
1648
|
-
},
|
|
1649
|
-
async generate(request) {
|
|
1650
|
-
return executeGenerate(modelId, request);
|
|
1651
|
-
},
|
|
1652
|
-
async edit(request) {
|
|
1653
|
-
return executeEdit(modelId, request);
|
|
1654
|
-
}
|
|
1655
|
-
};
|
|
1656
|
-
if (capabilities.streaming) {
|
|
1657
|
-
model.stream = function(request) {
|
|
1658
|
-
return executeStream(modelId, request);
|
|
1659
|
-
};
|
|
1660
|
-
}
|
|
1661
|
-
return model;
|
|
1649
|
+
images,
|
|
1650
|
+
usage: data.usage ? {
|
|
1651
|
+
imagesGenerated: images.length,
|
|
1652
|
+
inputTokens: data.usage.input_tokens,
|
|
1653
|
+
outputTokens: data.usage.output_tokens
|
|
1654
|
+
} : {
|
|
1655
|
+
imagesGenerated: images.length
|
|
1662
1656
|
}
|
|
1663
1657
|
};
|
|
1664
1658
|
}
|
|
@@ -1895,35 +1889,41 @@ function executeStream(modelId, request) {
|
|
|
1895
1889
|
response: responsePromise
|
|
1896
1890
|
};
|
|
1897
1891
|
}
|
|
1898
|
-
function
|
|
1899
|
-
|
|
1900
|
-
let image;
|
|
1901
|
-
if (item.b64_json) {
|
|
1902
|
-
image = Image.fromBase64(item.b64_json, "image/png");
|
|
1903
|
-
} else if (item.url) {
|
|
1904
|
-
image = Image.fromUrl(item.url, "image/png");
|
|
1905
|
-
} else {
|
|
1906
|
-
throw new UPPError(
|
|
1907
|
-
"No image data in response",
|
|
1908
|
-
ErrorCode.ProviderError,
|
|
1909
|
-
"openai",
|
|
1910
|
-
ModalityType.Image
|
|
1911
|
-
);
|
|
1912
|
-
}
|
|
1913
|
-
return {
|
|
1914
|
-
image,
|
|
1915
|
-
// Per-image metadata namespaced under provider (Spec 15.4)
|
|
1916
|
-
metadata: item.revised_prompt ? { openai: { revised_prompt: item.revised_prompt } } : void 0
|
|
1917
|
-
};
|
|
1918
|
-
});
|
|
1892
|
+
function createImageHandler() {
|
|
1893
|
+
let providerRef = null;
|
|
1919
1894
|
return {
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1895
|
+
_setProvider(provider) {
|
|
1896
|
+
providerRef = provider;
|
|
1897
|
+
},
|
|
1898
|
+
bind(modelId) {
|
|
1899
|
+
if (!providerRef) {
|
|
1900
|
+
throw new UPPError(
|
|
1901
|
+
"Provider reference not set. Handler must be used with createProvider().",
|
|
1902
|
+
ErrorCode.InvalidRequest,
|
|
1903
|
+
"openai",
|
|
1904
|
+
ModalityType.Image
|
|
1905
|
+
);
|
|
1906
|
+
}
|
|
1907
|
+
const capabilities = getCapabilities(modelId);
|
|
1908
|
+
const model = {
|
|
1909
|
+
modelId,
|
|
1910
|
+
capabilities,
|
|
1911
|
+
get provider() {
|
|
1912
|
+
return providerRef;
|
|
1913
|
+
},
|
|
1914
|
+
async generate(request) {
|
|
1915
|
+
return executeGenerate(modelId, request);
|
|
1916
|
+
},
|
|
1917
|
+
async edit(request) {
|
|
1918
|
+
return executeEdit(modelId, request);
|
|
1919
|
+
}
|
|
1920
|
+
};
|
|
1921
|
+
if (capabilities.streaming) {
|
|
1922
|
+
model.stream = function(request) {
|
|
1923
|
+
return executeStream(modelId, request);
|
|
1924
|
+
};
|
|
1925
|
+
}
|
|
1926
|
+
return model;
|
|
1927
1927
|
}
|
|
1928
1928
|
};
|
|
1929
1929
|
}
|
|
@@ -1966,16 +1966,22 @@ function imageGenerationTool(options) {
|
|
|
1966
1966
|
return { type: "image_generation" };
|
|
1967
1967
|
}
|
|
1968
1968
|
function mcpTool(options) {
|
|
1969
|
-
const {
|
|
1969
|
+
const {
|
|
1970
|
+
url,
|
|
1971
|
+
name,
|
|
1972
|
+
allowed_tools: allowedTools,
|
|
1973
|
+
headers,
|
|
1974
|
+
require_approval: requireApproval
|
|
1975
|
+
} = options;
|
|
1970
1976
|
return {
|
|
1971
1977
|
type: "mcp",
|
|
1972
1978
|
mcp: {
|
|
1973
1979
|
server: {
|
|
1974
1980
|
url,
|
|
1975
1981
|
name,
|
|
1976
|
-
...
|
|
1982
|
+
...allowedTools && { tool_configuration: { allowed_tools: allowedTools } },
|
|
1977
1983
|
headers,
|
|
1978
|
-
require_approval
|
|
1984
|
+
require_approval: requireApproval
|
|
1979
1985
|
}
|
|
1980
1986
|
}
|
|
1981
1987
|
};
|