@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.
- package/CHANGELOG.md +35 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +206 -68
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +316 -6
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +195 -67
- package/dist/internal/index.js.map +1 -1
- package/docs/03-openai.mdx +68 -0
- package/package.json +3 -3
- package/src/chat/map-openai-finish-reason.ts +11 -4
- package/src/chat/openai-chat-api.ts +36 -0
- package/src/chat/openai-chat-language-model.ts +120 -20
- package/src/completion/openai-completion-language-model.ts +11 -13
- package/src/image/openai-image-model-options.ts +68 -57
- package/src/internal/index.ts +2 -0
- package/src/openai-batch.ts +8 -0
- package/src/responses/map-openai-responses-finish-reason.ts +7 -1
- package/src/responses/openai-responses-api.ts +71 -48
- package/src/responses/openai-responses-language-model.ts +62 -12
- package/src/speech/openai-speech-model-options.ts +11 -6
- package/src/transcription/openai-transcription-model-options.ts +71 -70
package/dist/internal/index.js
CHANGED
|
@@ -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({
|
|
1152
|
-
|
|
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
|
-
|
|
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({
|
|
1204
|
-
|
|
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
|
-
|
|
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
|
|
1441
|
-
|
|
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?.
|
|
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
|
-
|
|
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(
|
|
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)
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|