@ai-sdk/openai 4.0.109 → 4.0.110

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 CHANGED
@@ -1,5 +1,28 @@
1
1
  # @ai-sdk/openai
2
2
 
3
+ ## 4.0.110
4
+
5
+ ### Patch Changes
6
+
7
+ - c6efa4b: Refactor Azure model ID logic into a model catalog that declares capabilities and provider options, and generate provider capability documentation from it. Export the OpenAI catalog internally for Azure to reuse. Request behavior is unchanged.
8
+ - f6dbf04: fix(openai): surface Chat Completions refusals as text content
9
+
10
+ The Chat Completions model ignored `message.refusal` (non-streaming) and `delta.refusal` (streaming). When the model refused to answer, `content` was `null`, so the AI SDK returned empty text with a `stop` finish reason and silently dropped the refusal. Refusal text is now emitted as text content in both `generateText` and `streamText` results, and it is emitted in addition to content when the API returns both. A refusal with a `stop` finish reason is now reported as a `content-filter` finish reason, matching the Anthropic provider and the Responses API.
11
+
12
+ - 646a7e3: fix(openai,openai-compatible): surface refusal logprobs and openai-compatible refusals
13
+
14
+ `@ai-sdk/openai`: Chat Completions responses that contain a refusal can return `logprobs.refusal` next to `logprobs.content`. The provider previously read only `logprobs.content`, so `providerMetadata.openai.logprobs` was empty or missing for refusals. Refusal logprobs are now included in emission order (content logprobs followed by refusal logprobs) in both `generateText` and `streamText`.
15
+
16
+ Streaming logprobs are now collected across all chunks in `streamText`: previously only the logprobs of the last streamed chunk were reported. This applies to content logprobs as well, so `providerMetadata.openai.logprobs` now contains the logprobs of every streamed token instead of only the last chunk's tokens. Explicitly empty logprobs (`logprobs: { content: [], refusal: null }`) are reported as an empty array, as before.
17
+
18
+ A refusal that arrives in the same streamed chunk as the `finish_reason` is now taken into account: such a response is reported with a `content-filter` finish reason instead of `stop`.
19
+
20
+ `@ai-sdk/openai-compatible`: Chat Completions responses that carry `message.refusal` (non-streaming) or `delta.refusal` (streaming) were ignored, so providers such as OpenAI served through `createOpenAICompatible` lost the refusal text and reported an empty `stop` response. Refusals are now returned as text content after any content text, and a non-empty refusal with a `stop` finish reason is reported as a `content-filter` finish reason. This also applies when the refusal and the finish reason arrive in the same streamed chunk. Non-string refusals (for example `refusal: false` from servers that use booleans) are ignored instead of failing the response.
21
+
22
+ - 6b97088: fix(openai): handle refusal content parts in the Responses API
23
+
24
+ The Responses API returns a `refusal` content part instead of `output_text` when the model declines a request. The response schema rejected these parts, so non-streaming calls failed with an `APICallError` ("Invalid JSON response"), and streamed `response.refusal.delta` / `response.refusal.done` events were dropped, producing empty text. Refusal content parts and stream events are now parsed: the refusal explanation is surfaced as text and the finish reason is mapped to `content-filter`. When the response also contains a client-side function call, the finish reason stays `tool-calls` so the tools are still executed.
25
+
3
26
  ## 4.0.109
4
27
 
5
28
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -297,6 +297,18 @@ declare const openaiResponsesChunkSchema: import("@ai-sdk/provider-utils").LazyS
297
297
  logprob: number;
298
298
  }[];
299
299
  }[] | null | undefined;
