diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b56c3d0..e8285b7 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.4" + ".": "0.1.0-alpha.5" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index ca7f462..61aa00b 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 29 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/replicate%2Freplicate-client-2788217b7ad7d61d1a77800bc5ff12a6810f1692d4d770b72fa8f898c6a055ab.yml openapi_spec_hash: 4423bf747e228484547b441468a9f156 -config_hash: 976e20887b4e455f639ee6917de350b8 +config_hash: d820945093fc56fea6d062c90745d7a5 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5be0765..3b53281 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.1.0-alpha.5 (2025-04-24) + +Full Changelog: [v0.1.0-alpha.4...v0.1.0-alpha.5](https://github.com/replicate/replicate-python-stainless/compare/v0.1.0-alpha.4...v0.1.0-alpha.5) + +### Features + +* add missing resources ([8bbddc7](https://github.com/replicate/replicate-python-stainless/commit/8bbddc7a788f4488311b8ed408d4b020db8e006b)) +* enable `openapi.code_samples` ([85810f5](https://github.com/replicate/replicate-python-stainless/commit/85810f5f4c0caf680a90fca80f1bfcd639e76894)) + ## 0.1.0-alpha.4 (2025-04-23) Full Changelog: [v0.1.0-alpha.3...v0.1.0-alpha.4](https://github.com/replicate/replicate-python-stainless/compare/v0.1.0-alpha.3...v0.1.0-alpha.4) diff --git a/api.md b/api.md index 65828d6..df97142 100644 --- a/api.md +++ b/api.md @@ -3,6 +3,7 @@ Methods: - client.collections.list() -> None +- client.collections.get(collection_slug) -> None # Deployments @@ -24,7 +25,6 @@ Methods: - client.deployments.list() -> SyncCursorURLPage[DeploymentListResponse] - client.deployments.delete(deployment_name, \*, deployment_owner) -> None - client.deployments.get(deployment_name, \*, deployment_owner) -> DeploymentGetResponse -- client.deployments.list_em_all() -> None ## Predictions @@ -43,7 +43,6 @@ from replicate.types import HardwareListResponse Methods: - client.hardware.list() -> HardwareListResponse -- client.hardware.retrieve_collections(collection_slug) -> None # Accounts @@ -70,7 +69,6 @@ Methods: - client.models.create(\*\*params) -> None - client.models.list() -> SyncCursorURLPage[ModelListResponse] - client.models.delete(model_name, \*, model_owner) -> None -- client.models.create_prediction(model_name, \*, model_owner, \*\*params) -> Prediction - client.models.get(model_name, \*, model_owner) -> None ## Examples @@ -79,6 +77,12 @@ Methods: - client.models.examples.list(model_name, \*, model_owner) -> None +## Predictions + +Methods: + +- client.models.predictions.create(model_name, \*, model_owner, \*\*params) -> Prediction + ## Readme Types: @@ -93,17 +97,10 @@ Methods: ## Versions -Types: - -```python -from replicate.types.models import VersionCreateTrainingResponse -``` - Methods: - client.models.versions.list(model_name, \*, model_owner) -> None - client.models.versions.delete(version_id, \*, model_owner, model_name) -> None -- client.models.versions.create_training(version_id, \*, model_owner, model_name, \*\*params) -> VersionCreateTrainingResponse - client.models.versions.get(version_id, \*, model_owner, model_name) -> None # Predictions @@ -126,11 +123,17 @@ Methods: Types: ```python -from replicate.types import TrainingListResponse, TrainingCancelResponse, TrainingGetResponse +from replicate.types import ( + TrainingCreateResponse, + TrainingListResponse, + TrainingCancelResponse, + TrainingGetResponse, +) ``` Methods: +- client.trainings.create(version_id, \*, model_owner, model_name, \*\*params) -> TrainingCreateResponse - client.trainings.list() -> SyncCursorURLPage[TrainingListResponse] - client.trainings.cancel(training_id) -> TrainingCancelResponse - client.trainings.get(training_id) -> TrainingGetResponse @@ -139,12 +142,14 @@ Methods: ## Default +### Secret + Types: ```python -from replicate.types.webhooks import DefaultRetrieveSecretResponse +from replicate.types.webhooks.default import SecretGetResponse ``` Methods: -- client.webhooks.default.retrieve_secret() -> DefaultRetrieveSecretResponse +- client.webhooks.default.secret.get() -> SecretGetResponse diff --git a/pyproject.toml b/pyproject.toml index 8854bbc..af88d90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "replicate-stainless" -version = "0.1.0-alpha.4" +version = "0.1.0-alpha.5" description = "The official Python library for the replicate-client API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/replicate/_version.py b/src/replicate/_version.py index e966f49..8343825 100644 --- a/src/replicate/_version.py +++ b/src/replicate/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "replicate" -__version__ = "0.1.0-alpha.4" # x-release-please-version +__version__ = "0.1.0-alpha.5" # x-release-please-version diff --git a/src/replicate/resources/collections.py b/src/replicate/resources/collections.py index 8768630..adf0d9a 100644 --- a/src/replicate/resources/collections.py +++ b/src/replicate/resources/collections.py @@ -82,6 +82,58 @@ def list( cast_to=NoneType, ) + def get( + self, + collection_slug: 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, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> None: + """ + Example cURL request: + + ```console + curl -s \\ + -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ + https://api.replicate.com/v1/collections/super-resolution + ``` + + The response will be a collection object with a nested list of the models in + that collection: + + ```json + { + "name": "Super resolution", + "slug": "super-resolution", + "description": "Upscaling models that create high-quality images from low-quality images.", + "models": [...] + } + ``` + + Args: + 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 + """ + if not collection_slug: + raise ValueError(f"Expected a non-empty value for `collection_slug` but received {collection_slug!r}") + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + return self._get( + f"/collections/{collection_slug}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) + class AsyncCollectionsResource(AsyncAPIResource): @cached_property @@ -147,6 +199,58 @@ async def list( cast_to=NoneType, ) + async def get( + self, + collection_slug: 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, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> None: + """ + Example cURL request: + + ```console + curl -s \\ + -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ + https://api.replicate.com/v1/collections/super-resolution + ``` + + The response will be a collection object with a nested list of the models in + that collection: + + ```json + { + "name": "Super resolution", + "slug": "super-resolution", + "description": "Upscaling models that create high-quality images from low-quality images.", + "models": [...] + } + ``` + + Args: + 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 + """ + if not collection_slug: + raise ValueError(f"Expected a non-empty value for `collection_slug` but received {collection_slug!r}") + extra_headers = {"Accept": "*/*", **(extra_headers or {})} + return await self._get( + f"/collections/{collection_slug}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=NoneType, + ) + class CollectionsResourceWithRawResponse: def __init__(self, collections: CollectionsResource) -> None: @@ -155,6 +259,9 @@ def __init__(self, collections: CollectionsResource) -> None: self.list = to_raw_response_wrapper( collections.list, ) + self.get = to_raw_response_wrapper( + collections.get, + ) class AsyncCollectionsResourceWithRawResponse: @@ -164,6 +271,9 @@ def __init__(self, collections: AsyncCollectionsResource) -> None: self.list = async_to_raw_response_wrapper( collections.list, ) + self.get = async_to_raw_response_wrapper( + collections.get, + ) class CollectionsResourceWithStreamingResponse: @@ -173,6 +283,9 @@ def __init__(self, collections: CollectionsResource) -> None: self.list = to_streamed_response_wrapper( collections.list, ) + self.get = to_streamed_response_wrapper( + collections.get, + ) class AsyncCollectionsResourceWithStreamingResponse: @@ -182,3 +295,6 @@ def __init__(self, collections: AsyncCollectionsResource) -> None: self.list = async_to_streamed_response_wrapper( collections.list, ) + self.get = async_to_streamed_response_wrapper( + collections.get, + ) diff --git a/src/replicate/resources/deployments/deployments.py b/src/replicate/resources/deployments/deployments.py index 565a1c6..4ac53ff 100644 --- a/src/replicate/resources/deployments/deployments.py +++ b/src/replicate/resources/deployments/deployments.py @@ -451,50 +451,6 @@ def get( cast_to=DeploymentGetResponse, ) - def list_em_all( - self, - *, - # 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> None: - """ - Example cURL request: - - ```console - curl -s \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - https://api.replicate.com/v1/collections - ``` - - The response will be a paginated JSON list of collection objects: - - ```json - { - "next": "null", - "previous": null, - "results": [ - { - "name": "Super resolution", - "slug": "super-resolution", - "description": "Upscaling models that create high-quality images from low-quality images." - } - ] - } - ``` - """ - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._get( - "/collections", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - class AsyncDeploymentsResource(AsyncAPIResource): @cached_property @@ -914,50 +870,6 @@ async def get( cast_to=DeploymentGetResponse, ) - async def list_em_all( - self, - *, - # 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> None: - """ - Example cURL request: - - ```console - curl -s \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - https://api.replicate.com/v1/collections - ``` - - The response will be a paginated JSON list of collection objects: - - ```json - { - "next": "null", - "previous": null, - "results": [ - { - "name": "Super resolution", - "slug": "super-resolution", - "description": "Upscaling models that create high-quality images from low-quality images." - } - ] - } - ``` - """ - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._get( - "/collections", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - class DeploymentsResourceWithRawResponse: def __init__(self, deployments: DeploymentsResource) -> None: @@ -978,9 +890,6 @@ def __init__(self, deployments: DeploymentsResource) -> None: self.get = to_raw_response_wrapper( deployments.get, ) - self.list_em_all = to_raw_response_wrapper( - deployments.list_em_all, - ) @cached_property def predictions(self) -> PredictionsResourceWithRawResponse: @@ -1006,9 +915,6 @@ def __init__(self, deployments: AsyncDeploymentsResource) -> None: self.get = async_to_raw_response_wrapper( deployments.get, ) - self.list_em_all = async_to_raw_response_wrapper( - deployments.list_em_all, - ) @cached_property def predictions(self) -> AsyncPredictionsResourceWithRawResponse: @@ -1034,9 +940,6 @@ def __init__(self, deployments: DeploymentsResource) -> None: self.get = to_streamed_response_wrapper( deployments.get, ) - self.list_em_all = to_streamed_response_wrapper( - deployments.list_em_all, - ) @cached_property def predictions(self) -> PredictionsResourceWithStreamingResponse: @@ -1062,9 +965,6 @@ def __init__(self, deployments: AsyncDeploymentsResource) -> None: self.get = async_to_streamed_response_wrapper( deployments.get, ) - self.list_em_all = async_to_streamed_response_wrapper( - deployments.list_em_all, - ) @cached_property def predictions(self) -> AsyncPredictionsResourceWithStreamingResponse: diff --git a/src/replicate/resources/hardware.py b/src/replicate/resources/hardware.py index 4bbd58c..3cea6e4 100644 --- a/src/replicate/resources/hardware.py +++ b/src/replicate/resources/hardware.py @@ -4,7 +4,7 @@ import httpx -from .._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven +from .._types import NOT_GIVEN, Body, Query, Headers, NotGiven from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -77,58 +77,6 @@ def list( cast_to=HardwareListResponse, ) - def retrieve_collections( - self, - collection_slug: 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> None: - """ - Example cURL request: - - ```console - curl -s \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - https://api.replicate.com/v1/collections/super-resolution - ``` - - The response will be a collection object with a nested list of the models in - that collection: - - ```json - { - "name": "Super resolution", - "slug": "super-resolution", - "description": "Upscaling models that create high-quality images from low-quality images.", - "models": [...] - } - ``` - - Args: - 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 - """ - if not collection_slug: - raise ValueError(f"Expected a non-empty value for `collection_slug` but received {collection_slug!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._get( - f"/collections/{collection_slug}", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - class AsyncHardwareResource(AsyncAPIResource): @cached_property @@ -188,58 +136,6 @@ async def list( cast_to=HardwareListResponse, ) - async def retrieve_collections( - self, - collection_slug: 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> None: - """ - Example cURL request: - - ```console - curl -s \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - https://api.replicate.com/v1/collections/super-resolution - ``` - - The response will be a collection object with a nested list of the models in - that collection: - - ```json - { - "name": "Super resolution", - "slug": "super-resolution", - "description": "Upscaling models that create high-quality images from low-quality images.", - "models": [...] - } - ``` - - Args: - 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 - """ - if not collection_slug: - raise ValueError(f"Expected a non-empty value for `collection_slug` but received {collection_slug!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._get( - f"/collections/{collection_slug}", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - class HardwareResourceWithRawResponse: def __init__(self, hardware: HardwareResource) -> None: @@ -248,9 +144,6 @@ def __init__(self, hardware: HardwareResource) -> None: self.list = to_raw_response_wrapper( hardware.list, ) - self.retrieve_collections = to_raw_response_wrapper( - hardware.retrieve_collections, - ) class AsyncHardwareResourceWithRawResponse: @@ -260,9 +153,6 @@ def __init__(self, hardware: AsyncHardwareResource) -> None: self.list = async_to_raw_response_wrapper( hardware.list, ) - self.retrieve_collections = async_to_raw_response_wrapper( - hardware.retrieve_collections, - ) class HardwareResourceWithStreamingResponse: @@ -272,9 +162,6 @@ def __init__(self, hardware: HardwareResource) -> None: self.list = to_streamed_response_wrapper( hardware.list, ) - self.retrieve_collections = to_streamed_response_wrapper( - hardware.retrieve_collections, - ) class AsyncHardwareResourceWithStreamingResponse: @@ -284,6 +171,3 @@ def __init__(self, hardware: AsyncHardwareResource) -> None: self.list = async_to_streamed_response_wrapper( hardware.list, ) - self.retrieve_collections = async_to_streamed_response_wrapper( - hardware.retrieve_collections, - ) diff --git a/src/replicate/resources/models/__init__.py b/src/replicate/resources/models/__init__.py index 8afd09c..6241ca2 100644 --- a/src/replicate/resources/models/__init__.py +++ b/src/replicate/resources/models/__init__.py @@ -32,6 +32,14 @@ VersionsResourceWithStreamingResponse, AsyncVersionsResourceWithStreamingResponse, ) +from .predictions import ( + PredictionsResource, + AsyncPredictionsResource, + PredictionsResourceWithRawResponse, + AsyncPredictionsResourceWithRawResponse, + PredictionsResourceWithStreamingResponse, + AsyncPredictionsResourceWithStreamingResponse, +) __all__ = [ "ExamplesResource", @@ -40,6 +48,12 @@ "AsyncExamplesResourceWithRawResponse", "ExamplesResourceWithStreamingResponse", "AsyncExamplesResourceWithStreamingResponse", + "PredictionsResource", + "AsyncPredictionsResource", + "PredictionsResourceWithRawResponse", + "AsyncPredictionsResourceWithRawResponse", + "PredictionsResourceWithStreamingResponse", + "AsyncPredictionsResourceWithStreamingResponse", "ReadmeResource", "AsyncReadmeResource", "ReadmeResourceWithRawResponse", diff --git a/src/replicate/resources/models/models.py b/src/replicate/resources/models/models.py index df1bf42..e309f37 100644 --- a/src/replicate/resources/models/models.py +++ b/src/replicate/resources/models/models.py @@ -2,7 +2,6 @@ from __future__ import annotations -from typing import List from typing_extensions import Literal import httpx @@ -15,9 +14,9 @@ ReadmeResourceWithStreamingResponse, AsyncReadmeResourceWithStreamingResponse, ) -from ...types import model_create_params, model_create_prediction_params +from ...types import model_create_params from ..._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven -from ..._utils import maybe_transform, strip_not_given, async_maybe_transform +from ..._utils import maybe_transform, async_maybe_transform from .examples import ( ExamplesResource, AsyncExamplesResource, @@ -42,9 +41,16 @@ async_to_raw_response_wrapper, async_to_streamed_response_wrapper, ) +from .predictions import ( + PredictionsResource, + AsyncPredictionsResource, + PredictionsResourceWithRawResponse, + AsyncPredictionsResourceWithRawResponse, + PredictionsResourceWithStreamingResponse, + AsyncPredictionsResourceWithStreamingResponse, +) from ...pagination import SyncCursorURLPage, AsyncCursorURLPage from ..._base_client import AsyncPaginator, make_request_options -from ...types.prediction import Prediction from ...types.model_list_response import ModelListResponse __all__ = ["ModelsResource", "AsyncModelsResource"] @@ -55,6 +61,10 @@ class ModelsResource(SyncAPIResource): def examples(self) -> ExamplesResource: return ExamplesResource(self._client) + @cached_property + def predictions(self) -> PredictionsResource: + return PredictionsResource(self._client) + @cached_property def readme(self) -> ReadmeResource: return ReadmeResource(self._client) @@ -285,146 +295,6 @@ def delete( cast_to=NoneType, ) - def create_prediction( - self, - model_name: str, - *, - model_owner: str, - input: object, - stream: bool | NotGiven = NOT_GIVEN, - webhook: str | NotGiven = NOT_GIVEN, - webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | NotGiven = NOT_GIVEN, - prefer: 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> Prediction: - """ - Create a prediction using an - [official model](https://replicate.com/changelog/2025-01-29-official-models). - - If you're _not_ running an official model, use the - [`predictions.create`](#predictions.create) operation instead. - - Example cURL request: - - ```console - curl -s -X POST -H 'Prefer: wait' \\ - -d '{"input": {"prompt": "Write a short poem about the weather."}}' \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - -H 'Content-Type: application/json' \\ - https://api.replicate.com/v1/models/meta/meta-llama-3-70b-instruct/predictions - ``` - - The request will wait up to 60 seconds for the model to run. If this time is - exceeded the prediction will be returned in a `"starting"` state and need to be - retrieved using the `predictions.get` endpiont. - - For a complete overview of the `deployments.predictions.create` API check out - our documentation on - [creating a prediction](https://replicate.com/docs/topics/predictions/create-a-prediction) - which covers a variety of use cases. - - Args: - input: The model's input as a JSON object. The input schema depends on what model you - are running. To see the available inputs, click the "API" tab on the model you - are running or [get the model version](#models.versions.get) and look at its - `openapi_schema` property. For example, - [stability-ai/sdxl](https://replicate.com/stability-ai/sdxl) takes `prompt` as - an input. - - Files should be passed as HTTP URLs or data URLs. - - Use an HTTP URL when: - - - you have a large file > 256kb - - you want to be able to use the file multiple times - - you want your prediction metadata to be associable with your input files - - Use a data URL when: - - - you have a small file <= 256kb - - you don't want to upload and host the file somewhere - - you don't need to use the file again (Replicate will not store it) - - stream: **This field is deprecated.** - - Request a URL to receive streaming output using - [server-sent events (SSE)](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events). - - This field is no longer needed as the returned prediction will always have a - `stream` entry in its `url` property if the model supports streaming. - - webhook: An HTTPS URL for receiving a webhook when the prediction has new output. The - webhook will be a POST request where the request body is the same as the - response body of the [get prediction](#predictions.get) operation. If there are - network problems, we will retry the webhook a few times, so make sure it can be - safely called more than once. Replicate will not follow redirects when sending - webhook requests to your service, so be sure to specify a URL that will resolve - without redirecting. - - webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new - outputs or the prediction has finished. You can change which events trigger - webhook requests by specifying `webhook_events_filter` in the prediction - request: - - - `start`: immediately on prediction start - - `output`: each time a prediction generates an output (note that predictions - can generate multiple outputs) - - `logs`: each time log output is generated by a prediction - - `completed`: when the prediction reaches a terminal state - (succeeded/canceled/failed) - - For example, if you only wanted requests to be sent at the start and end of the - prediction, you would provide: - - ```json - { - "input": { - "text": "Alice" - }, - "webhook": "https://example.com/my-webhook", - "webhook_events_filter": ["start", "completed"] - } - ``` - - Requests for event types `output` and `logs` will be sent at most once every - 500ms. If you request `start` and `completed` webhooks, then they'll always be - sent regardless of throttling. - - 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 - """ - if not model_owner: - raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") - if not model_name: - raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") - extra_headers = {**strip_not_given({"Prefer": prefer}), **(extra_headers or {})} - return self._post( - f"/models/{model_owner}/{model_name}/predictions", - body=maybe_transform( - { - "input": input, - "stream": stream, - "webhook": webhook, - "webhook_events_filter": webhook_events_filter, - }, - model_create_prediction_params.ModelCreatePredictionParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=Prediction, - ) - def get( self, model_name: str, @@ -540,6 +410,10 @@ class AsyncModelsResource(AsyncAPIResource): def examples(self) -> AsyncExamplesResource: return AsyncExamplesResource(self._client) + @cached_property + def predictions(self) -> AsyncPredictionsResource: + return AsyncPredictionsResource(self._client) + @cached_property def readme(self) -> AsyncReadmeResource: return AsyncReadmeResource(self._client) @@ -770,146 +644,6 @@ async def delete( cast_to=NoneType, ) - async def create_prediction( - self, - model_name: str, - *, - model_owner: str, - input: object, - stream: bool | NotGiven = NOT_GIVEN, - webhook: str | NotGiven = NOT_GIVEN, - webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | NotGiven = NOT_GIVEN, - prefer: 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> Prediction: - """ - Create a prediction using an - [official model](https://replicate.com/changelog/2025-01-29-official-models). - - If you're _not_ running an official model, use the - [`predictions.create`](#predictions.create) operation instead. - - Example cURL request: - - ```console - curl -s -X POST -H 'Prefer: wait' \\ - -d '{"input": {"prompt": "Write a short poem about the weather."}}' \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - -H 'Content-Type: application/json' \\ - https://api.replicate.com/v1/models/meta/meta-llama-3-70b-instruct/predictions - ``` - - The request will wait up to 60 seconds for the model to run. If this time is - exceeded the prediction will be returned in a `"starting"` state and need to be - retrieved using the `predictions.get` endpiont. - - For a complete overview of the `deployments.predictions.create` API check out - our documentation on - [creating a prediction](https://replicate.com/docs/topics/predictions/create-a-prediction) - which covers a variety of use cases. - - Args: - input: The model's input as a JSON object. The input schema depends on what model you - are running. To see the available inputs, click the "API" tab on the model you - are running or [get the model version](#models.versions.get) and look at its - `openapi_schema` property. For example, - [stability-ai/sdxl](https://replicate.com/stability-ai/sdxl) takes `prompt` as - an input. - - Files should be passed as HTTP URLs or data URLs. - - Use an HTTP URL when: - - - you have a large file > 256kb - - you want to be able to use the file multiple times - - you want your prediction metadata to be associable with your input files - - Use a data URL when: - - - you have a small file <= 256kb - - you don't want to upload and host the file somewhere - - you don't need to use the file again (Replicate will not store it) - - stream: **This field is deprecated.** - - Request a URL to receive streaming output using - [server-sent events (SSE)](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events). - - This field is no longer needed as the returned prediction will always have a - `stream` entry in its `url` property if the model supports streaming. - - webhook: An HTTPS URL for receiving a webhook when the prediction has new output. The - webhook will be a POST request where the request body is the same as the - response body of the [get prediction](#predictions.get) operation. If there are - network problems, we will retry the webhook a few times, so make sure it can be - safely called more than once. Replicate will not follow redirects when sending - webhook requests to your service, so be sure to specify a URL that will resolve - without redirecting. - - webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new - outputs or the prediction has finished. You can change which events trigger - webhook requests by specifying `webhook_events_filter` in the prediction - request: - - - `start`: immediately on prediction start - - `output`: each time a prediction generates an output (note that predictions - can generate multiple outputs) - - `logs`: each time log output is generated by a prediction - - `completed`: when the prediction reaches a terminal state - (succeeded/canceled/failed) - - For example, if you only wanted requests to be sent at the start and end of the - prediction, you would provide: - - ```json - { - "input": { - "text": "Alice" - }, - "webhook": "https://example.com/my-webhook", - "webhook_events_filter": ["start", "completed"] - } - ``` - - Requests for event types `output` and `logs` will be sent at most once every - 500ms. If you request `start` and `completed` webhooks, then they'll always be - sent regardless of throttling. - - 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 - """ - if not model_owner: - raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") - if not model_name: - raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") - extra_headers = {**strip_not_given({"Prefer": prefer}), **(extra_headers or {})} - return await self._post( - f"/models/{model_owner}/{model_name}/predictions", - body=await async_maybe_transform( - { - "input": input, - "stream": stream, - "webhook": webhook, - "webhook_events_filter": webhook_events_filter, - }, - model_create_prediction_params.ModelCreatePredictionParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=Prediction, - ) - async def get( self, model_name: str, @@ -1033,9 +767,6 @@ def __init__(self, models: ModelsResource) -> None: self.delete = to_raw_response_wrapper( models.delete, ) - self.create_prediction = to_raw_response_wrapper( - models.create_prediction, - ) self.get = to_raw_response_wrapper( models.get, ) @@ -1044,6 +775,10 @@ def __init__(self, models: ModelsResource) -> None: def examples(self) -> ExamplesResourceWithRawResponse: return ExamplesResourceWithRawResponse(self._models.examples) + @cached_property + def predictions(self) -> PredictionsResourceWithRawResponse: + return PredictionsResourceWithRawResponse(self._models.predictions) + @cached_property def readme(self) -> ReadmeResourceWithRawResponse: return ReadmeResourceWithRawResponse(self._models.readme) @@ -1066,9 +801,6 @@ def __init__(self, models: AsyncModelsResource) -> None: self.delete = async_to_raw_response_wrapper( models.delete, ) - self.create_prediction = async_to_raw_response_wrapper( - models.create_prediction, - ) self.get = async_to_raw_response_wrapper( models.get, ) @@ -1077,6 +809,10 @@ def __init__(self, models: AsyncModelsResource) -> None: def examples(self) -> AsyncExamplesResourceWithRawResponse: return AsyncExamplesResourceWithRawResponse(self._models.examples) + @cached_property + def predictions(self) -> AsyncPredictionsResourceWithRawResponse: + return AsyncPredictionsResourceWithRawResponse(self._models.predictions) + @cached_property def readme(self) -> AsyncReadmeResourceWithRawResponse: return AsyncReadmeResourceWithRawResponse(self._models.readme) @@ -1099,9 +835,6 @@ def __init__(self, models: ModelsResource) -> None: self.delete = to_streamed_response_wrapper( models.delete, ) - self.create_prediction = to_streamed_response_wrapper( - models.create_prediction, - ) self.get = to_streamed_response_wrapper( models.get, ) @@ -1110,6 +843,10 @@ def __init__(self, models: ModelsResource) -> None: def examples(self) -> ExamplesResourceWithStreamingResponse: return ExamplesResourceWithStreamingResponse(self._models.examples) + @cached_property + def predictions(self) -> PredictionsResourceWithStreamingResponse: + return PredictionsResourceWithStreamingResponse(self._models.predictions) + @cached_property def readme(self) -> ReadmeResourceWithStreamingResponse: return ReadmeResourceWithStreamingResponse(self._models.readme) @@ -1132,9 +869,6 @@ def __init__(self, models: AsyncModelsResource) -> None: self.delete = async_to_streamed_response_wrapper( models.delete, ) - self.create_prediction = async_to_streamed_response_wrapper( - models.create_prediction, - ) self.get = async_to_streamed_response_wrapper( models.get, ) @@ -1143,6 +877,10 @@ def __init__(self, models: AsyncModelsResource) -> None: def examples(self) -> AsyncExamplesResourceWithStreamingResponse: return AsyncExamplesResourceWithStreamingResponse(self._models.examples) + @cached_property + def predictions(self) -> AsyncPredictionsResourceWithStreamingResponse: + return AsyncPredictionsResourceWithStreamingResponse(self._models.predictions) + @cached_property def readme(self) -> AsyncReadmeResourceWithStreamingResponse: return AsyncReadmeResourceWithStreamingResponse(self._models.readme) diff --git a/src/replicate/resources/models/predictions.py b/src/replicate/resources/models/predictions.py new file mode 100644 index 0000000..03d8e5b --- /dev/null +++ b/src/replicate/resources/models/predictions.py @@ -0,0 +1,382 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List +from typing_extensions import Literal + +import httpx + +from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from ..._utils import maybe_transform, strip_not_given, async_maybe_transform +from ..._compat import cached_property +from ..._resource import SyncAPIResource, AsyncAPIResource +from ..._response import ( + to_raw_response_wrapper, + to_streamed_response_wrapper, + async_to_raw_response_wrapper, + async_to_streamed_response_wrapper, +) +from ..._base_client import make_request_options +from ...types.models import prediction_create_params +from ...types.prediction import Prediction + +__all__ = ["PredictionsResource", "AsyncPredictionsResource"] + + +class PredictionsResource(SyncAPIResource): + @cached_property + def with_raw_response(self) -> PredictionsResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#accessing-raw-response-data-eg-headers + """ + return PredictionsResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> PredictionsResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#with_streaming_response + """ + return PredictionsResourceWithStreamingResponse(self) + + def create( + self, + model_name: str, + *, + model_owner: str, + input: object, + stream: bool | NotGiven = NOT_GIVEN, + webhook: str | NotGiven = NOT_GIVEN, + webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | NotGiven = NOT_GIVEN, + prefer: 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, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Prediction: + """ + Create a prediction using an + [official model](https://replicate.com/changelog/2025-01-29-official-models). + + If you're _not_ running an official model, use the + [`predictions.create`](#predictions.create) operation instead. + + Example cURL request: + + ```console + curl -s -X POST -H 'Prefer: wait' \\ + -d '{"input": {"prompt": "Write a short poem about the weather."}}' \\ + -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ + -H 'Content-Type: application/json' \\ + https://api.replicate.com/v1/models/meta/meta-llama-3-70b-instruct/predictions + ``` + + The request will wait up to 60 seconds for the model to run. If this time is + exceeded the prediction will be returned in a `"starting"` state and need to be + retrieved using the `predictions.get` endpiont. + + For a complete overview of the `deployments.predictions.create` API check out + our documentation on + [creating a prediction](https://replicate.com/docs/topics/predictions/create-a-prediction) + which covers a variety of use cases. + + Args: + input: The model's input as a JSON object. The input schema depends on what model you + are running. To see the available inputs, click the "API" tab on the model you + are running or [get the model version](#models.versions.get) and look at its + `openapi_schema` property. For example, + [stability-ai/sdxl](https://replicate.com/stability-ai/sdxl) takes `prompt` as + an input. + + Files should be passed as HTTP URLs or data URLs. + + Use an HTTP URL when: + + - you have a large file > 256kb + - you want to be able to use the file multiple times + - you want your prediction metadata to be associable with your input files + + Use a data URL when: + + - you have a small file <= 256kb + - you don't want to upload and host the file somewhere + - you don't need to use the file again (Replicate will not store it) + + stream: **This field is deprecated.** + + Request a URL to receive streaming output using + [server-sent events (SSE)](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events). + + This field is no longer needed as the returned prediction will always have a + `stream` entry in its `url` property if the model supports streaming. + + webhook: An HTTPS URL for receiving a webhook when the prediction has new output. The + webhook will be a POST request where the request body is the same as the + response body of the [get prediction](#predictions.get) operation. If there are + network problems, we will retry the webhook a few times, so make sure it can be + safely called more than once. Replicate will not follow redirects when sending + webhook requests to your service, so be sure to specify a URL that will resolve + without redirecting. + + webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new + outputs or the prediction has finished. You can change which events trigger + webhook requests by specifying `webhook_events_filter` in the prediction + request: + + - `start`: immediately on prediction start + - `output`: each time a prediction generates an output (note that predictions + can generate multiple outputs) + - `logs`: each time log output is generated by a prediction + - `completed`: when the prediction reaches a terminal state + (succeeded/canceled/failed) + + For example, if you only wanted requests to be sent at the start and end of the + prediction, you would provide: + + ```json + { + "input": { + "text": "Alice" + }, + "webhook": "https://example.com/my-webhook", + "webhook_events_filter": ["start", "completed"] + } + ``` + + Requests for event types `output` and `logs` will be sent at most once every + 500ms. If you request `start` and `completed` webhooks, then they'll always be + sent regardless of throttling. + + 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 + """ + if not model_owner: + raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") + if not model_name: + raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") + extra_headers = {**strip_not_given({"Prefer": prefer}), **(extra_headers or {})} + return self._post( + f"/models/{model_owner}/{model_name}/predictions", + body=maybe_transform( + { + "input": input, + "stream": stream, + "webhook": webhook, + "webhook_events_filter": webhook_events_filter, + }, + prediction_create_params.PredictionCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Prediction, + ) + + +class AsyncPredictionsResource(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncPredictionsResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#accessing-raw-response-data-eg-headers + """ + return AsyncPredictionsResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncPredictionsResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#with_streaming_response + """ + return AsyncPredictionsResourceWithStreamingResponse(self) + + async def create( + self, + model_name: str, + *, + model_owner: str, + input: object, + stream: bool | NotGiven = NOT_GIVEN, + webhook: str | NotGiven = NOT_GIVEN, + webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | NotGiven = NOT_GIVEN, + prefer: 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, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Prediction: + """ + Create a prediction using an + [official model](https://replicate.com/changelog/2025-01-29-official-models). + + If you're _not_ running an official model, use the + [`predictions.create`](#predictions.create) operation instead. + + Example cURL request: + + ```console + curl -s -X POST -H 'Prefer: wait' \\ + -d '{"input": {"prompt": "Write a short poem about the weather."}}' \\ + -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ + -H 'Content-Type: application/json' \\ + https://api.replicate.com/v1/models/meta/meta-llama-3-70b-instruct/predictions + ``` + + The request will wait up to 60 seconds for the model to run. If this time is + exceeded the prediction will be returned in a `"starting"` state and need to be + retrieved using the `predictions.get` endpiont. + + For a complete overview of the `deployments.predictions.create` API check out + our documentation on + [creating a prediction](https://replicate.com/docs/topics/predictions/create-a-prediction) + which covers a variety of use cases. + + Args: + input: The model's input as a JSON object. The input schema depends on what model you + are running. To see the available inputs, click the "API" tab on the model you + are running or [get the model version](#models.versions.get) and look at its + `openapi_schema` property. For example, + [stability-ai/sdxl](https://replicate.com/stability-ai/sdxl) takes `prompt` as + an input. + + Files should be passed as HTTP URLs or data URLs. + + Use an HTTP URL when: + + - you have a large file > 256kb + - you want to be able to use the file multiple times + - you want your prediction metadata to be associable with your input files + + Use a data URL when: + + - you have a small file <= 256kb + - you don't want to upload and host the file somewhere + - you don't need to use the file again (Replicate will not store it) + + stream: **This field is deprecated.** + + Request a URL to receive streaming output using + [server-sent events (SSE)](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events). + + This field is no longer needed as the returned prediction will always have a + `stream` entry in its `url` property if the model supports streaming. + + webhook: An HTTPS URL for receiving a webhook when the prediction has new output. The + webhook will be a POST request where the request body is the same as the + response body of the [get prediction](#predictions.get) operation. If there are + network problems, we will retry the webhook a few times, so make sure it can be + safely called more than once. Replicate will not follow redirects when sending + webhook requests to your service, so be sure to specify a URL that will resolve + without redirecting. + + webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new + outputs or the prediction has finished. You can change which events trigger + webhook requests by specifying `webhook_events_filter` in the prediction + request: + + - `start`: immediately on prediction start + - `output`: each time a prediction generates an output (note that predictions + can generate multiple outputs) + - `logs`: each time log output is generated by a prediction + - `completed`: when the prediction reaches a terminal state + (succeeded/canceled/failed) + + For example, if you only wanted requests to be sent at the start and end of the + prediction, you would provide: + + ```json + { + "input": { + "text": "Alice" + }, + "webhook": "https://example.com/my-webhook", + "webhook_events_filter": ["start", "completed"] + } + ``` + + Requests for event types `output` and `logs` will be sent at most once every + 500ms. If you request `start` and `completed` webhooks, then they'll always be + sent regardless of throttling. + + 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 + """ + if not model_owner: + raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") + if not model_name: + raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") + extra_headers = {**strip_not_given({"Prefer": prefer}), **(extra_headers or {})} + return await self._post( + f"/models/{model_owner}/{model_name}/predictions", + body=await async_maybe_transform( + { + "input": input, + "stream": stream, + "webhook": webhook, + "webhook_events_filter": webhook_events_filter, + }, + prediction_create_params.PredictionCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Prediction, + ) + + +class PredictionsResourceWithRawResponse: + def __init__(self, predictions: PredictionsResource) -> None: + self._predictions = predictions + + self.create = to_raw_response_wrapper( + predictions.create, + ) + + +class AsyncPredictionsResourceWithRawResponse: + def __init__(self, predictions: AsyncPredictionsResource) -> None: + self._predictions = predictions + + self.create = async_to_raw_response_wrapper( + predictions.create, + ) + + +class PredictionsResourceWithStreamingResponse: + def __init__(self, predictions: PredictionsResource) -> None: + self._predictions = predictions + + self.create = to_streamed_response_wrapper( + predictions.create, + ) + + +class AsyncPredictionsResourceWithStreamingResponse: + def __init__(self, predictions: AsyncPredictionsResource) -> None: + self._predictions = predictions + + self.create = async_to_streamed_response_wrapper( + predictions.create, + ) diff --git a/src/replicate/resources/models/versions.py b/src/replicate/resources/models/versions.py index 308d04b..294664e 100644 --- a/src/replicate/resources/models/versions.py +++ b/src/replicate/resources/models/versions.py @@ -2,13 +2,9 @@ from __future__ import annotations -from typing import List -from typing_extensions import Literal - import httpx from ..._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven -from ..._utils import maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -18,8 +14,6 @@ async_to_streamed_response_wrapper, ) from ..._base_client import make_request_options -from ...types.models import version_create_training_params -from ...types.models.version_create_training_response import VersionCreateTrainingResponse __all__ = ["VersionsResource", "AsyncVersionsResource"] @@ -168,156 +162,6 @@ def delete( cast_to=NoneType, ) - def create_training( - self, - version_id: str, - *, - model_owner: str, - model_name: str, - destination: str, - input: object, - webhook: str | NotGiven = NOT_GIVEN, - webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> VersionCreateTrainingResponse: - """ - Start a new training of the model version you specify. - - Example request body: - - ```json - { - "destination": "{new_owner}/{new_name}", - "input": { - "train_data": "https://example.com/my-input-images.zip" - }, - "webhook": "https://example.com/my-webhook" - } - ``` - - Example cURL request: - - ```console - curl -s -X POST \\ - -d '{"destination": "{new_owner}/{new_name}", "input": {"input_images": "https://example.com/my-input-images.zip"}}' \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - -H 'Content-Type: application/json' \\ - https://api.replicate.com/v1/models/stability-ai/sdxl/versions/da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf/trainings - ``` - - The response will be the training object: - - ```json - { - "id": "zz4ibbonubfz7carwiefibzgga", - "model": "stability-ai/sdxl", - "version": "da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf", - "input": { - "input_images": "https://example.com/my-input-images.zip" - }, - "logs": "", - "error": null, - "status": "starting", - "created_at": "2023-09-08T16:32:56.990893084Z", - "urls": { - "cancel": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga/cancel", - "get": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga" - } - } - ``` - - As models can take several minutes or more to train, the result will not be - available immediately. To get the final result of the training you should either - provide a `webhook` HTTPS URL for us to call when the results are ready, or poll - the [get a training](#trainings.get) endpoint until it has finished. - - When a training completes, it creates a new - [version](https://replicate.com/docs/how-does-replicate-work#terminology) of the - model at the specified destination. - - To find some models to train on, check out the - [trainable language models collection](https://replicate.com/collections/trainable-language-models). - - Args: - destination: A string representing the desired model to push to in the format - `{destination_model_owner}/{destination_model_name}`. This should be an existing - model owned by the user or organization making the API request. If the - destination is invalid, the server will return an appropriate 4XX response. - - input: An object containing inputs to the Cog model's `train()` function. - - webhook: An HTTPS URL for receiving a webhook when the training completes. The webhook - will be a POST request where the request body is the same as the response body - of the [get training](#trainings.get) operation. If there are network problems, - we will retry the webhook a few times, so make sure it can be safely called more - than once. Replicate will not follow redirects when sending webhook requests to - your service, so be sure to specify a URL that will resolve without redirecting. - - webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new - outputs or the training has finished. You can change which events trigger - webhook requests by specifying `webhook_events_filter` in the training request: - - - `start`: immediately on training start - - `output`: each time a training generates an output (note that trainings can - generate multiple outputs) - - `logs`: each time log output is generated by a training - - `completed`: when the training reaches a terminal state - (succeeded/canceled/failed) - - For example, if you only wanted requests to be sent at the start and end of the - training, you would provide: - - ```json - { - "destination": "my-organization/my-model", - "input": { - "text": "Alice" - }, - "webhook": "https://example.com/my-webhook", - "webhook_events_filter": ["start", "completed"] - } - ``` - - Requests for event types `output` and `logs` will be sent at most once every - 500ms. If you request `start` and `completed` webhooks, then they'll always be - sent regardless of throttling. - - 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 - """ - if not model_owner: - raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") - if not model_name: - raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") - if not version_id: - raise ValueError(f"Expected a non-empty value for `version_id` but received {version_id!r}") - return self._post( - f"/models/{model_owner}/{model_name}/versions/{version_id}/trainings", - body=maybe_transform( - { - "destination": destination, - "input": input, - "webhook": webhook, - "webhook_events_filter": webhook_events_filter, - }, - version_create_training_params.VersionCreateTrainingParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=VersionCreateTrainingResponse, - ) - def get( self, version_id: str, @@ -558,156 +402,6 @@ async def delete( cast_to=NoneType, ) - async def create_training( - self, - version_id: str, - *, - model_owner: str, - model_name: str, - destination: str, - input: object, - webhook: str | NotGiven = NOT_GIVEN, - webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | 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, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> VersionCreateTrainingResponse: - """ - Start a new training of the model version you specify. - - Example request body: - - ```json - { - "destination": "{new_owner}/{new_name}", - "input": { - "train_data": "https://example.com/my-input-images.zip" - }, - "webhook": "https://example.com/my-webhook" - } - ``` - - Example cURL request: - - ```console - curl -s -X POST \\ - -d '{"destination": "{new_owner}/{new_name}", "input": {"input_images": "https://example.com/my-input-images.zip"}}' \\ - -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ - -H 'Content-Type: application/json' \\ - https://api.replicate.com/v1/models/stability-ai/sdxl/versions/da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf/trainings - ``` - - The response will be the training object: - - ```json - { - "id": "zz4ibbonubfz7carwiefibzgga", - "model": "stability-ai/sdxl", - "version": "da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf", - "input": { - "input_images": "https://example.com/my-input-images.zip" - }, - "logs": "", - "error": null, - "status": "starting", - "created_at": "2023-09-08T16:32:56.990893084Z", - "urls": { - "cancel": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga/cancel", - "get": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga" - } - } - ``` - - As models can take several minutes or more to train, the result will not be - available immediately. To get the final result of the training you should either - provide a `webhook` HTTPS URL for us to call when the results are ready, or poll - the [get a training](#trainings.get) endpoint until it has finished. - - When a training completes, it creates a new - [version](https://replicate.com/docs/how-does-replicate-work#terminology) of the - model at the specified destination. - - To find some models to train on, check out the - [trainable language models collection](https://replicate.com/collections/trainable-language-models). - - Args: - destination: A string representing the desired model to push to in the format - `{destination_model_owner}/{destination_model_name}`. This should be an existing - model owned by the user or organization making the API request. If the - destination is invalid, the server will return an appropriate 4XX response. - - input: An object containing inputs to the Cog model's `train()` function. - - webhook: An HTTPS URL for receiving a webhook when the training completes. The webhook - will be a POST request where the request body is the same as the response body - of the [get training](#trainings.get) operation. If there are network problems, - we will retry the webhook a few times, so make sure it can be safely called more - than once. Replicate will not follow redirects when sending webhook requests to - your service, so be sure to specify a URL that will resolve without redirecting. - - webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new - outputs or the training has finished. You can change which events trigger - webhook requests by specifying `webhook_events_filter` in the training request: - - - `start`: immediately on training start - - `output`: each time a training generates an output (note that trainings can - generate multiple outputs) - - `logs`: each time log output is generated by a training - - `completed`: when the training reaches a terminal state - (succeeded/canceled/failed) - - For example, if you only wanted requests to be sent at the start and end of the - training, you would provide: - - ```json - { - "destination": "my-organization/my-model", - "input": { - "text": "Alice" - }, - "webhook": "https://example.com/my-webhook", - "webhook_events_filter": ["start", "completed"] - } - ``` - - Requests for event types `output` and `logs` will be sent at most once every - 500ms. If you request `start` and `completed` webhooks, then they'll always be - sent regardless of throttling. - - 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 - """ - if not model_owner: - raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") - if not model_name: - raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") - if not version_id: - raise ValueError(f"Expected a non-empty value for `version_id` but received {version_id!r}") - return await self._post( - f"/models/{model_owner}/{model_name}/versions/{version_id}/trainings", - body=await async_maybe_transform( - { - "destination": destination, - "input": input, - "webhook": webhook, - "webhook_events_filter": webhook_events_filter, - }, - version_create_training_params.VersionCreateTrainingParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=VersionCreateTrainingResponse, - ) - async def get( self, version_id: str, @@ -814,9 +508,6 @@ def __init__(self, versions: VersionsResource) -> None: self.delete = to_raw_response_wrapper( versions.delete, ) - self.create_training = to_raw_response_wrapper( - versions.create_training, - ) self.get = to_raw_response_wrapper( versions.get, ) @@ -832,9 +523,6 @@ def __init__(self, versions: AsyncVersionsResource) -> None: self.delete = async_to_raw_response_wrapper( versions.delete, ) - self.create_training = async_to_raw_response_wrapper( - versions.create_training, - ) self.get = async_to_raw_response_wrapper( versions.get, ) @@ -850,9 +538,6 @@ def __init__(self, versions: VersionsResource) -> None: self.delete = to_streamed_response_wrapper( versions.delete, ) - self.create_training = to_streamed_response_wrapper( - versions.create_training, - ) self.get = to_streamed_response_wrapper( versions.get, ) @@ -868,9 +553,6 @@ def __init__(self, versions: AsyncVersionsResource) -> None: self.delete = async_to_streamed_response_wrapper( versions.delete, ) - self.create_training = async_to_streamed_response_wrapper( - versions.create_training, - ) self.get = async_to_streamed_response_wrapper( versions.get, ) diff --git a/src/replicate/resources/trainings.py b/src/replicate/resources/trainings.py index 5a357af..4b9d127 100644 --- a/src/replicate/resources/trainings.py +++ b/src/replicate/resources/trainings.py @@ -2,9 +2,14 @@ from __future__ import annotations +from typing import List +from typing_extensions import Literal + import httpx +from ..types import training_create_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 ( @@ -18,6 +23,7 @@ from ..types.training_get_response import TrainingGetResponse from ..types.training_list_response import TrainingListResponse from ..types.training_cancel_response import TrainingCancelResponse +from ..types.training_create_response import TrainingCreateResponse __all__ = ["TrainingsResource", "AsyncTrainingsResource"] @@ -42,6 +48,156 @@ def with_streaming_response(self) -> TrainingsResourceWithStreamingResponse: """ return TrainingsResourceWithStreamingResponse(self) + def create( + self, + version_id: str, + *, + model_owner: str, + model_name: str, + destination: str, + input: object, + webhook: str | NotGiven = NOT_GIVEN, + webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | 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, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> TrainingCreateResponse: + """ + Start a new training of the model version you specify. + + Example request body: + + ```json + { + "destination": "{new_owner}/{new_name}", + "input": { + "train_data": "https://example.com/my-input-images.zip" + }, + "webhook": "https://example.com/my-webhook" + } + ``` + + Example cURL request: + + ```console + curl -s -X POST \\ + -d '{"destination": "{new_owner}/{new_name}", "input": {"input_images": "https://example.com/my-input-images.zip"}}' \\ + -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ + -H 'Content-Type: application/json' \\ + https://api.replicate.com/v1/models/stability-ai/sdxl/versions/da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf/trainings + ``` + + The response will be the training object: + + ```json + { + "id": "zz4ibbonubfz7carwiefibzgga", + "model": "stability-ai/sdxl", + "version": "da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf", + "input": { + "input_images": "https://example.com/my-input-images.zip" + }, + "logs": "", + "error": null, + "status": "starting", + "created_at": "2023-09-08T16:32:56.990893084Z", + "urls": { + "cancel": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga/cancel", + "get": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga" + } + } + ``` + + As models can take several minutes or more to train, the result will not be + available immediately. To get the final result of the training you should either + provide a `webhook` HTTPS URL for us to call when the results are ready, or poll + the [get a training](#trainings.get) endpoint until it has finished. + + When a training completes, it creates a new + [version](https://replicate.com/docs/how-does-replicate-work#terminology) of the + model at the specified destination. + + To find some models to train on, check out the + [trainable language models collection](https://replicate.com/collections/trainable-language-models). + + Args: + destination: A string representing the desired model to push to in the format + `{destination_model_owner}/{destination_model_name}`. This should be an existing + model owned by the user or organization making the API request. If the + destination is invalid, the server will return an appropriate 4XX response. + + input: An object containing inputs to the Cog model's `train()` function. + + webhook: An HTTPS URL for receiving a webhook when the training completes. The webhook + will be a POST request where the request body is the same as the response body + of the [get training](#trainings.get) operation. If there are network problems, + we will retry the webhook a few times, so make sure it can be safely called more + than once. Replicate will not follow redirects when sending webhook requests to + your service, so be sure to specify a URL that will resolve without redirecting. + + webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new + outputs or the training has finished. You can change which events trigger + webhook requests by specifying `webhook_events_filter` in the training request: + + - `start`: immediately on training start + - `output`: each time a training generates an output (note that trainings can + generate multiple outputs) + - `logs`: each time log output is generated by a training + - `completed`: when the training reaches a terminal state + (succeeded/canceled/failed) + + For example, if you only wanted requests to be sent at the start and end of the + training, you would provide: + + ```json + { + "destination": "my-organization/my-model", + "input": { + "text": "Alice" + }, + "webhook": "https://example.com/my-webhook", + "webhook_events_filter": ["start", "completed"] + } + ``` + + Requests for event types `output` and `logs` will be sent at most once every + 500ms. If you request `start` and `completed` webhooks, then they'll always be + sent regardless of throttling. + + 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 + """ + if not model_owner: + raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") + if not model_name: + raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") + if not version_id: + raise ValueError(f"Expected a non-empty value for `version_id` but received {version_id!r}") + return self._post( + f"/models/{model_owner}/{model_name}/versions/{version_id}/trainings", + body=maybe_transform( + { + "destination": destination, + "input": input, + "webhook": webhook, + "webhook_events_filter": webhook_events_filter, + }, + training_create_params.TrainingCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=TrainingCreateResponse, + ) + def list( self, *, @@ -273,6 +429,156 @@ def with_streaming_response(self) -> AsyncTrainingsResourceWithStreamingResponse """ return AsyncTrainingsResourceWithStreamingResponse(self) + async def create( + self, + version_id: str, + *, + model_owner: str, + model_name: str, + destination: str, + input: object, + webhook: str | NotGiven = NOT_GIVEN, + webhook_events_filter: List[Literal["start", "output", "logs", "completed"]] | 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, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> TrainingCreateResponse: + """ + Start a new training of the model version you specify. + + Example request body: + + ```json + { + "destination": "{new_owner}/{new_name}", + "input": { + "train_data": "https://example.com/my-input-images.zip" + }, + "webhook": "https://example.com/my-webhook" + } + ``` + + Example cURL request: + + ```console + curl -s -X POST \\ + -d '{"destination": "{new_owner}/{new_name}", "input": {"input_images": "https://example.com/my-input-images.zip"}}' \\ + -H "Authorization: Bearer $REPLICATE_API_TOKEN" \\ + -H 'Content-Type: application/json' \\ + https://api.replicate.com/v1/models/stability-ai/sdxl/versions/da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf/trainings + ``` + + The response will be the training object: + + ```json + { + "id": "zz4ibbonubfz7carwiefibzgga", + "model": "stability-ai/sdxl", + "version": "da77bc59ee60423279fd632efb4795ab731d9e3ca9705ef3341091fb989b7eaf", + "input": { + "input_images": "https://example.com/my-input-images.zip" + }, + "logs": "", + "error": null, + "status": "starting", + "created_at": "2023-09-08T16:32:56.990893084Z", + "urls": { + "cancel": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga/cancel", + "get": "https://api.replicate.com/v1/predictions/zz4ibbonubfz7carwiefibzgga" + } + } + ``` + + As models can take several minutes or more to train, the result will not be + available immediately. To get the final result of the training you should either + provide a `webhook` HTTPS URL for us to call when the results are ready, or poll + the [get a training](#trainings.get) endpoint until it has finished. + + When a training completes, it creates a new + [version](https://replicate.com/docs/how-does-replicate-work#terminology) of the + model at the specified destination. + + To find some models to train on, check out the + [trainable language models collection](https://replicate.com/collections/trainable-language-models). + + Args: + destination: A string representing the desired model to push to in the format + `{destination_model_owner}/{destination_model_name}`. This should be an existing + model owned by the user or organization making the API request. If the + destination is invalid, the server will return an appropriate 4XX response. + + input: An object containing inputs to the Cog model's `train()` function. + + webhook: An HTTPS URL for receiving a webhook when the training completes. The webhook + will be a POST request where the request body is the same as the response body + of the [get training](#trainings.get) operation. If there are network problems, + we will retry the webhook a few times, so make sure it can be safely called more + than once. Replicate will not follow redirects when sending webhook requests to + your service, so be sure to specify a URL that will resolve without redirecting. + + webhook_events_filter: By default, we will send requests to your webhook URL whenever there are new + outputs or the training has finished. You can change which events trigger + webhook requests by specifying `webhook_events_filter` in the training request: + + - `start`: immediately on training start + - `output`: each time a training generates an output (note that trainings can + generate multiple outputs) + - `logs`: each time log output is generated by a training + - `completed`: when the training reaches a terminal state + (succeeded/canceled/failed) + + For example, if you only wanted requests to be sent at the start and end of the + training, you would provide: + + ```json + { + "destination": "my-organization/my-model", + "input": { + "text": "Alice" + }, + "webhook": "https://example.com/my-webhook", + "webhook_events_filter": ["start", "completed"] + } + ``` + + Requests for event types `output` and `logs` will be sent at most once every + 500ms. If you request `start` and `completed` webhooks, then they'll always be + sent regardless of throttling. + + 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 + """ + if not model_owner: + raise ValueError(f"Expected a non-empty value for `model_owner` but received {model_owner!r}") + if not model_name: + raise ValueError(f"Expected a non-empty value for `model_name` but received {model_name!r}") + if not version_id: + raise ValueError(f"Expected a non-empty value for `version_id` but received {version_id!r}") + return await self._post( + f"/models/{model_owner}/{model_name}/versions/{version_id}/trainings", + body=await async_maybe_transform( + { + "destination": destination, + "input": input, + "webhook": webhook, + "webhook_events_filter": webhook_events_filter, + }, + training_create_params.TrainingCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=TrainingCreateResponse, + ) + def list( self, *, @@ -488,6 +794,9 @@ class TrainingsResourceWithRawResponse: def __init__(self, trainings: TrainingsResource) -> None: self._trainings = trainings + self.create = to_raw_response_wrapper( + trainings.create, + ) self.list = to_raw_response_wrapper( trainings.list, ) @@ -503,6 +812,9 @@ class AsyncTrainingsResourceWithRawResponse: def __init__(self, trainings: AsyncTrainingsResource) -> None: self._trainings = trainings + self.create = async_to_raw_response_wrapper( + trainings.create, + ) self.list = async_to_raw_response_wrapper( trainings.list, ) @@ -518,6 +830,9 @@ class TrainingsResourceWithStreamingResponse: def __init__(self, trainings: TrainingsResource) -> None: self._trainings = trainings + self.create = to_streamed_response_wrapper( + trainings.create, + ) self.list = to_streamed_response_wrapper( trainings.list, ) @@ -533,6 +848,9 @@ class AsyncTrainingsResourceWithStreamingResponse: def __init__(self, trainings: AsyncTrainingsResource) -> None: self._trainings = trainings + self.create = async_to_streamed_response_wrapper( + trainings.create, + ) self.list = async_to_streamed_response_wrapper( trainings.list, ) diff --git a/src/replicate/resources/webhooks/default/__init__.py b/src/replicate/resources/webhooks/default/__init__.py new file mode 100644 index 0000000..f3aa085 --- /dev/null +++ b/src/replicate/resources/webhooks/default/__init__.py @@ -0,0 +1,33 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from .secret import ( + SecretResource, + AsyncSecretResource, + SecretResourceWithRawResponse, + AsyncSecretResourceWithRawResponse, + SecretResourceWithStreamingResponse, + AsyncSecretResourceWithStreamingResponse, +) +from .default import ( + DefaultResource, + AsyncDefaultResource, + DefaultResourceWithRawResponse, + AsyncDefaultResourceWithRawResponse, + DefaultResourceWithStreamingResponse, + AsyncDefaultResourceWithStreamingResponse, +) + +__all__ = [ + "SecretResource", + "AsyncSecretResource", + "SecretResourceWithRawResponse", + "AsyncSecretResourceWithRawResponse", + "SecretResourceWithStreamingResponse", + "AsyncSecretResourceWithStreamingResponse", + "DefaultResource", + "AsyncDefaultResource", + "DefaultResourceWithRawResponse", + "AsyncDefaultResourceWithRawResponse", + "DefaultResourceWithStreamingResponse", + "AsyncDefaultResourceWithStreamingResponse", +] diff --git a/src/replicate/resources/webhooks/default/default.py b/src/replicate/resources/webhooks/default/default.py new file mode 100644 index 0000000..3c28ace --- /dev/null +++ b/src/replicate/resources/webhooks/default/default.py @@ -0,0 +1,102 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from .secret import ( + SecretResource, + AsyncSecretResource, + SecretResourceWithRawResponse, + AsyncSecretResourceWithRawResponse, + SecretResourceWithStreamingResponse, + AsyncSecretResourceWithStreamingResponse, +) +from ...._compat import cached_property +from ...._resource import SyncAPIResource, AsyncAPIResource + +__all__ = ["DefaultResource", "AsyncDefaultResource"] + + +class DefaultResource(SyncAPIResource): + @cached_property + def secret(self) -> SecretResource: + return SecretResource(self._client) + + @cached_property + def with_raw_response(self) -> DefaultResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#accessing-raw-response-data-eg-headers + """ + return DefaultResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> DefaultResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#with_streaming_response + """ + return DefaultResourceWithStreamingResponse(self) + + +class AsyncDefaultResource(AsyncAPIResource): + @cached_property + def secret(self) -> AsyncSecretResource: + return AsyncSecretResource(self._client) + + @cached_property + def with_raw_response(self) -> AsyncDefaultResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#accessing-raw-response-data-eg-headers + """ + return AsyncDefaultResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncDefaultResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/replicate/replicate-python-stainless#with_streaming_response + """ + return AsyncDefaultResourceWithStreamingResponse(self) + + +class DefaultResourceWithRawResponse: + def __init__(self, default: DefaultResource) -> None: + self._default = default + + @cached_property + def secret(self) -> SecretResourceWithRawResponse: + return SecretResourceWithRawResponse(self._default.secret) + + +class AsyncDefaultResourceWithRawResponse: + def __init__(self, default: AsyncDefaultResource) -> None: + self._default = default + + @cached_property + def secret(self) -> AsyncSecretResourceWithRawResponse: + return AsyncSecretResourceWithRawResponse(self._default.secret) + + +class DefaultResourceWithStreamingResponse: + def __init__(self, default: DefaultResource) -> None: + self._default = default + + @cached_property + def secret(self) -> SecretResourceWithStreamingResponse: + return SecretResourceWithStreamingResponse(self._default.secret) + + +class AsyncDefaultResourceWithStreamingResponse: + def __init__(self, default: AsyncDefaultResource) -> None: + self._default = default + + @cached_property + def secret(self) -> AsyncSecretResourceWithStreamingResponse: + return AsyncSecretResourceWithStreamingResponse(self._default.secret) diff --git a/src/replicate/resources/webhooks/default.py b/src/replicate/resources/webhooks/default/secret.py similarity index 64% rename from src/replicate/resources/webhooks/default.py rename to src/replicate/resources/webhooks/default/secret.py index bde9966..9430140 100644 --- a/src/replicate/resources/webhooks/default.py +++ b/src/replicate/resources/webhooks/default/secret.py @@ -4,42 +4,42 @@ import httpx -from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven -from ..._compat import cached_property -from ..._resource import SyncAPIResource, AsyncAPIResource -from ..._response import ( +from ...._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from ...._compat import cached_property +from ...._resource import SyncAPIResource, AsyncAPIResource +from ...._response import ( to_raw_response_wrapper, to_streamed_response_wrapper, async_to_raw_response_wrapper, async_to_streamed_response_wrapper, ) -from ..._base_client import make_request_options -from ...types.webhooks.default_retrieve_secret_response import DefaultRetrieveSecretResponse +from ...._base_client import make_request_options +from ....types.webhooks.default.secret_get_response import SecretGetResponse -__all__ = ["DefaultResource", "AsyncDefaultResource"] +__all__ = ["SecretResource", "AsyncSecretResource"] -class DefaultResource(SyncAPIResource): +class SecretResource(SyncAPIResource): @cached_property - def with_raw_response(self) -> DefaultResourceWithRawResponse: + def with_raw_response(self) -> SecretResourceWithRawResponse: """ This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. For more information, see https://www.github.com/replicate/replicate-python-stainless#accessing-raw-response-data-eg-headers """ - return DefaultResourceWithRawResponse(self) + return SecretResourceWithRawResponse(self) @cached_property - def with_streaming_response(self) -> DefaultResourceWithStreamingResponse: + def with_streaming_response(self) -> SecretResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/replicate/replicate-python-stainless#with_streaming_response """ - return DefaultResourceWithStreamingResponse(self) + return SecretResourceWithStreamingResponse(self) - def retrieve_secret( + def get( self, *, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -48,7 +48,7 @@ def retrieve_secret( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> DefaultRetrieveSecretResponse: + ) -> SecretGetResponse: """Get the signing secret for the default webhook endpoint. This is used to verify @@ -75,31 +75,31 @@ def retrieve_secret( options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=DefaultRetrieveSecretResponse, + cast_to=SecretGetResponse, ) -class AsyncDefaultResource(AsyncAPIResource): +class AsyncSecretResource(AsyncAPIResource): @cached_property - def with_raw_response(self) -> AsyncDefaultResourceWithRawResponse: + def with_raw_response(self) -> AsyncSecretResourceWithRawResponse: """ This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. For more information, see https://www.github.com/replicate/replicate-python-stainless#accessing-raw-response-data-eg-headers """ - return AsyncDefaultResourceWithRawResponse(self) + return AsyncSecretResourceWithRawResponse(self) @cached_property - def with_streaming_response(self) -> AsyncDefaultResourceWithStreamingResponse: + def with_streaming_response(self) -> AsyncSecretResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/replicate/replicate-python-stainless#with_streaming_response """ - return AsyncDefaultResourceWithStreamingResponse(self) + return AsyncSecretResourceWithStreamingResponse(self) - async def retrieve_secret( + async def get( self, *, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -108,7 +108,7 @@ async def retrieve_secret( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> DefaultRetrieveSecretResponse: + ) -> SecretGetResponse: """Get the signing secret for the default webhook endpoint. This is used to verify @@ -135,41 +135,41 @@ async def retrieve_secret( options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=DefaultRetrieveSecretResponse, + cast_to=SecretGetResponse, ) -class DefaultResourceWithRawResponse: - def __init__(self, default: DefaultResource) -> None: - self._default = default +class SecretResourceWithRawResponse: + def __init__(self, secret: SecretResource) -> None: + self._secret = secret - self.retrieve_secret = to_raw_response_wrapper( - default.retrieve_secret, + self.get = to_raw_response_wrapper( + secret.get, ) -class AsyncDefaultResourceWithRawResponse: - def __init__(self, default: AsyncDefaultResource) -> None: - self._default = default +class AsyncSecretResourceWithRawResponse: + def __init__(self, secret: AsyncSecretResource) -> None: + self._secret = secret - self.retrieve_secret = async_to_raw_response_wrapper( - default.retrieve_secret, + self.get = async_to_raw_response_wrapper( + secret.get, ) -class DefaultResourceWithStreamingResponse: - def __init__(self, default: DefaultResource) -> None: - self._default = default +class SecretResourceWithStreamingResponse: + def __init__(self, secret: SecretResource) -> None: + self._secret = secret - self.retrieve_secret = to_streamed_response_wrapper( - default.retrieve_secret, + self.get = to_streamed_response_wrapper( + secret.get, ) -class AsyncDefaultResourceWithStreamingResponse: - def __init__(self, default: AsyncDefaultResource) -> None: - self._default = default +class AsyncSecretResourceWithStreamingResponse: + def __init__(self, secret: AsyncSecretResource) -> None: + self._secret = secret - self.retrieve_secret = async_to_streamed_response_wrapper( - default.retrieve_secret, + self.get = async_to_streamed_response_wrapper( + secret.get, ) diff --git a/src/replicate/resources/webhooks/webhooks.py b/src/replicate/resources/webhooks/webhooks.py index f00d5b3..67ce252 100644 --- a/src/replicate/resources/webhooks/webhooks.py +++ b/src/replicate/resources/webhooks/webhooks.py @@ -2,7 +2,9 @@ from __future__ import annotations -from .default import ( +from ..._compat import cached_property +from ..._resource import SyncAPIResource, AsyncAPIResource +from .default.default import ( DefaultResource, AsyncDefaultResource, DefaultResourceWithRawResponse, @@ -10,8 +12,6 @@ DefaultResourceWithStreamingResponse, AsyncDefaultResourceWithStreamingResponse, ) -from ..._compat import cached_property -from ..._resource import SyncAPIResource, AsyncAPIResource __all__ = ["WebhooksResource", "AsyncWebhooksResource"] diff --git a/src/replicate/types/__init__.py b/src/replicate/types/__init__.py index fa8ee5d..3fe2c03 100644 --- a/src/replicate/types/__init__.py +++ b/src/replicate/types/__init__.py @@ -10,6 +10,7 @@ from .training_get_response import TrainingGetResponse as TrainingGetResponse from .hardware_list_response import HardwareListResponse as HardwareListResponse from .prediction_list_params import PredictionListParams as PredictionListParams +from .training_create_params import TrainingCreateParams as TrainingCreateParams from .training_list_response import TrainingListResponse as TrainingListResponse from .deployment_get_response import DeploymentGetResponse as DeploymentGetResponse from .deployment_create_params import DeploymentCreateParams as DeploymentCreateParams @@ -17,6 +18,6 @@ from .deployment_update_params import DeploymentUpdateParams as DeploymentUpdateParams from .prediction_create_params import PredictionCreateParams as PredictionCreateParams from .training_cancel_response import TrainingCancelResponse as TrainingCancelResponse +from .training_create_response import TrainingCreateResponse as TrainingCreateResponse from .deployment_create_response import DeploymentCreateResponse as DeploymentCreateResponse from .deployment_update_response import DeploymentUpdateResponse as DeploymentUpdateResponse -from .model_create_prediction_params import ModelCreatePredictionParams as ModelCreatePredictionParams diff --git a/src/replicate/types/models/__init__.py b/src/replicate/types/models/__init__.py index 05fbb6f..b53e1a7 100644 --- a/src/replicate/types/models/__init__.py +++ b/src/replicate/types/models/__init__.py @@ -3,5 +3,4 @@ from __future__ import annotations from .readme_get_response import ReadmeGetResponse as ReadmeGetResponse -from .version_create_training_params import VersionCreateTrainingParams as VersionCreateTrainingParams -from .version_create_training_response import VersionCreateTrainingResponse as VersionCreateTrainingResponse +from .prediction_create_params import PredictionCreateParams as PredictionCreateParams diff --git a/src/replicate/types/model_create_prediction_params.py b/src/replicate/types/models/prediction_create_params.py similarity index 96% rename from src/replicate/types/model_create_prediction_params.py rename to src/replicate/types/models/prediction_create_params.py index 32474b7..6b76121 100644 --- a/src/replicate/types/model_create_prediction_params.py +++ b/src/replicate/types/models/prediction_create_params.py @@ -5,12 +5,12 @@ from typing import List from typing_extensions import Literal, Required, Annotated, TypedDict -from .._utils import PropertyInfo +from ..._utils import PropertyInfo -__all__ = ["ModelCreatePredictionParams"] +__all__ = ["PredictionCreateParams"] -class ModelCreatePredictionParams(TypedDict, total=False): +class PredictionCreateParams(TypedDict, total=False): model_owner: Required[str] input: Required[object] diff --git a/src/replicate/types/models/version_create_training_params.py b/src/replicate/types/training_create_params.py similarity index 96% rename from src/replicate/types/models/version_create_training_params.py rename to src/replicate/types/training_create_params.py index 59e6146..38542fb 100644 --- a/src/replicate/types/models/version_create_training_params.py +++ b/src/replicate/types/training_create_params.py @@ -5,10 +5,10 @@ from typing import List from typing_extensions import Literal, Required, TypedDict -__all__ = ["VersionCreateTrainingParams"] +__all__ = ["TrainingCreateParams"] -class VersionCreateTrainingParams(TypedDict, total=False): +class TrainingCreateParams(TypedDict, total=False): model_owner: Required[str] model_name: Required[str] diff --git a/src/replicate/types/models/version_create_training_response.py b/src/replicate/types/training_create_response.py similarity index 92% rename from src/replicate/types/models/version_create_training_response.py rename to src/replicate/types/training_create_response.py index 5b005fe..d29e3fa 100644 --- a/src/replicate/types/models/version_create_training_response.py +++ b/src/replicate/types/training_create_response.py @@ -4,9 +4,9 @@ from datetime import datetime from typing_extensions import Literal -from ..._models import BaseModel +from .._models import BaseModel -__all__ = ["VersionCreateTrainingResponse", "Metrics", "Output", "URLs"] +__all__ = ["TrainingCreateResponse", "Metrics", "Output", "URLs"] class Metrics(BaseModel): @@ -30,7 +30,7 @@ class URLs(BaseModel): """URL to get the training details""" -class VersionCreateTrainingResponse(BaseModel): +class TrainingCreateResponse(BaseModel): id: Optional[str] = None """The unique ID of the training""" diff --git a/src/replicate/types/webhooks/__init__.py b/src/replicate/types/webhooks/__init__.py index f546bf5..f8ee8b1 100644 --- a/src/replicate/types/webhooks/__init__.py +++ b/src/replicate/types/webhooks/__init__.py @@ -1,5 +1,3 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations - -from .default_retrieve_secret_response import DefaultRetrieveSecretResponse as DefaultRetrieveSecretResponse diff --git a/src/replicate/types/webhooks/default/__init__.py b/src/replicate/types/webhooks/default/__init__.py new file mode 100644 index 0000000..70715e0 --- /dev/null +++ b/src/replicate/types/webhooks/default/__init__.py @@ -0,0 +1,5 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from .secret_get_response import SecretGetResponse as SecretGetResponse diff --git a/src/replicate/types/webhooks/default_retrieve_secret_response.py b/src/replicate/types/webhooks/default/secret_get_response.py similarity index 58% rename from src/replicate/types/webhooks/default_retrieve_secret_response.py rename to src/replicate/types/webhooks/default/secret_get_response.py index 7bd4744..0e4303c 100644 --- a/src/replicate/types/webhooks/default_retrieve_secret_response.py +++ b/src/replicate/types/webhooks/default/secret_get_response.py @@ -2,11 +2,11 @@ from typing import Optional -from ..._models import BaseModel +from ...._models import BaseModel -__all__ = ["DefaultRetrieveSecretResponse"] +__all__ = ["SecretGetResponse"] -class DefaultRetrieveSecretResponse(BaseModel): +class SecretGetResponse(BaseModel): key: Optional[str] = None """The signing secret.""" diff --git a/tests/api_resources/models/test_predictions.py b/tests/api_resources/models/test_predictions.py new file mode 100644 index 0000000..d4f1974 --- /dev/null +++ b/tests/api_resources/models/test_predictions.py @@ -0,0 +1,164 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from replicate import ReplicateClient, AsyncReplicateClient +from tests.utils import assert_matches_type +from replicate.types import Prediction + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestPredictions: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip() + @parametrize + def test_method_create(self, client: ReplicateClient) -> None: + prediction = client.models.predictions.create( + model_name="model_name", + model_owner="model_owner", + input={}, + ) + assert_matches_type(Prediction, prediction, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_method_create_with_all_params(self, client: ReplicateClient) -> None: + prediction = client.models.predictions.create( + model_name="model_name", + model_owner="model_owner", + input={}, + stream=True, + webhook="webhook", + webhook_events_filter=["start"], + prefer="wait=5", + ) + assert_matches_type(Prediction, prediction, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_raw_response_create(self, client: ReplicateClient) -> None: + response = client.models.predictions.with_raw_response.create( + model_name="model_name", + model_owner="model_owner", + input={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + prediction = response.parse() + assert_matches_type(Prediction, prediction, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_streaming_response_create(self, client: ReplicateClient) -> None: + with client.models.predictions.with_streaming_response.create( + model_name="model_name", + model_owner="model_owner", + input={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + prediction = response.parse() + assert_matches_type(Prediction, prediction, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip() + @parametrize + def test_path_params_create(self, client: ReplicateClient) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): + client.models.predictions.with_raw_response.create( + model_name="model_name", + model_owner="", + input={}, + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): + client.models.predictions.with_raw_response.create( + model_name="", + model_owner="model_owner", + input={}, + ) + + +class TestAsyncPredictions: + parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip() + @parametrize + async def test_method_create(self, async_client: AsyncReplicateClient) -> None: + prediction = await async_client.models.predictions.create( + model_name="model_name", + model_owner="model_owner", + input={}, + ) + assert_matches_type(Prediction, prediction, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_method_create_with_all_params(self, async_client: AsyncReplicateClient) -> None: + prediction = await async_client.models.predictions.create( + model_name="model_name", + model_owner="model_owner", + input={}, + stream=True, + webhook="webhook", + webhook_events_filter=["start"], + prefer="wait=5", + ) + assert_matches_type(Prediction, prediction, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_raw_response_create(self, async_client: AsyncReplicateClient) -> None: + response = await async_client.models.predictions.with_raw_response.create( + model_name="model_name", + model_owner="model_owner", + input={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + prediction = await response.parse() + assert_matches_type(Prediction, prediction, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_streaming_response_create(self, async_client: AsyncReplicateClient) -> None: + async with async_client.models.predictions.with_streaming_response.create( + model_name="model_name", + model_owner="model_owner", + input={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + prediction = await response.parse() + assert_matches_type(Prediction, prediction, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip() + @parametrize + async def test_path_params_create(self, async_client: AsyncReplicateClient) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): + await async_client.models.predictions.with_raw_response.create( + model_name="model_name", + model_owner="", + input={}, + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): + await async_client.models.predictions.with_raw_response.create( + model_name="", + model_owner="model_owner", + input={}, + ) diff --git a/tests/api_resources/models/test_versions.py b/tests/api_resources/models/test_versions.py index d1fb7a8..af132a2 100644 --- a/tests/api_resources/models/test_versions.py +++ b/tests/api_resources/models/test_versions.py @@ -8,8 +8,6 @@ import pytest from replicate import ReplicateClient, AsyncReplicateClient -from tests.utils import assert_matches_type -from replicate.types.models import VersionCreateTrainingResponse base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -133,96 +131,6 @@ def test_path_params_delete(self, client: ReplicateClient) -> None: model_name="model_name", ) - @pytest.mark.skip() - @parametrize - def test_method_create_training(self, client: ReplicateClient) -> None: - version = client.models.versions.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_method_create_training_with_all_params(self, client: ReplicateClient) -> None: - version = client.models.versions.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - webhook="webhook", - webhook_events_filter=["start"], - ) - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_raw_response_create_training(self, client: ReplicateClient) -> None: - response = client.models.versions.with_raw_response.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - version = response.parse() - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_streaming_response_create_training(self, client: ReplicateClient) -> None: - with client.models.versions.with_streaming_response.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - version = response.parse() - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - def test_path_params_create_training(self, client: ReplicateClient) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): - client.models.versions.with_raw_response.create_training( - version_id="version_id", - model_owner="", - model_name="model_name", - destination="destination", - input={}, - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): - client.models.versions.with_raw_response.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="", - destination="destination", - input={}, - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `version_id` but received ''"): - client.models.versions.with_raw_response.create_training( - version_id="", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) - @pytest.mark.skip() @parametrize def test_method_get(self, client: ReplicateClient) -> None: @@ -407,96 +315,6 @@ async def test_path_params_delete(self, async_client: AsyncReplicateClient) -> N model_name="model_name", ) - @pytest.mark.skip() - @parametrize - async def test_method_create_training(self, async_client: AsyncReplicateClient) -> None: - version = await async_client.models.versions.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_method_create_training_with_all_params(self, async_client: AsyncReplicateClient) -> None: - version = await async_client.models.versions.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - webhook="webhook", - webhook_events_filter=["start"], - ) - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_raw_response_create_training(self, async_client: AsyncReplicateClient) -> None: - response = await async_client.models.versions.with_raw_response.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - version = await response.parse() - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_streaming_response_create_training(self, async_client: AsyncReplicateClient) -> None: - async with async_client.models.versions.with_streaming_response.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - version = await response.parse() - assert_matches_type(VersionCreateTrainingResponse, version, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - async def test_path_params_create_training(self, async_client: AsyncReplicateClient) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): - await async_client.models.versions.with_raw_response.create_training( - version_id="version_id", - model_owner="", - model_name="model_name", - destination="destination", - input={}, - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): - await async_client.models.versions.with_raw_response.create_training( - version_id="version_id", - model_owner="model_owner", - model_name="", - destination="destination", - input={}, - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `version_id` but received ''"): - await async_client.models.versions.with_raw_response.create_training( - version_id="", - model_owner="model_owner", - model_name="model_name", - destination="destination", - input={}, - ) - @pytest.mark.skip() @parametrize async def test_method_get(self, async_client: AsyncReplicateClient) -> None: diff --git a/tests/api_resources/test_collections.py b/tests/api_resources/test_collections.py index 820e42e..d231a8d 100644 --- a/tests/api_resources/test_collections.py +++ b/tests/api_resources/test_collections.py @@ -43,6 +43,48 @@ def test_streaming_response_list(self, client: ReplicateClient) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip() + @parametrize + def test_method_get(self, client: ReplicateClient) -> None: + collection = client.collections.get( + "collection_slug", + ) + assert collection is None + + @pytest.mark.skip() + @parametrize + def test_raw_response_get(self, client: ReplicateClient) -> None: + response = client.collections.with_raw_response.get( + "collection_slug", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + collection = response.parse() + assert collection is None + + @pytest.mark.skip() + @parametrize + def test_streaming_response_get(self, client: ReplicateClient) -> None: + with client.collections.with_streaming_response.get( + "collection_slug", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + collection = response.parse() + assert collection is None + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip() + @parametrize + def test_path_params_get(self, client: ReplicateClient) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `collection_slug` but received ''"): + client.collections.with_raw_response.get( + "", + ) + class TestAsyncCollections: parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) @@ -74,3 +116,45 @@ async def test_streaming_response_list(self, async_client: AsyncReplicateClient) assert collection is None assert cast(Any, response.is_closed) is True + + @pytest.mark.skip() + @parametrize + async def test_method_get(self, async_client: AsyncReplicateClient) -> None: + collection = await async_client.collections.get( + "collection_slug", + ) + assert collection is None + + @pytest.mark.skip() + @parametrize + async def test_raw_response_get(self, async_client: AsyncReplicateClient) -> None: + response = await async_client.collections.with_raw_response.get( + "collection_slug", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + collection = await response.parse() + assert collection is None + + @pytest.mark.skip() + @parametrize + async def test_streaming_response_get(self, async_client: AsyncReplicateClient) -> None: + async with async_client.collections.with_streaming_response.get( + "collection_slug", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + collection = await response.parse() + assert collection is None + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip() + @parametrize + async def test_path_params_get(self, async_client: AsyncReplicateClient) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `collection_slug` but received ''"): + await async_client.collections.with_raw_response.get( + "", + ) diff --git a/tests/api_resources/test_deployments.py b/tests/api_resources/test_deployments.py index 3a01dcb..6d6360a 100644 --- a/tests/api_resources/test_deployments.py +++ b/tests/api_resources/test_deployments.py @@ -269,34 +269,6 @@ def test_path_params_get(self, client: ReplicateClient) -> None: deployment_owner="deployment_owner", ) - @pytest.mark.skip() - @parametrize - def test_method_list_em_all(self, client: ReplicateClient) -> None: - deployment = client.deployments.list_em_all() - assert deployment is None - - @pytest.mark.skip() - @parametrize - def test_raw_response_list_em_all(self, client: ReplicateClient) -> None: - response = client.deployments.with_raw_response.list_em_all() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - deployment = response.parse() - assert deployment is None - - @pytest.mark.skip() - @parametrize - def test_streaming_response_list_em_all(self, client: ReplicateClient) -> None: - with client.deployments.with_streaming_response.list_em_all() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - deployment = response.parse() - assert deployment is None - - assert cast(Any, response.is_closed) is True - class TestAsyncDeployments: parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) @@ -546,31 +518,3 @@ async def test_path_params_get(self, async_client: AsyncReplicateClient) -> None deployment_name="", deployment_owner="deployment_owner", ) - - @pytest.mark.skip() - @parametrize - async def test_method_list_em_all(self, async_client: AsyncReplicateClient) -> None: - deployment = await async_client.deployments.list_em_all() - assert deployment is None - - @pytest.mark.skip() - @parametrize - async def test_raw_response_list_em_all(self, async_client: AsyncReplicateClient) -> None: - response = await async_client.deployments.with_raw_response.list_em_all() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - deployment = await response.parse() - assert deployment is None - - @pytest.mark.skip() - @parametrize - async def test_streaming_response_list_em_all(self, async_client: AsyncReplicateClient) -> None: - async with async_client.deployments.with_streaming_response.list_em_all() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - deployment = await response.parse() - assert deployment is None - - assert cast(Any, response.is_closed) is True diff --git a/tests/api_resources/test_hardware.py b/tests/api_resources/test_hardware.py index 1dcb3a7..9aa535b 100644 --- a/tests/api_resources/test_hardware.py +++ b/tests/api_resources/test_hardware.py @@ -45,48 +45,6 @@ def test_streaming_response_list(self, client: ReplicateClient) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip() - @parametrize - def test_method_retrieve_collections(self, client: ReplicateClient) -> None: - hardware = client.hardware.retrieve_collections( - "collection_slug", - ) - assert hardware is None - - @pytest.mark.skip() - @parametrize - def test_raw_response_retrieve_collections(self, client: ReplicateClient) -> None: - response = client.hardware.with_raw_response.retrieve_collections( - "collection_slug", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - hardware = response.parse() - assert hardware is None - - @pytest.mark.skip() - @parametrize - def test_streaming_response_retrieve_collections(self, client: ReplicateClient) -> None: - with client.hardware.with_streaming_response.retrieve_collections( - "collection_slug", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - hardware = response.parse() - assert hardware is None - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - def test_path_params_retrieve_collections(self, client: ReplicateClient) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `collection_slug` but received ''"): - client.hardware.with_raw_response.retrieve_collections( - "", - ) - class TestAsyncHardware: parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) @@ -118,45 +76,3 @@ async def test_streaming_response_list(self, async_client: AsyncReplicateClient) assert_matches_type(HardwareListResponse, hardware, path=["response"]) assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - async def test_method_retrieve_collections(self, async_client: AsyncReplicateClient) -> None: - hardware = await async_client.hardware.retrieve_collections( - "collection_slug", - ) - assert hardware is None - - @pytest.mark.skip() - @parametrize - async def test_raw_response_retrieve_collections(self, async_client: AsyncReplicateClient) -> None: - response = await async_client.hardware.with_raw_response.retrieve_collections( - "collection_slug", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - hardware = await response.parse() - assert hardware is None - - @pytest.mark.skip() - @parametrize - async def test_streaming_response_retrieve_collections(self, async_client: AsyncReplicateClient) -> None: - async with async_client.hardware.with_streaming_response.retrieve_collections( - "collection_slug", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - hardware = await response.parse() - assert hardware is None - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - async def test_path_params_retrieve_collections(self, async_client: AsyncReplicateClient) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `collection_slug` but received ''"): - await async_client.hardware.with_raw_response.retrieve_collections( - "", - ) diff --git a/tests/api_resources/test_models.py b/tests/api_resources/test_models.py index a2a9f52..1188e65 100644 --- a/tests/api_resources/test_models.py +++ b/tests/api_resources/test_models.py @@ -9,7 +9,7 @@ from replicate import ReplicateClient, AsyncReplicateClient from tests.utils import assert_matches_type -from replicate.types import Prediction, ModelListResponse +from replicate.types import ModelListResponse from replicate.pagination import SyncCursorURLPage, AsyncCursorURLPage base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -157,77 +157,6 @@ def test_path_params_delete(self, client: ReplicateClient) -> None: model_owner="model_owner", ) - @pytest.mark.skip() - @parametrize - def test_method_create_prediction(self, client: ReplicateClient) -> None: - model = client.models.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - ) - assert_matches_type(Prediction, model, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_method_create_prediction_with_all_params(self, client: ReplicateClient) -> None: - model = client.models.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - stream=True, - webhook="webhook", - webhook_events_filter=["start"], - prefer="wait=5", - ) - assert_matches_type(Prediction, model, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_raw_response_create_prediction(self, client: ReplicateClient) -> None: - response = client.models.with_raw_response.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - model = response.parse() - assert_matches_type(Prediction, model, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_streaming_response_create_prediction(self, client: ReplicateClient) -> None: - with client.models.with_streaming_response.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - model = response.parse() - assert_matches_type(Prediction, model, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - def test_path_params_create_prediction(self, client: ReplicateClient) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): - client.models.with_raw_response.create_prediction( - model_name="model_name", - model_owner="", - input={}, - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): - client.models.with_raw_response.create_prediction( - model_name="", - model_owner="model_owner", - input={}, - ) - @pytest.mark.skip() @parametrize def test_method_get(self, client: ReplicateClient) -> None: @@ -423,77 +352,6 @@ async def test_path_params_delete(self, async_client: AsyncReplicateClient) -> N model_owner="model_owner", ) - @pytest.mark.skip() - @parametrize - async def test_method_create_prediction(self, async_client: AsyncReplicateClient) -> None: - model = await async_client.models.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - ) - assert_matches_type(Prediction, model, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_method_create_prediction_with_all_params(self, async_client: AsyncReplicateClient) -> None: - model = await async_client.models.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - stream=True, - webhook="webhook", - webhook_events_filter=["start"], - prefer="wait=5", - ) - assert_matches_type(Prediction, model, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_raw_response_create_prediction(self, async_client: AsyncReplicateClient) -> None: - response = await async_client.models.with_raw_response.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - model = await response.parse() - assert_matches_type(Prediction, model, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_streaming_response_create_prediction(self, async_client: AsyncReplicateClient) -> None: - async with async_client.models.with_streaming_response.create_prediction( - model_name="model_name", - model_owner="model_owner", - input={}, - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - model = await response.parse() - assert_matches_type(Prediction, model, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - async def test_path_params_create_prediction(self, async_client: AsyncReplicateClient) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): - await async_client.models.with_raw_response.create_prediction( - model_name="model_name", - model_owner="", - input={}, - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): - await async_client.models.with_raw_response.create_prediction( - model_name="", - model_owner="model_owner", - input={}, - ) - @pytest.mark.skip() @parametrize async def test_method_get(self, async_client: AsyncReplicateClient) -> None: diff --git a/tests/api_resources/test_trainings.py b/tests/api_resources/test_trainings.py index f2dadb1..e1b0572 100644 --- a/tests/api_resources/test_trainings.py +++ b/tests/api_resources/test_trainings.py @@ -9,7 +9,12 @@ from replicate import ReplicateClient, AsyncReplicateClient from tests.utils import assert_matches_type -from replicate.types import TrainingGetResponse, TrainingListResponse, TrainingCancelResponse +from replicate.types import ( + TrainingGetResponse, + TrainingListResponse, + TrainingCancelResponse, + TrainingCreateResponse, +) from replicate.pagination import SyncCursorURLPage, AsyncCursorURLPage base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -18,6 +23,96 @@ class TestTrainings: parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + @pytest.mark.skip() + @parametrize + def test_method_create(self, client: ReplicateClient) -> None: + training = client.trainings.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_method_create_with_all_params(self, client: ReplicateClient) -> None: + training = client.trainings.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + webhook="webhook", + webhook_events_filter=["start"], + ) + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_raw_response_create(self, client: ReplicateClient) -> None: + response = client.trainings.with_raw_response.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + training = response.parse() + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_streaming_response_create(self, client: ReplicateClient) -> None: + with client.trainings.with_streaming_response.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + training = response.parse() + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip() + @parametrize + def test_path_params_create(self, client: ReplicateClient) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): + client.trainings.with_raw_response.create( + version_id="version_id", + model_owner="", + model_name="model_name", + destination="destination", + input={}, + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): + client.trainings.with_raw_response.create( + version_id="version_id", + model_owner="model_owner", + model_name="", + destination="destination", + input={}, + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `version_id` but received ''"): + client.trainings.with_raw_response.create( + version_id="", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) + @pytest.mark.skip() @parametrize def test_method_list(self, client: ReplicateClient) -> None: @@ -134,6 +229,96 @@ def test_path_params_get(self, client: ReplicateClient) -> None: class TestAsyncTrainings: parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) + @pytest.mark.skip() + @parametrize + async def test_method_create(self, async_client: AsyncReplicateClient) -> None: + training = await async_client.trainings.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_method_create_with_all_params(self, async_client: AsyncReplicateClient) -> None: + training = await async_client.trainings.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + webhook="webhook", + webhook_events_filter=["start"], + ) + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_raw_response_create(self, async_client: AsyncReplicateClient) -> None: + response = await async_client.trainings.with_raw_response.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + training = await response.parse() + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_streaming_response_create(self, async_client: AsyncReplicateClient) -> None: + async with async_client.trainings.with_streaming_response.create( + version_id="version_id", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + training = await response.parse() + assert_matches_type(TrainingCreateResponse, training, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip() + @parametrize + async def test_path_params_create(self, async_client: AsyncReplicateClient) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_owner` but received ''"): + await async_client.trainings.with_raw_response.create( + version_id="version_id", + model_owner="", + model_name="model_name", + destination="destination", + input={}, + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `model_name` but received ''"): + await async_client.trainings.with_raw_response.create( + version_id="version_id", + model_owner="model_owner", + model_name="", + destination="destination", + input={}, + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `version_id` but received ''"): + await async_client.trainings.with_raw_response.create( + version_id="", + model_owner="model_owner", + model_name="model_name", + destination="destination", + input={}, + ) + @pytest.mark.skip() @parametrize async def test_method_list(self, async_client: AsyncReplicateClient) -> None: diff --git a/tests/api_resources/webhooks/default/__init__.py b/tests/api_resources/webhooks/default/__init__.py new file mode 100644 index 0000000..fd8019a --- /dev/null +++ b/tests/api_resources/webhooks/default/__init__.py @@ -0,0 +1 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/webhooks/default/test_secret.py b/tests/api_resources/webhooks/default/test_secret.py new file mode 100644 index 0000000..c95ab8a --- /dev/null +++ b/tests/api_resources/webhooks/default/test_secret.py @@ -0,0 +1,78 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from replicate import ReplicateClient, AsyncReplicateClient +from tests.utils import assert_matches_type +from replicate.types.webhooks.default import SecretGetResponse + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestSecret: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip() + @parametrize + def test_method_get(self, client: ReplicateClient) -> None: + secret = client.webhooks.default.secret.get() + assert_matches_type(SecretGetResponse, secret, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_raw_response_get(self, client: ReplicateClient) -> None: + response = client.webhooks.default.secret.with_raw_response.get() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + secret = response.parse() + assert_matches_type(SecretGetResponse, secret, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_streaming_response_get(self, client: ReplicateClient) -> None: + with client.webhooks.default.secret.with_streaming_response.get() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + secret = response.parse() + assert_matches_type(SecretGetResponse, secret, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncSecret: + parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip() + @parametrize + async def test_method_get(self, async_client: AsyncReplicateClient) -> None: + secret = await async_client.webhooks.default.secret.get() + assert_matches_type(SecretGetResponse, secret, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_raw_response_get(self, async_client: AsyncReplicateClient) -> None: + response = await async_client.webhooks.default.secret.with_raw_response.get() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + secret = await response.parse() + assert_matches_type(SecretGetResponse, secret, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_streaming_response_get(self, async_client: AsyncReplicateClient) -> None: + async with async_client.webhooks.default.secret.with_streaming_response.get() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + secret = await response.parse() + assert_matches_type(SecretGetResponse, secret, path=["response"]) + + assert cast(Any, response.is_closed) is True diff --git a/tests/api_resources/webhooks/test_default.py b/tests/api_resources/webhooks/test_default.py deleted file mode 100644 index 7b91c21..0000000 --- a/tests/api_resources/webhooks/test_default.py +++ /dev/null @@ -1,78 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, cast - -import pytest - -from replicate import ReplicateClient, AsyncReplicateClient -from tests.utils import assert_matches_type -from replicate.types.webhooks import DefaultRetrieveSecretResponse - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestDefault: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @pytest.mark.skip() - @parametrize - def test_method_retrieve_secret(self, client: ReplicateClient) -> None: - default = client.webhooks.default.retrieve_secret() - assert_matches_type(DefaultRetrieveSecretResponse, default, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_raw_response_retrieve_secret(self, client: ReplicateClient) -> None: - response = client.webhooks.default.with_raw_response.retrieve_secret() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - default = response.parse() - assert_matches_type(DefaultRetrieveSecretResponse, default, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_streaming_response_retrieve_secret(self, client: ReplicateClient) -> None: - with client.webhooks.default.with_streaming_response.retrieve_secret() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - default = response.parse() - assert_matches_type(DefaultRetrieveSecretResponse, default, path=["response"]) - - assert cast(Any, response.is_closed) is True - - -class TestAsyncDefault: - parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) - - @pytest.mark.skip() - @parametrize - async def test_method_retrieve_secret(self, async_client: AsyncReplicateClient) -> None: - default = await async_client.webhooks.default.retrieve_secret() - assert_matches_type(DefaultRetrieveSecretResponse, default, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_raw_response_retrieve_secret(self, async_client: AsyncReplicateClient) -> None: - response = await async_client.webhooks.default.with_raw_response.retrieve_secret() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - default = await response.parse() - assert_matches_type(DefaultRetrieveSecretResponse, default, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_streaming_response_retrieve_secret(self, async_client: AsyncReplicateClient) -> None: - async with async_client.webhooks.default.with_streaming_response.retrieve_secret() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - default = await response.parse() - assert_matches_type(DefaultRetrieveSecretResponse, default, path=["response"]) - - assert cast(Any, response.is_closed) is True