2793 lines
88 KiB
JavaScript
2793 lines
88 KiB
JavaScript
// src/openai-chat-language-model.ts
|
|
import {
|
|
InvalidResponseDataError,
|
|
UnsupportedFunctionalityError as UnsupportedFunctionalityError3
|
|
} from "@ai-sdk/provider";
|
|
import {
|
|
combineHeaders,
|
|
createEventSourceResponseHandler,
|
|
createJsonResponseHandler,
|
|
generateId,
|
|
isParsableJson,
|
|
postJsonToApi
|
|
} from "@ai-sdk/provider-utils";
|
|
import { z as z2 } from "zod";
|
|
|
|
// src/convert-to-openai-chat-messages.ts
|
|
import {
|
|
UnsupportedFunctionalityError
|
|
} from "@ai-sdk/provider";
|
|
import { convertUint8ArrayToBase64 } from "@ai-sdk/provider-utils";
|
|
function convertToOpenAIChatMessages({
|
|
prompt,
|
|
useLegacyFunctionCalling = false,
|
|
systemMessageMode = "system"
|
|
}) {
|
|
const messages = [];
|
|
const warnings = [];
|
|
for (const { role, content } of prompt) {
|
|
switch (role) {
|
|
case "system": {
|
|
switch (systemMessageMode) {
|
|
case "system": {
|
|
messages.push({ role: "system", content });
|
|
break;
|
|
}
|
|
case "developer": {
|
|
messages.push({ role: "developer", content });
|
|
break;
|
|
}
|
|
case "remove": {
|
|
warnings.push({
|
|
type: "other",
|
|
message: "system messages are removed for this model"
|
|
});
|
|
break;
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = systemMessageMode;
|
|
throw new Error(
|
|
`Unsupported system message mode: ${_exhaustiveCheck}`
|
|
);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case "user": {
|
|
if (content.length === 1 && content[0].type === "text") {
|
|
messages.push({ role: "user", content: content[0].text });
|
|
break;
|
|
}
|
|
messages.push({
|
|
role: "user",
|
|
content: content.map((part, index) => {
|
|
var _a, _b, _c, _d;
|
|
switch (part.type) {
|
|
case "text": {
|
|
return { type: "text", text: part.text };
|
|
}
|
|
case "image": {
|
|
return {
|
|
type: "image_url",
|
|
image_url: {
|
|
url: part.image instanceof URL ? part.image.toString() : `data:${(_a = part.mimeType) != null ? _a : "image/jpeg"};base64,${convertUint8ArrayToBase64(part.image)}`,
|
|
// OpenAI specific extension: image detail
|
|
detail: (_c = (_b = part.providerMetadata) == null ? void 0 : _b.openai) == null ? void 0 : _c.imageDetail
|
|
}
|
|
};
|
|
}
|
|
case "file": {
|
|
if (part.data instanceof URL) {
|
|
throw new UnsupportedFunctionalityError({
|
|
functionality: "'File content parts with URL data' functionality not supported."
|
|
});
|
|
}
|
|
switch (part.mimeType) {
|
|
case "audio/wav": {
|
|
return {
|
|
type: "input_audio",
|
|
input_audio: { data: part.data, format: "wav" }
|
|
};
|
|
}
|
|
case "audio/mp3":
|
|
case "audio/mpeg": {
|
|
return {
|
|
type: "input_audio",
|
|
input_audio: { data: part.data, format: "mp3" }
|
|
};
|
|
}
|
|
case "application/pdf": {
|
|
return {
|
|
type: "file",
|
|
file: {
|
|
filename: (_d = part.filename) != null ? _d : `part-${index}.pdf`,
|
|
file_data: `data:application/pdf;base64,${part.data}`
|
|
}
|
|
};
|
|
}
|
|
default: {
|
|
throw new UnsupportedFunctionalityError({
|
|
functionality: `File content part type ${part.mimeType} in user messages`
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
});
|
|
break;
|
|
}
|
|
case "assistant": {
|
|
let text = "";
|
|
const toolCalls = [];
|
|
for (const part of content) {
|
|
switch (part.type) {
|
|
case "text": {
|
|
text += part.text;
|
|
break;
|
|
}
|
|
case "tool-call": {
|
|
toolCalls.push({
|
|
id: part.toolCallId,
|
|
type: "function",
|
|
function: {
|
|
name: part.toolName,
|
|
arguments: JSON.stringify(part.args)
|
|
}
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (useLegacyFunctionCalling) {
|
|
if (toolCalls.length > 1) {
|
|
throw new UnsupportedFunctionalityError({
|
|
functionality: "useLegacyFunctionCalling with multiple tool calls in one message"
|
|
});
|
|
}
|
|
messages.push({
|
|
role: "assistant",
|
|
content: text,
|
|
function_call: toolCalls.length > 0 ? toolCalls[0].function : void 0
|
|
});
|
|
} else {
|
|
messages.push({
|
|
role: "assistant",
|
|
content: text,
|
|
tool_calls: toolCalls.length > 0 ? toolCalls : void 0
|
|
});
|
|
}
|
|
break;
|
|
}
|
|
case "tool": {
|
|
for (const toolResponse of content) {
|
|
if (useLegacyFunctionCalling) {
|
|
messages.push({
|
|
role: "function",
|
|
name: toolResponse.toolName,
|
|
content: JSON.stringify(toolResponse.result)
|
|
});
|
|
} else {
|
|
messages.push({
|
|
role: "tool",
|
|
tool_call_id: toolResponse.toolCallId,
|
|
content: JSON.stringify(toolResponse.result)
|
|
});
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = role;
|
|
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
|
|
}
|
|
}
|
|
}
|
|
return { messages, warnings };
|
|
}
|
|
|
|
// src/map-openai-chat-logprobs.ts
|
|
function mapOpenAIChatLogProbsOutput(logprobs) {
|
|
var _a, _b;
|
|
return (_b = (_a = logprobs == null ? void 0 : logprobs.content) == null ? void 0 : _a.map(({ token, logprob, top_logprobs }) => ({
|
|
token,
|
|
logprob,
|
|
topLogprobs: top_logprobs ? top_logprobs.map(({ token: token2, logprob: logprob2 }) => ({
|
|
token: token2,
|
|
logprob: logprob2
|
|
})) : []
|
|
}))) != null ? _b : void 0;
|
|
}
|
|
|
|
// src/map-openai-finish-reason.ts
|
|
function mapOpenAIFinishReason(finishReason) {
|
|
switch (finishReason) {
|
|
case "stop":
|
|
return "stop";
|
|
case "length":
|
|
return "length";
|
|
case "content_filter":
|
|
return "content-filter";
|
|
case "function_call":
|
|
case "tool_calls":
|
|
return "tool-calls";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
// src/openai-error.ts
|
|
import { z } from "zod";
|
|
import { createJsonErrorResponseHandler } from "@ai-sdk/provider-utils";
|
|
var openaiErrorDataSchema = z.object({
|
|
error: z.object({
|
|
message: z.string(),
|
|
// The additional information below is handled loosely to support
|
|
// OpenAI-compatible providers that have slightly different error
|
|
// responses:
|
|
type: z.string().nullish(),
|
|
param: z.any().nullish(),
|
|
code: z.union([z.string(), z.number()]).nullish()
|
|
})
|
|
});
|
|
var openaiFailedResponseHandler = createJsonErrorResponseHandler({
|
|
errorSchema: openaiErrorDataSchema,
|
|
errorToMessage: (data) => data.error.message
|
|
});
|
|
|
|
// src/get-response-metadata.ts
|
|
function getResponseMetadata({
|
|
id,
|
|
model,
|
|
created
|
|
}) {
|
|
return {
|
|
id: id != null ? id : void 0,
|
|
modelId: model != null ? model : void 0,
|
|
timestamp: created != null ? new Date(created * 1e3) : void 0
|
|
};
|
|
}
|
|
|
|
// src/openai-prepare-tools.ts
|
|
import {
|
|
UnsupportedFunctionalityError as UnsupportedFunctionalityError2
|
|
} from "@ai-sdk/provider";
|
|
function prepareTools({
|
|
mode,
|
|
useLegacyFunctionCalling = false,
|
|
structuredOutputs
|
|
}) {
|
|
var _a;
|
|
const tools = ((_a = mode.tools) == null ? void 0 : _a.length) ? mode.tools : void 0;
|
|
const toolWarnings = [];
|
|
if (tools == null) {
|
|
return { tools: void 0, tool_choice: void 0, toolWarnings };
|
|
}
|
|
const toolChoice = mode.toolChoice;
|
|
if (useLegacyFunctionCalling) {
|
|
const openaiFunctions = [];
|
|
for (const tool of tools) {
|
|
if (tool.type === "provider-defined") {
|
|
toolWarnings.push({ type: "unsupported-tool", tool });
|
|
} else {
|
|
openaiFunctions.push({
|
|
name: tool.name,
|
|
description: tool.description,
|
|
parameters: tool.parameters
|
|
});
|
|
}
|
|
}
|
|
if (toolChoice == null) {
|
|
return {
|
|
functions: openaiFunctions,
|
|
function_call: void 0,
|
|
toolWarnings
|
|
};
|
|
}
|
|
const type2 = toolChoice.type;
|
|
switch (type2) {
|
|
case "auto":
|
|
case "none":
|
|
case void 0:
|
|
return {
|
|
functions: openaiFunctions,
|
|
function_call: void 0,
|
|
toolWarnings
|
|
};
|
|
case "required":
|
|
throw new UnsupportedFunctionalityError2({
|
|
functionality: "useLegacyFunctionCalling and toolChoice: required"
|
|
});
|
|
default:
|
|
return {
|
|
functions: openaiFunctions,
|
|
function_call: { name: toolChoice.toolName },
|
|
toolWarnings
|
|
};
|
|
}
|
|
}
|
|
const openaiTools = [];
|
|
for (const tool of tools) {
|
|
if (tool.type === "provider-defined") {
|
|
toolWarnings.push({ type: "unsupported-tool", tool });
|
|
} else {
|
|
openaiTools.push({
|
|
type: "function",
|
|
function: {
|
|
name: tool.name,
|
|
description: tool.description,
|
|
parameters: tool.parameters,
|
|
strict: structuredOutputs ? true : void 0
|
|
}
|
|
});
|
|
}
|
|
}
|
|
if (toolChoice == null) {
|
|
return { tools: openaiTools, tool_choice: void 0, toolWarnings };
|
|
}
|
|
const type = toolChoice.type;
|
|
switch (type) {
|
|
case "auto":
|
|
case "none":
|
|
case "required":
|
|
return { tools: openaiTools, tool_choice: type, toolWarnings };
|
|
case "tool":
|
|
return {
|
|
tools: openaiTools,
|
|
tool_choice: {
|
|
type: "function",
|
|
function: {
|
|
name: toolChoice.toolName
|
|
}
|
|
},
|
|
toolWarnings
|
|
};
|
|
default: {
|
|
const _exhaustiveCheck = type;
|
|
throw new UnsupportedFunctionalityError2({
|
|
functionality: `Unsupported tool choice type: ${_exhaustiveCheck}`
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// src/openai-chat-language-model.ts
|
|
var OpenAIChatLanguageModel = class {
|
|
constructor(modelId, settings, config) {
|
|
this.specificationVersion = "v1";
|
|
this.modelId = modelId;
|
|
this.settings = settings;
|
|
this.config = config;
|
|
}
|
|
get supportsStructuredOutputs() {
|
|
var _a;
|
|
return (_a = this.settings.structuredOutputs) != null ? _a : isReasoningModel(this.modelId);
|
|
}
|
|
get defaultObjectGenerationMode() {
|
|
if (isAudioModel(this.modelId)) {
|
|
return "tool";
|
|
}
|
|
return this.supportsStructuredOutputs ? "json" : "tool";
|
|
}
|
|
get provider() {
|
|
return this.config.provider;
|
|
}
|
|
get supportsImageUrls() {
|
|
return !this.settings.downloadImages;
|
|
}
|
|
getArgs({
|
|
mode,
|
|
prompt,
|
|
maxTokens,
|
|
temperature,
|
|
topP,
|
|
topK,
|
|
frequencyPenalty,
|
|
presencePenalty,
|
|
stopSequences,
|
|
responseFormat,
|
|
seed,
|
|
providerMetadata
|
|
}) {
|
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
const type = mode.type;
|
|
const warnings = [];
|
|
if (topK != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "topK"
|
|
});
|
|
}
|
|
if ((responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null && !this.supportsStructuredOutputs) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "responseFormat",
|
|
details: "JSON response format schema is only supported with structuredOutputs"
|
|
});
|
|
}
|
|
const useLegacyFunctionCalling = this.settings.useLegacyFunctionCalling;
|
|
if (useLegacyFunctionCalling && this.settings.parallelToolCalls === true) {
|
|
throw new UnsupportedFunctionalityError3({
|
|
functionality: "useLegacyFunctionCalling with parallelToolCalls"
|
|
});
|
|
}
|
|
if (useLegacyFunctionCalling && this.supportsStructuredOutputs) {
|
|
throw new UnsupportedFunctionalityError3({
|
|
functionality: "structuredOutputs with useLegacyFunctionCalling"
|
|
});
|
|
}
|
|
const { messages, warnings: messageWarnings } = convertToOpenAIChatMessages(
|
|
{
|
|
prompt,
|
|
useLegacyFunctionCalling,
|
|
systemMessageMode: getSystemMessageMode(this.modelId)
|
|
}
|
|
);
|
|
warnings.push(...messageWarnings);
|
|
const baseArgs = {
|
|
// model id:
|
|
model: this.modelId,
|
|
// model specific settings:
|
|
logit_bias: this.settings.logitBias,
|
|
logprobs: this.settings.logprobs === true || typeof this.settings.logprobs === "number" ? true : void 0,
|
|
top_logprobs: typeof this.settings.logprobs === "number" ? this.settings.logprobs : typeof this.settings.logprobs === "boolean" ? this.settings.logprobs ? 0 : void 0 : void 0,
|
|
user: this.settings.user,
|
|
parallel_tool_calls: this.settings.parallelToolCalls,
|
|
// standardized settings:
|
|
max_tokens: maxTokens,
|
|
temperature,
|
|
top_p: topP,
|
|
frequency_penalty: frequencyPenalty,
|
|
presence_penalty: presencePenalty,
|
|
response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? this.supportsStructuredOutputs && responseFormat.schema != null ? {
|
|
type: "json_schema",
|
|
json_schema: {
|
|
schema: responseFormat.schema,
|
|
strict: true,
|
|
name: (_a = responseFormat.name) != null ? _a : "response",
|
|
description: responseFormat.description
|
|
}
|
|
} : { type: "json_object" } : void 0,
|
|
stop: stopSequences,
|
|
seed,
|
|
// openai specific settings:
|
|
// TODO remove in next major version; we auto-map maxTokens now
|
|
max_completion_tokens: (_b = providerMetadata == null ? void 0 : providerMetadata.openai) == null ? void 0 : _b.maxCompletionTokens,
|
|
store: (_c = providerMetadata == null ? void 0 : providerMetadata.openai) == null ? void 0 : _c.store,
|
|
metadata: (_d = providerMetadata == null ? void 0 : providerMetadata.openai) == null ? void 0 : _d.metadata,
|
|
prediction: (_e = providerMetadata == null ? void 0 : providerMetadata.openai) == null ? void 0 : _e.prediction,
|
|
reasoning_effort: (_g = (_f = providerMetadata == null ? void 0 : providerMetadata.openai) == null ? void 0 : _f.reasoningEffort) != null ? _g : this.settings.reasoningEffort,
|
|
// messages:
|
|
messages
|
|
};
|
|
if (isReasoningModel(this.modelId)) {
|
|
if (baseArgs.temperature != null) {
|
|
baseArgs.temperature = void 0;
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "temperature",
|
|
details: "temperature is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.top_p != null) {
|
|
baseArgs.top_p = void 0;
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "topP",
|
|
details: "topP is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.frequency_penalty != null) {
|
|
baseArgs.frequency_penalty = void 0;
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "frequencyPenalty",
|
|
details: "frequencyPenalty is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.presence_penalty != null) {
|
|
baseArgs.presence_penalty = void 0;
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "presencePenalty",
|
|
details: "presencePenalty is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.logit_bias != null) {
|
|
baseArgs.logit_bias = void 0;
|
|
warnings.push({
|
|
type: "other",
|
|
message: "logitBias is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.logprobs != null) {
|
|
baseArgs.logprobs = void 0;
|
|
warnings.push({
|
|
type: "other",
|
|
message: "logprobs is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.top_logprobs != null) {
|
|
baseArgs.top_logprobs = void 0;
|
|
warnings.push({
|
|
type: "other",
|
|
message: "topLogprobs is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.max_tokens != null) {
|
|
if (baseArgs.max_completion_tokens == null) {
|
|
baseArgs.max_completion_tokens = baseArgs.max_tokens;
|
|
}
|
|
baseArgs.max_tokens = void 0;
|
|
}
|
|
} else if (this.modelId.startsWith("gpt-4o-search-preview") || this.modelId.startsWith("gpt-4o-mini-search-preview")) {
|
|
if (baseArgs.temperature != null) {
|
|
baseArgs.temperature = void 0;
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "temperature",
|
|
details: "temperature is not supported for the search preview models and has been removed."
|
|
});
|
|
}
|
|
}
|
|
switch (type) {
|
|
case "regular": {
|
|
const { tools, tool_choice, functions, function_call, toolWarnings } = prepareTools({
|
|
mode,
|
|
useLegacyFunctionCalling,
|
|
structuredOutputs: this.supportsStructuredOutputs
|
|
});
|
|
return {
|
|
args: {
|
|
...baseArgs,
|
|
tools,
|
|
tool_choice,
|
|
functions,
|
|
function_call
|
|
},
|
|
warnings: [...warnings, ...toolWarnings]
|
|
};
|
|
}
|
|
case "object-json": {
|
|
return {
|
|
args: {
|
|
...baseArgs,
|
|
response_format: this.supportsStructuredOutputs && mode.schema != null ? {
|
|
type: "json_schema",
|
|
json_schema: {
|
|
schema: mode.schema,
|
|
strict: true,
|
|
name: (_h = mode.name) != null ? _h : "response",
|
|
description: mode.description
|
|
}
|
|
} : { type: "json_object" }
|
|
},
|
|
warnings
|
|
};
|
|
}
|
|
case "object-tool": {
|
|
return {
|
|
args: useLegacyFunctionCalling ? {
|
|
...baseArgs,
|
|
function_call: {
|
|
name: mode.tool.name
|
|
},
|
|
functions: [
|
|
{
|
|
name: mode.tool.name,
|
|
description: mode.tool.description,
|
|
parameters: mode.tool.parameters
|
|
}
|
|
]
|
|
} : {
|
|
...baseArgs,
|
|
tool_choice: {
|
|
type: "function",
|
|
function: { name: mode.tool.name }
|
|
},
|
|
tools: [
|
|
{
|
|
type: "function",
|
|
function: {
|
|
name: mode.tool.name,
|
|
description: mode.tool.description,
|
|
parameters: mode.tool.parameters,
|
|
strict: this.supportsStructuredOutputs ? true : void 0
|
|
}
|
|
}
|
|
]
|
|
},
|
|
warnings
|
|
};
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = type;
|
|
throw new Error(`Unsupported type: ${_exhaustiveCheck}`);
|
|
}
|
|
}
|
|
}
|
|
async doGenerate(options) {
|
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
const { args: body, warnings } = this.getArgs(options);
|
|
const {
|
|
responseHeaders,
|
|
value: response,
|
|
rawValue: rawResponse
|
|
} = await postJsonToApi({
|
|
url: this.config.url({
|
|
path: "/chat/completions",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders(this.config.headers(), options.headers),
|
|
body,
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createJsonResponseHandler(
|
|
openaiChatResponseSchema
|
|
),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
const { messages: rawPrompt, ...rawSettings } = body;
|
|
const choice = response.choices[0];
|
|
const completionTokenDetails = (_a = response.usage) == null ? void 0 : _a.completion_tokens_details;
|
|
const promptTokenDetails = (_b = response.usage) == null ? void 0 : _b.prompt_tokens_details;
|
|
const providerMetadata = { openai: {} };
|
|
if ((completionTokenDetails == null ? void 0 : completionTokenDetails.reasoning_tokens) != null) {
|
|
providerMetadata.openai.reasoningTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.reasoning_tokens;
|
|
}
|
|
if ((completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens) != null) {
|
|
providerMetadata.openai.acceptedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens;
|
|
}
|
|
if ((completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens) != null) {
|
|
providerMetadata.openai.rejectedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens;
|
|
}
|
|
if ((promptTokenDetails == null ? void 0 : promptTokenDetails.cached_tokens) != null) {
|
|
providerMetadata.openai.cachedPromptTokens = promptTokenDetails == null ? void 0 : promptTokenDetails.cached_tokens;
|
|
}
|
|
return {
|
|
text: (_c = choice.message.content) != null ? _c : void 0,
|
|
toolCalls: this.settings.useLegacyFunctionCalling && choice.message.function_call ? [
|
|
{
|
|
toolCallType: "function",
|
|
toolCallId: generateId(),
|
|
toolName: choice.message.function_call.name,
|
|
args: choice.message.function_call.arguments
|
|
}
|
|
] : (_d = choice.message.tool_calls) == null ? void 0 : _d.map((toolCall) => {
|
|
var _a2;
|
|
return {
|
|
toolCallType: "function",
|
|
toolCallId: (_a2 = toolCall.id) != null ? _a2 : generateId(),
|
|
toolName: toolCall.function.name,
|
|
args: toolCall.function.arguments
|
|
};
|
|
}),
|
|
finishReason: mapOpenAIFinishReason(choice.finish_reason),
|
|
usage: {
|
|
promptTokens: (_f = (_e = response.usage) == null ? void 0 : _e.prompt_tokens) != null ? _f : NaN,
|
|
completionTokens: (_h = (_g = response.usage) == null ? void 0 : _g.completion_tokens) != null ? _h : NaN
|
|
},
|
|
rawCall: { rawPrompt, rawSettings },
|
|
rawResponse: { headers: responseHeaders, body: rawResponse },
|
|
request: { body: JSON.stringify(body) },
|
|
response: getResponseMetadata(response),
|
|
warnings,
|
|
logprobs: mapOpenAIChatLogProbsOutput(choice.logprobs),
|
|
providerMetadata
|
|
};
|
|
}
|
|
async doStream(options) {
|
|
if (this.settings.simulateStreaming) {
|
|
const result = await this.doGenerate(options);
|
|
const simulatedStream = new ReadableStream({
|
|
start(controller) {
|
|
controller.enqueue({ type: "response-metadata", ...result.response });
|
|
if (result.text) {
|
|
controller.enqueue({
|
|
type: "text-delta",
|
|
textDelta: result.text
|
|
});
|
|
}
|
|
if (result.toolCalls) {
|
|
for (const toolCall of result.toolCalls) {
|
|
controller.enqueue({
|
|
type: "tool-call-delta",
|
|
toolCallType: "function",
|
|
toolCallId: toolCall.toolCallId,
|
|
toolName: toolCall.toolName,
|
|
argsTextDelta: toolCall.args
|
|
});
|
|
controller.enqueue({
|
|
type: "tool-call",
|
|
...toolCall
|
|
});
|
|
}
|
|
}
|
|
controller.enqueue({
|
|
type: "finish",
|
|
finishReason: result.finishReason,
|
|
usage: result.usage,
|
|
logprobs: result.logprobs,
|
|
providerMetadata: result.providerMetadata
|
|
});
|
|
controller.close();
|
|
}
|
|
});
|
|
return {
|
|
stream: simulatedStream,
|
|
rawCall: result.rawCall,
|
|
rawResponse: result.rawResponse,
|
|
warnings: result.warnings
|
|
};
|
|
}
|
|
const { args, warnings } = this.getArgs(options);
|
|
const body = {
|
|
...args,
|
|
stream: true,
|
|
// only include stream_options when in strict compatibility mode:
|
|
stream_options: this.config.compatibility === "strict" ? { include_usage: true } : void 0
|
|
};
|
|
const { responseHeaders, value: response } = await postJsonToApi({
|
|
url: this.config.url({
|
|
path: "/chat/completions",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders(this.config.headers(), options.headers),
|
|
body,
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createEventSourceResponseHandler(
|
|
openaiChatChunkSchema
|
|
),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
const { messages: rawPrompt, ...rawSettings } = args;
|
|
const toolCalls = [];
|
|
let finishReason = "unknown";
|
|
let usage = {
|
|
promptTokens: void 0,
|
|
completionTokens: void 0
|
|
};
|
|
let logprobs;
|
|
let isFirstChunk = true;
|
|
const { useLegacyFunctionCalling } = this.settings;
|
|
const providerMetadata = { openai: {} };
|
|
return {
|
|
stream: response.pipeThrough(
|
|
new TransformStream({
|
|
transform(chunk, controller) {
|
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
|
|
if (!chunk.success) {
|
|
finishReason = "error";
|
|
controller.enqueue({ type: "error", error: chunk.error });
|
|
return;
|
|
}
|
|
const value = chunk.value;
|
|
if ("error" in value) {
|
|
finishReason = "error";
|
|
controller.enqueue({ type: "error", error: value.error });
|
|
return;
|
|
}
|
|
if (isFirstChunk) {
|
|
isFirstChunk = false;
|
|
controller.enqueue({
|
|
type: "response-metadata",
|
|
...getResponseMetadata(value)
|
|
});
|
|
}
|
|
if (value.usage != null) {
|
|
const {
|
|
prompt_tokens,
|
|
completion_tokens,
|
|
prompt_tokens_details,
|
|
completion_tokens_details
|
|
} = value.usage;
|
|
usage = {
|
|
promptTokens: prompt_tokens != null ? prompt_tokens : void 0,
|
|
completionTokens: completion_tokens != null ? completion_tokens : void 0
|
|
};
|
|
if ((completion_tokens_details == null ? void 0 : completion_tokens_details.reasoning_tokens) != null) {
|
|
providerMetadata.openai.reasoningTokens = completion_tokens_details == null ? void 0 : completion_tokens_details.reasoning_tokens;
|
|
}
|
|
if ((completion_tokens_details == null ? void 0 : completion_tokens_details.accepted_prediction_tokens) != null) {
|
|
providerMetadata.openai.acceptedPredictionTokens = completion_tokens_details == null ? void 0 : completion_tokens_details.accepted_prediction_tokens;
|
|
}
|
|
if ((completion_tokens_details == null ? void 0 : completion_tokens_details.rejected_prediction_tokens) != null) {
|
|
providerMetadata.openai.rejectedPredictionTokens = completion_tokens_details == null ? void 0 : completion_tokens_details.rejected_prediction_tokens;
|
|
}
|
|
if ((prompt_tokens_details == null ? void 0 : prompt_tokens_details.cached_tokens) != null) {
|
|
providerMetadata.openai.cachedPromptTokens = prompt_tokens_details == null ? void 0 : prompt_tokens_details.cached_tokens;
|
|
}
|
|
}
|
|
const choice = value.choices[0];
|
|
if ((choice == null ? void 0 : choice.finish_reason) != null) {
|
|
finishReason = mapOpenAIFinishReason(choice.finish_reason);
|
|
}
|
|
if ((choice == null ? void 0 : choice.delta) == null) {
|
|
return;
|
|
}
|
|
const delta = choice.delta;
|
|
if (delta.content != null) {
|
|
controller.enqueue({
|
|
type: "text-delta",
|
|
textDelta: delta.content
|
|
});
|
|
}
|
|
const mappedLogprobs = mapOpenAIChatLogProbsOutput(
|
|
choice == null ? void 0 : choice.logprobs
|
|
);
|
|
if (mappedLogprobs == null ? void 0 : mappedLogprobs.length) {
|
|
if (logprobs === void 0) logprobs = [];
|
|
logprobs.push(...mappedLogprobs);
|
|
}
|
|
const mappedToolCalls = useLegacyFunctionCalling && delta.function_call != null ? [
|
|
{
|
|
type: "function",
|
|
id: generateId(),
|
|
function: delta.function_call,
|
|
index: 0
|
|
}
|
|
] : delta.tool_calls;
|
|
if (mappedToolCalls != null) {
|
|
for (const toolCallDelta of mappedToolCalls) {
|
|
const index = toolCallDelta.index;
|
|
if (toolCalls[index] == null) {
|
|
if (toolCallDelta.type !== "function") {
|
|
throw new InvalidResponseDataError({
|
|
data: toolCallDelta,
|
|
message: `Expected 'function' type.`
|
|
});
|
|
}
|
|
if (toolCallDelta.id == null) {
|
|
throw new InvalidResponseDataError({
|
|
data: toolCallDelta,
|
|
message: `Expected 'id' to be a string.`
|
|
});
|
|
}
|
|
if (((_a = toolCallDelta.function) == null ? void 0 : _a.name) == null) {
|
|
throw new InvalidResponseDataError({
|
|
data: toolCallDelta,
|
|
message: `Expected 'function.name' to be a string.`
|
|
});
|
|
}
|
|
toolCalls[index] = {
|
|
id: toolCallDelta.id,
|
|
type: "function",
|
|
function: {
|
|
name: toolCallDelta.function.name,
|
|
arguments: (_b = toolCallDelta.function.arguments) != null ? _b : ""
|
|
},
|
|
hasFinished: false
|
|
};
|
|
const toolCall2 = toolCalls[index];
|
|
if (((_c = toolCall2.function) == null ? void 0 : _c.name) != null && ((_d = toolCall2.function) == null ? void 0 : _d.arguments) != null) {
|
|
if (toolCall2.function.arguments.length > 0) {
|
|
controller.enqueue({
|
|
type: "tool-call-delta",
|
|
toolCallType: "function",
|
|
toolCallId: toolCall2.id,
|
|
toolName: toolCall2.function.name,
|
|
argsTextDelta: toolCall2.function.arguments
|
|
});
|
|
}
|
|
if (isParsableJson(toolCall2.function.arguments)) {
|
|
controller.enqueue({
|
|
type: "tool-call",
|
|
toolCallType: "function",
|
|
toolCallId: (_e = toolCall2.id) != null ? _e : generateId(),
|
|
toolName: toolCall2.function.name,
|
|
args: toolCall2.function.arguments
|
|
});
|
|
toolCall2.hasFinished = true;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
const toolCall = toolCalls[index];
|
|
if (toolCall.hasFinished) {
|
|
continue;
|
|
}
|
|
if (((_f = toolCallDelta.function) == null ? void 0 : _f.arguments) != null) {
|
|
toolCall.function.arguments += (_h = (_g = toolCallDelta.function) == null ? void 0 : _g.arguments) != null ? _h : "";
|
|
}
|
|
controller.enqueue({
|
|
type: "tool-call-delta",
|
|
toolCallType: "function",
|
|
toolCallId: toolCall.id,
|
|
toolName: toolCall.function.name,
|
|
argsTextDelta: (_i = toolCallDelta.function.arguments) != null ? _i : ""
|
|
});
|
|
if (((_j = toolCall.function) == null ? void 0 : _j.name) != null && ((_k = toolCall.function) == null ? void 0 : _k.arguments) != null && isParsableJson(toolCall.function.arguments)) {
|
|
controller.enqueue({
|
|
type: "tool-call",
|
|
toolCallType: "function",
|
|
toolCallId: (_l = toolCall.id) != null ? _l : generateId(),
|
|
toolName: toolCall.function.name,
|
|
args: toolCall.function.arguments
|
|
});
|
|
toolCall.hasFinished = true;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
flush(controller) {
|
|
var _a, _b;
|
|
controller.enqueue({
|
|
type: "finish",
|
|
finishReason,
|
|
logprobs,
|
|
usage: {
|
|
promptTokens: (_a = usage.promptTokens) != null ? _a : NaN,
|
|
completionTokens: (_b = usage.completionTokens) != null ? _b : NaN
|
|
},
|
|
...providerMetadata != null ? { providerMetadata } : {}
|
|
});
|
|
}
|
|
})
|
|
),
|
|
rawCall: { rawPrompt, rawSettings },
|
|
rawResponse: { headers: responseHeaders },
|
|
request: { body: JSON.stringify(body) },
|
|
warnings
|
|
};
|
|
}
|
|
};
|
|
var openaiTokenUsageSchema = z2.object({
|
|
prompt_tokens: z2.number().nullish(),
|
|
completion_tokens: z2.number().nullish(),
|
|
prompt_tokens_details: z2.object({
|
|
cached_tokens: z2.number().nullish()
|
|
}).nullish(),
|
|
completion_tokens_details: z2.object({
|
|
reasoning_tokens: z2.number().nullish(),
|
|
accepted_prediction_tokens: z2.number().nullish(),
|
|
rejected_prediction_tokens: z2.number().nullish()
|
|
}).nullish()
|
|
}).nullish();
|
|
var openaiChatResponseSchema = z2.object({
|
|
id: z2.string().nullish(),
|
|
created: z2.number().nullish(),
|
|
model: z2.string().nullish(),
|
|
choices: z2.array(
|
|
z2.object({
|
|
message: z2.object({
|
|
role: z2.literal("assistant").nullish(),
|
|
content: z2.string().nullish(),
|
|
function_call: z2.object({
|
|
arguments: z2.string(),
|
|
name: z2.string()
|
|
}).nullish(),
|
|
tool_calls: z2.array(
|
|
z2.object({
|
|
id: z2.string().nullish(),
|
|
type: z2.literal("function"),
|
|
function: z2.object({
|
|
name: z2.string(),
|
|
arguments: z2.string()
|
|
})
|
|
})
|
|
).nullish()
|
|
}),
|
|
index: z2.number(),
|
|
logprobs: z2.object({
|
|
content: z2.array(
|
|
z2.object({
|
|
token: z2.string(),
|
|
logprob: z2.number(),
|
|
top_logprobs: z2.array(
|
|
z2.object({
|
|
token: z2.string(),
|
|
logprob: z2.number()
|
|
})
|
|
)
|
|
})
|
|
).nullable()
|
|
}).nullish(),
|
|
finish_reason: z2.string().nullish()
|
|
})
|
|
),
|
|
usage: openaiTokenUsageSchema
|
|
});
|
|
var openaiChatChunkSchema = z2.union([
|
|
z2.object({
|
|
id: z2.string().nullish(),
|
|
created: z2.number().nullish(),
|
|
model: z2.string().nullish(),
|
|
choices: z2.array(
|
|
z2.object({
|
|
delta: z2.object({
|
|
role: z2.enum(["assistant"]).nullish(),
|
|
content: z2.string().nullish(),
|
|
function_call: z2.object({
|
|
name: z2.string().optional(),
|
|
arguments: z2.string().optional()
|
|
}).nullish(),
|
|
tool_calls: z2.array(
|
|
z2.object({
|
|
index: z2.number(),
|
|
id: z2.string().nullish(),
|
|
type: z2.literal("function").nullish(),
|
|
function: z2.object({
|
|
name: z2.string().nullish(),
|
|
arguments: z2.string().nullish()
|
|
})
|
|
})
|
|
).nullish()
|
|
}).nullish(),
|
|
logprobs: z2.object({
|
|
content: z2.array(
|
|
z2.object({
|
|
token: z2.string(),
|
|
logprob: z2.number(),
|
|
top_logprobs: z2.array(
|
|
z2.object({
|
|
token: z2.string(),
|
|
logprob: z2.number()
|
|
})
|
|
)
|
|
})
|
|
).nullable()
|
|
}).nullish(),
|
|
finish_reason: z2.string().nullish(),
|
|
index: z2.number()
|
|
})
|
|
),
|
|
usage: openaiTokenUsageSchema
|
|
}),
|
|
openaiErrorDataSchema
|
|
]);
|
|
function isReasoningModel(modelId) {
|
|
return modelId.startsWith("o") || modelId.startsWith("gpt-5");
|
|
}
|
|
function isAudioModel(modelId) {
|
|
return modelId.startsWith("gpt-4o-audio-preview");
|
|
}
|
|
function getSystemMessageMode(modelId) {
|
|
var _a, _b;
|
|
if (!isReasoningModel(modelId)) {
|
|
return "system";
|
|
}
|
|
return (_b = (_a = reasoningModels[modelId]) == null ? void 0 : _a.systemMessageMode) != null ? _b : "developer";
|
|
}
|
|
var reasoningModels = {
|
|
"o1-mini": {
|
|
systemMessageMode: "remove"
|
|
},
|
|
"o1-mini-2024-09-12": {
|
|
systemMessageMode: "remove"
|
|
},
|
|
"o1-preview": {
|
|
systemMessageMode: "remove"
|
|
},
|
|
"o1-preview-2024-09-12": {
|
|
systemMessageMode: "remove"
|
|
},
|
|
o3: {
|
|
systemMessageMode: "developer"
|
|
},
|
|
"o3-2025-04-16": {
|
|
systemMessageMode: "developer"
|
|
},
|
|
"o3-mini": {
|
|
systemMessageMode: "developer"
|
|
},
|
|
"o3-mini-2025-01-31": {
|
|
systemMessageMode: "developer"
|
|
},
|
|
"o4-mini": {
|
|
systemMessageMode: "developer"
|
|
},
|
|
"o4-mini-2025-04-16": {
|
|
systemMessageMode: "developer"
|
|
}
|
|
};
|
|
|
|
// src/openai-completion-language-model.ts
|
|
import {
|
|
UnsupportedFunctionalityError as UnsupportedFunctionalityError5
|
|
} from "@ai-sdk/provider";
|
|
import {
|
|
combineHeaders as combineHeaders2,
|
|
createEventSourceResponseHandler as createEventSourceResponseHandler2,
|
|
createJsonResponseHandler as createJsonResponseHandler2,
|
|
postJsonToApi as postJsonToApi2
|
|
} from "@ai-sdk/provider-utils";
|
|
import { z as z3 } from "zod";
|
|
|
|
// src/convert-to-openai-completion-prompt.ts
|
|
import {
|
|
InvalidPromptError,
|
|
UnsupportedFunctionalityError as UnsupportedFunctionalityError4
|
|
} from "@ai-sdk/provider";
|
|
function convertToOpenAICompletionPrompt({
|
|
prompt,
|
|
inputFormat,
|
|
user = "user",
|
|
assistant = "assistant"
|
|
}) {
|
|
if (inputFormat === "prompt" && prompt.length === 1 && prompt[0].role === "user" && prompt[0].content.length === 1 && prompt[0].content[0].type === "text") {
|
|
return { prompt: prompt[0].content[0].text };
|
|
}
|
|
let text = "";
|
|
if (prompt[0].role === "system") {
|
|
text += `${prompt[0].content}
|
|
|
|
`;
|
|
prompt = prompt.slice(1);
|
|
}
|
|
for (const { role, content } of prompt) {
|
|
switch (role) {
|
|
case "system": {
|
|
throw new InvalidPromptError({
|
|
message: "Unexpected system message in prompt: ${content}",
|
|
prompt
|
|
});
|
|
}
|
|
case "user": {
|
|
const userMessage = content.map((part) => {
|
|
switch (part.type) {
|
|
case "text": {
|
|
return part.text;
|
|
}
|
|
case "image": {
|
|
throw new UnsupportedFunctionalityError4({
|
|
functionality: "images"
|
|
});
|
|
}
|
|
}
|
|
}).join("");
|
|
text += `${user}:
|
|
${userMessage}
|
|
|
|
`;
|
|
break;
|
|
}
|
|
case "assistant": {
|
|
const assistantMessage = content.map((part) => {
|
|
switch (part.type) {
|
|
case "text": {
|
|
return part.text;
|
|
}
|
|
case "tool-call": {
|
|
throw new UnsupportedFunctionalityError4({
|
|
functionality: "tool-call messages"
|
|
});
|
|
}
|
|
}
|
|
}).join("");
|
|
text += `${assistant}:
|
|
${assistantMessage}
|
|
|
|
`;
|
|
break;
|
|
}
|
|
case "tool": {
|
|
throw new UnsupportedFunctionalityError4({
|
|
functionality: "tool messages"
|
|
});
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = role;
|
|
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
|
|
}
|
|
}
|
|
}
|
|
text += `${assistant}:
|
|
`;
|
|
return {
|
|
prompt: text,
|
|
stopSequences: [`
|
|
${user}:`]
|
|
};
|
|
}
|
|
|
|
// src/map-openai-completion-logprobs.ts
|
|
function mapOpenAICompletionLogProbs(logprobs) {
|
|
return logprobs == null ? void 0 : logprobs.tokens.map((token, index) => ({
|
|
token,
|
|
logprob: logprobs.token_logprobs[index],
|
|
topLogprobs: logprobs.top_logprobs ? Object.entries(logprobs.top_logprobs[index]).map(
|
|
([token2, logprob]) => ({
|
|
token: token2,
|
|
logprob
|
|
})
|
|
) : []
|
|
}));
|
|
}
|
|
|
|
// src/openai-completion-language-model.ts
|
|
var OpenAICompletionLanguageModel = class {
|
|
constructor(modelId, settings, config) {
|
|
this.specificationVersion = "v1";
|
|
this.defaultObjectGenerationMode = void 0;
|
|
this.modelId = modelId;
|
|
this.settings = settings;
|
|
this.config = config;
|
|
}
|
|
get provider() {
|
|
return this.config.provider;
|
|
}
|
|
getArgs({
|
|
mode,
|
|
inputFormat,
|
|
prompt,
|
|
maxTokens,
|
|
temperature,
|
|
topP,
|
|
topK,
|
|
frequencyPenalty,
|
|
presencePenalty,
|
|
stopSequences: userStopSequences,
|
|
responseFormat,
|
|
seed
|
|
}) {
|
|
var _a;
|
|
const type = mode.type;
|
|
const warnings = [];
|
|
if (topK != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "topK"
|
|
});
|
|
}
|
|
if (responseFormat != null && responseFormat.type !== "text") {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "responseFormat",
|
|
details: "JSON response format is not supported."
|
|
});
|
|
}
|
|
const { prompt: completionPrompt, stopSequences } = convertToOpenAICompletionPrompt({ prompt, inputFormat });
|
|
const stop = [...stopSequences != null ? stopSequences : [], ...userStopSequences != null ? userStopSequences : []];
|
|
const baseArgs = {
|
|
// model id:
|
|
model: this.modelId,
|
|
// model specific settings:
|
|
echo: this.settings.echo,
|
|
logit_bias: this.settings.logitBias,
|
|
logprobs: typeof this.settings.logprobs === "number" ? this.settings.logprobs : typeof this.settings.logprobs === "boolean" ? this.settings.logprobs ? 0 : void 0 : void 0,
|
|
suffix: this.settings.suffix,
|
|
user: this.settings.user,
|
|
// standardized settings:
|
|
max_tokens: maxTokens,
|
|
temperature,
|
|
top_p: topP,
|
|
frequency_penalty: frequencyPenalty,
|
|
presence_penalty: presencePenalty,
|
|
seed,
|
|
// prompt:
|
|
prompt: completionPrompt,
|
|
// stop sequences:
|
|
stop: stop.length > 0 ? stop : void 0
|
|
};
|
|
switch (type) {
|
|
case "regular": {
|
|
if ((_a = mode.tools) == null ? void 0 : _a.length) {
|
|
throw new UnsupportedFunctionalityError5({
|
|
functionality: "tools"
|
|
});
|
|
}
|
|
if (mode.toolChoice) {
|
|
throw new UnsupportedFunctionalityError5({
|
|
functionality: "toolChoice"
|
|
});
|
|
}
|
|
return { args: baseArgs, warnings };
|
|
}
|
|
case "object-json": {
|
|
throw new UnsupportedFunctionalityError5({
|
|
functionality: "object-json mode"
|
|
});
|
|
}
|
|
case "object-tool": {
|
|
throw new UnsupportedFunctionalityError5({
|
|
functionality: "object-tool mode"
|
|
});
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = type;
|
|
throw new Error(`Unsupported type: ${_exhaustiveCheck}`);
|
|
}
|
|
}
|
|
}
|
|
async doGenerate(options) {
|
|
const { args, warnings } = this.getArgs(options);
|
|
const {
|
|
responseHeaders,
|
|
value: response,
|
|
rawValue: rawResponse
|
|
} = await postJsonToApi2({
|
|
url: this.config.url({
|
|
path: "/completions",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders2(this.config.headers(), options.headers),
|
|
body: args,
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createJsonResponseHandler2(
|
|
openaiCompletionResponseSchema
|
|
),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
const { prompt: rawPrompt, ...rawSettings } = args;
|
|
const choice = response.choices[0];
|
|
return {
|
|
text: choice.text,
|
|
usage: {
|
|
promptTokens: response.usage.prompt_tokens,
|
|
completionTokens: response.usage.completion_tokens
|
|
},
|
|
finishReason: mapOpenAIFinishReason(choice.finish_reason),
|
|
logprobs: mapOpenAICompletionLogProbs(choice.logprobs),
|
|
rawCall: { rawPrompt, rawSettings },
|
|
rawResponse: { headers: responseHeaders, body: rawResponse },
|
|
response: getResponseMetadata(response),
|
|
warnings,
|
|
request: { body: JSON.stringify(args) }
|
|
};
|
|
}
|
|
async doStream(options) {
|
|
const { args, warnings } = this.getArgs(options);
|
|
const body = {
|
|
...args,
|
|
stream: true,
|
|
// only include stream_options when in strict compatibility mode:
|
|
stream_options: this.config.compatibility === "strict" ? { include_usage: true } : void 0
|
|
};
|
|
const { responseHeaders, value: response } = await postJsonToApi2({
|
|
url: this.config.url({
|
|
path: "/completions",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders2(this.config.headers(), options.headers),
|
|
body,
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createEventSourceResponseHandler2(
|
|
openaiCompletionChunkSchema
|
|
),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
const { prompt: rawPrompt, ...rawSettings } = args;
|
|
let finishReason = "unknown";
|
|
let usage = {
|
|
promptTokens: Number.NaN,
|
|
completionTokens: Number.NaN
|
|
};
|
|
let logprobs;
|
|
let isFirstChunk = true;
|
|
return {
|
|
stream: response.pipeThrough(
|
|
new TransformStream({
|
|
transform(chunk, controller) {
|
|
if (!chunk.success) {
|
|
finishReason = "error";
|
|
controller.enqueue({ type: "error", error: chunk.error });
|
|
return;
|
|
}
|
|
const value = chunk.value;
|
|
if ("error" in value) {
|
|
finishReason = "error";
|
|
controller.enqueue({ type: "error", error: value.error });
|
|
return;
|
|
}
|
|
if (isFirstChunk) {
|
|
isFirstChunk = false;
|
|
controller.enqueue({
|
|
type: "response-metadata",
|
|
...getResponseMetadata(value)
|
|
});
|
|
}
|
|
if (value.usage != null) {
|
|
usage = {
|
|
promptTokens: value.usage.prompt_tokens,
|
|
completionTokens: value.usage.completion_tokens
|
|
};
|
|
}
|
|
const choice = value.choices[0];
|
|
if ((choice == null ? void 0 : choice.finish_reason) != null) {
|
|
finishReason = mapOpenAIFinishReason(choice.finish_reason);
|
|
}
|
|
if ((choice == null ? void 0 : choice.text) != null) {
|
|
controller.enqueue({
|
|
type: "text-delta",
|
|
textDelta: choice.text
|
|
});
|
|
}
|
|
const mappedLogprobs = mapOpenAICompletionLogProbs(
|
|
choice == null ? void 0 : choice.logprobs
|
|
);
|
|
if (mappedLogprobs == null ? void 0 : mappedLogprobs.length) {
|
|
if (logprobs === void 0) logprobs = [];
|
|
logprobs.push(...mappedLogprobs);
|
|
}
|
|
},
|
|
flush(controller) {
|
|
controller.enqueue({
|
|
type: "finish",
|
|
finishReason,
|
|
logprobs,
|
|
usage
|
|
});
|
|
}
|
|
})
|
|
),
|
|
rawCall: { rawPrompt, rawSettings },
|
|
rawResponse: { headers: responseHeaders },
|
|
warnings,
|
|
request: { body: JSON.stringify(body) }
|
|
};
|
|
}
|
|
};
|
|
var openaiCompletionResponseSchema = z3.object({
|
|
id: z3.string().nullish(),
|
|
created: z3.number().nullish(),
|
|
model: z3.string().nullish(),
|
|
choices: z3.array(
|
|
z3.object({
|
|
text: z3.string(),
|
|
finish_reason: z3.string(),
|
|
logprobs: z3.object({
|
|
tokens: z3.array(z3.string()),
|
|
token_logprobs: z3.array(z3.number()),
|
|
top_logprobs: z3.array(z3.record(z3.string(), z3.number())).nullable()
|
|
}).nullish()
|
|
})
|
|
),
|
|
usage: z3.object({
|
|
prompt_tokens: z3.number(),
|
|
completion_tokens: z3.number()
|
|
})
|
|
});
|
|
var openaiCompletionChunkSchema = z3.union([
|
|
z3.object({
|
|
id: z3.string().nullish(),
|
|
created: z3.number().nullish(),
|
|
model: z3.string().nullish(),
|
|
choices: z3.array(
|
|
z3.object({
|
|
text: z3.string(),
|
|
finish_reason: z3.string().nullish(),
|
|
index: z3.number(),
|
|
logprobs: z3.object({
|
|
tokens: z3.array(z3.string()),
|
|
token_logprobs: z3.array(z3.number()),
|
|
top_logprobs: z3.array(z3.record(z3.string(), z3.number())).nullable()
|
|
}).nullish()
|
|
})
|
|
),
|
|
usage: z3.object({
|
|
prompt_tokens: z3.number(),
|
|
completion_tokens: z3.number()
|
|
}).nullish()
|
|
}),
|
|
openaiErrorDataSchema
|
|
]);
|
|
|
|
// src/openai-embedding-model.ts
|
|
import {
|
|
TooManyEmbeddingValuesForCallError
|
|
} from "@ai-sdk/provider";
|
|
import {
|
|
combineHeaders as combineHeaders3,
|
|
createJsonResponseHandler as createJsonResponseHandler3,
|
|
postJsonToApi as postJsonToApi3
|
|
} from "@ai-sdk/provider-utils";
|
|
import { z as z4 } from "zod";
|
|
var OpenAIEmbeddingModel = class {
|
|
constructor(modelId, settings, config) {
|
|
this.specificationVersion = "v1";
|
|
this.modelId = modelId;
|
|
this.settings = settings;
|
|
this.config = config;
|
|
}
|
|
get provider() {
|
|
return this.config.provider;
|
|
}
|
|
get maxEmbeddingsPerCall() {
|
|
var _a;
|
|
return (_a = this.settings.maxEmbeddingsPerCall) != null ? _a : 2048;
|
|
}
|
|
get supportsParallelCalls() {
|
|
var _a;
|
|
return (_a = this.settings.supportsParallelCalls) != null ? _a : true;
|
|
}
|
|
async doEmbed({
|
|
values,
|
|
headers,
|
|
abortSignal
|
|
}) {
|
|
if (values.length > this.maxEmbeddingsPerCall) {
|
|
throw new TooManyEmbeddingValuesForCallError({
|
|
provider: this.provider,
|
|
modelId: this.modelId,
|
|
maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,
|
|
values
|
|
});
|
|
}
|
|
const { responseHeaders, value: response } = await postJsonToApi3({
|
|
url: this.config.url({
|
|
path: "/embeddings",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders3(this.config.headers(), headers),
|
|
body: {
|
|
model: this.modelId,
|
|
input: values,
|
|
encoding_format: "float",
|
|
dimensions: this.settings.dimensions,
|
|
user: this.settings.user
|
|
},
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createJsonResponseHandler3(
|
|
openaiTextEmbeddingResponseSchema
|
|
),
|
|
abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
return {
|
|
embeddings: response.data.map((item) => item.embedding),
|
|
usage: response.usage ? { tokens: response.usage.prompt_tokens } : void 0,
|
|
rawResponse: { headers: responseHeaders }
|
|
};
|
|
}
|
|
};
|
|
var openaiTextEmbeddingResponseSchema = z4.object({
|
|
data: z4.array(z4.object({ embedding: z4.array(z4.number()) })),
|
|
usage: z4.object({ prompt_tokens: z4.number() }).nullish()
|
|
});
|
|
|
|
// src/openai-image-model.ts
|
|
import {
|
|
combineHeaders as combineHeaders4,
|
|
createJsonResponseHandler as createJsonResponseHandler4,
|
|
postJsonToApi as postJsonToApi4
|
|
} from "@ai-sdk/provider-utils";
|
|
import { z as z5 } from "zod";
|
|
|
|
// src/openai-image-settings.ts
|
|
var modelMaxImagesPerCall = {
|
|
"dall-e-3": 1,
|
|
"dall-e-2": 10,
|
|
"gpt-image-1": 10
|
|
};
|
|
var hasDefaultResponseFormat = /* @__PURE__ */ new Set(["gpt-image-1"]);
|
|
|
|
// src/openai-image-model.ts
|
|
var OpenAIImageModel = class {
|
|
constructor(modelId, settings, config) {
|
|
this.modelId = modelId;
|
|
this.settings = settings;
|
|
this.config = config;
|
|
this.specificationVersion = "v1";
|
|
}
|
|
get maxImagesPerCall() {
|
|
var _a, _b;
|
|
return (_b = (_a = this.settings.maxImagesPerCall) != null ? _a : modelMaxImagesPerCall[this.modelId]) != null ? _b : 1;
|
|
}
|
|
get provider() {
|
|
return this.config.provider;
|
|
}
|
|
async doGenerate({
|
|
prompt,
|
|
n,
|
|
size,
|
|
aspectRatio,
|
|
seed,
|
|
providerOptions,
|
|
headers,
|
|
abortSignal
|
|
}) {
|
|
var _a, _b, _c, _d;
|
|
const warnings = [];
|
|
if (aspectRatio != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "aspectRatio",
|
|
details: "This model does not support aspect ratio. Use `size` instead."
|
|
});
|
|
}
|
|
if (seed != null) {
|
|
warnings.push({ type: "unsupported-setting", setting: "seed" });
|
|
}
|
|
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
const { value: response, responseHeaders } = await postJsonToApi4({
|
|
url: this.config.url({
|
|
path: "/images/generations",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders4(this.config.headers(), headers),
|
|
body: {
|
|
model: this.modelId,
|
|
prompt,
|
|
n,
|
|
size,
|
|
...(_d = providerOptions.openai) != null ? _d : {},
|
|
...!hasDefaultResponseFormat.has(this.modelId) ? { response_format: "b64_json" } : {}
|
|
},
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createJsonResponseHandler4(
|
|
openaiImageResponseSchema
|
|
),
|
|
abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
return {
|
|
images: response.data.map((item) => item.b64_json),
|
|
warnings,
|
|
response: {
|
|
timestamp: currentDate,
|
|
modelId: this.modelId,
|
|
headers: responseHeaders
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var openaiImageResponseSchema = z5.object({
|
|
data: z5.array(z5.object({ b64_json: z5.string() }))
|
|
});
|
|
|
|
// src/openai-transcription-model.ts
|
|
import {
|
|
combineHeaders as combineHeaders5,
|
|
convertBase64ToUint8Array,
|
|
createJsonResponseHandler as createJsonResponseHandler5,
|
|
parseProviderOptions,
|
|
postFormDataToApi
|
|
} from "@ai-sdk/provider-utils";
|
|
import { z as z6 } from "zod";
|
|
var openAIProviderOptionsSchema = z6.object({
|
|
include: z6.array(z6.string()).nullish(),
|
|
language: z6.string().nullish(),
|
|
prompt: z6.string().nullish(),
|
|
temperature: z6.number().min(0).max(1).nullish().default(0),
|
|
timestampGranularities: z6.array(z6.enum(["word", "segment"])).nullish().default(["segment"])
|
|
});
|
|
var languageMap = {
|
|
afrikaans: "af",
|
|
arabic: "ar",
|
|
armenian: "hy",
|
|
azerbaijani: "az",
|
|
belarusian: "be",
|
|
bosnian: "bs",
|
|
bulgarian: "bg",
|
|
catalan: "ca",
|
|
chinese: "zh",
|
|
croatian: "hr",
|
|
czech: "cs",
|
|
danish: "da",
|
|
dutch: "nl",
|
|
english: "en",
|
|
estonian: "et",
|
|
finnish: "fi",
|
|
french: "fr",
|
|
galician: "gl",
|
|
german: "de",
|
|
greek: "el",
|
|
hebrew: "he",
|
|
hindi: "hi",
|
|
hungarian: "hu",
|
|
icelandic: "is",
|
|
indonesian: "id",
|
|
italian: "it",
|
|
japanese: "ja",
|
|
kannada: "kn",
|
|
kazakh: "kk",
|
|
korean: "ko",
|
|
latvian: "lv",
|
|
lithuanian: "lt",
|
|
macedonian: "mk",
|
|
malay: "ms",
|
|
marathi: "mr",
|
|
maori: "mi",
|
|
nepali: "ne",
|
|
norwegian: "no",
|
|
persian: "fa",
|
|
polish: "pl",
|
|
portuguese: "pt",
|
|
romanian: "ro",
|
|
russian: "ru",
|
|
serbian: "sr",
|
|
slovak: "sk",
|
|
slovenian: "sl",
|
|
spanish: "es",
|
|
swahili: "sw",
|
|
swedish: "sv",
|
|
tagalog: "tl",
|
|
tamil: "ta",
|
|
thai: "th",
|
|
turkish: "tr",
|
|
ukrainian: "uk",
|
|
urdu: "ur",
|
|
vietnamese: "vi",
|
|
welsh: "cy"
|
|
};
|
|
var OpenAITranscriptionModel = class {
|
|
constructor(modelId, config) {
|
|
this.modelId = modelId;
|
|
this.config = config;
|
|
this.specificationVersion = "v1";
|
|
}
|
|
get provider() {
|
|
return this.config.provider;
|
|
}
|
|
getArgs({
|
|
audio,
|
|
mediaType,
|
|
providerOptions
|
|
}) {
|
|
var _a, _b, _c, _d, _e;
|
|
const warnings = [];
|
|
const openAIOptions = parseProviderOptions({
|
|
provider: "openai",
|
|
providerOptions,
|
|
schema: openAIProviderOptionsSchema
|
|
});
|
|
const formData = new FormData();
|
|
const blob = audio instanceof Uint8Array ? new Blob([audio]) : new Blob([convertBase64ToUint8Array(audio)]);
|
|
formData.append("model", this.modelId);
|
|
formData.append("file", new File([blob], "audio", { type: mediaType }));
|
|
if (openAIOptions) {
|
|
const transcriptionModelOptions = {
|
|
include: (_a = openAIOptions.include) != null ? _a : void 0,
|
|
language: (_b = openAIOptions.language) != null ? _b : void 0,
|
|
prompt: (_c = openAIOptions.prompt) != null ? _c : void 0,
|
|
temperature: (_d = openAIOptions.temperature) != null ? _d : void 0,
|
|
timestamp_granularities: (_e = openAIOptions.timestampGranularities) != null ? _e : void 0
|
|
};
|
|
for (const key in transcriptionModelOptions) {
|
|
const value = transcriptionModelOptions[key];
|
|
if (value !== void 0) {
|
|
formData.append(key, String(value));
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
formData,
|
|
warnings
|
|
};
|
|
}
|
|
async doGenerate(options) {
|
|
var _a, _b, _c, _d, _e, _f;
|
|
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
const { formData, warnings } = this.getArgs(options);
|
|
const {
|
|
value: response,
|
|
responseHeaders,
|
|
rawValue: rawResponse
|
|
} = await postFormDataToApi({
|
|
url: this.config.url({
|
|
path: "/audio/transcriptions",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders5(this.config.headers(), options.headers),
|
|
formData,
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createJsonResponseHandler5(
|
|
openaiTranscriptionResponseSchema
|
|
),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
const language = response.language != null && response.language in languageMap ? languageMap[response.language] : void 0;
|
|
return {
|
|
text: response.text,
|
|
segments: (_e = (_d = response.words) == null ? void 0 : _d.map((word) => ({
|
|
text: word.word,
|
|
startSecond: word.start,
|
|
endSecond: word.end
|
|
}))) != null ? _e : [],
|
|
language,
|
|
durationInSeconds: (_f = response.duration) != null ? _f : void 0,
|
|
warnings,
|
|
response: {
|
|
timestamp: currentDate,
|
|
modelId: this.modelId,
|
|
headers: responseHeaders,
|
|
body: rawResponse
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var openaiTranscriptionResponseSchema = z6.object({
|
|
text: z6.string(),
|
|
language: z6.string().nullish(),
|
|
duration: z6.number().nullish(),
|
|
words: z6.array(
|
|
z6.object({
|
|
word: z6.string(),
|
|
start: z6.number(),
|
|
end: z6.number()
|
|
})
|
|
).nullish()
|
|
});
|
|
|
|
// src/openai-speech-model.ts
|
|
import {
|
|
combineHeaders as combineHeaders6,
|
|
createBinaryResponseHandler,
|
|
parseProviderOptions as parseProviderOptions2,
|
|
postJsonToApi as postJsonToApi5
|
|
} from "@ai-sdk/provider-utils";
|
|
import { z as z7 } from "zod";
|
|
var OpenAIProviderOptionsSchema = z7.object({
|
|
instructions: z7.string().nullish(),
|
|
speed: z7.number().min(0.25).max(4).default(1).nullish()
|
|
});
|
|
var OpenAISpeechModel = class {
|
|
constructor(modelId, config) {
|
|
this.modelId = modelId;
|
|
this.config = config;
|
|
this.specificationVersion = "v1";
|
|
}
|
|
get provider() {
|
|
return this.config.provider;
|
|
}
|
|
getArgs({
|
|
text,
|
|
voice = "alloy",
|
|
outputFormat = "mp3",
|
|
speed,
|
|
instructions,
|
|
providerOptions
|
|
}) {
|
|
const warnings = [];
|
|
const openAIOptions = parseProviderOptions2({
|
|
provider: "openai",
|
|
providerOptions,
|
|
schema: OpenAIProviderOptionsSchema
|
|
});
|
|
const requestBody = {
|
|
model: this.modelId,
|
|
input: text,
|
|
voice,
|
|
response_format: "mp3",
|
|
speed,
|
|
instructions
|
|
};
|
|
if (outputFormat) {
|
|
if (["mp3", "opus", "aac", "flac", "wav", "pcm"].includes(outputFormat)) {
|
|
requestBody.response_format = outputFormat;
|
|
} else {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "outputFormat",
|
|
details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`
|
|
});
|
|
}
|
|
}
|
|
if (openAIOptions) {
|
|
const speechModelOptions = {};
|
|
for (const key in speechModelOptions) {
|
|
const value = speechModelOptions[key];
|
|
if (value !== void 0) {
|
|
requestBody[key] = value;
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
requestBody,
|
|
warnings
|
|
};
|
|
}
|
|
async doGenerate(options) {
|
|
var _a, _b, _c;
|
|
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
const { requestBody, warnings } = this.getArgs(options);
|
|
const {
|
|
value: audio,
|
|
responseHeaders,
|
|
rawValue: rawResponse
|
|
} = await postJsonToApi5({
|
|
url: this.config.url({
|
|
path: "/audio/speech",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders6(this.config.headers(), options.headers),
|
|
body: requestBody,
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createBinaryResponseHandler(),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
return {
|
|
audio,
|
|
warnings,
|
|
request: {
|
|
body: JSON.stringify(requestBody)
|
|
},
|
|
response: {
|
|
timestamp: currentDate,
|
|
modelId: this.modelId,
|
|
headers: responseHeaders,
|
|
body: rawResponse
|
|
}
|
|
};
|
|
}
|
|
};
|
|
|
|
// src/responses/openai-responses-language-model.ts
|
|
import {
|
|
APICallError
|
|
} from "@ai-sdk/provider";
|
|
import {
|
|
combineHeaders as combineHeaders7,
|
|
createEventSourceResponseHandler as createEventSourceResponseHandler3,
|
|
createJsonResponseHandler as createJsonResponseHandler6,
|
|
generateId as generateId2,
|
|
parseProviderOptions as parseProviderOptions3,
|
|
postJsonToApi as postJsonToApi6
|
|
} from "@ai-sdk/provider-utils";
|
|
import { z as z8 } from "zod";
|
|
|
|
// src/responses/convert-to-openai-responses-messages.ts
|
|
import {
|
|
UnsupportedFunctionalityError as UnsupportedFunctionalityError6
|
|
} from "@ai-sdk/provider";
|
|
import { convertUint8ArrayToBase64 as convertUint8ArrayToBase642 } from "@ai-sdk/provider-utils";
|
|
function convertToOpenAIResponsesMessages({
|
|
prompt,
|
|
systemMessageMode
|
|
}) {
|
|
const messages = [];
|
|
const warnings = [];
|
|
for (const { role, content } of prompt) {
|
|
switch (role) {
|
|
case "system": {
|
|
switch (systemMessageMode) {
|
|
case "system": {
|
|
messages.push({ role: "system", content });
|
|
break;
|
|
}
|
|
case "developer": {
|
|
messages.push({ role: "developer", content });
|
|
break;
|
|
}
|
|
case "remove": {
|
|
warnings.push({
|
|
type: "other",
|
|
message: "system messages are removed for this model"
|
|
});
|
|
break;
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = systemMessageMode;
|
|
throw new Error(
|
|
`Unsupported system message mode: ${_exhaustiveCheck}`
|
|
);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case "user": {
|
|
messages.push({
|
|
role: "user",
|
|
content: content.map((part, index) => {
|
|
var _a, _b, _c, _d;
|
|
switch (part.type) {
|
|
case "text": {
|
|
return { type: "input_text", text: part.text };
|
|
}
|
|
case "image": {
|
|
return {
|
|
type: "input_image",
|
|
image_url: part.image instanceof URL ? part.image.toString() : `data:${(_a = part.mimeType) != null ? _a : "image/jpeg"};base64,${convertUint8ArrayToBase642(part.image)}`,
|
|
// OpenAI specific extension: image detail
|
|
detail: (_c = (_b = part.providerMetadata) == null ? void 0 : _b.openai) == null ? void 0 : _c.imageDetail
|
|
};
|
|
}
|
|
case "file": {
|
|
if (part.data instanceof URL) {
|
|
throw new UnsupportedFunctionalityError6({
|
|
functionality: "File URLs in user messages"
|
|
});
|
|
}
|
|
switch (part.mimeType) {
|
|
case "application/pdf": {
|
|
return {
|
|
type: "input_file",
|
|
filename: (_d = part.filename) != null ? _d : `part-${index}.pdf`,
|
|
file_data: `data:application/pdf;base64,${part.data}`
|
|
};
|
|
}
|
|
default: {
|
|
throw new UnsupportedFunctionalityError6({
|
|
functionality: "Only PDF files are supported in user messages"
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
});
|
|
break;
|
|
}
|
|
case "assistant": {
|
|
for (const part of content) {
|
|
switch (part.type) {
|
|
case "text": {
|
|
messages.push({
|
|
role: "assistant",
|
|
content: [{ type: "output_text", text: part.text }]
|
|
});
|
|
break;
|
|
}
|
|
case "tool-call": {
|
|
messages.push({
|
|
type: "function_call",
|
|
call_id: part.toolCallId,
|
|
name: part.toolName,
|
|
arguments: JSON.stringify(part.args)
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case "tool": {
|
|
for (const part of content) {
|
|
messages.push({
|
|
type: "function_call_output",
|
|
call_id: part.toolCallId,
|
|
output: JSON.stringify(part.result)
|
|
});
|
|
}
|
|
break;
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = role;
|
|
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
|
|
}
|
|
}
|
|
}
|
|
return { messages, warnings };
|
|
}
|
|
|
|
// src/responses/map-openai-responses-finish-reason.ts
|
|
function mapOpenAIResponseFinishReason({
|
|
finishReason,
|
|
hasToolCalls
|
|
}) {
|
|
switch (finishReason) {
|
|
case void 0:
|
|
case null:
|
|
return hasToolCalls ? "tool-calls" : "stop";
|
|
case "max_output_tokens":
|
|
return "length";
|
|
case "content_filter":
|
|
return "content-filter";
|
|
default:
|
|
return hasToolCalls ? "tool-calls" : "unknown";
|
|
}
|
|
}
|
|
|
|
// src/responses/openai-responses-prepare-tools.ts
|
|
import {
|
|
UnsupportedFunctionalityError as UnsupportedFunctionalityError7
|
|
} from "@ai-sdk/provider";
|
|
function prepareResponsesTools({
|
|
mode,
|
|
strict
|
|
}) {
|
|
var _a;
|
|
const tools = ((_a = mode.tools) == null ? void 0 : _a.length) ? mode.tools : void 0;
|
|
const toolWarnings = [];
|
|
if (tools == null) {
|
|
return { tools: void 0, tool_choice: void 0, toolWarnings };
|
|
}
|
|
const toolChoice = mode.toolChoice;
|
|
const openaiTools = [];
|
|
for (const tool of tools) {
|
|
switch (tool.type) {
|
|
case "function":
|
|
openaiTools.push({
|
|
type: "function",
|
|
name: tool.name,
|
|
description: tool.description,
|
|
parameters: tool.parameters,
|
|
strict: strict ? true : void 0
|
|
});
|
|
break;
|
|
case "provider-defined":
|
|
switch (tool.id) {
|
|
case "openai.web_search_preview":
|
|
openaiTools.push({
|
|
type: "web_search_preview",
|
|
search_context_size: tool.args.searchContextSize,
|
|
user_location: tool.args.userLocation
|
|
});
|
|
break;
|
|
default:
|
|
toolWarnings.push({ type: "unsupported-tool", tool });
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
toolWarnings.push({ type: "unsupported-tool", tool });
|
|
break;
|
|
}
|
|
}
|
|
if (toolChoice == null) {
|
|
return { tools: openaiTools, tool_choice: void 0, toolWarnings };
|
|
}
|
|
const type = toolChoice.type;
|
|
switch (type) {
|
|
case "auto":
|
|
case "none":
|
|
case "required":
|
|
return { tools: openaiTools, tool_choice: type, toolWarnings };
|
|
case "tool": {
|
|
if (toolChoice.toolName === "web_search_preview") {
|
|
return {
|
|
tools: openaiTools,
|
|
tool_choice: {
|
|
type: "web_search_preview"
|
|
},
|
|
toolWarnings
|
|
};
|
|
}
|
|
return {
|
|
tools: openaiTools,
|
|
tool_choice: {
|
|
type: "function",
|
|
name: toolChoice.toolName
|
|
},
|
|
toolWarnings
|
|
};
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = type;
|
|
throw new UnsupportedFunctionalityError7({
|
|
functionality: `Unsupported tool choice type: ${_exhaustiveCheck}`
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// src/responses/openai-responses-language-model.ts
|
|
var OpenAIResponsesLanguageModel = class {
|
|
constructor(modelId, config) {
|
|
this.specificationVersion = "v1";
|
|
this.defaultObjectGenerationMode = "json";
|
|
this.supportsStructuredOutputs = true;
|
|
this.modelId = modelId;
|
|
this.config = config;
|
|
}
|
|
get provider() {
|
|
return this.config.provider;
|
|
}
|
|
getArgs({
|
|
mode,
|
|
maxTokens,
|
|
temperature,
|
|
stopSequences,
|
|
topP,
|
|
topK,
|
|
presencePenalty,
|
|
frequencyPenalty,
|
|
seed,
|
|
prompt,
|
|
providerMetadata,
|
|
responseFormat
|
|
}) {
|
|
var _a, _b, _c;
|
|
const warnings = [];
|
|
const modelConfig = getResponsesModelConfig(this.modelId);
|
|
const type = mode.type;
|
|
if (topK != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "topK"
|
|
});
|
|
}
|
|
if (seed != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "seed"
|
|
});
|
|
}
|
|
if (presencePenalty != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "presencePenalty"
|
|
});
|
|
}
|
|
if (frequencyPenalty != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "frequencyPenalty"
|
|
});
|
|
}
|
|
if (stopSequences != null) {
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "stopSequences"
|
|
});
|
|
}
|
|
const { messages, warnings: messageWarnings } = convertToOpenAIResponsesMessages({
|
|
prompt,
|
|
systemMessageMode: modelConfig.systemMessageMode
|
|
});
|
|
warnings.push(...messageWarnings);
|
|
const openaiOptions = parseProviderOptions3({
|
|
provider: "openai",
|
|
providerOptions: providerMetadata,
|
|
schema: openaiResponsesProviderOptionsSchema
|
|
});
|
|
const isStrict = (_a = openaiOptions == null ? void 0 : openaiOptions.strictSchemas) != null ? _a : true;
|
|
const baseArgs = {
|
|
model: this.modelId,
|
|
input: messages,
|
|
temperature,
|
|
top_p: topP,
|
|
max_output_tokens: maxTokens,
|
|
...(responseFormat == null ? void 0 : responseFormat.type) === "json" && {
|
|
text: {
|
|
format: responseFormat.schema != null ? {
|
|
type: "json_schema",
|
|
strict: isStrict,
|
|
name: (_b = responseFormat.name) != null ? _b : "response",
|
|
description: responseFormat.description,
|
|
schema: responseFormat.schema
|
|
} : { type: "json_object" }
|
|
}
|
|
},
|
|
// provider options:
|
|
metadata: openaiOptions == null ? void 0 : openaiOptions.metadata,
|
|
parallel_tool_calls: openaiOptions == null ? void 0 : openaiOptions.parallelToolCalls,
|
|
previous_response_id: openaiOptions == null ? void 0 : openaiOptions.previousResponseId,
|
|
store: openaiOptions == null ? void 0 : openaiOptions.store,
|
|
user: openaiOptions == null ? void 0 : openaiOptions.user,
|
|
instructions: openaiOptions == null ? void 0 : openaiOptions.instructions,
|
|
// model-specific settings:
|
|
...modelConfig.isReasoningModel && ((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null || (openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null) && {
|
|
reasoning: {
|
|
...(openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null && {
|
|
effort: openaiOptions.reasoningEffort
|
|
},
|
|
...(openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null && {
|
|
summary: openaiOptions.reasoningSummary
|
|
}
|
|
}
|
|
},
|
|
...modelConfig.requiredAutoTruncation && {
|
|
truncation: "auto"
|
|
}
|
|
};
|
|
if (modelConfig.isReasoningModel) {
|
|
if (baseArgs.temperature != null) {
|
|
baseArgs.temperature = void 0;
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "temperature",
|
|
details: "temperature is not supported for reasoning models"
|
|
});
|
|
}
|
|
if (baseArgs.top_p != null) {
|
|
baseArgs.top_p = void 0;
|
|
warnings.push({
|
|
type: "unsupported-setting",
|
|
setting: "topP",
|
|
details: "topP is not supported for reasoning models"
|
|
});
|
|
}
|
|
}
|
|
switch (type) {
|
|
case "regular": {
|
|
const { tools, tool_choice, toolWarnings } = prepareResponsesTools({
|
|
mode,
|
|
strict: isStrict
|
|
// TODO support provider options on tools
|
|
});
|
|
return {
|
|
args: {
|
|
...baseArgs,
|
|
tools,
|
|
tool_choice
|
|
},
|
|
warnings: [...warnings, ...toolWarnings]
|
|
};
|
|
}
|
|
case "object-json": {
|
|
return {
|
|
args: {
|
|
...baseArgs,
|
|
text: {
|
|
format: mode.schema != null ? {
|
|
type: "json_schema",
|
|
strict: isStrict,
|
|
name: (_c = mode.name) != null ? _c : "response",
|
|
description: mode.description,
|
|
schema: mode.schema
|
|
} : { type: "json_object" }
|
|
}
|
|
},
|
|
warnings
|
|
};
|
|
}
|
|
case "object-tool": {
|
|
return {
|
|
args: {
|
|
...baseArgs,
|
|
tool_choice: { type: "function", name: mode.tool.name },
|
|
tools: [
|
|
{
|
|
type: "function",
|
|
name: mode.tool.name,
|
|
description: mode.tool.description,
|
|
parameters: mode.tool.parameters,
|
|
strict: isStrict
|
|
}
|
|
]
|
|
},
|
|
warnings
|
|
};
|
|
}
|
|
default: {
|
|
const _exhaustiveCheck = type;
|
|
throw new Error(`Unsupported type: ${_exhaustiveCheck}`);
|
|
}
|
|
}
|
|
}
|
|
async doGenerate(options) {
|
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
const { args: body, warnings } = this.getArgs(options);
|
|
const url = this.config.url({
|
|
path: "/responses",
|
|
modelId: this.modelId
|
|
});
|
|
const {
|
|
responseHeaders,
|
|
value: response,
|
|
rawValue: rawResponse
|
|
} = await postJsonToApi6({
|
|
url,
|
|
headers: combineHeaders7(this.config.headers(), options.headers),
|
|
body,
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createJsonResponseHandler6(
|
|
z8.object({
|
|
id: z8.string(),
|
|
created_at: z8.number(),
|
|
error: z8.object({
|
|
message: z8.string(),
|
|
code: z8.string()
|
|
}).nullish(),
|
|
model: z8.string(),
|
|
output: z8.array(
|
|
z8.discriminatedUnion("type", [
|
|
z8.object({
|
|
type: z8.literal("message"),
|
|
role: z8.literal("assistant"),
|
|
content: z8.array(
|
|
z8.object({
|
|
type: z8.literal("output_text"),
|
|
text: z8.string(),
|
|
annotations: z8.array(
|
|
z8.object({
|
|
type: z8.literal("url_citation"),
|
|
start_index: z8.number(),
|
|
end_index: z8.number(),
|
|
url: z8.string(),
|
|
title: z8.string()
|
|
})
|
|
)
|
|
})
|
|
)
|
|
}),
|
|
z8.object({
|
|
type: z8.literal("function_call"),
|
|
call_id: z8.string(),
|
|
name: z8.string(),
|
|
arguments: z8.string()
|
|
}),
|
|
z8.object({
|
|
type: z8.literal("web_search_call")
|
|
}),
|
|
z8.object({
|
|
type: z8.literal("computer_call")
|
|
}),
|
|
z8.object({
|
|
type: z8.literal("reasoning"),
|
|
summary: z8.array(
|
|
z8.object({
|
|
type: z8.literal("summary_text"),
|
|
text: z8.string()
|
|
})
|
|
)
|
|
})
|
|
])
|
|
),
|
|
incomplete_details: z8.object({ reason: z8.string() }).nullable(),
|
|
usage: usageSchema
|
|
})
|
|
),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
if (response.error) {
|
|
throw new APICallError({
|
|
message: response.error.message,
|
|
url,
|
|
requestBodyValues: body,
|
|
statusCode: 400,
|
|
responseHeaders,
|
|
responseBody: rawResponse,
|
|
isRetryable: false
|
|
});
|
|
}
|
|
const outputTextElements = response.output.filter((output) => output.type === "message").flatMap((output) => output.content).filter((content) => content.type === "output_text");
|
|
const toolCalls = response.output.filter((output) => output.type === "function_call").map((output) => ({
|
|
toolCallType: "function",
|
|
toolCallId: output.call_id,
|
|
toolName: output.name,
|
|
args: output.arguments
|
|
}));
|
|
const reasoningSummary = (_b = (_a = response.output.find((item) => item.type === "reasoning")) == null ? void 0 : _a.summary) != null ? _b : null;
|
|
return {
|
|
text: outputTextElements.map((content) => content.text).join("\n"),
|
|
sources: outputTextElements.flatMap(
|
|
(content) => content.annotations.map((annotation) => {
|
|
var _a2, _b2, _c2;
|
|
return {
|
|
sourceType: "url",
|
|
id: (_c2 = (_b2 = (_a2 = this.config).generateId) == null ? void 0 : _b2.call(_a2)) != null ? _c2 : generateId2(),
|
|
url: annotation.url,
|
|
title: annotation.title
|
|
};
|
|
})
|
|
),
|
|
finishReason: mapOpenAIResponseFinishReason({
|
|
finishReason: (_c = response.incomplete_details) == null ? void 0 : _c.reason,
|
|
hasToolCalls: toolCalls.length > 0
|
|
}),
|
|
toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
|
|
reasoning: reasoningSummary ? reasoningSummary.map((summary) => ({
|
|
type: "text",
|
|
text: summary.text
|
|
})) : void 0,
|
|
usage: {
|
|
promptTokens: response.usage.input_tokens,
|
|
completionTokens: response.usage.output_tokens
|
|
},
|
|
rawCall: {
|
|
rawPrompt: void 0,
|
|
rawSettings: {}
|
|
},
|
|
rawResponse: {
|
|
headers: responseHeaders,
|
|
body: rawResponse
|
|
},
|
|
request: {
|
|
body: JSON.stringify(body)
|
|
},
|
|
response: {
|
|
id: response.id,
|
|
timestamp: new Date(response.created_at * 1e3),
|
|
modelId: response.model
|
|
},
|
|
providerMetadata: {
|
|
openai: {
|
|
responseId: response.id,
|
|
cachedPromptTokens: (_e = (_d = response.usage.input_tokens_details) == null ? void 0 : _d.cached_tokens) != null ? _e : null,
|
|
reasoningTokens: (_g = (_f = response.usage.output_tokens_details) == null ? void 0 : _f.reasoning_tokens) != null ? _g : null
|
|
}
|
|
},
|
|
warnings
|
|
};
|
|
}
|
|
async doStream(options) {
|
|
const { args: body, warnings } = this.getArgs(options);
|
|
const { responseHeaders, value: response } = await postJsonToApi6({
|
|
url: this.config.url({
|
|
path: "/responses",
|
|
modelId: this.modelId
|
|
}),
|
|
headers: combineHeaders7(this.config.headers(), options.headers),
|
|
body: {
|
|
...body,
|
|
stream: true
|
|
},
|
|
failedResponseHandler: openaiFailedResponseHandler,
|
|
successfulResponseHandler: createEventSourceResponseHandler3(
|
|
openaiResponsesChunkSchema
|
|
),
|
|
abortSignal: options.abortSignal,
|
|
fetch: this.config.fetch
|
|
});
|
|
const self = this;
|
|
let finishReason = "unknown";
|
|
let promptTokens = NaN;
|
|
let completionTokens = NaN;
|
|
let cachedPromptTokens = null;
|
|
let reasoningTokens = null;
|
|
let responseId = null;
|
|
const ongoingToolCalls = {};
|
|
let hasToolCalls = false;
|
|
return {
|
|
stream: response.pipeThrough(
|
|
new TransformStream({
|
|
transform(chunk, controller) {
|
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
if (!chunk.success) {
|
|
finishReason = "error";
|
|
controller.enqueue({ type: "error", error: chunk.error });
|
|
return;
|
|
}
|
|
const value = chunk.value;
|
|
if (isResponseOutputItemAddedChunk(value)) {
|
|
if (value.item.type === "function_call") {
|
|
ongoingToolCalls[value.output_index] = {
|
|
toolName: value.item.name,
|
|
toolCallId: value.item.call_id
|
|
};
|
|
controller.enqueue({
|
|
type: "tool-call-delta",
|
|
toolCallType: "function",
|
|
toolCallId: value.item.call_id,
|
|
toolName: value.item.name,
|
|
argsTextDelta: value.item.arguments
|
|
});
|
|
}
|
|
} else if (isResponseFunctionCallArgumentsDeltaChunk(value)) {
|
|
const toolCall = ongoingToolCalls[value.output_index];
|
|
if (toolCall != null) {
|
|
controller.enqueue({
|
|
type: "tool-call-delta",
|
|
toolCallType: "function",
|
|
toolCallId: toolCall.toolCallId,
|
|
toolName: toolCall.toolName,
|
|
argsTextDelta: value.delta
|
|
});
|
|
}
|
|
} else if (isResponseCreatedChunk(value)) {
|
|
responseId = value.response.id;
|
|
controller.enqueue({
|
|
type: "response-metadata",
|
|
id: value.response.id,
|
|
timestamp: new Date(value.response.created_at * 1e3),
|
|
modelId: value.response.model
|
|
});
|
|
} else if (isTextDeltaChunk(value)) {
|
|
controller.enqueue({
|
|
type: "text-delta",
|
|
textDelta: value.delta
|
|
});
|
|
} else if (isResponseReasoningSummaryTextDeltaChunk(value)) {
|
|
controller.enqueue({
|
|
type: "reasoning",
|
|
textDelta: value.delta
|
|
});
|
|
} else if (isResponseOutputItemDoneChunk(value) && value.item.type === "function_call") {
|
|
ongoingToolCalls[value.output_index] = void 0;
|
|
hasToolCalls = true;
|
|
controller.enqueue({
|
|
type: "tool-call",
|
|
toolCallType: "function",
|
|
toolCallId: value.item.call_id,
|
|
toolName: value.item.name,
|
|
args: value.item.arguments
|
|
});
|
|
} else if (isResponseFinishedChunk(value)) {
|
|
finishReason = mapOpenAIResponseFinishReason({
|
|
finishReason: (_a = value.response.incomplete_details) == null ? void 0 : _a.reason,
|
|
hasToolCalls
|
|
});
|
|
promptTokens = value.response.usage.input_tokens;
|
|
completionTokens = value.response.usage.output_tokens;
|
|
cachedPromptTokens = (_c = (_b = value.response.usage.input_tokens_details) == null ? void 0 : _b.cached_tokens) != null ? _c : cachedPromptTokens;
|
|
reasoningTokens = (_e = (_d = value.response.usage.output_tokens_details) == null ? void 0 : _d.reasoning_tokens) != null ? _e : reasoningTokens;
|
|
} else if (isResponseAnnotationAddedChunk(value)) {
|
|
controller.enqueue({
|
|
type: "source",
|
|
source: {
|
|
sourceType: "url",
|
|
id: (_h = (_g = (_f = self.config).generateId) == null ? void 0 : _g.call(_f)) != null ? _h : generateId2(),
|
|
url: value.annotation.url,
|
|
title: value.annotation.title
|
|
}
|
|
});
|
|
} else if (isErrorChunk(value)) {
|
|
controller.enqueue({ type: "error", error: value });
|
|
}
|
|
},
|
|
flush(controller) {
|
|
controller.enqueue({
|
|
type: "finish",
|
|
finishReason,
|
|
usage: { promptTokens, completionTokens },
|
|
...(cachedPromptTokens != null || reasoningTokens != null) && {
|
|
providerMetadata: {
|
|
openai: {
|
|
responseId,
|
|
cachedPromptTokens,
|
|
reasoningTokens
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
})
|
|
),
|
|
rawCall: {
|
|
rawPrompt: void 0,
|
|
rawSettings: {}
|
|
},
|
|
rawResponse: { headers: responseHeaders },
|
|
request: { body: JSON.stringify(body) },
|
|
warnings
|
|
};
|
|
}
|
|
};
|
|
var usageSchema = z8.object({
|
|
input_tokens: z8.number(),
|
|
input_tokens_details: z8.object({ cached_tokens: z8.number().nullish() }).nullish(),
|
|
output_tokens: z8.number(),
|
|
output_tokens_details: z8.object({ reasoning_tokens: z8.number().nullish() }).nullish()
|
|
});
|
|
var textDeltaChunkSchema = z8.object({
|
|
type: z8.literal("response.output_text.delta"),
|
|
delta: z8.string()
|
|
});
|
|
var responseFinishedChunkSchema = z8.object({
|
|
type: z8.enum(["response.completed", "response.incomplete"]),
|
|
response: z8.object({
|
|
incomplete_details: z8.object({ reason: z8.string() }).nullish(),
|
|
usage: usageSchema
|
|
})
|
|
});
|
|
var responseCreatedChunkSchema = z8.object({
|
|
type: z8.literal("response.created"),
|
|
response: z8.object({
|
|
id: z8.string(),
|
|
created_at: z8.number(),
|
|
model: z8.string()
|
|
})
|
|
});
|
|
var responseOutputItemDoneSchema = z8.object({
|
|
type: z8.literal("response.output_item.done"),
|
|
output_index: z8.number(),
|
|
item: z8.discriminatedUnion("type", [
|
|
z8.object({
|
|
type: z8.literal("message")
|
|
}),
|
|
z8.object({
|
|
type: z8.literal("function_call"),
|
|
id: z8.string(),
|
|
call_id: z8.string(),
|
|
name: z8.string(),
|
|
arguments: z8.string(),
|
|
status: z8.literal("completed")
|
|
})
|
|
])
|
|
});
|
|
var responseFunctionCallArgumentsDeltaSchema = z8.object({
|
|
type: z8.literal("response.function_call_arguments.delta"),
|
|
item_id: z8.string(),
|
|
output_index: z8.number(),
|
|
delta: z8.string()
|
|
});
|
|
var responseOutputItemAddedSchema = z8.object({
|
|
type: z8.literal("response.output_item.added"),
|
|
output_index: z8.number(),
|
|
item: z8.discriminatedUnion("type", [
|
|
z8.object({
|
|
type: z8.literal("message")
|
|
}),
|
|
z8.object({
|
|
type: z8.literal("function_call"),
|
|
id: z8.string(),
|
|
call_id: z8.string(),
|
|
name: z8.string(),
|
|
arguments: z8.string()
|
|
})
|
|
])
|
|
});
|
|
var responseAnnotationAddedSchema = z8.object({
|
|
type: z8.literal("response.output_text.annotation.added"),
|
|
annotation: z8.object({
|
|
type: z8.literal("url_citation"),
|
|
url: z8.string(),
|
|
title: z8.string()
|
|
})
|
|
});
|
|
var responseReasoningSummaryTextDeltaSchema = z8.object({
|
|
type: z8.literal("response.reasoning_summary_text.delta"),
|
|
item_id: z8.string(),
|
|
output_index: z8.number(),
|
|
summary_index: z8.number(),
|
|
delta: z8.string()
|
|
});
|
|
var errorChunkSchema = z8.object({
|
|
type: z8.literal("error"),
|
|
code: z8.string(),
|
|
message: z8.string(),
|
|
param: z8.string().nullish(),
|
|
sequence_number: z8.number()
|
|
});
|
|
var openaiResponsesChunkSchema = z8.union([
|
|
textDeltaChunkSchema,
|
|
responseFinishedChunkSchema,
|
|
responseCreatedChunkSchema,
|
|
responseOutputItemDoneSchema,
|
|
responseFunctionCallArgumentsDeltaSchema,
|
|
responseOutputItemAddedSchema,
|
|
responseAnnotationAddedSchema,
|
|
responseReasoningSummaryTextDeltaSchema,
|
|
errorChunkSchema,
|
|
z8.object({ type: z8.string() }).passthrough()
|
|
// fallback for unknown chunks
|
|
]);
|
|
function isTextDeltaChunk(chunk) {
|
|
return chunk.type === "response.output_text.delta";
|
|
}
|
|
function isResponseOutputItemDoneChunk(chunk) {
|
|
return chunk.type === "response.output_item.done";
|
|
}
|
|
function isResponseFinishedChunk(chunk) {
|
|
return chunk.type === "response.completed" || chunk.type === "response.incomplete";
|
|
}
|
|
function isResponseCreatedChunk(chunk) {
|
|
return chunk.type === "response.created";
|
|
}
|
|
function isResponseFunctionCallArgumentsDeltaChunk(chunk) {
|
|
return chunk.type === "response.function_call_arguments.delta";
|
|
}
|
|
function isResponseOutputItemAddedChunk(chunk) {
|
|
return chunk.type === "response.output_item.added";
|
|
}
|
|
function isResponseAnnotationAddedChunk(chunk) {
|
|
return chunk.type === "response.output_text.annotation.added";
|
|
}
|
|
function isResponseReasoningSummaryTextDeltaChunk(chunk) {
|
|
return chunk.type === "response.reasoning_summary_text.delta";
|
|
}
|
|
function isErrorChunk(chunk) {
|
|
return chunk.type === "error";
|
|
}
|
|
function getResponsesModelConfig(modelId) {
|
|
if (modelId.startsWith("o") || modelId.startsWith("gpt-5")) {
|
|
if (modelId.startsWith("o1-mini") || modelId.startsWith("o1-preview")) {
|
|
return {
|
|
isReasoningModel: true,
|
|
systemMessageMode: "remove",
|
|
requiredAutoTruncation: false
|
|
};
|
|
}
|
|
return {
|
|
isReasoningModel: true,
|
|
systemMessageMode: "developer",
|
|
requiredAutoTruncation: false
|
|
};
|
|
}
|
|
return {
|
|
isReasoningModel: false,
|
|
systemMessageMode: "system",
|
|
requiredAutoTruncation: false
|
|
};
|
|
}
|
|
var openaiResponsesProviderOptionsSchema = z8.object({
|
|
metadata: z8.any().nullish(),
|
|
parallelToolCalls: z8.boolean().nullish(),
|
|
previousResponseId: z8.string().nullish(),
|
|
store: z8.boolean().nullish(),
|
|
user: z8.string().nullish(),
|
|
reasoningEffort: z8.string().nullish(),
|
|
strictSchemas: z8.boolean().nullish(),
|
|
instructions: z8.string().nullish(),
|
|
reasoningSummary: z8.string().nullish()
|
|
});
|
|
export {
|
|
OpenAIChatLanguageModel,
|
|
OpenAICompletionLanguageModel,
|
|
OpenAIEmbeddingModel,
|
|
OpenAIImageModel,
|
|
OpenAIResponsesLanguageModel,
|
|
OpenAISpeechModel,
|
|
OpenAITranscriptionModel,
|
|
hasDefaultResponseFormat,
|
|
modelMaxImagesPerCall
|
|
};
|
|
//# sourceMappingURL=index.mjs.map
|