@ai-sdk/openai 4.0.0-beta.4 → 4.0.0-beta.41

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.
Files changed (66) hide show
  1. package/CHANGELOG.md +399 -22
  2. package/README.md +2 -0
  3. package/dist/index.d.ts +166 -49
  4. package/dist/index.js +2454 -1627
  5. package/dist/index.js.map +1 -1
  6. package/dist/internal/index.d.ts +176 -53
  7. package/dist/internal/index.js +2220 -1648
  8. package/dist/internal/index.js.map +1 -1
  9. package/docs/03-openai.mdx +292 -22
  10. package/package.json +13 -14
  11. package/src/chat/convert-openai-chat-usage.ts +2 -2
  12. package/src/chat/convert-to-openai-chat-messages.ts +99 -71
  13. package/src/chat/map-openai-finish-reason.ts +2 -2
  14. package/src/chat/openai-chat-api.ts +6 -2
  15. package/src/chat/openai-chat-language-model.ts +68 -164
  16. package/src/chat/openai-chat-options.ts +10 -1
  17. package/src/chat/openai-chat-prepare-tools.ts +7 -7
  18. package/src/completion/convert-openai-completion-usage.ts +2 -2
  19. package/src/completion/convert-to-openai-completion-prompt.ts +2 -3
  20. package/src/completion/map-openai-finish-reason.ts +2 -2
  21. package/src/completion/openai-completion-api.ts +5 -2
  22. package/src/completion/openai-completion-language-model.ts +46 -30
  23. package/src/completion/openai-completion-options.ts +5 -1
  24. package/src/embedding/openai-embedding-model.ts +25 -8
  25. package/src/embedding/openai-embedding-options.ts +5 -1
  26. package/src/files/openai-files-api.ts +17 -0
  27. package/src/files/openai-files-options.ts +22 -0
  28. package/src/files/openai-files.ts +100 -0
  29. package/src/image/openai-image-model.ts +31 -15
  30. package/src/image/openai-image-options.ts +3 -0
  31. package/src/index.ts +2 -0
  32. package/src/openai-config.ts +7 -7
  33. package/src/openai-language-model-capabilities.ts +3 -2
  34. package/src/openai-provider.ts +63 -30
  35. package/src/openai-tools.ts +12 -1
  36. package/src/responses/convert-openai-responses-usage.ts +2 -2
  37. package/src/responses/convert-to-openai-responses-input.ts +244 -77
  38. package/src/responses/map-openai-responses-finish-reason.ts +2 -2
  39. package/src/responses/openai-responses-api.ts +141 -3
  40. package/src/responses/openai-responses-language-model.ts +274 -61
  41. package/src/responses/openai-responses-options.ts +29 -3
  42. package/src/responses/openai-responses-prepare-tools.ts +48 -15
  43. package/src/responses/openai-responses-provider-metadata.ts +12 -2
  44. package/src/skills/openai-skills-api.ts +31 -0
  45. package/src/skills/openai-skills.ts +83 -0
  46. package/src/speech/openai-speech-model.ts +28 -12
  47. package/src/speech/openai-speech-options.ts +5 -1
  48. package/src/tool/apply-patch.ts +33 -32
  49. package/src/tool/code-interpreter.ts +40 -41
  50. package/src/tool/custom.ts +2 -8
  51. package/src/tool/file-search.ts +3 -3
  52. package/src/tool/image-generation.ts +2 -2
  53. package/src/tool/local-shell.ts +2 -2
  54. package/src/tool/mcp.ts +3 -3
  55. package/src/tool/shell.ts +9 -4
  56. package/src/tool/tool-search.ts +98 -0
  57. package/src/tool/web-search-preview.ts +2 -2
  58. package/src/tool/web-search.ts +2 -2
  59. package/src/transcription/openai-transcription-model.ts +30 -14
  60. package/src/transcription/openai-transcription-options.ts +5 -1
  61. package/dist/index.d.mts +0 -1107
  62. package/dist/index.mjs +0 -6508
  63. package/dist/index.mjs.map +0 -1
  64. package/dist/internal/index.d.mts +0 -1137
  65. package/dist/internal/index.mjs +0 -6321
  66. package/dist/internal/index.mjs.map +0 -1
