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.
Files changed (198) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +50 -101
  3. package/core.js +2 -1
  4. package/core.js.map +1 -1
  5. package/core.mjs +2 -1
  6. package/core.mjs.map +1 -1
  7. package/helpers/zod.d.ts +14 -1
  8. package/helpers/zod.d.ts.map +1 -1
  9. package/helpers/zod.js +25 -1
  10. package/helpers/zod.js.map +1 -1
  11. package/helpers/zod.mjs +23 -1
  12. package/helpers/zod.mjs.map +1 -1
  13. package/index.d.mts +14 -3
  14. package/index.d.ts +14 -3
  15. package/index.d.ts.map +1 -1
  16. package/index.js +8 -0
  17. package/index.js.map +1 -1
  18. package/index.mjs +8 -0
  19. package/index.mjs.map +1 -1
  20. package/lib/ResponsesParser.d.ts +33 -0
  21. package/lib/ResponsesParser.d.ts.map +1 -0
  22. package/lib/ResponsesParser.js +171 -0
  23. package/lib/ResponsesParser.js.map +1 -0
  24. package/lib/ResponsesParser.mjs +160 -0
  25. package/lib/ResponsesParser.mjs.map +1 -0
  26. package/lib/parser.d.ts +7 -0
  27. package/lib/parser.d.ts.map +1 -1
  28. package/lib/parser.js +16 -1
  29. package/lib/parser.js.map +1 -1
  30. package/lib/parser.mjs +14 -0
  31. package/lib/parser.mjs.map +1 -1
  32. package/lib/responses/EventTypes.d.ts +9 -0
  33. package/lib/responses/EventTypes.d.ts.map +1 -0
  34. package/lib/responses/EventTypes.js +3 -0
  35. package/lib/responses/EventTypes.js.map +1 -0
  36. package/lib/responses/EventTypes.mjs +2 -0
  37. package/lib/responses/EventTypes.mjs.map +1 -0
  38. package/lib/responses/ResponseStream.d.ts +34 -0
  39. package/lib/responses/ResponseStream.d.ts.map +1 -0
  40. package/lib/responses/ResponseStream.js +238 -0
  41. package/lib/responses/ResponseStream.js.map +1 -0
  42. package/lib/responses/ResponseStream.mjs +234 -0
  43. package/lib/responses/ResponseStream.mjs.map +1 -0
  44. package/package.json +1 -1
  45. package/resources/beta/assistants.d.ts +41 -9
  46. package/resources/beta/assistants.d.ts.map +1 -1
  47. package/resources/beta/assistants.js.map +1 -1
  48. package/resources/beta/assistants.mjs.map +1 -1
  49. package/resources/beta/beta.d.ts +0 -4
  50. package/resources/beta/beta.d.ts.map +1 -1
  51. package/resources/beta/beta.js +0 -5
  52. package/resources/beta/beta.js.map +1 -1
  53. package/resources/beta/beta.mjs +0 -5
  54. package/resources/beta/beta.mjs.map +1 -1
  55. package/resources/beta/index.d.ts +0 -1
  56. package/resources/beta/index.d.ts.map +1 -1
  57. package/resources/beta/index.js +1 -4
  58. package/resources/beta/index.js.map +1 -1
  59. package/resources/beta/index.mjs +0 -1
  60. package/resources/beta/index.mjs.map +1 -1
  61. package/resources/beta/threads/runs/runs.d.ts +3 -4
  62. package/resources/beta/threads/runs/runs.d.ts.map +1 -1
  63. package/resources/beta/threads/runs/runs.js.map +1 -1
  64. package/resources/beta/threads/runs/runs.mjs.map +1 -1
  65. package/resources/beta/threads/threads.d.ts +73 -7
  66. package/resources/beta/threads/threads.d.ts.map +1 -1
  67. package/resources/beta/threads/threads.js.map +1 -1
  68. package/resources/beta/threads/threads.mjs.map +1 -1
  69. package/resources/chat/chat.d.ts +3 -2
  70. package/resources/chat/chat.d.ts.map +1 -1
  71. package/resources/chat/chat.js.map +1 -1
  72. package/resources/chat/chat.mjs.map +1 -1
  73. package/resources/chat/completions/completions.d.ts +200 -64
  74. package/resources/chat/completions/completions.d.ts.map +1 -1
  75. package/resources/chat/completions/completions.js +3 -3
  76. package/resources/chat/completions/completions.js.map +1 -1
  77. package/resources/chat/completions/completions.mjs +3 -3
  78. package/resources/chat/completions/completions.mjs.map +1 -1
  79. package/resources/chat/completions/index.d.ts +1 -1
  80. package/resources/chat/completions/index.d.ts.map +1 -1
  81. package/resources/chat/completions/index.js.map +1 -1
  82. package/resources/chat/completions/index.mjs.map +1 -1
  83. package/resources/chat/completions/messages.d.ts +1 -1
  84. package/resources/chat/index.d.ts +2 -2
  85. package/resources/chat/index.d.ts.map +1 -1
  86. package/resources/chat/index.js.map +1 -1
  87. package/resources/chat/index.mjs.map +1 -1
  88. package/resources/files.d.ts +9 -17
  89. package/resources/files.d.ts.map +1 -1
  90. package/resources/files.js.map +1 -1
  91. package/resources/files.mjs.map +1 -1
  92. package/resources/index.d.ts +2 -0
  93. package/resources/index.d.ts.map +1 -1
  94. package/resources/index.js +7 -1
  95. package/resources/index.js.map +1 -1
  96. package/resources/index.mjs +2 -0
  97. package/resources/index.mjs.map +1 -1
  98. package/resources/responses/index.d.ts +3 -0
  99. package/resources/responses/index.d.ts.map +1 -0
  100. package/resources/responses/index.js +10 -0
  101. package/resources/responses/index.js.map +1 -0
  102. package/resources/responses/index.mjs +4 -0
  103. package/resources/responses/index.mjs.map +1 -0
  104. package/resources/responses/input-items.d.ts +169 -0
  105. package/resources/responses/input-items.d.ts.map +1 -0
  106. package/resources/responses/input-items.js +24 -0
  107. package/resources/responses/input-items.js.map +1 -0
  108. package/resources/responses/input-items.mjs +19 -0
  109. package/resources/responses/input-items.mjs.map +1 -0
  110. package/resources/responses/responses.d.ts +2230 -0
  111. package/resources/responses/responses.d.ts.map +1 -0
  112. package/resources/responses/responses.js +77 -0
  113. package/resources/responses/responses.js.map +1 -0
  114. package/resources/responses/responses.mjs +50 -0
  115. package/resources/responses/responses.mjs.map +1 -0
  116. package/resources/shared.d.ts +99 -4
  117. package/resources/shared.d.ts.map +1 -1
  118. package/resources/uploads/uploads.d.ts +3 -4
  119. package/resources/uploads/uploads.d.ts.map +1 -1
  120. package/resources/uploads/uploads.js +3 -4
  121. package/resources/uploads/uploads.js.map +1 -1
  122. package/resources/uploads/uploads.mjs +3 -4
  123. package/resources/uploads/uploads.mjs.map +1 -1
  124. package/resources/{beta/vector-stores → vector-stores}/file-batches.d.ts +12 -4
  125. package/resources/vector-stores/file-batches.d.ts.map +1 -0
  126. package/resources/{beta/vector-stores → vector-stores}/file-batches.js +4 -4
  127. package/resources/vector-stores/file-batches.js.map +1 -0
  128. package/resources/{beta/vector-stores → vector-stores}/file-batches.mjs +4 -4
  129. package/resources/vector-stores/file-batches.mjs.map +1 -0
  130. package/resources/{beta/vector-stores → vector-stores}/files.d.ts +54 -5
  131. package/resources/vector-stores/files.d.ts.map +1 -0
  132. package/resources/{beta/vector-stores → vector-stores}/files.js +27 -4
  133. package/resources/vector-stores/files.js.map +1 -0
  134. package/resources/{beta/vector-stores → vector-stores}/files.mjs +25 -3
  135. package/resources/vector-stores/files.mjs.map +1 -0
  136. package/resources/vector-stores/index.d.ts +4 -0
  137. package/resources/vector-stores/index.d.ts.map +1 -0
  138. package/resources/{beta/vector-stores → vector-stores}/index.js +3 -1
  139. package/resources/vector-stores/index.js.map +1 -0
  140. package/resources/vector-stores/index.mjs +5 -0
  141. package/resources/vector-stores/index.mjs.map +1 -0
  142. package/resources/{beta/vector-stores → vector-stores}/vector-stores.d.ts +90 -7
  143. package/resources/vector-stores/vector-stores.d.ts.map +1 -0
  144. package/resources/{beta/vector-stores → vector-stores}/vector-stores.js +24 -4
  145. package/resources/vector-stores/vector-stores.js.map +1 -0
  146. package/resources/{beta/vector-stores → vector-stores}/vector-stores.mjs +23 -4
  147. package/resources/vector-stores/vector-stores.mjs.map +1 -0
  148. package/src/core.ts +2 -2
  149. package/src/helpers/zod.ts +46 -0
  150. package/src/index.ts +54 -4
  151. package/src/lib/ResponsesParser.ts +262 -0
  152. package/src/lib/parser.ts +28 -0
  153. package/src/lib/responses/EventTypes.ts +76 -0
  154. package/src/lib/responses/ResponseStream.ts +298 -0
  155. package/src/resources/beta/assistants.ts +46 -9
  156. package/src/resources/beta/beta.ts +0 -37
  157. package/src/resources/beta/index.ts +0 -16
  158. package/src/resources/beta/threads/runs/runs.ts +3 -4
  159. package/src/resources/beta/threads/threads.ts +83 -7
  160. package/src/resources/chat/chat.ts +3 -43
  161. package/src/resources/chat/completions/completions.ts +224 -66
  162. package/src/resources/chat/completions/index.ts +0 -1
  163. package/src/resources/chat/completions/messages.ts +1 -1
  164. package/src/resources/chat/index.ts +1 -2
  165. package/src/resources/files.ts +9 -17
  166. package/src/resources/index.ts +20 -0
  167. package/src/resources/responses/index.ts +9 -0
  168. package/src/resources/responses/input-items.ts +276 -0
  169. package/src/resources/responses/responses.ts +2761 -0
  170. package/src/resources/shared.ts +152 -4
  171. package/src/resources/uploads/uploads.ts +3 -4
  172. package/src/resources/{beta/vector-stores → vector-stores}/file-batches.ts +16 -7
  173. package/src/resources/{beta/vector-stores → vector-stores}/files.ts +85 -4
  174. package/src/resources/{beta/vector-stores → vector-stores}/index.ts +6 -0
  175. package/src/resources/{beta/vector-stores → vector-stores}/vector-stores.ts +125 -5
  176. package/src/streaming.ts +1 -1
  177. package/src/version.ts +1 -1
  178. package/streaming.js +1 -1
  179. package/streaming.js.map +1 -1
  180. package/streaming.mjs +1 -1
  181. package/streaming.mjs.map +1 -1
  182. package/version.d.ts +1 -1
  183. package/version.js +1 -1
  184. package/version.mjs +1 -1
  185. package/resources/beta/vector-stores/file-batches.d.ts.map +0 -1
  186. package/resources/beta/vector-stores/file-batches.js.map +0 -1
  187. package/resources/beta/vector-stores/file-batches.mjs.map +0 -1
  188. package/resources/beta/vector-stores/files.d.ts.map +0 -1
  189. package/resources/beta/vector-stores/files.js.map +0 -1
  190. package/resources/beta/vector-stores/files.mjs.map +0 -1
  191. package/resources/beta/vector-stores/index.d.ts +0 -4
  192. package/resources/beta/vector-stores/index.d.ts.map +0 -1
  193. package/resources/beta/vector-stores/index.js.map +0 -1
  194. package/resources/beta/vector-stores/index.mjs +0 -5
  195. package/resources/beta/vector-stores/index.mjs.map +0 -1
  196. package/resources/beta/vector-stores/vector-stores.d.ts.map +0 -1
  197. package/resources/beta/vector-stores/vector-stores.js.map +0 -1
  198. 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, ChatModel } from './resources/chat/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;