From e9734764625275c50ef612ff934804be8cb2adff Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 18:37:18 +0000 Subject: [PATCH 1/2] feat(api): add container endpoint --- .stats.yml | 8 +- api.md | 37 +++ src/index.ts | 22 ++ src/resources/containers.ts | 3 + src/resources/containers/containers.ts | 291 ++++++++++++++++++ src/resources/containers/files.ts | 3 + src/resources/containers/files/content.ts | 16 + src/resources/containers/files/files.ts | 222 +++++++++++++ src/resources/containers/files/index.ts | 12 + src/resources/containers/index.ts | 20 ++ src/resources/index.ts | 9 + src/resources/responses/responses.ts | 269 +++++++++++++++- .../containers/containers.test.ts | 94 ++++++ .../containers/files/content.test.ts | 31 ++ .../containers/files/files.test.ts | 87 ++++++ .../api-resources/responses/responses.test.ts | 18 ++ 16 files changed, 1134 insertions(+), 8 deletions(-) create mode 100644 src/resources/containers.ts create mode 100644 src/resources/containers/containers.ts create mode 100644 src/resources/containers/files.ts create mode 100644 src/resources/containers/files/content.ts create mode 100644 src/resources/containers/files/files.ts create mode 100644 src/resources/containers/files/index.ts create mode 100644 src/resources/containers/index.ts create mode 100644 tests/api-resources/containers/containers.test.ts create mode 100644 tests/api-resources/containers/files/content.test.ts create mode 100644 tests/api-resources/containers/files/files.test.ts diff --git a/.stats.yml b/.stats.yml index 4b4f19c91..41319e5e5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 101 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-a5651cb97f86d1e2531af6aef8c5230f1ea350560fbae790ca2e481b30a6c217.yml -openapi_spec_hash: 66a5104fd3bb43383cf919225df7a6fd -config_hash: bb657c3fed232a56930035de3aaed936 +configured_endpoints: 111 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-6af14840a810139bf407013167ce1c8fb21b6ef8eb0cc3db58b51af7d52c4b5a.yml +openapi_spec_hash: 3241bde6b273cfec0035e522bd07985d +config_hash: 7367b68a4e7db36885c1a886f57b17f6 diff --git a/api.md b/api.md index f7fb47e3e..4e8187d0f 100644 --- a/api.md +++ b/api.md @@ -711,6 +711,7 @@ Methods: - client.responses.create({ ...params }) -> Response - client.responses.retrieve(responseId, { ...params }) -> Response - client.responses.del(responseId) -> void +- client.responses.cancel(responseId) -> void ## InputItems @@ -774,3 +775,39 @@ Methods: - client.evals.runs.outputItems.retrieve(evalId, runId, outputItemId) -> OutputItemRetrieveResponse - client.evals.runs.outputItems.list(evalId, runId, { ...params }) -> OutputItemListResponsesPage + +# Containers + +Types: + +- ContainerCreateResponse +- ContainerRetrieveResponse +- ContainerListResponse + +Methods: + +- client.containers.create({ ...params }) -> ContainerCreateResponse +- client.containers.retrieve(containerId) -> ContainerRetrieveResponse +- client.containers.list({ ...params }) -> ContainerListResponsesPage +- client.containers.del(containerId) -> void + +## Files + +Types: + +- FileCreateResponse +- FileRetrieveResponse +- FileListResponse + +Methods: + +- client.containers.files.create(containerId, { ...params }) -> FileCreateResponse +- client.containers.files.retrieve(containerId, fileId) -> FileRetrieveResponse +- client.containers.files.list(containerId, { ...params }) -> FileListResponsesPage +- client.containers.files.del(containerId, fileId) -> void + +### Content + +Methods: + +- client.containers.files.content.retrieve(containerId, fileId) -> void diff --git a/src/index.ts b/src/index.ts index 537c18f43..3b4b9a574 100644 --- a/src/index.ts +++ b/src/index.ts @@ -66,6 +66,15 @@ import { import { Audio, AudioModel, AudioResponseFormat } from './resources/audio/audio'; import { Beta } from './resources/beta/beta'; import { Chat } from './resources/chat/chat'; +import { + ContainerCreateParams, + ContainerCreateResponse, + ContainerListParams, + ContainerListResponse, + ContainerListResponsesPage, + ContainerRetrieveResponse, + Containers, +} from './resources/containers/containers'; import { EvalCreateParams, EvalCreateResponse, @@ -310,6 +319,7 @@ export class OpenAI extends Core.APIClient { uploads: API.Uploads = new API.Uploads(this); responses: API.Responses = new API.Responses(this); evals: API.Evals = new API.Evals(this); + containers: API.Containers = new API.Containers(this); protected override defaultQuery(): Core.DefaultQuery | undefined { return this._options.defaultQuery; @@ -376,6 +386,8 @@ OpenAI.Uploads = UploadsAPIUploads; OpenAI.Responses = Responses; OpenAI.Evals = Evals; OpenAI.EvalListResponsesPage = EvalListResponsesPage; +OpenAI.Containers = Containers; +OpenAI.ContainerListResponsesPage = ContainerListResponsesPage; export declare namespace OpenAI { export type RequestOptions = Core.RequestOptions; @@ -545,6 +557,16 @@ export declare namespace OpenAI { type EvalListParams as EvalListParams, }; + export { + Containers as Containers, + type ContainerCreateResponse as ContainerCreateResponse, + type ContainerRetrieveResponse as ContainerRetrieveResponse, + type ContainerListResponse as ContainerListResponse, + ContainerListResponsesPage as ContainerListResponsesPage, + type ContainerCreateParams as ContainerCreateParams, + type ContainerListParams as ContainerListParams, + }; + export type AllModels = API.AllModels; export type ChatModel = API.ChatModel; export type ComparisonFilter = API.ComparisonFilter; diff --git a/src/resources/containers.ts b/src/resources/containers.ts new file mode 100644 index 000000000..c8f3a6456 --- /dev/null +++ b/src/resources/containers.ts @@ -0,0 +1,3 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export * from './containers/index'; diff --git a/src/resources/containers/containers.ts b/src/resources/containers/containers.ts new file mode 100644 index 000000000..66303dc61 --- /dev/null +++ b/src/resources/containers/containers.ts @@ -0,0 +1,291 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../resource'; +import { isRequestOptions } from '../../core'; +import * as Core from '../../core'; +import * as FilesAPI from './files/files'; +import { + FileCreateParams, + FileCreateResponse, + FileListParams, + FileListResponse, + FileListResponsesPage, + FileRetrieveResponse, + Files, +} from './files/files'; +import { CursorPage, type CursorPageParams } from '../../pagination'; + +export class Containers extends APIResource { + files: FilesAPI.Files = new FilesAPI.Files(this._client); + + /** + * Create Container + */ + create( + body: ContainerCreateParams, + options?: Core.RequestOptions, + ): Core.APIPromise { + return this._client.post('/containers', { body, ...options }); + } + + /** + * Retrieve Container + */ + retrieve(containerId: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.get(`/containers/${containerId}`, options); + } + + /** + * List Containers + */ + list( + query?: ContainerListParams, + options?: Core.RequestOptions, + ): Core.PagePromise; + list(options?: Core.RequestOptions): Core.PagePromise; + list( + query: ContainerListParams | Core.RequestOptions = {}, + options?: Core.RequestOptions, + ): Core.PagePromise { + if (isRequestOptions(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/containers', ContainerListResponsesPage, { query, ...options }); + } + + /** + * Delete Container + */ + del(containerId: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.delete(`/containers/${containerId}`, { + ...options, + headers: { Accept: '*/*', ...options?.headers }, + }); + } +} + +export class ContainerListResponsesPage extends CursorPage {} + +export interface ContainerCreateResponse { + /** + * Unique identifier for the container. + */ + id: string; + + /** + * Unix timestamp (in seconds) when the container was created. + */ + created_at: number; + + /** + * Name of the container. + */ + name: string; + + /** + * The type of this object. + */ + object: string; + + /** + * Status of the container (e.g., active, deleted). + */ + status: string; + + /** + * The container will expire after this time period. The anchor is the reference + * point for the expiration. The minutes is the number of minutes after the anchor + * before the container expires. + */ + expires_after?: ContainerCreateResponse.ExpiresAfter; +} + +export namespace ContainerCreateResponse { + /** + * The container will expire after this time period. The anchor is the reference + * point for the expiration. The minutes is the number of minutes after the anchor + * before the container expires. + */ + export interface ExpiresAfter { + /** + * The reference point for the expiration. + */ + anchor?: 'last_active_at'; + + /** + * The number of minutes after the anchor before the container expires. + */ + minutes?: number; + } +} + +export interface ContainerRetrieveResponse { + /** + * Unique identifier for the container. + */ + id: string; + + /** + * Unix timestamp (in seconds) when the container was created. + */ + created_at: number; + + /** + * Name of the container. + */ + name: string; + + /** + * The type of this object. + */ + object: string; + + /** + * Status of the container (e.g., active, deleted). + */ + status: string; + + /** + * The container will expire after this time period. The anchor is the reference + * point for the expiration. The minutes is the number of minutes after the anchor + * before the container expires. + */ + expires_after?: ContainerRetrieveResponse.ExpiresAfter; +} + +export namespace ContainerRetrieveResponse { + /** + * The container will expire after this time period. The anchor is the reference + * point for the expiration. The minutes is the number of minutes after the anchor + * before the container expires. + */ + export interface ExpiresAfter { + /** + * The reference point for the expiration. + */ + anchor?: 'last_active_at'; + + /** + * The number of minutes after the anchor before the container expires. + */ + minutes?: number; + } +} + +export interface ContainerListResponse { + /** + * Unique identifier for the container. + */ + id: string; + + /** + * Unix timestamp (in seconds) when the container was created. + */ + created_at: number; + + /** + * Name of the container. + */ + name: string; + + /** + * The type of this object. + */ + object: string; + + /** + * Status of the container (e.g., active, deleted). + */ + status: string; + + /** + * The container will expire after this time period. The anchor is the reference + * point for the expiration. The minutes is the number of minutes after the anchor + * before the container expires. + */ + expires_after?: ContainerListResponse.ExpiresAfter; +} + +export namespace ContainerListResponse { + /** + * The container will expire after this time period. The anchor is the reference + * point for the expiration. The minutes is the number of minutes after the anchor + * before the container expires. + */ + export interface ExpiresAfter { + /** + * The reference point for the expiration. + */ + anchor?: 'last_active_at'; + + /** + * The number of minutes after the anchor before the container expires. + */ + minutes?: number; + } +} + +export interface ContainerCreateParams { + /** + * Name of the container to create. + */ + name: string; + + /** + * Container expiration time in seconds relative to the 'anchor' time. + */ + expires_after?: ContainerCreateParams.ExpiresAfter; + + /** + * IDs of files to copy to the container. + */ + file_ids?: Array; +} + +export namespace ContainerCreateParams { + /** + * Container expiration time in seconds relative to the 'anchor' time. + */ + export interface ExpiresAfter { + /** + * Time anchor for the expiration time. Currently only 'last_active_at' is + * supported. + */ + anchor: 'last_active_at'; + + minutes: number; + } +} + +export interface ContainerListParams extends CursorPageParams { + /** + * Sort order by the `created_at` timestamp of the objects. `asc` for ascending + * order and `desc` for descending order. + */ + order?: 'asc' | 'desc'; +} + +Containers.ContainerListResponsesPage = ContainerListResponsesPage; +Containers.Files = Files; +Containers.FileListResponsesPage = FileListResponsesPage; + +export declare namespace Containers { + export { + type ContainerCreateResponse as ContainerCreateResponse, + type ContainerRetrieveResponse as ContainerRetrieveResponse, + type ContainerListResponse as ContainerListResponse, + ContainerListResponsesPage as ContainerListResponsesPage, + type ContainerCreateParams as ContainerCreateParams, + type ContainerListParams as ContainerListParams, + }; + + export { + Files as Files, + type FileCreateResponse as FileCreateResponse, + type FileRetrieveResponse as FileRetrieveResponse, + type FileListResponse as FileListResponse, + FileListResponsesPage as FileListResponsesPage, + type FileCreateParams as FileCreateParams, + type FileListParams as FileListParams, + }; +} diff --git a/src/resources/containers/files.ts b/src/resources/containers/files.ts new file mode 100644 index 000000000..46a5299c1 --- /dev/null +++ b/src/resources/containers/files.ts @@ -0,0 +1,3 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export * from './files/index'; diff --git a/src/resources/containers/files/content.ts b/src/resources/containers/files/content.ts new file mode 100644 index 000000000..efb33a87f --- /dev/null +++ b/src/resources/containers/files/content.ts @@ -0,0 +1,16 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../resource'; +import * as Core from '../../../core'; + +export class Content extends APIResource { + /** + * Retrieve Container File Content + */ + retrieve(containerId: string, fileId: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.get(`/containers/${containerId}/files/${fileId}/content`, { + ...options, + headers: { Accept: '*/*', ...options?.headers }, + }); + } +} diff --git a/src/resources/containers/files/files.ts b/src/resources/containers/files/files.ts new file mode 100644 index 000000000..0c249df0f --- /dev/null +++ b/src/resources/containers/files/files.ts @@ -0,0 +1,222 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../../resource'; +import { isRequestOptions } from '../../../core'; +import * as Core from '../../../core'; +import * as ContentAPI from './content'; +import { Content } from './content'; +import { CursorPage, type CursorPageParams } from '../../../pagination'; + +export class Files extends APIResource { + content: ContentAPI.Content = new ContentAPI.Content(this._client); + + /** + * Create a Container File + * + * You can send either a multipart/form-data request with the raw file content, or + * a JSON request with a file ID. + */ + create( + containerId: string, + body: FileCreateParams, + options?: Core.RequestOptions, + ): Core.APIPromise { + return this._client.post(`/containers/${containerId}/files`, { body, ...options }); + } + + /** + * Retrieve Container File + */ + retrieve( + containerId: string, + fileId: string, + options?: Core.RequestOptions, + ): Core.APIPromise { + return this._client.get(`/containers/${containerId}/files/${fileId}`, options); + } + + /** + * List Container files + */ + list( + containerId: string, + query?: FileListParams, + options?: Core.RequestOptions, + ): Core.PagePromise; + list( + containerId: string, + options?: Core.RequestOptions, + ): Core.PagePromise; + list( + containerId: string, + query: FileListParams | Core.RequestOptions = {}, + options?: Core.RequestOptions, + ): Core.PagePromise { + if (isRequestOptions(query)) { + return this.list(containerId, {}, query); + } + return this._client.getAPIList(`/containers/${containerId}/files`, FileListResponsesPage, { + query, + ...options, + }); + } + + /** + * Delete Container File + */ + del(containerId: string, fileId: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.delete(`/containers/${containerId}/files/${fileId}`, { + ...options, + headers: { Accept: '*/*', ...options?.headers }, + }); + } +} + +export class FileListResponsesPage extends CursorPage {} + +export interface FileCreateResponse { + /** + * Unique identifier for the file. + */ + id: string; + + /** + * Size of the file in bytes. + */ + bytes: number; + + /** + * The container this file belongs to. + */ + container_id: string; + + /** + * Unix timestamp (in seconds) when the file was created. + */ + created_at: number; + + /** + * The type of this object (`container.file`). + */ + object: 'container.file'; + + /** + * Path of the file in the container. + */ + path: string; + + /** + * Source of the file (e.g., `user`, `assistant`). + */ + source: string; +} + +export interface FileRetrieveResponse { + /** + * Unique identifier for the file. + */ + id: string; + + /** + * Size of the file in bytes. + */ + bytes: number; + + /** + * The container this file belongs to. + */ + container_id: string; + + /** + * Unix timestamp (in seconds) when the file was created. + */ + created_at: number; + + /** + * The type of this object (`container.file`). + */ + object: 'container.file'; + + /** + * Path of the file in the container. + */ + path: string; + + /** + * Source of the file (e.g., `user`, `assistant`). + */ + source: string; +} + +export interface FileListResponse { + /** + * Unique identifier for the file. + */ + id: string; + + /** + * Size of the file in bytes. + */ + bytes: number; + + /** + * The container this file belongs to. + */ + container_id: string; + + /** + * Unix timestamp (in seconds) when the file was created. + */ + created_at: number; + + /** + * The type of this object (`container.file`). + */ + object: 'container.file'; + + /** + * Path of the file in the container. + */ + path: string; + + /** + * Source of the file (e.g., `user`, `assistant`). + */ + source: string; +} + +export interface FileCreateParams { + /** + * The File object (not file name) to be uploaded. + */ + file?: Core.Uploadable; + + /** + * Name of the file to create. + */ + file_id?: string; +} + +export interface FileListParams extends CursorPageParams { + /** + * Sort order by the `created_at` timestamp of the objects. `asc` for ascending + * order and `desc` for descending order. + */ + order?: 'asc' | 'desc'; +} + +Files.FileListResponsesPage = FileListResponsesPage; +Files.Content = Content; + +export declare namespace Files { + export { + type FileCreateResponse as FileCreateResponse, + type FileRetrieveResponse as FileRetrieveResponse, + type FileListResponse as FileListResponse, + FileListResponsesPage as FileListResponsesPage, + type FileCreateParams as FileCreateParams, + type FileListParams as FileListParams, + }; + + export { Content as Content }; +} diff --git a/src/resources/containers/files/index.ts b/src/resources/containers/files/index.ts new file mode 100644 index 000000000..7305ab706 --- /dev/null +++ b/src/resources/containers/files/index.ts @@ -0,0 +1,12 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export { Content } from './content'; +export { + FileListResponsesPage, + Files, + type FileCreateResponse, + type FileRetrieveResponse, + type FileListResponse, + type FileCreateParams, + type FileListParams, +} from './files'; diff --git a/src/resources/containers/index.ts b/src/resources/containers/index.ts new file mode 100644 index 000000000..91145bbe0 --- /dev/null +++ b/src/resources/containers/index.ts @@ -0,0 +1,20 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +export { + ContainerListResponsesPage, + Containers, + type ContainerCreateResponse, + type ContainerRetrieveResponse, + type ContainerListResponse, + type ContainerCreateParams, + type ContainerListParams, +} from './containers'; +export { + FileListResponsesPage, + Files, + type FileCreateResponse, + type FileRetrieveResponse, + type FileListResponse, + type FileCreateParams, + type FileListParams, +} from './files/index'; diff --git a/src/resources/index.ts b/src/resources/index.ts index 9d827615c..d1f816a84 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -22,6 +22,15 @@ export { type CompletionCreateParamsNonStreaming, type CompletionCreateParamsStreaming, } from './completions'; +export { + ContainerListResponsesPage, + Containers, + type ContainerCreateResponse, + type ContainerRetrieveResponse, + type ContainerListResponse, + type ContainerCreateParams, + type ContainerListParams, +} from './containers/containers'; export { Embeddings, type CreateEmbeddingResponse, diff --git a/src/resources/responses/responses.ts b/src/resources/responses/responses.ts index fdf51f224..40dd9a6fb 100644 --- a/src/resources/responses/responses.ts +++ b/src/resources/responses/responses.ts @@ -158,12 +158,33 @@ export class Responses extends APIResource { /** * Creates a model response stream */ + stream>( body: Params, options?: Core.RequestOptions, ): ResponseStream { return ResponseStream.createResponse(this._client, body, options); } + + /** + * Cancels a model response with the given ID. Only responses created with the + * `background` parameter set to `true` can be cancelled. + * [Learn more](https://platform.openai.com/docs/guides/background). + * + * @example + * ```ts + * await client.responses.cancel( + * 'resp_677efb5139a88190b512bc3fef8e535d', + * ); + * ``` + */ + + cancel(responseId: string, options?: Core.RequestOptions): Core.APIPromise { + return this._client.post(`/responses/${responseId}/cancel`, { + ...options, + headers: { Accept: '*/*', ...options?.headers }, + }); + } } export class ResponseItemsPage extends CursorPage {} @@ -530,6 +551,11 @@ export interface ResponseAudioDeltaEvent { */ delta: string; + /** + * A sequence number for this chunk of the stream response. + */ + sequence_number: number; + /** * The type of the event. Always `response.audio.delta`. */ @@ -540,6 +566,11 @@ export interface ResponseAudioDeltaEvent { * Emitted when the audio response is complete. */ export interface ResponseAudioDoneEvent { + /** + * The sequence number of the delta. + */ + sequence_number: number; + /** * The type of the event. Always `response.audio.done`. */ @@ -555,6 +586,11 @@ export interface ResponseAudioTranscriptDeltaEvent { */ delta: string; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.audio.transcript.delta`. */ @@ -565,6 +601,11 @@ export interface ResponseAudioTranscriptDeltaEvent { * Emitted when the full audio transcript is completed. */ export interface ResponseAudioTranscriptDoneEvent { + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.audio.transcript.done`. */ @@ -585,6 +626,11 @@ export interface ResponseCodeInterpreterCallCodeDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.code_interpreter_call.code.delta`. */ @@ -605,6 +651,11 @@ export interface ResponseCodeInterpreterCallCodeDoneEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.code_interpreter_call.code.done`. */ @@ -625,6 +676,11 @@ export interface ResponseCodeInterpreterCallCompletedEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.code_interpreter_call.completed`. */ @@ -645,6 +701,11 @@ export interface ResponseCodeInterpreterCallInProgressEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.code_interpreter_call.in_progress`. */ @@ -665,6 +726,11 @@ export interface ResponseCodeInterpreterCallInterpretingEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.code_interpreter_call.interpreting`. */ @@ -758,6 +824,11 @@ export interface ResponseCompletedEvent { */ response: Response; + /** + * The sequence number for this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.completed`. */ @@ -1140,6 +1211,11 @@ export interface ResponseContentPartAddedEvent { */ part: ResponseOutputText | ResponseOutputRefusal; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.content_part.added`. */ @@ -1170,6 +1246,11 @@ export interface ResponseContentPartDoneEvent { */ part: ResponseOutputText | ResponseOutputRefusal; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.content_part.done`. */ @@ -1185,6 +1266,11 @@ export interface ResponseCreatedEvent { */ response: Response; + /** + * The sequence number for this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.created`. */ @@ -1243,6 +1329,11 @@ export interface ResponseErrorEvent { */ param: string | null; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `error`. */ @@ -1258,6 +1349,11 @@ export interface ResponseFailedEvent { */ response: Response; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.failed`. */ @@ -1278,6 +1374,11 @@ export interface ResponseFileSearchCallCompletedEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.file_search_call.completed`. */ @@ -1298,6 +1399,11 @@ export interface ResponseFileSearchCallInProgressEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.file_search_call.in_progress`. */ @@ -1318,6 +1424,11 @@ export interface ResponseFileSearchCallSearchingEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.file_search_call.searching`. */ @@ -1468,6 +1579,11 @@ export interface ResponseFunctionCallArgumentsDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.function_call_arguments.delta`. */ @@ -1493,6 +1609,11 @@ export interface ResponseFunctionCallArgumentsDoneEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + type: 'response.function_call_arguments.done'; } @@ -1611,6 +1732,11 @@ export interface ResponseImageGenCallCompletedEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.image_generation_call.completed'. */ @@ -1633,14 +1759,14 @@ export interface ResponseImageGenCallGeneratingEvent { output_index: number; /** - * The type of the event. Always 'response.image_generation_call.generating'. + * The sequence number of the image generation item being processed. */ - type: 'response.image_generation_call.generating'; + sequence_number: number; /** - * The sequence number of the image generation item being processed. + * The type of the event. Always 'response.image_generation_call.generating'. */ - sequence_number?: number; + type: 'response.image_generation_call.generating'; } /** @@ -1713,6 +1839,11 @@ export interface ResponseInProgressEvent { */ response: Response; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.in_progress`. */ @@ -1749,6 +1880,11 @@ export interface ResponseIncompleteEvent { */ response: Response; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.incomplete`. */ @@ -2645,6 +2781,11 @@ export interface ResponseMcpCallArgumentsDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_call.arguments_delta'. */ @@ -2670,6 +2811,11 @@ export interface ResponseMcpCallArgumentsDoneEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_call.arguments_done'. */ @@ -2680,6 +2826,11 @@ export interface ResponseMcpCallArgumentsDoneEvent { * Emitted when an MCP tool call has completed successfully. */ export interface ResponseMcpCallCompletedEvent { + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_call.completed'. */ @@ -2690,6 +2841,11 @@ export interface ResponseMcpCallCompletedEvent { * Emitted when an MCP tool call has failed. */ export interface ResponseMcpCallFailedEvent { + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_call.failed'. */ @@ -2710,6 +2866,11 @@ export interface ResponseMcpCallInProgressEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_call.in_progress'. */ @@ -2720,6 +2881,11 @@ export interface ResponseMcpCallInProgressEvent { * Emitted when the list of available MCP tools has been successfully retrieved. */ export interface ResponseMcpListToolsCompletedEvent { + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_list_tools.completed'. */ @@ -2730,6 +2896,11 @@ export interface ResponseMcpListToolsCompletedEvent { * Emitted when the attempt to list available MCP tools has failed. */ export interface ResponseMcpListToolsFailedEvent { + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_list_tools.failed'. */ @@ -2741,6 +2912,11 @@ export interface ResponseMcpListToolsFailedEvent { * MCP tools. */ export interface ResponseMcpListToolsInProgressEvent { + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.mcp_list_tools.in_progress'. */ @@ -3019,6 +3195,11 @@ export interface ResponseOutputItemAddedEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.output_item.added`. */ @@ -3039,6 +3220,11 @@ export interface ResponseOutputItemDoneEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.output_item.done`. */ @@ -3214,6 +3400,11 @@ export interface ResponseOutputTextAnnotationAddedEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.output_text_annotation.added'. */ @@ -3229,6 +3420,11 @@ export interface ResponseQueuedEvent { */ response: Response; + /** + * The sequence number for this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.queued'. */ @@ -3259,6 +3455,11 @@ export interface ResponseReasoningDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always 'response.reasoning.delta'. */ @@ -3284,6 +3485,11 @@ export interface ResponseReasoningDoneEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The finalized reasoning text. */ @@ -3364,6 +3570,11 @@ export interface ResponseReasoningSummaryDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The index of the summary part within the output item. */ @@ -3389,6 +3600,11 @@ export interface ResponseReasoningSummaryDoneEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The index of the summary part within the output item. */ @@ -3424,6 +3640,11 @@ export interface ResponseReasoningSummaryPartAddedEvent { */ part: ResponseReasoningSummaryPartAddedEvent.Part; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The index of the summary part within the reasoning summary. */ @@ -3471,6 +3692,11 @@ export interface ResponseReasoningSummaryPartDoneEvent { */ part: ResponseReasoningSummaryPartDoneEvent.Part; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The index of the summary part within the reasoning summary. */ @@ -3518,6 +3744,11 @@ export interface ResponseReasoningSummaryTextDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The index of the summary part within the reasoning summary. */ @@ -3543,6 +3774,11 @@ export interface ResponseReasoningSummaryTextDoneEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The index of the summary part within the reasoning summary. */ @@ -3583,6 +3819,11 @@ export interface ResponseRefusalDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.refusal.delta`. */ @@ -3613,6 +3854,11 @@ export interface ResponseRefusalDoneEvent { */ refusal: string; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.refusal.done`. */ @@ -3716,6 +3962,11 @@ export interface ResponseTextAnnotationDeltaEvent { */ output_index: number; + /** + * The sequence number of this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.output_text.annotation.added`. */ @@ -3844,6 +4095,11 @@ export interface ResponseTextDeltaEvent { */ output_index: number; + /** + * The sequence number for this event. + */ + sequence_number: number; + /** * The type of the event. Always `response.output_text.delta`. */ @@ -3869,6 +4125,11 @@ export interface ResponseTextDoneEvent { */ output_index: number; + /** + * The sequence number for this event. + */ + sequence_number: number; + /** * The text content that is finalized. */ diff --git a/tests/api-resources/containers/containers.test.ts b/tests/api-resources/containers/containers.test.ts new file mode 100644 index 000000000..11c6f166c --- /dev/null +++ b/tests/api-resources/containers/containers.test.ts @@ -0,0 +1,94 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import OpenAI from 'openai'; +import { Response } from 'node-fetch'; + +const client = new OpenAI({ + apiKey: 'My API Key', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource containers', () => { + test('create: only required params', async () => { + const responsePromise = client.containers.create({ name: 'name' }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('create: required and optional params', async () => { + const response = await client.containers.create({ + name: 'name', + expires_after: { anchor: 'last_active_at', minutes: 0 }, + file_ids: ['string'], + }); + }); + + test('retrieve', async () => { + const responsePromise = client.containers.retrieve('container_id'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('retrieve: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.containers.retrieve('container_id', { path: '/_stainless_unknown_path' }), + ).rejects.toThrow(OpenAI.NotFoundError); + }); + + test('list', async () => { + const responsePromise = client.containers.list(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('list: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect(client.containers.list({ path: '/_stainless_unknown_path' })).rejects.toThrow( + OpenAI.NotFoundError, + ); + }); + + test('list: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.containers.list( + { after: 'after', limit: 0, order: 'asc' }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(OpenAI.NotFoundError); + }); + + test('del', async () => { + const responsePromise = client.containers.del('container_id'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('del: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect(client.containers.del('container_id', { path: '/_stainless_unknown_path' })).rejects.toThrow( + OpenAI.NotFoundError, + ); + }); +}); diff --git a/tests/api-resources/containers/files/content.test.ts b/tests/api-resources/containers/files/content.test.ts new file mode 100644 index 000000000..9215c001a --- /dev/null +++ b/tests/api-resources/containers/files/content.test.ts @@ -0,0 +1,31 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import OpenAI from 'openai'; +import { Response } from 'node-fetch'; + +const client = new OpenAI({ + apiKey: 'My API Key', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource content', () => { + test('retrieve', async () => { + const responsePromise = client.containers.files.content.retrieve('container_id', 'file_id'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('retrieve: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.containers.files.content.retrieve('container_id', 'file_id', { + path: '/_stainless_unknown_path', + }), + ).rejects.toThrow(OpenAI.NotFoundError); + }); +}); diff --git a/tests/api-resources/containers/files/files.test.ts b/tests/api-resources/containers/files/files.test.ts new file mode 100644 index 000000000..79f47e9ad --- /dev/null +++ b/tests/api-resources/containers/files/files.test.ts @@ -0,0 +1,87 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import OpenAI from 'openai'; +import { Response } from 'node-fetch'; + +const client = new OpenAI({ + apiKey: 'My API Key', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource files', () => { + test('create', async () => { + const responsePromise = client.containers.files.create('container_id', {}); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('retrieve', async () => { + const responsePromise = client.containers.files.retrieve('container_id', 'file_id'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('retrieve: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.containers.files.retrieve('container_id', 'file_id', { path: '/_stainless_unknown_path' }), + ).rejects.toThrow(OpenAI.NotFoundError); + }); + + test('list', async () => { + const responsePromise = client.containers.files.list('container_id'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('list: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.containers.files.list('container_id', { path: '/_stainless_unknown_path' }), + ).rejects.toThrow(OpenAI.NotFoundError); + }); + + test('list: request options and params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.containers.files.list( + 'container_id', + { after: 'after', limit: 0, order: 'asc' }, + { path: '/_stainless_unknown_path' }, + ), + ).rejects.toThrow(OpenAI.NotFoundError); + }); + + test('del', async () => { + const responsePromise = client.containers.files.del('container_id', 'file_id'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('del: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.containers.files.del('container_id', 'file_id', { path: '/_stainless_unknown_path' }), + ).rejects.toThrow(OpenAI.NotFoundError); + }); +}); diff --git a/tests/api-resources/responses/responses.test.ts b/tests/api-resources/responses/responses.test.ts index 1b2cf7fc4..f8e653c52 100644 --- a/tests/api-resources/responses/responses.test.ts +++ b/tests/api-resources/responses/responses.test.ts @@ -101,4 +101,22 @@ describe('resource responses', () => { client.responses.del('resp_677efb5139a88190b512bc3fef8e535d', { path: '/_stainless_unknown_path' }), ).rejects.toThrow(OpenAI.NotFoundError); }); + + test('cancel', async () => { + const responsePromise = client.responses.cancel('resp_677efb5139a88190b512bc3fef8e535d'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + test('cancel: request options instead of params are passed correctly', async () => { + // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error + await expect( + client.responses.cancel('resp_677efb5139a88190b512bc3fef8e535d', { path: '/_stainless_unknown_path' }), + ).rejects.toThrow(OpenAI.NotFoundError); + }); }); From 63839dc3d9af0105cb711345b5e7d105b31a9df3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 18:37:47 +0000 Subject: [PATCH 2/2] release: 4.102.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ jsr.json | 2 +- package.json | 2 +- src/version.ts | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 514215a1e..a39d68281 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "4.101.0" + ".": "4.102.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e427d912..b6254488a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 4.102.0 (2025-05-21) + +Full Changelog: [v4.101.0...v4.102.0](https://github.com/openai/openai-node/compare/v4.101.0...v4.102.0) + +### Features + +* **api:** add container endpoint ([e973476](https://github.com/openai/openai-node/commit/e9734764625275c50ef612ff934804be8cb2adff)) + ## 4.101.0 (2025-05-21) Full Changelog: [v4.100.0...v4.101.0](https://github.com/openai/openai-node/compare/v4.100.0...v4.101.0) diff --git a/jsr.json b/jsr.json index 42bf0a235..a48e4e9ca 100644 --- a/jsr.json +++ b/jsr.json @@ -1,6 +1,6 @@ { "name": "@openai/openai", - "version": "4.101.0", + "version": "4.102.0", "exports": { ".": "./index.ts", "./helpers/zod": "./helpers/zod.ts", diff --git a/package.json b/package.json index e8cd7277c..c1886271b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openai", - "version": "4.101.0", + "version": "4.102.0", "description": "The official TypeScript library for the OpenAI API", "author": "OpenAI ", "types": "dist/index.d.ts", diff --git a/src/version.ts b/src/version.ts index ff06c96c3..180cea6da 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '4.101.0'; // x-release-please-version +export const VERSION = '4.102.0'; // x-release-please-version