@ai-sdk/open-responses 2.0.54 → 2.0.56

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.
@@ -12,7 +12,7 @@ import {
12
12
  } from '@ai-sdk/provider-utils';
13
13
  import {
14
14
  createOpenResponsesExtensionRegistry,
15
- type OpenResponsesExtension,
15
+ type OpenResponsesExtensionRegistration,
16
16
  } from './open-responses-extension';
17
17
  import { createOpenResponsesTools } from './open-responses-tools';
18
18
  import { OpenResponsesLanguageModel } from './responses/open-responses-language-model';
@@ -90,7 +90,7 @@ export interface OpenResponsesProviderSettings {
90
90
  /**
91
91
  * User-agent suffix for requests.
92
92
  *
93
- * @default `ai-sdk/open-responses/<version>`
93
+ * @default `ai-sdk-open-responses/<version>`
94
94
  */
95
95
  userAgentSuffix?: string;
96
96
 
@@ -99,7 +99,7 @@ export interface OpenResponsesProviderSettings {
99
99
  *
100
100
  * @experimental This API may change in a future release.
101
101
  */
102
- experimental_extensions?: readonly OpenResponsesExtension[];
102
+ experimental_extensions?: readonly OpenResponsesExtensionRegistration[];
103
103
  }
104
104
 
105
105
  export function createOpenResponses(
@@ -123,7 +123,7 @@ export function createOpenResponses(
123
123
  ? options.headers()
124
124
  : options.headers),
125
125
  },
126
- options.userAgentSuffix ?? `ai-sdk/open-responses/${VERSION}`,
126
+ options.userAgentSuffix ?? `ai-sdk-open-responses/${VERSION}`,
127
127
  );
128
128
 
