@ai-sdk/openai 4.0.109 → 4.0.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { APICallError, InvalidArgumentError, InvalidPromptError, InvalidResponseDataError, TooManyEmbeddingValuesForCallError, UnsupportedFunctionalityError, isJSONObject } from "@ai-sdk/provider";
2
- import { EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL, StreamingToolCallTracker, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, connectToWebSocket, convertBase64ToUint8Array, convertToBase64, convertToFormData, createBinaryResponseHandler, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonResponseHandler, createLanguageModelResponseMetadata, createLanguageModelResponseMetadata as getResponseMetadata, createNullLanguageModelUsage, createProviderDefinedToolFactory, createProviderDefinedToolFactoryWithOutputSchema, createProviderExecutedToolFactory, createProviderStreamError, createToolNameMapping, downloadBlob, experimental_toolCaller, generateId, getTopLevelMediaType, isCustomReasoning, isNonNullable, isRecord, lazySchema, mapReasoningToProviderEffort, mediaTypeToExtension, parseJSON, parseProviderOptions, postFormDataToApi, postJsonToApi, resolve, resolveFullMediaType, resolveProviderReference, safeParseJSON, safeValidateTypes, secureJsonParse, serializeModelOptions, stringifyWithBigIntAndCycles, toWebSocketUrl, validateTypes, waitForWebSocketBufferDrain, zodSchema } from "@ai-sdk/provider-utils";
2
+ import { EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL, StreamingToolCallTracker, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, connectToWebSocket, convertBase64ToUint8Array, convertToBase64, convertToFormData, createBinaryResponseHandler, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonResponseHandler, createLanguageModelResponseMetadata, createLanguageModelResponseMetadata as getResponseMetadata, createNullLanguageModelUsage, createProviderDefinedToolFactory, createProviderDefinedToolFactoryWithOutputSchema, createProviderExecutedToolFactory, createProviderStreamError, createToolNameMapping, downloadBlob, experimental_toolCaller, generateId, getTopLevelMediaType, isCustomReasoning, isNonNullable, isRecord, lazySchema, mapReasoningToProviderEffort, mediaTypeToExtension, parseJSON, parseProviderOptions, postFormDataToApi, postJsonToApi, resolve, resolveFullMediaType, resolveProviderOptions, resolveProviderReference, safeParseJSON, safeValidateTypes, secureJsonParse, serializeModelOptions, stringifyWithBigIntAndCycles, toWebSocketUrl, validateTypes, waitForWebSocketBufferDrain, zodSchema } from "@ai-sdk/provider-utils";
3
3
  import { z } from "zod/v4";
4
4
  //#region src/openai-error.ts
