From 68c2cc821cf9c31f8e5e054ba69780cbba2449db Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 18:48:36 +0000 Subject: [PATCH 1/2] feat(api): update via SDK Studio --- .stats.yml | 4 +- README.md | 15 +---- api.md | 2 +- src/kernel/resources/apps.py | 45 +++++++++------ src/kernel/resources/browser.py | 40 ++++++++++++- src/kernel/types/__init__.py | 1 + src/kernel/types/app_deploy_params.py | 21 ++++--- src/kernel/types/app_deploy_response.py | 22 +++++++- .../types/browser_create_session_params.py | 14 +++++ tests/api_resources/test_apps.py | 34 ++++------- tests/api_resources/test_browser.py | 24 ++++++-- tests/test_client.py | 56 ++++--------------- 12 files changed, 157 insertions(+), 121 deletions(-) create mode 100644 src/kernel/types/browser_create_session_params.py diff --git a/.stats.yml b/.stats.yml index 6af3fb9..cbc2ff8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 4 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-d168b58fcf39dbd0458d132091793d3e2d0930070b7dda2d5f7f1baff20dd31b.yml -openapi_spec_hash: b7e0fd7ee1656d7dbad57209d1584d92 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-2af763aab4c314b382e1123edc4ee3d51c0fe7977730ce6776b9fb09b29fe291.yml +openapi_spec_hash: be02256478be81fa3f649076879850bc config_hash: eab40627b734534462ae3b8ccd8b263b diff --git a/README.md b/README.md index ab4e765..1cbfb1f 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,10 @@ client = Kernel( ) response = client.apps.deploy( - app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME", ) -print(response.id) +print(response.apps) ``` While you can provide an `api_key` keyword argument, @@ -64,11 +63,10 @@ client = AsyncKernel( async def main() -> None: response = await client.apps.deploy( - app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME", ) - print(response.id) + print(response.apps) asyncio.run(main()) @@ -96,9 +94,7 @@ from kernel import Kernel client = Kernel() client.apps.deploy( - app_name="my-awesome-app", file=Path("/path/to/file"), - version="1.0.0", ) ``` @@ -121,7 +117,6 @@ client = Kernel() try: client.apps.deploy( - app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME", ) @@ -168,7 +163,6 @@ client = Kernel( # Or, configure per-request: client.with_options(max_retries=5).apps.deploy( - app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME", ) @@ -195,7 +189,6 @@ client = Kernel( # Override per-request: client.with_options(timeout=5.0).apps.deploy( - app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME", ) @@ -240,14 +233,13 @@ from kernel import Kernel client = Kernel() response = client.apps.with_raw_response.deploy( - app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME", ) print(response.headers.get('X-My-Header')) app = response.parse() # get the object that `apps.deploy()` would have returned -print(app.id) +print(app.apps) ``` These methods return an [`APIResponse`](https://github.com/onkernel/kernel-python-sdk/tree/main/src/kernel/_response.py) object. @@ -262,7 +254,6 @@ To stream the response body, use `.with_streaming_response` instead, which requi ```python with client.apps.with_streaming_response.deploy( - app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME", ) as response: diff --git a/api.md b/api.md index ec9b481..581c76f 100644 --- a/api.md +++ b/api.md @@ -22,4 +22,4 @@ from kernel.types import BrowserCreateSessionResponse Methods: -- client.browser.create_session() -> BrowserCreateSessionResponse +- client.browser.create_session(\*\*params) -> BrowserCreateSessionResponse diff --git a/src/kernel/resources/apps.py b/src/kernel/resources/apps.py index 997a27f..4514880 100644 --- a/src/kernel/resources/apps.py +++ b/src/kernel/resources/apps.py @@ -3,6 +3,7 @@ from __future__ import annotations from typing import Mapping, cast +from typing_extensions import Literal import httpx @@ -48,10 +49,11 @@ def with_streaming_response(self) -> AppsResourceWithStreamingResponse: def deploy( self, *, - app_name: str, file: FileTypes, - version: str, - region: str | NotGiven = NOT_GIVEN, + entrypoint_rel_path: str | NotGiven = NOT_GIVEN, + force: Literal["true", "false"] | NotGiven = NOT_GIVEN, + region: Literal["aws.us-east-1a"] | NotGiven = NOT_GIVEN, + version: str | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -63,13 +65,15 @@ def deploy( Deploy a new application Args: - app_name: Name of the application + file: ZIP file containing the application source directory - file: ZIP file containing the application + entrypoint_rel_path: Relative path to the entrypoint of the application - version: Version of the application + force: Allow overwriting an existing app version - region: AWS region for deployment (e.g. "aws.us-east-1a") + region: Region for deployment. Currently we only support "aws.us-east-1a" + + version: Version of the application. Can be any string. extra_headers: Send extra headers @@ -81,10 +85,11 @@ def deploy( """ body = deepcopy_minimal( { - "app_name": app_name, "file": file, - "version": version, + "entrypoint_rel_path": entrypoint_rel_path, + "force": force, "region": region, + "version": version, } ) files = extract_files(cast(Mapping[str, object], body), paths=[["file"]]) @@ -210,10 +215,11 @@ def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse: async def deploy( self, *, - app_name: str, file: FileTypes, - version: str, - region: str | NotGiven = NOT_GIVEN, + entrypoint_rel_path: str | NotGiven = NOT_GIVEN, + force: Literal["true", "false"] | NotGiven = NOT_GIVEN, + region: Literal["aws.us-east-1a"] | NotGiven = NOT_GIVEN, + version: str | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -225,13 +231,15 @@ async def deploy( Deploy a new application Args: - app_name: Name of the application + file: ZIP file containing the application source directory - file: ZIP file containing the application + entrypoint_rel_path: Relative path to the entrypoint of the application - version: Version of the application + force: Allow overwriting an existing app version - region: AWS region for deployment (e.g. "aws.us-east-1a") + region: Region for deployment. Currently we only support "aws.us-east-1a" + + version: Version of the application. Can be any string. extra_headers: Send extra headers @@ -243,10 +251,11 @@ async def deploy( """ body = deepcopy_minimal( { - "app_name": app_name, "file": file, - "version": version, + "entrypoint_rel_path": entrypoint_rel_path, + "force": force, "region": region, + "version": version, } ) files = extract_files(cast(Mapping[str, object], body), paths=[["file"]]) diff --git a/src/kernel/resources/browser.py b/src/kernel/resources/browser.py index 3e3da66..3edf8c0 100644 --- a/src/kernel/resources/browser.py +++ b/src/kernel/resources/browser.py @@ -4,7 +4,9 @@ import httpx +from ..types import browser_create_session_params from .._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from .._utils import maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -42,6 +44,7 @@ def with_streaming_response(self) -> BrowserResourceWithStreamingResponse: def create_session( self, *, + invocation_id: str, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -49,9 +52,25 @@ def create_session( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, ) -> BrowserCreateSessionResponse: - """Create Browser Session""" + """ + Create Browser Session + + Args: + invocation_id: Kernel App invocation ID + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ return self._post( "/browser", + body=maybe_transform( + {"invocation_id": invocation_id}, browser_create_session_params.BrowserCreateSessionParams + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -82,6 +101,7 @@ def with_streaming_response(self) -> AsyncBrowserResourceWithStreamingResponse: async def create_session( self, *, + invocation_id: str, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -89,9 +109,25 @@ async def create_session( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, ) -> BrowserCreateSessionResponse: - """Create Browser Session""" + """ + Create Browser Session + + Args: + invocation_id: Kernel App invocation ID + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ return await self._post( "/browser", + body=await async_maybe_transform( + {"invocation_id": invocation_id}, browser_create_session_params.BrowserCreateSessionParams + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/kernel/types/__init__.py b/src/kernel/types/__init__.py index 9577c2f..32a4768 100644 --- a/src/kernel/types/__init__.py +++ b/src/kernel/types/__init__.py @@ -6,5 +6,6 @@ from .app_invoke_params import AppInvokeParams as AppInvokeParams from .app_deploy_response import AppDeployResponse as AppDeployResponse from .app_invoke_response import AppInvokeResponse as AppInvokeResponse +from .browser_create_session_params import BrowserCreateSessionParams as BrowserCreateSessionParams from .browser_create_session_response import BrowserCreateSessionResponse as BrowserCreateSessionResponse from .app_retrieve_invocation_response import AppRetrieveInvocationResponse as AppRetrieveInvocationResponse diff --git a/src/kernel/types/app_deploy_params.py b/src/kernel/types/app_deploy_params.py index 78a11f2..ff7242c 100644 --- a/src/kernel/types/app_deploy_params.py +++ b/src/kernel/types/app_deploy_params.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing_extensions import Required, Annotated, TypedDict +from typing_extensions import Literal, Required, Annotated, TypedDict from .._types import FileTypes from .._utils import PropertyInfo @@ -11,14 +11,17 @@ class AppDeployParams(TypedDict, total=False): - app_name: Required[Annotated[str, PropertyInfo(alias="appName")]] - """Name of the application""" - file: Required[FileTypes] - """ZIP file containing the application""" + """ZIP file containing the application source directory""" + + entrypoint_rel_path: Annotated[str, PropertyInfo(alias="entrypointRelPath")] + """Relative path to the entrypoint of the application""" + + force: Literal["true", "false"] + """Allow overwriting an existing app version""" - version: Required[str] - """Version of the application""" + region: Literal["aws.us-east-1a"] + """Region for deployment. Currently we only support "aws.us-east-1a" """ - region: str - """AWS region for deployment (e.g. "aws.us-east-1a")""" + version: str + """Version of the application. Can be any string.""" diff --git a/src/kernel/types/app_deploy_response.py b/src/kernel/types/app_deploy_response.py index 6a214df..e82164e 100644 --- a/src/kernel/types/app_deploy_response.py +++ b/src/kernel/types/app_deploy_response.py @@ -1,13 +1,29 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +from typing import List + from .._models import BaseModel -__all__ = ["AppDeployResponse"] +__all__ = ["AppDeployResponse", "App", "AppAction"] -class AppDeployResponse(BaseModel): +class AppAction(BaseModel): + name: str + """Name of the action""" + + +class App(BaseModel): id: str - """ID of the deployed app version""" + """ID for the app version deployed""" + + actions: List[AppAction] + + name: str + """Name of the app""" + + +class AppDeployResponse(BaseModel): + apps: List[App] message: str """Success message""" diff --git a/src/kernel/types/browser_create_session_params.py b/src/kernel/types/browser_create_session_params.py new file mode 100644 index 0000000..73389be --- /dev/null +++ b/src/kernel/types/browser_create_session_params.py @@ -0,0 +1,14 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, Annotated, TypedDict + +from .._utils import PropertyInfo + +__all__ = ["BrowserCreateSessionParams"] + + +class BrowserCreateSessionParams(TypedDict, total=False): + invocation_id: Required[Annotated[str, PropertyInfo(alias="invocationId")]] + """Kernel App invocation ID""" diff --git a/tests/api_resources/test_apps.py b/tests/api_resources/test_apps.py index 26d0ef1..08efe17 100644 --- a/tests/api_resources/test_apps.py +++ b/tests/api_resources/test_apps.py @@ -25,9 +25,7 @@ class TestApps: @parametrize def test_method_deploy(self, client: Kernel) -> None: app = client.apps.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", ) assert_matches_type(AppDeployResponse, app, path=["response"]) @@ -35,10 +33,11 @@ def test_method_deploy(self, client: Kernel) -> None: @parametrize def test_method_deploy_with_all_params(self, client: Kernel) -> None: app = client.apps.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", + entrypoint_rel_path="app.py", + force="false", region="aws.us-east-1a", + version="1.0.0", ) assert_matches_type(AppDeployResponse, app, path=["response"]) @@ -46,9 +45,7 @@ def test_method_deploy_with_all_params(self, client: Kernel) -> None: @parametrize def test_raw_response_deploy(self, client: Kernel) -> None: response = client.apps.with_raw_response.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", ) assert response.is_closed is True @@ -60,9 +57,7 @@ def test_raw_response_deploy(self, client: Kernel) -> None: @parametrize def test_streaming_response_deploy(self, client: Kernel) -> None: with client.apps.with_streaming_response.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -78,7 +73,7 @@ def test_method_invoke(self, client: Kernel) -> None: app = client.apps.invoke( action_name="analyze", app_name="my-awesome-app", - payload='{ "data": "example input" }', + payload={"data": "example input"}, version="1.0.0", ) assert_matches_type(AppInvokeResponse, app, path=["response"]) @@ -89,7 +84,7 @@ def test_raw_response_invoke(self, client: Kernel) -> None: response = client.apps.with_raw_response.invoke( action_name="analyze", app_name="my-awesome-app", - payload='{ "data": "example input" }', + payload={"data": "example input"}, version="1.0.0", ) @@ -104,7 +99,7 @@ def test_streaming_response_invoke(self, client: Kernel) -> None: with client.apps.with_streaming_response.invoke( action_name="analyze", app_name="my-awesome-app", - payload='{ "data": "example input" }', + payload={"data": "example input"}, version="1.0.0", ) as response: assert not response.is_closed @@ -165,9 +160,7 @@ class TestAsyncApps: @parametrize async def test_method_deploy(self, async_client: AsyncKernel) -> None: app = await async_client.apps.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", ) assert_matches_type(AppDeployResponse, app, path=["response"]) @@ -175,10 +168,11 @@ async def test_method_deploy(self, async_client: AsyncKernel) -> None: @parametrize async def test_method_deploy_with_all_params(self, async_client: AsyncKernel) -> None: app = await async_client.apps.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", + entrypoint_rel_path="app.py", + force="false", region="aws.us-east-1a", + version="1.0.0", ) assert_matches_type(AppDeployResponse, app, path=["response"]) @@ -186,9 +180,7 @@ async def test_method_deploy_with_all_params(self, async_client: AsyncKernel) -> @parametrize async def test_raw_response_deploy(self, async_client: AsyncKernel) -> None: response = await async_client.apps.with_raw_response.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", ) assert response.is_closed is True @@ -200,9 +192,7 @@ async def test_raw_response_deploy(self, async_client: AsyncKernel) -> None: @parametrize async def test_streaming_response_deploy(self, async_client: AsyncKernel) -> None: async with async_client.apps.with_streaming_response.deploy( - app_name="my-awesome-app", file=b"raw file contents", - version="1.0.0", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -218,7 +208,7 @@ async def test_method_invoke(self, async_client: AsyncKernel) -> None: app = await async_client.apps.invoke( action_name="analyze", app_name="my-awesome-app", - payload='{ "data": "example input" }', + payload={"data": "example input"}, version="1.0.0", ) assert_matches_type(AppInvokeResponse, app, path=["response"]) @@ -229,7 +219,7 @@ async def test_raw_response_invoke(self, async_client: AsyncKernel) -> None: response = await async_client.apps.with_raw_response.invoke( action_name="analyze", app_name="my-awesome-app", - payload='{ "data": "example input" }', + payload={"data": "example input"}, version="1.0.0", ) @@ -244,7 +234,7 @@ async def test_streaming_response_invoke(self, async_client: AsyncKernel) -> Non async with async_client.apps.with_streaming_response.invoke( action_name="analyze", app_name="my-awesome-app", - payload='{ "data": "example input" }', + payload={"data": "example input"}, version="1.0.0", ) as response: assert not response.is_closed diff --git a/tests/api_resources/test_browser.py b/tests/api_resources/test_browser.py index 1aa4a1c..3280e05 100644 --- a/tests/api_resources/test_browser.py +++ b/tests/api_resources/test_browser.py @@ -20,13 +20,17 @@ class TestBrowser: @pytest.mark.skip() @parametrize def test_method_create_session(self, client: Kernel) -> None: - browser = client.browser.create_session() + browser = client.browser.create_session( + invocation_id="invocationId", + ) assert_matches_type(BrowserCreateSessionResponse, browser, path=["response"]) @pytest.mark.skip() @parametrize def test_raw_response_create_session(self, client: Kernel) -> None: - response = client.browser.with_raw_response.create_session() + response = client.browser.with_raw_response.create_session( + invocation_id="invocationId", + ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -36,7 +40,9 @@ def test_raw_response_create_session(self, client: Kernel) -> None: @pytest.mark.skip() @parametrize def test_streaming_response_create_session(self, client: Kernel) -> None: - with client.browser.with_streaming_response.create_session() as response: + with client.browser.with_streaming_response.create_session( + invocation_id="invocationId", + ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -52,13 +58,17 @@ class TestAsyncBrowser: @pytest.mark.skip() @parametrize async def test_method_create_session(self, async_client: AsyncKernel) -> None: - browser = await async_client.browser.create_session() + browser = await async_client.browser.create_session( + invocation_id="invocationId", + ) assert_matches_type(BrowserCreateSessionResponse, browser, path=["response"]) @pytest.mark.skip() @parametrize async def test_raw_response_create_session(self, async_client: AsyncKernel) -> None: - response = await async_client.browser.with_raw_response.create_session() + response = await async_client.browser.with_raw_response.create_session( + invocation_id="invocationId", + ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -68,7 +78,9 @@ async def test_raw_response_create_session(self, async_client: AsyncKernel) -> N @pytest.mark.skip() @parametrize async def test_streaming_response_create_session(self, async_client: AsyncKernel) -> None: - async with async_client.browser.with_streaming_response.create_session() as response: + async with async_client.browser.with_streaming_response.create_session( + invocation_id="invocationId", + ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" diff --git a/tests/test_client.py b/tests/test_client.py index 75dabc6..3e71e4d 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -721,12 +721,7 @@ def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter) -> No with pytest.raises(APITimeoutError): self.client.post( "/apps/deploy", - body=cast( - object, - maybe_transform( - dict(app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams - ), - ), + body=cast(object, maybe_transform(dict(file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams)), cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) @@ -742,12 +737,7 @@ def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter) -> Non with pytest.raises(APIStatusError): self.client.post( "/apps/deploy", - body=cast( - object, - maybe_transform( - dict(app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams - ), - ), + body=cast(object, maybe_transform(dict(file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams)), cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) @@ -780,9 +770,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: respx_mock.post("/apps/deploy").mock(side_effect=retry_handler) - response = client.apps.with_raw_response.deploy( - app_name="my-awesome-app", file=b"raw file contents", version="1.0.0" - ) + response = client.apps.with_raw_response.deploy(file=b"raw file contents") assert response.retries_taken == failures_before_success assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success @@ -807,10 +795,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: respx_mock.post("/apps/deploy").mock(side_effect=retry_handler) response = client.apps.with_raw_response.deploy( - app_name="my-awesome-app", - file=b"raw file contents", - version="1.0.0", - extra_headers={"x-stainless-retry-count": Omit()}, + file=b"raw file contents", extra_headers={"x-stainless-retry-count": Omit()} ) assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0 @@ -835,10 +820,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: respx_mock.post("/apps/deploy").mock(side_effect=retry_handler) response = client.apps.with_raw_response.deploy( - app_name="my-awesome-app", - file=b"raw file contents", - version="1.0.0", - extra_headers={"x-stainless-retry-count": "42"}, + file=b"raw file contents", extra_headers={"x-stainless-retry-count": "42"} ) assert response.http_request.headers.get("x-stainless-retry-count") == "42" @@ -1531,12 +1513,7 @@ async def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter) with pytest.raises(APITimeoutError): await self.client.post( "/apps/deploy", - body=cast( - object, - maybe_transform( - dict(app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams - ), - ), + body=cast(object, maybe_transform(dict(file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams)), cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) @@ -1552,12 +1529,7 @@ async def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter) with pytest.raises(APIStatusError): await self.client.post( "/apps/deploy", - body=cast( - object, - maybe_transform( - dict(app_name="REPLACE_ME", file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams - ), - ), + body=cast(object, maybe_transform(dict(file=b"REPLACE_ME", version="REPLACE_ME"), AppDeployParams)), cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) @@ -1591,9 +1563,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: respx_mock.post("/apps/deploy").mock(side_effect=retry_handler) - response = await client.apps.with_raw_response.deploy( - app_name="my-awesome-app", file=b"raw file contents", version="1.0.0" - ) + response = await client.apps.with_raw_response.deploy(file=b"raw file contents") assert response.retries_taken == failures_before_success assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success @@ -1619,10 +1589,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: respx_mock.post("/apps/deploy").mock(side_effect=retry_handler) response = await client.apps.with_raw_response.deploy( - app_name="my-awesome-app", - file=b"raw file contents", - version="1.0.0", - extra_headers={"x-stainless-retry-count": Omit()}, + file=b"raw file contents", extra_headers={"x-stainless-retry-count": Omit()} ) assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0 @@ -1648,10 +1615,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: respx_mock.post("/apps/deploy").mock(side_effect=retry_handler) response = await client.apps.with_raw_response.deploy( - app_name="my-awesome-app", - file=b"raw file contents", - version="1.0.0", - extra_headers={"x-stainless-retry-count": "42"}, + file=b"raw file contents", extra_headers={"x-stainless-retry-count": "42"} ) assert response.http_request.headers.get("x-stainless-retry-count") == "42" From d16997f17044b1eb68b8c9cfbda95813432cfc3f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 18:48:53 +0000 Subject: [PATCH 2/2] release: 0.1.0-alpha.8 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- src/kernel/_version.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b5db7ce..c373724 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.7" + ".": "0.1.0-alpha.8" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 54ff9db..2bfed62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.1.0-alpha.8 (2025-05-12) + +Full Changelog: [v0.1.0-alpha.7...v0.1.0-alpha.8](https://github.com/onkernel/kernel-python-sdk/compare/v0.1.0-alpha.7...v0.1.0-alpha.8) + +### Features + +* **api:** update via SDK Studio ([68c2cc8](https://github.com/onkernel/kernel-python-sdk/commit/68c2cc821cf9c31f8e5e054ba69780cbba2449db)) + ## 0.1.0-alpha.7 (2025-05-11) Full Changelog: [v0.1.0-alpha.6...v0.1.0-alpha.7](https://github.com/onkernel/kernel-python-sdk/compare/v0.1.0-alpha.6...v0.1.0-alpha.7) diff --git a/pyproject.toml b/pyproject.toml index 710383c..37fb003 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kernel" -version = "0.1.0-alpha.7" +version = "0.1.0-alpha.8" description = "The official Python library for the kernel API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/kernel/_version.py b/src/kernel/_version.py index 76a7255..924d714 100644 --- a/src/kernel/_version.py +++ b/src/kernel/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "kernel" -__version__ = "0.1.0-alpha.7" # x-release-please-version +__version__ = "0.1.0-alpha.8" # x-release-please-version