diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b438aaf..5f78a6a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,14 +61,18 @@ jobs: run: rye build - name: Get GitHub OIDC Token - if: github.repository == 'stainless-sdks/kernel-python' + if: |- + github.repository == 'stainless-sdks/kernel-python' && + !startsWith(github.ref, 'refs/heads/stl/') id: github-oidc uses: actions/github-script@v8 with: script: core.setOutput('github_token', await core.getIDToken()); - name: Upload tarball - if: github.repository == 'stainless-sdks/kernel-python' + if: |- + github.repository == 'stainless-sdks/kernel-python' && + !startsWith(github.ref, 'refs/heads/stl/') env: URL: https://pkg.stainless.com/s AUTH: ${{ steps.github-oidc.outputs.github_token }} diff --git a/.release-please-manifest.json b/.release-please-manifest.json index dc28bb8..fe87cd9 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.42.1" + ".": "0.43.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index e1ce185..ae22a71 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 103 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-ef24d4bf172555bcbe8e3b432c644a25a1c6afd99c958a2eda8c3b1ea9568113.yml -openapi_spec_hash: b603c5a983e837928fa7d1100ed64fc9 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-bda5e58fa0bbd08761f27a1e0edbc602c44141ac9483bf6c96d52b7f4d10d9a7.yml +openapi_spec_hash: 10833b36358e8cda023e5bb0abeab0ba config_hash: cff4d43372b6fa66b64e2d4150f6aa76 diff --git a/CHANGELOG.md b/CHANGELOG.md index 338a74a..3cf8970 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 0.43.0 (2026-03-10) + +Full Changelog: [v0.42.1...v0.43.0](https://github.com/kernel/kernel-python-sdk/compare/v0.42.1...v0.43.0) + +### Features + +* Add webdriver_ws_url and metro webdriver session proxy ([66c7364](https://github.com/kernel/kernel-python-sdk/commit/66c73649f84a3e481672ba876b6882bd79069f16)) + + +### Chores + +* **ci:** skip uploading artifacts on stainless-internal branches ([52a392c](https://github.com/kernel/kernel-python-sdk/commit/52a392ca2bca701c3c1136fad0ef0d09f526918a)) +* update placeholder string ([6e71435](https://github.com/kernel/kernel-python-sdk/commit/6e71435500ee1eca1b243e73e0dfd316343ca21e)) + ## 0.42.1 (2026-03-05) Full Changelog: [v0.42.0...v0.42.1](https://github.com/kernel/kernel-python-sdk/compare/v0.42.0...v0.42.1) diff --git a/pyproject.toml b/pyproject.toml index 225ad6f..021d31e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kernel" -version = "0.42.1" +version = "0.43.0" 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 e6149c7..068f52c 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.42.1" # x-release-please-version +__version__ = "0.43.0" # x-release-please-version diff --git a/src/kernel/types/browser_create_response.py b/src/kernel/types/browser_create_response.py index 646e25a..bbfd9a2 100644 --- a/src/kernel/types/browser_create_response.py +++ b/src/kernel/types/browser_create_response.py @@ -32,6 +32,9 @@ class BrowserCreateResponse(BaseModel): timeout_seconds: int """The number of seconds of inactivity before the browser session is terminated.""" + webdriver_ws_url: str + """Websocket URL for WebDriver BiDi connections to the browser session""" + browser_live_view_url: Optional[str] = None """Remote URL for live viewing the browser session. diff --git a/src/kernel/types/browser_list_response.py b/src/kernel/types/browser_list_response.py index 7bb748f..915df11 100644 --- a/src/kernel/types/browser_list_response.py +++ b/src/kernel/types/browser_list_response.py @@ -32,6 +32,9 @@ class BrowserListResponse(BaseModel): timeout_seconds: int """The number of seconds of inactivity before the browser session is terminated.""" + webdriver_ws_url: str + """Websocket URL for WebDriver BiDi connections to the browser session""" + browser_live_view_url: Optional[str] = None """Remote URL for live viewing the browser session. diff --git a/src/kernel/types/browser_pool_acquire_response.py b/src/kernel/types/browser_pool_acquire_response.py index 3ffb777..373274c 100644 --- a/src/kernel/types/browser_pool_acquire_response.py +++ b/src/kernel/types/browser_pool_acquire_response.py @@ -32,6 +32,9 @@ class BrowserPoolAcquireResponse(BaseModel): timeout_seconds: int """The number of seconds of inactivity before the browser session is terminated.""" + webdriver_ws_url: str + """Websocket URL for WebDriver BiDi connections to the browser session""" + browser_live_view_url: Optional[str] = None """Remote URL for live viewing the browser session. diff --git a/src/kernel/types/browser_retrieve_response.py b/src/kernel/types/browser_retrieve_response.py index 3a5df2c..76fc6ce 100644 --- a/src/kernel/types/browser_retrieve_response.py +++ b/src/kernel/types/browser_retrieve_response.py @@ -32,6 +32,9 @@ class BrowserRetrieveResponse(BaseModel): timeout_seconds: int """The number of seconds of inactivity before the browser session is terminated.""" + webdriver_ws_url: str + """Websocket URL for WebDriver BiDi connections to the browser session""" + browser_live_view_url: Optional[str] = None """Remote URL for live viewing the browser session. diff --git a/src/kernel/types/browser_update_response.py b/src/kernel/types/browser_update_response.py index 309a7f4..fdf4fb5 100644 --- a/src/kernel/types/browser_update_response.py +++ b/src/kernel/types/browser_update_response.py @@ -32,6 +32,9 @@ class BrowserUpdateResponse(BaseModel): timeout_seconds: int """The number of seconds of inactivity before the browser session is terminated.""" + webdriver_ws_url: str + """Websocket URL for WebDriver BiDi connections to the browser session""" + browser_live_view_url: Optional[str] = None """Remote URL for live viewing the browser session. diff --git a/src/kernel/types/invocation_list_browsers_response.py b/src/kernel/types/invocation_list_browsers_response.py index cb98f33..673615b 100644 --- a/src/kernel/types/invocation_list_browsers_response.py +++ b/src/kernel/types/invocation_list_browsers_response.py @@ -32,6 +32,9 @@ class Browser(BaseModel): timeout_seconds: int """The number of seconds of inactivity before the browser session is terminated.""" + webdriver_ws_url: str + """Websocket URL for WebDriver BiDi connections to the browser session""" + browser_live_view_url: Optional[str] = None """Remote URL for live viewing the browser session. diff --git a/tests/api_resources/browsers/test_fs.py b/tests/api_resources/browsers/test_fs.py index 1d314e3..ceb179a 100644 --- a/tests/api_resources/browsers/test_fs.py +++ b/tests/api_resources/browsers/test_fs.py @@ -496,7 +496,7 @@ def test_method_upload(self, client: Kernel) -> None: files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) @@ -510,7 +510,7 @@ def test_raw_response_upload(self, client: Kernel) -> None: files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) @@ -528,7 +528,7 @@ def test_streaming_response_upload(self, client: Kernel) -> None: files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) as response: @@ -549,7 +549,7 @@ def test_path_params_upload(self, client: Kernel) -> None: files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) @@ -560,7 +560,7 @@ def test_method_upload_zip(self, client: Kernel) -> None: f = client.browsers.fs.upload_zip( id="id", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) assert f is None @@ -570,7 +570,7 @@ def test_raw_response_upload_zip(self, client: Kernel) -> None: response = client.browsers.fs.with_raw_response.upload_zip( id="id", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) assert response.is_closed is True @@ -584,7 +584,7 @@ def test_streaming_response_upload_zip(self, client: Kernel) -> None: with client.browsers.fs.with_streaming_response.upload_zip( id="id", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -601,7 +601,7 @@ def test_path_params_upload_zip(self, client: Kernel) -> None: client.browsers.fs.with_raw_response.upload_zip( id="", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) @pytest.mark.skip(reason="Mock server tests are disabled") @@ -609,7 +609,7 @@ def test_path_params_upload_zip(self, client: Kernel) -> None: def test_method_write_file(self, client: Kernel) -> None: f = client.browsers.fs.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) assert f is None @@ -619,7 +619,7 @@ def test_method_write_file(self, client: Kernel) -> None: def test_method_write_file_with_all_params(self, client: Kernel) -> None: f = client.browsers.fs.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", mode="0611", ) @@ -630,7 +630,7 @@ def test_method_write_file_with_all_params(self, client: Kernel) -> None: def test_raw_response_write_file(self, client: Kernel) -> None: response = client.browsers.fs.with_raw_response.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) @@ -644,7 +644,7 @@ def test_raw_response_write_file(self, client: Kernel) -> None: def test_streaming_response_write_file(self, client: Kernel) -> None: with client.browsers.fs.with_streaming_response.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) as response: assert not response.is_closed @@ -661,7 +661,7 @@ def test_path_params_write_file(self, client: Kernel) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): client.browsers.fs.with_raw_response.write_file( id="", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) @@ -1139,7 +1139,7 @@ async def test_method_upload(self, async_client: AsyncKernel) -> None: files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) @@ -1153,7 +1153,7 @@ async def test_raw_response_upload(self, async_client: AsyncKernel) -> None: files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) @@ -1171,7 +1171,7 @@ async def test_streaming_response_upload(self, async_client: AsyncKernel) -> Non files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) as response: @@ -1192,7 +1192,7 @@ async def test_path_params_upload(self, async_client: AsyncKernel) -> None: files=[ { "dest_path": "/J!", - "file": b"raw file contents", + "file": b"Example data", } ], ) @@ -1203,7 +1203,7 @@ async def test_method_upload_zip(self, async_client: AsyncKernel) -> None: f = await async_client.browsers.fs.upload_zip( id="id", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) assert f is None @@ -1213,7 +1213,7 @@ async def test_raw_response_upload_zip(self, async_client: AsyncKernel) -> None: response = await async_client.browsers.fs.with_raw_response.upload_zip( id="id", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) assert response.is_closed is True @@ -1227,7 +1227,7 @@ async def test_streaming_response_upload_zip(self, async_client: AsyncKernel) -> async with async_client.browsers.fs.with_streaming_response.upload_zip( id="id", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1244,7 +1244,7 @@ async def test_path_params_upload_zip(self, async_client: AsyncKernel) -> None: await async_client.browsers.fs.with_raw_response.upload_zip( id="", dest_path="/J!", - zip_file=b"raw file contents", + zip_file=b"Example data", ) @pytest.mark.skip(reason="Mock server tests are disabled") @@ -1252,7 +1252,7 @@ async def test_path_params_upload_zip(self, async_client: AsyncKernel) -> None: async def test_method_write_file(self, async_client: AsyncKernel) -> None: f = await async_client.browsers.fs.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) assert f is None @@ -1262,7 +1262,7 @@ async def test_method_write_file(self, async_client: AsyncKernel) -> None: async def test_method_write_file_with_all_params(self, async_client: AsyncKernel) -> None: f = await async_client.browsers.fs.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", mode="0611", ) @@ -1273,7 +1273,7 @@ async def test_method_write_file_with_all_params(self, async_client: AsyncKernel async def test_raw_response_write_file(self, async_client: AsyncKernel) -> None: response = await async_client.browsers.fs.with_raw_response.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) @@ -1287,7 +1287,7 @@ async def test_raw_response_write_file(self, async_client: AsyncKernel) -> None: async def test_streaming_response_write_file(self, async_client: AsyncKernel) -> None: async with async_client.browsers.fs.with_streaming_response.write_file( id="id", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) as response: assert not response.is_closed @@ -1304,6 +1304,6 @@ async def test_path_params_write_file(self, async_client: AsyncKernel) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): await async_client.browsers.fs.with_raw_response.write_file( id="", - contents=b"raw file contents", + contents=b"Example data", path="/J!", ) diff --git a/tests/api_resources/test_browsers.py b/tests/api_resources/test_browsers.py index 1e612ff..39c5bef 100644 --- a/tests/api_resources/test_browsers.py +++ b/tests/api_resources/test_browsers.py @@ -325,7 +325,7 @@ def test_method_load_extensions(self, client: Kernel) -> None: extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) @@ -339,7 +339,7 @@ def test_raw_response_load_extensions(self, client: Kernel) -> None: extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) @@ -357,7 +357,7 @@ def test_streaming_response_load_extensions(self, client: Kernel) -> None: extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) as response: @@ -378,7 +378,7 @@ def test_path_params_load_extensions(self, client: Kernel) -> None: extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) @@ -689,7 +689,7 @@ async def test_method_load_extensions(self, async_client: AsyncKernel) -> None: extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) @@ -703,7 +703,7 @@ async def test_raw_response_load_extensions(self, async_client: AsyncKernel) -> extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) @@ -721,7 +721,7 @@ async def test_streaming_response_load_extensions(self, async_client: AsyncKerne extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) as response: @@ -742,7 +742,7 @@ async def test_path_params_load_extensions(self, async_client: AsyncKernel) -> N extensions=[ { "name": "name", - "zip_file": b"raw file contents", + "zip_file": b"Example data", } ], ) diff --git a/tests/api_resources/test_deployments.py b/tests/api_resources/test_deployments.py index 25ad439..ed56286 100644 --- a/tests/api_resources/test_deployments.py +++ b/tests/api_resources/test_deployments.py @@ -34,7 +34,7 @@ def test_method_create_with_all_params(self, client: Kernel) -> None: deployment = client.deployments.create( entrypoint_rel_path="src/app.py", env_vars={"FOO": "bar"}, - file=b"raw file contents", + file=b"Example data", force=False, region="aws.us-east-1a", source={ @@ -265,7 +265,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncKernel) -> deployment = await async_client.deployments.create( entrypoint_rel_path="src/app.py", env_vars={"FOO": "bar"}, - file=b"raw file contents", + file=b"Example data", force=False, region="aws.us-east-1a", source={ diff --git a/tests/api_resources/test_extensions.py b/tests/api_resources/test_extensions.py index 6f31f54..4a28fb5 100644 --- a/tests/api_resources/test_extensions.py +++ b/tests/api_resources/test_extensions.py @@ -207,7 +207,7 @@ def test_streaming_response_download_from_chrome_store(self, client: Kernel, res @parametrize def test_method_upload(self, client: Kernel) -> None: extension = client.extensions.upload( - file=b"raw file contents", + file=b"Example data", ) assert_matches_type(ExtensionUploadResponse, extension, path=["response"]) @@ -215,7 +215,7 @@ def test_method_upload(self, client: Kernel) -> None: @parametrize def test_method_upload_with_all_params(self, client: Kernel) -> None: extension = client.extensions.upload( - file=b"raw file contents", + file=b"Example data", name="name", ) assert_matches_type(ExtensionUploadResponse, extension, path=["response"]) @@ -224,7 +224,7 @@ def test_method_upload_with_all_params(self, client: Kernel) -> None: @parametrize def test_raw_response_upload(self, client: Kernel) -> None: response = client.extensions.with_raw_response.upload( - file=b"raw file contents", + file=b"Example data", ) assert response.is_closed is True @@ -236,7 +236,7 @@ def test_raw_response_upload(self, client: Kernel) -> None: @parametrize def test_streaming_response_upload(self, client: Kernel) -> None: with client.extensions.with_streaming_response.upload( - file=b"raw file contents", + file=b"Example data", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -437,7 +437,7 @@ async def test_streaming_response_download_from_chrome_store( @parametrize async def test_method_upload(self, async_client: AsyncKernel) -> None: extension = await async_client.extensions.upload( - file=b"raw file contents", + file=b"Example data", ) assert_matches_type(ExtensionUploadResponse, extension, path=["response"]) @@ -445,7 +445,7 @@ async def test_method_upload(self, async_client: AsyncKernel) -> None: @parametrize async def test_method_upload_with_all_params(self, async_client: AsyncKernel) -> None: extension = await async_client.extensions.upload( - file=b"raw file contents", + file=b"Example data", name="name", ) assert_matches_type(ExtensionUploadResponse, extension, path=["response"]) @@ -454,7 +454,7 @@ async def test_method_upload_with_all_params(self, async_client: AsyncKernel) -> @parametrize async def test_raw_response_upload(self, async_client: AsyncKernel) -> None: response = await async_client.extensions.with_raw_response.upload( - file=b"raw file contents", + file=b"Example data", ) assert response.is_closed is True @@ -466,7 +466,7 @@ async def test_raw_response_upload(self, async_client: AsyncKernel) -> None: @parametrize async def test_streaming_response_upload(self, async_client: AsyncKernel) -> None: async with async_client.extensions.with_streaming_response.upload( - file=b"raw file contents", + file=b"Example data", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python"