@ai-sdk/openai 4.0.104 → 4.0.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.
- package/CHANGELOG.md +19 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +114 -30
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +81 -24
- package/dist/internal/index.js.map +1 -1
- package/docs/03-openai.mdx +10 -4
- package/package.json +2 -2
- package/src/chat/openai-chat-language-model.ts +30 -15
- package/src/openai-decision-model-options.ts +1 -0
- package/src/openai-decision-model.ts +46 -5
- package/src/openai-language-model-capabilities.ts +97 -2
- package/src/responses/openai-responses-language-model.ts +17 -24
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @ai-sdk/openai
|
|
2
2
|
|
|
3
|
+
## 4.0.105
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 47b1d8b: feat(openai): send native JSON input and prompt cache keys to Decisions
|
|
8
|
+
- d07b475: fix(openai): map top-level `reasoning` to efforts supported by GPT-5.x models instead of sending unsupported values that OpenAI rejects with a 400. `max` is now only sent on the Responses API, and GPT-5.6 on Chat Completions sends `reasoning_effort: 'none'` when function tools are used, since it rejects function tools with reasoning. A warning is emitted when a reasoning level was requested.
|
|
9
|
+
- 61a315e: fix: map the top-level `reasoning` option consistently across providers
|
|
10
|
+
|
|
11
|
+
Providers now resolve reasoning the same way:
|
|
12
|
+
|
|
13
|
+
1. A provider-specific reasoning setting in `providerOptions` is sent unchanged. OpenAI no longer drops `providerOptions.openai.reasoningEffort` values that are not in its list for the model, and Fireworks no longer rewrites `providerOptions.fireworks.reasoningEffort`. Fireworks also sends top-level `reasoning` values directly instead of rounding them to `'high'` at most, except for model families known to reject `'none'` (GPT-OSS, GLM-5.3, Muse Spark) or `'minimal'` (Nemotron, Inkling).
|
|
14
|
+
2. Otherwise, `reasoning` maps to the closest level the model supports, rounding down, and rounds up only when there is no lower level. For example, `'xhigh'` now maps to `'high'` instead of `'max'` on Anthropic and Bedrock models without `xhigh` effort, and `'medium'` maps to `'low'` instead of `'high'` on DeepSeek, Kimi K3, and Mistral GLM-5.3 models.
|
|
15
|
+
3. `'none'` on a model that cannot disable reasoning maps to the model's lowest level with a compatibility warning, instead of being dropped or sending a request the API rejects. This affects GPT-6 models without `'none'`, xAI grok-4.5 and later, Groq GPT-OSS, Kimi K3, Perplexity, QuiverAI, Bedrock OpenAI `gpt-oss` models, and Gemini 2.5 Pro (minimum thinking budget). Gemini 3 and Anthropic and Bedrock `between_tools` mappings now emit the compatibility warning too.
|
|
16
|
+
|
|
17
|
+
`mapReasoningToProviderEffort` now accepts any `reasoning` value, returns an optional `providerOptionsEffort` unchanged, and rounds levels that are missing from the effort map to the closest supported level. `mapReasoningToProviderBudget` maps `'none'` to the minimum reasoning budget, always returns a budget, and uses the default percentage for levels missing from `budgetPercentages`. `OpenAICompatibleChatConfig` adds an optional `mapReasoning` function for mapping the top-level `reasoning` option.
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [61a315e]
|
|
20
|
+
- @ai-sdk/provider-utils@5.0.71
|
|
21
|
+
|
|
3
22
|
## 4.0.104
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1986,6 +1986,7 @@ export declare const VERSION: string;
|
|
|
1986
1986
|
//#region src/openai-decision-model-options.d.ts
|
|
1987
1987
|
declare const openaiDecisionModelOptions: import("@ai-sdk/provider-utils").LazySchema<{
|
|
1988
1988
|
safetyIdentifier?: string | undefined;
|
|
1989
|
+
promptCacheKey?: string | undefined;
|
|
1989
1990
|
}>;
|
|
1990
1991
|
type OpenAIDecisionModelOptions = InferSchema<typeof openaiDecisionModelOptions>;
|
|
1991
1992
|
//#endregion
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["_$__tool_apply_patch0.ApplyPatchOperation","_$__tool_custom0.customToolFactory","_$_0.OpenAIComputerAction","_$_0.OpenAIComputerSafetyCheck","_$__responses_openai_responses_api0.OpenAIResponsesFileSearchToolComparisonFilter","_$__responses_openai_responses_api0.OpenAIResponsesFileSearchToolCompoundFilter","_$__tool_web_search0.webSearchToolFactory","RealtimeModelV4ClientSecretOptions","RealtimeModelV4ClientSecretResult","RealtimeModelV4ServerEvent","RealtimeModelV4ClientEvent","RealtimeModelV4SessionConfig","RealtimeModelV4","RealtimeModelV4SessionConfig","RealtimeModelV4ClientEvent","RealtimeModelV4","RealtimeModelV4","RealtimeFactoryV4","DecisionModelV4","SpeechTranslationModelV4","BatchV4","SpeechTranslationModelV4StreamOptions","SpeechTranslationModelV4"],"sources":["../src/openai-config.ts","../src/openai-decision-model.ts","../src/chat/openai-chat-language-model-options.ts","../src/completion/openai-completion-language-model-options.ts","../src/embedding/openai-embedding-model-options.ts","../src/image/openai-image-model-options.ts","../src/tool/apply-patch.ts","../src/tool/custom.ts","../src/responses/openai-responses-language-model-options.ts","../src/responses/openai-responses-api.ts","../src/tool/web-search.ts","../src/openai-tools.ts","../src/live/openai-realtime-model-live-options.ts","../src/realtime/openai-realtime-model.ts","../src/live/openai-realtime-model-live.ts","../src/realtime/openai-realtime-factory.ts","../src/speech/openai-speech-model-options.ts","../src/transcription/openai-transcription-model-options.ts","../src/speech-translation/openai-speech-translation-model-options.ts","../src/openai-provider.ts","../src/responses/openai-responses-prepare-tools.ts","../src/speech-translation/openai-speech-translation-model.ts","../src/files/openai-files-options.ts","../src/tool/computer.ts","../src/responses/openai-responses-provider-metadata.ts","../src/version.ts","../src/openai-decision-model-options.ts"],"mappings":";;;;KAKK,gBAAgB;KAMT;EACV;;EAEA;EACA;EACA,MAAM;IAAW;IAAiB;;EAClC,gBAAgB;EAChB,QAAQ;EACR,YAAY;EACZ;;;;;;;EAOA;;;;;;;EAOA;;;;;;;;;EASA;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["_$__tool_apply_patch0.ApplyPatchOperation","_$__tool_custom0.customToolFactory","_$_0.OpenAIComputerAction","_$_0.OpenAIComputerSafetyCheck","_$__responses_openai_responses_api0.OpenAIResponsesFileSearchToolComparisonFilter","_$__responses_openai_responses_api0.OpenAIResponsesFileSearchToolCompoundFilter","_$__tool_web_search0.webSearchToolFactory","RealtimeModelV4ClientSecretOptions","RealtimeModelV4ClientSecretResult","RealtimeModelV4ServerEvent","RealtimeModelV4ClientEvent","RealtimeModelV4SessionConfig","RealtimeModelV4","RealtimeModelV4SessionConfig","RealtimeModelV4ClientEvent","RealtimeModelV4","RealtimeModelV4","RealtimeFactoryV4","DecisionModelV4","SpeechTranslationModelV4","BatchV4","SpeechTranslationModelV4StreamOptions","SpeechTranslationModelV4"],"sources":["../src/openai-config.ts","../src/openai-decision-model.ts","../src/chat/openai-chat-language-model-options.ts","../src/completion/openai-completion-language-model-options.ts","../src/embedding/openai-embedding-model-options.ts","../src/image/openai-image-model-options.ts","../src/tool/apply-patch.ts","../src/tool/custom.ts","../src/responses/openai-responses-language-model-options.ts","../src/responses/openai-responses-api.ts","../src/tool/web-search.ts","../src/openai-tools.ts","../src/live/openai-realtime-model-live-options.ts","../src/realtime/openai-realtime-model.ts","../src/live/openai-realtime-model-live.ts","../src/realtime/openai-realtime-factory.ts","../src/speech/openai-speech-model-options.ts","../src/transcription/openai-transcription-model-options.ts","../src/speech-translation/openai-speech-translation-model-options.ts","../src/openai-provider.ts","../src/responses/openai-responses-prepare-tools.ts","../src/speech-translation/openai-speech-translation-model.ts","../src/files/openai-files-options.ts","../src/tool/computer.ts","../src/responses/openai-responses-provider-metadata.ts","../src/version.ts","../src/openai-decision-model-options.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL, StreamingToolCallTracker, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, connectToWebSocket, convertAsyncIteratorToReadableStream, convertBase64ToUint8Array, convertInlineFileDataToUint8Array, convertToBase64, convertToFormData, convertUint8ArrayToBase64, createBinaryResponseHandler, createBinaryStreamResponseHandler, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonLinesResponseHandler, createJsonResponseHandler, createLanguageModelResponseMetadata, createLanguageModelResponseMetadata as getResponseMetadata, createNullLanguageModelUsage, createProviderDefinedToolFactory, createProviderDefinedToolFactoryWithOutputSchema, createProviderExecutedToolFactory, createProviderStreamError, createToolNameMapping, deleteFromApi, detectMediaType, downloadBlob, encodePathSegment, experimental_toolCaller, generateId, getFromApi, getTopLevelMediaType, isCustomReasoning, isFullMediaType, isNonNullable, isRecord, lazySchema, loadApiKey, loadOptionalSetting, mediaTypeToExtension, normalizeBatchRequestCounts, parseJSON, parseProviderOptions, postFormDataToApi, postJsonToApi, postMultipartStreamToApi, postToApi, resolveFullMediaType, resolveProviderReference, safeParseJSON, safeValidateTypes, serializeModelOptions, toWebSocketUrl, validateBaseURL, validateTypes, waitForWebSocketBufferDrain, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
|
|
1
|
+
import { EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL, StreamingToolCallTracker, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, connectToWebSocket, convertAsyncIteratorToReadableStream, convertBase64ToUint8Array, convertInlineFileDataToUint8Array, convertToBase64, convertToFormData, convertUint8ArrayToBase64, createBinaryResponseHandler, createBinaryStreamResponseHandler, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonLinesResponseHandler, createJsonResponseHandler, createLanguageModelResponseMetadata, createLanguageModelResponseMetadata as getResponseMetadata, createNullLanguageModelUsage, createProviderDefinedToolFactory, createProviderDefinedToolFactoryWithOutputSchema, createProviderExecutedToolFactory, createProviderStreamError, createToolNameMapping, deleteFromApi, detectMediaType, downloadBlob, encodePathSegment, experimental_toolCaller, generateId, getFromApi, getTopLevelMediaType, isCustomReasoning, isFullMediaType, isNonNullable, isRecord, lazySchema, loadApiKey, loadOptionalSetting, mapReasoningToProviderEffort, mediaTypeToExtension, normalizeBatchRequestCounts, parseJSON, parseProviderOptions, postFormDataToApi, postJsonToApi, postMultipartStreamToApi, postToApi, resolveFullMediaType, resolveProviderReference, safeParseJSON, safeValidateTypes, serializeModelOptions, toWebSocketUrl, validateBaseURL, validateTypes, waitForWebSocketBufferDrain, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
|
|
2
2
|
import { APICallError, InvalidArgumentError, InvalidPromptError, InvalidResponseDataError, TooManyEmbeddingValuesForCallError, UnsupportedFunctionalityError, isJSONObject } from "@ai-sdk/provider";
|
|
3
3
|
import { z } from "zod/v4";
|
|
4
4
|
//#region src/openai-config.ts
|
|
@@ -29,9 +29,11 @@ const openaiFailedResponseHandler = createJsonErrorResponseHandler({
|
|
|
29
29
|
});
|
|
30
30
|
//#endregion
|
|
31
31
|
//#region src/openai-decision-model-options.ts
|
|
32
|
-
const openaiDecisionModelOptions = lazySchema(() => zodSchema(z.object({
|
|
33
|
-
/** An opaque end-user identifier for safety monitoring, up to 128 characters. */
|
|
34
|
-
safetyIdentifier: z.string().max(128).optional()
|
|
32
|
+
const openaiDecisionModelOptions = lazySchema(() => zodSchema(z.object({
|
|
33
|
+
/** An opaque end-user identifier for safety monitoring, up to 128 characters. */
|
|
34
|
+
safetyIdentifier: z.string().max(128).optional(),
|
|
35
|
+
promptCacheKey: z.string().optional()
|
|
36
|
+
})));
|
|
35
37
|
//#endregion
|
|
36
38
|
//#region src/openai-decision-model.ts
|
|
37
39
|
const probability = () => z.number().min(0).max(1);
|
|
@@ -121,6 +123,7 @@ var DecisionOpenAIModel = class DecisionOpenAIModel {
|
|
|
121
123
|
body: {
|
|
122
124
|
model: this.modelId,
|
|
123
125
|
safety_identifier: openaiOptions?.safetyIdentifier,
|
|
126
|
+
prompt_cache_key: openaiOptions?.promptCacheKey,
|
|
124
127
|
input: [{
|
|
125
128
|
role: "user",
|
|
126
129
|
content: state.map((part) => {
|
|
@@ -128,7 +131,10 @@ var DecisionOpenAIModel = class DecisionOpenAIModel {
|
|
|
128
131
|
type: "input_text",
|
|
129
132
|
text: part.text
|
|
130
133
|
};
|
|
131
|
-
if (part.type === "json") return {
|
|
134
|
+
if (part.type === "json") return isInputJsonData(part.value) ? {
|
|
135
|
+
type: "input_json",
|
|
136
|
+
data: part.value
|
|
137
|
+
} : {
|
|
132
138
|
type: "input_text",
|
|
133
139
|
text: JSON.stringify(part.value)
|
|
134
140
|
};
|
|
@@ -240,7 +246,7 @@ var DecisionOpenAIModel = class DecisionOpenAIModel {
|
|
|
240
246
|
type: "unsupported",
|
|
241
247
|
feature: "reasoning"
|
|
242
248
|
}] : [],
|
|
243
|
-
...Object.keys(providerOptions?.openai ?? {}).filter((option) => option
|
|
249
|
+
...Object.keys(providerOptions?.openai ?? {}).filter((option) => !SUPPORTED_PROVIDER_OPTIONS.has(option)).map((option) => ({
|
|
244
250
|
type: "unsupported",
|
|
245
251
|
feature: `providerOptions.openai.${option}`
|
|
246
252
|
}))
|
|
@@ -257,22 +263,54 @@ var DecisionOpenAIModel = class DecisionOpenAIModel {
|
|
|
257
263
|
};
|
|
258
264
|
}
|
|
259
265
|
};
|
|
266
|
+
const SUPPORTED_PROVIDER_OPTIONS = /* @__PURE__ */ new Set(["safetyIdentifier", "promptCacheKey"]);
|
|
260
267
|
function toText(input) {
|
|
261
268
|
return typeof input === "string" ? input : JSON.stringify(input);
|
|
262
269
|
}
|
|
270
|
+
const INPUT_JSON_MAX_DEPTH = 32;
|
|
271
|
+
const INPUT_JSON_MAX_VALUES = 1e4;
|
|
272
|
+
const INPUT_JSON_MAX_BYTES = 262144;
|
|
273
|
+
function isInputJsonData(value) {
|
|
274
|
+
return (Array.isArray(value) ? value.length > 0 && value.every(isJSONObject$1) : isJSONObject$1(value)) && fitsInputJsonLimits(value);
|
|
275
|
+
}
|
|
276
|
+
function fitsInputJsonLimits(value) {
|
|
277
|
+
let count = 0;
|
|
278
|
+
const visit = (node, depth) => {
|
|
279
|
+
count += 1;
|
|
280
|
+
if (count > INPUT_JSON_MAX_VALUES) return false;
|
|
281
|
+
if (node === null || typeof node !== "object") return true;
|
|
282
|
+
if (depth > INPUT_JSON_MAX_DEPTH) return false;
|
|
283
|
+
return (Array.isArray(node) ? node : Object.values(node)).every((child) => visit(child, depth + 1));
|
|
284
|
+
};
|
|
285
|
+
return visit(value, 1) && new TextEncoder().encode(JSON.stringify(value)).length <= INPUT_JSON_MAX_BYTES;
|
|
286
|
+
}
|
|
287
|
+
function isJSONObject$1(value) {
|
|
288
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
289
|
+
}
|
|
263
290
|
//#endregion
|
|
264
291
|
//#region src/openai-language-model-capabilities.ts
|
|
292
|
+
const ALL_OPENAI_REASONING_EFFORTS = [
|
|
293
|
+
"none",
|
|
294
|
+
"minimal",
|
|
295
|
+
"low",
|
|
296
|
+
"medium",
|
|
297
|
+
"high",
|
|
298
|
+
"xhigh",
|
|
299
|
+
"max"
|
|
300
|
+
];
|
|
265
301
|
function getOpenAILanguageModelCapabilities(modelId) {
|
|
266
302
|
const oSeriesVersion = getOSeriesVersion(modelId);
|
|
267
303
|
const gptVersion = getGptVersion(modelId);
|
|
268
304
|
const isGptChatModel = gptVersion?.minor == null && (gptVersion?.variant?.startsWith("chat") ?? false);
|
|
269
305
|
const isGptNanoModel = gptVersion?.variant?.startsWith("nano") ?? false;
|
|
270
306
|
const isGpt6OrLaterModel = gptVersion != null && gptVersion.major >= 6;
|
|
307
|
+
const isStandardGpt5Model = gptVersion?.major === 5 && (gptVersion.variant == null || /^(?:(?:mini|nano|sol|luna|terra)(?:-\d{4}-\d{2}-\d{2})?|\d{4}-\d{2}-\d{2})$/.test(gptVersion.variant));
|
|
271
308
|
const isGpt6OrLaterModelWithNoneEffort = modelId === "gpt-6-sol" || modelId === "gpt-6-luna" || modelId === "gpt-6.1-terra";
|
|
272
309
|
const supportsFlexProcessing = oSeriesVersion != null && oSeriesVersion >= 3 || gptVersion != null && gptVersion.major >= 5 && !isGptChatModel;
|
|
273
310
|
const supportsPriorityProcessing = modelId.startsWith("gpt-4") || gptVersion != null && gptVersion.major >= 5 && !isGptNanoModel && !isGptChatModel || oSeriesVersion != null && oSeriesVersion >= 3;
|
|
274
311
|
const isReasoningModel = oSeriesVersion != null || gptVersion != null && gptVersion.major >= 5 && !isGptChatModel;
|
|
275
312
|
const supportsNonReasoningParameters = isGpt6OrLaterModelWithNoneEffort || !isGpt6OrLaterModel && gptVersion != null && (gptVersion.major > 5 || gptVersion.major === 5 && (gptVersion.minor ?? 0) >= 1);
|
|
313
|
+
const systemMessageMode = isReasoningModel ? "developer" : "system";
|
|
276
314
|
return {
|
|
277
315
|
supportsFlexProcessing,
|
|
278
316
|
supportsPriorityProcessing,
|
|
@@ -291,12 +329,42 @@ function getOpenAILanguageModelCapabilities(modelId) {
|
|
|
291
329
|
"high",
|
|
292
330
|
"xhigh",
|
|
293
331
|
"max"
|
|
294
|
-
] : void 0,
|
|
332
|
+
] : isStandardGpt5Model ? getGpt5ReasoningEfforts(gptVersion.minor ?? 0) : void 0,
|
|
333
|
+
supportsChatFunctionToolsWithReasoning: !(gptVersion?.major === 5 && (gptVersion.minor ?? 0) >= 6),
|
|
295
334
|
isReasoningModel,
|
|
296
|
-
systemMessageMode
|
|
335
|
+
systemMessageMode,
|
|
297
336
|
supportsNonReasoningParameters
|
|
298
337
|
};
|
|
299
338
|
}
|
|
339
|
+
function getGpt5ReasoningEfforts(minor) {
|
|
340
|
+
if (minor === 0) return [
|
|
341
|
+
"minimal",
|
|
342
|
+
"low",
|
|
343
|
+
"medium",
|
|
344
|
+
"high"
|
|
345
|
+
];
|
|
346
|
+
if (minor === 1) return [
|
|
347
|
+
"none",
|
|
348
|
+
"low",
|
|
349
|
+
"medium",
|
|
350
|
+
"high"
|
|
351
|
+
];
|
|
352
|
+
if (minor < 6) return [
|
|
353
|
+
"none",
|
|
354
|
+
"low",
|
|
355
|
+
"medium",
|
|
356
|
+
"high",
|
|
357
|
+
"xhigh"
|
|
358
|
+
];
|
|
359
|
+
return [
|
|
360
|
+
"none",
|
|
361
|
+
"low",
|
|
362
|
+
"medium",
|
|
363
|
+
"high",
|
|
364
|
+
"xhigh",
|
|
365
|
+
"max"
|
|
366
|
+
];
|
|
367
|
+
}
|
|
300
368
|
function getOSeriesVersion(modelId) {
|
|
301
369
|
const match = /^o(\d+)(?:-|$)/.exec(modelId);
|
|
302
370
|
return match == null ? void 0 : Number(match[1]);
|
|
@@ -310,6 +378,21 @@ function getGptVersion(modelId) {
|
|
|
310
378
|
variant: match[3]
|
|
311
379
|
};
|
|
312
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Resolves the reasoning effort to send to OpenAI.
|
|
383
|
+
*
|
|
384
|
+
* A reasoning effort from provider options is sent unchanged. Otherwise the
|
|
385
|
+
* top-level reasoning value is mapped to the closest effort that the model
|
|
386
|
+
* family supports, or sent directly when the supported efforts are not known.
|
|
387
|
+
*/
|
|
388
|
+
function resolveOpenAIReasoningEffort({ providerReasoningEffort, reasoning, supportedReasoningEfforts, warnings }) {
|
|
389
|
+
return mapReasoningToProviderEffort({
|
|
390
|
+
reasoning,
|
|
391
|
+
providerOptionsEffort: providerReasoningEffort,
|
|
392
|
+
effortMap: Object.fromEntries((supportedReasoningEfforts ?? ALL_OPENAI_REASONING_EFFORTS).map((effort) => [effort, effort])),
|
|
393
|
+
warnings
|
|
394
|
+
});
|
|
395
|
+
}
|
|
313
396
|
//#endregion
|
|
314
397
|
//#region src/openai-stream-error.ts
|
|
315
398
|
/**
|
|
@@ -1182,15 +1265,18 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
|
|
|
1182
1265
|
schema: openaiLanguageModelChatOptions
|
|
1183
1266
|
}) ?? {};
|
|
1184
1267
|
const modelCapabilities = getOpenAILanguageModelCapabilities(this.modelId);
|
|
1185
|
-
|
|
1186
|
-
if (
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1268
|
+
const requiresNoReasoningEffort = !modelCapabilities.supportsChatFunctionToolsWithReasoning && openaiOptions.reasoningEffort == null && (tools?.some((tool) => tool.type === "function") ?? false);
|
|
1269
|
+
if (requiresNoReasoningEffort && isCustomReasoning(reasoning) && reasoning !== "none") warnings.push({
|
|
1270
|
+
type: "compatibility",
|
|
1271
|
+
feature: "reasoning",
|
|
1272
|
+
details: `${this.modelId} does not support function tools with reasoning in the Chat Completions API. reasoning effort set to "none". Use the Responses API to combine reasoning with function tools.`
|
|
1273
|
+
});
|
|
1274
|
+
const resolvedReasoningEffort = requiresNoReasoningEffort ? "none" : resolveOpenAIReasoningEffort({
|
|
1275
|
+
providerReasoningEffort: openaiOptions.reasoningEffort,
|
|
1276
|
+
reasoning,
|
|
1277
|
+
supportedReasoningEfforts: modelCapabilities.supportedReasoningEfforts?.filter((effort) => effort !== "max"),
|
|
1278
|
+
warnings
|
|
1279
|
+
});
|
|
1194
1280
|
const isReasoningModel = openaiOptions.forceReasoning ?? modelCapabilities.isReasoningModel;
|
|
1195
1281
|
if (topK != null) warnings.push({
|
|
1196
1282
|
type: "unsupported",
|
|
@@ -1245,7 +1331,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
|
|
|
1245
1331
|
safety_identifier: openaiOptions.safetyIdentifier,
|
|
1246
1332
|
messages
|
|
1247
1333
|
};
|
|
1248
|
-
if (modelCapabilities.
|
|
1334
|
+
if (modelCapabilities.supportsConfigurationUpdate && baseArgs.prompt_cache_retention != null) {
|
|
1249
1335
|
baseArgs.prompt_cache_retention = void 0;
|
|
1250
1336
|
warnings.push({
|
|
1251
1337
|
type: "unsupported",
|
|
@@ -6281,15 +6367,12 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
|
|
|
6281
6367
|
providerOptions,
|
|
6282
6368
|
schema: openaiLanguageModelResponsesOptionsSchema
|
|
6283
6369
|
});
|
|
6284
|
-
|
|
6285
|
-
|
|
6286
|
-
|
|
6287
|
-
|
|
6288
|
-
|
|
6289
|
-
|
|
6290
|
-
});
|
|
6291
|
-
resolvedReasoningEffort = void 0;
|
|
6292
|
-
}
|
|
6370
|
+
const resolvedReasoningEffort = resolveOpenAIReasoningEffort({
|
|
6371
|
+
providerReasoningEffort: openaiOptions?.reasoningEffort,
|
|
6372
|
+
reasoning,
|
|
6373
|
+
supportedReasoningEfforts: modelCapabilities.supportedReasoningEfforts,
|
|
6374
|
+
warnings
|
|
6375
|
+
});
|
|
6293
6376
|
const resolvedReasoningSummary = openaiOptions?.reasoningSummary !== void 0 ? openaiOptions.reasoningSummary : resolvedReasoningEffort != null && resolvedReasoningEffort !== "none" ? "detailed" : void 0;
|
|
6294
6377
|
const isReasoningModel = openaiOptions?.forceReasoning ?? modelCapabilities.isReasoningModel;
|
|
6295
6378
|
if (openaiOptions?.conversation && openaiOptions?.previousResponseId) warnings.push({
|
|
@@ -6352,7 +6435,8 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
|
|
|
6352
6435
|
outputSchemaToolNames: outputSchemaToolNames.size > 0 ? outputSchemaToolNames : void 0
|
|
6353
6436
|
});
|
|
6354
6437
|
warnings.push(...inputWarnings);
|
|
6355
|
-
const
|
|
6438
|
+
const supportedReasoningEfforts = modelCapabilities.supportedReasoningEfforts;
|
|
6439
|
+
const getUpdateEffortUnsupportedReason = (effort) => effort != null && supportedReasoningEfforts?.includes(effort) === false ? `${modelId} only supports the following reasoning efforts: ${supportedReasoningEfforts.join(", ")}` : void 0;
|
|
6356
6440
|
for (const item of input) if (item.type === "configuration_update") {
|
|
6357
6441
|
const unsupportedReason = getUpdateEffortUnsupportedReason(item.reasoning.effort);
|
|
6358
6442
|
if (unsupportedReason != null) throw new UnsupportedFunctionalityError({
|
|
@@ -6468,7 +6552,7 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
|
|
|
6468
6552
|
details: "topP is not supported for reasoning models"
|
|
6469
6553
|
});
|
|
6470
6554
|
}
|
|
6471
|
-
if (modelCapabilities.
|
|
6555
|
+
if (modelCapabilities.supportsConfigurationUpdate && (baseArgs.top_logprobs != null || baseArgs.include?.includes("message.output_text.logprobs"))) {
|
|
6472
6556
|
baseArgs.top_logprobs = void 0;
|
|
6473
6557
|
const filteredInclude = baseArgs.include?.filter((value) => value !== "message.output_text.logprobs");
|
|
6474
6558
|
baseArgs.include = filteredInclude != null && filteredInclude.length > 0 ? filteredInclude : void 0;
|
|
@@ -10274,7 +10358,7 @@ var OpenAISkills = class {
|
|
|
10274
10358
|
};
|
|
10275
10359
|
//#endregion
|
|
10276
10360
|
//#region src/version.ts
|
|
10277
|
-
const VERSION = "4.0.
|
|
10361
|
+
const VERSION = "4.0.105";
|
|
10278
10362
|
//#endregion
|
|
10279
10363
|
//#region src/openai-provider.ts
|
|
10280
10364
|
/**
|