package/src/tool/shell.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import {
2
- createProviderToolFactoryWithOutputSchema,
2
+ createProviderDefinedToolFactoryWithOutputSchema,
3
3
  lazySchema,
4
4
  zodSchema,
5
5
  } from '@ai-sdk/provider-utils';
6
+ import type { SharedV4ProviderReference } from '@ai-sdk/provider';
6
7
  import { z } from 'zod/v4';
7
8
 
8
9
  export const shellInputSchema = lazySchema(() =>
@@ -39,7 +40,7 @@ const shellSkillsSchema = z
39
40
  z.discriminatedUnion('type', [
40
41
  z.object({
41
42
  type: z.literal('skillReference'),
42
- skillId: z.string(),
43
+ providerReference: z.record(z.string(), z.string()),
43
44
  version: z.string().optional(),
44
45
  }),
45
46
  z.object({
@@ -125,7 +126,11 @@ type ShellArgs = {
125
126
  }>;
126
127
  };
127
128
  skills?: Array<
128
- | { type: 'skillReference'; skillId: string; version?: string }
129
+ | {
130
+ type: 'skillReference';
131
+ providerReference: SharedV4ProviderReference;
132
+ version?: string;
133
+ }
129
134
  | {
130
135
  type: 'inline';
131
136
  name: string;
@@ -152,7 +157,7 @@ type ShellArgs = {
152
157
  };
153
158
  };
154
159
 
155
- export const shell = createProviderToolFactoryWithOutputSchema<
160
+ export const shell = createProviderDefinedToolFactoryWithOutputSchema<
156
161
  {
157
162
  /**
158
163
  * Shell tool action containing commands to execute.
@@ -0,0 +1,98 @@
1
+ import type { JSONObject } from '@ai-sdk/provider';
2
+ import {
3
+ createProviderDefinedToolFactoryWithOutputSchema,
4
+ lazySchema,
5
+ zodSchema,
6
+ type FlexibleSchema,
7
+ } from '@ai-sdk/provider-utils';
8
+ import { z } from 'zod/v4';
9
+
10
+ export const toolSearchArgsSchema = lazySchema(() =>
11
+ zodSchema(
12
+ z.object({
13
+ execution: z.enum(['server', 'client']).optional(),
14
+ description: z.string().optional(),
15
+ parameters: z.record(z.string(), z.unknown()).optional(),
16
+ }),
17
+ ),
18
+ );
19
+
20
+ export const toolSearchInputSchema = lazySchema(() =>
21
+ zodSchema(
22
+ z.object({
23
+ arguments: z.unknown().optional(),
24
+ call_id: z.string().nullish(),
25
+ }),
26
+ ),
27
+ );
28
+
29
+ export const toolSearchOutputSchema: FlexibleSchema<{
30
+ tools: Array<JSONObject>;
31
+ }> = lazySchema(() =>
32
+ zodSchema(
33
+ z.object({
34
+ tools: z.array(z.record(z.string(), z.unknown())),
35
+ }),
36
+ ),
37
+ ) as FlexibleSchema<{ tools: Array<JSONObject> }>;
38
+
39
+ const toolSearchToolFactory = createProviderDefinedToolFactoryWithOutputSchema<
40
+ {
41
+ /**
42
+ * The arguments from the tool_search_call.
43
+ * This is preserved for multi-turn conversation reconstruction.
44
+ */
45
+ arguments?: unknown;
46
+
47
+ /**
48
+ * The call ID from the tool_search_call.
49
+ * Present for client-executed tool search; null for hosted.
50
+ */
51
+ call_id?: string | null;
52
+ },
53
+ {
54
+ /**
55
+ * The tools that were loaded by the tool search.
56
+ * These are the deferred tools that the model requested to load.
57
+ * Each tool is represented as a JSON object with properties depending on its type.
58
+ *
59
+ * Common properties include:
60
+ * - `type`: The type of the tool (e.g., 'function', 'web_search', etc.)
61
+ * - `name`: The name of the tool (for function tools)
62
+ * - `description`: A description of the tool
63
+ * - `deferLoading`: Whether this tool was deferred (had defer_loading: true)
64
+ * - `parameters`: The JSON Schema for the function parameters (for function tools)
65
+ * - `strict`: Whether to enable strict schema adherence (for function tools)
66
+ */
67
+ tools: Array<JSONObject>;
68
+ },
69
+ {
70
+ /**
71
+ * Whether the tool search is executed by the server (hosted) or client.
72
+ * - `'server'` (default): OpenAI performs the search across deferred tools.
73
+ * - `'client'`: The model emits a `tool_search_call` and your `execute`
74
+ * function performs the lookup, returning the tools to load.
75
+ */
76
+ execution?: 'server' | 'client';
77
+
78
+ /**
79
+ * A description of the tool search capability.
80
+ * Only used for client-executed tool search.
81
+ */
82
+ description?: string;
83
+
84
+ /**
85
+ * JSON Schema for the search arguments your application expects.
86
+ * Only used for client-executed tool search.
87
+ */
88
+ parameters?: Record<string, unknown>;
89
+ }
90
+ >({
91
+ id: 'openai.tool_search',
92
+ inputSchema: toolSearchInputSchema,
93
+ outputSchema: toolSearchOutputSchema,
94
+ });
95
+
96
+ export const toolSearch = (
97
+ args: Parameters<typeof toolSearchToolFactory>[0] = {},
98
+ ) => toolSearchToolFactory(args);
@@ -1,5 +1,5 @@
1
1
  import {
2
- createProviderToolFactoryWithOutputSchema,
2
+ createProviderExecutedToolFactory,
3
3
  lazySchema,
4
4
  zodSchema,
5
5
  } from '@ai-sdk/provider-utils';
@@ -50,7 +50,7 @@ const webSearchPreviewOutputSchema = lazySchema(() =>
50
50
  ),
51
51
  );
52
52
 
53
- export const webSearchPreview = createProviderToolFactoryWithOutputSchema<
53
+ export const webSearchPreview = createProviderExecutedToolFactory<
54
54
  {
55
55
  // Web search preview doesn't take input parameters - it's controlled by the prompt
56
56
  },
@@ -1,5 +1,5 @@
1
1
  import {
2
- createProviderToolFactoryWithOutputSchema,
2
+ createProviderExecutedToolFactory,
3
3
  lazySchema,
4
4
  zodSchema,
5
5
  } from '@ai-sdk/provider-utils';
@@ -60,7 +60,7 @@ export const webSearchOutputSchema = lazySchema(() =>
60
60
  ),
61
61
  );
62
62
 
63
- export const webSearchToolFactory = createProviderToolFactoryWithOutputSchema<
63
+ export const webSearchToolFactory = createProviderExecutedToolFactory<
64
64
  {
65
65
  // Web search doesn't take input parameters - it's controlled by the prompt
66
66
  },
@@ -1,7 +1,7 @@
1
- import {
2
- TranscriptionModelV3,
3
- TranscriptionModelV3CallOptions,
4
- SharedV3Warning,
1
+ import type {
2
+ TranscriptionModelV4,
3
+ TranscriptionModelV4CallOptions,
4
+ SharedV4Warning,
5
5
  } from '@ai-sdk/provider';
6
6
  import {
7
7
  combineHeaders,
@@ -10,18 +10,20 @@ import {
10
10
  mediaTypeToExtension,
11
11
  parseProviderOptions,
12
12
  postFormDataToApi,
13
+ serializeModelOptions,
14
+ WORKFLOW_DESERIALIZE,
15
+ WORKFLOW_SERIALIZE,
13
16
  } from '@ai-sdk/provider-utils';
14
- import { OpenAIConfig } from '../openai-config';
17
+ import type { OpenAIConfig } from '../openai-config';
15
18
  import { openaiFailedResponseHandler } from '../openai-error';
16
19
  import { openaiTranscriptionResponseSchema } from './openai-transcription-api';
17
20
  import {
18
- OpenAITranscriptionModelId,
19
21
  openAITranscriptionModelOptions,
20
- OpenAITranscriptionModelOptions,
22
+ type OpenAITranscriptionModelId,
23
+ type OpenAITranscriptionModelOptions,
21
24
  } from './openai-transcription-options';
22
-
23
25
  export type OpenAITranscriptionCallOptions = Omit<
24
- TranscriptionModelV3CallOptions,
26
+ TranscriptionModelV4CallOptions,
25
27
  'providerOptions'
26
28
  > & {
27
29
  providerOptions?: {
@@ -96,8 +98,22 @@ const languageMap = {
96
98
  welsh: 'cy',
97
99
  };
98
100
 
99
- export class OpenAITranscriptionModel implements TranscriptionModelV3 {
100
- readonly specificationVersion = 'v3';
101
+ export class OpenAITranscriptionModel implements TranscriptionModelV4 {
102
+ readonly specificationVersion = 'v4';
103
+
104
+ static [WORKFLOW_SERIALIZE](model: OpenAITranscriptionModel) {
105
+ return serializeModelOptions({
106
+ modelId: model.modelId,
107
+ config: model.config,
108
+ });
109
+ }
110
+
111
+ static [WORKFLOW_DESERIALIZE](options: {
112
+ modelId: OpenAITranscriptionModelId;
113
+ config: OpenAITranscriptionModelConfig;
114
+ }) {
115
+ return new OpenAITranscriptionModel(options.modelId, options.config);
116
+ }
101
117
 
102
118
  get provider(): string {
103
119
  return this.config.provider;
@@ -113,7 +129,7 @@ export class OpenAITranscriptionModel implements TranscriptionModelV3 {
113
129
  mediaType,
114
130
  providerOptions,
115
131
  }: OpenAITranscriptionCallOptions) {
116
- const warnings: SharedV3Warning[] = [];
132
+ const warnings: SharedV4Warning[] = [];
117
133
 
118
134
  // Parse provider options
119
135
  const openAIOptions = await parseProviderOptions({
@@ -176,7 +192,7 @@ export class OpenAITranscriptionModel implements TranscriptionModelV3 {
176
192
 
177
193
  async doGenerate(
178
194
  options: OpenAITranscriptionCallOptions,
179
- ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {
195
+ ): Promise<Awaited<ReturnType<TranscriptionModelV4['doGenerate']>>> {
180
196
  const currentDate = this.config._internal?.currentDate?.() ?? new Date();
181
197
  const { formData, warnings } = await this.getArgs(options);
182
198
 
@@ -189,7 +205,7 @@ export class OpenAITranscriptionModel implements TranscriptionModelV3 {
189
205
  path: '/audio/transcriptions',
190
206
  modelId: this.modelId,
191
207
  }),
192
- headers: combineHeaders(this.config.headers(), options.headers),
208
+ headers: combineHeaders(this.config.headers?.(), options.headers),
193
209
  formData,
194
210
  failedResponseHandler: openaiFailedResponseHandler,
195
211
  successfulResponseHandler: createJsonResponseHandler(
@@ -1,4 +1,8 @@
1
- import { InferSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';
1
+ import {
2
+ lazySchema,
3
+ zodSchema,
4
+ type InferSchema,
5
+ } from '@ai-sdk/provider-utils';
2
6
  import { z } from 'zod/v4';
3
7
 
4
8
  export type OpenAITranscriptionModelId =