5
5
  const openaiErrorDataSchema = () => z.object({ error: z.object({
@@ -1108,9 +1108,9 @@ function getResponseMetadata$1({ id, model, created }) {
1108
1108
  }
1109
1109
  //#endregion
1110
1110
  //#region src/chat/map-openai-finish-reason.ts
1111
- function mapOpenAIFinishReason$1(finishReason) {
1111
+ function mapOpenAIFinishReason$1({ finishReason, hasRefusal = false }) {
1112
1112
  switch (finishReason) {
1113
- case "stop": return "stop";
1113
+ case "stop": return hasRefusal ? "content-filter" : "stop";
1114
1114
  case "length": return "length";
1115
1115
  case "content_filter": return "content-filter";
1116
1116
  case "function_call":
@@ -1128,6 +1128,7 @@ const openaiChatResponseSchema = lazySchema(() => zodSchema(z.object({
1128
1128
  message: z.object({
1129
1129
  role: z.literal("assistant").nullish(),
1130
1130
  content: z.string().nullish(),
1131
+ refusal: z.string().nullish(),
1131
1132
  audio: z.object({ transcript: z.string().nullish() }).nullish(),
1132
1133
  tool_calls: z.array(z.object({
1133
1134
  id: z.string().nullish(),
@@ -1148,14 +1149,24 @@ const openaiChatResponseSchema = lazySchema(() => zodSchema(z.object({
1148
1149
  })).nullish()
1149
1150
  }),
1150
1151
  index: z.number(),
1151
- logprobs: z.object({ content: z.array(z.object({
1152
- token: z.string(),
1153
- logprob: z.number(),
1154
- top_logprobs: z.array(z.object({
1152
+ logprobs: z.object({
1153
+ content: z.array(z.object({
1155
1154
  token: z.string(),
1156
- logprob: z.number()
1157
- }))
1158
- })).nullish() }).nullish(),
1155
+ logprob: z.number(),
1156
+ top_logprobs: z.array(z.object({
1157
+ token: z.string(),
1158
+ logprob: z.number()
1159
+ }))
1160
+ })).nullish(),
1161
+ refusal: z.array(z.object({
1162
+ token: z.string(),
1163
+ logprob: z.number(),
1164
+ top_logprobs: z.array(z.object({
1165
+ token: z.string(),
1166
+ logprob: z.number()
1167
+ }))
1168
+ })).nullish()
1169
+ }).nullish(),
1159
1170
  finish_reason: z.string().nullish()
1160
1171
  })),
1161
1172
  usage: z.object({
@@ -1181,6 +1192,7 @@ const openaiChatChunkSchema = lazySchema(() => zodSchema(z.union([z.object({
1181
1192
  delta: z.object({
1182
1193
  role: z.enum(["assistant"]).nullish(),
1183
1194
  content: z.string().nullish(),
1195
+ refusal: z.string().nullish(),
1184
1196
  tool_calls: z.array(z.object({
1185
1197
  index: z.number(),
1186
1198
  id: z.string().nullish(),
@@ -1200,14 +1212,24 @@ const openaiChatChunkSchema = lazySchema(() => zodSchema(z.union([z.object({
1200
1212
  })
1201
1213
  })).nullish()
1202
1214
  }).nullish(),
1203
- logprobs: z.object({ content: z.array(z.object({
1204
- token: z.string(),
1205
- logprob: z.number(),
1206
- top_logprobs: z.array(z.object({
1215
+ logprobs: z.object({
1216
+ content: z.array(z.object({
1207
1217
  token: z.string(),
1208
- logprob: z.number()
1209
- }))
1210
- })).nullish() }).nullish(),
1218
+ logprob: z.number(),
1219
+ top_logprobs: z.array(z.object({
1220
+ token: z.string(),
1221
+ logprob: z.number()
1222
+ }))
1223
+ })).nullish(),
1224
+ refusal: z.array(z.object({
1225
+ token: z.string(),
1226
+ logprob: z.number(),
1227
+ top_logprobs: z.array(z.object({
1228
+ token: z.string(),
1229
+ logprob: z.number()
1230
+ }))
1231
+ })).nullish()
1232
+ }).nullish(),
1211
1233
  finish_reason: z.string().nullish(),
1212
1234
  index: z.number()
1213
1235
  })),
@@ -1437,11 +1459,13 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1437
1459
  }
1438
1460
  async getArgs({ prompt, maxOutputTokens, temperature, topP, topK, frequencyPenalty, presencePenalty, stopSequences, responseFormat, seed, tools, toolChoice, reasoning, providerOptions }) {
1439
1461
  const warnings = [];
1440
- const openaiOptions = await parseProviderOptions({
1441
- provider: "openai",
1462
+ const providerOptionsNames = this.config.provider.includes("azure") ? ["openai", "azure"] : ["openai"];
1463
+ const openaiOptions = (await resolveProviderOptions({
1442
1464
  providerOptions,
1465
+ namespaces: providerOptionsNames,
1466
+ resolution: "merge",
1443
1467
  schema: openaiLanguageModelChatOptions
1444
- }) ?? {};
1468
+ })).options ?? {};
1445
1469
  const { capabilities: { language: modelCapabilities }, requestConfig: { language: modelRequestConfig } } = getOpenAILanguageModelEntry(this.modelId);
1446
1470
  const requiresNoReasoningEffort = !modelCapabilities.endpoints.chat.functionToolsWithReasoning && openaiOptions.reasoningEffort == null && (tools?.some((tool) => tool.type === "function") ?? false);
1447
1471
  if (requiresNoReasoningEffort && isCustomReasoning(reasoning) && reasoning !== "none") warnings.push({
@@ -1460,7 +1484,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1460
1484
  type: "unsupported",
1461
1485
  feature: "topK"
1462
1486
  });
1463
- if (providerOptions?.openai?.reasoningSummary != null) warnings.push({
1487
+ if (providerOptionsNames.some((name) => providerOptions?.[name]?.reasoningSummary != null)) warnings.push({
1464
1488
  type: "unsupported",
1465
1489
  feature: "reasoningSummary",
1466
1490
  details: "reasoningSummary is only supported by the Responses API, not the Chat Completions API"
@@ -1642,6 +1666,12 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1642
1666
  type: "text",
1643
1667
  text
1644
1668
  });
1669
+ const refusal = choice.message.refusal;
1670
+ const hasRefusal = refusal != null && refusal.length > 0;
1671
+ if (hasRefusal) content.push({
1672
+ type: "text",
1673
+ text: refusal
1674
+ });
1645
1675
  for (const toolCall of choice.message.tool_calls ?? []) content.push({
1646
1676
  type: "tool-call",
1647
1677
  toolCallId: toolCall.id || generateId(),
@@ -1659,11 +1689,16 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1659
1689
  const providerMetadata = { openai: {} };
1660
1690
  if (completionTokenDetails?.accepted_prediction_tokens != null) providerMetadata.openai.acceptedPredictionTokens = completionTokenDetails?.accepted_prediction_tokens;
1661
1691
  if (completionTokenDetails?.rejected_prediction_tokens != null) providerMetadata.openai.rejectedPredictionTokens = completionTokenDetails?.rejected_prediction_tokens;
1662
- if (choice.logprobs?.content != null) providerMetadata.openai.logprobs = choice.logprobs.content;
1692
+ const contentLogprobs = choice.logprobs?.content;
1693
+ const refusalLogprobs = choice.logprobs?.refusal;
1694
+ if (contentLogprobs != null || refusalLogprobs != null) providerMetadata.openai.logprobs = [...contentLogprobs ?? [], ...refusalLogprobs ?? []];
1663
1695
  return {
1664
1696
  content,
1665
1697
  finishReason: {
1666
- unified: mapOpenAIFinishReason$1(choice.finish_reason),
1698
+ unified: mapOpenAIFinishReason$1({
1699
+ finishReason: choice.finish_reason,
1700
+ hasRefusal
1701
+ }),
1667
1702
  raw: choice.finish_reason ?? void 0
1668
1703
  },
1669
1704
  usage: convertOpenAIChatUsage(response.usage),
@@ -1716,6 +1751,10 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1716
1751
  let usage = void 0;
1717
1752
  let metadataExtracted = false;
1718
1753
  let isActiveText = false;
1754
+ let hasRefusal = false;
1755
+ let rawFinishReason = void 0;
1756
+ let hasLogprobs = false;
1757
+ const streamedLogprobs = [];
1719
1758
  const providerMetadata = { openai: {} };
1720
1759
  return {
1721
1760
  stream: checkedResponse.pipeThrough(new TransformStream({
@@ -1739,6 +1778,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1739
1778
  unified: "error",
1740
1779
  raw: void 0
1741
1780
  };
1781
+ rawFinishReason = void 0;
1742
1782
  controller.enqueue({
1743
1783
  type: "error",
1744
1784
  error: chunk.error
@@ -1751,6 +1791,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1751
1791
  unified: "error",
1752
1792
  raw: void 0
1753
1793
  };
1794
+ rawFinishReason = void 0;
1754
1795
  controller.enqueue({
1755
1796
  type: "error",
1756
1797
  error: createOpenAIProviderStreamError(value.error) ?? value.error
@@ -1773,14 +1814,25 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1773
1814
  if (value.usage.completion_tokens_details?.rejected_prediction_tokens != null) providerMetadata.openai.rejectedPredictionTokens = value.usage.completion_tokens_details?.rejected_prediction_tokens;
1774
1815
  }
1775
1816
  const choice = value.choices[0];
1776
- if (choice?.finish_reason != null) finishReason = {
1777
- unified: mapOpenAIFinishReason$1(choice.finish_reason),
1778
- raw: choice.finish_reason
1779
- };
1780
- if (choice?.logprobs?.content != null) providerMetadata.openai.logprobs = choice.logprobs.content;
1817
+ if (choice?.finish_reason != null) rawFinishReason = choice.finish_reason;
1818
+ if (choice?.logprobs != null) {
1819
+ const contentLogprobs = choice.logprobs.content;
1820
+ const refusalLogprobs = choice.logprobs.refusal;
1821
+ if (contentLogprobs != null || refusalLogprobs != null) {
1822
+ hasLogprobs = true;
1823
+ streamedLogprobs.push(...contentLogprobs ?? [], ...refusalLogprobs ?? []);
1824
+ }
1825
+ }
1781
1826
  if (choice?.delta == null) return;
1782
1827
  const delta = choice.delta;
1783
- if (delta.content != null) {
1828
+ const textDeltas = [];
1829
+ if (delta.content != null && delta.content.length > 0) textDeltas.push(delta.content);
1830
+ if (delta.refusal != null && delta.refusal.length > 0) {
1831
+ hasRefusal = true;
1832
+ textDeltas.push(delta.refusal);
1833
+ }
1834
+ if (textDeltas.length === 0 && delta.content === "") textDeltas.push(delta.content);
1835
+ for (const textDelta of textDeltas) {
1784
1836
  if (!isActiveText) {
1785
1837
  controller.enqueue({
1786
1838
  type: "text-start",
@@ -1791,7 +1843,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1791
1843
  controller.enqueue({
1792
1844
  type: "text-delta",
1793
1845
  id: "0",
1794
- delta: delta.content
1846
+ delta: textDelta
1795
1847
  });
1796
1848
  }
1797
1849
  if (delta.tool_calls != null) for (const toolCallDelta of delta.tool_calls) toolCallTracker.processDelta(toolCallDelta);
@@ -1809,6 +1861,14 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1809
1861
  id: "0"
1810
1862
  });
1811
1863
  toolCallTracker.flush();
1864
+ if (rawFinishReason != null) finishReason = {
1865
+ unified: mapOpenAIFinishReason$1({
1866
+ finishReason: rawFinishReason,
1867
+ hasRefusal
1868
+ }),
1869
+ raw: rawFinishReason
1870
+ };
1871
+ if (hasLogprobs) providerMetadata.openai.logprobs = streamedLogprobs;
1812
1872
  controller.enqueue({
1813
1873
  type: "finish",
1814
1874
  finishReason,
@@ -1829,7 +1889,7 @@ function isOpenAIChatOutputChunk(chunk) {
1829
1889
  if ("error" in chunk) return false;
1830
1890
  return chunk.choices.some((choice) => {
1831
1891
  const delta = choice.delta;
1832
- return delta?.content != null && delta.content.length > 0 || delta?.tool_calls != null && delta.tool_calls.length > 0 || delta?.annotations != null && delta.annotations.length > 0;
1892
+ return delta?.content != null && delta.content.length > 0 || delta?.refusal != null && delta.refusal.length > 0 || delta?.tool_calls != null && delta.tool_calls.length > 0 || delta?.annotations != null && delta.annotations.length > 0;
1833
1893
  });
1834
1894
  }
1835
1895
  //#endregion
@@ -2015,18 +2075,12 @@ var OpenAICompletionLanguageModel = class OpenAICompletionLanguageModel {
2015
2075
  }
2016
2076
  async getArgs({ prompt, maxOutputTokens, temperature, topP, topK, frequencyPenalty, presencePenalty, stopSequences: userStopSequences, responseFormat, tools, toolChoice, seed, providerOptions }) {
2017
2077
  const warnings = [];
2018
- const openaiOptions = {
2019
- ...await parseProviderOptions({
2020
- provider: "openai",
2021
- providerOptions,
2022
- schema: openaiLanguageModelCompletionOptions
2023
- }),
2024
- ...await parseProviderOptions({
2025
- provider: this.providerOptionsName,
2026
- providerOptions,
2027
- schema: openaiLanguageModelCompletionOptions
2028
- })
2029
- };
2078
+ const openaiOptions = (await resolveProviderOptions({
2079
+ providerOptions,
2080
+ namespaces: ["openai", this.providerOptionsName],
2081
+ resolution: "merge",
2082
+ schema: openaiLanguageModelCompletionOptions
2083
+ })).options ?? {};
2030
2084
  if (topK != null) warnings.push({
2031
2085
  type: "unsupported",
2032
2086
  feature: "topK"
@@ -2397,7 +2451,12 @@ const baseImageModelOptionsObject = () => z.object({
2397
2451
  safetyIdentifier: z.string().max(128).optional()
2398
2452
  });
2399
2453
  const openaiImageModelOptions = lazySchema(() => zodSchema(baseImageModelOptionsObject()));
2400
- const openaiImageModelGenerationOptions = lazySchema(() => zodSchema(baseImageModelOptionsObject().extend({
2454
+ /**
2455
+ * Shape of the OpenAI image generation options. Exported so that routers
2456
+ * that also call the OpenAI image API (e.g. Azure) can accept these options
2457
+ * under their own providerOptions key.
2458
+ */
2459
+ const openaiImageModelGenerationOptionsShape = () => baseImageModelOptionsObject().extend({
2401
2460
  /**
2402
2461
  * Style of the generated image. `vivid` produces hyper-real and
2403
2462
  * dramatic images; `natural` produces more subdued, less hyper-real
@@ -2430,8 +2489,13 @@ const openaiImageModelGenerationOptions = lazySchema(() => zodSchema(baseImageMo
2430
2489
  * less restrictive filtering.
2431
2490
  */
2432
2491
  moderation: z.enum(["auto", "low"]).optional()
2433
- })));
2434
- const openaiImageModelEditOptions = lazySchema(() => zodSchema(baseImageModelOptionsObject().extend({
2492
+ }).shape;
2493
+ const openaiImageModelGenerationOptions = lazySchema(() => zodSchema(z.object(openaiImageModelGenerationOptionsShape())));
2494
+ /**
2495
+ * Shape of the OpenAI image edit options. Exported so that routers can accept
2496
+ * these options under their own providerOptions key.
2497
+ */
2498
+ const openaiImageModelEditOptionsShape = () => baseImageModelOptionsObject().extend({
2435
2499
  /**
2436
2500
  * Fidelity of the output image(s) to the input image(s).
2437
2501
  */
@@ -2448,7 +2512,8 @@ const openaiImageModelEditOptions = lazySchema(() => zodSchema(baseImageModelOpt
2448
2512
  * less restrictive filtering. Supported by GPT Image models.
2449
2513
  */
2450
2514
  moderation: z.enum(["auto", "low"]).optional()
2451
- })));
2515
+ }).shape;
2516
+ const openaiImageModelEditOptions = lazySchema(() => zodSchema(z.object(openaiImageModelEditOptionsShape())));
2452
2517
  //#endregion
2453
2518
  //#region src/image/openai-image-model.ts
2454
2519
  var OpenAIImageModel = class OpenAIImageModel {
@@ -2686,7 +2751,12 @@ const openaiTranscriptionResponseSchema = lazySchema(() => zodSchema(z.object({
2686
2751
  })));
2687
2752
  //#endregion
2688
2753
  //#region src/transcription/openai-transcription-model-options.ts
2689
- const openAITranscriptionModelOptions = lazySchema(() => zodSchema(z.object({
2754
+ /**
2755
+ * Shape of the OpenAI transcription model options. Exported so that routers
2756
+ * that also call the OpenAI transcription API (e.g. Azure) can accept these
2757
+ * options under their own providerOptions key.
2758
+ */
2759
+ const openAITranscriptionModelOptionsShape = () => ({
2690
2760
  /**
2691
2761
  * Additional information to include in the transcription response.
2692
2762
  */
@@ -2755,7 +2825,8 @@ const openAITranscriptionModelOptions = lazySchema(() => zodSchema(z.object({
2755
2825
  */
2756
2826
  include: z.array(z.string()).optional()
2757
2827
  }).optional()
2758
- })));
2828
+ });
2829
+ const openAITranscriptionModelOptions = lazySchema(() => zodSchema(z.object(openAITranscriptionModelOptionsShape())));
2759
2830
  //#endregion
2760
2831
  //#region src/transcription/openai-transcription-model.ts
2761
2832
  const languageMap = {
@@ -3146,10 +3217,16 @@ function getOpenAIRealtimeConnection(headers) {
3146
3217
  }
3147
3218
  //#endregion
3148
3219
  //#region src/speech/openai-speech-model-options.ts
3149
- const openaiSpeechModelOptionsSchema = lazySchema(() => zodSchema(z.object({
3220
+ /**
3221
+ * Shape of the OpenAI speech model options. Exported so that routers that
3222
+ * also call the OpenAI speech API (e.g. Azure) can accept these options under
3223
+ * their own providerOptions key.
3224
+ */
3225
+ const openaiSpeechModelOptionsShape = () => ({
3150
3226
  instructions: z.string().nullish(),
3151
3227
  speed: z.number().min(.25).max(4).nullish()
3152
- })));
3228
+ });
3229
+ const openaiSpeechModelOptionsSchema = lazySchema(() => zodSchema(z.object(openaiSpeechModelOptionsShape())));
3153
3230
  //#endregion
3154
3231
  //#region src/speech/openai-speech-model.ts
3155
3232
  var OpenAISpeechModel = class OpenAISpeechModel {
@@ -5036,10 +5113,12 @@ function mapOpenAIResponsesCitations(annotations, providerOptionsName) {
5036
5113
  }
5037
5114
  //#endregion
5038
5115
  //#region src/responses/map-openai-responses-finish-reason.ts
5039
- function mapOpenAIResponseFinishReason({ finishReason, hasFunctionCall }) {
5116
+ function mapOpenAIResponseFinishReason({ finishReason, hasFunctionCall, hasRefusal = false }) {
5040
5117
  switch (finishReason) {
5041
5118
  case void 0:
5042
- case null: return hasFunctionCall ? "tool-calls" : "stop";
5119
+ case null:
5120
+ if (hasFunctionCall) return "tool-calls";
5121
+ return hasRefusal ? "content-filter" : "stop";
5043
5122
  case "max_output_tokens": return "length";
5044
5123
  case "content_filter": return "content-filter";
5045
5124
  default: return hasFunctionCall ? "tool-calls" : "other";
@@ -5219,6 +5298,8 @@ const openaiResponsesModeledChunkTypes = /* @__PURE__ */ new Set([
5219
5298
  "response.output_item.done",
5220
5299
  "response.output_text.annotation.added",
5221
5300
  "response.output_text.delta",
5301
+ "response.refusal.delta",
5302
+ "response.refusal.done",
5222
5303
  "response.reasoning_summary_part.added",
5223
5304
  "response.reasoning_summary_part.done",
5224
5305
  "response.reasoning_summary_text.delta"
@@ -5272,6 +5353,20 @@ const openaiResponsesChunkSchema = lazySchema(() => zodSchema(z.union([
5272
5353
  }))
5273
5354
  })).nullish()
5274
5355
  }),
5356
+ z.object({
5357
+ type: z.literal("response.refusal.delta"),
5358
+ item_id: z.string(),
5359
+ output_index: z.number().nullish(),
5360
+ content_index: z.number().nullish(),
5361
+ delta: z.string()
5362
+ }),
5363
+ z.object({
5364
+ type: z.literal("response.refusal.done"),
5365
+ item_id: z.string(),
5366
+ output_index: z.number().nullish(),
5367
+ content_index: z.number().nullish(),
5368
+ refusal: z.string()
5369
+ }),
5275
5370
  z.object({
5276
5371
  type: z.enum(["response.completed", "response.incomplete"]),
5277
5372
  response: z.object({
@@ -5829,7 +5924,7 @@ const openaiResponsesResponseSchema = lazySchema(() => zodSchema(z.object({
5829
5924
  role: z.literal("assistant"),
5830
5925
  id: z.string(),
5831
5926
  phase: z.enum(["commentary", "final_answer"]).nullish(),
5832
- content: z.array(z.object({
5927
+ content: z.array(z.discriminatedUnion("type", [z.object({
5833
5928
  type: z.literal("output_text"),
5834
5929
  text: z.string(),
5835
5930
  logprobs: z.array(z.object({
@@ -5868,7 +5963,10 @@ const openaiResponsesResponseSchema = lazySchema(() => zodSchema(z.object({
5868
5963
  index: z.number()
5869
5964
  })
5870
5965
  ]))
5871
- }))
5966
+ }), z.object({
5967
+ type: z.literal("refusal"),
5968
+ refusal: z.string()
5969
+ })]))
5872
5970
  }),
5873
5971
  z.object({
5874
5972
  type: z.literal("web_search_call"),
@@ -6922,14 +7020,10 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
6922
7020
  feature: "stopSequences"
6923
7021
  });
6924
7022
  const providerOptionsName = config.provider.includes("azure") ? "azure" : "openai";
6925
- let openaiOptions = await parseProviderOptions({
6926
- provider: providerOptionsName,
6927
- providerOptions,
6928
- schema: openaiLanguageModelResponsesOptionsSchema
6929
- });
6930
- if (openaiOptions == null && providerOptionsName !== "openai") openaiOptions = await parseProviderOptions({
6931
- provider: "openai",
7023
+ const { options: openaiOptions } = await resolveProviderOptions({
6932
7024
  providerOptions,
7025
+ namespaces: [providerOptionsName, "openai"],
7026
+ resolution: "first",
6933
7027
  schema: openaiLanguageModelResponsesOptionsSchema
6934
7028
  });
6935
7029
  const resolvedReasoningEffort = resolveOpenAIReasoningEffort({
@@ -7234,6 +7328,7 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7234
7328
  const retrievedFileIds = /* @__PURE__ */ new Set();
7235
7329
  let hasFunctionCall = false;
7236
7330
  const hostedToolSearchCallIds = [];
7331
+ let hasRefusal = false;
7237
7332
  let structuredOutputText;
7238
7333
  for (const part of response.output) switch (part.type) {
7239
7334
  case "reasoning":
@@ -7335,8 +7430,20 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7335
7430
  });
7336
7431
  break;
7337
7432
  case "message":
7338
- if (options.responseFormat?.type === "json" && part.phase === "final_answer") structuredOutputText = part.content.map((contentPart) => contentPart.text).join("");
7433
+ if (options.responseFormat?.type === "json" && part.phase === "final_answer") structuredOutputText = part.content.map((contentPart) => contentPart.type === "output_text" ? contentPart.text : contentPart.refusal).join("");
7339
7434
  for (const contentPart of part.content) {
7435
+ if (contentPart.type === "refusal") {
7436
+ hasRefusal = true;
7437
+ content.push({
7438
+ type: "text",
7439
+ text: contentPart.refusal,
7440
+ providerMetadata: { [providerOptionsName]: {
7441
+ itemId: part.id,
7442
+ ...part.phase != null && { phase: part.phase }
7443
+ } }
7444
+ });
7445
+ continue;
7446
+ }
7340
7447
  if (options.providerOptions?.[providerOptionsName]?.logprobs && contentPart.logprobs) logprobs.push(contentPart.logprobs);
7341
7448
  const providerMetadata = {
7342
7449
  itemId: part.id,
@@ -7623,7 +7730,8 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7623
7730
  finishReason: {
7624
7731
  unified: mapOpenAIResponseFinishReason({
7625
7732
  finishReason: response.incomplete_details?.reason,
7626
- hasFunctionCall
7733
+ hasFunctionCall,
7734
+ hasRefusal
7627
7735
  }),
7628
7736
  raw: response.incomplete_details?.reason ?? void 0
7629
7737
  },
@@ -7686,6 +7794,7 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7686
7794
  const fallbackAnnotations = [];
7687
7795
  let activeMessagePhase;
7688
7796
  let hasFunctionCall = false;
7797
+ let hasRefusal = false;
7689
7798
  const activeReasoning = {};
7690
7799
  const activeOutputItemIds = {};
7691
7800
  const resolveOutputItemId = ({ itemId, outputIndex }) => outputIndex == null ? itemId : activeOutputItemIds[outputIndex] ?? itemId;
@@ -8452,7 +8561,19 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
8452
8561
  delta: value.delta
8453
8562
  });
8454
8563
  if (options.providerOptions?.[providerOptionsName]?.logprobs && value.logprobs) logprobs.push(value.logprobs);
8455
- } else if (value.type === "response.reasoning_summary_part.added") {
8564
+ } else if (isRefusalDeltaChunk(value)) {
8565
+ hasRefusal = true;
8566
+ const itemId = resolveOutputItemId({
8567
+ itemId: value.item_id,
8568
+ outputIndex: value.output_index
8569
+ });
8570
+ controller.enqueue({
8571
+ type: "text-delta",
8572
+ id: itemId,
8573
+ delta: value.delta
8574
+ });
8575
+ } else if (isRefusalDoneChunk(value)) hasRefusal = true;
8576
+ else if (value.type === "response.reasoning_summary_part.added") {
8456
8577
  const itemId = resolveOutputItemId({
8457
8578
  itemId: value.item_id,
8458
8579
  outputIndex: value.output_index
@@ -8510,7 +8631,8 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
8510
8631
  if (!encounteredStreamError) finishReason = {
8511
8632
  unified: mapOpenAIResponseFinishReason({
8512
8633
  finishReason: value.response.incomplete_details?.reason,
8513
- hasFunctionCall
8634
+ hasFunctionCall,
8635
+ hasRefusal
8514
8636
  }),
8515
8637
  raw: value.response.incomplete_details?.reason ?? void 0
8516
8638
  };
@@ -8600,6 +8722,12 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
8600
8722
  function isTextDeltaChunk(chunk) {
8601
8723
  return chunk.type === "response.output_text.delta";
8602
8724
  }
8725
+ function isRefusalDeltaChunk(chunk) {
8726
+ return chunk.type === "response.refusal.delta";
8727
+ }
8728
+ function isRefusalDoneChunk(chunk) {
8729
+ return chunk.type === "response.refusal.done";
8730
+ }
8603
8731
  function isOpenAIChatCompletionChunk(value) {
8604
8732
  const chunk = asRecord(value);
8605
8733
  return chunk != null && Array.isArray(chunk.choices) && typeof chunk.type !== "string";
@@ -8699,6 +8827,6 @@ function escapeJSONDelta(delta) {
8699
8827
  return JSON.stringify(delta).slice(1, -1);
8700
8828
  }
8701
8829
  //#endregion
8702
- export { OpenAIChatLanguageModel, OpenAICompletionLanguageModel, OpenAIEmbeddingModel, OpenAIImageModel, OpenAIResponsesLanguageModel, OpenAISpeechModel, OpenAITranscriptionModel, applyPatch, applyPatchArgsSchema, applyPatchInputSchema, applyPatchOutputSchema, applyPatchToolFactory, codeInterpreter, codeInterpreterArgsSchema, codeInterpreterInputSchema, codeInterpreterOutputSchema, codeInterpreterToolFactory, customArgsSchema, customTool, customToolFactory, fileSearch, fileSearchArgsSchema, fileSearchOutputSchema, getMaxImagesPerCall, hasDefaultResponseFormat, imageGeneration, imageGenerationArgsSchema, imageGenerationOutputSchema, mapWebSearchResult, modelMaxImagesPerCall, openAITranscriptionModelOptions, openaiChatMessageProviderOptions, openaiEmbeddingModelOptions, openaiImageModelEditOptions, openaiImageModelGenerationOptions, openaiImageModelOptions, openaiLanguageModelChatOptions, openaiLanguageModelCompletionOptions, openaiResponsesSupportedUrls, openaiSpeechModelOptionsSchema, programmaticToolCalling, programmaticToolCallingInputSchema, programmaticToolCallingOutputSchema, shell, shellArgsSchema, shellInputSchema, shellOutputSchema, toolSearch, toolSearchArgsSchema, toolSearchInputSchema, toolSearchOutputSchema, webSearch, webSearchArgsSchema, webSearchOutputSchema, webSearchPreview, webSearchPreviewArgsSchema, webSearchPreviewInputSchema, webSearchToolFactory };
8830
+ export { OpenAIChatLanguageModel, OpenAICompletionLanguageModel, OpenAIEmbeddingModel, OpenAIImageModel, OpenAIResponsesLanguageModel, OpenAISpeechModel, OpenAITranscriptionModel, applyPatch, applyPatchArgsSchema, applyPatchInputSchema, applyPatchOutputSchema, applyPatchToolFactory, codeInterpreter, codeInterpreterArgsSchema, codeInterpreterInputSchema, codeInterpreterOutputSchema, codeInterpreterToolFactory, customArgsSchema, customTool, customToolFactory, fileSearch, fileSearchArgsSchema, fileSearchOutputSchema, getMaxImagesPerCall, hasDefaultResponseFormat, imageGeneration, imageGenerationArgsSchema, imageGenerationOutputSchema, mapWebSearchResult, modelMaxImagesPerCall, openAITranscriptionModelOptions, openAITranscriptionModelOptionsShape, openaiChatMessageProviderOptions, openaiEmbeddingModelOptions, openaiImageModelEditOptions, openaiImageModelEditOptionsShape, openaiImageModelGenerationOptions, openaiImageModelGenerationOptionsShape, openaiImageModelOptions, openaiLanguageModelChatOptions, openaiLanguageModelCompletionOptions, openaiModelCatalog, openaiResponsesSupportedUrls, openaiSpeechModelOptionsSchema, openaiSpeechModelOptionsShape, programmaticToolCalling, programmaticToolCallingInputSchema, programmaticToolCallingOutputSchema, shell, shellArgsSchema, shellInputSchema, shellOutputSchema, toolSearch, toolSearchArgsSchema, toolSearchInputSchema, toolSearchOutputSchema, webSearch, webSearchArgsSchema, webSearchOutputSchema, webSearchPreview, webSearchPreviewArgsSchema, webSearchPreviewInputSchema, webSearchToolFactory };
8703
8831
 
8704
8832
  //# sourceMappingURL=index.js.map