@ai-sdk/openai 4.0.0-beta.3 → 4.0.0-beta.31
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 +320 -22
- package/README.md +2 -0
- package/dist/index.d.ts +139 -36
- package/dist/index.js +2343 -1490
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +168 -45
- package/dist/internal/index.js +2112 -1511
- package/dist/internal/index.js.map +1 -1
- package/docs/03-openai.mdx +274 -9
- package/package.json +9 -12
- package/src/chat/convert-openai-chat-usage.ts +2 -2
- package/src/chat/convert-to-openai-chat-messages.ts +26 -15
- package/src/chat/map-openai-finish-reason.ts +2 -2
- package/src/chat/openai-chat-language-model.ts +52 -28
- package/src/chat/openai-chat-options.ts +5 -0
- package/src/chat/openai-chat-prepare-tools.ts +6 -6
- package/src/completion/convert-openai-completion-usage.ts +2 -2
- package/src/completion/convert-to-openai-completion-prompt.ts +2 -2
- package/src/completion/map-openai-finish-reason.ts +2 -2
- package/src/completion/openai-completion-language-model.ts +40 -23
- package/src/embedding/openai-embedding-model.ts +23 -6
- package/src/files/openai-files-api.ts +17 -0
- package/src/files/openai-files-options.ts +18 -0
- package/src/files/openai-files.ts +102 -0
- package/src/image/openai-image-model.ts +28 -11
- package/src/index.ts +2 -0
- package/src/openai-config.ts +6 -6
- package/src/openai-language-model-capabilities.ts +3 -2
- package/src/openai-provider.ts +54 -21
- package/src/openai-tools.ts +12 -1
- package/src/responses/convert-openai-responses-usage.ts +2 -2
- package/src/responses/convert-to-openai-responses-input.ts +211 -37
- package/src/responses/map-openai-responses-finish-reason.ts +2 -2
- package/src/responses/openai-responses-api.ts +136 -2
- package/src/responses/openai-responses-language-model.ts +252 -39
- package/src/responses/openai-responses-options.ts +24 -2
- package/src/responses/openai-responses-prepare-tools.ts +47 -14
- package/src/responses/openai-responses-provider-metadata.ts +10 -0
- package/src/skills/openai-skills-api.ts +31 -0
- package/src/skills/openai-skills.ts +87 -0
- package/src/speech/openai-speech-model.ts +25 -8
- package/src/tool/custom.ts +0 -6
- package/src/tool/shell.ts +7 -2
- package/src/tool/tool-search.ts +98 -0
- package/src/transcription/openai-transcription-model.ts +26 -9
- package/dist/index.d.mts +0 -1107
- package/dist/index.mjs +0 -6497
- package/dist/index.mjs.map +0 -1
- package/dist/internal/index.d.mts +0 -1137
- package/dist/internal/index.mjs +0 -6310
- package/dist/internal/index.mjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
ImageModelV4,
|
|
3
|
+
ImageModelV4File,
|
|
4
|
+
SharedV4Warning,
|
|
5
5
|
} from '@ai-sdk/provider';
|
|
6
6
|
import {
|
|
7
7
|
combineHeaders,
|
|
@@ -11,6 +11,9 @@ import {
|
|
|
11
11
|
downloadBlob,
|
|
12
12
|
postFormDataToApi,
|
|
13
13
|
postJsonToApi,
|
|
14
|
+
serializeModelOptions,
|
|
15
|
+
WORKFLOW_DESERIALIZE,
|
|
16
|
+
WORKFLOW_SERIALIZE,
|
|
14
17
|
} from '@ai-sdk/provider-utils';
|
|
15
18
|
import { OpenAIConfig } from '../openai-config';
|
|
16
19
|
import { openaiFailedResponseHandler } from '../openai-error';
|
|
@@ -27,8 +30,22 @@ interface OpenAIImageModelConfig extends OpenAIConfig {
|
|
|
27
30
|
};
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
export class OpenAIImageModel implements
|
|
31
|
-
readonly specificationVersion = '
|
|
33
|
+
export class OpenAIImageModel implements ImageModelV4 {
|
|
34
|
+
readonly specificationVersion = 'v4';
|
|
35
|
+
|
|
36
|
+
static [WORKFLOW_SERIALIZE](model: OpenAIImageModel) {
|
|
37
|
+
return serializeModelOptions({
|
|
38
|
+
modelId: model.modelId,
|
|
39
|
+
config: model.config,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static [WORKFLOW_DESERIALIZE](options: {
|
|
44
|
+
modelId: OpenAIImageModelId;
|
|
45
|
+
config: OpenAIImageModelConfig;
|
|
46
|
+
}) {
|
|
47
|
+
return new OpenAIImageModel(options.modelId, options.config);
|
|
48
|
+
}
|
|
32
49
|
|
|
33
50
|
get maxImagesPerCall(): number {
|
|
34
51
|
return modelMaxImagesPerCall[this.modelId] ?? 1;
|
|
@@ -54,10 +71,10 @@ export class OpenAIImageModel implements ImageModelV3 {
|
|
|
54
71
|
providerOptions,
|
|
55
72
|
headers,
|
|
56
73
|
abortSignal,
|
|
57
|
-
}: Parameters<
|
|
58
|
-
Awaited<ReturnType<
|
|
74
|
+
}: Parameters<ImageModelV4['doGenerate']>[0]): Promise<
|
|
75
|
+
Awaited<ReturnType<ImageModelV4['doGenerate']>>
|
|
59
76
|
> {
|
|
60
|
-
const warnings: Array<
|
|
77
|
+
const warnings: Array<SharedV4Warning> = [];
|
|
61
78
|
|
|
62
79
|
if (aspectRatio != null) {
|
|
63
80
|
warnings.push({
|
|
@@ -80,7 +97,7 @@ export class OpenAIImageModel implements ImageModelV3 {
|
|
|
80
97
|
path: '/images/edits',
|
|
81
98
|
modelId: this.modelId,
|
|
82
99
|
}),
|
|
83
|
-
headers: combineHeaders(this.config.headers(), headers),
|
|
100
|
+
headers: combineHeaders(this.config.headers?.(), headers),
|
|
84
101
|
formData: convertToFormData<OpenAIImageEditInput>({
|
|
85
102
|
model: this.modelId,
|
|
86
103
|
prompt,
|
|
@@ -158,7 +175,7 @@ export class OpenAIImageModel implements ImageModelV3 {
|
|
|
158
175
|
path: '/images/generations',
|
|
159
176
|
modelId: this.modelId,
|
|
160
177
|
}),
|
|
161
|
-
headers: combineHeaders(this.config.headers(), headers),
|
|
178
|
+
headers: combineHeaders(this.config.headers?.(), headers),
|
|
162
179
|
body: {
|
|
163
180
|
model: this.modelId,
|
|
164
181
|
prompt,
|
|
@@ -332,7 +349,7 @@ type OpenAIImageEditInput = {
|
|
|
332
349
|
};
|
|
333
350
|
|
|
334
351
|
async function fileToBlob(
|
|
335
|
-
file:
|
|
352
|
+
file: ImageModelV4File | undefined,
|
|
336
353
|
): Promise<Blob | undefined> {
|
|
337
354
|
if (!file) return undefined;
|
|
338
355
|
|
package/src/index.ts
CHANGED
|
@@ -14,7 +14,9 @@ export type { OpenAILanguageModelCompletionOptions } from './completion/openai-c
|
|
|
14
14
|
export type { OpenAIEmbeddingModelOptions } from './embedding/openai-embedding-options';
|
|
15
15
|
export type { OpenAISpeechModelOptions } from './speech/openai-speech-options';
|
|
16
16
|
export type { OpenAITranscriptionModelOptions } from './transcription/openai-transcription-options';
|
|
17
|
+
export type { OpenAIFilesOptions } from './files/openai-files-options';
|
|
17
18
|
export type {
|
|
19
|
+
OpenaiResponsesCompactionProviderMetadata,
|
|
18
20
|
OpenaiResponsesProviderMetadata,
|
|
19
21
|
OpenaiResponsesReasoningProviderMetadata,
|
|
20
22
|
OpenaiResponsesTextProviderMetadata,
|
package/src/openai-config.ts
CHANGED
|
@@ -3,16 +3,16 @@ import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
|
3
3
|
export type OpenAIConfig = {
|
|
4
4
|
provider: string;
|
|
5
5
|
url: (options: { modelId: string; path: string }) => string;
|
|
6
|
-
headers
|
|
6
|
+
headers?: () => Record<string, string | undefined>;
|
|
7
7
|
fetch?: FetchFunction;
|
|
8
8
|
generateId?: () => string;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* This is soft-deprecated. Use provider references (e.g. `{ openai: 'file-abc123' }`)
|
|
11
|
+
* in file part data instead. File ID prefixes used to identify file IDs
|
|
12
|
+
* in Responses API. When undefined, all string file data is treated as
|
|
13
|
+
* base64 content.
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
* - OpenAI: ['file-'] for IDs like 'file-abc123'
|
|
15
|
-
* - Azure OpenAI: ['assistant-'] for IDs like 'assistant-abc123'
|
|
15
|
+
* TODO: remove in v8
|
|
16
16
|
*/
|
|
17
17
|
fileIdPrefixes?: readonly string[];
|
|
18
18
|
};
|
|
@@ -20,10 +20,10 @@ export function getOpenAILanguageModelCapabilities(
|
|
|
20
20
|
|
|
21
21
|
const supportsPriorityProcessing =
|
|
22
22
|
modelId.startsWith('gpt-4') ||
|
|
23
|
-
modelId.startsWith('gpt-5-mini') ||
|
|
24
23
|
(modelId.startsWith('gpt-5') &&
|
|
25
24
|
!modelId.startsWith('gpt-5-nano') &&
|
|
26
|
-
!modelId.startsWith('gpt-5-chat')
|
|
25
|
+
!modelId.startsWith('gpt-5-chat') &&
|
|
26
|
+
!modelId.startsWith('gpt-5.4-nano')) ||
|
|
27
27
|
modelId.startsWith('o3') ||
|
|
28
28
|
modelId.startsWith('o4-mini');
|
|
29
29
|
|
|
@@ -40,6 +40,7 @@ export function getOpenAILanguageModelCapabilities(
|
|
|
40
40
|
const supportsNonReasoningParameters =
|
|
41
41
|
modelId.startsWith('gpt-5.1') ||
|
|
42
42
|
modelId.startsWith('gpt-5.2') ||
|
|
43
|
+
modelId.startsWith('gpt-5.3') ||
|
|
43
44
|
modelId.startsWith('gpt-5.4');
|
|
44
45
|
|
|
45
46
|
const systemMessageMode = isReasoningModel ? 'developer' : 'system';
|
package/src/openai-provider.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
EmbeddingModelV4,
|
|
3
|
+
FilesV4,
|
|
4
|
+
ImageModelV4,
|
|
5
|
+
LanguageModelV4,
|
|
6
|
+
ProviderV4,
|
|
7
|
+
SpeechModelV4,
|
|
8
|
+
SkillsV4,
|
|
9
|
+
TranscriptionModelV4,
|
|
8
10
|
} from '@ai-sdk/provider';
|
|
9
11
|
import {
|
|
10
12
|
FetchFunction,
|
|
@@ -18,6 +20,7 @@ import { OpenAIChatModelId } from './chat/openai-chat-options';
|
|
|
18
20
|
import { OpenAICompletionLanguageModel } from './completion/openai-completion-language-model';
|
|
19
21
|
import { OpenAICompletionModelId } from './completion/openai-completion-options';
|
|
20
22
|
import { OpenAIEmbeddingModel } from './embedding/openai-embedding-model';
|
|
23
|
+
import { OpenAIFiles } from './files/openai-files';
|
|
21
24
|
import { OpenAIEmbeddingModelId } from './embedding/openai-embedding-options';
|
|
22
25
|
import { OpenAIImageModel } from './image/openai-image-model';
|
|
23
26
|
import { OpenAIImageModelId } from './image/openai-image-options';
|
|
@@ -28,70 +31,81 @@ import { OpenAISpeechModel } from './speech/openai-speech-model';
|
|
|
28
31
|
import { OpenAISpeechModelId } from './speech/openai-speech-options';
|
|
29
32
|
import { OpenAITranscriptionModel } from './transcription/openai-transcription-model';
|
|
30
33
|
import { OpenAITranscriptionModelId } from './transcription/openai-transcription-options';
|
|
34
|
+
import { OpenAISkills } from './skills/openai-skills';
|
|
31
35
|
import { VERSION } from './version';
|
|
32
36
|
|
|
33
|
-
export interface OpenAIProvider extends
|
|
34
|
-
(modelId: OpenAIResponsesModelId):
|
|
37
|
+
export interface OpenAIProvider extends ProviderV4 {
|
|
38
|
+
(modelId: OpenAIResponsesModelId): LanguageModelV4;
|
|
35
39
|
|
|
36
40
|
/**
|
|
37
41
|
* Creates an OpenAI model for text generation.
|
|
38
42
|
*/
|
|
39
|
-
languageModel(modelId: OpenAIResponsesModelId):
|
|
43
|
+
languageModel(modelId: OpenAIResponsesModelId): LanguageModelV4;
|
|
40
44
|
|
|
41
45
|
/**
|
|
42
46
|
* Creates an OpenAI chat model for text generation.
|
|
43
47
|
*/
|
|
44
|
-
chat(modelId: OpenAIChatModelId):
|
|
48
|
+
chat(modelId: OpenAIChatModelId): LanguageModelV4;
|
|
45
49
|
|
|
46
50
|
/**
|
|
47
51
|
* Creates an OpenAI responses API model for text generation.
|
|
48
52
|
*/
|
|
49
|
-
responses(modelId: OpenAIResponsesModelId):
|
|
53
|
+
responses(modelId: OpenAIResponsesModelId): LanguageModelV4;
|
|
50
54
|
|
|
51
55
|
/**
|
|
52
56
|
* Creates an OpenAI completion model for text generation.
|
|
53
57
|
*/
|
|
54
|
-
completion(modelId: OpenAICompletionModelId):
|
|
58
|
+
completion(modelId: OpenAICompletionModelId): LanguageModelV4;
|
|
55
59
|
|
|
56
60
|
/**
|
|
57
61
|
* Creates a model for text embeddings.
|
|
58
62
|
*/
|
|
59
|
-
embedding(modelId: OpenAIEmbeddingModelId):
|
|
63
|
+
embedding(modelId: OpenAIEmbeddingModelId): EmbeddingModelV4;
|
|
60
64
|
|
|
61
65
|
/**
|
|
62
66
|
* Creates a model for text embeddings.
|
|
63
67
|
*/
|
|
64
|
-
embeddingModel(modelId: OpenAIEmbeddingModelId):
|
|
68
|
+
embeddingModel(modelId: OpenAIEmbeddingModelId): EmbeddingModelV4;
|
|
65
69
|
|
|
66
70
|
/**
|
|
67
71
|
* @deprecated Use `embedding` instead.
|
|
68
72
|
*/
|
|
69
|
-
textEmbedding(modelId: OpenAIEmbeddingModelId):
|
|
73
|
+
textEmbedding(modelId: OpenAIEmbeddingModelId): EmbeddingModelV4;
|
|
70
74
|
|
|
71
75
|
/**
|
|
72
76
|
* @deprecated Use `embeddingModel` instead.
|
|
73
77
|
*/
|
|
74
|
-
textEmbeddingModel(modelId: OpenAIEmbeddingModelId):
|
|
78
|
+
textEmbeddingModel(modelId: OpenAIEmbeddingModelId): EmbeddingModelV4;
|
|
75
79
|
|
|
76
80
|
/**
|
|
77
81
|
* Creates a model for image generation.
|
|
78
82
|
*/
|
|
79
|
-
image(modelId: OpenAIImageModelId):
|
|
83
|
+
image(modelId: OpenAIImageModelId): ImageModelV4;
|
|
80
84
|
|
|
81
85
|
/**
|
|
82
86
|
* Creates a model for image generation.
|
|
83
87
|
*/
|
|
84
|
-
imageModel(modelId: OpenAIImageModelId):
|
|
88
|
+
imageModel(modelId: OpenAIImageModelId): ImageModelV4;
|
|
85
89
|
|
|
86
90
|
/**
|
|
87
91
|
* Creates a model for transcription.
|
|
88
92
|
*/
|
|
89
|
-
transcription(modelId: OpenAITranscriptionModelId):
|
|
93
|
+
transcription(modelId: OpenAITranscriptionModelId): TranscriptionModelV4;
|
|
90
94
|
|
|
91
95
|
/**
|
|
92
96
|
* Creates a model for speech generation.
|
|
93
97
|
*/
|
|
94
|
-
speech(modelId: OpenAISpeechModelId):
|
|
98
|
+
speech(modelId: OpenAISpeechModelId): SpeechModelV4;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Returns a FilesV4 interface for uploading files to OpenAI.
|
|
102
|
+
*/
|
|
103
|
+
files(): FilesV4;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Returns a SkillsV4 interface for uploading skills to OpenAI.
|
|
107
|
+
*/
|
|
108
|
+
skills(): SkillsV4;
|
|
95
109
|
|
|
96
110
|
/**
|
|
97
111
|
* OpenAI-specific tools.
|
|
@@ -216,6 +230,22 @@ export function createOpenAI(
|
|
|
216
230
|
fetch: options.fetch,
|
|
217
231
|
});
|
|
218
232
|
|
|
233
|
+
const createFiles = () =>
|
|
234
|
+
new OpenAIFiles({
|
|
235
|
+
provider: `${providerName}.files`,
|
|
236
|
+
baseURL,
|
|
237
|
+
headers: getHeaders,
|
|
238
|
+
fetch: options.fetch,
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
const createSkills = () =>
|
|
242
|
+
new OpenAISkills({
|
|
243
|
+
provider: `${providerName}.skills`,
|
|
244
|
+
url: ({ path }) => `${baseURL}${path}`,
|
|
245
|
+
headers: getHeaders,
|
|
246
|
+
fetch: options.fetch,
|
|
247
|
+
});
|
|
248
|
+
|
|
219
249
|
const createLanguageModel = (modelId: OpenAIResponsesModelId) => {
|
|
220
250
|
if (new.target) {
|
|
221
251
|
throw new Error(
|
|
@@ -232,6 +262,7 @@ export function createOpenAI(
|
|
|
232
262
|
url: ({ path }) => `${baseURL}${path}`,
|
|
233
263
|
headers: getHeaders,
|
|
234
264
|
fetch: options.fetch,
|
|
265
|
+
// Soft-deprecated. TODO: remove in v8
|
|
235
266
|
fileIdPrefixes: ['file-'],
|
|
236
267
|
});
|
|
237
268
|
};
|
|
@@ -240,7 +271,7 @@ export function createOpenAI(
|
|
|
240
271
|
return createLanguageModel(modelId);
|
|
241
272
|
};
|
|
242
273
|
|
|
243
|
-
provider.specificationVersion = '
|
|
274
|
+
provider.specificationVersion = 'v4' as const;
|
|
244
275
|
provider.languageModel = createLanguageModel;
|
|
245
276
|
provider.chat = createChatModel;
|
|
246
277
|
provider.completion = createCompletionModel;
|
|
@@ -258,6 +289,8 @@ export function createOpenAI(
|
|
|
258
289
|
|
|
259
290
|
provider.speech = createSpeechModel;
|
|
260
291
|
provider.speechModel = createSpeechModel;
|
|
292
|
+
provider.files = createFiles;
|
|
293
|
+
provider.skills = createSkills;
|
|
261
294
|
|
|
262
295
|
provider.tools = openaiTools;
|
|
263
296
|
|
package/src/openai-tools.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { fileSearch } from './tool/file-search';
|
|
|
5
5
|
import { imageGeneration } from './tool/image-generation';
|
|
6
6
|
import { localShell } from './tool/local-shell';
|
|
7
7
|
import { shell } from './tool/shell';
|
|
8
|
+
import { toolSearch } from './tool/tool-search';
|
|
8
9
|
import { webSearch } from './tool/web-search';
|
|
9
10
|
import { webSearchPreview } from './tool/web-search-preview';
|
|
10
11
|
import { mcp } from './tool/mcp';
|
|
@@ -24,7 +25,6 @@ export const openaiTools = {
|
|
|
24
25
|
* Lark syntax). The model returns a `custom_tool_call` output item whose
|
|
25
26
|
* `input` field is a string matching the specified grammar.
|
|
26
27
|
*
|
|
27
|
-
* @param name - The name of the custom tool.
|
|
28
28
|
* @param description - An optional description of the tool.
|
|
29
29
|
* @param format - The output format constraint (grammar type, syntax, and definition).
|
|
30
30
|
*/
|
|
@@ -123,4 +123,15 @@ export const openaiTools = {
|
|
|
123
123
|
* @param serverUrl - URL for the MCP server.
|
|
124
124
|
*/
|
|
125
125
|
mcp,
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Tool search allows the model to dynamically search for and load deferred
|
|
129
|
+
* tools into the model's context as needed. This helps reduce overall token
|
|
130
|
+
* usage, cost, and latency by only loading tools when the model needs them.
|
|
131
|
+
*
|
|
132
|
+
* To use tool search, mark functions or namespaces with `defer_loading: true`
|
|
133
|
+
* in the tools array. The model will use tool search to load these tools
|
|
134
|
+
* when it determines they are needed.
|
|
135
|
+
*/
|
|
136
|
+
toolSearch,
|
|
126
137
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LanguageModelV4Usage } from '@ai-sdk/provider';
|
|
2
2
|
|
|
3
3
|
export type OpenAIResponsesUsage = {
|
|
4
4
|
input_tokens: number;
|
|
@@ -13,7 +13,7 @@ export type OpenAIResponsesUsage = {
|
|
|
13
13
|
|
|
14
14
|
export function convertOpenAIResponsesUsage(
|
|
15
15
|
usage: OpenAIResponsesUsage | undefined | null,
|
|
16
|
-
):
|
|
16
|
+
): LanguageModelV4Usage {
|
|
17
17
|
if (usage == null) {
|
|
18
18
|
return {
|
|
19
19
|
inputTokens: {
|