@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.
- package/CHANGELOG.md +18 -0
- package/dist/index.d.ts +98 -41
- package/dist/index.js +155 -41
- package/dist/index.js.map +1 -1
- package/docs/06-open-responses.mdx +56 -5
- package/package.json +3 -3
- package/src/index.ts +1 -0
- package/src/open-responses-extension.ts +299 -67
- package/src/open-responses-provider.ts +4 -4
- package/src/responses/convert-to-open-responses-input.ts +12 -9
- package/src/responses/open-responses-language-model.ts +20 -16
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from '@ai-sdk/provider-utils';
|
|
13
13
|
import {
|
|
14
14
|
createOpenResponsesExtensionRegistry,
|
|
15
|
-
type
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
510
|
-
|
|
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.
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
1121
|
-
item: OpenResponsesExtensionItem
|
|
1124
|
+
extension: OpenResponsesExtensionRegistration;
|
|
1125
|
+
item: OpenResponsesExtensionItem<string>;
|
|
1122
1126
|
part: OpenResponsesExtensionContentPart;
|
|
1123
1127
|
providerOptionsName: string;
|
|
1124
1128
|
}): OpenResponsesExtensionContentPart {
|