openai 4.86.2 → 4.87.1
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 +16 -0
- package/README.md +50 -101
- package/core.js +2 -1
- package/core.js.map +1 -1
- package/core.mjs +2 -1
- package/core.mjs.map +1 -1
- package/helpers/zod.d.ts +14 -1
- package/helpers/zod.d.ts.map +1 -1
- package/helpers/zod.js +25 -1
- package/helpers/zod.js.map +1 -1
- package/helpers/zod.mjs +23 -1
- package/helpers/zod.mjs.map +1 -1
- package/index.d.mts +14 -3
- package/index.d.ts +14 -3
- package/index.d.ts.map +1 -1
- package/index.js +8 -0
- package/index.js.map +1 -1
- package/index.mjs +8 -0
- package/index.mjs.map +1 -1
- package/lib/ResponsesParser.d.ts +33 -0
- package/lib/ResponsesParser.d.ts.map +1 -0
- package/lib/ResponsesParser.js +171 -0
- package/lib/ResponsesParser.js.map +1 -0
- package/lib/ResponsesParser.mjs +160 -0
- package/lib/ResponsesParser.mjs.map +1 -0
- package/lib/parser.d.ts +7 -0
- package/lib/parser.d.ts.map +1 -1
- package/lib/parser.js +16 -1
- package/lib/parser.js.map +1 -1
- package/lib/parser.mjs +14 -0
- package/lib/parser.mjs.map +1 -1
- package/lib/responses/EventTypes.d.ts +9 -0
- package/lib/responses/EventTypes.d.ts.map +1 -0
- package/lib/responses/EventTypes.js +3 -0
- package/lib/responses/EventTypes.js.map +1 -0
- package/lib/responses/EventTypes.mjs +2 -0
- package/lib/responses/EventTypes.mjs.map +1 -0
- package/lib/responses/ResponseStream.d.ts +34 -0
- package/lib/responses/ResponseStream.d.ts.map +1 -0
- package/lib/responses/ResponseStream.js +238 -0
- package/lib/responses/ResponseStream.js.map +1 -0
- package/lib/responses/ResponseStream.mjs +234 -0
- package/lib/responses/ResponseStream.mjs.map +1 -0
- package/package.json +1 -1
- package/resources/beta/assistants.d.ts +41 -9
- package/resources/beta/assistants.d.ts.map +1 -1
- package/resources/beta/assistants.js.map +1 -1
- package/resources/beta/assistants.mjs.map +1 -1
- package/resources/beta/beta.d.ts +0 -4
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/beta.js +0 -5
- package/resources/beta/beta.js.map +1 -1
- package/resources/beta/beta.mjs +0 -5
- package/resources/beta/beta.mjs.map +1 -1
- package/resources/beta/index.d.ts +0 -1
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/index.js +1 -4
- package/resources/beta/index.js.map +1 -1
- package/resources/beta/index.mjs +0 -1
- package/resources/beta/index.mjs.map +1 -1
- package/resources/beta/threads/runs/runs.d.ts +3 -4
- package/resources/beta/threads/runs/runs.d.ts.map +1 -1
- package/resources/beta/threads/runs/runs.js.map +1 -1
- package/resources/beta/threads/runs/runs.mjs.map +1 -1
- package/resources/beta/threads/threads.d.ts +73 -7
- package/resources/beta/threads/threads.d.ts.map +1 -1
- package/resources/beta/threads/threads.js.map +1 -1
- package/resources/beta/threads/threads.mjs.map +1 -1
- package/resources/chat/chat.d.ts +3 -2
- package/resources/chat/chat.d.ts.map +1 -1
- package/resources/chat/chat.js.map +1 -1
- package/resources/chat/chat.mjs.map +1 -1
- package/resources/chat/completions/completions.d.ts +200 -64
- package/resources/chat/completions/completions.d.ts.map +1 -1
- package/resources/chat/completions/completions.js +3 -3
- package/resources/chat/completions/completions.js.map +1 -1
- package/resources/chat/completions/completions.mjs +3 -3
- package/resources/chat/completions/completions.mjs.map +1 -1
- package/resources/chat/completions/index.d.ts +1 -1
- package/resources/chat/completions/index.d.ts.map +1 -1
- package/resources/chat/completions/index.js.map +1 -1
- package/resources/chat/completions/index.mjs.map +1 -1
- package/resources/chat/completions/messages.d.ts +1 -1
- package/resources/chat/index.d.ts +2 -2
- package/resources/chat/index.d.ts.map +1 -1
- package/resources/chat/index.js.map +1 -1
- package/resources/chat/index.mjs.map +1 -1
- package/resources/files.d.ts +9 -17
- package/resources/files.d.ts.map +1 -1
- package/resources/files.js.map +1 -1
- package/resources/files.mjs.map +1 -1
- package/resources/index.d.ts +2 -0
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js +7 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs +2 -0
- package/resources/index.mjs.map +1 -1
- package/resources/responses/index.d.ts +3 -0
- package/resources/responses/index.d.ts.map +1 -0
- package/resources/responses/index.js +10 -0
- package/resources/responses/index.js.map +1 -0
- package/resources/responses/index.mjs +4 -0
- package/resources/responses/index.mjs.map +1 -0
- package/resources/responses/input-items.d.ts +169 -0
- package/resources/responses/input-items.d.ts.map +1 -0
- package/resources/responses/input-items.js +24 -0
- package/resources/responses/input-items.js.map +1 -0
- package/resources/responses/input-items.mjs +19 -0
- package/resources/responses/input-items.mjs.map +1 -0
- package/resources/responses/responses.d.ts +2230 -0
- package/resources/responses/responses.d.ts.map +1 -0
- package/resources/responses/responses.js +77 -0
- package/resources/responses/responses.js.map +1 -0
- package/resources/responses/responses.mjs +50 -0
- package/resources/responses/responses.mjs.map +1 -0
- package/resources/shared.d.ts +99 -4
- package/resources/shared.d.ts.map +1 -1
- package/resources/uploads/uploads.d.ts +3 -4
- package/resources/uploads/uploads.d.ts.map +1 -1
- package/resources/uploads/uploads.js +3 -4
- package/resources/uploads/uploads.js.map +1 -1
- package/resources/uploads/uploads.mjs +3 -4
- package/resources/uploads/uploads.mjs.map +1 -1
- package/resources/{beta/vector-stores → vector-stores}/file-batches.d.ts +12 -4
- package/resources/vector-stores/file-batches.d.ts.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/file-batches.js +4 -4
- package/resources/vector-stores/file-batches.js.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/file-batches.mjs +4 -4
- package/resources/vector-stores/file-batches.mjs.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/files.d.ts +54 -5
- package/resources/vector-stores/files.d.ts.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/files.js +27 -4
- package/resources/vector-stores/files.js.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/files.mjs +25 -3
- package/resources/vector-stores/files.mjs.map +1 -0
- package/resources/vector-stores/index.d.ts +4 -0
- package/resources/vector-stores/index.d.ts.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/index.js +3 -1
- package/resources/vector-stores/index.js.map +1 -0
- package/resources/vector-stores/index.mjs +5 -0
- package/resources/vector-stores/index.mjs.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/vector-stores.d.ts +90 -7
- package/resources/vector-stores/vector-stores.d.ts.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/vector-stores.js +24 -4
- package/resources/vector-stores/vector-stores.js.map +1 -0
- package/resources/{beta/vector-stores → vector-stores}/vector-stores.mjs +23 -4
- package/resources/vector-stores/vector-stores.mjs.map +1 -0
- package/src/core.ts +2 -2
- package/src/helpers/zod.ts +46 -0
- package/src/index.ts +54 -4
- package/src/lib/ResponsesParser.ts +262 -0
- package/src/lib/parser.ts +28 -0
- package/src/lib/responses/EventTypes.ts +76 -0
- package/src/lib/responses/ResponseStream.ts +298 -0
- package/src/resources/beta/assistants.ts +46 -9
- package/src/resources/beta/beta.ts +0 -37
- package/src/resources/beta/index.ts +0 -16
- package/src/resources/beta/threads/runs/runs.ts +3 -4
- package/src/resources/beta/threads/threads.ts +83 -7
- package/src/resources/chat/chat.ts +3 -43
- package/src/resources/chat/completions/completions.ts +224 -66
- package/src/resources/chat/completions/index.ts +0 -1
- package/src/resources/chat/completions/messages.ts +1 -1
- package/src/resources/chat/index.ts +1 -2
- package/src/resources/files.ts +9 -17
- package/src/resources/index.ts +20 -0
- package/src/resources/responses/index.ts +9 -0
- package/src/resources/responses/input-items.ts +276 -0
- package/src/resources/responses/responses.ts +2761 -0
- package/src/resources/shared.ts +152 -4
- package/src/resources/uploads/uploads.ts +3 -4
- package/src/resources/{beta/vector-stores → vector-stores}/file-batches.ts +16 -7
- package/src/resources/{beta/vector-stores → vector-stores}/files.ts +85 -4
- package/src/resources/{beta/vector-stores → vector-stores}/index.ts +6 -0
- package/src/resources/{beta/vector-stores → vector-stores}/vector-stores.ts +125 -5
- package/src/streaming.ts +1 -1
- package/src/version.ts +1 -1
- package/streaming.js +1 -1
- package/streaming.js.map +1 -1
- package/streaming.mjs +1 -1
- package/streaming.mjs.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
- package/resources/beta/vector-stores/file-batches.d.ts.map +0 -1
- package/resources/beta/vector-stores/file-batches.js.map +0 -1
- package/resources/beta/vector-stores/file-batches.mjs.map +0 -1
- package/resources/beta/vector-stores/files.d.ts.map +0 -1
- package/resources/beta/vector-stores/files.js.map +0 -1
- package/resources/beta/vector-stores/files.mjs.map +0 -1
- package/resources/beta/vector-stores/index.d.ts +0 -4
- package/resources/beta/vector-stores/index.d.ts.map +0 -1
- package/resources/beta/vector-stores/index.js.map +0 -1
- package/resources/beta/vector-stores/index.mjs +0 -5
- package/resources/beta/vector-stores/index.mjs.map +0 -1
- package/resources/beta/vector-stores/vector-stores.d.ts.map +0 -1
- package/resources/beta/vector-stores/vector-stores.js.map +0 -1
- package/resources/beta/vector-stores/vector-stores.mjs.map +0 -1
package/src/index.ts
CHANGED
|
@@ -65,14 +65,34 @@ import {
|
|
|
65
65
|
} from './resources/moderations';
|
|
66
66
|
import { Audio, AudioModel, AudioResponseFormat } from './resources/audio/audio';
|
|
67
67
|
import { Beta } from './resources/beta/beta';
|
|
68
|
-
import { Chat
|
|
68
|
+
import { Chat } from './resources/chat/chat';
|
|
69
69
|
import { FineTuning } from './resources/fine-tuning/fine-tuning';
|
|
70
|
+
import { Responses } from './resources/responses/responses';
|
|
70
71
|
import {
|
|
71
72
|
Upload,
|
|
72
73
|
UploadCompleteParams,
|
|
73
74
|
UploadCreateParams,
|
|
74
75
|
Uploads as UploadsAPIUploads,
|
|
75
76
|
} from './resources/uploads/uploads';
|
|
77
|
+
import {
|
|
78
|
+
AutoFileChunkingStrategyParam,
|
|
79
|
+
FileChunkingStrategy,
|
|
80
|
+
FileChunkingStrategyParam,
|
|
81
|
+
OtherFileChunkingStrategyObject,
|
|
82
|
+
StaticFileChunkingStrategy,
|
|
83
|
+
StaticFileChunkingStrategyObject,
|
|
84
|
+
StaticFileChunkingStrategyObjectParam,
|
|
85
|
+
VectorStore,
|
|
86
|
+
VectorStoreCreateParams,
|
|
87
|
+
VectorStoreDeleted,
|
|
88
|
+
VectorStoreListParams,
|
|
89
|
+
VectorStoreSearchParams,
|
|
90
|
+
VectorStoreSearchResponse,
|
|
91
|
+
VectorStoreSearchResponsesPage,
|
|
92
|
+
VectorStoreUpdateParams,
|
|
93
|
+
VectorStores,
|
|
94
|
+
VectorStoresPage,
|
|
95
|
+
} from './resources/vector-stores/vector-stores';
|
|
76
96
|
import {
|
|
77
97
|
ChatCompletion,
|
|
78
98
|
ChatCompletionAssistantMessageParam,
|
|
@@ -98,7 +118,6 @@ import {
|
|
|
98
118
|
ChatCompletionModality,
|
|
99
119
|
ChatCompletionNamedToolChoice,
|
|
100
120
|
ChatCompletionPredictionContent,
|
|
101
|
-
ChatCompletionReasoningEffort,
|
|
102
121
|
ChatCompletionRole,
|
|
103
122
|
ChatCompletionStoreMessage,
|
|
104
123
|
ChatCompletionStreamOptions,
|
|
@@ -267,9 +286,11 @@ export class OpenAI extends Core.APIClient {
|
|
|
267
286
|
moderations: API.Moderations = new API.Moderations(this);
|
|
268
287
|
models: API.Models = new API.Models(this);
|
|
269
288
|
fineTuning: API.FineTuning = new API.FineTuning(this);
|
|
289
|
+
vectorStores: API.VectorStores = new API.VectorStores(this);
|
|
270
290
|
beta: API.Beta = new API.Beta(this);
|
|
271
291
|
batches: API.Batches = new API.Batches(this);
|
|
272
292
|
uploads: API.Uploads = new API.Uploads(this);
|
|
293
|
+
responses: API.Responses = new API.Responses(this);
|
|
273
294
|
|
|
274
295
|
protected override defaultQuery(): Core.DefaultQuery | undefined {
|
|
275
296
|
return this._options.defaultQuery;
|
|
@@ -325,10 +346,14 @@ OpenAI.Moderations = Moderations;
|
|
|
325
346
|
OpenAI.Models = Models;
|
|
326
347
|
OpenAI.ModelsPage = ModelsPage;
|
|
327
348
|
OpenAI.FineTuning = FineTuning;
|
|
349
|
+
OpenAI.VectorStores = VectorStores;
|
|
350
|
+
OpenAI.VectorStoresPage = VectorStoresPage;
|
|
351
|
+
OpenAI.VectorStoreSearchResponsesPage = VectorStoreSearchResponsesPage;
|
|
328
352
|
OpenAI.Beta = Beta;
|
|
329
353
|
OpenAI.Batches = Batches;
|
|
330
354
|
OpenAI.BatchesPage = BatchesPage;
|
|
331
355
|
OpenAI.Uploads = UploadsAPIUploads;
|
|
356
|
+
OpenAI.Responses = Responses;
|
|
332
357
|
export declare namespace OpenAI {
|
|
333
358
|
export type RequestOptions = Core.RequestOptions;
|
|
334
359
|
|
|
@@ -350,7 +375,6 @@ export declare namespace OpenAI {
|
|
|
350
375
|
|
|
351
376
|
export {
|
|
352
377
|
Chat as Chat,
|
|
353
|
-
type ChatModel as ChatModel,
|
|
354
378
|
type ChatCompletion as ChatCompletion,
|
|
355
379
|
type ChatCompletionAssistantMessageParam as ChatCompletionAssistantMessageParam,
|
|
356
380
|
type ChatCompletionAudio as ChatCompletionAudio,
|
|
@@ -371,7 +395,6 @@ export declare namespace OpenAI {
|
|
|
371
395
|
type ChatCompletionModality as ChatCompletionModality,
|
|
372
396
|
type ChatCompletionNamedToolChoice as ChatCompletionNamedToolChoice,
|
|
373
397
|
type ChatCompletionPredictionContent as ChatCompletionPredictionContent,
|
|
374
|
-
type ChatCompletionReasoningEffort as ChatCompletionReasoningEffort,
|
|
375
398
|
type ChatCompletionRole as ChatCompletionRole,
|
|
376
399
|
type ChatCompletionStoreMessage as ChatCompletionStoreMessage,
|
|
377
400
|
type ChatCompletionStreamOptions as ChatCompletionStreamOptions,
|
|
@@ -440,6 +463,26 @@ export declare namespace OpenAI {
|
|
|
440
463
|
|
|
441
464
|
export { FineTuning as FineTuning };
|
|
442
465
|
|
|
466
|
+
export {
|
|
467
|
+
VectorStores as VectorStores,
|
|
468
|
+
type AutoFileChunkingStrategyParam as AutoFileChunkingStrategyParam,
|
|
469
|
+
type FileChunkingStrategy as FileChunkingStrategy,
|
|
470
|
+
type FileChunkingStrategyParam as FileChunkingStrategyParam,
|
|
471
|
+
type OtherFileChunkingStrategyObject as OtherFileChunkingStrategyObject,
|
|
472
|
+
type StaticFileChunkingStrategy as StaticFileChunkingStrategy,
|
|
473
|
+
type StaticFileChunkingStrategyObject as StaticFileChunkingStrategyObject,
|
|
474
|
+
type StaticFileChunkingStrategyObjectParam as StaticFileChunkingStrategyObjectParam,
|
|
475
|
+
type VectorStore as VectorStore,
|
|
476
|
+
type VectorStoreDeleted as VectorStoreDeleted,
|
|
477
|
+
type VectorStoreSearchResponse as VectorStoreSearchResponse,
|
|
478
|
+
VectorStoresPage as VectorStoresPage,
|
|
479
|
+
VectorStoreSearchResponsesPage as VectorStoreSearchResponsesPage,
|
|
480
|
+
type VectorStoreCreateParams as VectorStoreCreateParams,
|
|
481
|
+
type VectorStoreUpdateParams as VectorStoreUpdateParams,
|
|
482
|
+
type VectorStoreListParams as VectorStoreListParams,
|
|
483
|
+
type VectorStoreSearchParams as VectorStoreSearchParams,
|
|
484
|
+
};
|
|
485
|
+
|
|
443
486
|
export { Beta as Beta };
|
|
444
487
|
|
|
445
488
|
export {
|
|
@@ -459,10 +502,17 @@ export declare namespace OpenAI {
|
|
|
459
502
|
type UploadCompleteParams as UploadCompleteParams,
|
|
460
503
|
};
|
|
461
504
|
|
|
505
|
+
export { Responses as Responses };
|
|
506
|
+
|
|
507
|
+
export type ChatModel = API.ChatModel;
|
|
508
|
+
export type ComparisonFilter = API.ComparisonFilter;
|
|
509
|
+
export type CompoundFilter = API.CompoundFilter;
|
|
462
510
|
export type ErrorObject = API.ErrorObject;
|
|
463
511
|
export type FunctionDefinition = API.FunctionDefinition;
|
|
464
512
|
export type FunctionParameters = API.FunctionParameters;
|
|
465
513
|
export type Metadata = API.Metadata;
|
|
514
|
+
export type Reasoning = API.Reasoning;
|
|
515
|
+
export type ReasoningEffort = API.ReasoningEffort;
|
|
466
516
|
export type ResponseFormatJSONObject = API.ResponseFormatJSONObject;
|
|
467
517
|
export type ResponseFormatJSONSchema = API.ResponseFormatJSONSchema;
|
|
468
518
|
export type ResponseFormatText = API.ResponseFormatText;
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { OpenAIError } from '../error';
|
|
2
|
+
import type { ChatCompletionTool } from '../resources/chat/completions';
|
|
3
|
+
import {
|
|
4
|
+
type FunctionTool,
|
|
5
|
+
type ParsedContent,
|
|
6
|
+
type ParsedResponse,
|
|
7
|
+
type ParsedResponseFunctionToolCall,
|
|
8
|
+
type ParsedResponseOutputItem,
|
|
9
|
+
type Response,
|
|
10
|
+
type ResponseCreateParamsBase,
|
|
11
|
+
type ResponseCreateParamsNonStreaming,
|
|
12
|
+
type ResponseFunctionToolCall,
|
|
13
|
+
type Tool,
|
|
14
|
+
} from '../resources/responses/responses';
|
|
15
|
+
import { type AutoParseableTextFormat, isAutoParsableResponseFormat } from '../lib/parser';
|
|
16
|
+
|
|
17
|
+
type ParseableToolsParams = Array<Tool> | ChatCompletionTool | null;
|
|
18
|
+
|
|
19
|
+
export type ResponseCreateParamsWithTools = ResponseCreateParamsBase & {
|
|
20
|
+
tools?: ParseableToolsParams;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type ExtractParsedContentFromParams<Params extends ResponseCreateParamsWithTools> =
|
|
24
|
+
NonNullable<Params['text']>['format'] extends AutoParseableTextFormat<infer P> ? P : null;
|
|
25
|
+
|
|
26
|
+
export function maybeParseResponse<
|
|
27
|
+
Params extends ResponseCreateParamsBase | null,
|
|
28
|
+
ParsedT = Params extends null ? null : ExtractParsedContentFromParams<NonNullable<Params>>,
|
|
29
|
+
>(response: Response, params: Params): ParsedResponse<ParsedT> {
|
|
30
|
+
if (!params || !hasAutoParseableInput(params)) {
|
|
31
|
+
return {
|
|
32
|
+
...response,
|
|
33
|
+
output_parsed: null,
|
|
34
|
+
output: response.output.map((item) => {
|
|
35
|
+
if (item.type === 'function_call') {
|
|
36
|
+
return {
|
|
37
|
+
...item,
|
|
38
|
+
parsed_arguments: null,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (item.type === 'message') {
|
|
43
|
+
return {
|
|
44
|
+
...item,
|
|
45
|
+
content: item.content.map((content) => ({
|
|
46
|
+
...content,
|
|
47
|
+
parsed: null,
|
|
48
|
+
})),
|
|
49
|
+
};
|
|
50
|
+
} else {
|
|
51
|
+
return item;
|
|
52
|
+
}
|
|
53
|
+
}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return parseResponse(response, params);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function parseResponse<
|
|
61
|
+
Params extends ResponseCreateParamsBase,
|
|
62
|
+
ParsedT = ExtractParsedContentFromParams<Params>,
|
|
63
|
+
>(response: Response, params: Params): ParsedResponse<ParsedT> {
|
|
64
|
+
const output: Array<ParsedResponseOutputItem<ParsedT>> = response.output.map(
|
|
65
|
+
(item): ParsedResponseOutputItem<ParsedT> => {
|
|
66
|
+
if (item.type === 'function_call') {
|
|
67
|
+
return {
|
|
68
|
+
...item,
|
|
69
|
+
parsed_arguments: parseToolCall(params, item),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (item.type === 'message') {
|
|
73
|
+
const content: Array<ParsedContent<ParsedT>> = item.content.map((content) => {
|
|
74
|
+
if (content.type === 'output_text') {
|
|
75
|
+
return {
|
|
76
|
+
...content,
|
|
77
|
+
parsed: parseTextFormat(params, content.text),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return content;
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
...item,
|
|
86
|
+
content,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return item;
|
|
91
|
+
},
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const parsed: Omit<ParsedResponse<ParsedT>, 'output_parsed'> = Object.assign({}, response, { output });
|
|
95
|
+
if (!Object.getOwnPropertyDescriptor(response, 'output_text')) {
|
|
96
|
+
addOutputText(parsed);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
Object.defineProperty(parsed, 'output_parsed', {
|
|
100
|
+
enumerable: true,
|
|
101
|
+
get() {
|
|
102
|
+
for (const output of parsed.output) {
|
|
103
|
+
if (output.type !== 'message') {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
for (const content of output.content) {
|
|
108
|
+
if (content.type === 'output_text' && content.parsed !== null) {
|
|
109
|
+
return content.parsed;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return null;
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
return parsed as ParsedResponse<ParsedT>;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function parseTextFormat<
|
|
122
|
+
Params extends ResponseCreateParamsBase,
|
|
123
|
+
ParsedT = ExtractParsedContentFromParams<Params>,
|
|
124
|
+
>(params: Params, content: string): ParsedT | null {
|
|
125
|
+
if (params.text?.format?.type !== 'json_schema') {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if ('$parseRaw' in params.text?.format) {
|
|
130
|
+
const text_format = params.text?.format as unknown as AutoParseableTextFormat<ParsedT>;
|
|
131
|
+
return text_format.$parseRaw(content);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return JSON.parse(content);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function hasAutoParseableInput(params: ResponseCreateParamsWithTools): boolean {
|
|
138
|
+
if (isAutoParsableResponseFormat(params.text?.format)) {
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
type ToolOptions = {
|
|
146
|
+
name: string;
|
|
147
|
+
arguments: any;
|
|
148
|
+
function?: ((args: any) => any) | undefined;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export type AutoParseableResponseTool<
|
|
152
|
+
OptionsT extends ToolOptions,
|
|
153
|
+
HasFunction = OptionsT['function'] extends Function ? true : false,
|
|
154
|
+
> = FunctionTool & {
|
|
155
|
+
__arguments: OptionsT['arguments']; // type-level only
|
|
156
|
+
__name: OptionsT['name']; // type-level only
|
|
157
|
+
|
|
158
|
+
$brand: 'auto-parseable-tool';
|
|
159
|
+
$callback: ((args: OptionsT['arguments']) => any) | undefined;
|
|
160
|
+
$parseRaw(args: string): OptionsT['arguments'];
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export function makeParseableResponseTool<OptionsT extends ToolOptions>(
|
|
164
|
+
tool: FunctionTool,
|
|
165
|
+
{
|
|
166
|
+
parser,
|
|
167
|
+
callback,
|
|
168
|
+
}: {
|
|
169
|
+
parser: (content: string) => OptionsT['arguments'];
|
|
170
|
+
callback: ((args: any) => any) | undefined;
|
|
171
|
+
},
|
|
172
|
+
): AutoParseableResponseTool<OptionsT['arguments']> {
|
|
173
|
+
const obj = { ...tool };
|
|
174
|
+
|
|
175
|
+
Object.defineProperties(obj, {
|
|
176
|
+
$brand: {
|
|
177
|
+
value: 'auto-parseable-tool',
|
|
178
|
+
enumerable: false,
|
|
179
|
+
},
|
|
180
|
+
$parseRaw: {
|
|
181
|
+
value: parser,
|
|
182
|
+
enumerable: false,
|
|
183
|
+
},
|
|
184
|
+
$callback: {
|
|
185
|
+
value: callback,
|
|
186
|
+
enumerable: false,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
return obj as AutoParseableResponseTool<OptionsT['arguments']>;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function isAutoParsableTool(tool: any): tool is AutoParseableResponseTool<any> {
|
|
194
|
+
return tool?.['$brand'] === 'auto-parseable-tool';
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function getInputToolByName(input_tools: Array<Tool>, name: string): FunctionTool | undefined {
|
|
198
|
+
return input_tools.find((tool) => tool.type === 'function' && tool.name === name) as
|
|
199
|
+
| FunctionTool
|
|
200
|
+
| undefined;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function parseToolCall<Params extends ResponseCreateParamsBase>(
|
|
204
|
+
params: Params,
|
|
205
|
+
toolCall: ResponseFunctionToolCall,
|
|
206
|
+
): ParsedResponseFunctionToolCall {
|
|
207
|
+
const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
...toolCall,
|
|
211
|
+
...toolCall,
|
|
212
|
+
parsed_arguments:
|
|
213
|
+
isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCall.arguments)
|
|
214
|
+
: inputTool?.strict ? JSON.parse(toolCall.arguments)
|
|
215
|
+
: null,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export function shouldParseToolCall(
|
|
220
|
+
params: ResponseCreateParamsNonStreaming | null | undefined,
|
|
221
|
+
toolCall: ResponseFunctionToolCall,
|
|
222
|
+
): boolean {
|
|
223
|
+
if (!params) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);
|
|
228
|
+
return isAutoParsableTool(inputTool) || inputTool?.strict || false;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export function validateInputTools(tools: ChatCompletionTool[] | undefined) {
|
|
232
|
+
for (const tool of tools ?? []) {
|
|
233
|
+
if (tool.type !== 'function') {
|
|
234
|
+
throw new OpenAIError(
|
|
235
|
+
`Currently only \`function\` tool types support auto-parsing; Received \`${tool.type}\``,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (tool.function.strict !== true) {
|
|
240
|
+
throw new OpenAIError(
|
|
241
|
+
`The \`${tool.function.name}\` tool is not marked with \`strict: true\`. Only strict function tools can be auto-parsed`,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function addOutputText(rsp: Response): void {
|
|
248
|
+
const texts: string[] = [];
|
|
249
|
+
for (const output of rsp.output) {
|
|
250
|
+
if (output.type !== 'message') {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
for (const content of output.content) {
|
|
255
|
+
if (content.type === 'output_text') {
|
|
256
|
+
texts.push(content.text);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
rsp.output_text = texts.join('');
|
|
262
|
+
}
|
package/src/lib/parser.ts
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
} from '../resources/beta/chat/completions';
|
|
15
15
|
import { ResponseFormatJSONSchema } from '../resources/shared';
|
|
16
16
|
import { ContentFilterFinishReasonError, LengthFinishReasonError, OpenAIError } from '../error';
|
|
17
|
+
import { type ResponseFormatTextJSONSchemaConfig } from '../resources/responses/responses';
|
|
17
18
|
|
|
18
19
|
type AnyChatCompletionCreateParams =
|
|
19
20
|
| ChatCompletionCreateParams
|
|
@@ -51,6 +52,33 @@ export function makeParseableResponseFormat<ParsedT>(
|
|
|
51
52
|
return obj as AutoParseableResponseFormat<ParsedT>;
|
|
52
53
|
}
|
|
53
54
|
|
|
55
|
+
export type AutoParseableTextFormat<ParsedT> = ResponseFormatTextJSONSchemaConfig & {
|
|
56
|
+
__output: ParsedT; // type-level only
|
|
57
|
+
|
|
58
|
+
$brand: 'auto-parseable-response-format';
|
|
59
|
+
$parseRaw(content: string): ParsedT;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export function makeParseableTextFormat<ParsedT>(
|
|
63
|
+
response_format: ResponseFormatTextJSONSchemaConfig,
|
|
64
|
+
parser: (content: string) => ParsedT,
|
|
65
|
+
): AutoParseableTextFormat<ParsedT> {
|
|
66
|
+
const obj = { ...response_format };
|
|
67
|
+
|
|
68
|
+
Object.defineProperties(obj, {
|
|
69
|
+
$brand: {
|
|
70
|
+
value: 'auto-parseable-response-format',
|
|
71
|
+
enumerable: false,
|
|
72
|
+
},
|
|
73
|
+
$parseRaw: {
|
|
74
|
+
value: parser,
|
|
75
|
+
enumerable: false,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return obj as AutoParseableTextFormat<ParsedT>;
|
|
80
|
+
}
|
|
81
|
+
|
|
54
82
|
export function isAutoParsableResponseFormat<ParsedT>(
|
|
55
83
|
response_format: any,
|
|
56
84
|
): response_format is AutoParseableResponseFormat<ParsedT> {
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ResponseAudioDeltaEvent,
|
|
3
|
+
ResponseAudioDoneEvent,
|
|
4
|
+
ResponseAudioTranscriptDeltaEvent,
|
|
5
|
+
ResponseAudioTranscriptDoneEvent,
|
|
6
|
+
ResponseCodeInterpreterCallCodeDeltaEvent,
|
|
7
|
+
ResponseCodeInterpreterCallCodeDoneEvent,
|
|
8
|
+
ResponseCodeInterpreterCallCompletedEvent,
|
|
9
|
+
ResponseCodeInterpreterCallInProgressEvent,
|
|
10
|
+
ResponseCodeInterpreterCallInterpretingEvent,
|
|
11
|
+
ResponseCompletedEvent,
|
|
12
|
+
ResponseContentPartAddedEvent,
|
|
13
|
+
ResponseContentPartDoneEvent,
|
|
14
|
+
ResponseCreatedEvent,
|
|
15
|
+
ResponseErrorEvent,
|
|
16
|
+
ResponseFailedEvent,
|
|
17
|
+
ResponseFileSearchCallCompletedEvent,
|
|
18
|
+
ResponseFileSearchCallInProgressEvent,
|
|
19
|
+
ResponseFileSearchCallSearchingEvent,
|
|
20
|
+
ResponseFunctionCallArgumentsDeltaEvent as RawResponseFunctionCallArgumentsDeltaEvent,
|
|
21
|
+
ResponseFunctionCallArgumentsDoneEvent,
|
|
22
|
+
ResponseInProgressEvent,
|
|
23
|
+
ResponseOutputItemAddedEvent,
|
|
24
|
+
ResponseOutputItemDoneEvent,
|
|
25
|
+
ResponseRefusalDeltaEvent,
|
|
26
|
+
ResponseRefusalDoneEvent,
|
|
27
|
+
ResponseTextAnnotationDeltaEvent,
|
|
28
|
+
ResponseTextDeltaEvent as RawResponseTextDeltaEvent,
|
|
29
|
+
ResponseTextDoneEvent,
|
|
30
|
+
ResponseIncompleteEvent,
|
|
31
|
+
ResponseWebSearchCallCompletedEvent,
|
|
32
|
+
ResponseWebSearchCallInProgressEvent,
|
|
33
|
+
ResponseWebSearchCallSearchingEvent,
|
|
34
|
+
} from '../../resources/responses/responses';
|
|
35
|
+
|
|
36
|
+
export type ResponseFunctionCallArgumentsDeltaEvent = RawResponseFunctionCallArgumentsDeltaEvent & {
|
|
37
|
+
snapshot: string;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type ResponseTextDeltaEvent = RawResponseTextDeltaEvent & {
|
|
41
|
+
snapshot: string;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export type ParsedResponseStreamEvent =
|
|
45
|
+
| ResponseAudioDeltaEvent
|
|
46
|
+
| ResponseAudioDoneEvent
|
|
47
|
+
| ResponseAudioTranscriptDeltaEvent
|
|
48
|
+
| ResponseAudioTranscriptDoneEvent
|
|
49
|
+
| ResponseCodeInterpreterCallCodeDeltaEvent
|
|
50
|
+
| ResponseCodeInterpreterCallCodeDoneEvent
|
|
51
|
+
| ResponseCodeInterpreterCallCompletedEvent
|
|
52
|
+
| ResponseCodeInterpreterCallInProgressEvent
|
|
53
|
+
| ResponseCodeInterpreterCallInterpretingEvent
|
|
54
|
+
| ResponseCompletedEvent
|
|
55
|
+
| ResponseContentPartAddedEvent
|
|
56
|
+
| ResponseContentPartDoneEvent
|
|
57
|
+
| ResponseCreatedEvent
|
|
58
|
+
| ResponseErrorEvent
|
|
59
|
+
| ResponseFileSearchCallCompletedEvent
|
|
60
|
+
| ResponseFileSearchCallInProgressEvent
|
|
61
|
+
| ResponseFileSearchCallSearchingEvent
|
|
62
|
+
| ResponseFunctionCallArgumentsDeltaEvent
|
|
63
|
+
| ResponseFunctionCallArgumentsDoneEvent
|
|
64
|
+
| ResponseInProgressEvent
|
|
65
|
+
| ResponseFailedEvent
|
|
66
|
+
| ResponseIncompleteEvent
|
|
67
|
+
| ResponseOutputItemAddedEvent
|
|
68
|
+
| ResponseOutputItemDoneEvent
|
|
69
|
+
| ResponseRefusalDeltaEvent
|
|
70
|
+
| ResponseRefusalDoneEvent
|
|
71
|
+
| ResponseTextAnnotationDeltaEvent
|
|
72
|
+
| ResponseTextDeltaEvent
|
|
73
|
+
| ResponseTextDoneEvent
|
|
74
|
+
| ResponseWebSearchCallCompletedEvent
|
|
75
|
+
| ResponseWebSearchCallInProgressEvent
|
|
76
|
+
| ResponseWebSearchCallSearchingEvent;
|