From 5f5ae46bfcdb09321942b25698a5b4c53987efa4 Mon Sep 17 00:00:00 2001 From: Robin Andeer Date: Wed, 21 Oct 2026 20:31:03 -0400 Subject: [PATCH 1/3] feat: add Nano Banana 2 Lite and expand image and video model support Stainless-Generated-From: f3d16474e5a5dfb26e162e58c533bbd04300007a --- scripts/mock | 15 +- scripts/test | 12 +- .../resources/avatar_conversations.py | 4 +- src/runwayml/resources/image_to_video.py | 1628 ++++++++++++----- .../organization/webapp/audit_logs.py | 40 +- .../resources/organization/webapp/webapp.py | 22 +- src/runwayml/resources/routers.py | 8 +- src/runwayml/resources/text_to_image.py | 888 +++++++++ src/runwayml/resources/text_to_video.py | 1214 +++++++++--- src/runwayml/resources/video_to_video.py | 578 ++++-- .../types/generate/image_create_response.py | 17 +- .../types/image_to_video_create_params.py | 890 +++++++-- .../webapp/audit_log_list_params.py | 20 +- .../webapp/audit_log_list_response.py | 10 + .../webapp/audit_log_retrieve_response.py | 166 +- .../organization/webapp_list_usage_params.py | 18 +- .../organization_retrieve_usage_response.py | 12 + src/runwayml/types/router_update_params.py | 22 +- .../types/text_to_image_create_params.py | 320 ++++ .../types/text_to_video_create_params.py | 590 ++++-- .../types/video_to_video_create_params.py | 366 +++- tests/api_resources/test_image_to_video.py | 1478 +++++++++++---- tests/api_resources/test_text_to_image.py | 916 +++++++--- tests/api_resources/test_text_to_video.py | 1562 ++++++++++++---- tests/api_resources/test_video_to_video.py | 602 ++++-- 25 files changed, 9051 insertions(+), 2347 deletions(-) diff --git a/scripts/mock b/scripts/mock index 8e2299b5..20a5d42a 100755 --- a/scripts/mock +++ b/scripts/mock @@ -4,11 +4,6 @@ set -e cd "$(dirname "$0")/.." -if [ "$1" == "--install" ]; then - npm exec --package=@stdy/cli@0.22.1 -- steady --version - exit 0 -fi - if [[ -n "$1" && "$1" != '--'* ]]; then URL="$1" shift @@ -16,7 +11,7 @@ elif [ -n "$STAINLESS_OPENAPI_SPEC_URL" ]; then URL="$STAINLESS_OPENAPI_SPEC_URL" else # Embedded OpenAPI spec (base64-encoded, gzipped) - EMBEDDED_SPEC="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" + EMBEDDED_SPEC="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" SPEC_TMPFILE="$(mktemp)" trap 'rm -f "$SPEC_TMPFILE"' EXIT echo "$EMBEDDED_SPEC" | base64 --decode | gunzip > "$SPEC_TMPFILE" @@ -26,18 +21,16 @@ fi echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec -MOCK_PORT="${STAINLESS_MOCK_PORT:-4010}" - if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout npm exec --package=@stdy/cli@0.22.1 -- steady --version - npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p "$MOCK_PORT" --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" attempts=0 - while ! curl --silent --fail "http://127.0.0.1:$MOCK_PORT/_x-steady/health" >/dev/null 2>&1; do + while ! curl --silent --fail "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1; do if ! kill -0 $! 2>/dev/null; then echo cat .stdy.log @@ -56,5 +49,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p "$MOCK_PORT" --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 9dbb5cdb..19acc916 100755 --- a/scripts/test +++ b/scripts/test @@ -9,10 +9,8 @@ GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # No Color -MOCK_PORT="${STAINLESS_MOCK_PORT:-4010}" - function steady_is_running() { - curl --silent "http://127.0.0.1:$MOCK_PORT/_x-steady/health" >/dev/null 2>&1 + curl --silent "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1 } kill_server_on_port() { @@ -29,7 +27,7 @@ function is_overriding_api_base_url() { if ! is_overriding_api_base_url && ! steady_is_running ; then # When we exit this script, make sure to kill the background mock server process - trap 'kill_server_on_port "$MOCK_PORT"' EXIT + trap 'kill_server_on_port 4010' EXIT # Start the dev server ./scripts/mock --daemon @@ -45,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p $MOCK_PORT --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 @@ -54,10 +52,6 @@ else echo fi -if [ -n "${STAINLESS_MOCK_PORT:-}" ] && ! is_overriding_api_base_url ; then - export TEST_API_BASE_URL="http://127.0.0.1:$MOCK_PORT" -fi - export DEFER_PYDANTIC_BUILD=false echo "==> Running tests" diff --git a/src/runwayml/resources/avatar_conversations.py b/src/runwayml/resources/avatar_conversations.py index 654db7e4..b9d16d38 100644 --- a/src/runwayml/resources/avatar_conversations.py +++ b/src/runwayml/resources/avatar_conversations.py @@ -160,7 +160,7 @@ def delete( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> None: """ - Delete a conversation and its associated data. + Permanently delete a conversation, including its transcript and recording. Args: extra_headers: Send extra headers @@ -317,7 +317,7 @@ async def delete( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> None: """ - Delete a conversation and its associated data. + Permanently delete a conversation, including its transcript and recording. Args: extra_headers: Send extra headers diff --git a/src/runwayml/resources/image_to_video.py b/src/runwayml/resources/image_to_video.py index 1b2ba81d..e0ae4328 100644 --- a/src/runwayml/resources/image_to_video.py +++ b/src/runwayml/resources/image_to_video.py @@ -85,7 +85,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -166,7 +166,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -216,7 +216,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -268,7 +268,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -302,12 +302,63 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["klingO3_4k"], + prompt_image: Union[str, Iterable[image_to_video_create_params.KlingO3_4kPromptImagePromptImage]], + audio: bool | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: image_to_video_create_params.KlingO3_4kProviderSettings | Omit = omit, + ratio: Literal["3840:2160", "2160:3840", "2880:2880"] | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3_4kReferencesReferenceImage]] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + references: An optional array of reference images (up to 7). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + @overload def create( self, *, model: Literal["hailuo3"], - prompt_image: Union[str, Iterable[object]], + prompt_image: Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]], prompt_text: str, duration: int | Omit = omit, ratio: Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] | Omit = omit, @@ -319,7 +370,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -352,6 +403,57 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["kling3.0_4k"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling3_0_4kPromptImagePromptImage]], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: image_to_video_create_params.Kling3_0_4kProviderSettings | Omit = omit, + ratio: Literal["3840:2160", "2160:3840", "2880:2880"] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + 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 + """ + ... + @overload def create( self, @@ -367,7 +469,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -400,71 +502,33 @@ def create( def create( self, *, - model: Literal["seedance2"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2PromptImagePromptImage]], - audio: bool | Omit = omit, - duration: Union[int, Literal["auto"]] | Omit = omit, - prompt_text: str | Omit = omit, - ratio: Literal[ - "992:432", - "864:496", - "752:560", - "640:640", - "560:752", - "496:864", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - "3840:1646", - "3840:2160", - "3840:2880", - "3840:3840", - "2880:3840", - "2160:3840", - ] - | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Seedance2ReferenceAudio] | Omit = omit, - seed: int | Omit = omit, + model: Literal["kling2.5_turbo_pro"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling2_5TurboProPromptImagePromptImage]], + prompt_text: str, + cfg_scale: float | Omit = omit, + duration: Literal[5, 10] | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or - omit position for reference images. The two modes cannot be mixed. - - audio: Whether to generate audio for the video. - - duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is - billed at the variant maximum up front; unused credits are refunded after the - generation finishes. - - prompt_text: An optional text prompt up to 3500 characters describing what should appear in - the output. + prompt_image: Image for the first frame of the output video, or an array with first and + optionally last frames. Output aspect ratio follows the input image; `ratio` is + not supported on image-to-video. See [image inputs](/assets/inputs#images) for + file size limits. - ratio: The resolution of the output video. + prompt_text: A text prompt describing what should appear in the output video. - reference_audio: An optional array of audio references. The total combined duration must not - exceed 15 seconds. + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. - seed: If unspecified, a random number is chosen. Varying the seed integer is a way to - get different results for the same other request parameters. Using the same seed - integer for an identical request will produce similar results. + duration: The duration of the output video in seconds. Defaults to 5. extra_headers: Send extra headers @@ -480,60 +544,42 @@ def create( def create( self, *, - model: Literal["seedance2_fast"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2FastPromptImagePromptImage]], + model: Literal["kling3.0_pro"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling3_0ProPromptImagePromptImage]], audio: bool | Omit = omit, - duration: Union[int, Literal["auto"]] | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, prompt_text: str | Omit = omit, - ratio: Literal[ - "992:432", - "864:496", - "752:560", - "640:640", - "560:752", - "496:864", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - ] - | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Seedance2FastReferenceAudio] | Omit = omit, - seed: int | Omit = omit, + provider_settings: image_to_video_create_params.Kling3_0ProProviderSettings | Omit = omit, + ratio: Literal["1920:1080", "1080:1920", "1440:1440"] | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or - omit position for reference images. The two modes cannot be mixed. + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. audio: Whether to generate audio for the video. - duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is - billed at the variant maximum up front; unused credits are refunded after the - generation finishes. + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. - prompt_text: An optional text prompt up to 3500 characters describing what should appear in - the output. + duration: The number of seconds of duration for the output video. - ratio: The resolution of the output video. Seedance 2.0 Fast supports 480p and 720p - only. + prompt_text: A text prompt describing what should appear in the output video. - reference_audio: An optional array of audio references. The total combined duration must not - exceed 15 seconds. + provider_settings: Provider-specific settings for multishot video generation. - seed: If unspecified, a random number is chosen. Varying the seed integer is a way to - get different results for the same other request parameters. Using the same seed - integer for an identical request will produce similar results. + ratio: The resolution of the output video. extra_headers: Send extra headers @@ -549,60 +595,42 @@ def create( def create( self, *, - model: Literal["seedance2_mini"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2MiniPromptImagePromptImage]], + model: Literal["kling3.0_standard"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling3_0StandardPromptImagePromptImage]], audio: bool | Omit = omit, - duration: Union[int, Literal["auto"]] | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, prompt_text: str | Omit = omit, - ratio: Literal[ - "992:432", - "864:496", - "752:560", - "640:640", - "560:752", - "496:864", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - ] - | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Seedance2MiniReferenceAudio] | Omit = omit, - seed: int | Omit = omit, + provider_settings: image_to_video_create_params.Kling3_0StandardProviderSettings | Omit = omit, + ratio: Literal["1280:720", "720:1280", "960:960"] | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or - omit position for reference images. The two modes cannot be mixed. + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. audio: Whether to generate audio for the video. - duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is - billed at the variant maximum up front; unused credits are refunded after the - generation finishes. + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. - prompt_text: An optional text prompt up to 3500 characters describing what should appear in - the output. + duration: The number of seconds of duration for the output video. - ratio: The resolution of the output video. Seedance 2.0 Mini supports 480p and 720p - only. + prompt_text: A text prompt describing what should appear in the output video. - reference_audio: An optional array of audio references. The total combined duration must not - exceed 15 seconds. + provider_settings: Provider-specific settings for multishot video generation. - seed: If unspecified, a random number is chosen. Varying the seed integer is a way to - get different results for the same other request parameters. Using the same seed - integer for an identical request will produce similar results. + ratio: The resolution of the output video. extra_headers: Send extra headers @@ -618,32 +646,42 @@ def create( def create( self, *, - model: Literal["gemini_omni_flash"], - prompt_image: Union[str, Iterable[image_to_video_create_params.GeminiOmniFlashPromptImagePromptImage]], + model: Literal["klingO3_pro"], + prompt_image: Union[str, Iterable[image_to_video_create_params.KlingO3ProPromptImagePromptImage]], + audio: bool | Omit = omit, duration: int | Omit = omit, prompt_text: str | Omit = omit, - ratio: Literal["1280:720", "720:1280"] | Omit = omit, + provider_settings: image_to_video_create_params.KlingO3ProProviderSettings | Omit = omit, + ratio: Literal["1920:1080", "1080:1920", "1440:1440"] | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3ProReferencesReferenceImage]] | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: An image to use as the first frame of the output video. Gemini Omni Flash only - supports a first frame. + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. - duration: The duration of the output video in seconds, as a whole number from 3 to 10. + audio: Whether to generate audio for the video. - prompt_text: An optional text prompt describing how the video should evolve from the first - frame. + duration: The number of seconds of duration for the output video. - ratio: The aspect ratio of the output video: `1280:720` (landscape) or `720:1280` - (portrait). + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + references: An optional array of reference images (up to 7). See + [our docs](/assets/inputs#images) on image inputs for more information. extra_headers: Send extra headers @@ -659,33 +697,91 @@ def create( def create( self, *, - model: Literal["seedance2_5"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]], + model: Literal["klingO3_standard"], + prompt_image: Union[str, Iterable[image_to_video_create_params.KlingO3StandardPromptImagePromptImage]], audio: bool | Omit = omit, - duration: Union[int, Literal["auto"]] | Omit = omit, + duration: int | Omit = omit, prompt_text: str | Omit = omit, - ratio: Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", + provider_settings: image_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, + ratio: Literal["1280:720", "720:1280", "960:960"] | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3StandardReferencesReferenceImage]] + | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + references: An optional array of reference images (up to 7). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["seedance2"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2PromptImagePromptImage]], + audio: bool | Omit = omit, + duration: Union[int, Literal["auto"]] | Omit = omit, + prompt_text: str | Omit = omit, + ratio: Literal[ + "992:432", + "864:496", + "752:560", + "640:640", + "560:752", + "496:864", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", "1080:1920", + "3840:1646", + "3840:2160", + "3840:2880", + "3840:3840", + "2880:3840", + "2160:3840", ] | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Seedance2ReferenceAudio] | Omit = omit, seed: int | Omit = omit, # 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. @@ -693,7 +789,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -707,13 +803,13 @@ def create( billed at the variant maximum up front; unused credits are refunded after the generation finishes. - prompt_text: An optional text prompt up to 15000 characters describing what should appear in + prompt_text: An optional text prompt up to 3500 characters describing what should appear in the output. - ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. + ratio: The resolution of the output video. reference_audio: An optional array of audio references. The total combined duration must not - exceed 30 seconds. + exceed 15 seconds. seed: If unspecified, a random number is chosen. Varying the seed integer is a way to get different results for the same other request parameters. Using the same seed @@ -733,31 +829,60 @@ def create( def create( self, *, - model: Literal["grok_imagine_1_5"], - prompt_image: Union[str, Iterable[image_to_video_create_params.GrokImagine1_5PromptImagePromptImage]], - duration: int | Omit = omit, + model: Literal["seedance2_fast"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2FastPromptImagePromptImage]], + audio: bool | Omit = omit, + duration: Union[int, Literal["auto"]] | Omit = omit, prompt_text: str | Omit = omit, - resolution: Literal["480p", "720p", "1080p"] | Omit = omit, + ratio: Literal[ + "992:432", + "864:496", + "752:560", + "640:640", + "560:752", + "496:864", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + ] + | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Seedance2FastReferenceAudio] | Omit = omit, + seed: int | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. + prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or + omit position for reference images. The two modes cannot be mixed. - duration: The number of seconds of duration for the output video. + audio: Whether to generate audio for the video. - prompt_text: An optional text prompt describing motion or changes in the output video. + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is + billed at the variant maximum up front; unused credits are refunded after the + generation finishes. - resolution: The output resolution. Output aspect ratio follows the input image. + prompt_text: An optional text prompt up to 3500 characters describing what should appear in + the output. + + ratio: The resolution of the output video. Seedance 2.0 Fast supports 480p and 720p + only. + + reference_audio: An optional array of audio references. The total combined duration must not + exceed 15 seconds. + + seed: If unspecified, a random number is chosen. Varying the seed integer is a way to + get different results for the same other request parameters. Using the same seed + integer for an identical request will produce similar results. extra_headers: Send extra headers @@ -773,41 +898,35 @@ def create( def create( self, *, - model: Literal["wan3"], - prompt_image: Union[str, Iterable[object]], - prompt_text: str, + model: Literal["seedance2_mini"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2MiniPromptImagePromptImage]], audio: bool | Omit = omit, - duration: int | Omit = omit, + duration: Union[int, Literal["auto"]] | Omit = omit, + prompt_text: str | Omit = omit, ratio: Literal[ - "832:480", - "720:544", - "624:624", - "544:720", - "480:832", + "992:432", + "864:496", + "752:560", + "640:640", + "560:752", + "496:864", + "1470:630", "1280:720", - "1104:832", + "1112:834", "960:960", - "832:1104", + "834:1112", "720:1280", - "1920:1080", - "1648:1248", - "1440:1440", - "1248:1648", - "1080:1920", - "auto_480p", - "auto_720p", - "auto_1080p", ] | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Wan3ReferenceAudio] | Omit = omit, - reference_videos: Iterable[image_to_video_create_params.Wan3ReferenceVideo] | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Seedance2MiniReferenceAudio] | Omit = omit, + seed: int | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -815,22 +934,24 @@ def create( prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or omit position for reference images. The two modes cannot be mixed. - prompt_text: A non-empty text prompt describing what should appear in the output. + audio: Whether to generate audio for the video. - audio: Whether to generate audio with the video. + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is + billed at the variant maximum up front; unused credits are refunded after the + generation finishes. - duration: The number of seconds of duration for the output video. + prompt_text: An optional text prompt up to 3500 characters describing what should appear in + the output. - ratio: The resolution of the output video, as `:`. Keyframe - image-to-video requests must use `auto_480p`, `auto_720p`, or `auto_1080p` - because their aspect ratio follows the first frame. + ratio: The resolution of the output video. Seedance 2.0 Mini supports 480p and 720p + only. reference_audio: An optional array of audio references. The total combined duration must not exceed 15 seconds. - reference_videos: An optional array of video references. The combined duration across all video - references must not exceed 15 seconds. See [our docs](/assets/inputs#videos) on - video inputs for more information. + seed: If unspecified, a random number is chosen. Varying the seed integer is a way to + get different results for the same other request parameters. Using the same seed + integer for an identical request will produce similar results. extra_headers: Send extra headers @@ -846,33 +967,32 @@ def create( def create( self, *, - model: Literal["gemini_omni_flash_1.1"], - prompt_image: Union[str, Iterable[image_to_video_create_params.GeminiOmniFlash1_1PromptImagePromptImage]], - prompt_text: str, - duration: Union[Literal["auto"], int] | Omit = omit, - ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] - | Omit = omit, + model: Literal["gemini_omni_flash"], + prompt_image: Union[str, Iterable[image_to_video_create_params.GeminiOmniFlashPromptImagePromptImage]], + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + ratio: Literal["1280:720", "720:1280"] | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: An image to use as the first frame, or an array containing a first frame and - optional last frame. + prompt_image: An image to use as the first frame of the output video. Gemini Omni Flash only + supports a first frame. - prompt_text: A non-empty text prompt describing how the video should evolve between the - provided frames. + duration: The duration of the output video in seconds, as a whole number from 3 to 10. - duration: The duration of the output video in seconds. Use "auto" to let the model choose - a duration. Numeric durations must be between 3 and 10 seconds. + prompt_text: An optional text prompt describing how the video should evolve from the first + frame. - ratio: The resolution and aspect ratio of the output video. + ratio: The aspect ratio of the output video: `1280:720` (landscape) or `720:1280` + (portrait). extra_headers: Send extra headers @@ -888,8 +1008,48 @@ def create( def create( self, *, - model: Literal["wan3_prime"], - prompt_image: Union[str, Iterable[object]], + model: Literal["grok_imagine_1_5"], + prompt_image: Union[str, Iterable[image_to_video_create_params.GrokImagine1_5PromptImagePromptImage]], + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + resolution: Literal["480p", "720p", "1080p"] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: The start frame of the output video. The output keeps its aspect ratio, which + (width / height) must be between 0.4 and 2.5. See + [our docs](/assets/inputs#images) for image input requirements. + + duration: The number of seconds of duration for the output video. + + prompt_text: An optional text prompt describing motion or changes in the output video. + + resolution: The output resolution. Output aspect ratio follows the input image. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["wan3"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]], prompt_text: str, audio: bool | Omit = omit, duration: int | Omit = omit, @@ -914,15 +1074,15 @@ def create( "auto_1080p", ] | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Wan3PrimeReferenceAudio] | Omit = omit, - reference_videos: Iterable[image_to_video_create_params.Wan3PrimeReferenceVideo] | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Wan3ReferenceAudio] | Omit = omit, + reference_videos: Iterable[image_to_video_create_params.Wan3ReferenceVideo] | Omit = omit, # 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, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -961,11 +1121,126 @@ def create( def create( self, *, - model: Literal["h3_max"], - prompt_image: Union[str, Iterable[image_to_video_create_params.H3MaxPromptImagePromptImage]], + model: Literal["gemini_omni_flash_1.1"], + prompt_image: Union[str, Iterable[image_to_video_create_params.GeminiOmniFlash1_1PromptImagePromptImage]], prompt_text: str, - duration: int | Omit = omit, - prompt_expansion_mode: Literal["disabled", "balanced", "quality"] | Omit = omit, + duration: Union[Literal["auto"], int] | Omit = omit, + ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: An image to use as the first frame, or an array containing a first frame and + optional last frame. + + prompt_text: A non-empty text prompt describing how the video should evolve between the + provided frames. + + duration: The duration of the output video in seconds. Use "auto" to let the model choose + a duration. Numeric durations must be between 3 and 10 seconds. + + ratio: The resolution and aspect ratio of the output video. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["wan3_prime"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]], + prompt_text: str, + audio: bool | Omit = omit, + duration: int | Omit = omit, + ratio: Literal[ + "832:480", + "720:544", + "624:624", + "544:720", + "480:832", + "1280:720", + "1104:832", + "960:960", + "832:1104", + "720:1280", + "1920:1080", + "1648:1248", + "1440:1440", + "1248:1648", + "1080:1920", + "auto_480p", + "auto_720p", + "auto_1080p", + ] + | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Wan3PrimeReferenceAudio] | Omit = omit, + reference_videos: Iterable[image_to_video_create_params.Wan3PrimeReferenceVideo] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or + omit position for reference images. The two modes cannot be mixed. + + prompt_text: A non-empty text prompt describing what should appear in the output. + + audio: Whether to generate audio with the video. + + duration: The number of seconds of duration for the output video. + + ratio: The resolution of the output video, as `:`. Keyframe + image-to-video requests must use `auto_480p`, `auto_720p`, or `auto_1080p` + because their aspect ratio follows the first frame. + + reference_audio: An optional array of audio references. The total combined duration must not + exceed 15 seconds. + + reference_videos: An optional array of video references. The combined duration across all video + references must not exceed 15 seconds. See [our docs](/assets/inputs#videos) on + video inputs for more information. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["h3_max"], + prompt_image: Union[str, Iterable[image_to_video_create_params.H3MaxPromptImagePromptImage]], + prompt_text: str, + duration: int | Omit = omit, + prompt_expansion_mode: Literal["disabled", "balanced", "quality"] | Omit = omit, resolution: Literal["480p", "768p"] | Omit = omit, seed: int | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -974,7 +1249,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1007,6 +1282,90 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["seedance2_5"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]], + audio: bool | Omit = omit, + draft: bool | Omit = omit, + duration: Union[int, Literal["auto"]] | Omit = omit, + output_format: Literal["mp4", "mov"] | Omit = omit, + prompt_text: str | Omit = omit, + ratio: Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] + | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or + omit position for reference images. The two modes cannot be mixed. + + audio: Whether to generate audio for the video. + + draft: Generate a cheap 480p preview instead of a full-quality video. The returned task + ID can later be enhanced to a 1080p video with the same content by passing it as + `draftTaskId` to `text_to_video`. Drafts can be enhanced within 7 days of + creation. Defaults to false. + + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is + billed at the variant maximum up front; unused credits are refunded after the + generation finishes. + + output_format: Container for the output video. `mov` keeps high colour precision for grading + and compositing. Defaults to `mp4`. Draft mode only supports `mp4`. + + prompt_text: An optional text prompt up to 15000 characters describing what should appear in + the output. + + ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. + + reference_audio: An optional array of audio references. The total combined duration must not + exceed 30 seconds. + + seed: If unspecified, a random number is chosen. Varying the seed integer is a way to + get different results for the same other request parameters. Using the same seed + integer for an identical request will produce similar results. + + 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 + """ + ... + @overload def create( self, @@ -1022,14 +1381,14 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. + prompt_image: The start frame of the output video. The output keeps its aspect ratio, which + (width / height) must be between 0.4 and 2.5. See + [our docs](/assets/inputs#images) for image input requirements. duration: The number of seconds of duration for the output video. @@ -1051,50 +1410,74 @@ def create( @required_args( ["duration", "model", "prompt_image", "prompt_text", "ratio"], ["model", "prompt_image", "ratio"], - ["model", "prompt_image", "prompt_text"], ["model", "prompt_image"], + ["model", "prompt_image", "prompt_text"], ) def create( self, *, - duration: int | Literal[4, 6, 8] | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, + duration: int + | Literal[4, 6, 8] + | Literal[5, 10] + | Union[int, Literal["auto"]] + | Union[Literal["auto"], int] + | Omit = omit, model: Literal["gen4.5"] | Literal["gen4_turbo"] | Literal["veo3.1"] | Literal["veo3.1_fast"] + | Literal["klingO3_4k"] | Literal["hailuo3"] + | Literal["kling3.0_4k"] | Literal["happyhorse_1_0"] + | Literal["kling2.5_turbo_pro"] + | Literal["kling3.0_pro"] + | Literal["kling3.0_standard"] + | Literal["klingO3_pro"] + | Literal["klingO3_standard"] | Literal["seedance2"] | Literal["seedance2_fast"] | Literal["seedance2_mini"] | Literal["gemini_omni_flash"] - | Literal["seedance2_5"] | Literal["grok_imagine_1_5"] | Literal["wan3"] | Literal["gemini_omni_flash_1.1"] | Literal["wan3_prime"] | Literal["h3_max"] + | Literal["seedance2_5"] | Literal["grok_imagine_1_5_lite"], prompt_image: Union[str, Iterable[image_to_video_create_params.Gen4_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Gen4TurboPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Veo3_1PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Veo3_1FastPromptImagePromptImage]] - | Union[str, Iterable[object]] + | Union[str, Iterable[image_to_video_create_params.KlingO3_4kPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling3_0_4kPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Happyhorse1_0PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling2_5TurboProPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling3_0ProPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling3_0StandardPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3ProPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3StandardPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2FastPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2MiniPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlashPromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlash1_1PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.H3MaxPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5LitePromptImagePromptImage]], prompt_text: str | Omit = omit, ratio: Literal["1280:720", "720:1280", "1104:832", "960:960", "832:1104", "1584:672"] | Literal["1280:720", "720:1280", "1104:832", "832:1104", "960:960", "1584:672"] | Literal["1280:720", "720:1280", "1080:1920", "1920:1080"] + | Literal["3840:2160", "2160:3840", "2880:2880"] | Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] + | Literal["1920:1080", "1080:1920", "1440:1440"] + | Literal["1280:720", "720:1280", "960:960"] | Literal[ "992:432", "864:496", @@ -1136,26 +1519,6 @@ def create( "720:1280", ] | Literal["1280:720", "720:1280"] - | Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] | Literal[ "832:480", "720:544", @@ -1177,6 +1540,26 @@ def create( "auto_1080p", ] | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + | Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] | Literal["auto_480p", "auto_720p", "auto_1080p"] | Omit = omit, content_moderation: image_to_video_create_params.Gen4_5ContentModeration @@ -1196,28 +1579,42 @@ def create( "hdr_exr_acescg_sequence_1_3", "hdr_exr_acescg_sequence_2_0", ] + | Literal["mp4", "mov"] | Omit = omit, prores_profile: Literal["422", "4444", "422 Proxy", "422 LT", "422 HQ", "4444 XQ"] | Omit = omit, seed: int | Omit = omit, audio: bool | Omit = omit, negative_prompt: str | Omit = omit, + provider_settings: image_to_video_create_params.KlingO3_4kProviderSettings + | image_to_video_create_params.Kling3_0_4kProviderSettings + | image_to_video_create_params.Kling3_0ProProviderSettings + | image_to_video_create_params.Kling3_0StandardProviderSettings + | image_to_video_create_params.KlingO3ProProviderSettings + | image_to_video_create_params.KlingO3StandardProviderSettings + | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3_4kReferencesReferenceImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3ProReferencesReferenceImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3StandardReferencesReferenceImage]] + | Omit = omit, reference_audio: Iterable[image_to_video_create_params.Hailuo3ReferenceAudio] | Iterable[image_to_video_create_params.Seedance2ReferenceAudio] | Iterable[image_to_video_create_params.Seedance2FastReferenceAudio] | Iterable[image_to_video_create_params.Seedance2MiniReferenceAudio] - | Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Iterable[image_to_video_create_params.Wan3ReferenceAudio] | Iterable[image_to_video_create_params.Wan3PrimeReferenceAudio] + | Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, resolution: Literal["768p", "2k", "768P", "2K"] | Literal["720p", "1080p", "720P", "1080P"] | Literal["480p", "720p", "1080p"] | Literal["480p", "768p"] | Omit = omit, + cfg_scale: float | Omit = omit, reference_videos: Iterable[image_to_video_create_params.Wan3ReferenceVideo] | Iterable[image_to_video_create_params.Wan3PrimeReferenceVideo] | Omit = omit, prompt_expansion_mode: Literal["disabled", "balanced", "quality"] | Omit = omit, + draft: bool | Omit = omit, # 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, @@ -1240,10 +1637,14 @@ def create( "seed": seed, "audio": audio, "negative_prompt": negative_prompt, + "provider_settings": provider_settings, + "references": references, "reference_audio": reference_audio, "resolution": resolution, + "cfg_scale": cfg_scale, "reference_videos": reference_videos, "prompt_expansion_mode": prompt_expansion_mode, + "draft": draft, }, image_to_video_create_params.ImageToVideoCreateParams, ), @@ -1309,7 +1710,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1390,7 +1791,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1440,7 +1841,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1492,7 +1893,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1530,41 +1931,382 @@ async def create( async def create( self, *, - model: Literal["hailuo3"], - prompt_image: Union[str, Iterable[object]], - prompt_text: str, + model: Literal["klingO3_4k"], + prompt_image: Union[str, Iterable[image_to_video_create_params.KlingO3_4kPromptImagePromptImage]], + audio: bool | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: image_to_video_create_params.KlingO3_4kProviderSettings | Omit = omit, + ratio: Literal["3840:2160", "2160:3840", "2880:2880"] | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3_4kReferencesReferenceImage]] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + references: An optional array of reference images (up to 7). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["hailuo3"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]], + prompt_text: str, + duration: int | Omit = omit, + ratio: Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Hailuo3ReferenceAudio] | Omit = omit, + resolution: Literal["768p", "2k", "768P", "2K"] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or + omit position for reference images. The two modes cannot be mixed. + + prompt_text: A non-empty text prompt describing what should appear in the output. + + duration: The number of seconds of duration for the output video. + + ratio: The aspect ratio of the output video. Use adaptive only when image or video + references are provided; text-only requests require a concrete ratio. + + reference_audio: An optional array of audio references. Audio references require a text prompt, + and the total combined duration must not exceed 15 seconds. + + resolution: The output resolution. Hailuo 3.0 supports 768p and 2k. + + - `768P` - Deprecated: Use "768p" instead. + - `2K` - Deprecated: Use "2k" instead. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling3.0_4k"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling3_0_4kPromptImagePromptImage]], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: image_to_video_create_params.Kling3_0_4kProviderSettings | Omit = omit, + ratio: Literal["3840:2160", "2160:3840", "2880:2880"] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["happyhorse_1_0"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Happyhorse1_0PromptImagePromptImage]], + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + resolution: Literal["720p", "1080p", "720P", "1080P"] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + + duration: The number of seconds of duration for the output video. + + prompt_text: A string up to 2500 characters (measured in UTF-16 code units) describing motion + or changes in the output video. + + resolution: Output quality tier. Output aspect ratio follows the input image. + + - `720P` - Deprecated: Use "720p" instead. + - `1080P` - Deprecated: Use "1080p" instead. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling2.5_turbo_pro"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling2_5TurboProPromptImagePromptImage]], + prompt_text: str, + cfg_scale: float | Omit = omit, + duration: Literal[5, 10] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: Image for the first frame of the output video, or an array with first and + optionally last frames. Output aspect ratio follows the input image; `ratio` is + not supported on image-to-video. See [image inputs](/assets/inputs#images) for + file size limits. + + prompt_text: A text prompt describing what should appear in the output video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The duration of the output video in seconds. Defaults to 5. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling3.0_pro"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling3_0ProPromptImagePromptImage]], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: image_to_video_create_params.Kling3_0ProProviderSettings | Omit = omit, + ratio: Literal["1920:1080", "1080:1920", "1440:1440"] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling3.0_standard"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Kling3_0StandardPromptImagePromptImage]], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: image_to_video_create_params.Kling3_0StandardProviderSettings | Omit = omit, + ratio: Literal["1280:720", "720:1280", "960:960"] | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + ratio: The resolution of the output video. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["klingO3_pro"], + prompt_image: Union[str, Iterable[image_to_video_create_params.KlingO3ProPromptImagePromptImage]], + audio: bool | Omit = omit, duration: int | Omit = omit, - ratio: Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Hailuo3ReferenceAudio] | Omit = omit, - resolution: Literal["768p", "2k", "768P", "2K"] | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: image_to_video_create_params.KlingO3ProProviderSettings | Omit = omit, + ratio: Literal["1920:1080", "1080:1920", "1440:1440"] | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3ProReferencesReferenceImage]] | Omit = omit, # 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, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or - omit position for reference images. The two modes cannot be mixed. + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. - prompt_text: A non-empty text prompt describing what should appear in the output. + audio: Whether to generate audio for the video. duration: The number of seconds of duration for the output video. - ratio: The aspect ratio of the output video. Use adaptive only when image or video - references are provided; text-only requests require a concrete ratio. + prompt_text: A text prompt describing what should appear in the output video. - reference_audio: An optional array of audio references. Audio references require a text prompt, - and the total combined duration must not exceed 15 seconds. + provider_settings: Provider-specific settings for multishot video generation. - resolution: The output resolution. Hailuo 3.0 supports 768p and 2k. + ratio: The resolution of the output video. - - `768P` - Deprecated: Use "768p" instead. - - `2K` - Deprecated: Use "2k" instead. + references: An optional array of reference images (up to 7). See + [our docs](/assets/inputs#images) on image inputs for more information. extra_headers: Send extra headers @@ -1580,35 +2322,43 @@ async def create( async def create( self, *, - model: Literal["happyhorse_1_0"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Happyhorse1_0PromptImagePromptImage]], + model: Literal["klingO3_standard"], + prompt_image: Union[str, Iterable[image_to_video_create_params.KlingO3StandardPromptImagePromptImage]], + audio: bool | Omit = omit, duration: int | Omit = omit, prompt_text: str | Omit = omit, - resolution: Literal["720p", "1080p", "720P", "1080P"] | Omit = omit, + provider_settings: image_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, + ratio: Literal["1280:720", "720:1280", "960:960"] | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3StandardReferencesReferenceImage]] + | Omit = omit, # 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, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. + prompt_image: You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + + audio: Whether to generate audio for the video. duration: The number of seconds of duration for the output video. - prompt_text: A string up to 2500 characters (measured in UTF-16 code units) describing motion - or changes in the output video. + prompt_text: A text prompt describing what should appear in the output video. - resolution: Output quality tier. Output aspect ratio follows the input image. + provider_settings: Provider-specific settings for multishot video generation. - - `720P` - Deprecated: Use "720p" instead. - - `1080P` - Deprecated: Use "1080p" instead. + ratio: The resolution of the output video. + + references: An optional array of reference images (up to 7). See + [our docs](/assets/inputs#images) on image inputs for more information. extra_headers: Send extra headers @@ -1664,7 +2414,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1732,7 +2482,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1801,7 +2551,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1853,7 +2603,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1879,80 +2629,6 @@ async def create( """ ... - @overload - async def create( - self, - *, - model: Literal["seedance2_5"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]], - audio: bool | Omit = omit, - duration: Union[int, Literal["auto"]] | Omit = omit, - prompt_text: str | Omit = omit, - ratio: Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] - | Omit = omit, - reference_audio: Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, - seed: int | Omit = omit, - # 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, - ) -> AsyncNewTaskCreatedResponse: - """ - This endpoint will start a new task to generate a video from an image. - - Args: - prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or - omit position for reference images. The two modes cannot be mixed. - - audio: Whether to generate audio for the video. - - duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is - billed at the variant maximum up front; unused credits are refunded after the - generation finishes. - - prompt_text: An optional text prompt up to 15000 characters describing what should appear in - the output. - - ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. - - reference_audio: An optional array of audio references. The total combined duration must not - exceed 30 seconds. - - seed: If unspecified, a random number is chosen. Varying the seed integer is a way to - get different results for the same other request parameters. Using the same seed - integer for an identical request will produce similar results. - - 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 - """ - ... - @overload async def create( self, @@ -1968,14 +2644,14 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. + prompt_image: The start frame of the output video. The output keeps its aspect ratio, which + (width / height) must be between 0.4 and 2.5. See + [our docs](/assets/inputs#images) for image input requirements. duration: The number of seconds of duration for the output video. @@ -1998,7 +2674,7 @@ async def create( self, *, model: Literal["wan3"], - prompt_image: Union[str, Iterable[object]], + prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]], prompt_text: str, audio: bool | Omit = omit, duration: int | Omit = omit, @@ -2031,7 +2707,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2082,7 +2758,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2113,7 +2789,7 @@ async def create( self, *, model: Literal["wan3_prime"], - prompt_image: Union[str, Iterable[object]], + prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]], prompt_text: str, audio: bool | Omit = omit, duration: int | Omit = omit, @@ -2146,7 +2822,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2198,7 +2874,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2231,6 +2907,90 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["seedance2_5"], + prompt_image: Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]], + audio: bool | Omit = omit, + draft: bool | Omit = omit, + duration: Union[int, Literal["auto"]] | Omit = omit, + output_format: Literal["mp4", "mov"] | Omit = omit, + prompt_text: str | Omit = omit, + ratio: Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] + | Omit = omit, + reference_audio: Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> ImageToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from an image. + + Args: + prompt_image: An image or array of images. Use position `first`/`last` for keyframe mode, or + omit position for reference images. The two modes cannot be mixed. + + audio: Whether to generate audio for the video. + + draft: Generate a cheap 480p preview instead of a full-quality video. The returned task + ID can later be enhanced to a 1080p video with the same content by passing it as + `draftTaskId` to `text_to_video`. Drafts can be enhanced within 7 days of + creation. Defaults to false. + + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is + billed at the variant maximum up front; unused credits are refunded after the + generation finishes. + + output_format: Container for the output video. `mov` keeps high colour precision for grading + and compositing. Defaults to `mp4`. Draft mode only supports `mp4`. + + prompt_text: An optional text prompt up to 15000 characters describing what should appear in + the output. + + ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. + + reference_audio: An optional array of audio references. The total combined duration must not + exceed 30 seconds. + + seed: If unspecified, a random number is chosen. Varying the seed integer is a way to + get different results for the same other request parameters. Using the same seed + integer for an identical request will produce similar results. + + 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 + """ + ... + @overload async def create( self, @@ -2246,14 +3006,14 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> ImageToVideoCreateResponse: """ This endpoint will start a new task to generate a video from an image. Args: - prompt_image: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. + prompt_image: The start frame of the output video. The output keeps its aspect ratio, which + (width / height) must be between 0.4 and 2.5. See + [our docs](/assets/inputs#images) for image input requirements. duration: The number of seconds of duration for the output video. @@ -2275,50 +3035,74 @@ async def create( @required_args( ["duration", "model", "prompt_image", "prompt_text", "ratio"], ["model", "prompt_image", "ratio"], - ["model", "prompt_image", "prompt_text"], ["model", "prompt_image"], + ["model", "prompt_image", "prompt_text"], ) async def create( self, *, - duration: int | Literal[4, 6, 8] | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, + duration: int + | Literal[4, 6, 8] + | Literal[5, 10] + | Union[int, Literal["auto"]] + | Union[Literal["auto"], int] + | Omit = omit, model: Literal["gen4.5"] | Literal["gen4_turbo"] | Literal["veo3.1"] | Literal["veo3.1_fast"] + | Literal["klingO3_4k"] | Literal["hailuo3"] + | Literal["kling3.0_4k"] | Literal["happyhorse_1_0"] + | Literal["kling2.5_turbo_pro"] + | Literal["kling3.0_pro"] + | Literal["kling3.0_standard"] + | Literal["klingO3_pro"] + | Literal["klingO3_standard"] | Literal["seedance2"] | Literal["seedance2_fast"] | Literal["seedance2_mini"] | Literal["gemini_omni_flash"] - | Literal["seedance2_5"] | Literal["grok_imagine_1_5"] | Literal["wan3"] | Literal["gemini_omni_flash_1.1"] | Literal["wan3_prime"] | Literal["h3_max"] + | Literal["seedance2_5"] | Literal["grok_imagine_1_5_lite"], prompt_image: Union[str, Iterable[image_to_video_create_params.Gen4_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Gen4TurboPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Veo3_1PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Veo3_1FastPromptImagePromptImage]] - | Union[str, Iterable[object]] + | Union[str, Iterable[image_to_video_create_params.KlingO3_4kPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling3_0_4kPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Happyhorse1_0PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling2_5TurboProPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling3_0ProPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Kling3_0StandardPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3ProPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3StandardPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2FastPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2MiniPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlashPromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlash1_1PromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.H3MaxPromptImagePromptImage]] + | Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5LitePromptImagePromptImage]], prompt_text: str | Omit = omit, ratio: Literal["1280:720", "720:1280", "1104:832", "960:960", "832:1104", "1584:672"] | Literal["1280:720", "720:1280", "1104:832", "832:1104", "960:960", "1584:672"] | Literal["1280:720", "720:1280", "1080:1920", "1920:1080"] + | Literal["3840:2160", "2160:3840", "2880:2880"] | Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] + | Literal["1920:1080", "1080:1920", "1440:1440"] + | Literal["1280:720", "720:1280", "960:960"] | Literal[ "992:432", "864:496", @@ -2360,26 +3144,6 @@ async def create( "720:1280", ] | Literal["1280:720", "720:1280"] - | Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] | Literal[ "832:480", "720:544", @@ -2401,6 +3165,26 @@ async def create( "auto_1080p", ] | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + | Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] | Literal["auto_480p", "auto_720p", "auto_1080p"] | Omit = omit, content_moderation: image_to_video_create_params.Gen4_5ContentModeration @@ -2420,28 +3204,42 @@ async def create( "hdr_exr_acescg_sequence_1_3", "hdr_exr_acescg_sequence_2_0", ] + | Literal["mp4", "mov"] | Omit = omit, prores_profile: Literal["422", "4444", "422 Proxy", "422 LT", "422 HQ", "4444 XQ"] | Omit = omit, seed: int | Omit = omit, audio: bool | Omit = omit, negative_prompt: str | Omit = omit, + provider_settings: image_to_video_create_params.KlingO3_4kProviderSettings + | image_to_video_create_params.Kling3_0_4kProviderSettings + | image_to_video_create_params.Kling3_0ProProviderSettings + | image_to_video_create_params.Kling3_0StandardProviderSettings + | image_to_video_create_params.KlingO3ProProviderSettings + | image_to_video_create_params.KlingO3StandardProviderSettings + | Omit = omit, + references: Union[str, Iterable[image_to_video_create_params.KlingO3_4kReferencesReferenceImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3ProReferencesReferenceImage]] + | Union[str, Iterable[image_to_video_create_params.KlingO3StandardReferencesReferenceImage]] + | Omit = omit, reference_audio: Iterable[image_to_video_create_params.Hailuo3ReferenceAudio] | Iterable[image_to_video_create_params.Seedance2ReferenceAudio] | Iterable[image_to_video_create_params.Seedance2FastReferenceAudio] | Iterable[image_to_video_create_params.Seedance2MiniReferenceAudio] - | Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Iterable[image_to_video_create_params.Wan3ReferenceAudio] | Iterable[image_to_video_create_params.Wan3PrimeReferenceAudio] + | Iterable[image_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, resolution: Literal["768p", "2k", "768P", "2K"] | Literal["720p", "1080p", "720P", "1080P"] | Literal["480p", "720p", "1080p"] | Literal["480p", "768p"] | Omit = omit, + cfg_scale: float | Omit = omit, reference_videos: Iterable[image_to_video_create_params.Wan3ReferenceVideo] | Iterable[image_to_video_create_params.Wan3PrimeReferenceVideo] | Omit = omit, prompt_expansion_mode: Literal["disabled", "balanced", "quality"] | Omit = omit, + draft: bool | Omit = omit, # 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, @@ -2464,10 +3262,14 @@ async def create( "seed": seed, "audio": audio, "negative_prompt": negative_prompt, + "provider_settings": provider_settings, + "references": references, "reference_audio": reference_audio, "resolution": resolution, + "cfg_scale": cfg_scale, "reference_videos": reference_videos, "prompt_expansion_mode": prompt_expansion_mode, + "draft": draft, }, image_to_video_create_params.ImageToVideoCreateParams, ), diff --git a/src/runwayml/resources/organization/webapp/audit_logs.py b/src/runwayml/resources/organization/webapp/audit_logs.py index 0bce466b..55f01814 100644 --- a/src/runwayml/resources/organization/webapp/audit_logs.py +++ b/src/runwayml/resources/organization/webapp/audit_logs.py @@ -120,12 +120,13 @@ def list( actions: Restrict results to these audit log actions, as a comma-separated list of up to 50 actions. Allowed values: `UserLogin`, `PasswordChanged`, `EmailChangeRequested`, `EmailChanged`, `UserRegistered`, `UserAccountDeleted`, - `WorkspaceCreated`, `WorkspaceDeleted`, `MemberInvited`, `MemberRemoved`, - `MemberRoleChanged`, `InviteAccepted`, `MemberJoinedViaDomain`, - `TeamSettingsUpdated`, `InviteLinkToggled`, `UserGroupCreated`, - `UserGroupUpdated`, `UserGroupDeleted`, `UserGroupArchived`, - `UserGroupRestored`, `UserGroupMemberAdded`, `UserGroupMemberRemoved`, - `UserGroupCreditCapUpdated`, `SSOLogin`, `SSOUserProvisioned`, + `WorkspaceCreated`, `WorkspaceDeleted`, `MemberInvited`, + `MemberInviteReminderSent`, `MemberRemoved`, `MemberRoleChanged`, + `InviteAccepted`, `MemberJoinedViaDomain`, `TeamSettingsUpdated`, + `InviteLinkToggled`, `UserGroupCreated`, `UserGroupUpdated`, `UserGroupDeleted`, + `UserGroupArchived`, `UserGroupRestored`, `UserGroupMemberAdded`, + `UserGroupMemberRemoved`, `UserGroupCreditCapUpdated`, + `UserGroupVisibilityUpdated`, `SSOLogin`, `SSOUserProvisioned`, `SSOConfigCreated`, `SSOUserAutoAddedToTeam`, `SSODomainRegistrationCloned`, `AssetCreated`, `AssetUpdated`, `AssetDeleted`, `AssetDownloaded`, `AssetShared`, `AssetUnshared`, `CommentCreated`, `CommentEdited`, @@ -144,7 +145,10 @@ def list( `AgentConnectorSessionDisabled`, `GenerationCreated`, `StudioSessionOpened`, `AccountLinkCreated`, `AccountLinkDeleted`, `AdConnectionAuthorizationStarted`, `AdConnectionConnected`, `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, - `AdConnectionDisconnected`, `OrganizationSettingsUpdated`, + `AdConnectionDisconnected`, `AdWorkspaceOnboardingUpdated`, + `AdCreativeReviewSubmitted`, `AdCreativeReviewCancelled`, + `AdCreativeReviewDecided`, `AdCreativeApprovalRevoked`, `AdCreativeArchived`, + `AdCreativeUnarchived`, `OrganizationSettingsUpdated`, `OrganizationDisabledModelsUpdated`, `OrganizationAgentSandboxUpdated`, `OrganizationApiAccountReleased`, `OrganizationApiAccountMemberInvited`, `OrganizationApiAccountMemberRoleChanged`, @@ -152,7 +156,7 @@ def list( `WorkspaceTagCreated`, `WorkspaceTagUpdated`, `WorkspaceTagDeleted`, `WorkspaceTagAssigned`, `WorkspaceTagUnassigned`, `MeteredBillingConfigUpdated`, `MeteredBillingRefillTriggered`, `MeteredBillingRetryTriggered`, - `EnterpriseSpendCapEnforcementUpdated`, + `EnterpriseSpendCapEnforcementUpdated`, `OnboardingBonusGranted`, `AwsMarketplaceEnterpriseSubscriptionLinked`. actor_emails: Restrict results to entries performed by the users with these emails, as a @@ -298,12 +302,13 @@ def list( actions: Restrict results to these audit log actions, as a comma-separated list of up to 50 actions. Allowed values: `UserLogin`, `PasswordChanged`, `EmailChangeRequested`, `EmailChanged`, `UserRegistered`, `UserAccountDeleted`, - `WorkspaceCreated`, `WorkspaceDeleted`, `MemberInvited`, `MemberRemoved`, - `MemberRoleChanged`, `InviteAccepted`, `MemberJoinedViaDomain`, - `TeamSettingsUpdated`, `InviteLinkToggled`, `UserGroupCreated`, - `UserGroupUpdated`, `UserGroupDeleted`, `UserGroupArchived`, - `UserGroupRestored`, `UserGroupMemberAdded`, `UserGroupMemberRemoved`, - `UserGroupCreditCapUpdated`, `SSOLogin`, `SSOUserProvisioned`, + `WorkspaceCreated`, `WorkspaceDeleted`, `MemberInvited`, + `MemberInviteReminderSent`, `MemberRemoved`, `MemberRoleChanged`, + `InviteAccepted`, `MemberJoinedViaDomain`, `TeamSettingsUpdated`, + `InviteLinkToggled`, `UserGroupCreated`, `UserGroupUpdated`, `UserGroupDeleted`, + `UserGroupArchived`, `UserGroupRestored`, `UserGroupMemberAdded`, + `UserGroupMemberRemoved`, `UserGroupCreditCapUpdated`, + `UserGroupVisibilityUpdated`, `SSOLogin`, `SSOUserProvisioned`, `SSOConfigCreated`, `SSOUserAutoAddedToTeam`, `SSODomainRegistrationCloned`, `AssetCreated`, `AssetUpdated`, `AssetDeleted`, `AssetDownloaded`, `AssetShared`, `AssetUnshared`, `CommentCreated`, `CommentEdited`, @@ -322,7 +327,10 @@ def list( `AgentConnectorSessionDisabled`, `GenerationCreated`, `StudioSessionOpened`, `AccountLinkCreated`, `AccountLinkDeleted`, `AdConnectionAuthorizationStarted`, `AdConnectionConnected`, `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, - `AdConnectionDisconnected`, `OrganizationSettingsUpdated`, + `AdConnectionDisconnected`, `AdWorkspaceOnboardingUpdated`, + `AdCreativeReviewSubmitted`, `AdCreativeReviewCancelled`, + `AdCreativeReviewDecided`, `AdCreativeApprovalRevoked`, `AdCreativeArchived`, + `AdCreativeUnarchived`, `OrganizationSettingsUpdated`, `OrganizationDisabledModelsUpdated`, `OrganizationAgentSandboxUpdated`, `OrganizationApiAccountReleased`, `OrganizationApiAccountMemberInvited`, `OrganizationApiAccountMemberRoleChanged`, @@ -330,7 +338,7 @@ def list( `WorkspaceTagCreated`, `WorkspaceTagUpdated`, `WorkspaceTagDeleted`, `WorkspaceTagAssigned`, `WorkspaceTagUnassigned`, `MeteredBillingConfigUpdated`, `MeteredBillingRefillTriggered`, `MeteredBillingRetryTriggered`, - `EnterpriseSpendCapEnforcementUpdated`, + `EnterpriseSpendCapEnforcementUpdated`, `OnboardingBonusGranted`, `AwsMarketplaceEnterpriseSubscriptionLinked`. actor_emails: Restrict results to entries performed by the users with these emails, as a diff --git a/src/runwayml/resources/organization/webapp/webapp.py b/src/runwayml/resources/organization/webapp/webapp.py index 6eda9e03..9d175a7c 100644 --- a/src/runwayml/resources/organization/webapp/webapp.py +++ b/src/runwayml/resources/organization/webapp/webapp.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Union -from datetime import datetime +from datetime import date, datetime import httpx @@ -60,9 +60,9 @@ def with_streaming_response(self) -> WebappResourceWithStreamingResponse: def list_usage( self, *, - from_: Union[str, datetime], + from_: Union[Union[str, datetime], Union[str, date]], limit: int, - to: Union[str, datetime], + to: Union[Union[str, datetime], Union[str, date]], cursor: str | Omit = omit, organization_id: str | Omit = omit, workspace_ids: str | Omit = omit, @@ -80,11 +80,13 @@ def list_usage( Authorized via that account link. Args: - from_: Start of the time window (inclusive), ISO-8601 datetime. + from_: Start of the time window (inclusive), ISO-8601 datetime or date. A date means + midnight UTC. limit: The maximum number of items to return per page. - to: End of the time window (exclusive), ISO-8601 datetime. A `cursor` can only + to: End of the time window (exclusive), ISO-8601 datetime or date. A date means + midnight UTC, so `to=2026-08-01` covers all of July 31. A `cursor` can only narrow this window, never extend it past `to`. cursor: Cursor from a previous response for fetching the next page of results. @@ -154,9 +156,9 @@ def with_streaming_response(self) -> AsyncWebappResourceWithStreamingResponse: def list_usage( self, *, - from_: Union[str, datetime], + from_: Union[Union[str, datetime], Union[str, date]], limit: int, - to: Union[str, datetime], + to: Union[Union[str, datetime], Union[str, date]], cursor: str | Omit = omit, organization_id: str | Omit = omit, workspace_ids: str | Omit = omit, @@ -174,11 +176,13 @@ def list_usage( Authorized via that account link. Args: - from_: Start of the time window (inclusive), ISO-8601 datetime. + from_: Start of the time window (inclusive), ISO-8601 datetime or date. A date means + midnight UTC. limit: The maximum number of items to return per page. - to: End of the time window (exclusive), ISO-8601 datetime. A `cursor` can only + to: End of the time window (exclusive), ISO-8601 datetime or date. A date means + midnight UTC, so `to=2026-08-01` covers all of July 31. A `cursor` can only narrow this window, never extend it past `to`. cursor: Cursor from a previous response for fetching the next page of results. diff --git a/src/runwayml/resources/routers.py b/src/runwayml/resources/routers.py index e1e310e2..a37c9f43 100644 --- a/src/runwayml/resources/routers.py +++ b/src/runwayml/resources/routers.py @@ -162,7 +162,9 @@ def update( settings: Nested merge: omitted settings fields keep their current values. When models is present, omitted models.mode or models.ids are preserved (sending only - optimizeFor does not clear the model allowlist or credit ceiling). + optimizeFor does not clear the model allowlist or credit ceiling). Set + maxCreditsPerGeneration, or one of its modalities, to null to remove those + credit caps. extra_headers: Send extra headers @@ -460,7 +462,9 @@ async def update( settings: Nested merge: omitted settings fields keep their current values. When models is present, omitted models.mode or models.ids are preserved (sending only - optimizeFor does not clear the model allowlist or credit ceiling). + optimizeFor does not clear the model allowlist or credit ceiling). Set + maxCreditsPerGeneration, or one of its modalities, to null to remove those + credit caps. extra_headers: Send extra headers diff --git a/src/runwayml/resources/text_to_image.py b/src/runwayml/resources/text_to_image.py index 7fa9d1e9..477de39d 100644 --- a/src/runwayml/resources/text_to_image.py +++ b/src/runwayml/resources/text_to_image.py @@ -627,6 +627,59 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["gemini_image3.1_flash_lite"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + ], + output_count: Literal[1, 4] | Omit = omit, + reference_images: Iterable[text_to_image_create_params.GeminiImage3_1FlashLiteReferenceImage] | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: This should describe in detail what should appear in the output. + + ratio: The resolution of the output image. + + output_count: The number of images to generate. Increasing this number will affect the number + of credits consumed by the generation. Up to four images can be generated at + once. + + reference_images: An array of up to 14 images to be used as references for the generated image + output. Up to five can pass `subject: "human"` and up to nine can pass + `subject: "object"`. + + 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 + """ + ... + @overload def create( self, @@ -863,6 +916,127 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["bria_fibo_1_5"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "2048:2048", + "1536:2304", + "2304:1536", + "1536:2048", + "2048:1536", + "1536:1920", + "1920:1536", + "1152:2048", + "2048:1152", + ], + output_format: Literal["png", "jpeg"] | Omit = omit, + reference_images: Iterable[text_to_image_create_params.BriaFibo1_5ReferenceImage] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A non-empty text prompt describing what should appear in the output image. + + ratio: The resolution of the output image, expressed as `:`. 1MP sizes + cost 5 credits per image and 4MP sizes 10. + + output_format: The file format of the output image. Defaults to png. + + reference_images: Up to 1 image to guide the generation. The prompt describes how the output + should build on it. + + seed: If unspecified, a random number is chosen. Using the same seed with an identical + request reproduces the same image. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["bria_fibo_edit_1_5"], + prompt_text: str, + output_format: Literal["png", "jpeg"] | Omit = omit, + ratio: Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "auto", + ] + | Omit = omit, + reference_images: Iterable[text_to_image_create_params.BriaFiboEdit1_5ReferenceImage] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: An instruction describing how to edit the reference images. + + output_format: The file format of the output image. Defaults to png. + + ratio: The resolution of the output image, expressed as `:`. Omit it or + use `auto` to keep the framing of the first reference image. Choosing a size + requires at least 2 reference images; a single image always keeps its own + framing. + + reference_images: 1 to 4 images to edit. With several, the instruction describes how to combine + them. + + seed: If unspecified, a random number is chosen. Using the same seed with an identical + request reproduces the same image. + + 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 + """ + ... + @overload def create( self, @@ -1006,6 +1180,156 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["seedream5_flash"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "1184:896", + "896:1184", + "1376:768", + "768:1376", + "1248:832", + "832:1248", + "1568:672", + "2048:2048", + "2304:1728", + "1728:2304", + "2848:1600", + "1600:2848", + "2496:1664", + "1664:2496", + "3136:1344", + "auto_1k", + "auto_2k", + ], + output_count: int | Omit = omit, + output_format: Literal["png", "jpeg"] | Omit = omit, + reference_images: Iterable[text_to_image_create_params.Seedream5FlashReferenceImage] | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A description of the image you want to generate. + + ratio: The resolution of the output image, expressed as `:`. Use + `auto_1k` or `auto_2k` to let the model pick the aspect ratio at a fixed + resolution tier. + + output_count: The number of images to generate. Increasing this number will affect the number + of credits consumed by the generation. + + output_format: The file format of the output image. Defaults to png. + + reference_images: Images to edit or combine. Refer to them in the prompt by upload order (Figure + 1, Figure 2, and so on). + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["nano_banana_2.1"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + "512:2064", + "2064:512", + "352:2928", + "2928:352", + "2048:2048", + "1696:2528", + "2528:1696", + "1792:2400", + "2400:1792", + "1856:2304", + "2304:1856", + "1536:2752", + "2752:1536", + "3168:1344", + "1024:4128", + "4128:1024", + "704:5856", + "5856:704", + "4096:4096", + "3392:5056", + "5056:3392", + "3584:4800", + "4800:3584", + "3712:4608", + "4608:3712", + "3072:5504", + "5504:3072", + "6336:2688", + "2048:8256", + "8256:2048", + "1408:11712", + "11712:1408", + ], + output_count: int | Omit = omit, + reference_images: Iterable[text_to_image_create_params.NanoBanana2_1ReferenceImage] | Omit = omit, + thinking_level: Literal["minimal", "medium", "high"] | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A description of the image you want to generate. + + ratio: The resolution of the output image. + + output_count: The number of images to generate. Increasing this number will affect the number + of credits consumed by the generation. + + reference_images: Up to 14 images to edit, combine, or use as references for the output. + + thinking_level: How much the model reasons about the prompt before generating. Defaults to + medium. + + 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 + """ + ... + @overload def create( self, @@ -1069,11 +1393,16 @@ def create( | Literal["seedream5_pro"] | Literal["seedream5_lite"] | Literal["grok_imagine_image_2"] + | Literal["gemini_image3.1_flash_lite"] | Literal["gemini_image3_pro"] | Literal["gpt_image_2_5_flare"] | Literal["gpt_image_2_5_sunburst"] + | Literal["bria_fibo_1_5"] + | Literal["bria_fibo_edit_1_5"] | Literal["ideogram_4_0"] | Literal["ideogram_4_5"] + | Literal["seedream5_flash"] + | Literal["nano_banana_2.1"] | Literal["gemini_2.5_flash"], prompt_text: str, ratio: Literal[ @@ -1265,6 +1594,18 @@ def create( "auto_1k", "auto_2k", ] + | Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + ] | Literal[ "1344:768", "768:1344", @@ -1297,6 +1638,38 @@ def create( "5504:3072", "6336:2688", ] + | Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "2048:2048", + "1536:2304", + "2304:1536", + "1536:2048", + "2048:1536", + "1536:1920", + "1920:1536", + "1152:2048", + "2048:1152", + ] + | Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "auto", + ] | Literal[ "2048:2048", "2560:1440", @@ -1337,6 +1710,70 @@ def create( "704:1408", "auto", ] + | Literal[ + "1024:1024", + "1184:896", + "896:1184", + "1376:768", + "768:1376", + "1248:832", + "832:1248", + "1568:672", + "2048:2048", + "2304:1728", + "1728:2304", + "2848:1600", + "1600:2848", + "2496:1664", + "1664:2496", + "3136:1344", + "auto_1k", + "auto_2k", + ] + | Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + "512:2064", + "2064:512", + "352:2928", + "2928:352", + "2048:2048", + "1696:2528", + "2528:1696", + "1792:2400", + "2400:1792", + "1856:2304", + "2304:1856", + "1536:2752", + "2752:1536", + "3168:1344", + "1024:4128", + "4128:1024", + "704:5856", + "5856:704", + "4096:4096", + "3392:5056", + "5056:3392", + "3584:4800", + "4800:3584", + "3712:4608", + "4608:3712", + "3072:5504", + "5504:3072", + "6336:2688", + "2048:8256", + "8256:2048", + "1408:11712", + "11712:1408", + ] | Literal[ "1344:768", "768:1344", @@ -1358,11 +1795,16 @@ def create( | Iterable[text_to_image_create_params.Seedream5ProReferenceImage] | Iterable[text_to_image_create_params.Seedream5LiteReferenceImage] | Iterable[text_to_image_create_params.GrokImagineImage2ReferenceImage] + | Iterable[text_to_image_create_params.GeminiImage3_1FlashLiteReferenceImage] | Iterable[text_to_image_create_params.GeminiImage3ProReferenceImage] | Iterable[text_to_image_create_params.GptImage2_5FlareReferenceImage] | Iterable[text_to_image_create_params.GptImage2_5SunburstReferenceImage] + | Iterable[text_to_image_create_params.BriaFibo1_5ReferenceImage] + | Iterable[text_to_image_create_params.BriaFiboEdit1_5ReferenceImage] | Iterable[text_to_image_create_params.Ideogram4_0ReferenceImage] | Iterable[text_to_image_create_params.Ideogram4_5ReferenceImage] + | Iterable[text_to_image_create_params.Seedream5FlashReferenceImage] + | Iterable[text_to_image_create_params.NanoBanana2_1ReferenceImage] | Iterable[text_to_image_create_params.Gemini2_5FlashReferenceImage] | Omit = omit, content_moderation: text_to_image_create_params.Gen4ImageTurboContentModeration @@ -1382,6 +1824,7 @@ def create( edit: bool | Omit = omit, mask_uri: str | Omit = omit, precise_edit: bool | Omit = omit, + thinking_level: Literal["minimal", "medium", "high"] | Omit = omit, # 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, @@ -1407,6 +1850,7 @@ def create( "edit": edit, "mask_uri": mask_uri, "precise_edit": precise_edit, + "thinking_level": thinking_level, }, text_to_image_create_params.TextToImageCreateParams, ), @@ -2014,6 +2458,59 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["gemini_image3.1_flash_lite"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + ], + output_count: Literal[1, 4] | Omit = omit, + reference_images: Iterable[text_to_image_create_params.GeminiImage3_1FlashLiteReferenceImage] | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: This should describe in detail what should appear in the output. + + ratio: The resolution of the output image. + + output_count: The number of images to generate. Increasing this number will affect the number + of credits consumed by the generation. Up to four images can be generated at + once. + + reference_images: An array of up to 14 images to be used as references for the generated image + output. Up to five can pass `subject: "human"` and up to nine can pass + `subject: "object"`. + + 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 + """ + ... + @overload async def create( self, @@ -2250,6 +2747,127 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["bria_fibo_1_5"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "2048:2048", + "1536:2304", + "2304:1536", + "1536:2048", + "2048:1536", + "1536:1920", + "1920:1536", + "1152:2048", + "2048:1152", + ], + output_format: Literal["png", "jpeg"] | Omit = omit, + reference_images: Iterable[text_to_image_create_params.BriaFibo1_5ReferenceImage] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A non-empty text prompt describing what should appear in the output image. + + ratio: The resolution of the output image, expressed as `:`. 1MP sizes + cost 5 credits per image and 4MP sizes 10. + + output_format: The file format of the output image. Defaults to png. + + reference_images: Up to 1 image to guide the generation. The prompt describes how the output + should build on it. + + seed: If unspecified, a random number is chosen. Using the same seed with an identical + request reproduces the same image. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["bria_fibo_edit_1_5"], + prompt_text: str, + output_format: Literal["png", "jpeg"] | Omit = omit, + ratio: Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "auto", + ] + | Omit = omit, + reference_images: Iterable[text_to_image_create_params.BriaFiboEdit1_5ReferenceImage] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: An instruction describing how to edit the reference images. + + output_format: The file format of the output image. Defaults to png. + + ratio: The resolution of the output image, expressed as `:`. Omit it or + use `auto` to keep the framing of the first reference image. Choosing a size + requires at least 2 reference images; a single image always keeps its own + framing. + + reference_images: 1 to 4 images to edit. With several, the instruction describes how to combine + them. + + seed: If unspecified, a random number is chosen. Using the same seed with an identical + request reproduces the same image. + + 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 + """ + ... + @overload async def create( self, @@ -2393,6 +3011,156 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["seedream5_flash"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "1184:896", + "896:1184", + "1376:768", + "768:1376", + "1248:832", + "832:1248", + "1568:672", + "2048:2048", + "2304:1728", + "1728:2304", + "2848:1600", + "1600:2848", + "2496:1664", + "1664:2496", + "3136:1344", + "auto_1k", + "auto_2k", + ], + output_count: int | Omit = omit, + output_format: Literal["png", "jpeg"] | Omit = omit, + reference_images: Iterable[text_to_image_create_params.Seedream5FlashReferenceImage] | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A description of the image you want to generate. + + ratio: The resolution of the output image, expressed as `:`. Use + `auto_1k` or `auto_2k` to let the model pick the aspect ratio at a fixed + resolution tier. + + output_count: The number of images to generate. Increasing this number will affect the number + of credits consumed by the generation. + + output_format: The file format of the output image. Defaults to png. + + reference_images: Images to edit or combine. Refer to them in the prompt by upload order (Figure + 1, Figure 2, and so on). + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["nano_banana_2.1"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + "512:2064", + "2064:512", + "352:2928", + "2928:352", + "2048:2048", + "1696:2528", + "2528:1696", + "1792:2400", + "2400:1792", + "1856:2304", + "2304:1856", + "1536:2752", + "2752:1536", + "3168:1344", + "1024:4128", + "4128:1024", + "704:5856", + "5856:704", + "4096:4096", + "3392:5056", + "5056:3392", + "3584:4800", + "4800:3584", + "3712:4608", + "4608:3712", + "3072:5504", + "5504:3072", + "6336:2688", + "2048:8256", + "8256:2048", + "1408:11712", + "11712:1408", + ], + output_count: int | Omit = omit, + reference_images: Iterable[text_to_image_create_params.NanoBanana2_1ReferenceImage] | Omit = omit, + thinking_level: Literal["minimal", "medium", "high"] | Omit = omit, + # 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, + ) -> TextToImageCreateResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A description of the image you want to generate. + + ratio: The resolution of the output image. + + output_count: The number of images to generate. Increasing this number will affect the number + of credits consumed by the generation. + + reference_images: Up to 14 images to edit, combine, or use as references for the output. + + thinking_level: How much the model reasons about the prompt before generating. Defaults to + medium. + + 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 + """ + ... + @overload async def create( self, @@ -2456,11 +3224,16 @@ async def create( | Literal["seedream5_pro"] | Literal["seedream5_lite"] | Literal["grok_imagine_image_2"] + | Literal["gemini_image3.1_flash_lite"] | Literal["gemini_image3_pro"] | Literal["gpt_image_2_5_flare"] | Literal["gpt_image_2_5_sunburst"] + | Literal["bria_fibo_1_5"] + | Literal["bria_fibo_edit_1_5"] | Literal["ideogram_4_0"] | Literal["ideogram_4_5"] + | Literal["seedream5_flash"] + | Literal["nano_banana_2.1"] | Literal["gemini_2.5_flash"], prompt_text: str, ratio: Literal[ @@ -2652,6 +3425,18 @@ async def create( "auto_1k", "auto_2k", ] + | Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + ] | Literal[ "1344:768", "768:1344", @@ -2684,6 +3469,38 @@ async def create( "5504:3072", "6336:2688", ] + | Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "2048:2048", + "1536:2304", + "2304:1536", + "1536:2048", + "2048:1536", + "1536:1920", + "1920:1536", + "1152:2048", + "2048:1152", + ] + | Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "auto", + ] | Literal[ "2048:2048", "2560:1440", @@ -2724,6 +3541,70 @@ async def create( "704:1408", "auto", ] + | Literal[ + "1024:1024", + "1184:896", + "896:1184", + "1376:768", + "768:1376", + "1248:832", + "832:1248", + "1568:672", + "2048:2048", + "2304:1728", + "1728:2304", + "2848:1600", + "1600:2848", + "2496:1664", + "1664:2496", + "3136:1344", + "auto_1k", + "auto_2k", + ] + | Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + "512:2064", + "2064:512", + "352:2928", + "2928:352", + "2048:2048", + "1696:2528", + "2528:1696", + "1792:2400", + "2400:1792", + "1856:2304", + "2304:1856", + "1536:2752", + "2752:1536", + "3168:1344", + "1024:4128", + "4128:1024", + "704:5856", + "5856:704", + "4096:4096", + "3392:5056", + "5056:3392", + "3584:4800", + "4800:3584", + "3712:4608", + "4608:3712", + "3072:5504", + "5504:3072", + "6336:2688", + "2048:8256", + "8256:2048", + "1408:11712", + "11712:1408", + ] | Literal[ "1344:768", "768:1344", @@ -2745,11 +3626,16 @@ async def create( | Iterable[text_to_image_create_params.Seedream5ProReferenceImage] | Iterable[text_to_image_create_params.Seedream5LiteReferenceImage] | Iterable[text_to_image_create_params.GrokImagineImage2ReferenceImage] + | Iterable[text_to_image_create_params.GeminiImage3_1FlashLiteReferenceImage] | Iterable[text_to_image_create_params.GeminiImage3ProReferenceImage] | Iterable[text_to_image_create_params.GptImage2_5FlareReferenceImage] | Iterable[text_to_image_create_params.GptImage2_5SunburstReferenceImage] + | Iterable[text_to_image_create_params.BriaFibo1_5ReferenceImage] + | Iterable[text_to_image_create_params.BriaFiboEdit1_5ReferenceImage] | Iterable[text_to_image_create_params.Ideogram4_0ReferenceImage] | Iterable[text_to_image_create_params.Ideogram4_5ReferenceImage] + | Iterable[text_to_image_create_params.Seedream5FlashReferenceImage] + | Iterable[text_to_image_create_params.NanoBanana2_1ReferenceImage] | Iterable[text_to_image_create_params.Gemini2_5FlashReferenceImage] | Omit = omit, content_moderation: text_to_image_create_params.Gen4ImageTurboContentModeration @@ -2769,6 +3655,7 @@ async def create( edit: bool | Omit = omit, mask_uri: str | Omit = omit, precise_edit: bool | Omit = omit, + thinking_level: Literal["minimal", "medium", "high"] | Omit = omit, # 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, @@ -2794,6 +3681,7 @@ async def create( "edit": edit, "mask_uri": mask_uri, "precise_edit": precise_edit, + "thinking_level": thinking_level, }, text_to_image_create_params.TextToImageCreateParams, ), diff --git a/src/runwayml/resources/text_to_video.py b/src/runwayml/resources/text_to_video.py index ecbb4f30..9d9e15e6 100644 --- a/src/runwayml/resources/text_to_video.py +++ b/src/runwayml/resources/text_to_video.py @@ -84,7 +84,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -161,7 +161,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -208,7 +208,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -238,6 +238,47 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["klingO3_4k"], + ratio: Literal["3840:2160", "2160:3840", "2880:2880"], + audio: bool | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3_4kProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + @overload def create( self, @@ -256,7 +297,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -293,6 +334,51 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["kling3.0_4k"], + ratio: Literal["3840:2160", "2160:3840", "2880:2880"], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.Kling3_0_4kProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + @overload def create( self, @@ -319,7 +405,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -341,6 +427,215 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["kling2.5_turbo_pro"], + prompt_text: str, + cfg_scale: float | Omit = omit, + duration: Literal[5, 10] | Omit = omit, + ratio: Literal["1920:1080", "1440:1440", "1080:1920", "1280:720", "720:720", "720:1280"] | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The duration of the output video in seconds. Defaults to 5. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["kling3.0_pro"], + ratio: Literal["1920:1080", "1080:1920", "1440:1440"], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.Kling3_0ProProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["kling3.0_standard"], + ratio: Literal["1280:720", "720:1280", "960:960"], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.Kling3_0StandardProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["klingO3_pro"], + ratio: Literal["1920:1080", "1080:1920", "1440:1440"], + audio: bool | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3ProProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["klingO3_standard"], + ratio: Literal["1280:720", "720:1280", "960:960"], + audio: bool | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + @overload def create( self, @@ -386,7 +681,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -459,7 +754,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -533,7 +828,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -588,7 +883,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -610,85 +905,6 @@ def create( """ ... - @overload - def create( - self, - *, - model: Literal["seedance2_5"], - audio: bool | Omit = omit, - duration: Union[int, Literal["auto"]] | Omit = omit, - prompt_text: str | Omit = omit, - ratio: Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] - | Omit = omit, - reference_audio: Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, - references: Iterable[text_to_video_create_params.Seedance2_5Reference] | Omit = omit, - reference_videos: Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Omit = omit, - seed: int | Omit = omit, - # 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, - ) -> NewTaskCreatedResponse: - """ - This endpoint will start a new task to generate a video from a text prompt. - - Args: - audio: Whether to generate audio for the video. - - duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is - billed at the variant maximum up front; unused credits are refunded after the - generation finishes. - - prompt_text: An optional text prompt up to 15000 characters describing what should appear in - the output. - - ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. - - reference_audio: An optional array of audio references. The total combined duration must be less - than 30 seconds. - - references: An optional array of image references (up to 30). See - [our docs](/assets/inputs#images) on image inputs for more information. - - reference_videos: An optional array of video references. The combined duration across all video - references must not exceed 30 seconds. See [our docs](/assets/inputs#videos) on - video inputs for more information. - - seed: If unspecified, a random number is chosen. Varying the seed integer is a way to - get different results for the same other request parameters. Using the same seed - integer for an identical request will produce similar results. - - 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 - """ - ... - @overload def create( self, @@ -706,7 +922,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -774,7 +990,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -826,7 +1042,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -886,7 +1102,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -937,7 +1153,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -966,6 +1182,101 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["seedance2_5"], + audio: bool | Omit = omit, + draft: bool | Omit = omit, + draft_task_id: str | Omit = omit, + duration: Union[int, Literal["auto"]] | Omit = omit, + output_format: Literal["mp4", "mov"] | Omit = omit, + prompt_text: str | Omit = omit, + ratio: Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] + | Omit = omit, + reference_audio: Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, + references: Iterable[text_to_video_create_params.Seedance2_5Reference] | Omit = omit, + reference_videos: Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + audio: Whether to generate audio for the video. Defaults to `true`. + + draft: Generate a cheap 480p preview instead of a full-quality video. The returned task + ID can later be enhanced to a 1080p video with the same content by passing it as + `draftTaskId` to `text_to_video`. Drafts can be enhanced within 7 days of + creation. Defaults to false. + + draft_task_id: The ID of a succeeded draft task to enhance to 1080p. The draft is regenerated + with its original prompt, references, and settings, so no other generation + fields may be provided. + + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is + billed at the variant maximum up front; unused credits are refunded after the + generation finishes. Defaults to 5. + + output_format: Container for the output video. `mov` keeps high colour precision for grading + and compositing. Defaults to `mp4`. Draft mode only supports `mp4`. + + prompt_text: An optional text prompt up to 15000 characters describing what should appear in + the output. + + ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. + Defaults to `1280:720`. + + reference_audio: An optional array of audio references. The total combined duration must be less + than 30 seconds. + + references: An optional array of image references (up to 30). See + [our docs](/assets/inputs#images) on image inputs for more information. + + reference_videos: An optional array of video references. The combined duration across all video + references must not exceed 30 seconds. See [our docs](/assets/inputs#videos) on + video inputs for more information. + + seed: If unspecified, a random number is chosen. Varying the seed integer is a way to + get different results for the same other request parameters. Using the same seed + integer for an identical request will produce similar results. + + 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 + """ + ... + @overload def create( self, @@ -1003,7 +1314,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1028,32 +1339,46 @@ def create( @required_args( ["duration", "model", "prompt_text", "ratio"], ["model", "prompt_text", "ratio"], + ["model", "ratio"], ["model", "prompt_text"], ["model"], ) def create( self, *, - duration: int | Literal[4, 6, 8] | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, + duration: int + | Literal[4, 6, 8] + | Literal[5, 10] + | Union[int, Literal["auto"]] + | Union[Literal["auto"], int] + | Omit = omit, model: Literal["gen4.5"] | Literal["veo3.1"] | Literal["veo3.1_fast"] + | Literal["klingO3_4k"] | Literal["hailuo3"] + | Literal["kling3.0_4k"] | Literal["happyhorse_1_0"] + | Literal["kling2.5_turbo_pro"] + | Literal["kling3.0_pro"] + | Literal["kling3.0_standard"] + | Literal["klingO3_pro"] + | Literal["klingO3_standard"] | Literal["seedance2"] | Literal["seedance2_fast"] | Literal["seedance2_mini"] | Literal["gemini_omni_flash"] - | Literal["seedance2_5"] | Literal["grok_imagine_1_5"] | Literal["wan3"] | Literal["gemini_omni_flash_1.1"] | Literal["wan3_prime"] | Literal["h3_max"] + | Literal["seedance2_5"] | Literal["grok_imagine_1_5_lite"], prompt_text: str | Omit = omit, ratio: Literal["1280:720", "720:1280"] | Literal["1280:720", "720:1280", "1080:1920", "1920:1080"] + | Literal["3840:2160", "2160:3840", "2880:2880"] | Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] | Literal[ "1280:720", @@ -1067,6 +1392,9 @@ def create( "1662:1248", "1248:1662", ] + | Literal["1920:1080", "1440:1440", "1080:1920", "1280:720", "720:720", "720:1280"] + | Literal["1920:1080", "1080:1920", "1440:1440"] + | Literal["1280:720", "720:1280", "960:960"] | Literal[ "992:432", "864:496", @@ -1107,26 +1435,6 @@ def create( "834:1112", "720:1280", ] - | Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] | Literal["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"] | Literal[ "832:480", @@ -1149,6 +1457,26 @@ def create( "auto_1080p", ] | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + | Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] | Literal[ "848:480", "480:848", @@ -1188,44 +1516,55 @@ def create( "hdr_exr_acescg_sequence_1_3", "hdr_exr_acescg_sequence_2_0", ] + | Literal["mp4", "mov"] | Omit = omit, prores_profile: Literal["422", "4444", "422 Proxy", "422 LT", "422 HQ", "4444 XQ"] | Omit = omit, seed: int | Omit = omit, audio: bool | Omit = omit, negative_prompt: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3_4kProviderSettings + | text_to_video_create_params.Kling3_0_4kProviderSettings + | text_to_video_create_params.Kling3_0ProProviderSettings + | text_to_video_create_params.Kling3_0StandardProviderSettings + | text_to_video_create_params.KlingO3ProProviderSettings + | text_to_video_create_params.KlingO3StandardProviderSettings + | Omit = omit, reference_audio: Iterable[text_to_video_create_params.Hailuo3ReferenceAudio] | Iterable[text_to_video_create_params.Seedance2ReferenceAudio] | Iterable[text_to_video_create_params.Seedance2FastReferenceAudio] | Iterable[text_to_video_create_params.Seedance2MiniReferenceAudio] - | Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Iterable[text_to_video_create_params.GrokImagine1_5ReferenceAudio] | Iterable[text_to_video_create_params.Wan3ReferenceAudio] | Iterable[text_to_video_create_params.Wan3PrimeReferenceAudio] + | Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, references: Iterable[text_to_video_create_params.Hailuo3Reference] | Iterable[text_to_video_create_params.Seedance2Reference] | Iterable[text_to_video_create_params.Seedance2FastReference] | Iterable[text_to_video_create_params.Seedance2MiniReference] - | Iterable[text_to_video_create_params.Seedance2_5Reference] | Iterable[text_to_video_create_params.GrokImagine1_5Reference] | Iterable[text_to_video_create_params.Wan3Reference] | Iterable[text_to_video_create_params.GeminiOmniFlash1_1Reference] | Iterable[text_to_video_create_params.Wan3PrimeReference] + | Iterable[text_to_video_create_params.Seedance2_5Reference] | Omit = omit, reference_videos: Iterable[text_to_video_create_params.Hailuo3ReferenceVideo] | Iterable[text_to_video_create_params.Seedance2ReferenceVideo] | Iterable[text_to_video_create_params.Seedance2FastReferenceVideo] | Iterable[text_to_video_create_params.Seedance2MiniReferenceVideo] - | Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Iterable[text_to_video_create_params.Wan3ReferenceVideo] | Iterable[text_to_video_create_params.GeminiOmniFlash1_1ReferenceVideo] | Iterable[text_to_video_create_params.Wan3PrimeReferenceVideo] + | Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Omit = omit, resolution: Literal["768p", "2k", "768P", "2K"] | Literal["480p", "720p", "1080p"] | Literal["480p", "768p"] | Omit = omit, + cfg_scale: float | Omit = omit, prompt_expansion_mode: Literal["disabled", "balanced", "quality"] | Omit = omit, + draft: bool | Omit = omit, + draft_task_id: str | Omit = omit, # 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, @@ -1247,11 +1586,15 @@ def create( "seed": seed, "audio": audio, "negative_prompt": negative_prompt, + "provider_settings": provider_settings, "reference_audio": reference_audio, "references": references, "reference_videos": reference_videos, "resolution": resolution, + "cfg_scale": cfg_scale, "prompt_expansion_mode": prompt_expansion_mode, + "draft": draft, + "draft_task_id": draft_task_id, }, text_to_video_create_params.TextToVideoCreateParams, ), @@ -1316,7 +1659,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1393,7 +1736,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1440,7 +1783,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1470,6 +1813,47 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["klingO3_4k"], + ratio: Literal["3840:2160", "2160:3840", "2880:2880"], + audio: bool | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3_4kProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + @overload async def create( self, @@ -1488,7 +1872,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1503,17 +1887,278 @@ async def create( reference_audio: An optional array of audio references. Audio references require a text prompt, and the total combined duration must not exceed 15 seconds. - references: An optional array of image references (up to 9). See - [our docs](/assets/inputs#images) on image inputs for more information. + references: An optional array of image references (up to 9). See + [our docs](/assets/inputs#images) on image inputs for more information. + + reference_videos: An optional array of video references. The combined duration across all video + references must not exceed 15 seconds. See [our docs](/assets/inputs#videos) on + video inputs for more information. + + resolution: The output resolution. Hailuo 3.0 supports 768p and 2k. + + - `768P` - Deprecated: Use "768p" instead. + - `2K` - Deprecated: Use "2k" instead. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling3.0_4k"], + ratio: Literal["3840:2160", "2160:3840", "2880:2880"], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.Kling3_0_4kProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["happyhorse_1_0"], + prompt_text: str, + duration: int | Omit = omit, + ratio: Literal[ + "1280:720", + "720:1280", + "960:960", + "1108:832", + "832:1108", + "1920:1080", + "1080:1920", + "1440:1440", + "1662:1248", + "1248:1662", + ] + | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + prompt_text: A non-empty string up to 2500 characters (measured in UTF-16 code units). This + should describe in detail what should appear in the output. + + duration: The number of seconds of duration for the output video. + + ratio: The resolution of the output video. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling2.5_turbo_pro"], + prompt_text: str, + cfg_scale: float | Omit = omit, + duration: Literal[5, 10] | Omit = omit, + ratio: Literal["1920:1080", "1440:1440", "1080:1920", "1280:720", "720:720", "720:1280"] | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The duration of the output video in seconds. Defaults to 5. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling3.0_pro"], + ratio: Literal["1920:1080", "1080:1920", "1440:1440"], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.Kling3_0ProProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["kling3.0_standard"], + ratio: Literal["1280:720", "720:1280", "960:960"], + audio: bool | Omit = omit, + cfg_scale: float | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.Kling3_0StandardProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. + + cfg_scale: Creativity/freedom scale for generation. 0 gives the model maximum creative + freedom, 1 makes it follow the prompt most strictly. Defaults to 0.5. + + duration: The number of seconds of duration for the output video. + + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["klingO3_pro"], + ratio: Literal["1920:1080", "1080:1920", "1440:1440"], + audio: bool | Omit = omit, + duration: int | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3ProProviderSettings | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + ratio: The resolution of the output video. - reference_videos: An optional array of video references. The combined duration across all video - references must not exceed 15 seconds. See [our docs](/assets/inputs#videos) on - video inputs for more information. + audio: Whether to generate audio for the video. - resolution: The output resolution. Hailuo 3.0 supports 768p and 2k. + duration: The number of seconds of duration for the output video. - - `768P` - Deprecated: Use "768p" instead. - - `2K` - Deprecated: Use "2k" instead. + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. extra_headers: Send extra headers @@ -1529,39 +2174,32 @@ async def create( async def create( self, *, - model: Literal["happyhorse_1_0"], - prompt_text: str, + model: Literal["klingO3_standard"], + ratio: Literal["1280:720", "720:1280", "960:960"], + audio: bool | Omit = omit, duration: int | Omit = omit, - ratio: Literal[ - "1280:720", - "720:1280", - "960:960", - "1108:832", - "832:1108", - "1920:1080", - "1080:1920", - "1440:1440", - "1662:1248", - "1248:1662", - ] - | Omit = omit, + prompt_text: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, # 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, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. Args: - prompt_text: A non-empty string up to 2500 characters (measured in UTF-16 code units). This - should describe in detail what should appear in the output. + ratio: The resolution of the output video. + + audio: Whether to generate audio for the video. duration: The number of seconds of duration for the output video. - ratio: The resolution of the output video. + prompt_text: A text prompt describing what should appear in the output video. + + provider_settings: Provider-specific settings for multishot video generation. extra_headers: Send extra headers @@ -1618,7 +2256,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1691,7 +2329,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1765,7 +2403,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1820,7 +2458,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1842,85 +2480,6 @@ async def create( """ ... - @overload - async def create( - self, - *, - model: Literal["seedance2_5"], - audio: bool | Omit = omit, - duration: Union[int, Literal["auto"]] | Omit = omit, - prompt_text: str | Omit = omit, - ratio: Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] - | Omit = omit, - reference_audio: Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, - references: Iterable[text_to_video_create_params.Seedance2_5Reference] | Omit = omit, - reference_videos: Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Omit = omit, - seed: int | Omit = omit, - # 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, - ) -> AsyncNewTaskCreatedResponse: - """ - This endpoint will start a new task to generate a video from a text prompt. - - Args: - audio: Whether to generate audio for the video. - - duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is - billed at the variant maximum up front; unused credits are refunded after the - generation finishes. - - prompt_text: An optional text prompt up to 15000 characters describing what should appear in - the output. - - ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. - - reference_audio: An optional array of audio references. The total combined duration must be less - than 30 seconds. - - references: An optional array of image references (up to 30). See - [our docs](/assets/inputs#images) on image inputs for more information. - - reference_videos: An optional array of video references. The combined duration across all video - references must not exceed 30 seconds. See [our docs](/assets/inputs#videos) on - video inputs for more information. - - seed: If unspecified, a random number is chosen. Varying the seed integer is a way to - get different results for the same other request parameters. Using the same seed - integer for an identical request will produce similar results. - - 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 - """ - ... - @overload async def create( self, @@ -1938,7 +2497,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2006,7 +2565,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2058,7 +2617,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2118,7 +2677,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2169,7 +2728,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2198,6 +2757,101 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["seedance2_5"], + audio: bool | Omit = omit, + draft: bool | Omit = omit, + draft_task_id: str | Omit = omit, + duration: Union[int, Literal["auto"]] | Omit = omit, + output_format: Literal["mp4", "mov"] | Omit = omit, + prompt_text: str | Omit = omit, + ratio: Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] + | Omit = omit, + reference_audio: Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, + references: Iterable[text_to_video_create_params.Seedance2_5Reference] | Omit = omit, + reference_videos: Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> TextToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a text prompt. + + Args: + audio: Whether to generate audio for the video. Defaults to `true`. + + draft: Generate a cheap 480p preview instead of a full-quality video. The returned task + ID can later be enhanced to a 1080p video with the same content by passing it as + `draftTaskId` to `text_to_video`. Drafts can be enhanced within 7 days of + creation. Defaults to false. + + draft_task_id: The ID of a succeeded draft task to enhance to 1080p. The draft is regenerated + with its original prompt, references, and settings, so no other generation + fields may be provided. + + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is + billed at the variant maximum up front; unused credits are refunded after the + generation finishes. Defaults to 5. + + output_format: Container for the output video. `mov` keeps high colour precision for grading + and compositing. Defaults to `mp4`. Draft mode only supports `mp4`. + + prompt_text: An optional text prompt up to 15000 characters describing what should appear in + the output. + + ratio: The resolution of the output video. Seedance 2.5 supports 480p, 720p, and 1080p. + Defaults to `1280:720`. + + reference_audio: An optional array of audio references. The total combined duration must be less + than 30 seconds. + + references: An optional array of image references (up to 30). See + [our docs](/assets/inputs#images) on image inputs for more information. + + reference_videos: An optional array of video references. The combined duration across all video + references must not exceed 30 seconds. See [our docs](/assets/inputs#videos) on + video inputs for more information. + + seed: If unspecified, a random number is chosen. Varying the seed integer is a way to + get different results for the same other request parameters. Using the same seed + integer for an identical request will produce similar results. + + 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 + """ + ... + @overload async def create( self, @@ -2235,7 +2889,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> TextToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2260,32 +2914,46 @@ async def create( @required_args( ["duration", "model", "prompt_text", "ratio"], ["model", "prompt_text", "ratio"], + ["model", "ratio"], ["model", "prompt_text"], ["model"], ) async def create( self, *, - duration: int | Literal[4, 6, 8] | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, + duration: int + | Literal[4, 6, 8] + | Literal[5, 10] + | Union[int, Literal["auto"]] + | Union[Literal["auto"], int] + | Omit = omit, model: Literal["gen4.5"] | Literal["veo3.1"] | Literal["veo3.1_fast"] + | Literal["klingO3_4k"] | Literal["hailuo3"] + | Literal["kling3.0_4k"] | Literal["happyhorse_1_0"] + | Literal["kling2.5_turbo_pro"] + | Literal["kling3.0_pro"] + | Literal["kling3.0_standard"] + | Literal["klingO3_pro"] + | Literal["klingO3_standard"] | Literal["seedance2"] | Literal["seedance2_fast"] | Literal["seedance2_mini"] | Literal["gemini_omni_flash"] - | Literal["seedance2_5"] | Literal["grok_imagine_1_5"] | Literal["wan3"] | Literal["gemini_omni_flash_1.1"] | Literal["wan3_prime"] | Literal["h3_max"] + | Literal["seedance2_5"] | Literal["grok_imagine_1_5_lite"], prompt_text: str | Omit = omit, ratio: Literal["1280:720", "720:1280"] | Literal["1280:720", "720:1280", "1080:1920", "1920:1080"] + | Literal["3840:2160", "2160:3840", "2880:2880"] | Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] | Literal[ "1280:720", @@ -2299,6 +2967,9 @@ async def create( "1662:1248", "1248:1662", ] + | Literal["1920:1080", "1440:1440", "1080:1920", "1280:720", "720:720", "720:1280"] + | Literal["1920:1080", "1080:1920", "1440:1440"] + | Literal["1280:720", "720:1280", "960:960"] | Literal[ "992:432", "864:496", @@ -2339,26 +3010,6 @@ async def create( "834:1112", "720:1280", ] - | Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] | Literal["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"] | Literal[ "832:480", @@ -2381,6 +3032,26 @@ async def create( "auto_1080p", ] | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + | Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] | Literal[ "848:480", "480:848", @@ -2420,44 +3091,55 @@ async def create( "hdr_exr_acescg_sequence_1_3", "hdr_exr_acescg_sequence_2_0", ] + | Literal["mp4", "mov"] | Omit = omit, prores_profile: Literal["422", "4444", "422 Proxy", "422 LT", "422 HQ", "4444 XQ"] | Omit = omit, seed: int | Omit = omit, audio: bool | Omit = omit, negative_prompt: str | Omit = omit, + provider_settings: text_to_video_create_params.KlingO3_4kProviderSettings + | text_to_video_create_params.Kling3_0_4kProviderSettings + | text_to_video_create_params.Kling3_0ProProviderSettings + | text_to_video_create_params.Kling3_0StandardProviderSettings + | text_to_video_create_params.KlingO3ProProviderSettings + | text_to_video_create_params.KlingO3StandardProviderSettings + | Omit = omit, reference_audio: Iterable[text_to_video_create_params.Hailuo3ReferenceAudio] | Iterable[text_to_video_create_params.Seedance2ReferenceAudio] | Iterable[text_to_video_create_params.Seedance2FastReferenceAudio] | Iterable[text_to_video_create_params.Seedance2MiniReferenceAudio] - | Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Iterable[text_to_video_create_params.GrokImagine1_5ReferenceAudio] | Iterable[text_to_video_create_params.Wan3ReferenceAudio] | Iterable[text_to_video_create_params.Wan3PrimeReferenceAudio] + | Iterable[text_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, references: Iterable[text_to_video_create_params.Hailuo3Reference] | Iterable[text_to_video_create_params.Seedance2Reference] | Iterable[text_to_video_create_params.Seedance2FastReference] | Iterable[text_to_video_create_params.Seedance2MiniReference] - | Iterable[text_to_video_create_params.Seedance2_5Reference] | Iterable[text_to_video_create_params.GrokImagine1_5Reference] | Iterable[text_to_video_create_params.Wan3Reference] | Iterable[text_to_video_create_params.GeminiOmniFlash1_1Reference] | Iterable[text_to_video_create_params.Wan3PrimeReference] + | Iterable[text_to_video_create_params.Seedance2_5Reference] | Omit = omit, reference_videos: Iterable[text_to_video_create_params.Hailuo3ReferenceVideo] | Iterable[text_to_video_create_params.Seedance2ReferenceVideo] | Iterable[text_to_video_create_params.Seedance2FastReferenceVideo] | Iterable[text_to_video_create_params.Seedance2MiniReferenceVideo] - | Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Iterable[text_to_video_create_params.Wan3ReferenceVideo] | Iterable[text_to_video_create_params.GeminiOmniFlash1_1ReferenceVideo] | Iterable[text_to_video_create_params.Wan3PrimeReferenceVideo] + | Iterable[text_to_video_create_params.Seedance2_5ReferenceVideo] | Omit = omit, resolution: Literal["768p", "2k", "768P", "2K"] | Literal["480p", "720p", "1080p"] | Literal["480p", "768p"] | Omit = omit, + cfg_scale: float | Omit = omit, prompt_expansion_mode: Literal["disabled", "balanced", "quality"] | Omit = omit, + draft: bool | Omit = omit, + draft_task_id: str | Omit = omit, # 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, @@ -2479,11 +3161,15 @@ async def create( "seed": seed, "audio": audio, "negative_prompt": negative_prompt, + "provider_settings": provider_settings, "reference_audio": reference_audio, "references": references, "reference_videos": reference_videos, "resolution": resolution, + "cfg_scale": cfg_scale, "prompt_expansion_mode": prompt_expansion_mode, + "draft": draft, + "draft_task_id": draft_task_id, }, text_to_video_create_params.TextToVideoCreateParams, ), diff --git a/src/runwayml/resources/video_to_video.py b/src/runwayml/resources/video_to_video.py index 9e7044f4..0cc82dca 100644 --- a/src/runwayml/resources/video_to_video.py +++ b/src/runwayml/resources/video_to_video.py @@ -72,7 +72,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -118,6 +118,47 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["klingO3_4k"], + prompt_text: str, + prompt_video: str, + provider_settings: video_to_video_create_params.KlingO3_4kProviderSettings | Omit = omit, + references: Union[str, Iterable[video_to_video_create_params.KlingO3_4kReferencesPromptImage]] | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + prompt_video: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + provider_settings: Provider-specific settings for multishot video generation and video editing. + + references: An optional array of reference images (up to 4). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + @overload def create( self, @@ -137,7 +178,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -178,6 +219,89 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["klingO3_pro"], + prompt_text: str, + prompt_video: str, + provider_settings: video_to_video_create_params.KlingO3ProProviderSettings | Omit = omit, + references: Union[str, Iterable[video_to_video_create_params.KlingO3ProReferencesPromptImage]] | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + prompt_video: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + provider_settings: Provider-specific settings for multishot video generation and video editing. + + references: An optional array of reference images (up to 4). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["klingO3_standard"], + prompt_text: str, + prompt_video: str, + provider_settings: video_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, + references: Union[str, Iterable[video_to_video_create_params.KlingO3StandardReferencesPromptImage]] + | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + prompt_video: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + provider_settings: Provider-specific settings for multishot video generation and video editing. + + references: An optional array of reference images (up to 4). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + @overload def create( self, @@ -224,7 +348,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -302,7 +426,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -381,7 +505,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -440,7 +564,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -463,6 +587,56 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["gemini_omni_flash_1.1"], + prompt_text: str, + video_uri: str, + duration: Union[Literal["auto"], int] | Omit = omit, + mode: Literal["reference", "extend", "edit"] | Omit = omit, + ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + | Omit = omit, + references: Iterable[video_to_video_create_params.GeminiOmniFlash1_1Reference] | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A non-empty prompt describing the output or extension. + + video_uri: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + duration: The duration in seconds. In reference mode, this is the output video length. In + extend mode, this is the amount of footage added to the input video. Use "auto" + to let the model choose a duration. + + mode: How the input video is used. `reference` generates a new video guided by the + input, `extend` continues it, and `edit` transforms it according to the prompt. + + ratio: The resolution and aspect ratio of the output video. + + references: An optional array of image references to guide the output. + + 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 + """ + ... + @overload def create( self, @@ -470,8 +644,10 @@ def create( model: Literal["seedance2_5"], prompt_video: str, audio: bool | Omit = omit, + draft: bool | Omit = omit, duration: Union[int, Literal["auto"]] | Omit = omit, mode: Literal["reference", "extend", "edit"] | Omit = omit, + output_format: Literal["mp4", "mov"] | Omit = omit, prompt_text: str | Omit = omit, ratio: Literal[ "992:432", @@ -504,7 +680,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> NewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -515,6 +691,11 @@ def create( audio: Whether to generate audio for the video. + draft: Generate a cheap 480p preview instead of a full-quality video. The returned task + ID can later be enhanced to a 1080p video with the same content by passing it as + `draftTaskId` to `text_to_video`. Drafts can be enhanced within 7 days of + creation. Defaults to false. + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is billed at the variant maximum up front; unused credits are refunded after the generation finishes. Defaults to 5. @@ -525,6 +706,9 @@ def create( ratio, so `ratio` may not be provided. `edit` modifies the input video in place, requires `promptText`, requires `duration: "auto"`, and does not accept `ratio`. + output_format: Container for the output video. `mov` keeps high colour precision for grading + and compositing. Defaults to `mp4`. Draft mode only supports `mp4`. + prompt_text: An optional text prompt up to 15000 characters describing what should appear in the output. @@ -554,56 +738,6 @@ def create( """ ... - @overload - def create( - self, - *, - model: Literal["gemini_omni_flash_1.1"], - prompt_text: str, - video_uri: str, - duration: Union[Literal["auto"], int] | Omit = omit, - mode: Literal["reference", "extend", "edit"] | Omit = omit, - ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] - | Omit = omit, - references: Iterable[video_to_video_create_params.GeminiOmniFlash1_1Reference] | Omit = omit, - # 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, - ) -> NewTaskCreatedResponse: - """ - This endpoint will start a new task to generate a video from a video. - - Args: - prompt_text: A non-empty prompt describing the output or extension. - - video_uri: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See - [our docs](/assets/inputs#videos) on video inputs for more information. - - duration: The duration in seconds. In reference mode, this is the output video length. In - extend mode, this is the amount of footage added to the input video. Use "auto" - to let the model choose a duration. - - mode: How the input video is used. `reference` generates a new video guided by the - input, `extend` continues it, and `edit` transforms it according to the prompt. - - ratio: The resolution and aspect ratio of the output video. - - references: An optional array of image references to guide the output. - - 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 - """ - ... - @required_args( ["model", "video_uri"], ["model", "prompt_text", "prompt_video"], @@ -614,17 +748,22 @@ def create( self, *, model: Literal["aleph2"] + | Literal["klingO3_4k"] | Literal["hailuo3"] + | Literal["klingO3_pro"] + | Literal["klingO3_standard"] | Literal["seedance2"] | Literal["seedance2_fast"] | Literal["seedance2_mini"] | Literal["gemini_omni_flash"] - | Literal["seedance2_5"] - | Literal["gemini_omni_flash_1.1"], + | Literal["gemini_omni_flash_1.1"] + | Literal["seedance2_5"], video_uri: str | Omit = omit, content_moderation: video_to_video_create_params.Variant0ContentModeration | Omit = omit, keyframes: Iterable[video_to_video_create_params.Variant0Keyframe] | Omit = omit, - output_format: Literal["mp4", "prores", "png_sequence", "sdr_rec709_10bit"] | Omit = omit, + output_format: Literal["mp4", "prores", "png_sequence", "sdr_rec709_10bit"] + | Literal["mp4", "mov"] + | Omit = omit, prompt_text: str | Omit = omit, prores_profile: Literal["422", "4444", "422 Proxy", "422 LT", "422 HQ", "4444 XQ"] | Omit = omit, ratio: str @@ -669,6 +808,7 @@ def create( "834:1112", "720:1280", ] + | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] | Literal[ "992:432", "854:480", @@ -689,25 +829,31 @@ def create( "1248:1664", "1080:1920", ] - | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] | Omit = omit, seed: int | Omit = omit, target_aspect_ratio: Literal["16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16", "21:9"] | Omit = omit, prompt_video: str | Omit = omit, - duration: int | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, - reference_audio: Iterable[video_to_video_create_params.Hailuo3ReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2ReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2FastReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2MiniReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2_5ReferenceAudio] + provider_settings: video_to_video_create_params.KlingO3_4kProviderSettings + | video_to_video_create_params.KlingO3ProProviderSettings + | video_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, - references: Iterable[video_to_video_create_params.Hailuo3Reference] + references: Union[str, Iterable[video_to_video_create_params.KlingO3_4kReferencesPromptImage]] + | Iterable[video_to_video_create_params.Hailuo3Reference] + | Union[str, Iterable[video_to_video_create_params.KlingO3ProReferencesPromptImage]] + | Union[str, Iterable[video_to_video_create_params.KlingO3StandardReferencesPromptImage]] | Iterable[video_to_video_create_params.Seedance2Reference] | Iterable[video_to_video_create_params.Seedance2FastReference] | Iterable[video_to_video_create_params.Seedance2MiniReference] | Iterable[video_to_video_create_params.GeminiOmniFlashReference] - | Iterable[video_to_video_create_params.Seedance2_5Reference] | Iterable[video_to_video_create_params.GeminiOmniFlash1_1Reference] + | Iterable[video_to_video_create_params.Seedance2_5Reference] + | Omit = omit, + duration: int | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, + reference_audio: Iterable[video_to_video_create_params.Hailuo3ReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2ReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2FastReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2MiniReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, reference_videos: Iterable[video_to_video_create_params.Hailuo3ReferenceVideo] | Iterable[video_to_video_create_params.Seedance2ReferenceVideo] @@ -718,6 +864,7 @@ def create( resolution: Literal["768p", "2k", "768P", "2K"] | Omit = omit, audio: bool | Omit = omit, mode: Literal["reference", "extend", "edit"] | Omit = omit, + draft: bool | Omit = omit, # 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, @@ -740,13 +887,15 @@ def create( "seed": seed, "target_aspect_ratio": target_aspect_ratio, "prompt_video": prompt_video, + "provider_settings": provider_settings, + "references": references, "duration": duration, "reference_audio": reference_audio, - "references": references, "reference_videos": reference_videos, "resolution": resolution, "audio": audio, "mode": mode, + "draft": draft, }, video_to_video_create_params.VideoToVideoCreateParams, ), @@ -799,7 +948,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -845,6 +994,47 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["klingO3_4k"], + prompt_text: str, + prompt_video: str, + provider_settings: video_to_video_create_params.KlingO3_4kProviderSettings | Omit = omit, + references: Union[str, Iterable[video_to_video_create_params.KlingO3_4kReferencesPromptImage]] | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + prompt_video: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + provider_settings: Provider-specific settings for multishot video generation and video editing. + + references: An optional array of reference images (up to 4). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + @overload async def create( self, @@ -864,7 +1054,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -905,6 +1095,89 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["klingO3_pro"], + prompt_text: str, + prompt_video: str, + provider_settings: video_to_video_create_params.KlingO3ProProviderSettings | Omit = omit, + references: Union[str, Iterable[video_to_video_create_params.KlingO3ProReferencesPromptImage]] | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + prompt_video: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + provider_settings: Provider-specific settings for multishot video generation and video editing. + + references: An optional array of reference images (up to 4). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["klingO3_standard"], + prompt_text: str, + prompt_video: str, + provider_settings: video_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, + references: Union[str, Iterable[video_to_video_create_params.KlingO3StandardReferencesPromptImage]] + | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A text prompt describing what should appear in the output video. + + prompt_video: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + provider_settings: Provider-specific settings for multishot video generation and video editing. + + references: An optional array of reference images (up to 4). See + [our docs](/assets/inputs#images) on image inputs for more information. + + 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 + """ + ... + @overload async def create( self, @@ -951,7 +1224,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1029,7 +1302,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1108,7 +1381,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1167,7 +1440,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1190,6 +1463,56 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["gemini_omni_flash_1.1"], + prompt_text: str, + video_uri: str, + duration: Union[Literal["auto"], int] | Omit = omit, + mode: Literal["reference", "extend", "edit"] | Omit = omit, + ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + | Omit = omit, + references: Iterable[video_to_video_create_params.GeminiOmniFlash1_1Reference] | Omit = omit, + # 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, + ) -> VideoToVideoCreateResponse: + """ + This endpoint will start a new task to generate a video from a video. + + Args: + prompt_text: A non-empty prompt describing the output or extension. + + video_uri: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + duration: The duration in seconds. In reference mode, this is the output video length. In + extend mode, this is the amount of footage added to the input video. Use "auto" + to let the model choose a duration. + + mode: How the input video is used. `reference` generates a new video guided by the + input, `extend` continues it, and `edit` transforms it according to the prompt. + + ratio: The resolution and aspect ratio of the output video. + + references: An optional array of image references to guide the output. + + 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 + """ + ... + @overload async def create( self, @@ -1197,8 +1520,10 @@ async def create( model: Literal["seedance2_5"], prompt_video: str, audio: bool | Omit = omit, + draft: bool | Omit = omit, duration: Union[int, Literal["auto"]] | Omit = omit, mode: Literal["reference", "extend", "edit"] | Omit = omit, + output_format: Literal["mp4", "mov"] | Omit = omit, prompt_text: str | Omit = omit, ratio: Literal[ "992:432", @@ -1231,7 +1556,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncNewTaskCreatedResponse: + ) -> VideoToVideoCreateResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1242,6 +1567,11 @@ async def create( audio: Whether to generate audio for the video. + draft: Generate a cheap 480p preview instead of a full-quality video. The returned task + ID can later be enhanced to a 1080p video with the same content by passing it as + `draftTaskId` to `text_to_video`. Drafts can be enhanced within 7 days of + creation. Defaults to false. + duration: Seconds of video to generate, or `auto` to let the model choose. `auto` is billed at the variant maximum up front; unused credits are refunded after the generation finishes. Defaults to 5. @@ -1252,6 +1582,9 @@ async def create( ratio, so `ratio` may not be provided. `edit` modifies the input video in place, requires `promptText`, requires `duration: "auto"`, and does not accept `ratio`. + output_format: Container for the output video. `mov` keeps high colour precision for grading + and compositing. Defaults to `mp4`. Draft mode only supports `mp4`. + prompt_text: An optional text prompt up to 15000 characters describing what should appear in the output. @@ -1281,56 +1614,6 @@ async def create( """ ... - @overload - async def create( - self, - *, - model: Literal["gemini_omni_flash_1.1"], - prompt_text: str, - video_uri: str, - duration: Union[Literal["auto"], int] | Omit = omit, - mode: Literal["reference", "extend", "edit"] | Omit = omit, - ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] - | Omit = omit, - references: Iterable[video_to_video_create_params.GeminiOmniFlash1_1Reference] | Omit = omit, - # 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, - ) -> AsyncNewTaskCreatedResponse: - """ - This endpoint will start a new task to generate a video from a video. - - Args: - prompt_text: A non-empty prompt describing the output or extension. - - video_uri: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See - [our docs](/assets/inputs#videos) on video inputs for more information. - - duration: The duration in seconds. In reference mode, this is the output video length. In - extend mode, this is the amount of footage added to the input video. Use "auto" - to let the model choose a duration. - - mode: How the input video is used. `reference` generates a new video guided by the - input, `extend` continues it, and `edit` transforms it according to the prompt. - - ratio: The resolution and aspect ratio of the output video. - - references: An optional array of image references to guide the output. - - 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 - """ - ... - @required_args( ["model", "video_uri"], ["model", "prompt_text", "prompt_video"], @@ -1341,17 +1624,22 @@ async def create( self, *, model: Literal["aleph2"] + | Literal["klingO3_4k"] | Literal["hailuo3"] + | Literal["klingO3_pro"] + | Literal["klingO3_standard"] | Literal["seedance2"] | Literal["seedance2_fast"] | Literal["seedance2_mini"] | Literal["gemini_omni_flash"] - | Literal["seedance2_5"] - | Literal["gemini_omni_flash_1.1"], + | Literal["gemini_omni_flash_1.1"] + | Literal["seedance2_5"], video_uri: str | Omit = omit, content_moderation: video_to_video_create_params.Variant0ContentModeration | Omit = omit, keyframes: Iterable[video_to_video_create_params.Variant0Keyframe] | Omit = omit, - output_format: Literal["mp4", "prores", "png_sequence", "sdr_rec709_10bit"] | Omit = omit, + output_format: Literal["mp4", "prores", "png_sequence", "sdr_rec709_10bit"] + | Literal["mp4", "mov"] + | Omit = omit, prompt_text: str | Omit = omit, prores_profile: Literal["422", "4444", "422 Proxy", "422 LT", "422 HQ", "4444 XQ"] | Omit = omit, ratio: str @@ -1396,6 +1684,7 @@ async def create( "834:1112", "720:1280", ] + | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] | Literal[ "992:432", "854:480", @@ -1416,25 +1705,31 @@ async def create( "1248:1664", "1080:1920", ] - | Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] | Omit = omit, seed: int | Omit = omit, target_aspect_ratio: Literal["16:9", "4:3", "3:2", "1:1", "2:3", "3:4", "9:16", "21:9"] | Omit = omit, prompt_video: str | Omit = omit, - duration: int | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, - reference_audio: Iterable[video_to_video_create_params.Hailuo3ReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2ReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2FastReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2MiniReferenceAudio] - | Iterable[video_to_video_create_params.Seedance2_5ReferenceAudio] + provider_settings: video_to_video_create_params.KlingO3_4kProviderSettings + | video_to_video_create_params.KlingO3ProProviderSettings + | video_to_video_create_params.KlingO3StandardProviderSettings | Omit = omit, - references: Iterable[video_to_video_create_params.Hailuo3Reference] + references: Union[str, Iterable[video_to_video_create_params.KlingO3_4kReferencesPromptImage]] + | Iterable[video_to_video_create_params.Hailuo3Reference] + | Union[str, Iterable[video_to_video_create_params.KlingO3ProReferencesPromptImage]] + | Union[str, Iterable[video_to_video_create_params.KlingO3StandardReferencesPromptImage]] | Iterable[video_to_video_create_params.Seedance2Reference] | Iterable[video_to_video_create_params.Seedance2FastReference] | Iterable[video_to_video_create_params.Seedance2MiniReference] | Iterable[video_to_video_create_params.GeminiOmniFlashReference] - | Iterable[video_to_video_create_params.Seedance2_5Reference] | Iterable[video_to_video_create_params.GeminiOmniFlash1_1Reference] + | Iterable[video_to_video_create_params.Seedance2_5Reference] + | Omit = omit, + duration: int | Union[int, Literal["auto"]] | Union[Literal["auto"], int] | Omit = omit, + reference_audio: Iterable[video_to_video_create_params.Hailuo3ReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2ReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2FastReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2MiniReferenceAudio] + | Iterable[video_to_video_create_params.Seedance2_5ReferenceAudio] | Omit = omit, reference_videos: Iterable[video_to_video_create_params.Hailuo3ReferenceVideo] | Iterable[video_to_video_create_params.Seedance2ReferenceVideo] @@ -1445,6 +1740,7 @@ async def create( resolution: Literal["768p", "2k", "768P", "2K"] | Omit = omit, audio: bool | Omit = omit, mode: Literal["reference", "extend", "edit"] | Omit = omit, + draft: bool | Omit = omit, # 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, @@ -1467,13 +1763,15 @@ async def create( "seed": seed, "target_aspect_ratio": target_aspect_ratio, "prompt_video": prompt_video, + "provider_settings": provider_settings, + "references": references, "duration": duration, "reference_audio": reference_audio, - "references": references, "reference_videos": reference_videos, "resolution": resolution, "audio": audio, "mode": mode, + "draft": draft, }, video_to_video_create_params.VideoToVideoCreateParams, ), diff --git a/src/runwayml/types/generate/image_create_response.py b/src/runwayml/types/generate/image_create_response.py index 034c1b3d..1ea38938 100644 --- a/src/runwayml/types/generate/image_create_response.py +++ b/src/runwayml/types/generate/image_create_response.py @@ -30,17 +30,18 @@ class RoutingResolvedInput(BaseModel): Not necessarily identical to prepared model options. """ - aspect_ratio: str = FieldInfo(alias="aspectRatio") - """Aspect ratio used for routing display.""" - ratio: str + """Output ratio for the selected model, as `:`. + + `auto` means the output keeps the source image's framing, so no pixel size was + chosen. """ - Concrete output ratio derived from aspectRatio and resolution for the selected - model. - """ - resolution: str - """Megapixel tier used for routing display.""" + aspect_ratio: Optional[str] = FieldInfo(alias="aspectRatio", default=None) + """Aspect ratio the output will use. Omitted when `ratio` is `auto`.""" + + resolution: Optional[str] = None + """Megapixel tier the output will use. Omitted when `ratio` is `auto`.""" class RoutingResolvedSettings(BaseModel): diff --git a/src/runwayml/types/image_to_video_create_params.py b/src/runwayml/types/image_to_video_create_params.py index cb1a38ee..0e324a0b 100644 --- a/src/runwayml/types/image_to_video_create_params.py +++ b/src/runwayml/types/image_to_video_create_params.py @@ -19,10 +19,40 @@ "Veo3_1PromptImagePromptImage", "Veo3_1Fast", "Veo3_1FastPromptImagePromptImage", + "KlingO3_4k", + "KlingO3_4kPromptImagePromptImage", + "KlingO3_4kProviderSettings", + "KlingO3_4kProviderSettingsMultiPrompt", + "KlingO3_4kReferencesReferenceImage", "Hailuo3", + "Hailuo3PromptImagePromptImage", "Hailuo3ReferenceAudio", + "Kling3_0_4k", + "Kling3_0_4kPromptImagePromptImage", + "Kling3_0_4kProviderSettings", + "Kling3_0_4kProviderSettingsMultiPrompt", "Happyhorse1_0", "Happyhorse1_0PromptImagePromptImage", + "Kling2_5TurboPro", + "Kling2_5TurboProPromptImagePromptImage", + "Kling3_0Pro", + "Kling3_0ProPromptImagePromptImage", + "Kling3_0ProProviderSettings", + "Kling3_0ProProviderSettingsMultiPrompt", + "Kling3_0Standard", + "Kling3_0StandardPromptImagePromptImage", + "Kling3_0StandardProviderSettings", + "Kling3_0StandardProviderSettingsMultiPrompt", + "KlingO3Pro", + "KlingO3ProPromptImagePromptImage", + "KlingO3ProProviderSettings", + "KlingO3ProProviderSettingsMultiPrompt", + "KlingO3ProReferencesReferenceImage", + "KlingO3Standard", + "KlingO3StandardPromptImagePromptImage", + "KlingO3StandardProviderSettings", + "KlingO3StandardProviderSettingsMultiPrompt", + "KlingO3StandardReferencesReferenceImage", "Seedance2", "Seedance2PromptImagePromptImage", "Seedance2ReferenceAudio", @@ -34,21 +64,23 @@ "Seedance2MiniReferenceAudio", "GeminiOmniFlash", "GeminiOmniFlashPromptImagePromptImage", - "Seedance2_5", - "Seedance2_5PromptImagePromptImage", - "Seedance2_5ReferenceAudio", "GrokImagine1_5", "GrokImagine1_5PromptImagePromptImage", "Wan3", + "Wan3PromptImagePromptImage", "Wan3ReferenceAudio", "Wan3ReferenceVideo", "GeminiOmniFlash1_1", "GeminiOmniFlash1_1PromptImagePromptImage", "Wan3Prime", + "Wan3PrimePromptImagePromptImage", "Wan3PrimeReferenceAudio", "Wan3PrimeReferenceVideo", "H3Max", "H3MaxPromptImagePromptImage", + "Seedance2_5", + "Seedance2_5PromptImagePromptImage", + "Seedance2_5ReferenceAudio", "GrokImagine1_5Lite", "GrokImagine1_5LitePromptImagePromptImage", ] @@ -345,10 +377,105 @@ class Veo3_1FastPromptImagePromptImage(TypedDict, total=False): """ +class KlingO3_4k(TypedDict, total=False): + model: Required[Literal["klingO3_4k"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[KlingO3_4kPromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """ + You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + """ + + audio: bool + """Whether to generate audio for the video.""" + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[KlingO3_4kProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + ratio: Literal["3840:2160", "2160:3840", "2880:2880"] + """The resolution of the output video.""" + + references: Union[str, Iterable[KlingO3_4kReferencesReferenceImage]] + """An optional array of reference images (up to 7). + + See [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3_4kPromptImagePromptImage(TypedDict, total=False): + position: Required[Literal["first", "last"]] + """The position of the image in the output video. + + "first" will use the image as the first frame of the video, "last" will use the + image as the last frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3_4kProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3_4kProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[KlingO3_4kProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3_4kReferencesReferenceImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + class Hailuo3(TypedDict, total=False): model: Required[Literal["hailuo3"]] - prompt_image: Required[Annotated[Union[str, Iterable[object]], PropertyInfo(alias="promptImage")]] + prompt_image: Required[ + Annotated[Union[str, Iterable[Hailuo3PromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] """An image or array of images. Use position `first`/`last` for keyframe mode, or omit position for reference @@ -383,6 +510,22 @@ class Hailuo3(TypedDict, total=False): """ +class Hailuo3PromptImagePromptImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + class Hailuo3ReferenceAudio(TypedDict, total=False): """ An audio reference allows the model to use the audio as additional context for the output. @@ -398,6 +541,84 @@ class Hailuo3ReferenceAudio(TypedDict, total=False): """ +class Kling3_0_4k(TypedDict, total=False): + model: Required[Literal["kling3.0_4k"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[Kling3_0_4kPromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """ + You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + """ + + audio: bool + """Whether to generate audio for the video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[Kling3_0_4kProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + ratio: Literal["3840:2160", "2160:3840", "2880:2880"] + """The resolution of the output video.""" + + +class Kling3_0_4kPromptImagePromptImage(TypedDict, total=False): + position: Required[Literal["first", "last"]] + """The position of the image in the output video. + + "first" will use the image as the first frame of the video, "last" will use the + image as the last frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class Kling3_0_4kProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class Kling3_0_4kProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[Kling3_0_4kProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + class Happyhorse1_0(TypedDict, total=False): model: Required[Literal["happyhorse_1_0"]] @@ -431,9 +652,387 @@ class Happyhorse1_0PromptImagePromptImage(TypedDict, total=False): position: Required[Literal["first"]] """The position of the image in the output video. - "first" will use the image as the first frame of the video. + "first" will use the image as the first frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class Kling2_5TurboPro(TypedDict, total=False): + model: Required[Literal["kling2.5_turbo_pro"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[Kling2_5TurboProPromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """ + Image for the first frame of the output video, or an array with first and + optionally last frames. Output aspect ratio follows the input image; `ratio` is + not supported on image-to-video. See [image inputs](/assets/inputs#images) for + file size limits. + """ + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A text prompt describing what should appear in the output video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: Literal[5, 10] + """The duration of the output video in seconds. Defaults to 5.""" + + +class Kling2_5TurboProPromptImagePromptImage(TypedDict, total=False): + position: Required[Literal["first", "last"]] + """The position of the image in the output video. + + "first" will use the image as the first frame of the video, "last" will use the + image as the last frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class Kling3_0Pro(TypedDict, total=False): + model: Required[Literal["kling3.0_pro"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[Kling3_0ProPromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """ + You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + """ + + audio: bool + """Whether to generate audio for the video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[Kling3_0ProProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + ratio: Literal["1920:1080", "1080:1920", "1440:1440"] + """The resolution of the output video.""" + + +class Kling3_0ProPromptImagePromptImage(TypedDict, total=False): + position: Required[Literal["first", "last"]] + """The position of the image in the output video. + + "first" will use the image as the first frame of the video, "last" will use the + image as the last frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class Kling3_0ProProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class Kling3_0ProProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[Kling3_0ProProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class Kling3_0Standard(TypedDict, total=False): + model: Required[Literal["kling3.0_standard"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[Kling3_0StandardPromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """ + You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + """ + + audio: bool + """Whether to generate audio for the video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[Kling3_0StandardProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + ratio: Literal["1280:720", "720:1280", "960:960"] + """The resolution of the output video.""" + + +class Kling3_0StandardPromptImagePromptImage(TypedDict, total=False): + position: Required[Literal["first", "last"]] + """The position of the image in the output video. + + "first" will use the image as the first frame of the video, "last" will use the + image as the last frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class Kling3_0StandardProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class Kling3_0StandardProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[Kling3_0StandardProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3Pro(TypedDict, total=False): + model: Required[Literal["klingO3_pro"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[KlingO3ProPromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """ + You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + """ + + audio: bool + """Whether to generate audio for the video.""" + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[KlingO3ProProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + ratio: Literal["1920:1080", "1080:1920", "1440:1440"] + """The resolution of the output video.""" + + references: Union[str, Iterable[KlingO3ProReferencesReferenceImage]] + """An optional array of reference images (up to 7). + + See [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3ProPromptImagePromptImage(TypedDict, total=False): + position: Required[Literal["first", "last"]] + """The position of the image in the output video. + + "first" will use the image as the first frame of the video, "last" will use the + image as the last frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3ProProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3ProProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[KlingO3ProProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3ProReferencesReferenceImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + +class KlingO3Standard(TypedDict, total=False): + model: Required[Literal["klingO3_standard"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[KlingO3StandardPromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """ + You may specify an image to use as the first frame of the output video, or an + array with a first frame and optionally a last frame. When both keyframes are + provided, output aspect ratio follows the first frame. See + [image inputs](/assets/inputs#images) for file size limits. + """ + + audio: bool + """Whether to generate audio for the video.""" + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[KlingO3StandardProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + ratio: Literal["1280:720", "720:1280", "960:960"] + """The resolution of the output video.""" + + references: Union[str, Iterable[KlingO3StandardReferencesReferenceImage]] + """An optional array of reference images (up to 7). + + See [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3StandardPromptImagePromptImage(TypedDict, total=False): + position: Required[Literal["first", "last"]] + """The position of the image in the output video. + + "first" will use the image as the first frame of the video, "last" will use the + image as the last frame of the video. + """ + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3StandardProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3StandardProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[KlingO3StandardProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. """ + +class KlingO3StandardReferencesReferenceImage(TypedDict, total=False): uri: Required[str] """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. @@ -441,6 +1040,13 @@ class Happyhorse1_0PromptImagePromptImage(TypedDict, total=False): [our docs](/assets/inputs#images) on image inputs for more information. """ + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + class Seedance2(TypedDict, total=False): model: Required[Literal["seedance2"]] @@ -772,115 +1378,16 @@ class GeminiOmniFlashPromptImagePromptImage(TypedDict, total=False): """ -class Seedance2_5(TypedDict, total=False): - model: Required[Literal["seedance2_5"]] - - prompt_image: Required[ - Annotated[Union[str, Iterable[Seedance2_5PromptImagePromptImage]], PropertyInfo(alias="promptImage")] - ] - """An image or array of images. - - Use position `first`/`last` for keyframe mode, or omit position for reference - images. The two modes cannot be mixed. - """ - - audio: bool - """Whether to generate audio for the video.""" - - duration: Union[int, Literal["auto"]] - """Seconds of video to generate, or `auto` to let the model choose. - - `auto` is billed at the variant maximum up front; unused credits are refunded - after the generation finishes. - """ - - prompt_text: Annotated[str, PropertyInfo(alias="promptText")] - """ - An optional text prompt up to 15000 characters describing what should appear in - the output. - """ - - ratio: Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] - """The resolution of the output video. - - Seedance 2.5 supports 480p, 720p, and 1080p. - """ - - reference_audio: Annotated[Iterable[Seedance2_5ReferenceAudio], PropertyInfo(alias="referenceAudio")] - """An optional array of audio references. - - The total combined duration must not exceed 30 seconds. - """ - - seed: int - """If unspecified, a random number is chosen. - - Varying the seed integer is a way to get different results for the same other - request parameters. Using the same seed integer for an identical request will - produce similar results. - """ - - -class Seedance2_5PromptImagePromptImage(TypedDict, total=False): - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. - """ - - position: Literal["first", "last"] - """The position of the image in the output video. - - "first" will use the image as the first frame, "last" as the last frame. Omit - for a reference image. - """ - - -class Seedance2_5ReferenceAudio(TypedDict, total=False): - """ - An audio reference allows the model to use the audio as additional context for the output. - """ - - type: Required[Literal["audio"]] - - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:audio/mp3;base64,...`, up to 5MB) containing an encoded audio. See - [our docs](/assets/inputs#audio) on audio inputs for more information. - """ - - class GrokImagine1_5(TypedDict, total=False): model: Required[Literal["grok_imagine_1_5"]] prompt_image: Required[ Annotated[Union[str, Iterable[GrokImagine1_5PromptImagePromptImage]], PropertyInfo(alias="promptImage")] ] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + """The start frame of the output video. - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. + The output keeps its aspect ratio, which (width / height) must be between 0.4 + and 2.5. See [our docs](/assets/inputs#images) for image input requirements. """ duration: int @@ -911,7 +1418,9 @@ class GrokImagine1_5PromptImagePromptImage(TypedDict, total=False): class Wan3(TypedDict, total=False): model: Required[Literal["wan3"]] - prompt_image: Required[Annotated[Union[str, Iterable[object]], PropertyInfo(alias="promptImage")]] + prompt_image: Required[ + Annotated[Union[str, Iterable[Wan3PromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] """An image or array of images. Use position `first`/`last` for keyframe mode, or omit position for reference @@ -967,6 +1476,22 @@ class Wan3(TypedDict, total=False): """ +class Wan3PromptImagePromptImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + class Wan3ReferenceAudio(TypedDict, total=False): """ An audio reference allows the model to use the audio as additional context for the output. @@ -1044,7 +1569,9 @@ class GeminiOmniFlash1_1PromptImagePromptImage(TypedDict, total=False): class Wan3Prime(TypedDict, total=False): model: Required[Literal["wan3_prime"]] - prompt_image: Required[Annotated[Union[str, Iterable[object]], PropertyInfo(alias="promptImage")]] + prompt_image: Required[ + Annotated[Union[str, Iterable[Wan3PrimePromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] """An image or array of images. Use position `first`/`last` for keyframe mode, or omit position for reference @@ -1100,6 +1627,22 @@ class Wan3Prime(TypedDict, total=False): """ +class Wan3PrimePromptImagePromptImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + class Wan3PrimeReferenceAudio(TypedDict, total=False): """ An audio reference allows the model to use the audio as additional context for the output. @@ -1184,18 +1727,132 @@ class H3MaxPromptImagePromptImage(TypedDict, total=False): """ -class GrokImagine1_5Lite(TypedDict, total=False): - model: Required[Literal["grok_imagine_1_5_lite"]] +class Seedance2_5(TypedDict, total=False): + model: Required[Literal["seedance2_5"]] prompt_image: Required[ - Annotated[Union[str, Iterable[GrokImagine1_5LitePromptImagePromptImage]], PropertyInfo(alias="promptImage")] + Annotated[Union[str, Iterable[Seedance2_5PromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """An image or array of images. + + Use position `first`/`last` for keyframe mode, or omit position for reference + images. The two modes cannot be mixed. + """ + + audio: bool + """Whether to generate audio for the video.""" + + draft: bool + """Generate a cheap 480p preview instead of a full-quality video. + + The returned task ID can later be enhanced to a 1080p video with the same + content by passing it as `draftTaskId` to `text_to_video`. Drafts can be + enhanced within 7 days of creation. Defaults to false. + """ + + duration: Union[int, Literal["auto"]] + """Seconds of video to generate, or `auto` to let the model choose. + + `auto` is billed at the variant maximum up front; unused credits are refunded + after the generation finishes. + """ + + output_format: Annotated[Literal["mp4", "mov"], PropertyInfo(alias="outputFormat")] + """Container for the output video. + + `mov` keeps high colour precision for grading and compositing. Defaults to + `mp4`. Draft mode only supports `mp4`. + """ + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """ + An optional text prompt up to 15000 characters describing what should appear in + the output. + """ + + ratio: Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", ] + """The resolution of the output video. + + Seedance 2.5 supports 480p, 720p, and 1080p. + """ + + reference_audio: Annotated[Iterable[Seedance2_5ReferenceAudio], PropertyInfo(alias="referenceAudio")] + """An optional array of audio references. + + The total combined duration must not exceed 30 seconds. + """ + + seed: int + """If unspecified, a random number is chosen. + + Varying the seed integer is a way to get different results for the same other + request parameters. Using the same seed integer for an identical request will + produce similar results. + """ + + +class Seedance2_5PromptImagePromptImage(TypedDict, total=False): + uri: Required[str] """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. `data:image/png;base64,...`, up to 5MB) containing an encoded image. See [our docs](/assets/inputs#images) on image inputs for more information. """ + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + +class Seedance2_5ReferenceAudio(TypedDict, total=False): + """ + An audio reference allows the model to use the audio as additional context for the output. + """ + + type: Required[Literal["audio"]] + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:audio/mp3;base64,...`, up to 5MB) containing an encoded audio. See + [our docs](/assets/inputs#audio) on audio inputs for more information. + """ + + +class GrokImagine1_5Lite(TypedDict, total=False): + model: Required[Literal["grok_imagine_1_5_lite"]] + + prompt_image: Required[ + Annotated[Union[str, Iterable[GrokImagine1_5LitePromptImagePromptImage]], PropertyInfo(alias="promptImage")] + ] + """The start frame of the output video. + + The output keeps its aspect ratio, which (width / height) must be between 0.4 + and 2.5. See [our docs](/assets/inputs#images) for image input requirements. + """ + duration: int """The number of seconds of duration for the output video.""" @@ -1230,17 +1887,24 @@ class GrokImagine1_5LitePromptImagePromptImage(TypedDict, total=False): Gen4Turbo, Veo3_1, Veo3_1Fast, + KlingO3_4k, Hailuo3, + Kling3_0_4k, Happyhorse1_0, + Kling2_5TurboPro, + Kling3_0Pro, + Kling3_0Standard, + KlingO3Pro, + KlingO3Standard, Seedance2, Seedance2Fast, Seedance2Mini, GeminiOmniFlash, - Seedance2_5, GrokImagine1_5, Wan3, GeminiOmniFlash1_1, Wan3Prime, H3Max, + Seedance2_5, GrokImagine1_5Lite, ] diff --git a/src/runwayml/types/organization/webapp/audit_log_list_params.py b/src/runwayml/types/organization/webapp/audit_log_list_params.py index 0dc92e63..1831750b 100644 --- a/src/runwayml/types/organization/webapp/audit_log_list_params.py +++ b/src/runwayml/types/organization/webapp/audit_log_list_params.py @@ -20,12 +20,13 @@ class AuditLogListParams(TypedDict, total=False): Restrict results to these audit log actions, as a comma-separated list of up to 50 actions. Allowed values: `UserLogin`, `PasswordChanged`, `EmailChangeRequested`, `EmailChanged`, `UserRegistered`, `UserAccountDeleted`, - `WorkspaceCreated`, `WorkspaceDeleted`, `MemberInvited`, `MemberRemoved`, - `MemberRoleChanged`, `InviteAccepted`, `MemberJoinedViaDomain`, - `TeamSettingsUpdated`, `InviteLinkToggled`, `UserGroupCreated`, - `UserGroupUpdated`, `UserGroupDeleted`, `UserGroupArchived`, - `UserGroupRestored`, `UserGroupMemberAdded`, `UserGroupMemberRemoved`, - `UserGroupCreditCapUpdated`, `SSOLogin`, `SSOUserProvisioned`, + `WorkspaceCreated`, `WorkspaceDeleted`, `MemberInvited`, + `MemberInviteReminderSent`, `MemberRemoved`, `MemberRoleChanged`, + `InviteAccepted`, `MemberJoinedViaDomain`, `TeamSettingsUpdated`, + `InviteLinkToggled`, `UserGroupCreated`, `UserGroupUpdated`, `UserGroupDeleted`, + `UserGroupArchived`, `UserGroupRestored`, `UserGroupMemberAdded`, + `UserGroupMemberRemoved`, `UserGroupCreditCapUpdated`, + `UserGroupVisibilityUpdated`, `SSOLogin`, `SSOUserProvisioned`, `SSOConfigCreated`, `SSOUserAutoAddedToTeam`, `SSODomainRegistrationCloned`, `AssetCreated`, `AssetUpdated`, `AssetDeleted`, `AssetDownloaded`, `AssetShared`, `AssetUnshared`, `CommentCreated`, `CommentEdited`, @@ -44,7 +45,10 @@ class AuditLogListParams(TypedDict, total=False): `AgentConnectorSessionDisabled`, `GenerationCreated`, `StudioSessionOpened`, `AccountLinkCreated`, `AccountLinkDeleted`, `AdConnectionAuthorizationStarted`, `AdConnectionConnected`, `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, - `AdConnectionDisconnected`, `OrganizationSettingsUpdated`, + `AdConnectionDisconnected`, `AdWorkspaceOnboardingUpdated`, + `AdCreativeReviewSubmitted`, `AdCreativeReviewCancelled`, + `AdCreativeReviewDecided`, `AdCreativeApprovalRevoked`, `AdCreativeArchived`, + `AdCreativeUnarchived`, `OrganizationSettingsUpdated`, `OrganizationDisabledModelsUpdated`, `OrganizationAgentSandboxUpdated`, `OrganizationApiAccountReleased`, `OrganizationApiAccountMemberInvited`, `OrganizationApiAccountMemberRoleChanged`, @@ -52,7 +56,7 @@ class AuditLogListParams(TypedDict, total=False): `WorkspaceTagCreated`, `WorkspaceTagUpdated`, `WorkspaceTagDeleted`, `WorkspaceTagAssigned`, `WorkspaceTagUnassigned`, `MeteredBillingConfigUpdated`, `MeteredBillingRefillTriggered`, `MeteredBillingRetryTriggered`, - `EnterpriseSpendCapEnforcementUpdated`, + `EnterpriseSpendCapEnforcementUpdated`, `OnboardingBonusGranted`, `AwsMarketplaceEnterpriseSubscriptionLinked`. """ diff --git a/src/runwayml/types/organization/webapp/audit_log_list_response.py b/src/runwayml/types/organization/webapp/audit_log_list_response.py index 1f3cd4b9..09d49ad6 100644 --- a/src/runwayml/types/organization/webapp/audit_log_list_response.py +++ b/src/runwayml/types/organization/webapp/audit_log_list_response.py @@ -22,6 +22,7 @@ class AuditLogListResponse(BaseModel): "WorkspaceCreated", "WorkspaceDeleted", "MemberInvited", + "MemberInviteReminderSent", "MemberRemoved", "MemberRoleChanged", "InviteAccepted", @@ -36,6 +37,7 @@ class AuditLogListResponse(BaseModel): "UserGroupMemberAdded", "UserGroupMemberRemoved", "UserGroupCreditCapUpdated", + "UserGroupVisibilityUpdated", "SSOLogin", "SSOUserProvisioned", "SSOConfigCreated", @@ -90,6 +92,13 @@ class AuditLogListResponse(BaseModel): "AdAccountSelectionUpdated", "AdAccountSyncRequested", "AdConnectionDisconnected", + "AdWorkspaceOnboardingUpdated", + "AdCreativeReviewSubmitted", + "AdCreativeReviewCancelled", + "AdCreativeReviewDecided", + "AdCreativeApprovalRevoked", + "AdCreativeArchived", + "AdCreativeUnarchived", "OrganizationSettingsUpdated", "OrganizationDisabledModelsUpdated", "OrganizationAgentSandboxUpdated", @@ -107,6 +116,7 @@ class AuditLogListResponse(BaseModel): "MeteredBillingRefillTriggered", "MeteredBillingRetryTriggered", "EnterpriseSpendCapEnforcementUpdated", + "OnboardingBonusGranted", "AwsMarketplaceEnterpriseSubscriptionLinked", ] """The action performed.""" diff --git a/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py b/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py index ff4b8c3a..29fe8b60 100644 --- a/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py +++ b/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py @@ -1,6 +1,6 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing import Optional +from typing import Dict, List, Union, Optional from datetime import datetime from typing_extensions import Literal @@ -14,141 +14,159 @@ class Metadata(BaseModel): """Action-specific details.""" - ad_account_id: Optional[object] = FieldInfo(alias="Ad account ID", default=None) + ad_account_id: Optional[str] = FieldInfo(alias="Ad account ID", default=None) - ad_sync_end_date: Optional[object] = FieldInfo(alias="Ad sync end date", default=None) + ad_creative_id: Optional[str] = FieldInfo(alias="Ad creative ID", default=None) - ad_sync_run_id: Optional[object] = FieldInfo(alias="Ad sync run ID", default=None) + ad_review_batch_id: Optional[str] = FieldInfo(alias="Ad review batch ID", default=None) - ad_sync_start_date: Optional[object] = FieldInfo(alias="Ad sync start date", default=None) + ad_review_request_id: Optional[str] = FieldInfo(alias="Ad review request ID", default=None) - agent_session_id: Optional[object] = FieldInfo(alias="Agent session ID", default=None) + ad_sync_end_date: Optional[str] = FieldInfo(alias="Ad sync end date", default=None) - agent_tagged: Optional[object] = FieldInfo(alias="Agent tagged", default=None) + ad_sync_run_id: Optional[str] = FieldInfo(alias="Ad sync run ID", default=None) - amount: Optional[object] = FieldInfo(alias="Amount", default=None) + ad_sync_start_date: Optional[str] = FieldInfo(alias="Ad sync start date", default=None) - amount_received: Optional[object] = FieldInfo(alias="Amount received", default=None) + ads_onboarding_answers: Optional[List[str]] = FieldInfo(alias="Ads onboarding answers", default=None) - api_account: Optional[object] = FieldInfo(alias="API account", default=None) + ads_onboarding_completed: Optional[bool] = FieldInfo(alias="Ads onboarding completed", default=None) - api_project_id: Optional[object] = FieldInfo(alias="API project ID", default=None) + agent_session_id: Optional[str] = FieldInfo(alias="Agent session ID", default=None) - app_studio_app: Optional[object] = FieldInfo(alias="App Studio app", default=None) + agent_tagged: Optional[bool] = FieldInfo(alias="Agent tagged", default=None) - app_studio_session: Optional[object] = FieldInfo(alias="App Studio session", default=None) + amount: Optional[float] = FieldInfo(alias="Amount", default=None) - application: Optional[object] = FieldInfo(alias="Application", default=None) + amount_received: Optional[float] = FieldInfo(alias="Amount received", default=None) - asset_name: Optional[object] = FieldInfo(alias="Asset name", default=None) + api_account: Optional[str] = FieldInfo(alias="API account", default=None) - aws_license: Optional[object] = FieldInfo(alias="AWS license", default=None) + api_project_id: Optional[str] = FieldInfo(alias="API project ID", default=None) - brand_kit_id: Optional[object] = FieldInfo(alias="Brand kit ID", default=None) + app_studio_app: Optional[str] = FieldInfo(alias="App Studio app", default=None) - comment_id: Optional[object] = FieldInfo(alias="Comment ID", default=None) + app_studio_session: Optional[str] = FieldInfo(alias="App Studio session", default=None) - comment_target_id: Optional[object] = FieldInfo(alias="Comment target ID", default=None) + application: Optional[str] = FieldInfo(alias="Application", default=None) - comment_target_type: Optional[object] = FieldInfo(alias="Comment target type", default=None) + asset_name: Optional[str] = FieldInfo(alias="Asset name", default=None) - comment_text: Optional[object] = FieldInfo(alias="Comment text", default=None) + aws_license: Optional[str] = FieldInfo(alias="AWS license", default=None) - default_task_name_template: Optional[object] = FieldInfo(alias="Default task name template", default=None) + brand_kit_id: Optional[str] = FieldInfo(alias="Brand kit ID", default=None) - destination_category_id: Optional[object] = FieldInfo(alias="Destination category ID", default=None) + comment_id: Optional[str] = FieldInfo(alias="Comment ID", default=None) - direction: Optional[object] = FieldInfo(alias="Direction", default=None) + comment_target_id: Optional[str] = FieldInfo(alias="Comment target ID", default=None) - email_domain: Optional[object] = FieldInfo(alias="Email domain", default=None) + comment_target_type: Optional[str] = FieldInfo(alias="Comment target type", default=None) - error_code: Optional[object] = FieldInfo(alias="Error code", default=None) + comment_text: Optional[str] = FieldInfo(alias="Comment text", default=None) - group_name: Optional[object] = FieldInfo(alias="Group name", default=None) + default_project_discoverability: Optional[str] = FieldInfo(alias="Default project discoverability", default=None) - hard_spend_cap: Optional[object] = FieldInfo(alias="Hard spend cap", default=None) + default_task_name_template: Optional[str] = FieldInfo(alias="Default task name template", default=None) - invited_member: Optional[object] = FieldInfo(alias="Invited member", default=None) + destination_category_id: Optional[str] = FieldInfo(alias="Destination category ID", default=None) - login_method: Optional[object] = FieldInfo(alias="Login method", default=None) + direction: Optional[str] = FieldInfo(alias="Direction", default=None) - media_included: Optional[object] = FieldInfo(alias="Media included", default=None) + email_domain: Optional[str] = FieldInfo(alias="Email domain", default=None) - member_email: Optional[object] = FieldInfo(alias="Member email", default=None) + error_code: Optional[str] = FieldInfo(alias="Error code", default=None) - mentions: Optional[object] = FieldInfo(alias="Mentions", default=None) + group_name: Optional[str] = FieldInfo(alias="Group name", default=None) - model: Optional[object] = FieldInfo(alias="Model", default=None) + hard_spend_cap: Optional[bool] = FieldInfo(alias="Hard spend cap", default=None) - new_role: Optional[object] = FieldInfo(alias="New role", default=None) + invited_member: Optional[str] = FieldInfo(alias="Invited member", default=None) - new_text: Optional[object] = FieldInfo(alias="New text", default=None) + language_model_or_provider: Optional[str] = FieldInfo(alias="Language model or provider", default=None) - new_user: Optional[object] = FieldInfo(alias="New User", default=None) + login_method: Optional[str] = FieldInfo(alias="Login method", default=None) - new_value: Optional[object] = FieldInfo(alias="New value", default=None) + media_included: Optional[bool] = FieldInfo(alias="Media included", default=None) - operation: Optional[object] = FieldInfo(alias="Operation", default=None) + member_email: Optional[str] = FieldInfo(alias="Member email", default=None) - organization: Optional[object] = FieldInfo(alias="Organization", default=None) + mentions: Optional[float] = FieldInfo(alias="Mentions", default=None) - outcome: Optional[object] = FieldInfo(alias="Outcome", default=None) + model: Optional[str] = FieldInfo(alias="Model", default=None) - plan: Optional[object] = FieldInfo(alias="Plan", default=None) + new_role: Optional[str] = FieldInfo(alias="New role", default=None) - platform: Optional[object] = FieldInfo(alias="Platform", default=None) + new_text: Optional[str] = FieldInfo(alias="New text", default=None) - previous_project_credit_cap: Optional[object] = FieldInfo(alias="Previous project credit cap", default=None) + new_user: Optional[bool] = FieldInfo(alias="New User", default=None) - previous_role: Optional[object] = FieldInfo(alias="Previous role", default=None) + new_value: Union[str, float, bool, Dict[str, bool], None] = FieldInfo(alias="New value", default=None) - previous_text: Optional[object] = FieldInfo(alias="Previous text", default=None) + operation: Optional[str] = FieldInfo(alias="Operation", default=None) - previous_value: Optional[object] = FieldInfo(alias="Previous value", default=None) + organization: Optional[str] = FieldInfo(alias="Organization", default=None) - project_credit_cap: Optional[object] = FieldInfo(alias="Project credit cap", default=None) + outcome: Optional[str] = FieldInfo(alias="Outcome", default=None) - provider: Optional[object] = FieldInfo(alias="Provider", default=None) + plan: Optional[str] = FieldInfo(alias="Plan", default=None) - reason: Optional[object] = FieldInfo(alias="Reason", default=None) + platform: Optional[str] = FieldInfo(alias="Platform", default=None) - removed_member: Optional[object] = FieldInfo(alias="Removed member", default=None) + previous_project_credit_cap: Optional[float] = FieldInfo(alias="Previous project credit cap", default=None) - role: Optional[object] = FieldInfo(alias="Role", default=None) + previous_role: Optional[str] = FieldInfo(alias="Previous role", default=None) - root_asset_id: Optional[object] = FieldInfo(alias="Root asset ID", default=None) + previous_text: Optional[str] = FieldInfo(alias="Previous text", default=None) - selected: Optional[object] = FieldInfo(alias="Selected", default=None) + previous_value: Union[str, float, bool, Dict[str, bool], None] = FieldInfo(alias="Previous value", default=None) - setting: Optional[object] = FieldInfo(alias="Setting", default=None) + project_credit_cap: Optional[float] = FieldInfo(alias="Project credit cap", default=None) - shared_with_projects: Optional[object] = FieldInfo(alias="Shared with projects", default=None) + provider: Optional[str] = FieldInfo(alias="Provider", default=None) - shared_with_workspace: Optional[object] = FieldInfo(alias="Shared with workspace", default=None) + reason: Optional[str] = FieldInfo(alias="Reason", default=None) - source_category_id: Optional[object] = FieldInfo(alias="Source category ID", default=None) + removed_member: Optional[str] = FieldInfo(alias="Removed member", default=None) - spend_cap: Optional[object] = FieldInfo(alias="Spend cap", default=None) + review_decision: Optional[str] = FieldInfo(alias="Review decision", default=None) - spend_cap_change: Optional[object] = FieldInfo(alias="Spend cap change", default=None) + role: Optional[str] = FieldInfo(alias="Role", default=None) - tag_color: Optional[object] = FieldInfo(alias="Tag color", default=None) + root_asset_id: Optional[str] = FieldInfo(alias="Root asset ID", default=None) - tag_name: Optional[object] = FieldInfo(alias="Tag name", default=None) + selected: Optional[bool] = FieldInfo(alias="Selected", default=None) - target_member: Optional[object] = FieldInfo(alias="Target member", default=None) + setting: Optional[str] = FieldInfo(alias="Setting", default=None) - via_public_api: Optional[object] = FieldInfo(alias="Via public API", default=None) + shared_with_projects: Optional[List[str]] = FieldInfo(alias="Shared with projects", default=None) - workspace: Optional[object] = FieldInfo(alias="Workspace", default=None) + shared_with_workspace: Optional[bool] = FieldInfo(alias="Shared with workspace", default=None) - workspace_description: Optional[object] = FieldInfo(alias="Workspace description", default=None) + source_category_id: Optional[str] = FieldInfo(alias="Source category ID", default=None) - workspace_id: Optional[object] = FieldInfo(alias="Workspace ID", default=None) + spend_cap: Optional[float] = FieldInfo(alias="Spend cap", default=None) - workspace_name: Optional[object] = FieldInfo(alias="Workspace name", default=None) + spend_cap_change: Optional[float] = FieldInfo(alias="Spend cap change", default=None) - workspace_picture: Optional[object] = FieldInfo(alias="Workspace picture", default=None) + submitted_via: Optional[str] = FieldInfo(alias="Submitted via", default=None) + + tag_color: Optional[str] = FieldInfo(alias="Tag color", default=None) + + tag_name: Optional[str] = FieldInfo(alias="Tag name", default=None) + + target_member: Optional[str] = FieldInfo(alias="Target member", default=None) + + via_public_api: Optional[bool] = FieldInfo(alias="Via public API", default=None) + + workspace: Optional[str] = FieldInfo(alias="Workspace", default=None) + + workspace_description: Optional[str] = FieldInfo(alias="Workspace description", default=None) + + workspace_id: Optional[float] = FieldInfo(alias="Workspace ID", default=None) + + workspace_name: Optional[str] = FieldInfo(alias="Workspace name", default=None) + + workspace_picture: Optional[str] = FieldInfo(alias="Workspace picture", default=None) class AuditLogRetrieveResponse(BaseModel): @@ -162,6 +180,7 @@ class AuditLogRetrieveResponse(BaseModel): "WorkspaceCreated", "WorkspaceDeleted", "MemberInvited", + "MemberInviteReminderSent", "MemberRemoved", "MemberRoleChanged", "InviteAccepted", @@ -176,6 +195,7 @@ class AuditLogRetrieveResponse(BaseModel): "UserGroupMemberAdded", "UserGroupMemberRemoved", "UserGroupCreditCapUpdated", + "UserGroupVisibilityUpdated", "SSOLogin", "SSOUserProvisioned", "SSOConfigCreated", @@ -230,6 +250,13 @@ class AuditLogRetrieveResponse(BaseModel): "AdAccountSelectionUpdated", "AdAccountSyncRequested", "AdConnectionDisconnected", + "AdWorkspaceOnboardingUpdated", + "AdCreativeReviewSubmitted", + "AdCreativeReviewCancelled", + "AdCreativeReviewDecided", + "AdCreativeApprovalRevoked", + "AdCreativeArchived", + "AdCreativeUnarchived", "OrganizationSettingsUpdated", "OrganizationDisabledModelsUpdated", "OrganizationAgentSandboxUpdated", @@ -247,6 +274,7 @@ class AuditLogRetrieveResponse(BaseModel): "MeteredBillingRefillTriggered", "MeteredBillingRetryTriggered", "EnterpriseSpendCapEnforcementUpdated", + "OnboardingBonusGranted", "AwsMarketplaceEnterpriseSubscriptionLinked", ] """The action performed.""" diff --git a/src/runwayml/types/organization/webapp_list_usage_params.py b/src/runwayml/types/organization/webapp_list_usage_params.py index b4bc9737..b4cc83d1 100644 --- a/src/runwayml/types/organization/webapp_list_usage_params.py +++ b/src/runwayml/types/organization/webapp_list_usage_params.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Union -from datetime import datetime +from datetime import date, datetime from typing_extensions import Required, Annotated, TypedDict from ..._utils import PropertyInfo @@ -12,16 +12,22 @@ class WebappListUsageParams(TypedDict, total=False): - from_: Required[Annotated[Union[str, datetime], PropertyInfo(alias="from", format="iso8601")]] - """Start of the time window (inclusive), ISO-8601 datetime.""" + from_: Required[ + Annotated[Union[Union[str, datetime], Union[str, date]], PropertyInfo(alias="from", format="iso8601")] + ] + """Start of the time window (inclusive), ISO-8601 datetime or date. + + A date means midnight UTC. + """ limit: Required[int] """The maximum number of items to return per page.""" - to: Required[Annotated[Union[str, datetime], PropertyInfo(format="iso8601")]] - """End of the time window (exclusive), ISO-8601 datetime. + to: Required[Annotated[Union[Union[str, datetime], Union[str, date]], PropertyInfo(format="iso8601")]] + """End of the time window (exclusive), ISO-8601 datetime or date. - A `cursor` can only narrow this window, never extend it past `to`. + A date means midnight UTC, so `to=2026-08-01` covers all of July 31. A `cursor` + can only narrow this window, never extend it past `to`. """ cursor: str diff --git a/src/runwayml/types/organization_retrieve_usage_response.py b/src/runwayml/types/organization_retrieve_usage_response.py index 6cf0e841..b5a1fbc7 100644 --- a/src/runwayml/types/organization_retrieve_usage_response.py +++ b/src/runwayml/types/organization_retrieve_usage_response.py @@ -41,7 +41,10 @@ class ResultUsedCredit(BaseModel): "gemini_2.5_flash", "gemini_image3_pro", "gemini_image3.1_flash", + "gemini_image3.1_flash_lite", + "nano_banana_2.1", "seedream5_pro", + "seedream5_flash", "seedream5_lite", "gemini_omni_flash", "gemini_omni_flash_1.1", @@ -70,7 +73,10 @@ class ResultUsedCredit(BaseModel): "grok_imagine_1_5_lite", "grok_imagine_image_2", "muse_image", + "bria_fibo_1_5", + "bria_fibo_edit_1_5", "ideogram_4_0", + "ideogram_4_5", "magnific_precision_upscaler_v2", "magnific_video_upscaler_creative", "ruby", @@ -137,7 +143,10 @@ class OrganizationRetrieveUsageResponse(BaseModel): "gemini_2.5_flash", "gemini_image3_pro", "gemini_image3.1_flash", + "gemini_image3.1_flash_lite", + "nano_banana_2.1", "seedream5_pro", + "seedream5_flash", "seedream5_lite", "gemini_omni_flash", "gemini_omni_flash_1.1", @@ -166,7 +175,10 @@ class OrganizationRetrieveUsageResponse(BaseModel): "grok_imagine_1_5_lite", "grok_imagine_image_2", "muse_image", + "bria_fibo_1_5", + "bria_fibo_edit_1_5", "ideogram_4_0", + "ideogram_4_5", "magnific_precision_upscaler_v2", "magnific_video_upscaler_creative", "ruby", diff --git a/src/runwayml/types/router_update_params.py b/src/runwayml/types/router_update_params.py index 90ad68bd..03abecc9 100644 --- a/src/runwayml/types/router_update_params.py +++ b/src/runwayml/types/router_update_params.py @@ -21,7 +21,9 @@ class RouterUpdateParams(TypedDict, total=False): """Nested merge: omitted settings fields keep their current values. When models is present, omitted models.mode or models.ids are preserved (sending - only optimizeFor does not clear the model allowlist or credit ceiling). + only optimizeFor does not clear the model allowlist or credit ceiling). Set + maxCreditsPerGeneration, or one of its modalities, to null to remove those + credit caps. """ @@ -40,16 +42,16 @@ class SettingsFallback(TypedDict, total=False): class SettingsMaxCreditsPerGeneration(TypedDict, total=False): - """Optional per-modality credit caps, applied per generated output. + """Per-modality credit caps to change, applied per generated output. - Models whose estimated per-output cost exceeds the cap are excluded. + Omitted modalities keep their current cap; null removes that cap. """ - audio: int + audio: Optional[int] - image: int + image: Optional[int] - video: int + video: Optional[int] class SettingsModels(TypedDict, total=False): @@ -65,7 +67,7 @@ class SettingsModels(TypedDict, total=False): class Settings(TypedDict, total=False): """Nested merge: omitted settings fields keep their current values. - When models is present, omitted models.mode or models.ids are preserved (sending only optimizeFor does not clear the model allowlist or credit ceiling). + When models is present, omitted models.mode or models.ids are preserved (sending only optimizeFor does not clear the model allowlist or credit ceiling). Set maxCreditsPerGeneration, or one of its modalities, to null to remove those credit caps. """ fallback: SettingsFallback @@ -75,11 +77,11 @@ class Settings(TypedDict, total=False): """ max_credits_per_generation: Annotated[ - SettingsMaxCreditsPerGeneration, PropertyInfo(alias="maxCreditsPerGeneration") + Optional[SettingsMaxCreditsPerGeneration], PropertyInfo(alias="maxCreditsPerGeneration") ] - """Optional per-modality credit caps, applied per generated output. + """Per-modality credit caps to change, applied per generated output. - Models whose estimated per-output cost exceeds the cap are excluded. + Omitted modalities keep their current cap; null removes that cap. """ models: SettingsModels diff --git a/src/runwayml/types/text_to_image_create_params.py b/src/runwayml/types/text_to_image_create_params.py index aa4edfae..657363fc 100644 --- a/src/runwayml/types/text_to_image_create_params.py +++ b/src/runwayml/types/text_to_image_create_params.py @@ -27,16 +27,26 @@ "Seedream5LiteReferenceImage", "GrokImagineImage2", "GrokImagineImage2ReferenceImage", + "GeminiImage3_1FlashLite", + "GeminiImage3_1FlashLiteReferenceImage", "GeminiImage3Pro", "GeminiImage3ProReferenceImage", "GptImage2_5Flare", "GptImage2_5FlareReferenceImage", "GptImage2_5Sunburst", "GptImage2_5SunburstReferenceImage", + "BriaFibo1_5", + "BriaFibo1_5ReferenceImage", + "BriaFiboEdit1_5", + "BriaFiboEdit1_5ReferenceImage", "Ideogram4_0", "Ideogram4_0ReferenceImage", "Ideogram4_5", "Ideogram4_5ReferenceImage", + "Seedream5Flash", + "Seedream5FlashReferenceImage", + "NanoBanana2_1", + "NanoBanana2_1ReferenceImage", "Gemini2_5Flash", "Gemini2_5FlashReferenceImage", ] @@ -649,6 +659,56 @@ class GrokImagineImage2ReferenceImage(TypedDict, total=False): """ +class GeminiImage3_1FlashLite(TypedDict, total=False): + model: Required[Literal["gemini_image3.1_flash_lite"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """This should describe in detail what should appear in the output.""" + + ratio: Required[ + Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + ] + ] + """The resolution of the output image.""" + + output_count: Annotated[Literal[1, 4], PropertyInfo(alias="outputCount")] + """The number of images to generate. + + Increasing this number will affect the number of credits consumed by the + generation. Up to four images can be generated at once. + """ + + reference_images: Annotated[Iterable[GeminiImage3_1FlashLiteReferenceImage], PropertyInfo(alias="referenceImages")] + """ + An array of up to 14 images to be used as references for the generated image + output. Up to five can pass `subject: "human"` and up to nine can pass + `subject: "object"`. + """ + + +class GeminiImage3_1FlashLiteReferenceImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + subject: Literal["object", "human"] + + tag: str + + class GeminiImage3Pro(TypedDict, total=False): model: Required[Literal["gemini_image3_pro"]] @@ -903,6 +963,114 @@ class GptImage2_5SunburstReferenceImage(TypedDict, total=False): """ +class BriaFibo1_5(TypedDict, total=False): + model: Required[Literal["bria_fibo_1_5"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A non-empty text prompt describing what should appear in the output image.""" + + ratio: Required[ + Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "2048:2048", + "1536:2304", + "2304:1536", + "1536:2048", + "2048:1536", + "1536:1920", + "1920:1536", + "1152:2048", + "2048:1152", + ] + ] + """The resolution of the output image, expressed as `:`. + + 1MP sizes cost 5 credits per image and 4MP sizes 10. + """ + + output_format: Annotated[Literal["png", "jpeg"], PropertyInfo(alias="outputFormat")] + """The file format of the output image. Defaults to png.""" + + reference_images: Annotated[Iterable[BriaFibo1_5ReferenceImage], PropertyInfo(alias="referenceImages")] + """Up to 1 image to guide the generation. + + The prompt describes how the output should build on it. + """ + + seed: int + """If unspecified, a random number is chosen. + + Using the same seed with an identical request reproduces the same image. + """ + + +class BriaFibo1_5ReferenceImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class BriaFiboEdit1_5(TypedDict, total=False): + model: Required[Literal["bria_fibo_edit_1_5"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """An instruction describing how to edit the reference images.""" + + output_format: Annotated[Literal["png", "jpeg"], PropertyInfo(alias="outputFormat")] + """The file format of the output image. Defaults to png.""" + + ratio: Literal[ + "1024:1024", + "768:1152", + "1152:768", + "768:1024", + "1024:768", + "768:960", + "960:768", + "576:1024", + "1024:576", + "auto", + ] + """The resolution of the output image, expressed as `:`. + + Omit it or use `auto` to keep the framing of the first reference image. Choosing + a size requires at least 2 reference images; a single image always keeps its own + framing. + """ + + reference_images: Annotated[Iterable[BriaFiboEdit1_5ReferenceImage], PropertyInfo(alias="referenceImages")] + """1 to 4 images to edit. + + With several, the instruction describes how to combine them. + """ + + seed: int + """If unspecified, a random number is chosen. + + Using the same seed with an identical request reproduces the same image. + """ + + +class BriaFiboEdit1_5ReferenceImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + class Ideogram4_0(TypedDict, total=False): model: Required[Literal["ideogram_4_0"]] @@ -1037,6 +1205,153 @@ class Ideogram4_5ReferenceImage(TypedDict, total=False): """ +class Seedream5Flash(TypedDict, total=False): + model: Required[Literal["seedream5_flash"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A description of the image you want to generate.""" + + ratio: Required[ + Literal[ + "1024:1024", + "1184:896", + "896:1184", + "1376:768", + "768:1376", + "1248:832", + "832:1248", + "1568:672", + "2048:2048", + "2304:1728", + "1728:2304", + "2848:1600", + "1600:2848", + "2496:1664", + "1664:2496", + "3136:1344", + "auto_1k", + "auto_2k", + ] + ] + """The resolution of the output image, expressed as `:`. + + Use `auto_1k` or `auto_2k` to let the model pick the aspect ratio at a fixed + resolution tier. + """ + + output_count: Annotated[int, PropertyInfo(alias="outputCount")] + """The number of images to generate. + + Increasing this number will affect the number of credits consumed by the + generation. + """ + + output_format: Annotated[Literal["png", "jpeg"], PropertyInfo(alias="outputFormat")] + """The file format of the output image. Defaults to png.""" + + reference_images: Annotated[Iterable[Seedream5FlashReferenceImage], PropertyInfo(alias="referenceImages")] + """Images to edit or combine. + + Refer to them in the prompt by upload order (Figure 1, Figure 2, and so on). + """ + + +class Seedream5FlashReferenceImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class NanoBanana2_1(TypedDict, total=False): + model: Required[Literal["nano_banana_2.1"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A description of the image you want to generate.""" + + ratio: Required[ + Literal[ + "1024:1024", + "848:1264", + "1264:848", + "896:1200", + "1200:896", + "928:1152", + "1152:928", + "768:1376", + "1376:768", + "1584:672", + "512:2064", + "2064:512", + "352:2928", + "2928:352", + "2048:2048", + "1696:2528", + "2528:1696", + "1792:2400", + "2400:1792", + "1856:2304", + "2304:1856", + "1536:2752", + "2752:1536", + "3168:1344", + "1024:4128", + "4128:1024", + "704:5856", + "5856:704", + "4096:4096", + "3392:5056", + "5056:3392", + "3584:4800", + "4800:3584", + "3712:4608", + "4608:3712", + "3072:5504", + "5504:3072", + "6336:2688", + "2048:8256", + "8256:2048", + "1408:11712", + "11712:1408", + ] + ] + """The resolution of the output image.""" + + output_count: Annotated[int, PropertyInfo(alias="outputCount")] + """The number of images to generate. + + Increasing this number will affect the number of credits consumed by the + generation. + """ + + reference_images: Annotated[Iterable[NanoBanana2_1ReferenceImage], PropertyInfo(alias="referenceImages")] + """Up to 14 images to edit, combine, or use as references for the output.""" + + thinking_level: Annotated[Literal["minimal", "medium", "high"], PropertyInfo(alias="thinkingLevel")] + """How much the model reasons about the prompt before generating. + + Defaults to medium. + """ + + +class NanoBanana2_1ReferenceImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + tag: str + """A tag to identify the reference image. + + This is used to reference the image in prompt text. Must be 3-16 characters, + start with a letter, and use only letters, digits, and underscores. + """ + + class Gemini2_5Flash(TypedDict, total=False): model: Required[Literal["gemini_2.5_flash"]] @@ -1092,10 +1407,15 @@ class Gemini2_5FlashReferenceImage(TypedDict, total=False): Seedream5Pro, Seedream5Lite, GrokImagineImage2, + GeminiImage3_1FlashLite, GeminiImage3Pro, GptImage2_5Flare, GptImage2_5Sunburst, + BriaFibo1_5, + BriaFiboEdit1_5, Ideogram4_0, Ideogram4_5, + Seedream5Flash, + NanoBanana2_1, Gemini2_5Flash, ] diff --git a/src/runwayml/types/text_to_video_create_params.py b/src/runwayml/types/text_to_video_create_params.py index 4848cc5a..a73060f1 100644 --- a/src/runwayml/types/text_to_video_create_params.py +++ b/src/runwayml/types/text_to_video_create_params.py @@ -13,11 +13,30 @@ "Gen4_5ContentModeration", "Veo3_1", "Veo3_1Fast", + "KlingO3_4k", + "KlingO3_4kProviderSettings", + "KlingO3_4kProviderSettingsMultiPrompt", "Hailuo3", "Hailuo3ReferenceAudio", "Hailuo3Reference", "Hailuo3ReferenceVideo", + "Kling3_0_4k", + "Kling3_0_4kProviderSettings", + "Kling3_0_4kProviderSettingsMultiPrompt", "Happyhorse1_0", + "Kling2_5TurboPro", + "Kling3_0Pro", + "Kling3_0ProProviderSettings", + "Kling3_0ProProviderSettingsMultiPrompt", + "Kling3_0Standard", + "Kling3_0StandardProviderSettings", + "Kling3_0StandardProviderSettingsMultiPrompt", + "KlingO3Pro", + "KlingO3ProProviderSettings", + "KlingO3ProProviderSettingsMultiPrompt", + "KlingO3Standard", + "KlingO3StandardProviderSettings", + "KlingO3StandardProviderSettingsMultiPrompt", "Seedance2", "Seedance2ReferenceAudio", "Seedance2Reference", @@ -31,10 +50,6 @@ "Seedance2MiniReference", "Seedance2MiniReferenceVideo", "GeminiOmniFlash", - "Seedance2_5", - "Seedance2_5ReferenceAudio", - "Seedance2_5Reference", - "Seedance2_5ReferenceVideo", "GrokImagine1_5", "GrokImagine1_5ReferenceAudio", "GrokImagine1_5Reference", @@ -50,6 +65,10 @@ "Wan3PrimeReference", "Wan3PrimeReferenceVideo", "H3Max", + "Seedance2_5", + "Seedance2_5ReferenceAudio", + "Seedance2_5Reference", + "Seedance2_5ReferenceVideo", "GrokImagine1_5Lite", ] @@ -210,6 +229,51 @@ class Veo3_1Fast(TypedDict, total=False): """ +class KlingO3_4k(TypedDict, total=False): + model: Required[Literal["klingO3_4k"]] + + ratio: Required[Literal["3840:2160", "2160:3840", "2880:2880"]] + """The resolution of the output video.""" + + audio: bool + """Whether to generate audio for the video.""" + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[KlingO3_4kProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + +class KlingO3_4kProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3_4kProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[KlingO3_4kProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + class Hailuo3(TypedDict, total=False): model: Required[Literal["hailuo3"]] @@ -293,6 +357,58 @@ class Hailuo3ReferenceVideo(TypedDict, total=False): """ +class Kling3_0_4k(TypedDict, total=False): + model: Required[Literal["kling3.0_4k"]] + + ratio: Required[Literal["3840:2160", "2160:3840", "2880:2880"]] + """The resolution of the output video.""" + + audio: bool + """Whether to generate audio for the video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[Kling3_0_4kProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + +class Kling3_0_4kProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class Kling3_0_4kProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[Kling3_0_4kProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + class Happyhorse1_0(TypedDict, total=False): model: Required[Literal["happyhorse_1_0"]] @@ -320,6 +436,219 @@ class Happyhorse1_0(TypedDict, total=False): """The resolution of the output video.""" +class Kling2_5TurboPro(TypedDict, total=False): + model: Required[Literal["kling2.5_turbo_pro"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A text prompt describing what should appear in the output video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: Literal[5, 10] + """The duration of the output video in seconds. Defaults to 5.""" + + ratio: Literal["1920:1080", "1440:1440", "1080:1920", "1280:720", "720:720", "720:1280"] + + +class Kling3_0Pro(TypedDict, total=False): + model: Required[Literal["kling3.0_pro"]] + + ratio: Required[Literal["1920:1080", "1080:1920", "1440:1440"]] + """The resolution of the output video.""" + + audio: bool + """Whether to generate audio for the video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[Kling3_0ProProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + +class Kling3_0ProProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class Kling3_0ProProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[Kling3_0ProProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class Kling3_0Standard(TypedDict, total=False): + model: Required[Literal["kling3.0_standard"]] + + ratio: Required[Literal["1280:720", "720:1280", "960:960"]] + """The resolution of the output video.""" + + audio: bool + """Whether to generate audio for the video.""" + + cfg_scale: Annotated[float, PropertyInfo(alias="cfgScale")] + """Creativity/freedom scale for generation. + + 0 gives the model maximum creative freedom, 1 makes it follow the prompt most + strictly. Defaults to 0.5. + """ + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[Kling3_0StandardProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + +class Kling3_0StandardProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class Kling3_0StandardProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[Kling3_0StandardProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3Pro(TypedDict, total=False): + model: Required[Literal["klingO3_pro"]] + + ratio: Required[Literal["1920:1080", "1080:1920", "1440:1440"]] + """The resolution of the output video.""" + + audio: bool + """Whether to generate audio for the video.""" + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[KlingO3ProProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + +class KlingO3ProProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3ProProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[KlingO3ProProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3Standard(TypedDict, total=False): + model: Required[Literal["klingO3_standard"]] + + ratio: Required[Literal["1280:720", "720:1280", "960:960"]] + """The resolution of the output video.""" + + audio: bool + """Whether to generate audio for the video.""" + + duration: int + """The number of seconds of duration for the output video.""" + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A text prompt describing what should appear in the output video.""" + + provider_settings: Annotated[KlingO3StandardProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation.""" + + +class KlingO3StandardProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3StandardProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation.""" + + multi_prompt: Annotated[Iterable[KlingO3StandardProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + class Seedance2(TypedDict, total=False): model: Required[Literal["seedance2"]] @@ -660,117 +989,6 @@ class GeminiOmniFlash(TypedDict, total=False): """ -class Seedance2_5(TypedDict, total=False): - model: Required[Literal["seedance2_5"]] - - audio: bool - """Whether to generate audio for the video.""" - - duration: Union[int, Literal["auto"]] - """Seconds of video to generate, or `auto` to let the model choose. - - `auto` is billed at the variant maximum up front; unused credits are refunded - after the generation finishes. - """ - - prompt_text: Annotated[str, PropertyInfo(alias="promptText")] - """ - An optional text prompt up to 15000 characters describing what should appear in - the output. - """ - - ratio: Literal[ - "992:432", - "854:480", - "752:560", - "640:640", - "560:752", - "480:854", - "1470:630", - "1280:720", - "1112:834", - "960:960", - "834:1112", - "720:1280", - "2206:946", - "1920:1080", - "1664:1248", - "1440:1440", - "1248:1664", - "1080:1920", - ] - """The resolution of the output video. - - Seedance 2.5 supports 480p, 720p, and 1080p. - """ - - reference_audio: Annotated[Iterable[Seedance2_5ReferenceAudio], PropertyInfo(alias="referenceAudio")] - """An optional array of audio references. - - The total combined duration must be less than 30 seconds. - """ - - references: Iterable[Seedance2_5Reference] - """An optional array of image references (up to 30). - - See [our docs](/assets/inputs#images) on image inputs for more information. - """ - - reference_videos: Annotated[Iterable[Seedance2_5ReferenceVideo], PropertyInfo(alias="referenceVideos")] - """An optional array of video references. - - The combined duration across all video references must not exceed 30 seconds. - See [our docs](/assets/inputs#videos) on video inputs for more information. - """ - - seed: int - """If unspecified, a random number is chosen. - - Varying the seed integer is a way to get different results for the same other - request parameters. Using the same seed integer for an identical request will - produce similar results. - """ - - -class Seedance2_5ReferenceAudio(TypedDict, total=False): - """ - An audio reference allows the model to use the audio as additional context for the output. - """ - - type: Required[Literal["audio"]] - - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:audio/mp3;base64,...`, up to 5MB) containing an encoded audio. See - [our docs](/assets/inputs#audio) on audio inputs for more information. - """ - - -class Seedance2_5Reference(TypedDict, total=False): - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. - """ - - -class Seedance2_5ReferenceVideo(TypedDict, total=False): - """ - A video reference allows the model to use the video as additional context for the output. - """ - - type: Required[Literal["video"]] - - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See - [our docs](/assets/inputs#videos) on video inputs for more information. - """ - - class GrokImagine1_5(TypedDict, total=False): model: Required[Literal["grok_imagine_1_5"]] @@ -1087,6 +1305,139 @@ class H3Max(TypedDict, total=False): """ +class Seedance2_5(TypedDict, total=False): + model: Required[Literal["seedance2_5"]] + + audio: bool + """Whether to generate audio for the video. Defaults to `true`.""" + + draft: bool + """Generate a cheap 480p preview instead of a full-quality video. + + The returned task ID can later be enhanced to a 1080p video with the same + content by passing it as `draftTaskId` to `text_to_video`. Drafts can be + enhanced within 7 days of creation. Defaults to false. + """ + + draft_task_id: Annotated[str, PropertyInfo(alias="draftTaskId")] + """The ID of a succeeded draft task to enhance to 1080p. + + The draft is regenerated with its original prompt, references, and settings, so + no other generation fields may be provided. + """ + + duration: Union[int, Literal["auto"]] + """Seconds of video to generate, or `auto` to let the model choose. + + `auto` is billed at the variant maximum up front; unused credits are refunded + after the generation finishes. Defaults to 5. + """ + + output_format: Annotated[Literal["mp4", "mov"], PropertyInfo(alias="outputFormat")] + """Container for the output video. + + `mov` keeps high colour precision for grading and compositing. Defaults to + `mp4`. Draft mode only supports `mp4`. + """ + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """ + An optional text prompt up to 15000 characters describing what should appear in + the output. + """ + + ratio: Literal[ + "992:432", + "854:480", + "752:560", + "640:640", + "560:752", + "480:854", + "1470:630", + "1280:720", + "1112:834", + "960:960", + "834:1112", + "720:1280", + "2206:946", + "1920:1080", + "1664:1248", + "1440:1440", + "1248:1664", + "1080:1920", + ] + """The resolution of the output video. + + Seedance 2.5 supports 480p, 720p, and 1080p. Defaults to `1280:720`. + """ + + reference_audio: Annotated[Iterable[Seedance2_5ReferenceAudio], PropertyInfo(alias="referenceAudio")] + """An optional array of audio references. + + The total combined duration must be less than 30 seconds. + """ + + references: Iterable[Seedance2_5Reference] + """An optional array of image references (up to 30). + + See [our docs](/assets/inputs#images) on image inputs for more information. + """ + + reference_videos: Annotated[Iterable[Seedance2_5ReferenceVideo], PropertyInfo(alias="referenceVideos")] + """An optional array of video references. + + The combined duration across all video references must not exceed 30 seconds. + See [our docs](/assets/inputs#videos) on video inputs for more information. + """ + + seed: int + """If unspecified, a random number is chosen. + + Varying the seed integer is a way to get different results for the same other + request parameters. Using the same seed integer for an identical request will + produce similar results. + """ + + +class Seedance2_5ReferenceAudio(TypedDict, total=False): + """ + An audio reference allows the model to use the audio as additional context for the output. + """ + + type: Required[Literal["audio"]] + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:audio/mp3;base64,...`, up to 5MB) containing an encoded audio. See + [our docs](/assets/inputs#audio) on audio inputs for more information. + """ + + +class Seedance2_5Reference(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class Seedance2_5ReferenceVideo(TypedDict, total=False): + """ + A video reference allows the model to use the video as additional context for the output. + """ + + type: Required[Literal["video"]] + + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + """ + + class GrokImagine1_5Lite(TypedDict, total=False): model: Required[Literal["grok_imagine_1_5_lite"]] @@ -1129,17 +1480,24 @@ class GrokImagine1_5Lite(TypedDict, total=False): Gen4_5, Veo3_1, Veo3_1Fast, + KlingO3_4k, Hailuo3, + Kling3_0_4k, Happyhorse1_0, + Kling2_5TurboPro, + Kling3_0Pro, + Kling3_0Standard, + KlingO3Pro, + KlingO3Standard, Seedance2, Seedance2Fast, Seedance2Mini, GeminiOmniFlash, - Seedance2_5, GrokImagine1_5, Wan3, GeminiOmniFlash1_1, Wan3Prime, H3Max, + Seedance2_5, GrokImagine1_5Lite, ] diff --git a/src/runwayml/types/video_to_video_create_params.py b/src/runwayml/types/video_to_video_create_params.py index f799160a..17a8a7b1 100644 --- a/src/runwayml/types/video_to_video_create_params.py +++ b/src/runwayml/types/video_to_video_create_params.py @@ -12,14 +12,26 @@ "Variant0", "Variant0ContentModeration", "Variant0Keyframe", - "Variant0KeyframeUnionMember0", - "Variant0KeyframeUnionMember0Range", - "Variant0KeyframeUnionMember1", - "Variant0KeyframeUnionMember1Range", + "Variant0KeyframeKeyframeWithSeconds", + "Variant0KeyframeKeyframeWithSecondsRange", + "Variant0KeyframeKeyframeWithAt", + "Variant0KeyframeKeyframeWithAtRange", + "KlingO3_4k", + "KlingO3_4kProviderSettings", + "KlingO3_4kProviderSettingsMultiPrompt", + "KlingO3_4kReferencesPromptImage", "Hailuo3", "Hailuo3ReferenceAudio", "Hailuo3Reference", "Hailuo3ReferenceVideo", + "KlingO3Pro", + "KlingO3ProProviderSettings", + "KlingO3ProProviderSettingsMultiPrompt", + "KlingO3ProReferencesPromptImage", + "KlingO3Standard", + "KlingO3StandardProviderSettings", + "KlingO3StandardProviderSettingsMultiPrompt", + "KlingO3StandardReferencesPromptImage", "Seedance2", "Seedance2ReferenceAudio", "Seedance2Reference", @@ -34,12 +46,12 @@ "Seedance2MiniReferenceVideo", "GeminiOmniFlash", "GeminiOmniFlashReference", + "GeminiOmniFlash1_1", + "GeminiOmniFlash1_1Reference", "Seedance2_5", "Seedance2_5ReferenceAudio", "Seedance2_5Reference", "Seedance2_5ReferenceVideo", - "GeminiOmniFlash1_1", - "GeminiOmniFlash1_1Reference", ] @@ -118,7 +130,7 @@ class Variant0ContentModeration(TypedDict, total=False): """ -class Variant0KeyframeUnionMember0Range(TypedDict, total=False): +class Variant0KeyframeKeyframeWithSecondsRange(TypedDict, total=False): """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp must fall within it. All keyframes must either set a range or none may. @@ -134,7 +146,7 @@ class Variant0KeyframeUnionMember0Range(TypedDict, total=False): """Start of the edit window in whole seconds from the start of the input video.""" -class Variant0KeyframeUnionMember0(TypedDict, total=False): +class Variant0KeyframeKeyframeWithSeconds(TypedDict, total=False): seconds: Required[float] """ Absolute timestamp in seconds from the start of the input video when this @@ -148,7 +160,7 @@ class Variant0KeyframeUnionMember0(TypedDict, total=False): [our docs](/assets/inputs#images) on image inputs for more information. """ - range: Variant0KeyframeUnionMember0Range + range: Variant0KeyframeKeyframeWithSecondsRange """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp @@ -156,7 +168,7 @@ class Variant0KeyframeUnionMember0(TypedDict, total=False): """ -class Variant0KeyframeUnionMember1Range(TypedDict, total=False): +class Variant0KeyframeKeyframeWithAtRange(TypedDict, total=False): """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp must fall within it. All keyframes must either set a range or none may. @@ -172,7 +184,7 @@ class Variant0KeyframeUnionMember1Range(TypedDict, total=False): """Start of the edit window in whole seconds from the start of the input video.""" -class Variant0KeyframeUnionMember1(TypedDict, total=False): +class Variant0KeyframeKeyframeWithAt(TypedDict, total=False): at: Required[float] """ Position as a fraction [0.0, 1.0] of the input video duration when this guidance @@ -186,7 +198,7 @@ class Variant0KeyframeUnionMember1(TypedDict, total=False): [our docs](/assets/inputs#images) on image inputs for more information. """ - range: Variant0KeyframeUnionMember1Range + range: Variant0KeyframeKeyframeWithAtRange """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp @@ -194,7 +206,78 @@ class Variant0KeyframeUnionMember1(TypedDict, total=False): """ -Variant0Keyframe: TypeAlias = Union[Variant0KeyframeUnionMember0, Variant0KeyframeUnionMember1] +Variant0Keyframe: TypeAlias = Union[Variant0KeyframeKeyframeWithSeconds, Variant0KeyframeKeyframeWithAt] + + +class KlingO3_4k(TypedDict, total=False): + model: Required[Literal["klingO3_4k"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A text prompt describing what should appear in the output video.""" + + prompt_video: Required[Annotated[str, PropertyInfo(alias="promptVideo")]] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + """ + + provider_settings: Annotated[KlingO3_4kProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation and video editing.""" + + references: Union[str, Iterable[KlingO3_4kReferencesPromptImage]] + """An optional array of reference images (up to 4). + + See [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3_4kProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3_4kProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation and video editing.""" + + keep_original_sound: Annotated[bool, PropertyInfo(alias="keepOriginalSound")] + """Whether to preserve the original audio when editing a video. + + Only applicable for video-to-video. Defaults to true. + """ + + multi_prompt: Annotated[Iterable[KlingO3_4kProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3_4kReferencesPromptImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ class Hailuo3(TypedDict, total=False): @@ -287,6 +370,148 @@ class Hailuo3ReferenceVideo(TypedDict, total=False): """ +class KlingO3Pro(TypedDict, total=False): + model: Required[Literal["klingO3_pro"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A text prompt describing what should appear in the output video.""" + + prompt_video: Required[Annotated[str, PropertyInfo(alias="promptVideo")]] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + """ + + provider_settings: Annotated[KlingO3ProProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation and video editing.""" + + references: Union[str, Iterable[KlingO3ProReferencesPromptImage]] + """An optional array of reference images (up to 4). + + See [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3ProProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3ProProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation and video editing.""" + + keep_original_sound: Annotated[bool, PropertyInfo(alias="keepOriginalSound")] + """Whether to preserve the original audio when editing a video. + + Only applicable for video-to-video. Defaults to true. + """ + + multi_prompt: Annotated[Iterable[KlingO3ProProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3ProReferencesPromptImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + +class KlingO3Standard(TypedDict, total=False): + model: Required[Literal["klingO3_standard"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A text prompt describing what should appear in the output video.""" + + prompt_video: Required[Annotated[str, PropertyInfo(alias="promptVideo")]] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + """ + + provider_settings: Annotated[KlingO3StandardProviderSettings, PropertyInfo(alias="providerSettings")] + """Provider-specific settings for multishot video generation and video editing.""" + + references: Union[str, Iterable[KlingO3StandardReferencesPromptImage]] + """An optional array of reference images (up to 4). + + See [our docs](/assets/inputs#images) on image inputs for more information. + """ + + +class KlingO3StandardProviderSettingsMultiPrompt(TypedDict, total=False): + duration: Required[int] + """Duration in seconds for this segment.""" + + prompt: Required[str] + """The text prompt for this segment.""" + + +class KlingO3StandardProviderSettings(TypedDict, total=False): + """Provider-specific settings for multishot video generation and video editing.""" + + keep_original_sound: Annotated[bool, PropertyInfo(alias="keepOriginalSound")] + """Whether to preserve the original audio when editing a video. + + Only applicable for video-to-video. Defaults to true. + """ + + multi_prompt: Annotated[Iterable[KlingO3StandardProviderSettingsMultiPrompt], PropertyInfo(alias="multiPrompt")] + """An array of prompt segments for multishot video generation. + + Each segment has its own prompt and duration. Total duration across all segments + must be between 3 and 15 seconds. `promptText` is still required when `shotType` + is `"intelligence"`. + """ + + shot_type: Annotated[Literal["intelligence", "customize"], PropertyInfo(alias="shotType")] + """Shot transition type for multishot videos. + + Defaults to "customize" when multiPrompt is provided. + """ + + +class KlingO3StandardReferencesPromptImage(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + position: Literal["first", "last"] + """The position of the image in the output video. + + "first" will use the image as the first frame, "last" as the last frame. Omit + for a reference image. + """ + + class Seedance2(TypedDict, total=False): model: Required[Literal["seedance2"]] @@ -658,6 +883,50 @@ class GeminiOmniFlashReference(TypedDict, total=False): """ +class GeminiOmniFlash1_1(TypedDict, total=False): + model: Required[Literal["gemini_omni_flash_1.1"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A non-empty prompt describing the output or extension.""" + + video_uri: Required[Annotated[str, PropertyInfo(alias="videoUri")]] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + """ + + duration: Union[Literal["auto"], int] + """The duration in seconds. + + In reference mode, this is the output video length. In extend mode, this is the + amount of footage added to the input video. Use "auto" to let the model choose a + duration. + """ + + mode: Literal["reference", "extend", "edit"] + """How the input video is used. + + `reference` generates a new video guided by the input, `extend` continues it, + and `edit` transforms it according to the prompt. + """ + + ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] + """The resolution and aspect ratio of the output video.""" + + references: Iterable[GeminiOmniFlash1_1Reference] + """An optional array of image references to guide the output.""" + + +class GeminiOmniFlash1_1Reference(TypedDict, total=False): + uri: Required[str] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:image/png;base64,...`, up to 5MB) containing an encoded image. See + [our docs](/assets/inputs#images) on image inputs for more information. + """ + + class Seedance2_5(TypedDict, total=False): model: Required[Literal["seedance2_5"]] @@ -671,6 +940,14 @@ class Seedance2_5(TypedDict, total=False): audio: bool """Whether to generate audio for the video.""" + draft: bool + """Generate a cheap 480p preview instead of a full-quality video. + + The returned task ID can later be enhanced to a 1080p video with the same + content by passing it as `draftTaskId` to `text_to_video`. Drafts can be + enhanced within 7 days of creation. Defaults to false. + """ + duration: Union[int, Literal["auto"]] """Seconds of video to generate, or `auto` to let the model choose. @@ -688,6 +965,13 @@ class Seedance2_5(TypedDict, total=False): requires `duration: "auto"`, and does not accept `ratio`. """ + output_format: Annotated[Literal["mp4", "mov"], PropertyInfo(alias="outputFormat")] + """Container for the output video. + + `mov` keeps high colour precision for grading and compositing. Defaults to + `mp4`. Draft mode only supports `mp4`. + """ + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] """ An optional text prompt up to 15000 characters describing what should appear in @@ -786,50 +1070,16 @@ class Seedance2_5ReferenceVideo(TypedDict, total=False): """ -class GeminiOmniFlash1_1(TypedDict, total=False): - model: Required[Literal["gemini_omni_flash_1.1"]] - - prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] - """A non-empty prompt describing the output or extension.""" - - video_uri: Required[Annotated[str, PropertyInfo(alias="videoUri")]] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See - [our docs](/assets/inputs#videos) on video inputs for more information. - """ - - duration: Union[Literal["auto"], int] - """The duration in seconds. - - In reference mode, this is the output video length. In extend mode, this is the - amount of footage added to the input video. Use "auto" to let the model choose a - duration. - """ - - mode: Literal["reference", "extend", "edit"] - """How the input video is used. - - `reference` generates a new video guided by the input, `extend` continues it, - and `edit` transforms it according to the prompt. - """ - - ratio: Literal["640:360", "360:640", "1280:720", "720:1280", "1920:1080", "1080:1920", "3840:2160", "2160:3840"] - """The resolution and aspect ratio of the output video.""" - - references: Iterable[GeminiOmniFlash1_1Reference] - """An optional array of image references to guide the output.""" - - -class GeminiOmniFlash1_1Reference(TypedDict, total=False): - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. - """ - - VideoToVideoCreateParams: TypeAlias = Union[ - Variant0, Hailuo3, Seedance2, Seedance2Fast, Seedance2Mini, GeminiOmniFlash, Seedance2_5, GeminiOmniFlash1_1 + Variant0, + KlingO3_4k, + Hailuo3, + KlingO3Pro, + KlingO3Standard, + Seedance2, + Seedance2Fast, + Seedance2Mini, + GeminiOmniFlash, + GeminiOmniFlash1_1, + Seedance2_5, ] diff --git a/tests/api_resources/test_image_to_video.py b/tests/api_resources/test_image_to_video.py index b674437f..3efed1d6 100644 --- a/tests/api_resources/test_image_to_video.py +++ b/tests/api_resources/test_image_to_video.py @@ -230,36 +230,38 @@ def test_streaming_response_create_overload_4(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_5(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="hailuo3", + model="klingO3_4k", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_5(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="hailuo3", + model="klingO3_4k", prompt_image="https://example.com/image.jpg", - prompt_text="x", - duration=5, - ratio="adaptive", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - resolution="2k", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="3840:2160", + references="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_5(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="hailuo3", + model="klingO3_4k", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert response.is_closed is True @@ -270,9 +272,8 @@ def test_raw_response_create_overload_5(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_5(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="hailuo3", + model="klingO3_4k", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -285,27 +286,36 @@ def test_streaming_response_create_overload_5(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_6(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="happyhorse_1_0", + model="hailuo3", prompt_image="https://example.com/image.jpg", + prompt_text="x", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_6(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="happyhorse_1_0", + model="hailuo3", prompt_image="https://example.com/image.jpg", - duration=3, - prompt_text="xx", - resolution="720p", + prompt_text="x", + duration=5, + ratio="adaptive", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + resolution="2k", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_6(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="happyhorse_1_0", + model="hailuo3", prompt_image="https://example.com/image.jpg", + prompt_text="x", ) assert response.is_closed is True @@ -316,8 +326,9 @@ def test_raw_response_create_overload_6(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_6(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="happyhorse_1_0", + model="hailuo3", prompt_image="https://example.com/image.jpg", + prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -330,7 +341,7 @@ def test_streaming_response_create_overload_6(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_7(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2", + model="kling3.0_4k", prompt_image="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @@ -338,26 +349,29 @@ def test_method_create_overload_7(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_7(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2", + model="kling3.0_4k", prompt_image="https://example.com/image.jpg", audio=True, - duration="auto", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - seed=0, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="3840:2160", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_7(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="seedance2", + model="kling3.0_4k", prompt_image="https://example.com/image.jpg", ) @@ -369,7 +383,7 @@ def test_raw_response_create_overload_7(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_7(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="seedance2", + model="kling3.0_4k", prompt_image="https://example.com/image.jpg", ) as response: assert not response.is_closed @@ -383,7 +397,7 @@ def test_streaming_response_create_overload_7(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_8(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2_fast", + model="happyhorse_1_0", prompt_image="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @@ -391,26 +405,18 @@ def test_method_create_overload_8(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_8(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2_fast", + model="happyhorse_1_0", prompt_image="https://example.com/image.jpg", - audio=True, - duration="auto", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - seed=0, + duration=3, + prompt_text="xx", + resolution="720p", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_8(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="seedance2_fast", + model="happyhorse_1_0", prompt_image="https://example.com/image.jpg", ) @@ -422,7 +428,7 @@ def test_raw_response_create_overload_8(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_8(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="seedance2_fast", + model="happyhorse_1_0", prompt_image="https://example.com/image.jpg", ) as response: assert not response.is_closed @@ -436,35 +442,29 @@ def test_streaming_response_create_overload_8(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_9(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2_mini", + model="kling2.5_turbo_pro", prompt_image="https://example.com/image.jpg", + prompt_text="xx", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_9(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2_mini", + model="kling2.5_turbo_pro", prompt_image="https://example.com/image.jpg", - audio=True, - duration="auto", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - seed=0, + prompt_text="xx", + cfg_scale=0, + duration=5, ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_9(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="seedance2_mini", + model="kling2.5_turbo_pro", prompt_image="https://example.com/image.jpg", + prompt_text="xx", ) assert response.is_closed is True @@ -475,8 +475,9 @@ def test_raw_response_create_overload_9(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_9(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="seedance2_mini", + model="kling2.5_turbo_pro", prompt_image="https://example.com/image.jpg", + prompt_text="xx", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -489,7 +490,7 @@ def test_streaming_response_create_overload_9(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_10(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="gemini_omni_flash", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @@ -497,18 +498,29 @@ def test_method_create_overload_10(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_10(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="gemini_omni_flash", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", + audio=True, + cfg_scale=0, duration=3, - prompt_text="x", - ratio="1280:720", + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1920:1080", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_10(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="gemini_omni_flash", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", ) @@ -520,7 +532,7 @@ def test_raw_response_create_overload_10(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_10(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="gemini_omni_flash", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", ) as response: assert not response.is_closed @@ -534,7 +546,7 @@ def test_streaming_response_create_overload_10(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_11(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2_5", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @@ -542,26 +554,29 @@ def test_method_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_11(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="seedance2_5", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", audio=True, - duration="auto", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - seed=0, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1280:720", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_11(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="seedance2_5", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", ) @@ -573,7 +588,7 @@ def test_raw_response_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_11(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="seedance2_5", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", ) as response: assert not response.is_closed @@ -587,7 +602,7 @@ def test_streaming_response_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_12(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="grok_imagine_1_5", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @@ -595,18 +610,29 @@ def test_method_create_overload_12(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_12(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="grok_imagine_1_5", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", - duration=1, - prompt_text="x", - resolution="480p", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1920:1080", + references="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_12(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="grok_imagine_1_5", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", ) @@ -618,7 +644,7 @@ def test_raw_response_create_overload_12(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_12(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="grok_imagine_1_5", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", ) as response: assert not response.is_closed @@ -632,42 +658,38 @@ def test_streaming_response_create_overload_12(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_13(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="wan3", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_13(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="wan3", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", - prompt_text="x", audio=True, - duration=2, - ratio="832:480", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1280:720", + references="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_13(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="wan3", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert response.is_closed is True @@ -678,9 +700,8 @@ def test_raw_response_create_overload_13(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_13(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="wan3", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -693,29 +714,35 @@ def test_streaming_response_create_overload_13(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_14(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_14(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_image="https://example.com/image.jpg", - prompt_text="x", + audio=True, duration="auto", - ratio="640:360", + prompt_text="x", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + seed=0, ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_14(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert response.is_closed is True @@ -726,9 +753,8 @@ def test_raw_response_create_overload_14(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_14(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -741,42 +767,35 @@ def test_streaming_response_create_overload_14(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_15(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="wan3_prime", + model="seedance2_fast", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_15(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="wan3_prime", + model="seedance2_fast", prompt_image="https://example.com/image.jpg", - prompt_text="x", audio=True, - duration=2, - ratio="832:480", + duration="auto", + prompt_text="x", + ratio="992:432", reference_audio=[ { "type": "audio", "uri": "https://example.com/audio.mp3", } ], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], + seed=0, ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_15(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="wan3_prime", + model="seedance2_fast", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert response.is_closed is True @@ -787,9 +806,8 @@ def test_raw_response_create_overload_15(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_15(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="wan3_prime", + model="seedance2_fast", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -802,21 +820,26 @@ def test_streaming_response_create_overload_15(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_16(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="h3_max", + model="seedance2_mini", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_16(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="h3_max", + model="seedance2_mini", prompt_image="https://example.com/image.jpg", + audio=True, + duration="auto", prompt_text="x", - duration=5, - prompt_expansion_mode="disabled", - resolution="768p", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], seed=0, ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @@ -824,9 +847,8 @@ def test_method_create_with_all_params_overload_16(self, client: RunwayML) -> No @parametrize def test_raw_response_create_overload_16(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="h3_max", + model="seedance2_mini", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert response.is_closed is True @@ -837,9 +859,8 @@ def test_raw_response_create_overload_16(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_16(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="h3_max", + model="seedance2_mini", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -852,7 +873,7 @@ def test_streaming_response_create_overload_16(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_17(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @@ -860,18 +881,18 @@ def test_method_create_overload_17(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_17(self, client: RunwayML) -> None: image_to_video = client.image_to_video.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", - duration=1, + duration=3, prompt_text="x", - ratio="auto_480p", + ratio="1280:720", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_17(self, client: RunwayML) -> None: response = client.image_to_video.with_raw_response.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", ) @@ -883,7 +904,7 @@ def test_raw_response_create_overload_17(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_17(self, client: RunwayML) -> None: with client.image_to_video.with_streaming_response.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", ) as response: assert not response.is_closed @@ -894,45 +915,564 @@ def test_streaming_response_create_overload_17(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True - -class TestAsyncImageToVideo: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - @parametrize - async def test_method_create_overload_1(self, async_client: AsyncRunwayML) -> None: - image_to_video = await async_client.image_to_video.create( - duration=2, - model="gen4.5", + def test_method_create_overload_18(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="grok_imagine_1_5", prompt_image="https://example.com/image.jpg", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_18(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="grok_imagine_1_5", + prompt_image="https://example.com/image.jpg", + duration=1, + prompt_text="x", + resolution="480p", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_18(self, client: RunwayML) -> None: + response = client.image_to_video.with_raw_response.create( + model="grok_imagine_1_5", + prompt_image="https://example.com/image.jpg", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_18(self, client: RunwayML) -> None: + with client.image_to_video.with_streaming_response.create( + model="grok_imagine_1_5", + prompt_image="https://example.com/image.jpg", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_19(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="wan3", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_19(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="wan3", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + audio=True, + duration=2, + ratio="832:480", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_19(self, client: RunwayML) -> None: + response = client.image_to_video.with_raw_response.create( + model="wan3", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_19(self, client: RunwayML) -> None: + with client.image_to_video.with_streaming_response.create( + model="wan3", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_20(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="gemini_omni_flash_1.1", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_20(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="gemini_omni_flash_1.1", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + duration="auto", + ratio="640:360", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_20(self, client: RunwayML) -> None: + response = client.image_to_video.with_raw_response.create( + model="gemini_omni_flash_1.1", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_20(self, client: RunwayML) -> None: + with client.image_to_video.with_streaming_response.create( + model="gemini_omni_flash_1.1", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_21(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="wan3_prime", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_21(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="wan3_prime", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + audio=True, + duration=2, + ratio="832:480", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_21(self, client: RunwayML) -> None: + response = client.image_to_video.with_raw_response.create( + model="wan3_prime", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_21(self, client: RunwayML) -> None: + with client.image_to_video.with_streaming_response.create( + model="wan3_prime", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_22(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="h3_max", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_22(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="h3_max", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + duration=5, + prompt_expansion_mode="disabled", + resolution="768p", + seed=0, + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_22(self, client: RunwayML) -> None: + response = client.image_to_video.with_raw_response.create( + model="h3_max", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_22(self, client: RunwayML) -> None: + with client.image_to_video.with_streaming_response.create( + model="h3_max", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_23(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_23(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + audio=True, + draft=True, + duration="auto", + output_format="mp4", prompt_text="x", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + seed=0, + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_23(self, client: RunwayML) -> None: + response = client.image_to_video.with_raw_response.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_23(self, client: RunwayML) -> None: + with client.image_to_video.with_streaming_response.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_24(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="grok_imagine_1_5_lite", + prompt_image="https://example.com/image.jpg", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_24(self, client: RunwayML) -> None: + image_to_video = client.image_to_video.create( + model="grok_imagine_1_5_lite", + prompt_image="https://example.com/image.jpg", + duration=1, + prompt_text="x", + ratio="auto_480p", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_24(self, client: RunwayML) -> None: + response = client.image_to_video.with_raw_response.create( + model="grok_imagine_1_5_lite", + prompt_image="https://example.com/image.jpg", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_24(self, client: RunwayML) -> None: + with client.image_to_video.with_streaming_response.create( + model="grok_imagine_1_5_lite", + prompt_image="https://example.com/image.jpg", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncImageToVideo: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_create_overload_1(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + duration=2, + model="gen4.5", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ratio="1280:720", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_1(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + duration=2, + model="gen4.5", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ratio="1280:720", + content_moderation={"public_figure_threshold": "auto"}, + output_format="mp4", + prores_profile="422", + seed=0, + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + duration=2, + model="gen4.5", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ratio="1280:720", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + duration=2, + model="gen4.5", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ratio="1280:720", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="gen4_turbo", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="gen4_turbo", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + content_moderation={"public_figure_threshold": "auto"}, + duration=2, + prompt_text="x", + seed=0, + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + model="gen4_turbo", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + model="gen4_turbo", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="veo3.1", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="veo3.1", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + audio=True, + duration=4, + negative_prompt="x", + prompt_text="x", + seed=0, + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + model="veo3.1", + prompt_image="https://example.com/image.jpg", ratio="1280:720", ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_1(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + model="veo3.1", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - duration=2, - model="gen4.5", + model="veo3.1_fast", prompt_image="https://example.com/image.jpg", - prompt_text="x", ratio="1280:720", - content_moderation={"public_figure_threshold": "auto"}, - output_format="mp4", - prores_profile="422", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="veo3.1_fast", + prompt_image="https://example.com/image.jpg", + ratio="1280:720", + audio=True, + duration=4, + negative_prompt="x", + prompt_text="x", seed=0, ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( - duration=2, - model="gen4.5", + model="veo3.1_fast", prompt_image="https://example.com/image.jpg", - prompt_text="x", ratio="1280:720", ) @@ -942,12 +1482,10 @@ async def test_raw_response_create_overload_1(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( - duration=2, - model="gen4.5", + model="veo3.1_fast", prompt_image="https://example.com/image.jpg", - prompt_text="x", ratio="1280:720", ) as response: assert not response.is_closed @@ -959,33 +1497,243 @@ async def test_streaming_response_create_overload_1(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_5(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="gen4_turbo", + model="klingO3_4k", prompt_image="https://example.com/image.jpg", - ratio="1280:720", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_5(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="gen4_turbo", + model="klingO3_4k", + prompt_image="https://example.com/image.jpg", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="3840:2160", + references="https://example.com/image.jpg", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + model="klingO3_4k", + prompt_image="https://example.com/image.jpg", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + model="klingO3_4k", + prompt_image="https://example.com/image.jpg", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="hailuo3", prompt_image="https://example.com/image.jpg", - ratio="1280:720", - content_moderation={"public_figure_threshold": "auto"}, - duration=2, prompt_text="x", - seed=0, ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_6(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="hailuo3", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + duration=5, + ratio="adaptive", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + resolution="2k", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + model="hailuo3", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + model="hailuo3", + prompt_image="https://example.com/image.jpg", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="kling3.0_4k", + prompt_image="https://example.com/image.jpg", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="kling3.0_4k", + prompt_image="https://example.com/image.jpg", + audio=True, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="3840:2160", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + model="kling3.0_4k", + prompt_image="https://example.com/image.jpg", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + model="kling3.0_4k", + prompt_image="https://example.com/image.jpg", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="happyhorse_1_0", + prompt_image="https://example.com/image.jpg", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="happyhorse_1_0", + prompt_image="https://example.com/image.jpg", + duration=3, + prompt_text="xx", + resolution="720p", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + model="happyhorse_1_0", + prompt_image="https://example.com/image.jpg", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + model="happyhorse_1_0", + prompt_image="https://example.com/image.jpg", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="kling2.5_turbo_pro", + prompt_image="https://example.com/image.jpg", + prompt_text="xx", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_9(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="kling2.5_turbo_pro", + prompt_image="https://example.com/image.jpg", + prompt_text="xx", + cfg_scale=0, + duration=5, + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( - model="gen4_turbo", + model="kling2.5_turbo_pro", prompt_image="https://example.com/image.jpg", - ratio="1280:720", + prompt_text="xx", ) assert response.is_closed is True @@ -994,11 +1742,11 @@ async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( - model="gen4_turbo", + model="kling2.5_turbo_pro", prompt_image="https://example.com/image.jpg", - ratio="1280:720", + prompt_text="xx", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1009,34 +1757,40 @@ async def test_streaming_response_create_overload_2(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="veo3.1", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", - ratio="1280:720", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_10(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="veo3.1", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", - ratio="1280:720", audio=True, - duration=4, - negative_prompt="x", - prompt_text="x", - seed=0, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1920:1080", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( - model="veo3.1", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", - ratio="1280:720", ) assert response.is_closed is True @@ -1045,11 +1799,10 @@ async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( - model="veo3.1", + model="kling3.0_pro", prompt_image="https://example.com/image.jpg", - ratio="1280:720", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1060,34 +1813,40 @@ async def test_streaming_response_create_overload_3(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="veo3.1_fast", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", - ratio="1280:720", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_11(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="veo3.1_fast", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", - ratio="1280:720", audio=True, - duration=4, - negative_prompt="x", - prompt_text="x", - seed=0, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1280:720", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( - model="veo3.1_fast", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", - ratio="1280:720", ) assert response.is_closed is True @@ -1096,11 +1855,10 @@ async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( - model="veo3.1_fast", + model="kling3.0_standard", prompt_image="https://example.com/image.jpg", - ratio="1280:720", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1111,38 +1869,40 @@ async def test_streaming_response_create_overload_4(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="hailuo3", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_12(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="hailuo3", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", - prompt_text="x", - duration=5, - ratio="adaptive", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - resolution="2k", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1920:1080", + references="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( - model="hailuo3", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) assert response.is_closed is True @@ -1151,11 +1911,10 @@ async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( - model="hailuo3", + model="klingO3_pro", prompt_image="https://example.com/image.jpg", - prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1166,28 +1925,39 @@ async def test_streaming_response_create_overload_5(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="happyhorse_1_0", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_13(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( - model="happyhorse_1_0", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", + audio=True, duration=3, prompt_text="xx", - resolution="720p", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ratio="1280:720", + references="https://example.com/image.jpg", ) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( - model="happyhorse_1_0", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", ) @@ -1197,9 +1967,9 @@ async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( - model="happyhorse_1_0", + model="klingO3_standard", prompt_image="https://example.com/image.jpg", ) as response: assert not response.is_closed @@ -1211,7 +1981,7 @@ async def test_streaming_response_create_overload_6(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="seedance2", prompt_image="https://example.com/image.jpg", @@ -1219,7 +1989,7 @@ async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> No assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_14(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="seedance2", prompt_image="https://example.com/image.jpg", @@ -1238,7 +2008,7 @@ async def test_method_create_with_all_params_overload_7(self, async_client: Asyn assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="seedance2", prompt_image="https://example.com/image.jpg", @@ -1250,7 +2020,7 @@ async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="seedance2", prompt_image="https://example.com/image.jpg", @@ -1264,7 +2034,7 @@ async def test_streaming_response_create_overload_7(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_15(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="seedance2_fast", prompt_image="https://example.com/image.jpg", @@ -1272,7 +2042,7 @@ async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> No assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_15(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="seedance2_fast", prompt_image="https://example.com/image.jpg", @@ -1291,7 +2061,7 @@ async def test_method_create_with_all_params_overload_8(self, async_client: Asyn assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="seedance2_fast", prompt_image="https://example.com/image.jpg", @@ -1303,7 +2073,7 @@ async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="seedance2_fast", prompt_image="https://example.com/image.jpg", @@ -1317,7 +2087,7 @@ async def test_streaming_response_create_overload_8(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_16(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="seedance2_mini", prompt_image="https://example.com/image.jpg", @@ -1325,7 +2095,7 @@ async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> No assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_16(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="seedance2_mini", prompt_image="https://example.com/image.jpg", @@ -1344,7 +2114,7 @@ async def test_method_create_with_all_params_overload_9(self, async_client: Asyn assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="seedance2_mini", prompt_image="https://example.com/image.jpg", @@ -1356,7 +2126,7 @@ async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="seedance2_mini", prompt_image="https://example.com/image.jpg", @@ -1370,7 +2140,7 @@ async def test_streaming_response_create_overload_9(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_17(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", @@ -1378,7 +2148,7 @@ async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> N assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_17(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", @@ -1389,7 +2159,7 @@ async def test_method_create_with_all_params_overload_10(self, async_client: Asy assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", @@ -1401,7 +2171,7 @@ async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="gemini_omni_flash", prompt_image="https://example.com/image.jpg", @@ -1415,60 +2185,7 @@ async def test_streaming_response_create_overload_10(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> None: - image_to_video = await async_client.image_to_video.create( - model="seedance2_5", - prompt_image="https://example.com/image.jpg", - ) - assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) - - @parametrize - async def test_method_create_with_all_params_overload_11(self, async_client: AsyncRunwayML) -> None: - image_to_video = await async_client.image_to_video.create( - model="seedance2_5", - prompt_image="https://example.com/image.jpg", - audio=True, - duration="auto", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - seed=0, - ) - assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) - - @parametrize - async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: - response = await async_client.image_to_video.with_raw_response.create( - model="seedance2_5", - prompt_image="https://example.com/image.jpg", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - image_to_video = await response.parse() - assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) - - @parametrize - async def test_streaming_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: - async with async_client.image_to_video.with_streaming_response.create( - model="seedance2_5", - prompt_image="https://example.com/image.jpg", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - image_to_video = await response.parse() - assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_18(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="grok_imagine_1_5", prompt_image="https://example.com/image.jpg", @@ -1476,7 +2193,7 @@ async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> N assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_18(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="grok_imagine_1_5", prompt_image="https://example.com/image.jpg", @@ -1487,7 +2204,7 @@ async def test_method_create_with_all_params_overload_12(self, async_client: Asy assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_18(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="grok_imagine_1_5", prompt_image="https://example.com/image.jpg", @@ -1499,7 +2216,7 @@ async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_18(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="grok_imagine_1_5", prompt_image="https://example.com/image.jpg", @@ -1513,7 +2230,7 @@ async def test_streaming_response_create_overload_12(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_19(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="wan3", prompt_image="https://example.com/image.jpg", @@ -1522,7 +2239,7 @@ async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> N assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_19(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="wan3", prompt_image="https://example.com/image.jpg", @@ -1546,7 +2263,7 @@ async def test_method_create_with_all_params_overload_13(self, async_client: Asy assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="wan3", prompt_image="https://example.com/image.jpg", @@ -1559,7 +2276,7 @@ async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="wan3", prompt_image="https://example.com/image.jpg", @@ -1574,7 +2291,7 @@ async def test_streaming_response_create_overload_13(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_20(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="gemini_omni_flash_1.1", prompt_image="https://example.com/image.jpg", @@ -1583,7 +2300,7 @@ async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> N assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_20(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="gemini_omni_flash_1.1", prompt_image="https://example.com/image.jpg", @@ -1594,7 +2311,7 @@ async def test_method_create_with_all_params_overload_14(self, async_client: Asy assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_20(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="gemini_omni_flash_1.1", prompt_image="https://example.com/image.jpg", @@ -1607,7 +2324,7 @@ async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_20(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="gemini_omni_flash_1.1", prompt_image="https://example.com/image.jpg", @@ -1622,7 +2339,7 @@ async def test_streaming_response_create_overload_14(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_21(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="wan3_prime", prompt_image="https://example.com/image.jpg", @@ -1631,7 +2348,7 @@ async def test_method_create_overload_15(self, async_client: AsyncRunwayML) -> N assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_21(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="wan3_prime", prompt_image="https://example.com/image.jpg", @@ -1655,7 +2372,7 @@ async def test_method_create_with_all_params_overload_15(self, async_client: Asy assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_21(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="wan3_prime", prompt_image="https://example.com/image.jpg", @@ -1668,7 +2385,7 @@ async def test_raw_response_create_overload_15(self, async_client: AsyncRunwayML assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_21(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="wan3_prime", prompt_image="https://example.com/image.jpg", @@ -1683,7 +2400,7 @@ async def test_streaming_response_create_overload_15(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_22(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="h3_max", prompt_image="https://example.com/image.jpg", @@ -1692,7 +2409,7 @@ async def test_method_create_overload_16(self, async_client: AsyncRunwayML) -> N assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_22(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="h3_max", prompt_image="https://example.com/image.jpg", @@ -1705,7 +2422,7 @@ async def test_method_create_with_all_params_overload_16(self, async_client: Asy assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_22(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="h3_max", prompt_image="https://example.com/image.jpg", @@ -1718,7 +2435,7 @@ async def test_raw_response_create_overload_16(self, async_client: AsyncRunwayML assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_22(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="h3_max", prompt_image="https://example.com/image.jpg", @@ -1733,7 +2450,62 @@ async def test_streaming_response_create_overload_16(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_17(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_23(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_23(self, async_client: AsyncRunwayML) -> None: + image_to_video = await async_client.image_to_video.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + audio=True, + draft=True, + duration="auto", + output_format="mp4", + prompt_text="x", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + seed=0, + ) + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_23(self, async_client: AsyncRunwayML) -> None: + response = await async_client.image_to_video.with_raw_response.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_23(self, async_client: AsyncRunwayML) -> None: + async with async_client.image_to_video.with_streaming_response.create( + model="seedance2_5", + prompt_image="https://example.com/image.jpg", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + image_to_video = await response.parse() + assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_24(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="grok_imagine_1_5_lite", prompt_image="https://example.com/image.jpg", @@ -1741,7 +2513,7 @@ async def test_method_create_overload_17(self, async_client: AsyncRunwayML) -> N assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_17(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_24(self, async_client: AsyncRunwayML) -> None: image_to_video = await async_client.image_to_video.create( model="grok_imagine_1_5_lite", prompt_image="https://example.com/image.jpg", @@ -1752,7 +2524,7 @@ async def test_method_create_with_all_params_overload_17(self, async_client: Asy assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_24(self, async_client: AsyncRunwayML) -> None: response = await async_client.image_to_video.with_raw_response.create( model="grok_imagine_1_5_lite", prompt_image="https://example.com/image.jpg", @@ -1764,7 +2536,7 @@ async def test_raw_response_create_overload_17(self, async_client: AsyncRunwayML assert_matches_type(ImageToVideoCreateResponse, image_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_24(self, async_client: AsyncRunwayML) -> None: async with async_client.image_to_video.with_streaming_response.create( model="grok_imagine_1_5_lite", prompt_image="https://example.com/image.jpg", diff --git a/tests/api_resources/test_text_to_image.py b/tests/api_resources/test_text_to_image.py index a5466df3..09e63438 100644 --- a/tests/api_resources/test_text_to_image.py +++ b/tests/api_resources/test_text_to_image.py @@ -439,18 +439,18 @@ def test_streaming_response_create_overload_8(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_9(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gemini_image3_pro", - prompt_text="xxx", - ratio="1344:768", + model="gemini_image3.1_flash_lite", + prompt_text="x", + ratio="1024:1024", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_method_create_with_all_params_overload_9(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gemini_image3_pro", - prompt_text="xxx", - ratio="1344:768", + model="gemini_image3.1_flash_lite", + prompt_text="x", + ratio="1024:1024", output_count=1, reference_images=[ { @@ -465,9 +465,9 @@ def test_method_create_with_all_params_overload_9(self, client: RunwayML) -> Non @parametrize def test_raw_response_create_overload_9(self, client: RunwayML) -> None: response = client.text_to_image.with_raw_response.create( - model="gemini_image3_pro", - prompt_text="xxx", - ratio="1344:768", + model="gemini_image3.1_flash_lite", + prompt_text="x", + ratio="1024:1024", ) assert response.is_closed is True @@ -478,9 +478,9 @@ def test_raw_response_create_overload_9(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_9(self, client: RunwayML) -> None: with client.text_to_image.with_streaming_response.create( - model="gemini_image3_pro", - prompt_text="xxx", - ratio="1344:768", + model="gemini_image3.1_flash_lite", + prompt_text="x", + ratio="1024:1024", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -493,24 +493,23 @@ def test_streaming_response_create_overload_9(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_10(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gpt_image_2_5_flare", - prompt_text="x", - ratio="2048:880", + model="gemini_image3_pro", + prompt_text="xxx", + ratio="1344:768", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_method_create_with_all_params_overload_10(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gpt_image_2_5_flare", - prompt_text="x", - ratio="2048:880", - background="opaque", + model="gemini_image3_pro", + prompt_text="xxx", + ratio="1344:768", output_count=1, - quality="low", reference_images=[ { "uri": "https://example.com/image.jpg", + "subject": "object", "tag": "tag", } ], @@ -520,9 +519,9 @@ def test_method_create_with_all_params_overload_10(self, client: RunwayML) -> No @parametrize def test_raw_response_create_overload_10(self, client: RunwayML) -> None: response = client.text_to_image.with_raw_response.create( - model="gpt_image_2_5_flare", - prompt_text="x", - ratio="2048:880", + model="gemini_image3_pro", + prompt_text="xxx", + ratio="1344:768", ) assert response.is_closed is True @@ -533,9 +532,9 @@ def test_raw_response_create_overload_10(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_10(self, client: RunwayML) -> None: with client.text_to_image.with_streaming_response.create( - model="gpt_image_2_5_flare", - prompt_text="x", - ratio="2048:880", + model="gemini_image3_pro", + prompt_text="xxx", + ratio="1344:768", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -548,7 +547,7 @@ def test_streaming_response_create_overload_10(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_11(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gpt_image_2_5_sunburst", + model="gpt_image_2_5_flare", prompt_text="x", ratio="2048:880", ) @@ -557,10 +556,10 @@ def test_method_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_11(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gpt_image_2_5_sunburst", + model="gpt_image_2_5_flare", prompt_text="x", ratio="2048:880", - background="transparent", + background="opaque", output_count=1, quality="low", reference_images=[ @@ -575,7 +574,7 @@ def test_method_create_with_all_params_overload_11(self, client: RunwayML) -> No @parametrize def test_raw_response_create_overload_11(self, client: RunwayML) -> None: response = client.text_to_image.with_raw_response.create( - model="gpt_image_2_5_sunburst", + model="gpt_image_2_5_flare", prompt_text="x", ratio="2048:880", ) @@ -588,7 +587,7 @@ def test_raw_response_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_11(self, client: RunwayML) -> None: with client.text_to_image.with_streaming_response.create( - model="gpt_image_2_5_sunburst", + model="gpt_image_2_5_flare", prompt_text="x", ratio="2048:880", ) as response: @@ -603,28 +602,36 @@ def test_streaming_response_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_12(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="ideogram_4_0", + model="gpt_image_2_5_sunburst", prompt_text="x", + ratio="2048:880", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_method_create_with_all_params_overload_12(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="ideogram_4_0", + model="gpt_image_2_5_sunburst", prompt_text="x", + ratio="2048:880", + background="transparent", output_count=1, quality="low", - ratio="2048:2048", - reference_images=[{"uri": "https://example.com/image.jpg"}], + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "tag": "tag", + } + ], ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_raw_response_create_overload_12(self, client: RunwayML) -> None: response = client.text_to_image.with_raw_response.create( - model="ideogram_4_0", + model="gpt_image_2_5_sunburst", prompt_text="x", + ratio="2048:880", ) assert response.is_closed is True @@ -635,8 +642,9 @@ def test_raw_response_create_overload_12(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_12(self, client: RunwayML) -> None: with client.text_to_image.with_streaming_response.create( - model="ideogram_4_0", + model="gpt_image_2_5_sunburst", prompt_text="x", + ratio="2048:880", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -649,30 +657,30 @@ def test_streaming_response_create_overload_12(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_13(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="ideogram_4_5", + model="bria_fibo_1_5", prompt_text="x", + ratio="1024:1024", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_method_create_with_all_params_overload_13(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="ideogram_4_5", + model="bria_fibo_1_5", prompt_text="x", - mask_uri="https://example.com/image.jpg", - output_count=1, - precise_edit=True, - quality="very_low", ratio="1024:1024", + output_format="png", reference_images=[{"uri": "https://example.com/image.jpg"}], + seed=0, ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_raw_response_create_overload_13(self, client: RunwayML) -> None: response = client.text_to_image.with_raw_response.create( - model="ideogram_4_5", + model="bria_fibo_1_5", prompt_text="x", + ratio="1024:1024", ) assert response.is_closed is True @@ -683,8 +691,9 @@ def test_raw_response_create_overload_13(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_13(self, client: RunwayML) -> None: with client.text_to_image.with_streaming_response.create( - model="ideogram_4_5", + model="bria_fibo_1_5", prompt_text="x", + ratio="1024:1024", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -697,33 +706,28 @@ def test_streaming_response_create_overload_13(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_14(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gemini_2.5_flash", + model="bria_fibo_edit_1_5", prompt_text="x", - ratio="1344:768", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_method_create_with_all_params_overload_14(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( - model="gemini_2.5_flash", + model="bria_fibo_edit_1_5", prompt_text="x", - ratio="1344:768", - reference_images=[ - { - "uri": "https://example.com/image.jpg", - "tag": "tag", - } - ], + output_format="png", + ratio="1024:1024", + reference_images=[{"uri": "https://example.com/image.jpg"}], + seed=0, ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize def test_raw_response_create_overload_14(self, client: RunwayML) -> None: response = client.text_to_image.with_raw_response.create( - model="gemini_2.5_flash", + model="bria_fibo_edit_1_5", prompt_text="x", - ratio="1344:768", ) assert response.is_closed is True @@ -734,9 +738,8 @@ def test_raw_response_create_overload_14(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_14(self, client: RunwayML) -> None: with client.text_to_image.with_streaming_response.create( - model="gemini_2.5_flash", + model="bria_fibo_edit_1_5", prompt_text="x", - ratio="1344:768", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -746,215 +749,464 @@ def test_streaming_response_create_overload_14(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True - -class TestAsyncTextToImage: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - @parametrize - async def test_method_create_overload_1(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gen4_image_turbo", + def test_method_create_overload_15(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="ideogram_4_0", prompt_text="x", - ratio="1024:1024", - reference_images=[{"uri": "https://example.com/image.jpg"}], ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_1(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gen4_image_turbo", + def test_method_create_with_all_params_overload_15(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="ideogram_4_0", prompt_text="x", - ratio="1024:1024", - reference_images=[ - { - "uri": "https://example.com/image.jpg", - "tag": "tag", - } - ], - content_moderation={"public_figure_threshold": "auto"}, - seed=0, + output_count=1, + quality="low", + ratio="2048:2048", + reference_images=[{"uri": "https://example.com/image.jpg"}], ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: - response = await async_client.text_to_image.with_raw_response.create( - model="gen4_image_turbo", + def test_raw_response_create_overload_15(self, client: RunwayML) -> None: + response = client.text_to_image.with_raw_response.create( + model="ideogram_4_0", prompt_text="x", - ratio="1024:1024", - reference_images=[{"uri": "https://example.com/image.jpg"}], ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_image = await response.parse() + text_to_image = response.parse() assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: - async with async_client.text_to_image.with_streaming_response.create( - model="gen4_image_turbo", + def test_streaming_response_create_overload_15(self, client: RunwayML) -> None: + with client.text_to_image.with_streaming_response.create( + model="ideogram_4_0", prompt_text="x", - ratio="1024:1024", - reference_images=[{"uri": "https://example.com/image.jpg"}], ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_image = await response.parse() + text_to_image = response.parse() assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gen4_image", + def test_method_create_overload_16(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="ideogram_4_5", prompt_text="x", - ratio="1024:1024", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gen4_image", + def test_method_create_with_all_params_overload_16(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="ideogram_4_5", prompt_text="x", + mask_uri="https://example.com/image.jpg", + output_count=1, + precise_edit=True, + quality="very_low", ratio="1024:1024", - content_moderation={"public_figure_threshold": "auto"}, - reference_images=[ - { - "uri": "https://example.com/image.jpg", - "tag": "tag", - } - ], - seed=0, + reference_images=[{"uri": "https://example.com/image.jpg"}], ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: - response = await async_client.text_to_image.with_raw_response.create( - model="gen4_image", + def test_raw_response_create_overload_16(self, client: RunwayML) -> None: + response = client.text_to_image.with_raw_response.create( + model="ideogram_4_5", prompt_text="x", - ratio="1024:1024", ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_image = await response.parse() + text_to_image = response.parse() assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: - async with async_client.text_to_image.with_streaming_response.create( - model="gen4_image", + def test_streaming_response_create_overload_16(self, client: RunwayML) -> None: + with client.text_to_image.with_streaming_response.create( + model="ideogram_4_5", prompt_text="x", - ratio="1024:1024", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_image = await response.parse() + text_to_image = response.parse() assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gpt_image_2", + def test_method_create_overload_17(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="seedream5_flash", prompt_text="x", - ratio="2048:880", + ratio="1024:1024", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gpt_image_2", + def test_method_create_with_all_params_overload_17(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="seedream5_flash", prompt_text="x", - ratio="2048:880", - background="transparent", + ratio="1024:1024", output_count=1, - quality="low", - reference_images=[ - { - "uri": "https://example.com/image.jpg", - "tag": "tag", - } - ], + output_format="png", + reference_images=[{"uri": "https://example.com/image.jpg"}], ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: - response = await async_client.text_to_image.with_raw_response.create( - model="gpt_image_2", + def test_raw_response_create_overload_17(self, client: RunwayML) -> None: + response = client.text_to_image.with_raw_response.create( + model="seedream5_flash", prompt_text="x", - ratio="2048:880", + ratio="1024:1024", ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_image = await response.parse() + text_to_image = response.parse() assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: - async with async_client.text_to_image.with_streaming_response.create( - model="gpt_image_2", + def test_streaming_response_create_overload_17(self, client: RunwayML) -> None: + with client.text_to_image.with_streaming_response.create( + model="seedream5_flash", prompt_text="x", - ratio="2048:880", + ratio="1024:1024", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_image = await response.parse() + text_to_image = response.parse() assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gemini_image3.1_flash", + def test_method_create_overload_18(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="nano_banana_2.1", prompt_text="x", - ratio="512:512", + ratio="1024:1024", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: - text_to_image = await async_client.text_to_image.create( - model="gemini_image3.1_flash", + def test_method_create_with_all_params_overload_18(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="nano_banana_2.1", prompt_text="x", - ratio="512:512", + ratio="1024:1024", output_count=1, reference_images=[ { "uri": "https://example.com/image.jpg", - "subject": "object", "tag": "tag", } ], + thinking_level="minimal", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: - response = await async_client.text_to_image.with_raw_response.create( - model="gemini_image3.1_flash", + def test_raw_response_create_overload_18(self, client: RunwayML) -> None: + response = client.text_to_image.with_raw_response.create( + model="nano_banana_2.1", prompt_text="x", - ratio="512:512", + ratio="1024:1024", ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_image = await response.parse() + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_18(self, client: RunwayML) -> None: + with client.text_to_image.with_streaming_response.create( + model="nano_banana_2.1", + prompt_text="x", + ratio="1024:1024", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_19(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="gemini_2.5_flash", + prompt_text="x", + ratio="1344:768", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_19(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="gemini_2.5_flash", + prompt_text="x", + ratio="1344:768", + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "tag": "tag", + } + ], + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_raw_response_create_overload_19(self, client: RunwayML) -> None: + response = client.text_to_image.with_raw_response.create( + model="gemini_2.5_flash", + prompt_text="x", + ratio="1344:768", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_19(self, client: RunwayML) -> None: + with client.text_to_image.with_streaming_response.create( + model="gemini_2.5_flash", + prompt_text="x", + ratio="1344:768", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncTextToImage: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_create_overload_1(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gen4_image_turbo", + prompt_text="x", + ratio="1024:1024", + reference_images=[{"uri": "https://example.com/image.jpg"}], + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_1(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gen4_image_turbo", + prompt_text="x", + ratio="1024:1024", + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "tag": "tag", + } + ], + content_moderation={"public_figure_threshold": "auto"}, + seed=0, + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="gen4_image_turbo", + prompt_text="x", + ratio="1024:1024", + reference_images=[{"uri": "https://example.com/image.jpg"}], + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="gen4_image_turbo", + prompt_text="x", + ratio="1024:1024", + reference_images=[{"uri": "https://example.com/image.jpg"}], + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gen4_image", + prompt_text="x", + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gen4_image", + prompt_text="x", + ratio="1024:1024", + content_moderation={"public_figure_threshold": "auto"}, + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "tag": "tag", + } + ], + seed=0, + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="gen4_image", + prompt_text="x", + ratio="1024:1024", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="gen4_image", + prompt_text="x", + ratio="1024:1024", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gpt_image_2", + prompt_text="x", + ratio="2048:880", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gpt_image_2", + prompt_text="x", + ratio="2048:880", + background="transparent", + output_count=1, + quality="low", + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "tag": "tag", + } + ], + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="gpt_image_2", + prompt_text="x", + ratio="2048:880", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="gpt_image_2", + prompt_text="x", + ratio="2048:880", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gemini_image3.1_flash", + prompt_text="x", + ratio="512:512", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="gemini_image3.1_flash", + prompt_text="x", + ratio="512:512", + output_count=1, + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "subject": "object", + "tag": "tag", + } + ], + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="gemini_image3.1_flash", + prompt_text="x", + ratio="512:512", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize @@ -1076,29 +1328,79 @@ async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> No text_to_image = await async_client.text_to_image.create( model="seedream5_lite", prompt_text="x", - ratio="2048:2048", + ratio="2048:2048", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="seedream5_lite", + prompt_text="x", + ratio="2048:2048", + grounding=True, + output_count=1, + output_format="png", + reference_images=[{"uri": "https://example.com/image.jpg"}], + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="seedream5_lite", + prompt_text="x", + ratio="2048:2048", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="seedream5_lite", + prompt_text="x", + ratio="2048:2048", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="grok_imagine_image_2", + prompt_text="x", + ratio="1024:1024", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( - model="seedream5_lite", + model="grok_imagine_image_2", prompt_text="x", - ratio="2048:2048", - grounding=True, + ratio="1024:1024", + edit=True, output_count=1, - output_format="png", + quality="low", reference_images=[{"uri": "https://example.com/image.jpg"}], ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( - model="seedream5_lite", + model="grok_imagine_image_2", prompt_text="x", - ratio="2048:2048", + ratio="1024:1024", ) assert response.is_closed is True @@ -1107,11 +1409,11 @@ async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( - model="seedream5_lite", + model="grok_imagine_image_2", prompt_text="x", - ratio="2048:2048", + ratio="1024:1024", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1122,31 +1424,35 @@ async def test_streaming_response_create_overload_7(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( - model="grok_imagine_image_2", + model="gemini_image3.1_flash_lite", prompt_text="x", ratio="1024:1024", ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_9(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( - model="grok_imagine_image_2", + model="gemini_image3.1_flash_lite", prompt_text="x", ratio="1024:1024", - edit=True, output_count=1, - quality="low", - reference_images=[{"uri": "https://example.com/image.jpg"}], + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "subject": "object", + "tag": "tag", + } + ], ) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( - model="grok_imagine_image_2", + model="gemini_image3.1_flash_lite", prompt_text="x", ratio="1024:1024", ) @@ -1157,9 +1463,9 @@ async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( - model="grok_imagine_image_2", + model="gemini_image3.1_flash_lite", prompt_text="x", ratio="1024:1024", ) as response: @@ -1172,7 +1478,7 @@ async def test_streaming_response_create_overload_8(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gemini_image3_pro", prompt_text="xxx", @@ -1181,7 +1487,7 @@ async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> No assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_10(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gemini_image3_pro", prompt_text="xxx", @@ -1198,7 +1504,7 @@ async def test_method_create_with_all_params_overload_9(self, async_client: Asyn assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( model="gemini_image3_pro", prompt_text="xxx", @@ -1211,7 +1517,7 @@ async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( model="gemini_image3_pro", prompt_text="xxx", @@ -1226,7 +1532,7 @@ async def test_streaming_response_create_overload_9(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gpt_image_2_5_flare", prompt_text="x", @@ -1235,7 +1541,7 @@ async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_11(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gpt_image_2_5_flare", prompt_text="x", @@ -1253,7 +1559,7 @@ async def test_method_create_with_all_params_overload_10(self, async_client: Asy assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( model="gpt_image_2_5_flare", prompt_text="x", @@ -1266,7 +1572,7 @@ async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( model="gpt_image_2_5_flare", prompt_text="x", @@ -1281,7 +1587,7 @@ async def test_streaming_response_create_overload_10(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gpt_image_2_5_sunburst", prompt_text="x", @@ -1290,7 +1596,7 @@ async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_12(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gpt_image_2_5_sunburst", prompt_text="x", @@ -1308,7 +1614,7 @@ async def test_method_create_with_all_params_overload_11(self, async_client: Asy assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( model="gpt_image_2_5_sunburst", prompt_text="x", @@ -1321,7 +1627,7 @@ async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( model="gpt_image_2_5_sunburst", prompt_text="x", @@ -1336,7 +1642,102 @@ async def test_streaming_response_create_overload_11(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="bria_fibo_1_5", + prompt_text="x", + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_13(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="bria_fibo_1_5", + prompt_text="x", + ratio="1024:1024", + output_format="png", + reference_images=[{"uri": "https://example.com/image.jpg"}], + seed=0, + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="bria_fibo_1_5", + prompt_text="x", + ratio="1024:1024", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="bria_fibo_1_5", + prompt_text="x", + ratio="1024:1024", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="bria_fibo_edit_1_5", + prompt_text="x", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_14(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="bria_fibo_edit_1_5", + prompt_text="x", + output_format="png", + ratio="1024:1024", + reference_images=[{"uri": "https://example.com/image.jpg"}], + seed=0, + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="bria_fibo_edit_1_5", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="bria_fibo_edit_1_5", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_15(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="ideogram_4_0", prompt_text="x", @@ -1344,7 +1745,7 @@ async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_15(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="ideogram_4_0", prompt_text="x", @@ -1356,7 +1757,7 @@ async def test_method_create_with_all_params_overload_12(self, async_client: Asy assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( model="ideogram_4_0", prompt_text="x", @@ -1368,7 +1769,7 @@ async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( model="ideogram_4_0", prompt_text="x", @@ -1382,7 +1783,7 @@ async def test_streaming_response_create_overload_12(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_16(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="ideogram_4_5", prompt_text="x", @@ -1390,7 +1791,7 @@ async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_16(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="ideogram_4_5", prompt_text="x", @@ -1404,7 +1805,7 @@ async def test_method_create_with_all_params_overload_13(self, async_client: Asy assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( model="ideogram_4_5", prompt_text="x", @@ -1416,7 +1817,7 @@ async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( model="ideogram_4_5", prompt_text="x", @@ -1430,7 +1831,110 @@ async def test_streaming_response_create_overload_13(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_17(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="seedream5_flash", + prompt_text="x", + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_17(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="seedream5_flash", + prompt_text="x", + ratio="1024:1024", + output_count=1, + output_format="png", + reference_images=[{"uri": "https://example.com/image.jpg"}], + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="seedream5_flash", + prompt_text="x", + ratio="1024:1024", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="seedream5_flash", + prompt_text="x", + ratio="1024:1024", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_18(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="nano_banana_2.1", + prompt_text="x", + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_18(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="nano_banana_2.1", + prompt_text="x", + ratio="1024:1024", + output_count=1, + reference_images=[ + { + "uri": "https://example.com/image.jpg", + "tag": "tag", + } + ], + thinking_level="minimal", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_18(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="nano_banana_2.1", + prompt_text="x", + ratio="1024:1024", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_18(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="nano_banana_2.1", + prompt_text="x", + ratio="1024:1024", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_19(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gemini_2.5_flash", prompt_text="x", @@ -1439,7 +1943,7 @@ async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_19(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gemini_2.5_flash", prompt_text="x", @@ -1454,7 +1958,7 @@ async def test_method_create_with_all_params_overload_14(self, async_client: Asy assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( model="gemini_2.5_flash", prompt_text="x", @@ -1467,7 +1971,7 @@ async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( model="gemini_2.5_flash", prompt_text="x", diff --git a/tests/api_resources/test_text_to_video.py b/tests/api_resources/test_text_to_video.py index 99f410f3..a4becd2c 100644 --- a/tests/api_resources/test_text_to_video.py +++ b/tests/api_resources/test_text_to_video.py @@ -174,40 +174,36 @@ def test_streaming_response_create_overload_3(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_4(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="hailuo3", - prompt_text="x", + model="klingO3_4k", + ratio="3840:2160", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_4(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="hailuo3", - prompt_text="x", - duration=5, - ratio="adaptive", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - resolution="2k", + model="klingO3_4k", + ratio="3840:2160", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_4(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="hailuo3", - prompt_text="x", + model="klingO3_4k", + ratio="3840:2160", ) assert response.is_closed is True @@ -218,8 +214,8 @@ def test_raw_response_create_overload_4(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_4(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="hailuo3", - prompt_text="x", + model="klingO3_4k", + ratio="3840:2160", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -232,26 +228,40 @@ def test_streaming_response_create_overload_4(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_5(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="happyhorse_1_0", - prompt_text="xx", + model="hailuo3", + prompt_text="x", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_5(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="happyhorse_1_0", - prompt_text="xx", - duration=3, - ratio="1280:720", + model="hailuo3", + prompt_text="x", + duration=5, + ratio="adaptive", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + resolution="2k", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_5(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="happyhorse_1_0", - prompt_text="xx", + model="hailuo3", + prompt_text="x", ) assert response.is_closed is True @@ -262,8 +272,8 @@ def test_raw_response_create_overload_5(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_5(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="happyhorse_1_0", - prompt_text="xx", + model="hailuo3", + prompt_text="x", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -276,41 +286,37 @@ def test_streaming_response_create_overload_5(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_6(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2", - prompt_text="x", + model="kling3.0_4k", + ratio="3840:2160", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_6(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2", - prompt_text="x", + model="kling3.0_4k", + ratio="3840:2160", audio=True, - duration="auto", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - seed=0, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_6(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="seedance2", - prompt_text="x", + model="kling3.0_4k", + ratio="3840:2160", ) assert response.is_closed is True @@ -321,8 +327,8 @@ def test_raw_response_create_overload_6(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_6(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="seedance2", - prompt_text="x", + model="kling3.0_4k", + ratio="3840:2160", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -335,41 +341,26 @@ def test_streaming_response_create_overload_6(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_7(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2_fast", - prompt_text="x", + model="happyhorse_1_0", + prompt_text="xx", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_7(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2_fast", - prompt_text="x", - audio=True, - duration="auto", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - seed=0, + model="happyhorse_1_0", + prompt_text="xx", + duration=3, + ratio="1280:720", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_7(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="seedance2_fast", - prompt_text="x", + model="happyhorse_1_0", + prompt_text="xx", ) assert response.is_closed is True @@ -380,8 +371,8 @@ def test_raw_response_create_overload_7(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_7(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="seedance2_fast", - prompt_text="x", + model="happyhorse_1_0", + prompt_text="xx", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -394,41 +385,27 @@ def test_streaming_response_create_overload_7(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_8(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2_mini", - prompt_text="x", + model="kling2.5_turbo_pro", + prompt_text="xx", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_8(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2_mini", - prompt_text="x", - audio=True, - duration="auto", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - seed=0, + model="kling2.5_turbo_pro", + prompt_text="xx", + cfg_scale=0, + duration=5, + ratio="1920:1080", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_8(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="seedance2_mini", - prompt_text="x", + model="kling2.5_turbo_pro", + prompt_text="xx", ) assert response.is_closed is True @@ -439,8 +416,8 @@ def test_raw_response_create_overload_8(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_8(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="seedance2_mini", - prompt_text="x", + model="kling2.5_turbo_pro", + prompt_text="xx", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -453,26 +430,37 @@ def test_streaming_response_create_overload_8(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_9(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="gemini_omni_flash", - prompt_text="x", + model="kling3.0_pro", + ratio="1920:1080", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_9(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="gemini_omni_flash", - prompt_text="x", + model="kling3.0_pro", + ratio="1920:1080", + audio=True, + cfg_scale=0, duration=3, - ratio="1280:720", + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_9(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="gemini_omni_flash", - prompt_text="x", + model="kling3.0_pro", + ratio="1920:1080", ) assert response.is_closed is True @@ -483,8 +471,8 @@ def test_raw_response_create_overload_9(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_9(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="gemini_omni_flash", - prompt_text="x", + model="kling3.0_pro", + ratio="1920:1080", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -497,39 +485,37 @@ def test_streaming_response_create_overload_9(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_10(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2_5", + model="kling3.0_standard", + ratio="1280:720", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_10(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="seedance2_5", + model="kling3.0_standard", + ratio="1280:720", audio=True, - duration="auto", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - seed=0, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_10(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="seedance2_5", + model="kling3.0_standard", + ratio="1280:720", ) assert response.is_closed is True @@ -540,7 +526,8 @@ def test_raw_response_create_overload_10(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_10(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="seedance2_5", + model="kling3.0_standard", + ratio="1280:720", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -553,34 +540,36 @@ def test_streaming_response_create_overload_10(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_11(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="grok_imagine_1_5", - prompt_text="x", + model="klingO3_pro", + ratio="1920:1080", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_11(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="grok_imagine_1_5", - prompt_text="x", - duration=1, - ratio="1:1", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - resolution="480p", + model="klingO3_pro", + ratio="1920:1080", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_11(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="grok_imagine_1_5", - prompt_text="x", + model="klingO3_pro", + ratio="1920:1080", ) assert response.is_closed is True @@ -591,8 +580,8 @@ def test_raw_response_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_11(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="grok_imagine_1_5", - prompt_text="x", + model="klingO3_pro", + ratio="1920:1080", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -605,40 +594,36 @@ def test_streaming_response_create_overload_11(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_12(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="wan3", - prompt_text="x", + model="klingO3_standard", + ratio="1280:720", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_method_create_with_all_params_overload_12(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="wan3", - prompt_text="x", + model="klingO3_standard", + ratio="1280:720", audio=True, - duration=2, - ratio="832:480", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_12(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="wan3", - prompt_text="x", + model="klingO3_standard", + ratio="1280:720", ) assert response.is_closed is True @@ -649,8 +634,8 @@ def test_raw_response_create_overload_12(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_12(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="wan3", - prompt_text="x", + model="klingO3_standard", + ratio="1280:720", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -663,7 +648,7 @@ def test_streaming_response_create_overload_12(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_13(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_text="x", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @@ -671,19 +656,32 @@ def test_method_create_overload_13(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_13(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_text="x", + audio=True, duration="auto", - ratio="640:360", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[{"uri": "https://example.com/video.mp4"}], - ) - assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + seed=0, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_13(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_text="x", ) @@ -695,7 +693,7 @@ def test_raw_response_create_overload_13(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_13(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="gemini_omni_flash_1.1", + model="seedance2", prompt_text="x", ) as response: assert not response.is_closed @@ -709,7 +707,7 @@ def test_streaming_response_create_overload_13(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_14(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="wan3_prime", + model="seedance2_fast", prompt_text="x", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @@ -717,11 +715,11 @@ def test_method_create_overload_14(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_14(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="wan3_prime", + model="seedance2_fast", prompt_text="x", audio=True, - duration=2, - ratio="832:480", + duration="auto", + ratio="992:432", reference_audio=[ { "type": "audio", @@ -735,13 +733,14 @@ def test_method_create_with_all_params_overload_14(self, client: RunwayML) -> No "uri": "https://example.com/video.mp4", } ], + seed=0, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_14(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="wan3_prime", + model="seedance2_fast", prompt_text="x", ) @@ -753,7 +752,7 @@ def test_raw_response_create_overload_14(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_14(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="wan3_prime", + model="seedance2_fast", prompt_text="x", ) as response: assert not response.is_closed @@ -767,7 +766,7 @@ def test_streaming_response_create_overload_14(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_15(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="h3_max", + model="seedance2_mini", prompt_text="x", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @@ -775,11 +774,24 @@ def test_method_create_overload_15(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_15(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="h3_max", + model="seedance2_mini", prompt_text="x", - duration=5, - prompt_expansion_mode="disabled", - resolution="768p", + audio=True, + duration="auto", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], seed=0, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @@ -787,7 +799,7 @@ def test_method_create_with_all_params_overload_15(self, client: RunwayML) -> No @parametrize def test_raw_response_create_overload_15(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="h3_max", + model="seedance2_mini", prompt_text="x", ) @@ -799,7 +811,7 @@ def test_raw_response_create_overload_15(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_15(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="h3_max", + model="seedance2_mini", prompt_text="x", ) as response: assert not response.is_closed @@ -813,7 +825,7 @@ def test_streaming_response_create_overload_15(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_16(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_text="x", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @@ -821,17 +833,17 @@ def test_method_create_overload_16(self, client: RunwayML) -> None: @parametrize def test_method_create_with_all_params_overload_16(self, client: RunwayML) -> None: text_to_video = client.text_to_video.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_text="x", - duration=1, - ratio="848:480", + duration=3, + ratio="1280:720", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize def test_raw_response_create_overload_16(self, client: RunwayML) -> None: response = client.text_to_video.with_raw_response.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_text="x", ) @@ -843,7 +855,7 @@ def test_raw_response_create_overload_16(self, client: RunwayML) -> None: @parametrize def test_streaming_response_create_overload_16(self, client: RunwayML) -> None: with client.text_to_video.with_streaming_response.create( - model="grok_imagine_1_5_lite", + model="gemini_omni_flash", prompt_text="x", ) as response: assert not response.is_closed @@ -854,94 +866,819 @@ def test_streaming_response_create_overload_16(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True + @parametrize + def test_method_create_overload_17(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="grok_imagine_1_5", + prompt_text="x", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) -class TestAsyncTextToVideo: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) + @parametrize + def test_method_create_with_all_params_overload_17(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="grok_imagine_1_5", + prompt_text="x", + duration=1, + ratio="1:1", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + resolution="480p", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_overload_1(self, async_client: AsyncRunwayML) -> None: - text_to_video = await async_client.text_to_video.create( - duration=2, - model="gen4.5", + def test_raw_response_create_overload_17(self, client: RunwayML) -> None: + response = client.text_to_video.with_raw_response.create( + model="grok_imagine_1_5", prompt_text="x", - ratio="1280:720", ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = response.parse() assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_1(self, async_client: AsyncRunwayML) -> None: - text_to_video = await async_client.text_to_video.create( - duration=2, - model="gen4.5", + def test_streaming_response_create_overload_17(self, client: RunwayML) -> None: + with client.text_to_video.with_streaming_response.create( + model="grok_imagine_1_5", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_18(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="wan3", prompt_text="x", - ratio="1280:720", - content_moderation={"public_figure_threshold": "auto"}, - output_format="mp4", - prores_profile="422", - seed=0, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: - response = await async_client.text_to_video.with_raw_response.create( + def test_method_create_with_all_params_overload_18(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="wan3", + prompt_text="x", + audio=True, duration=2, - model="gen4.5", + ratio="832:480", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_18(self, client: RunwayML) -> None: + response = client.text_to_video.with_raw_response.create( + model="wan3", prompt_text="x", - ratio="1280:720", ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_video = await response.parse() + text_to_video = response.parse() assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: - async with async_client.text_to_video.with_streaming_response.create( - duration=2, - model="gen4.5", + def test_streaming_response_create_overload_18(self, client: RunwayML) -> None: + with client.text_to_video.with_streaming_response.create( + model="wan3", prompt_text="x", - ratio="1280:720", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_video = await response.parse() + text_to_video = response.parse() assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: - text_to_video = await async_client.text_to_video.create( - model="veo3.1", + def test_method_create_overload_19(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="gemini_omni_flash_1.1", prompt_text="x", - ratio="1280:720", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: - text_to_video = await async_client.text_to_video.create( - model="veo3.1", + def test_method_create_with_all_params_overload_19(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="gemini_omni_flash_1.1", + prompt_text="x", + duration="auto", + ratio="640:360", + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[{"uri": "https://example.com/video.mp4"}], + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_19(self, client: RunwayML) -> None: + response = client.text_to_video.with_raw_response.create( + model="gemini_omni_flash_1.1", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_19(self, client: RunwayML) -> None: + with client.text_to_video.with_streaming_response.create( + model="gemini_omni_flash_1.1", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_20(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="wan3_prime", + prompt_text="x", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_20(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="wan3_prime", prompt_text="x", - ratio="1280:720", audio=True, - duration=4, - negative_prompt="x", - seed=0, + duration=2, + ratio="832:480", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_20(self, client: RunwayML) -> None: + response = client.text_to_video.with_raw_response.create( + model="wan3_prime", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_20(self, client: RunwayML) -> None: + with client.text_to_video.with_streaming_response.create( + model="wan3_prime", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_21(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="h3_max", + prompt_text="x", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_21(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="h3_max", + prompt_text="x", + duration=5, + prompt_expansion_mode="disabled", + resolution="768p", + seed=0, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_21(self, client: RunwayML) -> None: + response = client.text_to_video.with_raw_response.create( + model="h3_max", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_21(self, client: RunwayML) -> None: + with client.text_to_video.with_streaming_response.create( + model="h3_max", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_22(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="seedance2_5", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_22(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="seedance2_5", + audio=True, + draft=True, + draft_task_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + duration="auto", + output_format="mp4", + prompt_text="x", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + seed=0, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_22(self, client: RunwayML) -> None: + response = client.text_to_video.with_raw_response.create( + model="seedance2_5", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_22(self, client: RunwayML) -> None: + with client.text_to_video.with_streaming_response.create( + model="seedance2_5", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_23(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="grok_imagine_1_5_lite", + prompt_text="x", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_23(self, client: RunwayML) -> None: + text_to_video = client.text_to_video.create( + model="grok_imagine_1_5_lite", + prompt_text="x", + duration=1, + ratio="848:480", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_23(self, client: RunwayML) -> None: + response = client.text_to_video.with_raw_response.create( + model="grok_imagine_1_5_lite", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_23(self, client: RunwayML) -> None: + with client.text_to_video.with_streaming_response.create( + model="grok_imagine_1_5_lite", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncTextToVideo: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_create_overload_1(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + duration=2, + model="gen4.5", + prompt_text="x", + ratio="1280:720", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_1(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + duration=2, + model="gen4.5", + prompt_text="x", + ratio="1280:720", + content_moderation={"public_figure_threshold": "auto"}, + output_format="mp4", + prores_profile="422", + seed=0, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + duration=2, + model="gen4.5", + prompt_text="x", + ratio="1280:720", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_1(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + duration=2, + model="gen4.5", + prompt_text="x", + ratio="1280:720", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="veo3.1", + prompt_text="x", + ratio="1280:720", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="veo3.1", + prompt_text="x", + ratio="1280:720", + audio=True, + duration=4, + negative_prompt="x", + seed=0, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="veo3.1", + prompt_text="x", + ratio="1280:720", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="veo3.1", + prompt_text="x", + ratio="1280:720", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="veo3.1_fast", + prompt_text="x", + ratio="1280:720", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="veo3.1_fast", + prompt_text="x", + ratio="1280:720", + audio=True, + duration=4, + negative_prompt="x", + seed=0, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="veo3.1_fast", + prompt_text="x", + ratio="1280:720", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="veo3.1_fast", + prompt_text="x", + ratio="1280:720", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="klingO3_4k", + ratio="3840:2160", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="klingO3_4k", + ratio="3840:2160", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="klingO3_4k", + ratio="3840:2160", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="klingO3_4k", + ratio="3840:2160", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_5(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="hailuo3", + prompt_text="x", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_5(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="hailuo3", + prompt_text="x", + duration=5, + ratio="adaptive", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + resolution="2k", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="hailuo3", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="hailuo3", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="kling3.0_4k", + ratio="3840:2160", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_6(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="kling3.0_4k", + ratio="3840:2160", + audio=True, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="kling3.0_4k", + ratio="3840:2160", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="kling3.0_4k", + ratio="3840:2160", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="happyhorse_1_0", + prompt_text="xx", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="happyhorse_1_0", + prompt_text="xx", + duration=3, + ratio="1280:720", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="happyhorse_1_0", + prompt_text="xx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="happyhorse_1_0", + prompt_text="xx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="kling2.5_turbo_pro", + prompt_text="xx", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="kling2.5_turbo_pro", + prompt_text="xx", + cfg_scale=0, + duration=5, + ratio="1920:1080", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="kling2.5_turbo_pro", + prompt_text="xx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="kling2.5_turbo_pro", + prompt_text="xx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="kling3.0_pro", + ratio="1920:1080", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_9(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="kling3.0_pro", + ratio="1920:1080", + audio=True, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( - model="veo3.1", - prompt_text="x", - ratio="1280:720", + model="kling3.0_pro", + ratio="1920:1080", ) assert response.is_closed is True @@ -950,11 +1687,10 @@ async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( - model="veo3.1", - prompt_text="x", - ratio="1280:720", + model="kling3.0_pro", + ratio="1920:1080", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -965,32 +1701,38 @@ async def test_streaming_response_create_overload_2(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( - model="veo3.1_fast", - prompt_text="x", + model="kling3.0_standard", ratio="1280:720", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_10(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( - model="veo3.1_fast", - prompt_text="x", + model="kling3.0_standard", ratio="1280:720", audio=True, - duration=4, - negative_prompt="x", - seed=0, + cfg_scale=0, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( - model="veo3.1_fast", - prompt_text="x", + model="kling3.0_standard", ratio="1280:720", ) @@ -1000,10 +1742,9 @@ async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( - model="veo3.1_fast", - prompt_text="x", + model="kling3.0_standard", ratio="1280:720", ) as response: assert not response.is_closed @@ -1015,42 +1756,38 @@ async def test_streaming_response_create_overload_3(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( - model="hailuo3", - prompt_text="x", + model="klingO3_pro", + ratio="1920:1080", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_11(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( - model="hailuo3", - prompt_text="x", - duration=5, - ratio="adaptive", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - resolution="2k", + model="klingO3_pro", + ratio="1920:1080", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( - model="hailuo3", - prompt_text="x", + model="klingO3_pro", + ratio="1920:1080", ) assert response.is_closed is True @@ -1059,10 +1796,10 @@ async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( - model="hailuo3", - prompt_text="x", + model="klingO3_pro", + ratio="1920:1080", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1073,28 +1810,38 @@ async def test_streaming_response_create_overload_4(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( - model="happyhorse_1_0", - prompt_text="xx", + model="klingO3_standard", + ratio="1280:720", ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_12(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( - model="happyhorse_1_0", - prompt_text="xx", - duration=3, + model="klingO3_standard", ratio="1280:720", + audio=True, + duration=3, + prompt_text="xx", + provider_settings={ + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, ) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( - model="happyhorse_1_0", - prompt_text="xx", + model="klingO3_standard", + ratio="1280:720", ) assert response.is_closed is True @@ -1103,10 +1850,10 @@ async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( - model="happyhorse_1_0", - prompt_text="xx", + model="klingO3_standard", + ratio="1280:720", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1117,7 +1864,7 @@ async def test_streaming_response_create_overload_5(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="seedance2", prompt_text="x", @@ -1125,7 +1872,7 @@ async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> No assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_13(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="seedance2", prompt_text="x", @@ -1150,7 +1897,7 @@ async def test_method_create_with_all_params_overload_6(self, async_client: Asyn assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="seedance2", prompt_text="x", @@ -1162,7 +1909,7 @@ async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="seedance2", prompt_text="x", @@ -1176,7 +1923,7 @@ async def test_streaming_response_create_overload_6(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="seedance2_fast", prompt_text="x", @@ -1184,7 +1931,7 @@ async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> No assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_14(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="seedance2_fast", prompt_text="x", @@ -1209,7 +1956,7 @@ async def test_method_create_with_all_params_overload_7(self, async_client: Asyn assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="seedance2_fast", prompt_text="x", @@ -1221,7 +1968,7 @@ async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="seedance2_fast", prompt_text="x", @@ -1235,7 +1982,7 @@ async def test_streaming_response_create_overload_7(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_15(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="seedance2_mini", prompt_text="x", @@ -1243,7 +1990,7 @@ async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> No assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_15(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="seedance2_mini", prompt_text="x", @@ -1268,7 +2015,7 @@ async def test_method_create_with_all_params_overload_8(self, async_client: Asyn assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="seedance2_mini", prompt_text="x", @@ -1280,7 +2027,7 @@ async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="seedance2_mini", prompt_text="x", @@ -1294,7 +2041,7 @@ async def test_streaming_response_create_overload_8(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_16(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="gemini_omni_flash", prompt_text="x", @@ -1302,7 +2049,7 @@ async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> No assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_16(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="gemini_omni_flash", prompt_text="x", @@ -1312,7 +2059,7 @@ async def test_method_create_with_all_params_overload_9(self, async_client: Asyn assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="gemini_omni_flash", prompt_text="x", @@ -1324,7 +2071,7 @@ async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="gemini_omni_flash", prompt_text="x", @@ -1338,63 +2085,7 @@ async def test_streaming_response_create_overload_9(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> None: - text_to_video = await async_client.text_to_video.create( - model="seedance2_5", - ) - assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) - - @parametrize - async def test_method_create_with_all_params_overload_10(self, async_client: AsyncRunwayML) -> None: - text_to_video = await async_client.text_to_video.create( - model="seedance2_5", - audio=True, - duration="auto", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], - references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - seed=0, - ) - assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) - - @parametrize - async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: - response = await async_client.text_to_video.with_raw_response.create( - model="seedance2_5", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - text_to_video = await response.parse() - assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) - - @parametrize - async def test_streaming_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: - async with async_client.text_to_video.with_streaming_response.create( - model="seedance2_5", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - text_to_video = await response.parse() - assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_17(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="grok_imagine_1_5", prompt_text="x", @@ -1402,7 +2093,7 @@ async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_17(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="grok_imagine_1_5", prompt_text="x", @@ -1420,7 +2111,7 @@ async def test_method_create_with_all_params_overload_11(self, async_client: Asy assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="grok_imagine_1_5", prompt_text="x", @@ -1432,7 +2123,7 @@ async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_17(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="grok_imagine_1_5", prompt_text="x", @@ -1446,7 +2137,7 @@ async def test_streaming_response_create_overload_11(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_18(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="wan3", prompt_text="x", @@ -1454,7 +2145,7 @@ async def test_method_create_overload_12(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_18(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="wan3", prompt_text="x", @@ -1478,7 +2169,7 @@ async def test_method_create_with_all_params_overload_12(self, async_client: Asy assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_18(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="wan3", prompt_text="x", @@ -1490,7 +2181,7 @@ async def test_raw_response_create_overload_12(self, async_client: AsyncRunwayML assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_12(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_18(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="wan3", prompt_text="x", @@ -1504,7 +2195,7 @@ async def test_streaming_response_create_overload_12(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_19(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="gemini_omni_flash_1.1", prompt_text="x", @@ -1512,7 +2203,7 @@ async def test_method_create_overload_13(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_19(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="gemini_omni_flash_1.1", prompt_text="x", @@ -1524,7 +2215,7 @@ async def test_method_create_with_all_params_overload_13(self, async_client: Asy assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="gemini_omni_flash_1.1", prompt_text="x", @@ -1536,7 +2227,7 @@ async def test_raw_response_create_overload_13(self, async_client: AsyncRunwayML assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_13(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="gemini_omni_flash_1.1", prompt_text="x", @@ -1550,7 +2241,7 @@ async def test_streaming_response_create_overload_13(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_20(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="wan3_prime", prompt_text="x", @@ -1558,7 +2249,7 @@ async def test_method_create_overload_14(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_20(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="wan3_prime", prompt_text="x", @@ -1582,7 +2273,7 @@ async def test_method_create_with_all_params_overload_14(self, async_client: Asy assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_20(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="wan3_prime", prompt_text="x", @@ -1594,7 +2285,7 @@ async def test_raw_response_create_overload_14(self, async_client: AsyncRunwayML assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_14(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_20(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="wan3_prime", prompt_text="x", @@ -1608,7 +2299,7 @@ async def test_streaming_response_create_overload_14(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_21(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="h3_max", prompt_text="x", @@ -1616,7 +2307,7 @@ async def test_method_create_overload_15(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_21(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="h3_max", prompt_text="x", @@ -1628,7 +2319,7 @@ async def test_method_create_with_all_params_overload_15(self, async_client: Asy assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_21(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="h3_max", prompt_text="x", @@ -1640,7 +2331,7 @@ async def test_raw_response_create_overload_15(self, async_client: AsyncRunwayML assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_15(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_21(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="h3_max", prompt_text="x", @@ -1654,7 +2345,66 @@ async def test_streaming_response_create_overload_15(self, async_client: AsyncRu assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_22(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="seedance2_5", + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_22(self, async_client: AsyncRunwayML) -> None: + text_to_video = await async_client.text_to_video.create( + model="seedance2_5", + audio=True, + draft=True, + draft_task_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + duration="auto", + output_format="mp4", + prompt_text="x", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], + references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + seed=0, + ) + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_22(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_video.with_raw_response.create( + model="seedance2_5", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_22(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_video.with_streaming_response.create( + model="seedance2_5", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_video = await response.parse() + assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_23(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="grok_imagine_1_5_lite", prompt_text="x", @@ -1662,7 +2412,7 @@ async def test_method_create_overload_16(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_23(self, async_client: AsyncRunwayML) -> None: text_to_video = await async_client.text_to_video.create( model="grok_imagine_1_5_lite", prompt_text="x", @@ -1672,7 +2422,7 @@ async def test_method_create_with_all_params_overload_16(self, async_client: Asy assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_23(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_video.with_raw_response.create( model="grok_imagine_1_5_lite", prompt_text="x", @@ -1684,7 +2434,7 @@ async def test_raw_response_create_overload_16(self, async_client: AsyncRunwayML assert_matches_type(TextToVideoCreateResponse, text_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_16(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_23(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_video.with_streaming_response.create( model="grok_imagine_1_5_lite", prompt_text="x", diff --git a/tests/api_resources/test_video_to_video.py b/tests/api_resources/test_video_to_video.py index 4bdf2203..920ee6d7 100644 --- a/tests/api_resources/test_video_to_video.py +++ b/tests/api_resources/test_video_to_video.py @@ -78,6 +78,63 @@ def test_streaming_response_create_overload_1(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_2(self, client: RunwayML) -> None: + video_to_video = client.video_to_video.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_2(self, client: RunwayML) -> None: + video_to_video = client.video_to_video.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + provider_settings={ + "keep_original_sound": True, + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + references="https://example.com/image.jpg", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_2(self, client: RunwayML) -> None: + response = client.video_to_video.with_raw_response.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_video = response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_2(self, client: RunwayML) -> None: + with client.video_to_video.with_streaming_response.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_video = response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_3(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="hailuo3", prompt_text="x", @@ -86,7 +143,7 @@ def test_method_create_overload_2(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_2(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_3(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="hailuo3", prompt_text="x", @@ -111,7 +168,7 @@ def test_method_create_with_all_params_overload_2(self, client: RunwayML) -> Non assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_raw_response_create_overload_2(self, client: RunwayML) -> None: + def test_raw_response_create_overload_3(self, client: RunwayML) -> None: response = client.video_to_video.with_raw_response.create( model="hailuo3", prompt_text="x", @@ -124,7 +181,7 @@ def test_raw_response_create_overload_2(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_streaming_response_create_overload_2(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_3(self, client: RunwayML) -> None: with client.video_to_video.with_streaming_response.create( model="hailuo3", prompt_text="x", @@ -139,7 +196,121 @@ def test_streaming_response_create_overload_2(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True @parametrize - def test_method_create_overload_3(self, client: RunwayML) -> None: + def test_method_create_overload_4(self, client: RunwayML) -> None: + video_to_video = client.video_to_video.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_4(self, client: RunwayML) -> None: + video_to_video = client.video_to_video.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + provider_settings={ + "keep_original_sound": True, + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + references="https://example.com/image.jpg", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_4(self, client: RunwayML) -> None: + response = client.video_to_video.with_raw_response.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_video = response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_4(self, client: RunwayML) -> None: + with client.video_to_video.with_streaming_response.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_video = response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_5(self, client: RunwayML) -> None: + video_to_video = client.video_to_video.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_5(self, client: RunwayML) -> None: + video_to_video = client.video_to_video.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + provider_settings={ + "keep_original_sound": True, + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + references="https://example.com/image.jpg", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_raw_response_create_overload_5(self, client: RunwayML) -> None: + response = client.video_to_video.with_raw_response.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_video = response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_5(self, client: RunwayML) -> None: + with client.video_to_video.with_streaming_response.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_video = response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_6(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -147,7 +318,7 @@ def test_method_create_overload_3(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_3(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_6(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -173,7 +344,7 @@ def test_method_create_with_all_params_overload_3(self, client: RunwayML) -> Non assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_raw_response_create_overload_3(self, client: RunwayML) -> None: + def test_raw_response_create_overload_6(self, client: RunwayML) -> None: response = client.video_to_video.with_raw_response.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -185,7 +356,7 @@ def test_raw_response_create_overload_3(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_streaming_response_create_overload_3(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_6(self, client: RunwayML) -> None: with client.video_to_video.with_streaming_response.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -199,7 +370,7 @@ def test_streaming_response_create_overload_3(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True @parametrize - def test_method_create_overload_4(self, client: RunwayML) -> None: + def test_method_create_overload_7(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -207,7 +378,7 @@ def test_method_create_overload_4(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_4(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_7(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -233,7 +404,7 @@ def test_method_create_with_all_params_overload_4(self, client: RunwayML) -> Non assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_raw_response_create_overload_4(self, client: RunwayML) -> None: + def test_raw_response_create_overload_7(self, client: RunwayML) -> None: response = client.video_to_video.with_raw_response.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -245,7 +416,7 @@ def test_raw_response_create_overload_4(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_streaming_response_create_overload_4(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_7(self, client: RunwayML) -> None: with client.video_to_video.with_streaming_response.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -259,7 +430,7 @@ def test_streaming_response_create_overload_4(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True @parametrize - def test_method_create_overload_5(self, client: RunwayML) -> None: + def test_method_create_overload_8(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -267,7 +438,7 @@ def test_method_create_overload_5(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_5(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_8(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -293,7 +464,7 @@ def test_method_create_with_all_params_overload_5(self, client: RunwayML) -> Non assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_raw_response_create_overload_5(self, client: RunwayML) -> None: + def test_raw_response_create_overload_8(self, client: RunwayML) -> None: response = client.video_to_video.with_raw_response.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -305,7 +476,7 @@ def test_raw_response_create_overload_5(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_streaming_response_create_overload_5(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_8(self, client: RunwayML) -> None: with client.video_to_video.with_streaming_response.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -319,7 +490,7 @@ def test_streaming_response_create_overload_5(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True @parametrize - def test_method_create_overload_6(self, client: RunwayML) -> None: + def test_method_create_overload_9(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="gemini_omni_flash", prompt_text="x", @@ -328,7 +499,7 @@ def test_method_create_overload_6(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_6(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_9(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( model="gemini_omni_flash", prompt_text="x", @@ -338,7 +509,7 @@ def test_method_create_with_all_params_overload_6(self, client: RunwayML) -> Non assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_raw_response_create_overload_6(self, client: RunwayML) -> None: + def test_raw_response_create_overload_9(self, client: RunwayML) -> None: response = client.video_to_video.with_raw_response.create( model="gemini_omni_flash", prompt_text="x", @@ -351,7 +522,7 @@ def test_raw_response_create_overload_6(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_streaming_response_create_overload_6(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_9(self, client: RunwayML) -> None: with client.video_to_video.with_streaming_response.create( model="gemini_omni_flash", prompt_text="x", @@ -366,45 +537,33 @@ def test_streaming_response_create_overload_6(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True @parametrize - def test_method_create_overload_7(self, client: RunwayML) -> None: + def test_method_create_overload_10(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_7(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_10(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", - audio=True, + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", duration="auto", mode="reference", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], + ratio="640:360", references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - seed=0, ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_raw_response_create_overload_7(self, client: RunwayML) -> None: + def test_raw_response_create_overload_10(self, client: RunwayML) -> None: response = client.video_to_video.with_raw_response.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", ) assert response.is_closed is True @@ -413,10 +572,11 @@ def test_raw_response_create_overload_7(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_streaming_response_create_overload_7(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_10(self, client: RunwayML) -> None: with client.video_to_video.with_streaming_response.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -427,33 +587,47 @@ def test_streaming_response_create_overload_7(self, client: RunwayML) -> None: assert cast(Any, response.is_closed) is True @parametrize - def test_method_create_overload_8(self, client: RunwayML) -> None: + def test_method_create_overload_11(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_8(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_11(self, client: RunwayML) -> None: video_to_video = client.video_to_video.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", + audio=True, + draft=True, duration="auto", mode="reference", - ratio="640:360", + output_format="mp4", + prompt_text="x", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + seed=0, ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_raw_response_create_overload_8(self, client: RunwayML) -> None: + def test_raw_response_create_overload_11(self, client: RunwayML) -> None: response = client.video_to_video.with_raw_response.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", ) assert response.is_closed is True @@ -462,11 +636,10 @@ def test_raw_response_create_overload_8(self, client: RunwayML) -> None: assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - def test_streaming_response_create_overload_8(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_11(self, client: RunwayML) -> None: with client.video_to_video.with_streaming_response.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -543,6 +716,63 @@ async def test_streaming_response_create_overload_1(self, async_client: AsyncRun @parametrize async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: + video_to_video = await async_client.video_to_video.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: + video_to_video = await async_client.video_to_video.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + provider_settings={ + "keep_original_sound": True, + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + references="https://example.com/image.jpg", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + response = await async_client.video_to_video.with_raw_response.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_video = await response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async with async_client.video_to_video.with_streaming_response.create( + model="klingO3_4k", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_video = await response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="hailuo3", prompt_text="x", @@ -551,7 +781,7 @@ async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> No assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="hailuo3", prompt_text="x", @@ -576,7 +806,7 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: response = await async_client.video_to_video.with_raw_response.create( model="hailuo3", prompt_text="x", @@ -589,7 +819,7 @@ async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: async with async_client.video_to_video.with_streaming_response.create( model="hailuo3", prompt_text="x", @@ -604,7 +834,121 @@ async def test_streaming_response_create_overload_2(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: + video_to_video = await async_client.video_to_video.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: + video_to_video = await async_client.video_to_video.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + provider_settings={ + "keep_original_sound": True, + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + references="https://example.com/image.jpg", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + response = await async_client.video_to_video.with_raw_response.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_video = await response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async with async_client.video_to_video.with_streaming_response.create( + model="klingO3_pro", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_video = await response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_5(self, async_client: AsyncRunwayML) -> None: + video_to_video = await async_client.video_to_video.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_5(self, async_client: AsyncRunwayML) -> None: + video_to_video = await async_client.video_to_video.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + provider_settings={ + "keep_original_sound": True, + "multi_prompt": [ + { + "duration": 1, + "prompt": "xxx", + } + ], + "shot_type": "intelligence", + }, + references="https://example.com/image.jpg", + ) + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + response = await async_client.video_to_video.with_raw_response.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_video = await response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async with async_client.video_to_video.with_streaming_response.create( + model="klingO3_standard", + prompt_text="xx", + prompt_video="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_video = await response.parse() + assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -612,7 +956,7 @@ async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> No assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_6(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -638,7 +982,7 @@ async def test_method_create_with_all_params_overload_3(self, async_client: Asyn assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: response = await async_client.video_to_video.with_raw_response.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -650,7 +994,7 @@ async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: async with async_client.video_to_video.with_streaming_response.create( model="seedance2", prompt_video="https://example.com/video.mp4", @@ -664,7 +1008,7 @@ async def test_streaming_response_create_overload_3(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -672,7 +1016,7 @@ async def test_method_create_overload_4(self, async_client: AsyncRunwayML) -> No assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -698,7 +1042,7 @@ async def test_method_create_with_all_params_overload_4(self, async_client: Asyn assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: response = await async_client.video_to_video.with_raw_response.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -710,7 +1054,7 @@ async def test_raw_response_create_overload_4(self, async_client: AsyncRunwayML) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_4(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: async with async_client.video_to_video.with_streaming_response.create( model="seedance2_fast", prompt_video="https://example.com/video.mp4", @@ -724,7 +1068,7 @@ async def test_streaming_response_create_overload_4(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -732,7 +1076,7 @@ async def test_method_create_overload_5(self, async_client: AsyncRunwayML) -> No assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -758,7 +1102,7 @@ async def test_method_create_with_all_params_overload_5(self, async_client: Asyn assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: response = await async_client.video_to_video.with_raw_response.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -770,7 +1114,7 @@ async def test_raw_response_create_overload_5(self, async_client: AsyncRunwayML) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_5(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: async with async_client.video_to_video.with_streaming_response.create( model="seedance2_mini", prompt_video="https://example.com/video.mp4", @@ -784,7 +1128,7 @@ async def test_streaming_response_create_overload_5(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_9(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="gemini_omni_flash", prompt_text="x", @@ -793,7 +1137,7 @@ async def test_method_create_overload_6(self, async_client: AsyncRunwayML) -> No assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_9(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( model="gemini_omni_flash", prompt_text="x", @@ -803,7 +1147,7 @@ async def test_method_create_with_all_params_overload_6(self, async_client: Asyn assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: response = await async_client.video_to_video.with_raw_response.create( model="gemini_omni_flash", prompt_text="x", @@ -816,7 +1160,7 @@ async def test_raw_response_create_overload_6(self, async_client: AsyncRunwayML) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_6(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_9(self, async_client: AsyncRunwayML) -> None: async with async_client.video_to_video.with_streaming_response.create( model="gemini_omni_flash", prompt_text="x", @@ -831,45 +1175,33 @@ async def test_streaming_response_create_overload_6(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_10(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_10(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", - audio=True, + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", duration="auto", mode="reference", - prompt_text="x", - ratio="992:432", - reference_audio=[ - { - "type": "audio", - "uri": "https://example.com/audio.mp3", - } - ], + ratio="640:360", references=[{"uri": "https://example.com/image.jpg"}], - reference_videos=[ - { - "type": "video", - "uri": "https://example.com/video.mp4", - } - ], - seed=0, ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: response = await async_client.video_to_video.with_raw_response.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", ) assert response.is_closed is True @@ -878,10 +1210,11 @@ async def test_raw_response_create_overload_7(self, async_client: AsyncRunwayML) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_7(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_10(self, async_client: AsyncRunwayML) -> None: async with async_client.video_to_video.with_streaming_response.create( - model="seedance2_5", - prompt_video="https://example.com/video.mp4", + model="gemini_omni_flash_1.1", + prompt_text="x", + video_uri="https://example.com/video.mp4", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -892,33 +1225,47 @@ async def test_streaming_response_create_overload_7(self, async_client: AsyncRun assert cast(Any, response.is_closed) is True @parametrize - async def test_method_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_overload_11(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_11(self, async_client: AsyncRunwayML) -> None: video_to_video = await async_client.video_to_video.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", + audio=True, + draft=True, duration="auto", mode="reference", - ratio="640:360", + output_format="mp4", + prompt_text="x", + ratio="992:432", + reference_audio=[ + { + "type": "audio", + "uri": "https://example.com/audio.mp3", + } + ], references=[{"uri": "https://example.com/image.jpg"}], + reference_videos=[ + { + "type": "video", + "uri": "https://example.com/video.mp4", + } + ], + seed=0, ) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: response = await async_client.video_to_video.with_raw_response.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", ) assert response.is_closed is True @@ -927,11 +1274,10 @@ async def test_raw_response_create_overload_8(self, async_client: AsyncRunwayML) assert_matches_type(VideoToVideoCreateResponse, video_to_video, path=["response"]) @parametrize - async def test_streaming_response_create_overload_8(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_11(self, async_client: AsyncRunwayML) -> None: async with async_client.video_to_video.with_streaming_response.create( - model="gemini_omni_flash_1.1", - prompt_text="x", - video_uri="https://example.com/video.mp4", + model="seedance2_5", + prompt_video="https://example.com/video.mp4", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" From fb3e261f2ab49686597ade94e6141683fcc9a0a0 Mon Sep 17 00:00:00 2001 From: Robin Andeer Date: Wed, 21 Oct 2026 20:38:09 -0400 Subject: [PATCH 2/3] chore(internal): align waitable overload return types Stainless-Generated-From: 55eae17639ffc2dfbbc5df9e6a855258500267cf --- src/runwayml/resources/image_to_video.py | 96 ++++++++++++------------ src/runwayml/resources/text_to_image.py | 20 ++--- src/runwayml/resources/text_to_video.py | 92 +++++++++++------------ src/runwayml/resources/video_to_video.py | 44 +++++------ 4 files changed, 126 insertions(+), 126 deletions(-) diff --git a/src/runwayml/resources/image_to_video.py b/src/runwayml/resources/image_to_video.py index e0ae4328..4e0b4912 100644 --- a/src/runwayml/resources/image_to_video.py +++ b/src/runwayml/resources/image_to_video.py @@ -85,7 +85,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -166,7 +166,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -216,7 +216,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -268,7 +268,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -320,7 +320,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -370,7 +370,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -421,7 +421,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -469,7 +469,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -513,7 +513,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -558,7 +558,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -609,7 +609,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -660,7 +660,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -712,7 +712,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -789,7 +789,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -857,7 +857,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -926,7 +926,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -978,7 +978,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1019,7 +1019,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1082,7 +1082,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1133,7 +1133,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1197,7 +1197,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1249,7 +1249,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1322,7 +1322,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1381,7 +1381,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1710,7 +1710,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1791,7 +1791,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1841,7 +1841,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1893,7 +1893,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1945,7 +1945,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -1995,7 +1995,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2046,7 +2046,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2094,7 +2094,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2138,7 +2138,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2183,7 +2183,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2234,7 +2234,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2285,7 +2285,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2337,7 +2337,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2414,7 +2414,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2482,7 +2482,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2551,7 +2551,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2603,7 +2603,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2644,7 +2644,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2707,7 +2707,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2758,7 +2758,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2822,7 +2822,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2874,7 +2874,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -2947,7 +2947,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. @@ -3006,7 +3006,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> ImageToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from an image. diff --git a/src/runwayml/resources/text_to_image.py b/src/runwayml/resources/text_to_image.py index 477de39d..5c87b925 100644 --- a/src/runwayml/resources/text_to_image.py +++ b/src/runwayml/resources/text_to_image.py @@ -653,7 +653,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -951,7 +951,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -1007,7 +1007,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -1215,7 +1215,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -1303,7 +1303,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -2484,7 +2484,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -2782,7 +2782,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -2838,7 +2838,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -3046,7 +3046,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) @@ -3134,7 +3134,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToImageCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate images from text and/or image(s) diff --git a/src/runwayml/resources/text_to_video.py b/src/runwayml/resources/text_to_video.py index 9d9e15e6..a373e9d8 100644 --- a/src/runwayml/resources/text_to_video.py +++ b/src/runwayml/resources/text_to_video.py @@ -84,7 +84,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -161,7 +161,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -208,7 +208,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -254,7 +254,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -297,7 +297,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -351,7 +351,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -405,7 +405,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -442,7 +442,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -481,7 +481,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -526,7 +526,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -570,7 +570,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -611,7 +611,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -681,7 +681,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -754,7 +754,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -828,7 +828,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -883,7 +883,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -922,7 +922,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -990,7 +990,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1042,7 +1042,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1102,7 +1102,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1153,7 +1153,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1224,7 +1224,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1314,7 +1314,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1659,7 +1659,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1736,7 +1736,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1783,7 +1783,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1829,7 +1829,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1872,7 +1872,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1926,7 +1926,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -1980,7 +1980,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2017,7 +2017,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2056,7 +2056,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2101,7 +2101,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2145,7 +2145,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2186,7 +2186,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2256,7 +2256,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2329,7 +2329,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2403,7 +2403,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2458,7 +2458,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2497,7 +2497,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2565,7 +2565,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2617,7 +2617,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2677,7 +2677,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2728,7 +2728,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2799,7 +2799,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. @@ -2889,7 +2889,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> TextToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a text prompt. diff --git a/src/runwayml/resources/video_to_video.py b/src/runwayml/resources/video_to_video.py index 0cc82dca..085b0383 100644 --- a/src/runwayml/resources/video_to_video.py +++ b/src/runwayml/resources/video_to_video.py @@ -72,7 +72,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -133,7 +133,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -178,7 +178,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -234,7 +234,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -276,7 +276,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -348,7 +348,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -426,7 +426,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -505,7 +505,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -564,7 +564,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -605,7 +605,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -680,7 +680,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> NewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -948,7 +948,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1009,7 +1009,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1054,7 +1054,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1110,7 +1110,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1152,7 +1152,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1224,7 +1224,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1302,7 +1302,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1381,7 +1381,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1440,7 +1440,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1481,7 +1481,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. @@ -1556,7 +1556,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> VideoToVideoCreateResponse: + ) -> AsyncNewTaskCreatedResponse: """ This endpoint will start a new task to generate a video from a video. From a12ad7f06aa56f5d57ec7397198d5f63f1dedaf1 Mon Sep 17 00:00:00 2001 From: stlc-bot Date: Fri, 23 Oct 2026 14:43:30 +0000 Subject: [PATCH 3/3] feat: add video-to-audio and newly released image and audio models Stainless-Generated-From: 6666d117850849e5e43a07646cbb5ac834a23074 --- .stats.yml | 2 +- api.md | 12 + scripts/mock | 15 +- scripts/test | 12 +- src/runwayml/_client.py | 44 +++ src/runwayml/resources/__init__.py | 14 + src/runwayml/resources/image_to_video.py | 20 +- .../organization/webapp/audit_logs.py | 16 +- src/runwayml/resources/sound_effect.py | 114 +++++++- src/runwayml/resources/tasks.py | 14 + src/runwayml/resources/text_to_image.py | 254 +++++++++++++++- src/runwayml/resources/video_to_audio.py | 272 ++++++++++++++++++ src/runwayml/types/__init__.py | 2 + .../types/generate/image_create_response.py | 14 +- .../types/image_to_video_create_params.py | 63 +--- .../webapp/audit_log_list_params.py | 8 +- .../webapp/audit_log_list_response.py | 4 + .../webapp/audit_log_retrieve_response.py | 16 ++ .../organization_retrieve_usage_response.py | 6 + .../types/sound_effect_create_params.py | 26 +- .../types/text_to_image_create_params.py | 69 +++++ .../types/video_to_audio_create_params.py | 43 +++ .../types/video_to_audio_create_response.py | 28 ++ .../types/video_to_video_create_params.py | 22 +- tests/api_resources/test_sound_effect.py | 112 +++++++- tests/api_resources/test_text_to_image.py | 204 ++++++++++++- tests/api_resources/test_video_to_audio.py | 128 +++++++++ tests/test_video_to_audio_polling.py | 67 +++++ 28 files changed, 1476 insertions(+), 125 deletions(-) create mode 100644 src/runwayml/resources/video_to_audio.py create mode 100644 src/runwayml/types/video_to_audio_create_params.py create mode 100644 src/runwayml/types/video_to_audio_create_response.py create mode 100644 tests/api_resources/test_video_to_audio.py create mode 100644 tests/test_video_to_audio_polling.py diff --git a/.stats.yml b/.stats.yml index d24d405c..81914168 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1 +1 @@ -configured_endpoints: 64 +configured_endpoints: 65 diff --git a/api.md b/api.md index 40a2e050..91729b7f 100644 --- a/api.md +++ b/api.md @@ -35,6 +35,18 @@ Methods: - client.video_to_video.create(\*\*params) -> VideoToVideoCreateResponse +# VideoToAudio + +Types: + +```python +from runwayml.types import VideoToAudioCreateResponse +``` + +Methods: + +- client.video_to_audio.create(\*\*params) -> VideoToAudioCreateResponse + # VideoToHdr Types: diff --git a/scripts/mock b/scripts/mock index 20a5d42a..013df5d3 100755 --- a/scripts/mock +++ b/scripts/mock @@ -4,6 +4,11 @@ set -e cd "$(dirname "$0")/.." +if [ "$1" == "--install" ]; then + npm exec --package=@stdy/cli@0.22.1 -- steady --version + exit 0 +fi + if [[ -n "$1" && "$1" != '--'* ]]; then URL="$1" shift @@ -11,7 +16,7 @@ elif [ -n "$STAINLESS_OPENAPI_SPEC_URL" ]; then URL="$STAINLESS_OPENAPI_SPEC_URL" else # Embedded OpenAPI spec (base64-encoded, gzipped) - EMBEDDED_SPEC="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" + EMBEDDED_SPEC="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" SPEC_TMPFILE="$(mktemp)" trap 'rm -f "$SPEC_TMPFILE"' EXIT echo "$EMBEDDED_SPEC" | base64 --decode | gunzip > "$SPEC_TMPFILE" @@ -21,16 +26,18 @@ fi echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec +MOCK_PORT="${STAINLESS_MOCK_PORT:-4010}" + if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout npm exec --package=@stdy/cli@0.22.1 -- steady --version - npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p "$MOCK_PORT" --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" attempts=0 - while ! curl --silent --fail "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1; do + while ! curl --silent --fail "http://127.0.0.1:$MOCK_PORT/_x-steady/health" >/dev/null 2>&1; do if ! kill -0 $! 2>/dev/null; then echo cat .stdy.log @@ -49,5 +56,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p "$MOCK_PORT" --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 19acc916..9dbb5cdb 100755 --- a/scripts/test +++ b/scripts/test @@ -9,8 +9,10 @@ GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # No Color +MOCK_PORT="${STAINLESS_MOCK_PORT:-4010}" + function steady_is_running() { - curl --silent "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1 + curl --silent "http://127.0.0.1:$MOCK_PORT/_x-steady/health" >/dev/null 2>&1 } kill_server_on_port() { @@ -27,7 +29,7 @@ function is_overriding_api_base_url() { if ! is_overriding_api_base_url && ! steady_is_running ; then # When we exit this script, make sure to kill the background mock server process - trap 'kill_server_on_port 4010' EXIT + trap 'kill_server_on_port "$MOCK_PORT"' EXIT # Start the dev server ./scripts/mock --daemon @@ -43,7 +45,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p $MOCK_PORT --validator-query-array-format=comma --validator-form-array-format=comma --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 @@ -52,6 +54,10 @@ else echo fi +if [ -n "${STAINLESS_MOCK_PORT:-}" ] && ! is_overriding_api_base_url ; then + export TEST_API_BASE_URL="http://127.0.0.1:$MOCK_PORT" +fi + export DEFER_PYDANTIC_BUILD=false echo "==> Running tests" diff --git a/src/runwayml/_client.py b/src/runwayml/_client.py index a38f539c..11ee1125 100644 --- a/src/runwayml/_client.py +++ b/src/runwayml/_client.py @@ -56,6 +56,7 @@ voice_dubbing, image_to_video, text_to_speech, + video_to_audio, video_to_video, voice_isolation, speech_to_speech, @@ -82,6 +83,7 @@ from .resources.voice_dubbing import VoiceDubbingResource, AsyncVoiceDubbingResource from .resources.image_to_video import ImageToVideoResource, AsyncImageToVideoResource from .resources.text_to_speech import TextToSpeechResource, AsyncTextToSpeechResource + from .resources.video_to_audio import VideoToAudioResource, AsyncVideoToAudioResource from .resources.video_to_video import VideoToVideoResource, AsyncVideoToVideoResource from .resources.voice_isolation import VoiceIsolationResource, AsyncVoiceIsolationResource from .resources.speech_to_speech import SpeechToSpeechResource, AsyncSpeechToSpeechResource @@ -201,6 +203,13 @@ def video_to_video(self) -> VideoToVideoResource: return VideoToVideoResource(self) + @cached_property + def video_to_audio(self) -> VideoToAudioResource: + """These endpoints all kick off tasks to create generations.""" + from .resources.video_to_audio import VideoToAudioResource + + return VideoToAudioResource(self) + @cached_property def video_to_hdr(self) -> VideoToHdrResource: """These endpoints all kick off tasks to create generations.""" @@ -563,6 +572,13 @@ def video_to_video(self) -> AsyncVideoToVideoResource: return AsyncVideoToVideoResource(self) + @cached_property + def video_to_audio(self) -> AsyncVideoToAudioResource: + """These endpoints all kick off tasks to create generations.""" + from .resources.video_to_audio import AsyncVideoToAudioResource + + return AsyncVideoToAudioResource(self) + @cached_property def video_to_hdr(self) -> AsyncVideoToHdrResource: """These endpoints all kick off tasks to create generations.""" @@ -861,6 +877,13 @@ def video_to_video(self) -> video_to_video.VideoToVideoResourceWithRawResponse: return VideoToVideoResourceWithRawResponse(self._client.video_to_video) + @cached_property + def video_to_audio(self) -> video_to_audio.VideoToAudioResourceWithRawResponse: + """These endpoints all kick off tasks to create generations.""" + from .resources.video_to_audio import VideoToAudioResourceWithRawResponse + + return VideoToAudioResourceWithRawResponse(self._client.video_to_audio) + @cached_property def video_to_hdr(self) -> video_to_hdr.VideoToHdrResourceWithRawResponse: """These endpoints all kick off tasks to create generations.""" @@ -1044,6 +1067,13 @@ def video_to_video(self) -> video_to_video.AsyncVideoToVideoResourceWithRawRespo return AsyncVideoToVideoResourceWithRawResponse(self._client.video_to_video) + @cached_property + def video_to_audio(self) -> video_to_audio.AsyncVideoToAudioResourceWithRawResponse: + """These endpoints all kick off tasks to create generations.""" + from .resources.video_to_audio import AsyncVideoToAudioResourceWithRawResponse + + return AsyncVideoToAudioResourceWithRawResponse(self._client.video_to_audio) + @cached_property def video_to_hdr(self) -> video_to_hdr.AsyncVideoToHdrResourceWithRawResponse: """These endpoints all kick off tasks to create generations.""" @@ -1227,6 +1257,13 @@ def video_to_video(self) -> video_to_video.VideoToVideoResourceWithStreamingResp return VideoToVideoResourceWithStreamingResponse(self._client.video_to_video) + @cached_property + def video_to_audio(self) -> video_to_audio.VideoToAudioResourceWithStreamingResponse: + """These endpoints all kick off tasks to create generations.""" + from .resources.video_to_audio import VideoToAudioResourceWithStreamingResponse + + return VideoToAudioResourceWithStreamingResponse(self._client.video_to_audio) + @cached_property def video_to_hdr(self) -> video_to_hdr.VideoToHdrResourceWithStreamingResponse: """These endpoints all kick off tasks to create generations.""" @@ -1410,6 +1447,13 @@ def video_to_video(self) -> video_to_video.AsyncVideoToVideoResourceWithStreamin return AsyncVideoToVideoResourceWithStreamingResponse(self._client.video_to_video) + @cached_property + def video_to_audio(self) -> video_to_audio.AsyncVideoToAudioResourceWithStreamingResponse: + """These endpoints all kick off tasks to create generations.""" + from .resources.video_to_audio import AsyncVideoToAudioResourceWithStreamingResponse + + return AsyncVideoToAudioResourceWithStreamingResponse(self._client.video_to_audio) + @cached_property def video_to_hdr(self) -> video_to_hdr.AsyncVideoToHdrResourceWithStreamingResponse: """These endpoints all kick off tasks to create generations.""" diff --git a/src/runwayml/resources/__init__.py b/src/runwayml/resources/__init__.py index 84096a8f..63194fbc 100644 --- a/src/runwayml/resources/__init__.py +++ b/src/runwayml/resources/__init__.py @@ -160,6 +160,14 @@ TextToSpeechResourceWithStreamingResponse, AsyncTextToSpeechResourceWithStreamingResponse, ) +from .video_to_audio import ( + VideoToAudioResource, + AsyncVideoToAudioResource, + VideoToAudioResourceWithRawResponse, + AsyncVideoToAudioResourceWithRawResponse, + VideoToAudioResourceWithStreamingResponse, + AsyncVideoToAudioResourceWithStreamingResponse, +) from .video_to_video import ( VideoToVideoResource, AsyncVideoToVideoResource, @@ -236,6 +244,12 @@ "AsyncVideoToVideoResourceWithRawResponse", "VideoToVideoResourceWithStreamingResponse", "AsyncVideoToVideoResourceWithStreamingResponse", + "VideoToAudioResource", + "AsyncVideoToAudioResource", + "VideoToAudioResourceWithRawResponse", + "AsyncVideoToAudioResourceWithRawResponse", + "VideoToAudioResourceWithStreamingResponse", + "AsyncVideoToAudioResourceWithStreamingResponse", "VideoToHdrResource", "AsyncVideoToHdrResource", "VideoToHdrResourceWithRawResponse", diff --git a/src/runwayml/resources/image_to_video.py b/src/runwayml/resources/image_to_video.py index 4e0b4912..05f4d87c 100644 --- a/src/runwayml/resources/image_to_video.py +++ b/src/runwayml/resources/image_to_video.py @@ -358,7 +358,7 @@ def create( self, *, model: Literal["hailuo3"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]], + prompt_image: Union[str, Iterable[object]], prompt_text: str, duration: int | Omit = omit, ratio: Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] | Omit = omit, @@ -1049,7 +1049,7 @@ def create( self, *, model: Literal["wan3"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]], + prompt_image: Union[str, Iterable[object]], prompt_text: str, audio: bool | Omit = omit, duration: int | Omit = omit, @@ -1164,7 +1164,7 @@ def create( self, *, model: Literal["wan3_prime"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]], + prompt_image: Union[str, Iterable[object]], prompt_text: str, audio: bool | Omit = omit, duration: int | Omit = omit, @@ -1451,7 +1451,7 @@ def create( | Union[str, Iterable[image_to_video_create_params.Veo3_1PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Veo3_1FastPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.KlingO3_4kPromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]] + | Union[str, Iterable[object]] | Union[str, Iterable[image_to_video_create_params.Kling3_0_4kPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Happyhorse1_0PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Kling2_5TurboProPromptImagePromptImage]] @@ -1464,9 +1464,7 @@ def create( | Union[str, Iterable[image_to_video_create_params.Seedance2MiniPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlashPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5PromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlash1_1PromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.H3MaxPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5LitePromptImagePromptImage]], @@ -1983,7 +1981,7 @@ async def create( self, *, model: Literal["hailuo3"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]], + prompt_image: Union[str, Iterable[object]], prompt_text: str, duration: int | Omit = omit, ratio: Literal["adaptive", "21:9", "16:9", "4:3", "1:1", "3:4", "9:16"] | Omit = omit, @@ -2674,7 +2672,7 @@ async def create( self, *, model: Literal["wan3"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]], + prompt_image: Union[str, Iterable[object]], prompt_text: str, audio: bool | Omit = omit, duration: int | Omit = omit, @@ -2789,7 +2787,7 @@ async def create( self, *, model: Literal["wan3_prime"], - prompt_image: Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]], + prompt_image: Union[str, Iterable[object]], prompt_text: str, audio: bool | Omit = omit, duration: int | Omit = omit, @@ -3076,7 +3074,7 @@ async def create( | Union[str, Iterable[image_to_video_create_params.Veo3_1PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Veo3_1FastPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.KlingO3_4kPromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Hailuo3PromptImagePromptImage]] + | Union[str, Iterable[object]] | Union[str, Iterable[image_to_video_create_params.Kling3_0_4kPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Happyhorse1_0PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Kling2_5TurboProPromptImagePromptImage]] @@ -3089,9 +3087,7 @@ async def create( | Union[str, Iterable[image_to_video_create_params.Seedance2MiniPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlashPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5PromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Wan3PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GeminiOmniFlash1_1PromptImagePromptImage]] - | Union[str, Iterable[image_to_video_create_params.Wan3PrimePromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.H3MaxPromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.Seedance2_5PromptImagePromptImage]] | Union[str, Iterable[image_to_video_create_params.GrokImagine1_5LitePromptImagePromptImage]], diff --git a/src/runwayml/resources/organization/webapp/audit_logs.py b/src/runwayml/resources/organization/webapp/audit_logs.py index 55f01814..8ef12796 100644 --- a/src/runwayml/resources/organization/webapp/audit_logs.py +++ b/src/runwayml/resources/organization/webapp/audit_logs.py @@ -143,12 +143,14 @@ def list( `AgentConnectorConnected`, `AgentConnectorDisconnected`, `AgentConnectorAssetExported`, `AgentConnectorSessionEnabled`, `AgentConnectorSessionDisabled`, `GenerationCreated`, `StudioSessionOpened`, - `AccountLinkCreated`, `AccountLinkDeleted`, `AdConnectionAuthorizationStarted`, - `AdConnectionConnected`, `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, + `AppStudioAiRunOpened`, `AccountLinkCreated`, `AccountLinkDeleted`, + `AdConnectionAuthorizationStarted`, `AdConnectionConnected`, + `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, `AdConnectionDisconnected`, `AdWorkspaceOnboardingUpdated`, `AdCreativeReviewSubmitted`, `AdCreativeReviewCancelled`, `AdCreativeReviewDecided`, `AdCreativeApprovalRevoked`, `AdCreativeArchived`, - `AdCreativeUnarchived`, `OrganizationSettingsUpdated`, + `AdCreativeUnarchived`, `AdPublishBatchQueued`, `AdPublishBatchCancelled`, + `AdPublishBatchRetried`, `OrganizationSettingsUpdated`, `OrganizationDisabledModelsUpdated`, `OrganizationAgentSandboxUpdated`, `OrganizationApiAccountReleased`, `OrganizationApiAccountMemberInvited`, `OrganizationApiAccountMemberRoleChanged`, @@ -325,12 +327,14 @@ def list( `AgentConnectorConnected`, `AgentConnectorDisconnected`, `AgentConnectorAssetExported`, `AgentConnectorSessionEnabled`, `AgentConnectorSessionDisabled`, `GenerationCreated`, `StudioSessionOpened`, - `AccountLinkCreated`, `AccountLinkDeleted`, `AdConnectionAuthorizationStarted`, - `AdConnectionConnected`, `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, + `AppStudioAiRunOpened`, `AccountLinkCreated`, `AccountLinkDeleted`, + `AdConnectionAuthorizationStarted`, `AdConnectionConnected`, + `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, `AdConnectionDisconnected`, `AdWorkspaceOnboardingUpdated`, `AdCreativeReviewSubmitted`, `AdCreativeReviewCancelled`, `AdCreativeReviewDecided`, `AdCreativeApprovalRevoked`, `AdCreativeArchived`, - `AdCreativeUnarchived`, `OrganizationSettingsUpdated`, + `AdCreativeUnarchived`, `AdPublishBatchQueued`, `AdPublishBatchCancelled`, + `AdPublishBatchRetried`, `OrganizationSettingsUpdated`, `OrganizationDisabledModelsUpdated`, `OrganizationAgentSandboxUpdated`, `OrganizationApiAccountReleased`, `OrganizationApiAccountMemberInvited`, `OrganizationApiAccountMemberRoleChanged`, diff --git a/src/runwayml/resources/sound_effect.py b/src/runwayml/resources/sound_effect.py index 57d0f6c8..11afcd0a 100644 --- a/src/runwayml/resources/sound_effect.py +++ b/src/runwayml/resources/sound_effect.py @@ -102,6 +102,51 @@ def create( """ ... + @overload + def create( + self, + *, + duration: float, + model: Literal["mirelo_sfx_2_0"], + prompt_text: str, + format: Literal["mp3", "wav", "flac"] | Omit = omit, + negative_prompt: str | Omit = omit, + num_variants: int | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> NewTaskCreatedResponse: + """ + This endpoint will start a new task to generate sound effects from a text + description. + + Args: + duration: The duration of the generated audio in seconds. + + prompt_text: A description of the sound effects to generate. + + format: The format of the generated audio. + + negative_prompt: Sounds to avoid in the generated audio. + + num_variants: The number of audio variations to generate. + + seed: A seed for reproducible generation. + + 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 + """ + ... + @overload def create( self, @@ -140,11 +185,11 @@ def create( """ ... - @required_args(["model", "prompt_text"]) + @required_args(["model", "prompt_text"], ["duration", "model", "prompt_text"]) def create( self, *, - model: Literal["seed_audio"] | Literal["eleven_text_to_sound_v2"], + model: Literal["seed_audio"] | Literal["mirelo_sfx_2_0"] | Literal["eleven_text_to_sound_v2"], prompt_text: str, loudness_rate: int | Omit = omit, output_format: Literal["wav", "mp3", "ogg_opus"] | Omit = omit, @@ -153,6 +198,10 @@ def create( sample_rate: Literal[8000, 16000, 24000, 32000, 44100, 48000] | Omit = omit, speech_rate: int | Omit = omit, duration: float | Omit = omit, + format: Literal["mp3", "wav", "flac"] | Omit = omit, + negative_prompt: str | Omit = omit, + num_variants: int | Omit = omit, + seed: int | Omit = omit, loop: bool | Omit = omit, # 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. @@ -174,6 +223,10 @@ def create( "sample_rate": sample_rate, "speech_rate": speech_rate, "duration": duration, + "format": format, + "negative_prompt": negative_prompt, + "num_variants": num_variants, + "seed": seed, "loop": loop, }, sound_effect_create_params.SoundEffectCreateParams, @@ -258,6 +311,51 @@ async def create( """ ... + @overload + async def create( + self, + *, + duration: float, + model: Literal["mirelo_sfx_2_0"], + prompt_text: str, + format: Literal["mp3", "wav", "flac"] | Omit = omit, + negative_prompt: str | Omit = omit, + num_variants: int | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> AsyncNewTaskCreatedResponse: + """ + This endpoint will start a new task to generate sound effects from a text + description. + + Args: + duration: The duration of the generated audio in seconds. + + prompt_text: A description of the sound effects to generate. + + format: The format of the generated audio. + + negative_prompt: Sounds to avoid in the generated audio. + + num_variants: The number of audio variations to generate. + + seed: A seed for reproducible generation. + + 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 + """ + ... + @overload async def create( self, @@ -296,11 +394,11 @@ async def create( """ ... - @required_args(["model", "prompt_text"]) + @required_args(["model", "prompt_text"], ["duration", "model", "prompt_text"]) async def create( self, *, - model: Literal["seed_audio"] | Literal["eleven_text_to_sound_v2"], + model: Literal["seed_audio"] | Literal["mirelo_sfx_2_0"] | Literal["eleven_text_to_sound_v2"], prompt_text: str, loudness_rate: int | Omit = omit, output_format: Literal["wav", "mp3", "ogg_opus"] | Omit = omit, @@ -309,6 +407,10 @@ async def create( sample_rate: Literal[8000, 16000, 24000, 32000, 44100, 48000] | Omit = omit, speech_rate: int | Omit = omit, duration: float | Omit = omit, + format: Literal["mp3", "wav", "flac"] | Omit = omit, + negative_prompt: str | Omit = omit, + num_variants: int | Omit = omit, + seed: int | Omit = omit, loop: bool | Omit = omit, # 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. @@ -330,6 +432,10 @@ async def create( "sample_rate": sample_rate, "speech_rate": speech_rate, "duration": duration, + "format": format, + "negative_prompt": negative_prompt, + "num_variants": num_variants, + "seed": seed, "loop": loop, }, sound_effect_create_params.SoundEffectCreateParams, diff --git a/src/runwayml/resources/tasks.py b/src/runwayml/resources/tasks.py index 22ca86ae..4f5a3037 100644 --- a/src/runwayml/resources/tasks.py +++ b/src/runwayml/resources/tasks.py @@ -102,6 +102,13 @@ def delete( Tasks that are running, pending, or throttled can be canceled by invoking this method. Invoking this method for other tasks will delete them. + Refund eligibility is based on the task status observed by the server during + cancellation. If that check observes RUNNING, cancellation does not refund + credits. Task execution can advance concurrently with cancellation, so neither a + refund nor successful cancellation guarantees that generation stops. A prior GET + response reporting PENDING or THROTTLED does not guarantee a refund. Deleting a + completed task does not refund its charge. + The output data associated with a deleted task will be deleted from persistent storage in accordance with our data retention policy. Aborted and deleted tasks will not be able to be fetched again in the future. @@ -202,6 +209,13 @@ async def delete( Tasks that are running, pending, or throttled can be canceled by invoking this method. Invoking this method for other tasks will delete them. + Refund eligibility is based on the task status observed by the server during + cancellation. If that check observes RUNNING, cancellation does not refund + credits. Task execution can advance concurrently with cancellation, so neither a + refund nor successful cancellation guarantees that generation stops. A prior GET + response reporting PENDING or THROTTLED does not guarantee a refund. Deleting a + completed task does not refund its charge. + The output data associated with a deleted task will be deleted from persistent storage in accordance with our data retention policy. Aborted and deleted tasks will not be able to be fetched again in the future. diff --git a/src/runwayml/resources/text_to_image.py b/src/runwayml/resources/text_to_image.py index 5c87b925..8c4816eb 100644 --- a/src/runwayml/resources/text_to_image.py +++ b/src/runwayml/resources/text_to_image.py @@ -8,7 +8,7 @@ import httpx from ..types import text_to_image_create_params -from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given +from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given from .._utils import required_args, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource @@ -1330,6 +1330,107 @@ def create( """ ... + @overload + def create( + self, + *, + model: Literal["recraft_v4_1_flash"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "1536:768", + "768:1536", + "1280:832", + "832:1280", + "1216:896", + "896:1216", + "1152:896", + "896:1152", + "832:1344", + "1280:896", + "896:1280", + "1344:768", + "768:1344", + ], + background_color: str | Omit = omit, + colors: SequenceNotStr[str] | Omit = omit, + output_count: int | Omit = omit, + output_format: Literal["webp", "png"] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> NewTaskCreatedResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A description of the image you want to generate. + + ratio: The output dimensions, expressed as `:`. + + background_color: A preferred background color as a six-digit hex string. + + colors: Preferred colors as six-digit hex strings. + + output_count: The number of images to generate. Each image is billed separately. + + output_format: The output file format. Defaults to webp. + + 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 + """ + ... + + @overload + def create( + self, + *, + model: Literal["recraft_v4_1_vector"], + prompt_text: str, + background_color: str | Omit = omit, + colors: SequenceNotStr[str] | Omit = omit, + ratio: Literal["1024:1024", "1216:896", "896:1216", "1344:768", "768:1344"] | Omit = omit, + # 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, + ) -> NewTaskCreatedResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: Describe the vector illustration you want to generate. + + background_color: The preferred background color as a six-digit hex value. This is a generation + hint, not an exact color constraint; the generated background may use a + different shade. + + colors: Preferred colors as six-digit hex values, such as #FF8800. + + ratio: The width and height declared by the output SVG. Vector artwork can be scaled + after generation. + + 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 + """ + ... + @overload def create( self, @@ -1403,6 +1504,8 @@ def create( | Literal["ideogram_4_5"] | Literal["seedream5_flash"] | Literal["nano_banana_2.1"] + | Literal["recraft_v4_1_flash"] + | Literal["recraft_v4_1_vector"] | Literal["gemini_2.5_flash"], prompt_text: str, ratio: Literal[ @@ -1774,6 +1877,23 @@ def create( "1408:11712", "11712:1408", ] + | Literal[ + "1024:1024", + "1536:768", + "768:1536", + "1280:832", + "832:1280", + "1216:896", + "896:1216", + "1152:896", + "896:1152", + "832:1344", + "1280:896", + "896:1280", + "1344:768", + "768:1344", + ] + | Literal["1024:1024", "1216:896", "896:1216", "1344:768", "768:1344"] | Literal[ "1344:768", "768:1344", @@ -1819,12 +1939,14 @@ def create( | Literal["low", "medium", "high"] | Literal["very_low", "low", "medium", "high"] | Omit = omit, - output_format: Literal["webp", "png", "jpeg"] | Literal["png", "jpeg"] | Omit = omit, + output_format: Literal["webp", "png", "jpeg"] | Literal["png", "jpeg"] | Literal["webp", "png"] | Omit = omit, grounding: bool | Omit = omit, edit: bool | Omit = omit, mask_uri: str | Omit = omit, precise_edit: bool | Omit = omit, thinking_level: Literal["minimal", "medium", "high"] | Omit = omit, + background_color: str | Omit = omit, + colors: SequenceNotStr[str] | Omit = omit, # 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, @@ -1851,6 +1973,8 @@ def create( "mask_uri": mask_uri, "precise_edit": precise_edit, "thinking_level": thinking_level, + "background_color": background_color, + "colors": colors, }, text_to_image_create_params.TextToImageCreateParams, ), @@ -3161,6 +3285,107 @@ async def create( """ ... + @overload + async def create( + self, + *, + model: Literal["recraft_v4_1_flash"], + prompt_text: str, + ratio: Literal[ + "1024:1024", + "1536:768", + "768:1536", + "1280:832", + "832:1280", + "1216:896", + "896:1216", + "1152:896", + "896:1152", + "832:1344", + "1280:896", + "896:1280", + "1344:768", + "768:1344", + ], + background_color: str | Omit = omit, + colors: SequenceNotStr[str] | Omit = omit, + output_count: int | Omit = omit, + output_format: Literal["webp", "png"] | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> AsyncNewTaskCreatedResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: A description of the image you want to generate. + + ratio: The output dimensions, expressed as `:`. + + background_color: A preferred background color as a six-digit hex string. + + colors: Preferred colors as six-digit hex strings. + + output_count: The number of images to generate. Each image is billed separately. + + output_format: The output file format. Defaults to webp. + + 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 + """ + ... + + @overload + async def create( + self, + *, + model: Literal["recraft_v4_1_vector"], + prompt_text: str, + background_color: str | Omit = omit, + colors: SequenceNotStr[str] | Omit = omit, + ratio: Literal["1024:1024", "1216:896", "896:1216", "1344:768", "768:1344"] | Omit = omit, + # 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, + ) -> AsyncNewTaskCreatedResponse: + """ + This endpoint will start a new task to generate images from text and/or image(s) + + Args: + prompt_text: Describe the vector illustration you want to generate. + + background_color: The preferred background color as a six-digit hex value. This is a generation + hint, not an exact color constraint; the generated background may use a + different shade. + + colors: Preferred colors as six-digit hex values, such as #FF8800. + + ratio: The width and height declared by the output SVG. Vector artwork can be scaled + after generation. + + 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 + """ + ... + @overload async def create( self, @@ -3234,6 +3459,8 @@ async def create( | Literal["ideogram_4_5"] | Literal["seedream5_flash"] | Literal["nano_banana_2.1"] + | Literal["recraft_v4_1_flash"] + | Literal["recraft_v4_1_vector"] | Literal["gemini_2.5_flash"], prompt_text: str, ratio: Literal[ @@ -3605,6 +3832,23 @@ async def create( "1408:11712", "11712:1408", ] + | Literal[ + "1024:1024", + "1536:768", + "768:1536", + "1280:832", + "832:1280", + "1216:896", + "896:1216", + "1152:896", + "896:1152", + "832:1344", + "1280:896", + "896:1280", + "1344:768", + "768:1344", + ] + | Literal["1024:1024", "1216:896", "896:1216", "1344:768", "768:1344"] | Literal[ "1344:768", "768:1344", @@ -3650,12 +3894,14 @@ async def create( | Literal["low", "medium", "high"] | Literal["very_low", "low", "medium", "high"] | Omit = omit, - output_format: Literal["webp", "png", "jpeg"] | Literal["png", "jpeg"] | Omit = omit, + output_format: Literal["webp", "png", "jpeg"] | Literal["png", "jpeg"] | Literal["webp", "png"] | Omit = omit, grounding: bool | Omit = omit, edit: bool | Omit = omit, mask_uri: str | Omit = omit, precise_edit: bool | Omit = omit, thinking_level: Literal["minimal", "medium", "high"] | Omit = omit, + background_color: str | Omit = omit, + colors: SequenceNotStr[str] | Omit = omit, # 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, @@ -3682,6 +3928,8 @@ async def create( "mask_uri": mask_uri, "precise_edit": precise_edit, "thinking_level": thinking_level, + "background_color": background_color, + "colors": colors, }, text_to_image_create_params.TextToImageCreateParams, ), diff --git a/src/runwayml/resources/video_to_audio.py b/src/runwayml/resources/video_to_audio.py new file mode 100644 index 00000000..676e94ba --- /dev/null +++ b/src/runwayml/resources/video_to_audio.py @@ -0,0 +1,272 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Type, cast +from typing_extensions import Literal + +import httpx + +from runwayml.lib.polling import ( + AwaitableTaskResponseMixin, + AsyncAwaitableTaskResponseMixin, + create_waitable_resource, + create_async_waitable_resource, +) + +from ..types import video_to_audio_create_params +from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given +from .._utils import maybe_transform, 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.video_to_audio_create_response import VideoToAudioCreateResponse + +__all__ = [ + "VideoToAudioResource", + "AsyncVideoToAudioResource", + "WaitableVideoToAudioCreateResponse", + "AsyncWaitableVideoToAudioCreateResponse", +] + + +class WaitableVideoToAudioCreateResponse(VideoToAudioCreateResponse, AwaitableTaskResponseMixin): ... + + +class AsyncWaitableVideoToAudioCreateResponse(VideoToAudioCreateResponse, AsyncAwaitableTaskResponseMixin): ... + + +class VideoToAudioResource(SyncAPIResource): + """These endpoints all kick off tasks to create generations.""" + + @cached_property + def with_raw_response(self) -> VideoToAudioResourceWithRawResponse: + """ + 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/runwayml/sdk-python#accessing-raw-response-data-eg-headers + """ + return VideoToAudioResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> VideoToAudioResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/runwayml/sdk-python#with_streaming_response + """ + return VideoToAudioResourceWithStreamingResponse(self) + + def create( + self, + *, + duration: float, + model: Literal["mirelo_sfx_2_0"], + video_uri: str, + format: Literal["mp3", "wav", "flac"] | Omit = omit, + negative_prompt: str | Omit = omit, + num_variants: int | Omit = omit, + preserve_speech: bool | Omit = omit, + prompt_text: str | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> WaitableVideoToAudioCreateResponse: + """ + Generate synchronized sound effects for a video, optionally guided by a text + description. Returns audio, not a video with a replacement soundtrack. + + Args: + video_uri: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + format: The format of the generated audio. + + negative_prompt: Sounds to avoid in the generated audio. + + num_variants: The number of audio variations to generate. + + preserve_speech: Whether to preserve dialogue from the input video. Disabling this does not + guarantee speech-free output. + + prompt_text: A description of the sound effects to generate. + + seed: A seed for reproducible generation. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._post( + "/v1/video_to_audio", + body=maybe_transform( + { + "duration": duration, + "model": model, + "video_uri": video_uri, + "format": format, + "negative_prompt": negative_prompt, + "num_variants": num_variants, + "preserve_speech": preserve_speech, + "prompt_text": prompt_text, + "seed": seed, + }, + video_to_audio_create_params.VideoToAudioCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=cast( + Type[WaitableVideoToAudioCreateResponse], + create_waitable_resource(WaitableVideoToAudioCreateResponse, self._client), + ), + ) + + +class AsyncVideoToAudioResource(AsyncAPIResource): + """These endpoints all kick off tasks to create generations.""" + + @cached_property + def with_raw_response(self) -> AsyncVideoToAudioResourceWithRawResponse: + """ + 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/runwayml/sdk-python#accessing-raw-response-data-eg-headers + """ + return AsyncVideoToAudioResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncVideoToAudioResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/runwayml/sdk-python#with_streaming_response + """ + return AsyncVideoToAudioResourceWithStreamingResponse(self) + + async def create( + self, + *, + duration: float, + model: Literal["mirelo_sfx_2_0"], + video_uri: str, + format: Literal["mp3", "wav", "flac"] | Omit = omit, + negative_prompt: str | Omit = omit, + num_variants: int | Omit = omit, + preserve_speech: bool | Omit = omit, + prompt_text: str | Omit = omit, + seed: int | Omit = omit, + # 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, + ) -> AsyncWaitableVideoToAudioCreateResponse: + """ + Generate synchronized sound effects for a video, optionally guided by a text + description. Returns audio, not a video with a replacement soundtrack. + + Args: + video_uri: A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + + format: The format of the generated audio. + + negative_prompt: Sounds to avoid in the generated audio. + + num_variants: The number of audio variations to generate. + + preserve_speech: Whether to preserve dialogue from the input video. Disabling this does not + guarantee speech-free output. + + prompt_text: A description of the sound effects to generate. + + seed: A seed for reproducible generation. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self._post( + "/v1/video_to_audio", + body=await async_maybe_transform( + { + "duration": duration, + "model": model, + "video_uri": video_uri, + "format": format, + "negative_prompt": negative_prompt, + "num_variants": num_variants, + "preserve_speech": preserve_speech, + "prompt_text": prompt_text, + "seed": seed, + }, + video_to_audio_create_params.VideoToAudioCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=cast( + Type[AsyncWaitableVideoToAudioCreateResponse], + create_async_waitable_resource(AsyncWaitableVideoToAudioCreateResponse, self._client), + ), + ) + + +class VideoToAudioResourceWithRawResponse: + def __init__(self, video_to_audio: VideoToAudioResource) -> None: + self._video_to_audio = video_to_audio + + self.create = to_raw_response_wrapper( + video_to_audio.create, + ) + + +class AsyncVideoToAudioResourceWithRawResponse: + def __init__(self, video_to_audio: AsyncVideoToAudioResource) -> None: + self._video_to_audio = video_to_audio + + self.create = async_to_raw_response_wrapper( + video_to_audio.create, + ) + + +class VideoToAudioResourceWithStreamingResponse: + def __init__(self, video_to_audio: VideoToAudioResource) -> None: + self._video_to_audio = video_to_audio + + self.create = to_streamed_response_wrapper( + video_to_audio.create, + ) + + +class AsyncVideoToAudioResourceWithStreamingResponse: + def __init__(self, video_to_audio: AsyncVideoToAudioResource) -> None: + self._video_to_audio = video_to_audio + + self.create = async_to_streamed_response_wrapper( + video_to_audio.create, + ) diff --git a/src/runwayml/types/__init__.py b/src/runwayml/types/__init__.py index 012d56fb..d954707e 100644 --- a/src/runwayml/types/__init__.py +++ b/src/runwayml/types/__init__.py @@ -58,6 +58,7 @@ from .recipe_product_swap_response import RecipeProductSwapResponse as RecipeProductSwapResponse from .sound_effect_create_response import SoundEffectCreateResponse as SoundEffectCreateResponse from .text_to_speech_create_params import TextToSpeechCreateParams as TextToSpeechCreateParams +from .video_to_audio_create_params import VideoToAudioCreateParams as VideoToAudioCreateParams from .video_to_hdr_create_response import VideoToHdrCreateResponse as VideoToHdrCreateResponse from .video_to_video_create_params import VideoToVideoCreateParams as VideoToVideoCreateParams from .image_upscale_create_response import ImageUpscaleCreateResponse as ImageUpscaleCreateResponse @@ -74,6 +75,7 @@ from .recipe_multi_shot_video_params import RecipeMultiShotVideoParams as RecipeMultiShotVideoParams from .speech_to_speech_create_params import SpeechToSpeechCreateParams as SpeechToSpeechCreateParams from .text_to_speech_create_response import TextToSpeechCreateResponse as TextToSpeechCreateResponse +from .video_to_audio_create_response import VideoToAudioCreateResponse as VideoToAudioCreateResponse from .video_to_video_create_response import VideoToVideoCreateResponse as VideoToVideoCreateResponse from .avatar_conversation_list_params import AvatarConversationListParams as AvatarConversationListParams from .recipe_ad_localization_response import RecipeAdLocalizationResponse as RecipeAdLocalizationResponse diff --git a/src/runwayml/types/generate/image_create_response.py b/src/runwayml/types/generate/image_create_response.py index 1ea38938..7c1a8e19 100644 --- a/src/runwayml/types/generate/image_create_response.py +++ b/src/runwayml/types/generate/image_create_response.py @@ -30,6 +30,12 @@ class RoutingResolvedInput(BaseModel): Not necessarily identical to prepared model options. """ + aspect_ratio: str = FieldInfo(alias="aspectRatio") + """Aspect ratio resolved for routing display from the request or router default. + + When `ratio` is `auto`, the source image determines output framing. + """ + ratio: str """Output ratio for the selected model, as `:`. @@ -37,11 +43,11 @@ class RoutingResolvedInput(BaseModel): chosen. """ - aspect_ratio: Optional[str] = FieldInfo(alias="aspectRatio", default=None) - """Aspect ratio the output will use. Omitted when `ratio` is `auto`.""" + resolution: str + """Megapixel tier resolved for routing display from the request or model default. - resolution: Optional[str] = None - """Megapixel tier the output will use. Omitted when `ratio` is `auto`.""" + When `ratio` is `auto`, this does not specify output pixel dimensions. + """ class RoutingResolvedSettings(BaseModel): diff --git a/src/runwayml/types/image_to_video_create_params.py b/src/runwayml/types/image_to_video_create_params.py index 0e324a0b..801bbb86 100644 --- a/src/runwayml/types/image_to_video_create_params.py +++ b/src/runwayml/types/image_to_video_create_params.py @@ -25,7 +25,6 @@ "KlingO3_4kProviderSettingsMultiPrompt", "KlingO3_4kReferencesReferenceImage", "Hailuo3", - "Hailuo3PromptImagePromptImage", "Hailuo3ReferenceAudio", "Kling3_0_4k", "Kling3_0_4kPromptImagePromptImage", @@ -67,13 +66,11 @@ "GrokImagine1_5", "GrokImagine1_5PromptImagePromptImage", "Wan3", - "Wan3PromptImagePromptImage", "Wan3ReferenceAudio", "Wan3ReferenceVideo", "GeminiOmniFlash1_1", "GeminiOmniFlash1_1PromptImagePromptImage", "Wan3Prime", - "Wan3PrimePromptImagePromptImage", "Wan3PrimeReferenceAudio", "Wan3PrimeReferenceVideo", "H3Max", @@ -473,9 +470,7 @@ class KlingO3_4kReferencesReferenceImage(TypedDict, total=False): class Hailuo3(TypedDict, total=False): model: Required[Literal["hailuo3"]] - prompt_image: Required[ - Annotated[Union[str, Iterable[Hailuo3PromptImagePromptImage]], PropertyInfo(alias="promptImage")] - ] + prompt_image: Required[Annotated[Union[str, Iterable[object]], PropertyInfo(alias="promptImage")]] """An image or array of images. Use position `first`/`last` for keyframe mode, or omit position for reference @@ -510,22 +505,6 @@ class Hailuo3(TypedDict, total=False): """ -class Hailuo3PromptImagePromptImage(TypedDict, total=False): - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. - """ - - position: Literal["first", "last"] - """The position of the image in the output video. - - "first" will use the image as the first frame, "last" as the last frame. Omit - for a reference image. - """ - - class Hailuo3ReferenceAudio(TypedDict, total=False): """ An audio reference allows the model to use the audio as additional context for the output. @@ -1418,9 +1397,7 @@ class GrokImagine1_5PromptImagePromptImage(TypedDict, total=False): class Wan3(TypedDict, total=False): model: Required[Literal["wan3"]] - prompt_image: Required[ - Annotated[Union[str, Iterable[Wan3PromptImagePromptImage]], PropertyInfo(alias="promptImage")] - ] + prompt_image: Required[Annotated[Union[str, Iterable[object]], PropertyInfo(alias="promptImage")]] """An image or array of images. Use position `first`/`last` for keyframe mode, or omit position for reference @@ -1476,22 +1453,6 @@ class Wan3(TypedDict, total=False): """ -class Wan3PromptImagePromptImage(TypedDict, total=False): - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. - """ - - position: Literal["first", "last"] - """The position of the image in the output video. - - "first" will use the image as the first frame, "last" as the last frame. Omit - for a reference image. - """ - - class Wan3ReferenceAudio(TypedDict, total=False): """ An audio reference allows the model to use the audio as additional context for the output. @@ -1569,9 +1530,7 @@ class GeminiOmniFlash1_1PromptImagePromptImage(TypedDict, total=False): class Wan3Prime(TypedDict, total=False): model: Required[Literal["wan3_prime"]] - prompt_image: Required[ - Annotated[Union[str, Iterable[Wan3PrimePromptImagePromptImage]], PropertyInfo(alias="promptImage")] - ] + prompt_image: Required[Annotated[Union[str, Iterable[object]], PropertyInfo(alias="promptImage")]] """An image or array of images. Use position `first`/`last` for keyframe mode, or omit position for reference @@ -1627,22 +1586,6 @@ class Wan3Prime(TypedDict, total=False): """ -class Wan3PrimePromptImagePromptImage(TypedDict, total=False): - uri: Required[str] - """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. - - `data:image/png;base64,...`, up to 5MB) containing an encoded image. See - [our docs](/assets/inputs#images) on image inputs for more information. - """ - - position: Literal["first", "last"] - """The position of the image in the output video. - - "first" will use the image as the first frame, "last" as the last frame. Omit - for a reference image. - """ - - class Wan3PrimeReferenceAudio(TypedDict, total=False): """ An audio reference allows the model to use the audio as additional context for the output. diff --git a/src/runwayml/types/organization/webapp/audit_log_list_params.py b/src/runwayml/types/organization/webapp/audit_log_list_params.py index 1831750b..ad3bb22b 100644 --- a/src/runwayml/types/organization/webapp/audit_log_list_params.py +++ b/src/runwayml/types/organization/webapp/audit_log_list_params.py @@ -43,12 +43,14 @@ class AuditLogListParams(TypedDict, total=False): `AgentConnectorConnected`, `AgentConnectorDisconnected`, `AgentConnectorAssetExported`, `AgentConnectorSessionEnabled`, `AgentConnectorSessionDisabled`, `GenerationCreated`, `StudioSessionOpened`, - `AccountLinkCreated`, `AccountLinkDeleted`, `AdConnectionAuthorizationStarted`, - `AdConnectionConnected`, `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, + `AppStudioAiRunOpened`, `AccountLinkCreated`, `AccountLinkDeleted`, + `AdConnectionAuthorizationStarted`, `AdConnectionConnected`, + `AdAccountSelectionUpdated`, `AdAccountSyncRequested`, `AdConnectionDisconnected`, `AdWorkspaceOnboardingUpdated`, `AdCreativeReviewSubmitted`, `AdCreativeReviewCancelled`, `AdCreativeReviewDecided`, `AdCreativeApprovalRevoked`, `AdCreativeArchived`, - `AdCreativeUnarchived`, `OrganizationSettingsUpdated`, + `AdCreativeUnarchived`, `AdPublishBatchQueued`, `AdPublishBatchCancelled`, + `AdPublishBatchRetried`, `OrganizationSettingsUpdated`, `OrganizationDisabledModelsUpdated`, `OrganizationAgentSandboxUpdated`, `OrganizationApiAccountReleased`, `OrganizationApiAccountMemberInvited`, `OrganizationApiAccountMemberRoleChanged`, diff --git a/src/runwayml/types/organization/webapp/audit_log_list_response.py b/src/runwayml/types/organization/webapp/audit_log_list_response.py index 09d49ad6..ab1bdbe0 100644 --- a/src/runwayml/types/organization/webapp/audit_log_list_response.py +++ b/src/runwayml/types/organization/webapp/audit_log_list_response.py @@ -85,6 +85,7 @@ class AuditLogListResponse(BaseModel): "AgentConnectorSessionDisabled", "GenerationCreated", "StudioSessionOpened", + "AppStudioAiRunOpened", "AccountLinkCreated", "AccountLinkDeleted", "AdConnectionAuthorizationStarted", @@ -99,6 +100,9 @@ class AuditLogListResponse(BaseModel): "AdCreativeApprovalRevoked", "AdCreativeArchived", "AdCreativeUnarchived", + "AdPublishBatchQueued", + "AdPublishBatchCancelled", + "AdPublishBatchRetried", "OrganizationSettingsUpdated", "OrganizationDisabledModelsUpdated", "OrganizationAgentSandboxUpdated", diff --git a/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py b/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py index 29fe8b60..aa1aca78 100644 --- a/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py +++ b/src/runwayml/types/organization/webapp/audit_log_retrieve_response.py @@ -18,6 +18,8 @@ class Metadata(BaseModel): ad_creative_id: Optional[str] = FieldInfo(alias="Ad creative ID", default=None) + ad_publish_batch_id: Optional[str] = FieldInfo(alias="Ad publish batch ID", default=None) + ad_review_batch_id: Optional[str] = FieldInfo(alias="Ad review batch ID", default=None) ad_review_request_id: Optional[str] = FieldInfo(alias="Ad review request ID", default=None) @@ -64,6 +66,12 @@ class Metadata(BaseModel): comment_text: Optional[str] = FieldInfo(alias="Comment text", default=None) + creatives_cancelled: Optional[float] = FieldInfo(alias="Creatives cancelled", default=None) + + creatives_queued: Optional[float] = FieldInfo(alias="Creatives queued", default=None) + + creatives_retried: Optional[float] = FieldInfo(alias="Creatives retried", default=None) + default_project_discoverability: Optional[str] = FieldInfo(alias="Default project discoverability", default=None) default_task_name_template: Optional[str] = FieldInfo(alias="Default task name template", default=None) @@ -80,6 +88,8 @@ class Metadata(BaseModel): hard_spend_cap: Optional[bool] = FieldInfo(alias="Hard spend cap", default=None) + into_a_new_test_ad_set: Optional[bool] = FieldInfo(alias="Into a new test ad set", default=None) + invited_member: Optional[str] = FieldInfo(alias="Invited member", default=None) language_model_or_provider: Optional[str] = FieldInfo(alias="Language model or provider", default=None) @@ -112,6 +122,8 @@ class Metadata(BaseModel): platform: Optional[str] = FieldInfo(alias="Platform", default=None) + platform_ad_account_id: Optional[str] = FieldInfo(alias="Platform ad account ID", default=None) + previous_project_credit_cap: Optional[float] = FieldInfo(alias="Previous project credit cap", default=None) previous_role: Optional[str] = FieldInfo(alias="Previous role", default=None) @@ -243,6 +255,7 @@ class AuditLogRetrieveResponse(BaseModel): "AgentConnectorSessionDisabled", "GenerationCreated", "StudioSessionOpened", + "AppStudioAiRunOpened", "AccountLinkCreated", "AccountLinkDeleted", "AdConnectionAuthorizationStarted", @@ -257,6 +270,9 @@ class AuditLogRetrieveResponse(BaseModel): "AdCreativeApprovalRevoked", "AdCreativeArchived", "AdCreativeUnarchived", + "AdPublishBatchQueued", + "AdPublishBatchCancelled", + "AdPublishBatchRetried", "OrganizationSettingsUpdated", "OrganizationDisabledModelsUpdated", "OrganizationAgentSandboxUpdated", diff --git a/src/runwayml/types/organization_retrieve_usage_response.py b/src/runwayml/types/organization_retrieve_usage_response.py index b5a1fbc7..6e42b3a2 100644 --- a/src/runwayml/types/organization_retrieve_usage_response.py +++ b/src/runwayml/types/organization_retrieve_usage_response.py @@ -28,6 +28,7 @@ class ResultUsedCredit(BaseModel): "gen4.5", "gen3a_turbo", "gen4_turbo", + "recraft_v4_1_vector", "gen4_image", "gen4_image_turbo", "gpt_image_2", @@ -43,6 +44,7 @@ class ResultUsedCredit(BaseModel): "gemini_image3.1_flash", "gemini_image3.1_flash_lite", "nano_banana_2.1", + "recraft_v4_1_flash", "seedream5_pro", "seedream5_flash", "seedream5_lite", @@ -53,6 +55,7 @@ class ResultUsedCredit(BaseModel): "eleven_v3", "eleven_v4", "eleven_text_to_sound_v2", + "mirelo_sfx_2_0", "eleven_voice_isolation", "eleven_voice_dubbing", "eleven_multilingual_sts_v2", @@ -130,6 +133,7 @@ class OrganizationRetrieveUsageResponse(BaseModel): "gen4.5", "gen3a_turbo", "gen4_turbo", + "recraft_v4_1_vector", "gen4_image", "gen4_image_turbo", "gpt_image_2", @@ -145,6 +149,7 @@ class OrganizationRetrieveUsageResponse(BaseModel): "gemini_image3.1_flash", "gemini_image3.1_flash_lite", "nano_banana_2.1", + "recraft_v4_1_flash", "seedream5_pro", "seedream5_flash", "seedream5_lite", @@ -155,6 +160,7 @@ class OrganizationRetrieveUsageResponse(BaseModel): "eleven_v3", "eleven_v4", "eleven_text_to_sound_v2", + "mirelo_sfx_2_0", "eleven_voice_isolation", "eleven_voice_dubbing", "eleven_multilingual_sts_v2", diff --git a/src/runwayml/types/sound_effect_create_params.py b/src/runwayml/types/sound_effect_create_params.py index 81ba0464..6417a773 100644 --- a/src/runwayml/types/sound_effect_create_params.py +++ b/src/runwayml/types/sound_effect_create_params.py @@ -8,7 +8,7 @@ from .._types import SequenceNotStr from .._utils import PropertyInfo -__all__ = ["SoundEffectCreateParams", "SeedAudio", "ElevenTextToSoundV2"] +__all__ = ["SoundEffectCreateParams", "SeedAudio", "MireloSfx2_0", "ElevenTextToSoundV2"] class SeedAudio(TypedDict, total=False): @@ -44,6 +44,28 @@ class SeedAudio(TypedDict, total=False): """Relative speech speed. Negative is slower, positive is faster; 0 is normal.""" +class MireloSfx2_0(TypedDict, total=False): + duration: Required[float] + """The duration of the generated audio in seconds.""" + + model: Required[Literal["mirelo_sfx_2_0"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A description of the sound effects to generate.""" + + format: Literal["mp3", "wav", "flac"] + """The format of the generated audio.""" + + negative_prompt: Annotated[str, PropertyInfo(alias="negativePrompt")] + """Sounds to avoid in the generated audio.""" + + num_variants: Annotated[int, PropertyInfo(alias="numVariants")] + """The number of audio variations to generate.""" + + seed: int + """A seed for reproducible generation.""" + + class ElevenTextToSoundV2(TypedDict, total=False): model: Required[Literal["eleven_text_to_sound_v2"]] @@ -61,4 +83,4 @@ class ElevenTextToSoundV2(TypedDict, total=False): """Whether the output sound effect should be designed to loop seamlessly.""" -SoundEffectCreateParams: TypeAlias = Union[SeedAudio, ElevenTextToSoundV2] +SoundEffectCreateParams: TypeAlias = Union[SeedAudio, MireloSfx2_0, ElevenTextToSoundV2] diff --git a/src/runwayml/types/text_to_image_create_params.py b/src/runwayml/types/text_to_image_create_params.py index 657363fc..8bdf74da 100644 --- a/src/runwayml/types/text_to_image_create_params.py +++ b/src/runwayml/types/text_to_image_create_params.py @@ -5,6 +5,7 @@ from typing import Union, Iterable from typing_extensions import Literal, Required, Annotated, TypeAlias, TypedDict +from .._types import SequenceNotStr from .._utils import PropertyInfo __all__ = [ @@ -47,6 +48,8 @@ "Seedream5FlashReferenceImage", "NanoBanana2_1", "NanoBanana2_1ReferenceImage", + "RecraftV4_1Flash", + "RecraftV4_1Vector", "Gemini2_5Flash", "Gemini2_5FlashReferenceImage", ] @@ -1352,6 +1355,70 @@ class NanoBanana2_1ReferenceImage(TypedDict, total=False): """ +class RecraftV4_1Flash(TypedDict, total=False): + model: Required[Literal["recraft_v4_1_flash"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """A description of the image you want to generate.""" + + ratio: Required[ + Literal[ + "1024:1024", + "1536:768", + "768:1536", + "1280:832", + "832:1280", + "1216:896", + "896:1216", + "1152:896", + "896:1152", + "832:1344", + "1280:896", + "896:1280", + "1344:768", + "768:1344", + ] + ] + """The output dimensions, expressed as `:`.""" + + background_color: Annotated[str, PropertyInfo(alias="backgroundColor")] + """A preferred background color as a six-digit hex string.""" + + colors: SequenceNotStr[str] + """Preferred colors as six-digit hex strings.""" + + output_count: Annotated[int, PropertyInfo(alias="outputCount")] + """The number of images to generate. Each image is billed separately.""" + + output_format: Annotated[Literal["webp", "png"], PropertyInfo(alias="outputFormat")] + """The output file format. Defaults to webp.""" + + seed: int + + +class RecraftV4_1Vector(TypedDict, total=False): + model: Required[Literal["recraft_v4_1_vector"]] + + prompt_text: Required[Annotated[str, PropertyInfo(alias="promptText")]] + """Describe the vector illustration you want to generate.""" + + background_color: Annotated[str, PropertyInfo(alias="backgroundColor")] + """The preferred background color as a six-digit hex value. + + This is a generation hint, not an exact color constraint; the generated + background may use a different shade. + """ + + colors: SequenceNotStr[str] + """Preferred colors as six-digit hex values, such as #FF8800.""" + + ratio: Literal["1024:1024", "1216:896", "896:1216", "1344:768", "768:1344"] + """The width and height declared by the output SVG. + + Vector artwork can be scaled after generation. + """ + + class Gemini2_5Flash(TypedDict, total=False): model: Required[Literal["gemini_2.5_flash"]] @@ -1417,5 +1484,7 @@ class Gemini2_5FlashReferenceImage(TypedDict, total=False): Ideogram4_5, Seedream5Flash, NanoBanana2_1, + RecraftV4_1Flash, + RecraftV4_1Vector, Gemini2_5Flash, ] diff --git a/src/runwayml/types/video_to_audio_create_params.py b/src/runwayml/types/video_to_audio_create_params.py new file mode 100644 index 00000000..75818c66 --- /dev/null +++ b/src/runwayml/types/video_to_audio_create_params.py @@ -0,0 +1,43 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, Required, Annotated, TypedDict + +from .._utils import PropertyInfo + +__all__ = ["VideoToAudioCreateParams"] + + +class VideoToAudioCreateParams(TypedDict, total=False): + duration: Required[float] + + model: Required[Literal["mirelo_sfx_2_0"]] + + video_uri: Required[Annotated[str, PropertyInfo(alias="videoUri")]] + """A HTTPS URL, Runway upload URI, or base64 data URI (e.g. + + `data:video/mp4;base64,...`, up to 5MB) containing an encoded video. See + [our docs](/assets/inputs#videos) on video inputs for more information. + """ + + format: Literal["mp3", "wav", "flac"] + """The format of the generated audio.""" + + negative_prompt: Annotated[str, PropertyInfo(alias="negativePrompt")] + """Sounds to avoid in the generated audio.""" + + num_variants: Annotated[int, PropertyInfo(alias="numVariants")] + """The number of audio variations to generate.""" + + preserve_speech: Annotated[bool, PropertyInfo(alias="preserveSpeech")] + """Whether to preserve dialogue from the input video. + + Disabling this does not guarantee speech-free output. + """ + + prompt_text: Annotated[str, PropertyInfo(alias="promptText")] + """A description of the sound effects to generate.""" + + seed: int + """A seed for reproducible generation.""" diff --git a/src/runwayml/types/video_to_audio_create_response.py b/src/runwayml/types/video_to_audio_create_response.py new file mode 100644 index 00000000..36c725ea --- /dev/null +++ b/src/runwayml/types/video_to_audio_create_response.py @@ -0,0 +1,28 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from pydantic import Field as FieldInfo + +from .._models import BaseModel + +__all__ = ["VideoToAudioCreateResponse", "EstimatedCost"] + + +class EstimatedCost(BaseModel): + """The maximum credits this task may charge. + + The final amount may be lower after the task completes. + """ + + credits: float + """Estimated cost of the generation in credits.""" + + +class VideoToAudioCreateResponse(BaseModel): + id: str + """The ID of the task that was created. Use this to retrieve the task later.""" + + estimated_cost: EstimatedCost = FieldInfo(alias="estimatedCost") + """The maximum credits this task may charge. + + The final amount may be lower after the task completes. + """ diff --git a/src/runwayml/types/video_to_video_create_params.py b/src/runwayml/types/video_to_video_create_params.py index 17a8a7b1..229da5d3 100644 --- a/src/runwayml/types/video_to_video_create_params.py +++ b/src/runwayml/types/video_to_video_create_params.py @@ -12,10 +12,10 @@ "Variant0", "Variant0ContentModeration", "Variant0Keyframe", - "Variant0KeyframeKeyframeWithSeconds", - "Variant0KeyframeKeyframeWithSecondsRange", - "Variant0KeyframeKeyframeWithAt", - "Variant0KeyframeKeyframeWithAtRange", + "Variant0KeyframeUnionMember0", + "Variant0KeyframeUnionMember0Range", + "Variant0KeyframeUnionMember1", + "Variant0KeyframeUnionMember1Range", "KlingO3_4k", "KlingO3_4kProviderSettings", "KlingO3_4kProviderSettingsMultiPrompt", @@ -130,7 +130,7 @@ class Variant0ContentModeration(TypedDict, total=False): """ -class Variant0KeyframeKeyframeWithSecondsRange(TypedDict, total=False): +class Variant0KeyframeUnionMember0Range(TypedDict, total=False): """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp must fall within it. All keyframes must either set a range or none may. @@ -146,7 +146,7 @@ class Variant0KeyframeKeyframeWithSecondsRange(TypedDict, total=False): """Start of the edit window in whole seconds from the start of the input video.""" -class Variant0KeyframeKeyframeWithSeconds(TypedDict, total=False): +class Variant0KeyframeUnionMember0(TypedDict, total=False): seconds: Required[float] """ Absolute timestamp in seconds from the start of the input video when this @@ -160,7 +160,7 @@ class Variant0KeyframeKeyframeWithSeconds(TypedDict, total=False): [our docs](/assets/inputs#images) on image inputs for more information. """ - range: Variant0KeyframeKeyframeWithSecondsRange + range: Variant0KeyframeUnionMember0Range """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp @@ -168,7 +168,7 @@ class Variant0KeyframeKeyframeWithSeconds(TypedDict, total=False): """ -class Variant0KeyframeKeyframeWithAtRange(TypedDict, total=False): +class Variant0KeyframeUnionMember1Range(TypedDict, total=False): """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp must fall within it. All keyframes must either set a range or none may. @@ -184,7 +184,7 @@ class Variant0KeyframeKeyframeWithAtRange(TypedDict, total=False): """Start of the edit window in whole seconds from the start of the input video.""" -class Variant0KeyframeKeyframeWithAt(TypedDict, total=False): +class Variant0KeyframeUnionMember1(TypedDict, total=False): at: Required[float] """ Position as a fraction [0.0, 1.0] of the input video duration when this guidance @@ -198,7 +198,7 @@ class Variant0KeyframeKeyframeWithAt(TypedDict, total=False): [our docs](/assets/inputs#images) on image inputs for more information. """ - range: Variant0KeyframeKeyframeWithAtRange + range: Variant0KeyframeUnionMember1Range """Optional edit window. When set, the edit applies only to this time range and the keyframe timestamp @@ -206,7 +206,7 @@ class Variant0KeyframeKeyframeWithAt(TypedDict, total=False): """ -Variant0Keyframe: TypeAlias = Union[Variant0KeyframeKeyframeWithSeconds, Variant0KeyframeKeyframeWithAt] +Variant0Keyframe: TypeAlias = Union[Variant0KeyframeUnionMember0, Variant0KeyframeUnionMember1] class KlingO3_4k(TypedDict, total=False): diff --git a/tests/api_resources/test_sound_effect.py b/tests/api_resources/test_sound_effect.py index f8f4d0c1..e6de92d7 100644 --- a/tests/api_resources/test_sound_effect.py +++ b/tests/api_resources/test_sound_effect.py @@ -68,13 +68,63 @@ def test_streaming_response_create_overload_1(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_2(self, client: RunwayML) -> None: sound_effect = client.sound_effect.create( - model="eleven_text_to_sound_v2", + duration=0.1, + model="mirelo_sfx_2_0", prompt_text="x", ) assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) @parametrize def test_method_create_with_all_params_overload_2(self, client: RunwayML) -> None: + sound_effect = client.sound_effect.create( + duration=0.1, + model="mirelo_sfx_2_0", + prompt_text="x", + format="mp3", + negative_prompt="x", + num_variants=1, + seed=0, + ) + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + @parametrize + def test_raw_response_create_overload_2(self, client: RunwayML) -> None: + response = client.sound_effect.with_raw_response.create( + duration=0.1, + model="mirelo_sfx_2_0", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + sound_effect = response.parse() + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_2(self, client: RunwayML) -> None: + with client.sound_effect.with_streaming_response.create( + duration=0.1, + model="mirelo_sfx_2_0", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + sound_effect = response.parse() + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_3(self, client: RunwayML) -> None: + sound_effect = client.sound_effect.create( + model="eleven_text_to_sound_v2", + prompt_text="x", + ) + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_3(self, client: RunwayML) -> None: sound_effect = client.sound_effect.create( model="eleven_text_to_sound_v2", prompt_text="x", @@ -84,7 +134,7 @@ def test_method_create_with_all_params_overload_2(self, client: RunwayML) -> Non assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) @parametrize - def test_raw_response_create_overload_2(self, client: RunwayML) -> None: + def test_raw_response_create_overload_3(self, client: RunwayML) -> None: response = client.sound_effect.with_raw_response.create( model="eleven_text_to_sound_v2", prompt_text="x", @@ -96,7 +146,7 @@ def test_raw_response_create_overload_2(self, client: RunwayML) -> None: assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) @parametrize - def test_streaming_response_create_overload_2(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_3(self, client: RunwayML) -> None: with client.sound_effect.with_streaming_response.create( model="eleven_text_to_sound_v2", prompt_text="x", @@ -166,13 +216,63 @@ async def test_streaming_response_create_overload_1(self, async_client: AsyncRun @parametrize async def test_method_create_overload_2(self, async_client: AsyncRunwayML) -> None: sound_effect = await async_client.sound_effect.create( - model="eleven_text_to_sound_v2", + duration=0.1, + model="mirelo_sfx_2_0", prompt_text="x", ) assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) @parametrize async def test_method_create_with_all_params_overload_2(self, async_client: AsyncRunwayML) -> None: + sound_effect = await async_client.sound_effect.create( + duration=0.1, + model="mirelo_sfx_2_0", + prompt_text="x", + format="mp3", + negative_prompt="x", + num_variants=1, + seed=0, + ) + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + response = await async_client.sound_effect.with_raw_response.create( + duration=0.1, + model="mirelo_sfx_2_0", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + sound_effect = await response.parse() + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async with async_client.sound_effect.with_streaming_response.create( + duration=0.1, + model="mirelo_sfx_2_0", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + sound_effect = await response.parse() + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_3(self, async_client: AsyncRunwayML) -> None: + sound_effect = await async_client.sound_effect.create( + model="eleven_text_to_sound_v2", + prompt_text="x", + ) + assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_3(self, async_client: AsyncRunwayML) -> None: sound_effect = await async_client.sound_effect.create( model="eleven_text_to_sound_v2", prompt_text="x", @@ -182,7 +282,7 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) @parametrize - async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: response = await async_client.sound_effect.with_raw_response.create( model="eleven_text_to_sound_v2", prompt_text="x", @@ -194,7 +294,7 @@ async def test_raw_response_create_overload_2(self, async_client: AsyncRunwayML) assert_matches_type(SoundEffectCreateResponse, sound_effect, path=["response"]) @parametrize - async def test_streaming_response_create_overload_2(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_3(self, async_client: AsyncRunwayML) -> None: async with async_client.sound_effect.with_streaming_response.create( model="eleven_text_to_sound_v2", prompt_text="x", diff --git a/tests/api_resources/test_text_to_image.py b/tests/api_resources/test_text_to_image.py index 09e63438..d3749394 100644 --- a/tests/api_resources/test_text_to_image.py +++ b/tests/api_resources/test_text_to_image.py @@ -948,6 +948,102 @@ def test_streaming_response_create_overload_18(self, client: RunwayML) -> None: @parametrize def test_method_create_overload_19(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_19(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + background_color="#E1CB97", + colors=["#E1CB97"], + output_count=1, + output_format="webp", + seed=0, + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_raw_response_create_overload_19(self, client: RunwayML) -> None: + response = client.text_to_image.with_raw_response.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_19(self, client: RunwayML) -> None: + with client.text_to_image.with_streaming_response.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_20(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="recraft_v4_1_vector", + prompt_text="x", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_method_create_with_all_params_overload_20(self, client: RunwayML) -> None: + text_to_image = client.text_to_image.create( + model="recraft_v4_1_vector", + prompt_text="x", + background_color="#E1CB97", + colors=["#E1CB97"], + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_raw_response_create_overload_20(self, client: RunwayML) -> None: + response = client.text_to_image.with_raw_response.create( + model="recraft_v4_1_vector", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + def test_streaming_response_create_overload_20(self, client: RunwayML) -> None: + with client.text_to_image.with_streaming_response.create( + model="recraft_v4_1_vector", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_overload_21(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( model="gemini_2.5_flash", prompt_text="x", @@ -956,7 +1052,7 @@ def test_method_create_overload_19(self, client: RunwayML) -> None: assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - def test_method_create_with_all_params_overload_19(self, client: RunwayML) -> None: + def test_method_create_with_all_params_overload_21(self, client: RunwayML) -> None: text_to_image = client.text_to_image.create( model="gemini_2.5_flash", prompt_text="x", @@ -971,7 +1067,7 @@ def test_method_create_with_all_params_overload_19(self, client: RunwayML) -> No assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - def test_raw_response_create_overload_19(self, client: RunwayML) -> None: + def test_raw_response_create_overload_21(self, client: RunwayML) -> None: response = client.text_to_image.with_raw_response.create( model="gemini_2.5_flash", prompt_text="x", @@ -984,7 +1080,7 @@ def test_raw_response_create_overload_19(self, client: RunwayML) -> None: assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - def test_streaming_response_create_overload_19(self, client: RunwayML) -> None: + def test_streaming_response_create_overload_21(self, client: RunwayML) -> None: with client.text_to_image.with_streaming_response.create( model="gemini_2.5_flash", prompt_text="x", @@ -1935,6 +2031,102 @@ async def test_streaming_response_create_overload_18(self, async_client: AsyncRu @parametrize async def test_method_create_overload_19(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_19(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + background_color="#E1CB97", + colors=["#E1CB97"], + output_count=1, + output_format="webp", + seed=0, + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="recraft_v4_1_flash", + prompt_text="x", + ratio="1024:1024", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_20(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="recraft_v4_1_vector", + prompt_text="x", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_method_create_with_all_params_overload_20(self, async_client: AsyncRunwayML) -> None: + text_to_image = await async_client.text_to_image.create( + model="recraft_v4_1_vector", + prompt_text="x", + background_color="#E1CB97", + colors=["#E1CB97"], + ratio="1024:1024", + ) + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_raw_response_create_overload_20(self, async_client: AsyncRunwayML) -> None: + response = await async_client.text_to_image.with_raw_response.create( + model="recraft_v4_1_vector", + prompt_text="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + @parametrize + async def test_streaming_response_create_overload_20(self, async_client: AsyncRunwayML) -> None: + async with async_client.text_to_image.with_streaming_response.create( + model="recraft_v4_1_vector", + prompt_text="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + text_to_image = await response.parse() + assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_overload_21(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gemini_2.5_flash", prompt_text="x", @@ -1943,7 +2135,7 @@ async def test_method_create_overload_19(self, async_client: AsyncRunwayML) -> N assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_method_create_with_all_params_overload_19(self, async_client: AsyncRunwayML) -> None: + async def test_method_create_with_all_params_overload_21(self, async_client: AsyncRunwayML) -> None: text_to_image = await async_client.text_to_image.create( model="gemini_2.5_flash", prompt_text="x", @@ -1958,7 +2150,7 @@ async def test_method_create_with_all_params_overload_19(self, async_client: Asy assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_raw_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: + async def test_raw_response_create_overload_21(self, async_client: AsyncRunwayML) -> None: response = await async_client.text_to_image.with_raw_response.create( model="gemini_2.5_flash", prompt_text="x", @@ -1971,7 +2163,7 @@ async def test_raw_response_create_overload_19(self, async_client: AsyncRunwayML assert_matches_type(TextToImageCreateResponse, text_to_image, path=["response"]) @parametrize - async def test_streaming_response_create_overload_19(self, async_client: AsyncRunwayML) -> None: + async def test_streaming_response_create_overload_21(self, async_client: AsyncRunwayML) -> None: async with async_client.text_to_image.with_streaming_response.create( model="gemini_2.5_flash", prompt_text="x", diff --git a/tests/api_resources/test_video_to_audio.py b/tests/api_resources/test_video_to_audio.py new file mode 100644 index 00000000..4d101836 --- /dev/null +++ b/tests/api_resources/test_video_to_audio.py @@ -0,0 +1,128 @@ +# 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 runwayml import RunwayML, AsyncRunwayML +from tests.utils import assert_matches_type +from runwayml.types import VideoToAudioCreateResponse + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestVideoToAudio: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_create(self, client: RunwayML) -> None: + video_to_audio = client.video_to_audio.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + ) + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + @parametrize + def test_method_create_with_all_params(self, client: RunwayML) -> None: + video_to_audio = client.video_to_audio.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + format="mp3", + negative_prompt="x", + num_variants=1, + preserve_speech=True, + prompt_text="x", + seed=0, + ) + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + @parametrize + def test_raw_response_create(self, client: RunwayML) -> None: + response = client.video_to_audio.with_raw_response.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_audio = response.parse() + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + @parametrize + def test_streaming_response_create(self, client: RunwayML) -> None: + with client.video_to_audio.with_streaming_response.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_audio = response.parse() + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncVideoToAudio: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_create(self, async_client: AsyncRunwayML) -> None: + video_to_audio = await async_client.video_to_audio.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + ) + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + @parametrize + async def test_method_create_with_all_params(self, async_client: AsyncRunwayML) -> None: + video_to_audio = await async_client.video_to_audio.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + format="mp3", + negative_prompt="x", + num_variants=1, + preserve_speech=True, + prompt_text="x", + seed=0, + ) + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + @parametrize + async def test_raw_response_create(self, async_client: AsyncRunwayML) -> None: + response = await async_client.video_to_audio.with_raw_response.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + video_to_audio = await response.parse() + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + @parametrize + async def test_streaming_response_create(self, async_client: AsyncRunwayML) -> None: + async with async_client.video_to_audio.with_streaming_response.create( + duration=1, + model="mirelo_sfx_2_0", + video_uri="https://example.com/video.mp4", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + video_to_audio = await response.parse() + assert_matches_type(VideoToAudioCreateResponse, video_to_audio, path=["response"]) + + assert cast(Any, response.is_closed) is True diff --git a/tests/test_video_to_audio_polling.py b/tests/test_video_to_audio_polling.py new file mode 100644 index 00000000..b4847399 --- /dev/null +++ b/tests/test_video_to_audio_polling.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +from unittest.mock import AsyncMock, patch + +import httpx + +from runwayml import RunwayML, AsyncRunwayML + + +def test_video_to_audio_waits_for_created_task() -> None: + paths: list[str] = [] + + def handler(request: httpx.Request) -> httpx.Response: + paths.append(request.url.path) + if request.method == "POST": + return httpx.Response(200, json={"id": "task-1", "estimatedCost": {"credits": 2}}) + return httpx.Response( + 200, + json={ + "id": "task-1", + "createdAt": "2026-01-01T00:00:00Z", + "status": "SUCCEEDED", + "output": ["https://example.com/audio.mp3"], + }, + ) + + with RunwayML(api_key="test", http_client=httpx.Client(transport=httpx.MockTransport(handler))) as client: + response = client.video_to_audio.create( + duration=5, model="mirelo_sfx_2_0", video_uri="https://example.com/video.mp4" + ) + assert response.estimated_cost.credits == 2 + with patch("runwayml.lib.polling.time.sleep"): + result = response.wait_for_task_output() + assert result.status == "SUCCEEDED" + assert result.output == ["https://example.com/audio.mp3"] + assert paths == ["/v1/video_to_audio", "/v1/tasks/task-1"] + + +async def test_async_video_to_audio_waits_for_created_task() -> None: + paths: list[str] = [] + + def handler(request: httpx.Request) -> httpx.Response: + paths.append(request.url.path) + if request.method == "POST": + return httpx.Response(200, json={"id": "task-1", "estimatedCost": {"credits": 2}}) + return httpx.Response( + 200, + json={ + "id": "task-1", + "createdAt": "2026-01-01T00:00:00Z", + "status": "SUCCEEDED", + "output": ["https://example.com/audio.mp3"], + }, + ) + + async with AsyncRunwayML( + api_key="test", http_client=httpx.AsyncClient(transport=httpx.MockTransport(handler)) + ) as client: + response = await client.video_to_audio.create( + duration=5, model="mirelo_sfx_2_0", video_uri="https://example.com/video.mp4" + ) + assert response.estimated_cost.credits == 2 + with patch("runwayml.lib.polling.anyio.sleep", new_callable=AsyncMock): + result = await response.wait_for_task_output() + assert result.status == "SUCCEEDED" + assert result.output == ["https://example.com/audio.mp3"] + assert paths == ["/v1/video_to_audio", "/v1/tasks/task-1"]