From 5d18a8448ecbe31597e98ec7f64d7050c831901e Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 16 Jun 2025 19:05:03 +0000
Subject: [PATCH 1/4] feat(api): manual updates
---
.stats.yml | 2 +-
api.md | 2 +-
.../fine_tuning/checkpoints/permissions.py | 22 ++++++++++---------
.../permission_retrieve_response.py | 17 ++------------
.../checkpoints/test_permissions.py | 18 +++++++--------
5 files changed, 25 insertions(+), 36 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index feda32cffe..7e42b77a27 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 111
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-9e41d2d5471d2c28bff0d616f4476f5b0e6c541ef4cb51bdaaef5fdf5e13c8b2.yml
openapi_spec_hash: 86f765e18d00e32cf2ce9db7ab84d946
-config_hash: fd2af1d5eff0995bb7dc02ac9a34851d
+config_hash: dc5515e257676a27cb1ace1784aa92b3
diff --git a/api.md b/api.md
index 25360d741e..db52398b97 100644
--- a/api.md
+++ b/api.md
@@ -293,7 +293,7 @@ from openai.types.fine_tuning.checkpoints import (
Methods:
- client.fine_tuning.checkpoints.permissions.create(fine_tuned_model_checkpoint, \*\*params) -> SyncPage[PermissionCreateResponse]
-- client.fine_tuning.checkpoints.permissions.retrieve(fine_tuned_model_checkpoint, \*\*params) -> PermissionRetrieveResponse
+- client.fine_tuning.checkpoints.permissions.retrieve(fine_tuned_model_checkpoint, \*\*params) -> SyncCursorPage[PermissionRetrieveResponse]
- client.fine_tuning.checkpoints.permissions.delete(permission_id, \*, fine_tuned_model_checkpoint) -> PermissionDeleteResponse
## Alpha
diff --git a/src/openai/resources/fine_tuning/checkpoints/permissions.py b/src/openai/resources/fine_tuning/checkpoints/permissions.py
index 547e42ecac..ceb747a367 100644
--- a/src/openai/resources/fine_tuning/checkpoints/permissions.py
+++ b/src/openai/resources/fine_tuning/checkpoints/permissions.py
@@ -9,11 +9,11 @@
from .... import _legacy_response
from ...._types import NOT_GIVEN, Body, Query, Headers, NotGiven
-from ...._utils import maybe_transform, async_maybe_transform
+from ...._utils import maybe_transform
from ...._compat import cached_property
from ...._resource import SyncAPIResource, AsyncAPIResource
from ...._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper
-from ....pagination import SyncPage, AsyncPage
+from ....pagination import SyncPage, AsyncPage, SyncCursorPage, AsyncCursorPage
from ...._base_client import AsyncPaginator, make_request_options
from ....types.fine_tuning.checkpoints import permission_create_params, permission_retrieve_params
from ....types.fine_tuning.checkpoints.permission_create_response import PermissionCreateResponse
@@ -101,7 +101,7 @@ def retrieve(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
- ) -> PermissionRetrieveResponse:
+ ) -> SyncCursorPage[PermissionRetrieveResponse]:
"""
**NOTE:** This endpoint requires an [admin API key](../admin-api-keys).
@@ -129,8 +129,9 @@ def retrieve(
raise ValueError(
f"Expected a non-empty value for `fine_tuned_model_checkpoint` but received {fine_tuned_model_checkpoint!r}"
)
- return self._get(
+ return self._get_api_list(
f"/fine_tuning/checkpoints/{fine_tuned_model_checkpoint}/permissions",
+ page=SyncCursorPage[PermissionRetrieveResponse],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -146,7 +147,7 @@ def retrieve(
permission_retrieve_params.PermissionRetrieveParams,
),
),
- cast_to=PermissionRetrieveResponse,
+ model=PermissionRetrieveResponse,
)
def delete(
@@ -255,7 +256,7 @@ def create(
method="post",
)
- async def retrieve(
+ def retrieve(
self,
fine_tuned_model_checkpoint: str,
*,
@@ -269,7 +270,7 @@ async def retrieve(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
- ) -> PermissionRetrieveResponse:
+ ) -> AsyncPaginator[PermissionRetrieveResponse, AsyncCursorPage[PermissionRetrieveResponse]]:
"""
**NOTE:** This endpoint requires an [admin API key](../admin-api-keys).
@@ -297,14 +298,15 @@ async def retrieve(
raise ValueError(
f"Expected a non-empty value for `fine_tuned_model_checkpoint` but received {fine_tuned_model_checkpoint!r}"
)
- return await self._get(
+ return self._get_api_list(
f"/fine_tuning/checkpoints/{fine_tuned_model_checkpoint}/permissions",
+ page=AsyncCursorPage[PermissionRetrieveResponse],
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
- query=await async_maybe_transform(
+ query=maybe_transform(
{
"after": after,
"limit": limit,
@@ -314,7 +316,7 @@ async def retrieve(
permission_retrieve_params.PermissionRetrieveParams,
),
),
- cast_to=PermissionRetrieveResponse,
+ model=PermissionRetrieveResponse,
)
async def delete(
diff --git a/src/openai/types/fine_tuning/checkpoints/permission_retrieve_response.py b/src/openai/types/fine_tuning/checkpoints/permission_retrieve_response.py
index 14c73b55d0..4c540179e7 100644
--- a/src/openai/types/fine_tuning/checkpoints/permission_retrieve_response.py
+++ b/src/openai/types/fine_tuning/checkpoints/permission_retrieve_response.py
@@ -1,14 +1,13 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List, Optional
from typing_extensions import Literal
from ...._models import BaseModel
-__all__ = ["PermissionRetrieveResponse", "Data"]
+__all__ = ["PermissionRetrieveResponse"]
-class Data(BaseModel):
+class PermissionRetrieveResponse(BaseModel):
id: str
"""The permission identifier, which can be referenced in the API endpoints."""
@@ -20,15 +19,3 @@ class Data(BaseModel):
project_id: str
"""The project identifier that the permission is for."""
-
-
-class PermissionRetrieveResponse(BaseModel):
- data: List[Data]
-
- has_more: bool
-
- object: Literal["list"]
-
- first_id: Optional[str] = None
-
- last_id: Optional[str] = None
diff --git a/tests/api_resources/fine_tuning/checkpoints/test_permissions.py b/tests/api_resources/fine_tuning/checkpoints/test_permissions.py
index 6aa0b867d9..4a7608d8df 100644
--- a/tests/api_resources/fine_tuning/checkpoints/test_permissions.py
+++ b/tests/api_resources/fine_tuning/checkpoints/test_permissions.py
@@ -9,7 +9,7 @@
from openai import OpenAI, AsyncOpenAI
from tests.utils import assert_matches_type
-from openai.pagination import SyncPage, AsyncPage
+from openai.pagination import SyncPage, AsyncPage, SyncCursorPage, AsyncCursorPage
from openai.types.fine_tuning.checkpoints import (
PermissionCreateResponse,
PermissionDeleteResponse,
@@ -71,7 +71,7 @@ def test_method_retrieve(self, client: OpenAI) -> None:
permission = client.fine_tuning.checkpoints.permissions.retrieve(
fine_tuned_model_checkpoint="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(SyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
@parametrize
def test_method_retrieve_with_all_params(self, client: OpenAI) -> None:
@@ -82,7 +82,7 @@ def test_method_retrieve_with_all_params(self, client: OpenAI) -> None:
order="ascending",
project_id="project_id",
)
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(SyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
@parametrize
def test_raw_response_retrieve(self, client: OpenAI) -> None:
@@ -93,7 +93,7 @@ def test_raw_response_retrieve(self, client: OpenAI) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
permission = response.parse()
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(SyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
@parametrize
def test_streaming_response_retrieve(self, client: OpenAI) -> None:
@@ -104,7 +104,7 @@ def test_streaming_response_retrieve(self, client: OpenAI) -> None:
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
permission = response.parse()
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(SyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -220,7 +220,7 @@ async def test_method_retrieve(self, async_client: AsyncOpenAI) -> None:
permission = await async_client.fine_tuning.checkpoints.permissions.retrieve(
fine_tuned_model_checkpoint="ft-AF1WoRqd3aJAHsqc9NY7iL8F",
)
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(AsyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
@parametrize
async def test_method_retrieve_with_all_params(self, async_client: AsyncOpenAI) -> None:
@@ -231,7 +231,7 @@ async def test_method_retrieve_with_all_params(self, async_client: AsyncOpenAI)
order="ascending",
project_id="project_id",
)
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(AsyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
@parametrize
async def test_raw_response_retrieve(self, async_client: AsyncOpenAI) -> None:
@@ -242,7 +242,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncOpenAI) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
permission = response.parse()
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(AsyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
@parametrize
async def test_streaming_response_retrieve(self, async_client: AsyncOpenAI) -> None:
@@ -253,7 +253,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncOpenAI) -> N
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
permission = await response.parse()
- assert_matches_type(PermissionRetrieveResponse, permission, path=["response"])
+ assert_matches_type(AsyncCursorPage[PermissionRetrieveResponse], permission, path=["response"])
assert cast(Any, response.is_closed) is True
From 29d723d1f1baf2a5843293c8647dc7baa16d56d1 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 16 Jun 2025 22:26:10 +0000
Subject: [PATCH 2/4] chore(internal): minor formatting
---
.github/workflows/ci.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e853b86695..f039d92437 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -95,11 +95,11 @@ jobs:
run: |
rye sync --all-features
- - env:
+ - env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
rye run python examples/demo.py
- - env:
+ - env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
rye run python examples/async_demo.py
From 542b0ce98f14ccff4f9e1bcbd3a9ea5e4f846638 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 17 Jun 2025 00:09:03 +0000
Subject: [PATCH 3/4] chore(ci): enable for pull requests
---
.github/workflows/ci.yml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f039d92437..7991b3e7c7 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,6 +7,10 @@ on:
- 'integrated/**'
- 'stl-preview-head/**'
- 'stl-preview-base/**'
+ pull_request:
+ branches-ignore:
+ - 'stl-preview-head/**'
+ - 'stl-preview-base/**'
jobs:
lint:
From 7a8f975c71f4d71a6f44ef42c143949c29554405 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 17 Jun 2025 05:03:48 +0000
Subject: [PATCH 4/4] release: 1.88.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 14 ++++++++++++++
pyproject.toml | 2 +-
src/openai/_version.py | 2 +-
4 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 5e0920bd53..5ae95686ab 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "1.87.0"
+ ".": "1.88.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c67c695b0e..09de5415d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,19 @@
# Changelog
+## 1.88.0 (2025-06-17)
+
+Full Changelog: [v1.87.0...v1.88.0](https://github.com/openai/openai-python/compare/v1.87.0...v1.88.0)
+
+### Features
+
+* **api:** manual updates ([5d18a84](https://github.com/openai/openai-python/commit/5d18a8448ecbe31597e98ec7f64d7050c831901e))
+
+
+### Chores
+
+* **ci:** enable for pull requests ([542b0ce](https://github.com/openai/openai-python/commit/542b0ce98f14ccff4f9e1bcbd3a9ea5e4f846638))
+* **internal:** minor formatting ([29d723d](https://github.com/openai/openai-python/commit/29d723d1f1baf2a5843293c8647dc7baa16d56d1))
+
## 1.87.0 (2025-06-16)
Full Changelog: [v1.86.0...v1.87.0](https://github.com/openai/openai-python/compare/v1.86.0...v1.87.0)
diff --git a/pyproject.toml b/pyproject.toml
index 54f343064f..963a8cb1aa 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openai"
-version = "1.87.0"
+version = "1.88.0"
description = "The official Python library for the openai API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/openai/_version.py b/src/openai/_version.py
index 4d66bc793a..7c606ee49c 100644
--- a/src/openai/_version.py
+++ b/src/openai/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "openai"
-__version__ = "1.87.0" # x-release-please-version
+__version__ = "1.88.0" # x-release-please-version