300
+ } | {
301
+ type: "response.refusal.delta";
302
+ item_id: string;
303
+ delta: string;
304
+ output_index?: number | null | undefined;
305
+ content_index?: number | null | undefined;
306
+ } | {
307
+ type: "response.refusal.done";
308
+ item_id: string;
309
+ refusal: string;
310
+ output_index?: number | null | undefined;
311
+ content_index?: number | null | undefined;
300
312
  } | {
301
313
  type: "response.completed" | "response.incomplete";
302
314
  response: {
@@ -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","RealtimeModelV4SessionIntent","RealtimeModelV4ServerConnection","RealtimeModelV4ServerEvent","RealtimeModelV4ClientEvent","RealtimeModelV4SessionConfig","RealtimeModelV4","RealtimeModelV4SessionIntent","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/openai-model-catalog.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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"}
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","RealtimeModelV4SessionIntent","RealtimeModelV4ServerConnection","RealtimeModelV4ServerEvent","RealtimeModelV4ClientEvent","RealtimeModelV4SessionConfig","RealtimeModelV4","RealtimeModelV4SessionIntent","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/openai-model-catalog.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
@@ -1396,9 +1396,9 @@ function getResponseMetadata$1({ id, model, created }) {
1396
1396
  }
1397
1397
  //#endregion
1398
1398
  //#region src/chat/map-openai-finish-reason.ts
1399
- function mapOpenAIFinishReason$1(finishReason) {
1399
+ function mapOpenAIFinishReason$1({ finishReason, hasRefusal = false }) {
1400
1400
  switch (finishReason) {
1401
- case "stop": return "stop";
1401
+ case "stop": return hasRefusal ? "content-filter" : "stop";
1402
1402
  case "length": return "length";
1403
1403
  case "content_filter": return "content-filter";
1404
1404
  case "function_call":
@@ -1416,6 +1416,7 @@ const openaiChatResponseSchema = lazySchema(() => zodSchema(z.object({
1416
1416
  message: z.object({
1417
1417
  role: z.literal("assistant").nullish(),
1418
1418
  content: z.string().nullish(),
1419
+ refusal: z.string().nullish(),
1419
1420
  audio: z.object({ transcript: z.string().nullish() }).nullish(),
1420
1421
  tool_calls: z.array(z.object({
1421
1422
  id: z.string().nullish(),
@@ -1436,14 +1437,24 @@ const openaiChatResponseSchema = lazySchema(() => zodSchema(z.object({
1436
1437
  })).nullish()
1437
1438
  }),
1438
1439
  index: z.number(),
1439
- logprobs: z.object({ content: z.array(z.object({
1440
- token: z.string(),
1441
- logprob: z.number(),
1442
- top_logprobs: z.array(z.object({
1440
+ logprobs: z.object({
1441
+ content: z.array(z.object({
1443
1442
  token: z.string(),
1444
- logprob: z.number()
1445
- }))
1446
- })).nullish() }).nullish(),
1443
+ logprob: z.number(),
1444
+ top_logprobs: z.array(z.object({
1445
+ token: z.string(),
1446
+ logprob: z.number()
1447
+ }))
1448
+ })).nullish(),
1449
+ refusal: z.array(z.object({
1450
+ token: z.string(),
1451
+ logprob: z.number(),
1452
+ top_logprobs: z.array(z.object({
1453
+ token: z.string(),
1454
+ logprob: z.number()
1455
+ }))
1456
+ })).nullish()
1457
+ }).nullish(),
1447
1458
  finish_reason: z.string().nullish()
1448
1459
  })),
1449
1460
  usage: z.object({
@@ -1469,6 +1480,7 @@ const openaiChatChunkSchema = lazySchema(() => zodSchema(z.union([z.object({
1469
1480
  delta: z.object({
1470
1481
  role: z.enum(["assistant"]).nullish(),
1471
1482
  content: z.string().nullish(),
1483
+ refusal: z.string().nullish(),
1472
1484
  tool_calls: z.array(z.object({
1473
1485
  index: z.number(),
1474
1486
  id: z.string().nullish(),
@@ -1488,14 +1500,24 @@ const openaiChatChunkSchema = lazySchema(() => zodSchema(z.union([z.object({
1488
1500
  })
1489
1501
  })).nullish()
1490
1502
  }).nullish(),
1491
- logprobs: z.object({ content: z.array(z.object({
1492
- token: z.string(),
1493
- logprob: z.number(),
1494
- top_logprobs: z.array(z.object({
1503
+ logprobs: z.object({
1504
+ content: z.array(z.object({
1495
1505
  token: z.string(),
1496
- logprob: z.number()
1497
- }))
1498
- })).nullish() }).nullish(),
1506
+ logprob: z.number(),
1507
+ top_logprobs: z.array(z.object({
1508
+ token: z.string(),
1509
+ logprob: z.number()
1510
+ }))
1511
+ })).nullish(),
1512
+ refusal: z.array(z.object({
1513
+ token: z.string(),
1514
+ logprob: z.number(),
1515
+ top_logprobs: z.array(z.object({
1516
+ token: z.string(),
1517
+ logprob: z.number()
1518
+ }))
1519
+ })).nullish()
1520
+ }).nullish(),
1499
1521
  finish_reason: z.string().nullish(),
1500
1522
  index: z.number()
1501
1523
  })),
@@ -1930,6 +1952,12 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1930
1952
  type: "text",
1931
1953
  text
1932
1954
  });
1955
+ const refusal = choice.message.refusal;
1956
+ const hasRefusal = refusal != null && refusal.length > 0;
1957
+ if (hasRefusal) content.push({
1958
+ type: "text",
1959
+ text: refusal
1960
+ });
1933
1961
  for (const toolCall of choice.message.tool_calls ?? []) content.push({
1934
1962
  type: "tool-call",
1935
1963
  toolCallId: toolCall.id || generateId(),
@@ -1947,11 +1975,16 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
1947
1975
  const providerMetadata = { openai: {} };
1948
1976
  if (completionTokenDetails?.accepted_prediction_tokens != null) providerMetadata.openai.acceptedPredictionTokens = completionTokenDetails?.accepted_prediction_tokens;
1949
1977
  if (completionTokenDetails?.rejected_prediction_tokens != null) providerMetadata.openai.rejectedPredictionTokens = completionTokenDetails?.rejected_prediction_tokens;
1950
- if (choice.logprobs?.content != null) providerMetadata.openai.logprobs = choice.logprobs.content;
1978
+ const contentLogprobs = choice.logprobs?.content;
1979
+ const refusalLogprobs = choice.logprobs?.refusal;
1980
+ if (contentLogprobs != null || refusalLogprobs != null) providerMetadata.openai.logprobs = [...contentLogprobs ?? [], ...refusalLogprobs ?? []];
1951
1981
  return {
1952
1982
  content,
1953
1983
  finishReason: {
1954
- unified: mapOpenAIFinishReason$1(choice.finish_reason),
1984
+ unified: mapOpenAIFinishReason$1({
1985
+ finishReason: choice.finish_reason,
1986
+ hasRefusal
1987
+ }),
1955
1988
  raw: choice.finish_reason ?? void 0
1956
1989
  },
1957
1990
  usage: convertOpenAIChatUsage(response.usage),
@@ -2004,6 +2037,10 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
2004
2037
  let usage = void 0;
2005
2038
  let metadataExtracted = false;
2006
2039
  let isActiveText = false;
2040
+ let hasRefusal = false;
2041
+ let rawFinishReason = void 0;
2042
+ let hasLogprobs = false;
2043
+ const streamedLogprobs = [];
2007
2044
  const providerMetadata = { openai: {} };
2008
2045
  return {
2009
2046
  stream: checkedResponse.pipeThrough(new TransformStream({
@@ -2027,6 +2064,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
2027
2064
  unified: "error",
2028
2065
  raw: void 0
2029
2066
  };
2067
+ rawFinishReason = void 0;
2030
2068
  controller.enqueue({
2031
2069
  type: "error",
2032
2070
  error: chunk.error
@@ -2039,6 +2077,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
2039
2077
  unified: "error",
2040
2078
  raw: void 0
2041
2079
  };
2080
+ rawFinishReason = void 0;
2042
2081
  controller.enqueue({
2043
2082
  type: "error",
2044
2083
  error: createOpenAIProviderStreamError(value.error) ?? value.error
@@ -2061,14 +2100,25 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
2061
2100
  if (value.usage.completion_tokens_details?.rejected_prediction_tokens != null) providerMetadata.openai.rejectedPredictionTokens = value.usage.completion_tokens_details?.rejected_prediction_tokens;
2062
2101
  }
2063
2102
  const choice = value.choices[0];
2064
- if (choice?.finish_reason != null) finishReason = {
2065
- unified: mapOpenAIFinishReason$1(choice.finish_reason),
2066
- raw: choice.finish_reason
2067
- };
2068
- if (choice?.logprobs?.content != null) providerMetadata.openai.logprobs = choice.logprobs.content;
2103
+ if (choice?.finish_reason != null) rawFinishReason = choice.finish_reason;
2104
+ if (choice?.logprobs != null) {
2105
+ const contentLogprobs = choice.logprobs.content;
2106
+ const refusalLogprobs = choice.logprobs.refusal;
2107
+ if (contentLogprobs != null || refusalLogprobs != null) {
2108
+ hasLogprobs = true;
2109
+ streamedLogprobs.push(...contentLogprobs ?? [], ...refusalLogprobs ?? []);
2110
+ }
2111
+ }
2069
2112
  if (choice?.delta == null) return;
2070
2113
  const delta = choice.delta;
2071
- if (delta.content != null) {
2114
+ const textDeltas = [];
2115
+ if (delta.content != null && delta.content.length > 0) textDeltas.push(delta.content);
2116
+ if (delta.refusal != null && delta.refusal.length > 0) {
2117
+ hasRefusal = true;
2118
+ textDeltas.push(delta.refusal);
2119
+ }
2120
+ if (textDeltas.length === 0 && delta.content === "") textDeltas.push(delta.content);
2121
+ for (const textDelta of textDeltas) {
2072
2122
  if (!isActiveText) {
2073
2123
  controller.enqueue({
2074
2124
  type: "text-start",
@@ -2079,7 +2129,7 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
2079
2129
  controller.enqueue({
2080
2130
  type: "text-delta",
2081
2131
  id: "0",
2082
- delta: delta.content
2132
+ delta: textDelta
2083
2133
  });
2084
2134
  }
2085
2135
  if (delta.tool_calls != null) for (const toolCallDelta of delta.tool_calls) toolCallTracker.processDelta(toolCallDelta);
@@ -2097,6 +2147,14 @@ var OpenAIChatLanguageModel = class OpenAIChatLanguageModel {
2097
2147
  id: "0"
2098
2148
  });
2099
2149
  toolCallTracker.flush();
2150
+ if (rawFinishReason != null) finishReason = {
2151
+ unified: mapOpenAIFinishReason$1({
2152
+ finishReason: rawFinishReason,
2153
+ hasRefusal
2154
+ }),
2155
+ raw: rawFinishReason
2156
+ };
2157
+ if (hasLogprobs) providerMetadata.openai.logprobs = streamedLogprobs;
2100
2158
  controller.enqueue({
2101
2159
  type: "finish",
2102
2160
  finishReason,
@@ -2117,7 +2175,7 @@ function isOpenAIChatOutputChunk(chunk) {
2117
2175
  if ("error" in chunk) return false;
2118
2176
  return chunk.choices.some((choice) => {
2119
2177
  const delta = choice.delta;
2120
- return delta?.content != null && delta.content.length > 0 || delta?.tool_calls != null && delta.tool_calls.length > 0 || delta?.annotations != null && delta.annotations.length > 0;
2178
+ 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;
2121
2179
  });
2122
2180
  }
2123
2181
  //#endregion
@@ -3855,10 +3913,12 @@ function convertOpenAIResponsesUsage(usage) {
3855
3913
  }
3856
3914
  //#endregion
3857
3915
  //#region src/responses/map-openai-responses-finish-reason.ts
3858
- function mapOpenAIResponseFinishReason({ finishReason, hasFunctionCall }) {
3916
+ function mapOpenAIResponseFinishReason({ finishReason, hasFunctionCall, hasRefusal = false }) {
3859
3917
  switch (finishReason) {
3860
3918
  case void 0:
3861
- case null: return hasFunctionCall ? "tool-calls" : "stop";
3919
+ case null:
3920
+ if (hasFunctionCall) return "tool-calls";
3921
+ return hasRefusal ? "content-filter" : "stop";
3862
3922
  case "max_output_tokens": return "length";
3863
3923
  case "content_filter": return "content-filter";
3864
3924
  default: return hasFunctionCall ? "tool-calls" : "other";
@@ -4038,6 +4098,8 @@ const openaiResponsesModeledChunkTypes = /* @__PURE__ */ new Set([
4038
4098
  "response.output_item.done",
4039
4099
  "response.output_text.annotation.added",
4040
4100
  "response.output_text.delta",
4101
+ "response.refusal.delta",
4102
+ "response.refusal.done",
4041
4103
  "response.reasoning_summary_part.added",
4042
4104
  "response.reasoning_summary_part.done",
4043
4105
  "response.reasoning_summary_text.delta"
@@ -4091,6 +4153,20 @@ const openaiResponsesChunkSchema = lazySchema(() => zodSchema(z.union([
4091
4153
  }))
4092
4154
  })).nullish()
4093
4155
  }),
4156
+ z.object({
4157
+ type: z.literal("response.refusal.delta"),
4158
+ item_id: z.string(),
4159
+ output_index: z.number().nullish(),
4160
+ content_index: z.number().nullish(),
4161
+ delta: z.string()
4162
+ }),
4163
+ z.object({
4164
+ type: z.literal("response.refusal.done"),
4165
+ item_id: z.string(),
4166
+ output_index: z.number().nullish(),
4167
+ content_index: z.number().nullish(),
4168
+ refusal: z.string()
4169
+ }),
4094
4170
  z.object({
4095
4171
  type: z.enum(["response.completed", "response.incomplete"]),
4096
4172
  response: z.object({
@@ -4648,7 +4724,7 @@ const openaiResponsesResponseSchema = lazySchema(() => zodSchema(z.object({
4648
4724
  role: z.literal("assistant"),
4649
4725
  id: z.string(),
4650
4726
  phase: z.enum(["commentary", "final_answer"]).nullish(),
4651
- content: z.array(z.object({
4727
+ content: z.array(z.discriminatedUnion("type", [z.object({
4652
4728
  type: z.literal("output_text"),
4653
4729
  text: z.string(),
4654
4730
  logprobs: z.array(z.object({
@@ -4687,7 +4763,10 @@ const openaiResponsesResponseSchema = lazySchema(() => zodSchema(z.object({
4687
4763
  index: z.number()
4688
4764
  })
4689
4765
  ]))
4690
- }))
4766
+ }), z.object({
4767
+ type: z.literal("refusal"),
4768
+ refusal: z.string()
4769
+ })]))
4691
4770
  }),
4692
4771
  z.object({
4693
4772
  type: z.literal("web_search_call"),
@@ -7220,6 +7299,7 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7220
7299
  const retrievedFileIds = /* @__PURE__ */ new Set();
7221
7300
  let hasFunctionCall = false;
7222
7301
  const hostedToolSearchCallIds = [];
7302
+ let hasRefusal = false;
7223
7303
  let structuredOutputText;
7224
7304
  for (const part of response.output) switch (part.type) {
7225
7305
  case "reasoning":
@@ -7321,8 +7401,20 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7321
7401
  });
7322
7402
  break;
7323
7403
  case "message":
7324
- if (options.responseFormat?.type === "json" && part.phase === "final_answer") structuredOutputText = part.content.map((contentPart) => contentPart.text).join("");
7404
+ if (options.responseFormat?.type === "json" && part.phase === "final_answer") structuredOutputText = part.content.map((contentPart) => contentPart.type === "output_text" ? contentPart.text : contentPart.refusal).join("");
7325
7405
  for (const contentPart of part.content) {
7406
+ if (contentPart.type === "refusal") {
7407
+ hasRefusal = true;
7408
+ content.push({
7409
+ type: "text",
7410
+ text: contentPart.refusal,
7411
+ providerMetadata: { [providerOptionsName]: {
7412
+ itemId: part.id,
7413
+ ...part.phase != null && { phase: part.phase }
7414
+ } }
7415
+ });
7416
+ continue;
7417
+ }
7326
7418
  if (options.providerOptions?.[providerOptionsName]?.logprobs && contentPart.logprobs) logprobs.push(contentPart.logprobs);
7327
7419
  const providerMetadata = {
7328
7420
  itemId: part.id,
@@ -7609,7 +7701,8 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7609
7701
  finishReason: {
7610
7702
  unified: mapOpenAIResponseFinishReason({
7611
7703
  finishReason: response.incomplete_details?.reason,
7612
- hasFunctionCall
7704
+ hasFunctionCall,
7705
+ hasRefusal
7613
7706
  }),
7614
7707
  raw: response.incomplete_details?.reason ?? void 0
7615
7708
  },
@@ -7672,6 +7765,7 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
7672
7765
  const fallbackAnnotations = [];
7673
7766
  let activeMessagePhase;
7674
7767
  let hasFunctionCall = false;
7768
+ let hasRefusal = false;
7675
7769
  const activeReasoning = {};
7676
7770
  const activeOutputItemIds = {};
7677
7771
  const resolveOutputItemId = ({ itemId, outputIndex }) => outputIndex == null ? itemId : activeOutputItemIds[outputIndex] ?? itemId;
@@ -8438,7 +8532,19 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
8438
8532
  delta: value.delta
8439
8533
  });
8440
8534
  if (options.providerOptions?.[providerOptionsName]?.logprobs && value.logprobs) logprobs.push(value.logprobs);
8441
- } else if (value.type === "response.reasoning_summary_part.added") {
8535
+ } else if (isRefusalDeltaChunk(value)) {
8536
+ hasRefusal = true;
8537
+ const itemId = resolveOutputItemId({
8538
+ itemId: value.item_id,
8539
+ outputIndex: value.output_index
8540
+ });
8541
+ controller.enqueue({
8542
+ type: "text-delta",
8543
+ id: itemId,
8544
+ delta: value.delta
8545
+ });
8546
+ } else if (isRefusalDoneChunk(value)) hasRefusal = true;
8547
+ else if (value.type === "response.reasoning_summary_part.added") {
8442
8548
  const itemId = resolveOutputItemId({
8443
8549
  itemId: value.item_id,
8444
8550
  outputIndex: value.output_index
@@ -8496,7 +8602,8 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
8496
8602
  if (!encounteredStreamError) finishReason = {
8497
8603
  unified: mapOpenAIResponseFinishReason({
8498
8604
  finishReason: value.response.incomplete_details?.reason,
8499
- hasFunctionCall
8605
+ hasFunctionCall,
8606
+ hasRefusal
8500
8607
  }),
8501
8608
  raw: value.response.incomplete_details?.reason ?? void 0
8502
8609
  };
@@ -8586,6 +8693,12 @@ var OpenAIResponsesLanguageModel = class OpenAIResponsesLanguageModel {
8586
8693
  function isTextDeltaChunk(chunk) {
8587
8694
  return chunk.type === "response.output_text.delta";
8588
8695
  }
8696
+ function isRefusalDeltaChunk(chunk) {
8697
+ return chunk.type === "response.refusal.delta";
8698
+ }
8699
+ function isRefusalDoneChunk(chunk) {
8700
+ return chunk.type === "response.refusal.done";
8701
+ }
8589
8702
  function isOpenAIChatCompletionChunk(value) {
8590
8703
  const chunk = asRecord(value);
8591
8704
  return chunk != null && Array.isArray(chunk.choices) && typeof chunk.type !== "string";
@@ -9106,6 +9219,7 @@ async function convertOpenAIBatchResult(body) {
9106
9219
  const content = [];
9107
9220
  const logprobs = [];
9108
9221
  let hasFunctionCall = false;
9222
+ let hasRefusal = false;
9109
9223
  for (const part of response.output) switch (part.type) {
9110
9224
  case "reasoning": {
9111
9225
  const summaries = part.summary.length > 0 ? part.summary : [{
@@ -9124,6 +9238,14 @@ async function convertOpenAIBatchResult(body) {
9124
9238
  }
9125
9239
  case "message":
9126
9240
  for (const contentPart of part.content) {
9241
+ if (contentPart.type === "refusal") {
9242
+ hasRefusal = true;
9243
+ content.push({
9244
+ type: "text",
9245
+ text: contentPart.refusal
9246
+ });
9247
+ continue;
9248
+ }
9127
9249
  content.push({
9128
9250
  type: "text",
9129
9251
  text: contentPart.text
@@ -9242,7 +9364,8 @@ async function convertOpenAIBatchResult(body) {
9242
9364
  finishReason: {
9243
9365
  unified: mapOpenAIResponseFinishReason({
9244
9366
  finishReason: response.incomplete_details?.reason,
9245
- hasFunctionCall
9367
+ hasFunctionCall,
9368
+ hasRefusal
9246
9369
  }),
9247
9370
  raw: response.incomplete_details?.reason ?? void 0
9248
9371
  },
@@ -11009,7 +11132,7 @@ var OpenAISkills = class {
11009
11132
  };
11010
11133
  //#endregion
11011
11134
  //#region src/version.ts
11012
- const VERSION = "4.0.109";
11135
+ const VERSION = "4.0.110";
11013
11136
  //#endregion
11014
11137
  //#region src/openai-provider.ts
11015
11138
  /**