@yourgpt/llm-sdk 2.5.0 → 2.5.1-beta.0
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/dist/adapters/index.d.mts +4 -4
- package/dist/adapters/index.d.ts +4 -4
- package/dist/adapters/index.js +156 -13
- package/dist/adapters/index.mjs +156 -13
- package/dist/base-C58Dsr9p.d.ts +259 -0
- package/dist/base-tNgbBaSo.d.mts +259 -0
- package/dist/fallback/index.d.mts +4 -4
- package/dist/fallback/index.d.ts +4 -4
- package/dist/index.d.mts +8 -7
- package/dist/index.d.ts +8 -7
- package/dist/index.js +12 -0
- package/dist/index.mjs +12 -0
- package/dist/providers/anthropic/index.d.mts +3 -3
- package/dist/providers/anthropic/index.d.ts +3 -3
- package/dist/providers/anthropic/index.js +271 -195
- package/dist/providers/anthropic/index.mjs +271 -195
- package/dist/providers/azure/index.d.mts +3 -3
- package/dist/providers/azure/index.d.ts +3 -3
- package/dist/providers/azure/index.js +49 -1
- package/dist/providers/azure/index.mjs +49 -1
- package/dist/providers/fireworks/index.d.mts +1 -1
- package/dist/providers/fireworks/index.d.ts +1 -1
- package/dist/providers/fireworks/index.js +56 -0
- package/dist/providers/fireworks/index.mjs +56 -0
- package/dist/providers/google/index.d.mts +3 -3
- package/dist/providers/google/index.d.ts +3 -3
- package/dist/providers/google/index.js +252 -205
- package/dist/providers/google/index.mjs +252 -205
- package/dist/providers/ollama/index.d.mts +4 -4
- package/dist/providers/ollama/index.d.ts +4 -4
- package/dist/providers/ollama/index.js +10 -2
- package/dist/providers/ollama/index.mjs +10 -2
- package/dist/providers/openai/index.d.mts +3 -3
- package/dist/providers/openai/index.d.ts +3 -3
- package/dist/providers/openai/index.js +267 -214
- package/dist/providers/openai/index.mjs +267 -214
- package/dist/providers/openrouter/index.d.mts +3 -3
- package/dist/providers/openrouter/index.d.ts +3 -3
- package/dist/providers/openrouter/index.js +257 -204
- package/dist/providers/openrouter/index.mjs +257 -204
- package/dist/providers/togetherai/index.d.mts +3 -3
- package/dist/providers/togetherai/index.d.ts +3 -3
- package/dist/providers/togetherai/index.js +257 -204
- package/dist/providers/togetherai/index.mjs +257 -204
- package/dist/providers/xai/index.d.mts +3 -3
- package/dist/providers/xai/index.d.ts +3 -3
- package/dist/providers/xai/index.js +256 -208
- package/dist/providers/xai/index.mjs +256 -208
- package/dist/{types-D4YfrQJR.d.mts → types-B6dhnguR.d.mts} +1 -1
- package/dist/{types-DRqxMIjF.d.mts → types-BQ31QIsA.d.ts} +2 -1
- package/dist/{types-BctsnC3g.d.ts → types-BSSiJW2o.d.mts} +2 -1
- package/dist/{base-D-U61JaB.d.mts → types-BkQCSiIt.d.mts} +388 -213
- package/dist/{base-iGi9Va6Z.d.ts → types-BkQCSiIt.d.ts} +388 -213
- package/dist/{types-38yolWJn.d.ts → types-CCxPmkmK.d.ts} +1 -1
- package/dist/yourgpt/index.d.mts +1 -1
- package/dist/yourgpt/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/types-CR8mi9I0.d.mts +0 -417
- package/dist/types-CR8mi9I0.d.ts +0 -417
|
@@ -1,5 +1,234 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
// src/adapters/base.ts
|
|
4
|
+
function stringifyForDebug(value) {
|
|
5
|
+
return JSON.stringify(
|
|
6
|
+
value,
|
|
7
|
+
(_key, currentValue) => {
|
|
8
|
+
if (typeof currentValue === "bigint") {
|
|
9
|
+
return currentValue.toString();
|
|
10
|
+
}
|
|
11
|
+
if (currentValue instanceof Error) {
|
|
12
|
+
return {
|
|
13
|
+
name: currentValue.name,
|
|
14
|
+
message: currentValue.message,
|
|
15
|
+
stack: currentValue.stack
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return currentValue;
|
|
19
|
+
},
|
|
20
|
+
2
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
function logProviderPayload(provider, label, payload, enabled) {
|
|
24
|
+
if (!enabled) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (label.toLowerCase().includes("stream ")) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
console.log(
|
|
32
|
+
`[llm-sdk:${provider}] ${label}
|
|
33
|
+
${stringifyForDebug(payload)}`
|
|
34
|
+
);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.log(
|
|
37
|
+
`[llm-sdk:${provider}] ${label} (failed to stringify payload)`,
|
|
38
|
+
error
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function parameterToJsonSchema(param) {
|
|
43
|
+
const schema = {
|
|
44
|
+
type: param.type
|
|
45
|
+
};
|
|
46
|
+
if (param.description) {
|
|
47
|
+
schema.description = param.description;
|
|
48
|
+
}
|
|
49
|
+
if (param.enum) {
|
|
50
|
+
schema.enum = param.enum;
|
|
51
|
+
}
|
|
52
|
+
if (param.type === "array" && param.items) {
|
|
53
|
+
schema.items = parameterToJsonSchema(
|
|
54
|
+
param.items
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
if (param.type === "object" && param.properties) {
|
|
58
|
+
schema.properties = Object.fromEntries(
|
|
59
|
+
Object.entries(param.properties).map(([key, prop]) => [
|
|
60
|
+
key,
|
|
61
|
+
parameterToJsonSchema(
|
|
62
|
+
prop
|
|
63
|
+
)
|
|
64
|
+
])
|
|
65
|
+
);
|
|
66
|
+
schema.additionalProperties = false;
|
|
67
|
+
}
|
|
68
|
+
return schema;
|
|
69
|
+
}
|
|
70
|
+
function normalizeObjectJsonSchema(schema) {
|
|
71
|
+
if (!schema || typeof schema !== "object") {
|
|
72
|
+
return {
|
|
73
|
+
type: "object",
|
|
74
|
+
properties: {},
|
|
75
|
+
required: [],
|
|
76
|
+
additionalProperties: false
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const normalized = { ...schema };
|
|
80
|
+
const type = normalized.type;
|
|
81
|
+
if (type === "object") {
|
|
82
|
+
const properties = normalized.properties && typeof normalized.properties === "object" && !Array.isArray(normalized.properties) ? normalized.properties : {};
|
|
83
|
+
normalized.properties = Object.fromEntries(
|
|
84
|
+
Object.entries(properties).map(([key, value]) => [
|
|
85
|
+
key,
|
|
86
|
+
normalizeObjectJsonSchema(value)
|
|
87
|
+
])
|
|
88
|
+
);
|
|
89
|
+
const propertyKeys = Object.keys(properties);
|
|
90
|
+
const required = Array.isArray(normalized.required) ? normalized.required.filter(
|
|
91
|
+
(value) => typeof value === "string"
|
|
92
|
+
) : [];
|
|
93
|
+
normalized.required = Array.from(/* @__PURE__ */ new Set([...required, ...propertyKeys]));
|
|
94
|
+
if (normalized.additionalProperties === void 0) {
|
|
95
|
+
normalized.additionalProperties = false;
|
|
96
|
+
}
|
|
97
|
+
} else if (type === "array" && normalized.items && typeof normalized.items === "object") {
|
|
98
|
+
normalized.items = normalizeObjectJsonSchema(
|
|
99
|
+
normalized.items
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return normalized;
|
|
103
|
+
}
|
|
104
|
+
function isOpenAIReasoningModel(modelId) {
|
|
105
|
+
if (!modelId) return false;
|
|
106
|
+
return /^(o1|o3|o4|gpt-5)/i.test(modelId);
|
|
107
|
+
}
|
|
108
|
+
function buildOpenAITokenParams(modelId, maxTokens, temperature) {
|
|
109
|
+
if (isOpenAIReasoningModel(modelId)) {
|
|
110
|
+
return { max_completion_tokens: maxTokens };
|
|
111
|
+
}
|
|
112
|
+
return { max_tokens: maxTokens, temperature };
|
|
113
|
+
}
|
|
114
|
+
function toOpenAIResponseFormat(rf) {
|
|
115
|
+
if (!rf) return void 0;
|
|
116
|
+
if (rf.type === "json_object") return { type: "json_object" };
|
|
117
|
+
return {
|
|
118
|
+
type: "json_schema",
|
|
119
|
+
json_schema: {
|
|
120
|
+
name: rf.json_schema.name,
|
|
121
|
+
schema: normalizeObjectJsonSchema(rf.json_schema.schema),
|
|
122
|
+
strict: rf.json_schema.strict ?? true
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function toOpenAIResponsesTextFormat(rf) {
|
|
127
|
+
if (!rf || rf.type !== "json_schema") return void 0;
|
|
128
|
+
return {
|
|
129
|
+
type: "json_schema",
|
|
130
|
+
name: rf.json_schema.name,
|
|
131
|
+
schema: normalizeObjectJsonSchema(rf.json_schema.schema),
|
|
132
|
+
strict: rf.json_schema.strict ?? true
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function formatTools(actions) {
|
|
136
|
+
return actions.map((action) => ({
|
|
137
|
+
type: "function",
|
|
138
|
+
function: {
|
|
139
|
+
name: action.name,
|
|
140
|
+
description: action.description,
|
|
141
|
+
parameters: {
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: action.parameters ? Object.fromEntries(
|
|
144
|
+
Object.entries(action.parameters).map(([key, param]) => [
|
|
145
|
+
key,
|
|
146
|
+
parameterToJsonSchema(param)
|
|
147
|
+
])
|
|
148
|
+
) : {},
|
|
149
|
+
required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : [],
|
|
150
|
+
additionalProperties: false
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
function hasImageAttachments(message) {
|
|
156
|
+
const attachments = message.metadata?.attachments;
|
|
157
|
+
return attachments?.some((a) => a.type === "image") ?? false;
|
|
158
|
+
}
|
|
159
|
+
function attachmentToOpenAIImage(attachment) {
|
|
160
|
+
if (attachment.type !== "image") return null;
|
|
161
|
+
let imageUrl;
|
|
162
|
+
if (attachment.url) {
|
|
163
|
+
imageUrl = attachment.url;
|
|
164
|
+
} else if (attachment.data) {
|
|
165
|
+
imageUrl = attachment.data.startsWith("data:") ? attachment.data : `data:${attachment.mimeType || "image/png"};base64,${attachment.data}`;
|
|
166
|
+
} else {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
type: "image_url",
|
|
171
|
+
image_url: {
|
|
172
|
+
url: imageUrl,
|
|
173
|
+
detail: "auto"
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function messageToOpenAIContent(message) {
|
|
178
|
+
const attachments = message.metadata?.attachments;
|
|
179
|
+
const content = message.content ?? "";
|
|
180
|
+
if (!hasImageAttachments(message)) {
|
|
181
|
+
return content;
|
|
182
|
+
}
|
|
183
|
+
const blocks = [];
|
|
184
|
+
if (content) {
|
|
185
|
+
blocks.push({ type: "text", text: content });
|
|
186
|
+
}
|
|
187
|
+
if (attachments) {
|
|
188
|
+
for (const attachment of attachments) {
|
|
189
|
+
const imageBlock = attachmentToOpenAIImage(attachment);
|
|
190
|
+
if (imageBlock) {
|
|
191
|
+
blocks.push(imageBlock);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return blocks;
|
|
196
|
+
}
|
|
197
|
+
function formatMessagesForOpenAI(messages, systemPrompt) {
|
|
198
|
+
const formatted = [];
|
|
199
|
+
if (systemPrompt) {
|
|
200
|
+
formatted.push({ role: "system", content: systemPrompt });
|
|
201
|
+
}
|
|
202
|
+
for (const msg of messages) {
|
|
203
|
+
if (msg.role === "system") {
|
|
204
|
+
formatted.push({ role: "system", content: msg.content ?? "" });
|
|
205
|
+
} else if (msg.role === "user") {
|
|
206
|
+
formatted.push({
|
|
207
|
+
role: "user",
|
|
208
|
+
content: messageToOpenAIContent(msg)
|
|
209
|
+
});
|
|
210
|
+
} else if (msg.role === "assistant") {
|
|
211
|
+
const hasToolCalls = msg.tool_calls && msg.tool_calls.length > 0;
|
|
212
|
+
const assistantMsg = {
|
|
213
|
+
role: "assistant",
|
|
214
|
+
// Gemini/xAI (OpenAI-compatible) reject content: "" on assistant messages with tool_calls
|
|
215
|
+
content: hasToolCalls ? msg.content || null : msg.content
|
|
216
|
+
};
|
|
217
|
+
if (hasToolCalls) {
|
|
218
|
+
assistantMsg.tool_calls = msg.tool_calls;
|
|
219
|
+
}
|
|
220
|
+
formatted.push(assistantMsg);
|
|
221
|
+
} else if (msg.role === "tool" && msg.tool_call_id) {
|
|
222
|
+
formatted.push({
|
|
223
|
+
role: "tool",
|
|
224
|
+
content: msg.content ?? "",
|
|
225
|
+
tool_call_id: msg.tool_call_id
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return formatted;
|
|
230
|
+
}
|
|
231
|
+
|
|
3
232
|
// src/providers/google/provider.ts
|
|
4
233
|
var GOOGLE_MODELS = {
|
|
5
234
|
// Gemini 2.5 (Experimental)
|
|
@@ -119,7 +348,8 @@ function google(modelId, options = {}) {
|
|
|
119
348
|
messages,
|
|
120
349
|
tools: params.tools,
|
|
121
350
|
temperature: params.temperature,
|
|
122
|
-
max_tokens: params.maxTokens
|
|
351
|
+
max_tokens: params.maxTokens,
|
|
352
|
+
response_format: toOpenAIResponseFormat(params.responseFormat)
|
|
123
353
|
});
|
|
124
354
|
const choice = response.choices[0];
|
|
125
355
|
const message = choice.message;
|
|
@@ -151,6 +381,7 @@ function google(modelId, options = {}) {
|
|
|
151
381
|
tools: params.tools,
|
|
152
382
|
temperature: params.temperature,
|
|
153
383
|
max_tokens: params.maxTokens,
|
|
384
|
+
response_format: toOpenAIResponseFormat(params.responseFormat),
|
|
154
385
|
stream: true
|
|
155
386
|
});
|
|
156
387
|
let currentToolCall = null;
|
|
@@ -296,204 +527,6 @@ function generateToolCallId() {
|
|
|
296
527
|
return generateId("call");
|
|
297
528
|
}
|
|
298
529
|
|
|
299
|
-
// src/adapters/base.ts
|
|
300
|
-
function stringifyForDebug(value) {
|
|
301
|
-
return JSON.stringify(
|
|
302
|
-
value,
|
|
303
|
-
(_key, currentValue) => {
|
|
304
|
-
if (typeof currentValue === "bigint") {
|
|
305
|
-
return currentValue.toString();
|
|
306
|
-
}
|
|
307
|
-
if (currentValue instanceof Error) {
|
|
308
|
-
return {
|
|
309
|
-
name: currentValue.name,
|
|
310
|
-
message: currentValue.message,
|
|
311
|
-
stack: currentValue.stack
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
return currentValue;
|
|
315
|
-
},
|
|
316
|
-
2
|
|
317
|
-
);
|
|
318
|
-
}
|
|
319
|
-
function logProviderPayload(provider, label, payload, enabled) {
|
|
320
|
-
if (!enabled) {
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
if (label.toLowerCase().includes("stream ")) {
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
try {
|
|
327
|
-
console.log(
|
|
328
|
-
`[llm-sdk:${provider}] ${label}
|
|
329
|
-
${stringifyForDebug(payload)}`
|
|
330
|
-
);
|
|
331
|
-
} catch (error) {
|
|
332
|
-
console.log(
|
|
333
|
-
`[llm-sdk:${provider}] ${label} (failed to stringify payload)`,
|
|
334
|
-
error
|
|
335
|
-
);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
function parameterToJsonSchema(param) {
|
|
339
|
-
const schema = {
|
|
340
|
-
type: param.type
|
|
341
|
-
};
|
|
342
|
-
if (param.description) {
|
|
343
|
-
schema.description = param.description;
|
|
344
|
-
}
|
|
345
|
-
if (param.enum) {
|
|
346
|
-
schema.enum = param.enum;
|
|
347
|
-
}
|
|
348
|
-
if (param.type === "array" && param.items) {
|
|
349
|
-
schema.items = parameterToJsonSchema(
|
|
350
|
-
param.items
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
if (param.type === "object" && param.properties) {
|
|
354
|
-
schema.properties = Object.fromEntries(
|
|
355
|
-
Object.entries(param.properties).map(([key, prop]) => [
|
|
356
|
-
key,
|
|
357
|
-
parameterToJsonSchema(
|
|
358
|
-
prop
|
|
359
|
-
)
|
|
360
|
-
])
|
|
361
|
-
);
|
|
362
|
-
schema.additionalProperties = false;
|
|
363
|
-
}
|
|
364
|
-
return schema;
|
|
365
|
-
}
|
|
366
|
-
function normalizeObjectJsonSchema(schema) {
|
|
367
|
-
if (!schema || typeof schema !== "object") {
|
|
368
|
-
return {
|
|
369
|
-
type: "object",
|
|
370
|
-
properties: {},
|
|
371
|
-
required: [],
|
|
372
|
-
additionalProperties: false
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
const normalized = { ...schema };
|
|
376
|
-
const type = normalized.type;
|
|
377
|
-
if (type === "object") {
|
|
378
|
-
const properties = normalized.properties && typeof normalized.properties === "object" && !Array.isArray(normalized.properties) ? normalized.properties : {};
|
|
379
|
-
normalized.properties = Object.fromEntries(
|
|
380
|
-
Object.entries(properties).map(([key, value]) => [
|
|
381
|
-
key,
|
|
382
|
-
normalizeObjectJsonSchema(value)
|
|
383
|
-
])
|
|
384
|
-
);
|
|
385
|
-
const propertyKeys = Object.keys(properties);
|
|
386
|
-
const required = Array.isArray(normalized.required) ? normalized.required.filter(
|
|
387
|
-
(value) => typeof value === "string"
|
|
388
|
-
) : [];
|
|
389
|
-
normalized.required = Array.from(/* @__PURE__ */ new Set([...required, ...propertyKeys]));
|
|
390
|
-
if (normalized.additionalProperties === void 0) {
|
|
391
|
-
normalized.additionalProperties = false;
|
|
392
|
-
}
|
|
393
|
-
} else if (type === "array" && normalized.items && typeof normalized.items === "object") {
|
|
394
|
-
normalized.items = normalizeObjectJsonSchema(
|
|
395
|
-
normalized.items
|
|
396
|
-
);
|
|
397
|
-
}
|
|
398
|
-
return normalized;
|
|
399
|
-
}
|
|
400
|
-
function formatTools(actions) {
|
|
401
|
-
return actions.map((action) => ({
|
|
402
|
-
type: "function",
|
|
403
|
-
function: {
|
|
404
|
-
name: action.name,
|
|
405
|
-
description: action.description,
|
|
406
|
-
parameters: {
|
|
407
|
-
type: "object",
|
|
408
|
-
properties: action.parameters ? Object.fromEntries(
|
|
409
|
-
Object.entries(action.parameters).map(([key, param]) => [
|
|
410
|
-
key,
|
|
411
|
-
parameterToJsonSchema(param)
|
|
412
|
-
])
|
|
413
|
-
) : {},
|
|
414
|
-
required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : [],
|
|
415
|
-
additionalProperties: false
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}));
|
|
419
|
-
}
|
|
420
|
-
function hasImageAttachments(message) {
|
|
421
|
-
const attachments = message.metadata?.attachments;
|
|
422
|
-
return attachments?.some((a) => a.type === "image") ?? false;
|
|
423
|
-
}
|
|
424
|
-
function attachmentToOpenAIImage(attachment) {
|
|
425
|
-
if (attachment.type !== "image") return null;
|
|
426
|
-
let imageUrl;
|
|
427
|
-
if (attachment.url) {
|
|
428
|
-
imageUrl = attachment.url;
|
|
429
|
-
} else if (attachment.data) {
|
|
430
|
-
imageUrl = attachment.data.startsWith("data:") ? attachment.data : `data:${attachment.mimeType || "image/png"};base64,${attachment.data}`;
|
|
431
|
-
} else {
|
|
432
|
-
return null;
|
|
433
|
-
}
|
|
434
|
-
return {
|
|
435
|
-
type: "image_url",
|
|
436
|
-
image_url: {
|
|
437
|
-
url: imageUrl,
|
|
438
|
-
detail: "auto"
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
function messageToOpenAIContent(message) {
|
|
443
|
-
const attachments = message.metadata?.attachments;
|
|
444
|
-
const content = message.content ?? "";
|
|
445
|
-
if (!hasImageAttachments(message)) {
|
|
446
|
-
return content;
|
|
447
|
-
}
|
|
448
|
-
const blocks = [];
|
|
449
|
-
if (content) {
|
|
450
|
-
blocks.push({ type: "text", text: content });
|
|
451
|
-
}
|
|
452
|
-
if (attachments) {
|
|
453
|
-
for (const attachment of attachments) {
|
|
454
|
-
const imageBlock = attachmentToOpenAIImage(attachment);
|
|
455
|
-
if (imageBlock) {
|
|
456
|
-
blocks.push(imageBlock);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
return blocks;
|
|
461
|
-
}
|
|
462
|
-
function formatMessagesForOpenAI(messages, systemPrompt) {
|
|
463
|
-
const formatted = [];
|
|
464
|
-
if (systemPrompt) {
|
|
465
|
-
formatted.push({ role: "system", content: systemPrompt });
|
|
466
|
-
}
|
|
467
|
-
for (const msg of messages) {
|
|
468
|
-
if (msg.role === "system") {
|
|
469
|
-
formatted.push({ role: "system", content: msg.content ?? "" });
|
|
470
|
-
} else if (msg.role === "user") {
|
|
471
|
-
formatted.push({
|
|
472
|
-
role: "user",
|
|
473
|
-
content: messageToOpenAIContent(msg)
|
|
474
|
-
});
|
|
475
|
-
} else if (msg.role === "assistant") {
|
|
476
|
-
const hasToolCalls = msg.tool_calls && msg.tool_calls.length > 0;
|
|
477
|
-
const assistantMsg = {
|
|
478
|
-
role: "assistant",
|
|
479
|
-
// Gemini/xAI (OpenAI-compatible) reject content: "" on assistant messages with tool_calls
|
|
480
|
-
content: hasToolCalls ? msg.content || null : msg.content
|
|
481
|
-
};
|
|
482
|
-
if (hasToolCalls) {
|
|
483
|
-
assistantMsg.tool_calls = msg.tool_calls;
|
|
484
|
-
}
|
|
485
|
-
formatted.push(assistantMsg);
|
|
486
|
-
} else if (msg.role === "tool" && msg.tool_call_id) {
|
|
487
|
-
formatted.push({
|
|
488
|
-
role: "tool",
|
|
489
|
-
content: msg.content ?? "",
|
|
490
|
-
tool_call_id: msg.tool_call_id
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
return formatted;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
530
|
// src/adapters/openai.ts
|
|
498
531
|
var OpenAIAdapter = class _OpenAIAdapter {
|
|
499
532
|
constructor(config) {
|
|
@@ -608,6 +641,9 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
608
641
|
async completeWithResponses(request) {
|
|
609
642
|
const client = await this.getClient();
|
|
610
643
|
const openaiToolOptions = request.providerToolOptions?.openai;
|
|
644
|
+
const responsesTextFormat = toOpenAIResponsesTextFormat(
|
|
645
|
+
request.config?.responseFormat
|
|
646
|
+
);
|
|
611
647
|
const payload = {
|
|
612
648
|
model: request.config?.model || this.model,
|
|
613
649
|
instructions: request.systemPrompt,
|
|
@@ -617,6 +653,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
617
653
|
parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
|
|
618
654
|
temperature: request.config?.temperature ?? this.config.temperature,
|
|
619
655
|
max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
|
|
656
|
+
...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
|
|
620
657
|
stream: false
|
|
621
658
|
};
|
|
622
659
|
logProviderPayload("openai", "request payload", payload, request.debug);
|
|
@@ -738,14 +775,19 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
738
775
|
name: openaiToolOptions.toolChoice.name
|
|
739
776
|
}
|
|
740
777
|
} : openaiToolOptions?.toolChoice;
|
|
778
|
+
const modelIdForPayload = request.config?.model || this.model;
|
|
741
779
|
const payload = {
|
|
742
|
-
model:
|
|
780
|
+
model: modelIdForPayload,
|
|
743
781
|
messages,
|
|
744
782
|
tools: tools.length > 0 ? tools : void 0,
|
|
745
783
|
tool_choice: tools.length > 0 ? toolChoice : void 0,
|
|
746
784
|
parallel_tool_calls: tools.length > 0 ? openaiToolOptions?.parallelToolCalls : void 0,
|
|
747
|
-
|
|
748
|
-
|
|
785
|
+
...buildOpenAITokenParams(
|
|
786
|
+
modelIdForPayload,
|
|
787
|
+
request.config?.maxTokens ?? this.config.maxTokens,
|
|
788
|
+
request.config?.temperature ?? this.config.temperature
|
|
789
|
+
),
|
|
790
|
+
response_format: toOpenAIResponseFormat(request.config?.responseFormat),
|
|
749
791
|
stream: true,
|
|
750
792
|
stream_options: { include_usage: true }
|
|
751
793
|
};
|
|
@@ -887,14 +929,19 @@ var OpenAIAdapter = class _OpenAIAdapter {
|
|
|
887
929
|
name: openaiToolOptions.toolChoice.name
|
|
888
930
|
}
|
|
889
931
|
} : openaiToolOptions?.toolChoice;
|
|
932
|
+
const modelIdForCompletePayload = request.config?.model || this.model;
|
|
890
933
|
const payload = {
|
|
891
|
-
model:
|
|
934
|
+
model: modelIdForCompletePayload,
|
|
892
935
|
messages,
|
|
893
936
|
tools: tools.length > 0 ? tools : void 0,
|
|
894
937
|
tool_choice: tools.length > 0 ? toolChoice : void 0,
|
|
895
938
|
parallel_tool_calls: tools.length > 0 ? openaiToolOptions?.parallelToolCalls : void 0,
|
|
896
|
-
|
|
897
|
-
|
|
939
|
+
...buildOpenAITokenParams(
|
|
940
|
+
modelIdForCompletePayload,
|
|
941
|
+
request.config?.maxTokens ?? this.config.maxTokens,
|
|
942
|
+
request.config?.temperature ?? this.config.temperature
|
|
943
|
+
),
|
|
944
|
+
response_format: toOpenAIResponseFormat(request.config?.responseFormat),
|
|
898
945
|
stream: false
|
|
899
946
|
};
|
|
900
947
|
logProviderPayload("openai", "request payload", payload, request.debug);
|