129
129
  const createResponsesModel = (modelId: string) => {
@@ -10,6 +10,8 @@ import {
10
10
  resolveFullMediaType,
11
11
  } from '@ai-sdk/provider-utils';
12
12
  import {
13
+ asOpenResponsesExtensionRecord,
14
+ getOpenResponsesExtensionItemTypes,
13
15
  isOpenResponsesExtensionItem,
14
16
  type OpenResponsesExtensionInputPart,
15
17
  type OpenResponsesExtensionItem,
@@ -182,7 +184,7 @@ export async function convertToOpenResponsesInput({
182
184
  if (replayItem != null) {
183
185
  const replayKey = `${replayItem.type}:${replayItem.id}`;
184
186
  if (!replayedExtensionItems.has(replayKey)) {
185
- input.push(replayItem);
187
+ input.push(asOpenResponsesExtensionRecord(replayItem));
186
188
  replayedExtensionItems.add(replayKey);
187
189
  }
188
190
  }
@@ -210,7 +212,7 @@ export async function convertToOpenResponsesInput({
210
212
  feature: `provider-defined tool ${providerTool.id} ${part.type} history`,
211
213
  });
212
214
  } else {
213
- input.push(...encoded);
215
+ input.push(...encoded.map(asOpenResponsesExtensionRecord));
214
216
  }
215
217
  continue;
216
218
  }
@@ -356,7 +358,7 @@ export async function convertToOpenResponsesInput({
356
358
  if (replayItem != null) {
357
359
  const replayKey = `${replayItem.type}:${replayItem.id}`;
358
360
  if (!replayedExtensionItems.has(replayKey)) {
359
- input.push(replayItem);
361
+ input.push(asOpenResponsesExtensionRecord(replayItem));
360
362
  replayedExtensionItems.add(replayKey);
361
363
  }
362
364
  }
@@ -382,7 +384,7 @@ export async function convertToOpenResponsesInput({
382
384
  feature: `provider-defined tool ${providerTool.id} tool-result history`,
383
385
  });
384
386
  } else {
385
- input.push(...encoded);
387
+ input.push(...encoded.map(asOpenResponsesExtensionRecord));
386
388
  }
387
389
  continue;
388
390
  }
@@ -503,11 +505,12 @@ async function encodeExtensionInputPart({
503
505
  extensionRegistry: OpenResponsesExtensionRegistry | undefined;
504
506
  part: OpenResponsesExtensionInputPart;
505
507
  providerTool: LanguageModelV4ProviderTool;
506
- }): Promise<OpenResponsesExtensionItem[] | undefined> {
508
+ }): Promise<OpenResponsesExtensionItem<string>[] | undefined> {
507
509
  const extension = extensionRegistry?.byProviderToolId.get(providerTool.id);
508
510
  const encodeInputItem = extension?.encodeInputItem;
509
- const itemTypes = extension?.itemTypes;
510
- if (encodeInputItem == null || itemTypes == null) {
511
+ const itemTypes =
512
+ extension == null ? [] : getOpenResponsesExtensionItemTypes(extension);
513
+ if (encodeInputItem == null || itemTypes.length === 0) {
511
514
  return undefined;
512
515
  }
513
516
 
@@ -546,7 +549,7 @@ function getExtensionReplay({
546
549
  };
547
550
  providerOptionsName: string;
548
551
  extensionRegistry: OpenResponsesExtensionRegistry | undefined;
549
- }): { item?: OpenResponsesExtensionItem } | undefined {
552
+ }): { item?: OpenResponsesExtensionItem<string> } | undefined {
550
553
  const extensionData = getProviderData(
551
554
  part,
552
555
  providerOptionsName,
@@ -580,7 +583,7 @@ function getExtensionReplay({
580
583
 
581
584
  if (
582
585
  isOpenResponsesExtensionItem(item) &&
583
- extension.itemTypes?.includes(item.type)
586
+ getOpenResponsesExtensionItemTypes(extension).includes(item.type)
584
587
  ) {
585
588
  return { item };
586
589
  }
@@ -30,14 +30,16 @@ import {
30
30
  } from '@ai-sdk/provider-utils';
31
31
  import { z } from 'zod/v4';
32
32
  import {
33
+ asOpenResponsesExtensionRecord,
33
34
  createOpenResponsesExtensionRegistry,
35
+ getOpenResponsesExtensionToolType,
34
36
  isOpenResponsesExtensionEvent,
35
37
  isOpenResponsesExtensionItem,
36
38
  isOpenResponsesJSONObject,
37
- type OpenResponsesExtension,
38
39
  type OpenResponsesExtensionContentPart,
39
40
  type OpenResponsesExtensionItem,
40
41
  type OpenResponsesExtensionRecord,
42
+ type OpenResponsesExtensionRegistration,
41
43
  type OpenResponsesExtensionRegistry,
42
44
  } from '../open-responses-extension';
43
45
  import { convertToOpenResponsesInput } from './convert-to-open-responses-input';
@@ -162,8 +164,8 @@ export class OpenResponsesLanguageModel implements LanguageModelV4 {
162
164
  const encodedProviderToolsByName = new Map<
163
165
  string,
164
166
  {
165
- toolType: OpenResponsesExtensionRecord['type'];
166
- encodeToolChoice: OpenResponsesExtension['encodeToolChoice'];
167
+ toolType: OpenResponsesExtensionRecord<string>['type'];
168
+ encodeToolChoice: OpenResponsesExtensionRegistration['encodeToolChoice'];
167
169
  tool: Extract<
168
170
  NonNullable<LanguageModelV4CallOptions['tools']>[number],
169
171
  { type: 'provider' }
@@ -211,9 +213,10 @@ export class OpenResponsesLanguageModel implements LanguageModelV4 {
211
213
  continue;
212
214
  }
213
215
  const extension = this.extensionRegistry.byProviderToolId.get(tool.id);
214
- let encoded: OpenResponsesExtensionRecord | undefined;
216
+ let encoded: OpenResponsesExtensionRecord<string> | undefined;
215
217
 
216
218
  if (extension != null) {
219
+ const toolType = getOpenResponsesExtensionToolType(extension)!;
217
220
  try {
218
221
  const fields = await extension.encodeTool({
219
222
  name: tool.name,
@@ -223,7 +226,7 @@ export class OpenResponsesLanguageModel implements LanguageModelV4 {
223
226
  if (isOpenResponsesJSONObject(fields)) {
224
227
  encoded = {
225
228
  ...fields,
226
- type: extension.toolType,
229
+ type: toolType,
227
230
  };
228
231
  }
229
232
  } catch {
@@ -237,9 +240,9 @@ export class OpenResponsesLanguageModel implements LanguageModelV4 {
237
240
  feature: `provider-defined tool ${tool.id}`,
238
241
  });
239
242
  } else if (extension != null) {
240
- convertedTools.push(encoded);
243
+ convertedTools.push(asOpenResponsesExtensionRecord(encoded));
241
244
  encodedProviderToolsByName.set(tool.name, {
242
- toolType: extension.toolType,
245
+ toolType: getOpenResponsesExtensionToolType(extension)!,
243
246
  encodeToolChoice: extension.encodeToolChoice,
244
247
  tool,
245
248
  });
@@ -297,10 +300,10 @@ export class OpenResponsesLanguageModel implements LanguageModelV4 {
297
300
  feature: `tool choice for provider-defined tool ${tool.id}`,
298
301
  });
299
302
  } else {
300
- convertedToolChoice = {
303
+ convertedToolChoice = asOpenResponsesExtensionRecord({
301
304
  ...(isOpenResponsesJSONObject(fields) ? fields : {}),
302
305
  type: toolType,
303
- };
306
+ });
304
307
  }
305
308
  }
306
309
  } else {
@@ -710,8 +713,8 @@ export class OpenResponsesLanguageModel implements LanguageModelV4 {
710
713
  } catch (error) {
711
714
  controller.enqueue({ type: 'error', error });
712
715
  }
716
+ return;
713
717
  }
714
- return;
715
718
  }
716
719
 
717
720
  // Tool call events (single-shot tool-call when complete)
@@ -840,7 +843,8 @@ export class OpenResponsesLanguageModel implements LanguageModelV4 {
840
843
  customToolCallsByItemId.delete(chunk.item.id);
841
844
  } else if (
842
845
  chunk.type === 'response.output_item.done' &&
843
- isOpenResponsesExtensionItem(chunk.item)
846
+ isOpenResponsesExtensionItem(chunk.item) &&
847
+ extensionRegistry.byItemType.has(chunk.item.type)
844
848
  ) {
845
849
  try {
846
850
  const decoded = await decodeExtensionItem({
@@ -1057,7 +1061,7 @@ async function decodeExtensionItem({
1057
1061
  providerOptionsName,
1058
1062
  }: {
1059
1063
  extensionRegistry: OpenResponsesExtensionRegistry;
1060
- item: OpenResponsesExtensionItem;
1064
+ item: OpenResponsesExtensionItem<string>;
1061
1065
  mode: 'generate' | 'stream';
1062
1066
  providerOptionsName: string;
1063
1067
  }): Promise<OpenResponsesExtensionContentPart[] | undefined> {
@@ -1093,8 +1097,8 @@ function createExtensionReplayCarrier({
1093
1097
  item,
1094
1098
  providerOptionsName,
1095
1099
  }: {
1096
- extension: OpenResponsesExtension;
1097
- item: OpenResponsesExtensionItem;
1100
+ extension: OpenResponsesExtensionRegistration;
1101
+ item: OpenResponsesExtensionItem<string>;
1098
1102
  providerOptionsName: string;
1099
1103
  }): OpenResponsesExtensionContentPart {
1100
1104
  return {
@@ -1117,8 +1121,8 @@ function addExtensionItemReferenceMetadata({
1117
1121
  part,
1118
1122
  providerOptionsName,
1119
1123
  }: {
1120
- extension: OpenResponsesExtension;
1121
- item: OpenResponsesExtensionItem;
1124
+ extension: OpenResponsesExtensionRegistration;
1125
+ item: OpenResponsesExtensionItem<string>;
1122
1126
  part: OpenResponsesExtensionContentPart;
1123
1127
  providerOptionsName: string;
1124
1128
  }): OpenResponsesExtensionContentPart {