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