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