From 931d00d1db64516822d0e8d9c18818a991b31b39 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Thu, 3 Sep 2026 00:31:21 +0000 Subject: [PATCH 1/2] =?UTF-8?q?##=20Python=20SDK=20Changes:=20*=20`livepee?= =?UTF-8?q?r.generate.live=5Fvideo=5Fto=5Fvideo()`:=20=20=20*=20=20`reques?= =?UTF-8?q?t`=20**Changed**=20(Breaking=20=E2=9A=A0=EF=B8=8F)=20=20=20*=20?= =?UTF-8?q?=20`response`=20**Changed**?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .speakeasy/gen.lock | 13 +- .speakeasy/gen.yaml | 4 +- .speakeasy/logs/changes/changes.html | 121 ++ .speakeasy/logs/changes/changes.md | 10 + .speakeasy/logs/changes/new.openapi.yaml | 1268 +++++++++++++++++ .speakeasy/logs/changes/old.openapi.yaml | 1206 ++++++++++++++++ .speakeasy/workflow.lock | 14 +- RELEASES.md | 12 +- codeSamples.yaml | 3 + docs/models/components/audioresponse.md | 2 +- .../components/livevideotovideoparams.md | 5 +- .../components/livevideotovideoresponse.md | 4 +- docs/models/components/params.md | 9 - docs/models/errors/httperror.md | 2 +- docs/sdks/generate/README.md | 3 + poetry.lock | 10 +- pyproject.toml | 2 +- src/livepeer_ai/_hooks/__init__.py | 1 - src/livepeer_ai/_hooks/sdkhooks.py | 2 - src/livepeer_ai/_version.py | 6 +- src/livepeer_ai/models/components/__init__.py | 4 - .../models/components/audioresponse.py | 4 +- .../components/livevideotovideoparams.py | 29 +- .../components/livevideotovideoresponse.py | 10 + src/livepeer_ai/models/errors/httperror.py | 2 +- 25 files changed, 2686 insertions(+), 60 deletions(-) create mode 100644 .speakeasy/logs/changes/changes.html create mode 100644 .speakeasy/logs/changes/changes.md create mode 100644 .speakeasy/logs/changes/new.openapi.yaml create mode 100644 .speakeasy/logs/changes/old.openapi.yaml delete mode 100644 docs/models/components/params.md diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 7d1221a3..dcae0ebe 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: 2d5dbf5a-62be-411a-9c7b-bc7b6dc79e13 management: - docChecksum: 6657dd3e876a909472f364dc1fe34d72 - docVersion: 0.0.0 + docChecksum: ec9934c13ee59ba9e24e25deb2c1b55f + docVersion: 0.14.1 speakeasyVersion: 1.480.0 generationVersion: 2.499.0 - releaseVersion: 0.10.0 - configChecksum: 2b2d2389ee9ff1be5cd354baf7c62739 + releaseVersion: 0.11.0 + configChecksum: bef910848bdb13f733479db35377041f repoURL: https://github.com/livepeer/livepeer-ai-python.git installationURL: https://github.com/livepeer/livepeer-ai-python.git published: true @@ -62,7 +62,6 @@ generatedFiles: - docs/models/components/masksresponse.md - docs/models/components/media.md - docs/models/components/mediaurl.md - - docs/models/components/params.md - docs/models/components/security.md - docs/models/components/textresponse.md - docs/models/components/texttoimageparams.md @@ -270,10 +269,10 @@ examples: genLiveVideoToVideo: speakeasy-default-gen-live-video-to-video: requestBody: - application/json: {"subscribe_url": "https://soulful-lava.org/", "publish_url": "https://vain-tabletop.biz", "control_url": "", "events_url": "", "model_id": ""} + application/json: {"subscribe_url": "https://soulful-lava.org/", "publish_url": "https://vain-tabletop.biz", "control_url": "", "events_url": "", "model_id": "", "gateway_request_id": "", "manifest_id": "", "stream_id": ""} responses: "200": - application/json: {"subscribe_url": "https://vain-kiss.name", "publish_url": "https://frail-duffel.com", "control_url": "", "events_url": ""} + application/json: {"subscribe_url": "https://vain-kiss.name", "publish_url": "https://frail-duffel.com", "control_url": "", "events_url": "", "request_id": "", "manifest_id": ""} "400": application/json: {"detail": {"msg": ""}} "422": diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 0dbd2d1a..2e436d7b 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -10,10 +10,10 @@ generation: parameterOrderingFeb2024: true requestResponseComponentNamesFeb2024: true auth: - oAuth2ClientCredentialsEnabled: true + oAuth2ClientCredentialsEnabled: false oAuth2PasswordEnabled: false python: - version: 0.10.0 + version: 0.11.0 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/logs/changes/changes.html b/.speakeasy/logs/changes/changes.html new file mode 100644 index 00000000..09618ff0 --- /dev/null +++ b/.speakeasy/logs/changes/changes.html @@ -0,0 +1,121 @@ + + + + + + + SDK Changelog - python + + +

Python SDK Changes:

+ + + + \ No newline at end of file diff --git a/.speakeasy/logs/changes/changes.md b/.speakeasy/logs/changes/changes.md new file mode 100644 index 00000000..88c2377c --- /dev/null +++ b/.speakeasy/logs/changes/changes.md @@ -0,0 +1,10 @@ +## Python SDK Changes: +* `livepeer.generate.live_video_to_video()`: + * `request` **Changed** (Breaking ⚠️) + - `gateway_request_id` **Added** + - `manifest_id` **Added** + - `params` **Changed** (Breaking ⚠️) + - `stream_id` **Added** + * `response` **Changed** + - `manifest_id` **Added** + - `request_id` **Added** diff --git a/.speakeasy/logs/changes/new.openapi.yaml b/.speakeasy/logs/changes/new.openapi.yaml new file mode 100644 index 00000000..d4a11fd6 --- /dev/null +++ b/.speakeasy/logs/changes/new.openapi.yaml @@ -0,0 +1,1268 @@ +# !!Auto-generated by 'gen_openapi.py'. DO NOT EDIT!! +openapi: 3.1.0 +info: + title: Livepeer AI Runner + description: An application to run AI pipelines + version: 0.14.1 +servers: +- url: https://dream-gateway.livepeer.cloud + description: Livepeer Cloud Community Gateway +- url: https://livepeer.studio/api/beta/generate + description: Livepeer Studio Gateway +paths: + /text-to-image: + post: + tags: + - generate + summary: Text To Image + description: Generate images from text prompts. + operationId: genTextToImage + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TextToImageParams' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: textToImage + /image-to-image: + post: + tags: + - generate + summary: Image To Image + description: Apply image transformations to a provided image. + operationId: genImageToImage + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genImageToImage' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: imageToImage + /image-to-video: + post: + tags: + - generate + summary: Image To Video + description: Generate a video from a provided image. + operationId: genImageToVideo + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genImageToVideo' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/VideoResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: imageToVideo + /upscale: + post: + tags: + - generate + summary: Upscale + description: Upscale an image by increasing its resolution. + operationId: genUpscale + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genUpscale' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: upscale + /audio-to-text: + post: + tags: + - generate + summary: Audio To Text + description: Transcribe audio files to text. + operationId: genAudioToText + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genAudioToText' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/TextResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '413': + description: Request Entity Too Large + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '415': + description: Unsupported Media Type + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: audioToText + /segment-anything-2: + post: + tags: + - generate + summary: Segment Anything 2 + description: Segment objects in an image. + operationId: genSegmentAnything2 + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genSegmentAnything2' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/MasksResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: segmentAnything2 + /llm: + post: + tags: + - generate + summary: LLM + description: Generate text using a language model. + operationId: genLLM + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LLMRequest' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/LLMResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: llm + /image-to-text: + post: + tags: + - generate + summary: Image To Text + description: Transform image files to text. + operationId: genImageToText + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genImageToText' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageToTextResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '413': + description: Request Entity Too Large + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: imageToText + /live-video-to-video: + post: + tags: + - generate + summary: Live Video To Video + description: Apply transformations to a live video streamed to the returned + endpoints. + operationId: genLiveVideoToVideo + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LiveVideoToVideoParams' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/LiveVideoToVideoResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: liveVideoToVideo + /text-to-speech: + post: + tags: + - generate + summary: Text To Speech + description: Generate a text-to-speech audio file based on the provided text + input and speaker description. + operationId: genTextToSpeech + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TextToSpeechParams' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/AudioResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: textToSpeech +components: + schemas: + APIError: + properties: + msg: + type: string + title: Msg + description: The error message. + type: object + required: + - msg + title: APIError + description: API error response model. + AudioResponse: + properties: + audio: + $ref: '#/components/schemas/MediaURL' + description: The generated audio. + type: object + required: + - audio + title: AudioResponse + description: Response model for audio generation. + Body_genAudioToText: + properties: + audio: + type: string + format: binary + title: Audio + description: Uploaded audio file to be transcribed. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for transcription. + default: '' + return_timestamps: + type: string + title: Return Timestamps + description: 'Return timestamps for the transcribed text. Supported values: + ''sentence'', ''word'', or a string boolean (''true'' or ''false''). Default + is ''true'' (''sentence''). ''false'' means no timestamps. ''word'' means + word-based timestamps.' + default: 'true' + type: object + required: + - audio + - model_id + title: Body_genAudioToText + Body_genImageToImage: + properties: + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide image generation. + image: + type: string + format: binary + title: Image + description: Uploaded image to modify with the pipeline. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for image generation. + default: '' + loras: + type: string + title: Loras + description: 'A LoRA (Low-Rank Adaptation) model and its corresponding weight + for image generation. Example: { "latent-consistency/lcm-lora-sdxl": 1.0, + "nerijs/pixel-art-xl": 1.2}.' + default: '' + strength: + type: number + title: Strength + description: Degree of transformation applied to the reference image (0 + to 1). + default: 0.8 + guidance_scale: + type: number + title: Guidance Scale + description: Encourages model to generate images closely linked to the text + prompt (higher values may reduce image quality). + default: 7.5 + image_guidance_scale: + type: number + title: Image Guidance Scale + description: Degree to which the generated image is pushed towards the initial + image. + default: 1.5 + negative_prompt: + type: string + title: Negative Prompt + description: Text prompt(s) to guide what to exclude from image generation. + Ignored if guidance_scale < 1. + default: '' + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could + be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher + quality images but slower inference. Modulated by strength. + default: 100 + num_images_per_prompt: + type: integer + title: Num Images Per Prompt + description: Number of images to generate per prompt. + default: 1 + type: object + required: + - prompt + - image + - model_id + title: Body_genImageToImage + Body_genImageToText: + properties: + image: + type: string + format: binary + title: Image + description: Uploaded image to transform with the pipeline. + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide transformation. + default: '' + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for transformation. + default: '' + type: object + required: + - image + - model_id + title: Body_genImageToText + Body_genImageToVideo: + properties: + image: + type: string + format: binary + title: Image + description: Uploaded image to generate a video from. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for video generation. + default: '' + height: + type: integer + title: Height + description: The height in pixels of the generated video. + default: 576 + width: + type: integer + title: Width + description: The width in pixels of the generated video. + default: 1024 + fps: + type: integer + title: Fps + description: The frames per second of the generated video. + default: 6 + motion_bucket_id: + type: integer + title: Motion Bucket Id + description: Used for conditioning the amount of motion for the generation. + The higher the number the more motion will be in the video. + default: 127 + noise_aug_strength: + type: number + title: Noise Aug Strength + description: Amount of noise added to the conditioning image. Higher values + reduce resemblance to the conditioning image and increase motion. + default: 0.02 + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could + be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher + quality images but slower inference. Modulated by strength. + default: 25 + type: object + required: + - image + - model_id + title: Body_genImageToVideo + Body_genSegmentAnything2: + properties: + image: + type: string + format: binary + title: Image + description: Image to segment. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for image generation. + default: '' + point_coords: + type: string + title: Point Coords + description: Nx2 array of point prompts to the model, where each point is + in (X,Y) in pixels. + point_labels: + type: string + title: Point Labels + description: Labels for the point prompts, where 1 indicates a foreground + point and 0 indicates a background point. + box: + type: string + title: Box + description: A length 4 array given as a box prompt to the model, in XYXY + format. + mask_input: + type: string + title: Mask Input + description: A low-resolution mask input to the model, typically from a + previous prediction iteration, with the form 1xHxW (H=W=256 for SAM). + multimask_output: + type: boolean + title: Multimask Output + description: If true, the model will return three masks for ambiguous input + prompts, often producing better masks than a single prediction. + default: true + return_logits: + type: boolean + title: Return Logits + description: If true, returns un-thresholded mask logits instead of a binary + mask. + default: true + normalize_coords: + type: boolean + title: Normalize Coords + description: If true, the point coordinates will be normalized to the range + [0,1], with point_coords expected to be with respect to image dimensions. + default: true + type: object + required: + - image + - model_id + title: Body_genSegmentAnything2 + Body_genUpscale: + properties: + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide upscaled image generation. + image: + type: string + format: binary + title: Image + description: Uploaded image to modify with the pipeline. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for upscaled image generation. + default: '' + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could + be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher + quality images but slower inference. Modulated by strength. + default: 75 + type: object + required: + - prompt + - image + - model_id + title: Body_genUpscale + Chunk: + properties: + timestamp: + items: {} + type: array + title: Timestamp + description: The timestamp of the chunk. + text: + type: string + title: Text + description: The text of the chunk. + type: object + required: + - timestamp + - text + title: Chunk + description: A chunk of text with a timestamp. + HTTPError: + properties: + detail: + $ref: '#/components/schemas/APIError' + description: Detailed error information. + type: object + required: + - detail + title: HTTPError + description: HTTP error response model. + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + type: array + title: Detail + type: object + title: HTTPValidationError + ImageResponse: + properties: + images: + items: + $ref: '#/components/schemas/Media' + type: array + title: Images + description: The generated images. + type: object + required: + - images + title: ImageResponse + description: Response model for image generation. + ImageToTextResponse: + properties: + text: + type: string + title: Text + description: The generated text. + type: object + required: + - text + title: ImageToTextResponse + description: Response model for text generation. + LLMChoice: + properties: + index: + type: integer + title: Index + finish_reason: + type: string + title: Finish Reason + default: '' + delta: + $ref: '#/components/schemas/LLMMessage' + message: + $ref: '#/components/schemas/LLMMessage' + type: object + required: + - index + title: LLMChoice + LLMMessage: + properties: + role: + type: string + title: Role + content: + type: string + title: Content + type: object + required: + - role + - content + title: LLMMessage + LLMRequest: + properties: + messages: + items: + $ref: '#/components/schemas/LLMMessage' + type: array + title: Messages + model: + type: string + title: Model + default: '' + temperature: + type: number + title: Temperature + default: 0.7 + max_tokens: + type: integer + title: Max Tokens + default: 256 + top_p: + type: number + title: Top P + default: 1.0 + top_k: + type: integer + title: Top K + default: -1 + stream: + type: boolean + title: Stream + default: false + type: object + required: + - messages + title: LLMRequest + LLMResponse: + properties: + id: + type: string + title: Id + model: + type: string + title: Model + created: + type: integer + title: Created + usage: + $ref: '#/components/schemas/LLMTokenUsage' + choices: + items: + $ref: '#/components/schemas/LLMChoice' + type: array + title: Choices + type: object + required: + - id + - model + - created + - usage + - choices + title: LLMResponse + LLMTokenUsage: + properties: + prompt_tokens: + type: integer + title: Prompt Tokens + completion_tokens: + type: integer + title: Completion Tokens + total_tokens: + type: integer + title: Total Tokens + type: object + required: + - prompt_tokens + - completion_tokens + - total_tokens + title: LLMTokenUsage + LiveVideoToVideoParams: + properties: + subscribe_url: + type: string + title: Subscribe Url + description: Source URL of the incoming stream to subscribe to. + publish_url: + type: string + title: Publish Url + description: Destination URL of the outgoing stream to publish. + control_url: + type: string + title: Control Url + description: URL for subscribing via Trickle protocol for updates in the + live video-to-video generation params. + default: '' + events_url: + type: string + title: Events Url + description: URL for publishing events via Trickle protocol for pipeline + status and logs. + default: '' + model_id: + type: string + title: Model Id + description: Name of the pipeline to run in the live video to video job. + Notice that this is named model_id for consistency with other routes, + but it does not refer to a Hugging Face model ID. The exact model(s) depends + on the pipeline implementation and might be configurable via the `params` + argument. + default: '' + params: + additionalProperties: true + type: object + title: Params + description: Initial parameters for the pipeline. + default: {} + gateway_request_id: + type: string + title: Gateway Request Id + description: The ID of the Gateway request (for logging purposes). + default: '' + manifest_id: + type: string + title: Manifest Id + description: The manifest ID from the orchestrator (for logging purposes). + default: '' + stream_id: + type: string + title: Stream Id + description: The Stream ID (for logging purposes). + default: '' + type: object + required: + - subscribe_url + - publish_url + - model_id + title: LiveVideoToVideoParams + LiveVideoToVideoResponse: + properties: + subscribe_url: + type: string + title: Subscribe Url + description: Source URL of the incoming stream to subscribe to + publish_url: + type: string + title: Publish Url + description: Destination URL of the outgoing stream to publish to + control_url: + type: string + title: Control Url + description: URL for updating the live video-to-video generation + default: '' + events_url: + type: string + title: Events Url + description: URL for subscribing to events for pipeline status and logs + default: '' + request_id: + type: string + title: Request Id + description: The ID generated for this request + default: '' + manifest_id: + type: string + title: Manifest Id + description: Orchestrator manifest ID for this request + default: '' + type: object + required: + - subscribe_url + - publish_url + title: LiveVideoToVideoResponse + description: Response model for live video-to-video generation. + MasksResponse: + properties: + masks: + type: string + title: Masks + description: The generated masks. + scores: + type: string + title: Scores + description: The model's confidence scores for each generated mask. + logits: + type: string + title: Logits + description: The raw, unnormalized predictions (logits) for the masks. + type: object + required: + - masks + - scores + - logits + title: MasksResponse + description: Response model for object segmentation. + Media: + properties: + url: + type: string + title: Url + description: The URL where the media can be accessed. + seed: + type: integer + title: Seed + description: The seed used to generate the media. + nsfw: + type: boolean + title: Nsfw + description: Whether the media was flagged as NSFW. + type: object + required: + - url + - seed + - nsfw + title: Media + description: A media object containing information about the generated media. + MediaURL: + properties: + url: + type: string + title: Url + description: The URL where the media can be accessed. + type: object + required: + - url + title: MediaURL + description: A URL from which media can be accessed. + TextResponse: + properties: + text: + type: string + title: Text + description: The generated text. + chunks: + items: + $ref: '#/components/schemas/Chunk' + type: array + title: Chunks + description: The generated text chunks. + type: object + required: + - text + - chunks + title: TextResponse + description: Response model for text generation. + TextToImageParams: + properties: + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for image generation. + default: '' + loras: + type: string + title: Loras + description: 'A LoRA (Low-Rank Adaptation) model and its corresponding weight + for image generation. Example: { "latent-consistency/lcm-lora-sdxl": 1.0, + "nerijs/pixel-art-xl": 1.2}.' + default: '' + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide image generation. Separate multiple + prompts with '|' if supported by the model. + height: + type: integer + title: Height + description: The height in pixels of the generated image. + default: 576 + width: + type: integer + title: Width + description: The width in pixels of the generated image. + default: 1024 + guidance_scale: + type: number + title: Guidance Scale + description: Encourages model to generate images closely linked to the text + prompt (higher values may reduce image quality). + default: 7.5 + negative_prompt: + type: string + title: Negative Prompt + description: Text prompt(s) to guide what to exclude from image generation. + Ignored if guidance_scale < 1. + default: '' + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could + be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher + quality images but slower inference. Modulated by strength. + default: 50 + num_images_per_prompt: + type: integer + title: Num Images Per Prompt + description: Number of images to generate per prompt. + default: 1 + type: object + required: + - prompt + - model_id + title: TextToImageParams + TextToSpeechParams: + properties: + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for text to speech generation. + default: '' + text: + type: string + title: Text + description: Text input for speech generation. + default: '' + description: + type: string + title: Description + description: Description of speaker to steer text to speech generation. + default: A male speaker delivers a slightly expressive and animated speech + with a moderate speed and pitch. + type: object + title: TextToSpeechParams + required: + - model_id + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + type: array + title: Location + msg: + type: string + title: Message + type: + type: string + title: Error Type + type: object + required: + - loc + - msg + - type + title: ValidationError + VideoResponse: + properties: + images: + items: + $ref: '#/components/schemas/Media' + type: array + title: Images + description: The generated images. + type: object + required: + - images + title: VideoResponse + description: Response model for image generation. + securitySchemes: + HTTPBearer: + type: http + scheme: bearer diff --git a/.speakeasy/logs/changes/old.openapi.yaml b/.speakeasy/logs/changes/old.openapi.yaml new file mode 100644 index 00000000..a90c6abc --- /dev/null +++ b/.speakeasy/logs/changes/old.openapi.yaml @@ -0,0 +1,1206 @@ +# !!Auto-generated by 'gen_openapi.py'. DO NOT EDIT!! +openapi: 3.1.0 +info: + title: Livepeer AI Runner + description: An application to run AI pipelines + version: 0.0.0 +servers: + - url: https://dream-gateway.livepeer.cloud + description: Livepeer Cloud Community Gateway + - url: https://livepeer.studio/api/beta/generate + description: Livepeer Studio Gateway +paths: + /text-to-image: + post: + tags: + - generate + summary: Text To Image + description: Generate images from text prompts. + operationId: genTextToImage + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TextToImageParams' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: textToImage + /image-to-image: + post: + tags: + - generate + summary: Image To Image + description: Apply image transformations to a provided image. + operationId: genImageToImage + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genImageToImage' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: imageToImage + /image-to-video: + post: + tags: + - generate + summary: Image To Video + description: Generate a video from a provided image. + operationId: genImageToVideo + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genImageToVideo' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/VideoResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: imageToVideo + /upscale: + post: + tags: + - generate + summary: Upscale + description: Upscale an image by increasing its resolution. + operationId: genUpscale + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genUpscale' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: upscale + /audio-to-text: + post: + tags: + - generate + summary: Audio To Text + description: Transcribe audio files to text. + operationId: genAudioToText + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genAudioToText' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/TextResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '413': + description: Request Entity Too Large + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '415': + description: Unsupported Media Type + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: audioToText + /segment-anything-2: + post: + tags: + - generate + summary: Segment Anything 2 + description: Segment objects in an image. + operationId: genSegmentAnything2 + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genSegmentAnything2' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/MasksResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: segmentAnything2 + /llm: + post: + tags: + - generate + summary: LLM + description: Generate text using a language model. + operationId: genLLM + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LLMRequest' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/LLMResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: llm + /image-to-text: + post: + tags: + - generate + summary: Image To Text + description: Transform image files to text. + operationId: genImageToText + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_genImageToText' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ImageToTextResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '413': + description: Request Entity Too Large + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: imageToText + /live-video-to-video: + post: + tags: + - generate + summary: Live Video To Video + description: Apply transformations to a live video streamed to the returned endpoints. + operationId: genLiveVideoToVideo + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LiveVideoToVideoParams' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/LiveVideoToVideoResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: liveVideoToVideo + /text-to-speech: + post: + tags: + - generate + summary: Text To Speech + description: Generate a text-to-speech audio file based on the provided text input and speaker description. + operationId: genTextToSpeech + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TextToSpeechParams' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/AudioResponse' + x-speakeasy-name-override: data + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPError' + '422': + description: Validation Error + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + security: + - HTTPBearer: [] + x-speakeasy-name-override: textToSpeech +components: + schemas: + APIError: + properties: + msg: + type: string + title: Msg + description: The error message. + type: object + required: + - msg + title: APIError + description: API error response model. + AudioResponse: + properties: + audio: + allOf: + - $ref: '#/components/schemas/MediaURL' + description: The generated audio. + type: object + required: + - audio + title: AudioResponse + description: Response model for audio generation. + Body_genAudioToText: + properties: + audio: + type: string + format: binary + title: Audio + description: Uploaded audio file to be transcribed. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for transcription. + default: '' + return_timestamps: + type: string + title: Return Timestamps + description: 'Return timestamps for the transcribed text. Supported values: ''sentence'', ''word'', or a string boolean (''true'' or ''false''). Default is ''true'' (''sentence''). ''false'' means no timestamps. ''word'' means word-based timestamps.' + default: 'true' + type: object + required: + - audio + - model_id + title: Body_genAudioToText + Body_genImageToImage: + properties: + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide image generation. + image: + type: string + format: binary + title: Image + description: Uploaded image to modify with the pipeline. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for image generation. + default: '' + loras: + type: string + title: Loras + description: 'A LoRA (Low-Rank Adaptation) model and its corresponding weight for image generation. Example: { "latent-consistency/lcm-lora-sdxl": 1.0, "nerijs/pixel-art-xl": 1.2}.' + default: '' + strength: + type: number + title: Strength + description: Degree of transformation applied to the reference image (0 to 1). + default: 0.8 + guidance_scale: + type: number + title: Guidance Scale + description: Encourages model to generate images closely linked to the text prompt (higher values may reduce image quality). + default: 7.5 + image_guidance_scale: + type: number + title: Image Guidance Scale + description: Degree to which the generated image is pushed towards the initial image. + default: 1.5 + negative_prompt: + type: string + title: Negative Prompt + description: Text prompt(s) to guide what to exclude from image generation. Ignored if guidance_scale < 1. + default: '' + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher quality images but slower inference. Modulated by strength. + default: 100 + num_images_per_prompt: + type: integer + title: Num Images Per Prompt + description: Number of images to generate per prompt. + default: 1 + type: object + required: + - prompt + - image + - model_id + title: Body_genImageToImage + Body_genImageToText: + properties: + image: + type: string + format: binary + title: Image + description: Uploaded image to transform with the pipeline. + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide transformation. + default: '' + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for transformation. + default: '' + type: object + required: + - image + - model_id + title: Body_genImageToText + Body_genImageToVideo: + properties: + image: + type: string + format: binary + title: Image + description: Uploaded image to generate a video from. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for video generation. + default: '' + height: + type: integer + title: Height + description: The height in pixels of the generated video. + default: 576 + width: + type: integer + title: Width + description: The width in pixels of the generated video. + default: 1024 + fps: + type: integer + title: Fps + description: The frames per second of the generated video. + default: 6 + motion_bucket_id: + type: integer + title: Motion Bucket Id + description: Used for conditioning the amount of motion for the generation. The higher the number the more motion will be in the video. + default: 127 + noise_aug_strength: + type: number + title: Noise Aug Strength + description: Amount of noise added to the conditioning image. Higher values reduce resemblance to the conditioning image and increase motion. + default: 0.02 + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher quality images but slower inference. Modulated by strength. + default: 25 + type: object + required: + - image + - model_id + title: Body_genImageToVideo + Body_genSegmentAnything2: + properties: + image: + type: string + format: binary + title: Image + description: Image to segment. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for image generation. + default: '' + point_coords: + type: string + title: Point Coords + description: Nx2 array of point prompts to the model, where each point is in (X,Y) in pixels. + point_labels: + type: string + title: Point Labels + description: Labels for the point prompts, where 1 indicates a foreground point and 0 indicates a background point. + box: + type: string + title: Box + description: A length 4 array given as a box prompt to the model, in XYXY format. + mask_input: + type: string + title: Mask Input + description: A low-resolution mask input to the model, typically from a previous prediction iteration, with the form 1xHxW (H=W=256 for SAM). + multimask_output: + type: boolean + title: Multimask Output + description: If true, the model will return three masks for ambiguous input prompts, often producing better masks than a single prediction. + default: true + return_logits: + type: boolean + title: Return Logits + description: If true, returns un-thresholded mask logits instead of a binary mask. + default: true + normalize_coords: + type: boolean + title: Normalize Coords + description: If true, the point coordinates will be normalized to the range [0,1], with point_coords expected to be with respect to image dimensions. + default: true + type: object + required: + - image + - model_id + title: Body_genSegmentAnything2 + Body_genUpscale: + properties: + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide upscaled image generation. + image: + type: string + format: binary + title: Image + description: Uploaded image to modify with the pipeline. + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for upscaled image generation. + default: '' + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher quality images but slower inference. Modulated by strength. + default: 75 + type: object + required: + - prompt + - image + - model_id + title: Body_genUpscale + Chunk: + properties: + timestamp: + items: {} + type: array + title: Timestamp + description: The timestamp of the chunk. + text: + type: string + title: Text + description: The text of the chunk. + type: object + required: + - timestamp + - text + title: Chunk + description: A chunk of text with a timestamp. + HTTPError: + properties: + detail: + allOf: + - $ref: '#/components/schemas/APIError' + description: Detailed error information. + type: object + required: + - detail + title: HTTPError + description: HTTP error response model. + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + type: array + title: Detail + type: object + title: HTTPValidationError + ImageResponse: + properties: + images: + items: + $ref: '#/components/schemas/Media' + type: array + title: Images + description: The generated images. + type: object + required: + - images + title: ImageResponse + description: Response model for image generation. + ImageToTextResponse: + properties: + text: + type: string + title: Text + description: The generated text. + type: object + required: + - text + title: ImageToTextResponse + description: Response model for text generation. + LLMChoice: + properties: + index: + type: integer + title: Index + finish_reason: + type: string + title: Finish Reason + default: '' + delta: + allOf: + - $ref: '#/components/schemas/LLMMessage' + message: + allOf: + - $ref: '#/components/schemas/LLMMessage' + type: object + required: + - index + title: LLMChoice + LLMMessage: + properties: + role: + type: string + title: Role + content: + type: string + title: Content + type: object + required: + - role + - content + title: LLMMessage + LLMRequest: + properties: + messages: + items: + $ref: '#/components/schemas/LLMMessage' + type: array + title: Messages + model: + type: string + title: Model + default: '' + temperature: + type: number + title: Temperature + default: 0.7 + max_tokens: + type: integer + title: Max Tokens + default: 256 + top_p: + type: number + title: Top P + default: 1.0 + top_k: + type: integer + title: Top K + default: -1 + stream: + type: boolean + title: Stream + default: false + type: object + required: + - messages + title: LLMRequest + LLMResponse: + properties: + id: + type: string + title: Id + model: + type: string + title: Model + created: + type: integer + title: Created + usage: + $ref: '#/components/schemas/LLMTokenUsage' + choices: + items: + $ref: '#/components/schemas/LLMChoice' + type: array + title: Choices + type: object + required: + - id + - model + - created + - usage + - choices + title: LLMResponse + LLMTokenUsage: + properties: + prompt_tokens: + type: integer + title: Prompt Tokens + completion_tokens: + type: integer + title: Completion Tokens + total_tokens: + type: integer + title: Total Tokens + type: object + required: + - prompt_tokens + - completion_tokens + - total_tokens + title: LLMTokenUsage + LiveVideoToVideoParams: + properties: + subscribe_url: + type: string + title: Subscribe Url + description: Source URL of the incoming stream to subscribe to. + publish_url: + type: string + title: Publish Url + description: Destination URL of the outgoing stream to publish. + control_url: + type: string + title: Control Url + description: URL for subscribing via Trickle protocol for updates in the live video-to-video generation params. + default: '' + events_url: + type: string + title: Events Url + description: URL for publishing events via Trickle protocol for pipeline status and logs. + default: '' + model_id: + type: string + title: Model Id + description: Name of the pipeline to run in the live video to video job. Notice that this is named model_id for consistency with other routes, but it does not refer to a Hugging Face model ID. The exact model(s) depends on the pipeline implementation and might be configurable via the `params` argument. + default: '' + params: + type: object + title: Params + description: Initial parameters for the pipeline. + default: {} + type: object + required: + - subscribe_url + - publish_url + - model_id + title: LiveVideoToVideoParams + LiveVideoToVideoResponse: + properties: + subscribe_url: + type: string + title: Subscribe Url + description: Source URL of the incoming stream to subscribe to + publish_url: + type: string + title: Publish Url + description: Destination URL of the outgoing stream to publish to + control_url: + type: string + title: Control Url + description: URL for updating the live video-to-video generation + default: '' + events_url: + type: string + title: Events Url + description: URL for subscribing to events for pipeline status and logs + default: '' + type: object + required: + - subscribe_url + - publish_url + title: LiveVideoToVideoResponse + description: Response model for live video-to-video generation. + MasksResponse: + properties: + masks: + type: string + title: Masks + description: The generated masks. + scores: + type: string + title: Scores + description: The model's confidence scores for each generated mask. + logits: + type: string + title: Logits + description: The raw, unnormalized predictions (logits) for the masks. + type: object + required: + - masks + - scores + - logits + title: MasksResponse + description: Response model for object segmentation. + Media: + properties: + url: + type: string + title: Url + description: The URL where the media can be accessed. + seed: + type: integer + title: Seed + description: The seed used to generate the media. + nsfw: + type: boolean + title: Nsfw + description: Whether the media was flagged as NSFW. + type: object + required: + - url + - seed + - nsfw + title: Media + description: A media object containing information about the generated media. + MediaURL: + properties: + url: + type: string + title: Url + description: The URL where the media can be accessed. + type: object + required: + - url + title: MediaURL + description: A URL from which media can be accessed. + TextResponse: + properties: + text: + type: string + title: Text + description: The generated text. + chunks: + items: + $ref: '#/components/schemas/Chunk' + type: array + title: Chunks + description: The generated text chunks. + type: object + required: + - text + - chunks + title: TextResponse + description: Response model for text generation. + TextToImageParams: + properties: + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for image generation. + default: '' + loras: + type: string + title: Loras + description: 'A LoRA (Low-Rank Adaptation) model and its corresponding weight for image generation. Example: { "latent-consistency/lcm-lora-sdxl": 1.0, "nerijs/pixel-art-xl": 1.2}.' + default: '' + prompt: + type: string + title: Prompt + description: Text prompt(s) to guide image generation. Separate multiple prompts with '|' if supported by the model. + height: + type: integer + title: Height + description: The height in pixels of the generated image. + default: 576 + width: + type: integer + title: Width + description: The width in pixels of the generated image. + default: 1024 + guidance_scale: + type: number + title: Guidance Scale + description: Encourages model to generate images closely linked to the text prompt (higher values may reduce image quality). + default: 7.5 + negative_prompt: + type: string + title: Negative Prompt + description: Text prompt(s) to guide what to exclude from image generation. Ignored if guidance_scale < 1. + default: '' + safety_check: + type: boolean + title: Safety Check + description: Perform a safety check to estimate if generated images could be offensive or harmful. + default: true + seed: + type: integer + title: Seed + description: Seed for random number generation. + num_inference_steps: + type: integer + title: Num Inference Steps + description: Number of denoising steps. More steps usually lead to higher quality images but slower inference. Modulated by strength. + default: 50 + num_images_per_prompt: + type: integer + title: Num Images Per Prompt + description: Number of images to generate per prompt. + default: 1 + type: object + required: + - prompt + - model_id + title: TextToImageParams + TextToSpeechParams: + properties: + model_id: + type: string + title: Model Id + description: Hugging Face model ID used for text to speech generation. + default: '' + text: + type: string + title: Text + description: Text input for speech generation. + default: '' + description: + type: string + title: Description + description: Description of speaker to steer text to speech generation. + default: A male speaker delivers a slightly expressive and animated speech with a moderate speed and pitch. + type: object + title: TextToSpeechParams + required: + - model_id + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + type: array + title: Location + msg: + type: string + title: Message + type: + type: string + title: Error Type + type: object + required: + - loc + - msg + - type + title: ValidationError + VideoResponse: + properties: + images: + items: + $ref: '#/components/schemas/Media' + type: array + title: Images + description: The generated images. + type: object + required: + - images + title: VideoResponse + description: Response model for image generation. + securitySchemes: + HTTPBearer: + type: http + scheme: bearer diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 3b254869..83aef615 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,12 +2,12 @@ speakeasyVersion: 1.480.0 sources: livepeer_ai-OAS: sourceNamespace: livepeer-ai-oas - sourceRevisionDigest: sha256:0f47b792f474d38abc86f9276b065e4047dc61d6c0899a85a11008e48857db3a - sourceBlobDigest: sha256:7c0df39c1c5f0ffe580b63f5dc6cb0f81181f5361a80f63f41314cf81d0f3bf4 + sourceRevisionDigest: sha256:c08b4efb88a79bec84fc401648fdc358f93a8187dfe69bc5583a95958736f075 + sourceBlobDigest: sha256:39ec4a50475c77391071c743e0ca4984f18ee908b45d5150a6ae12be793ed3c6 tags: - latest - - speakeasy-sdk-regen-1736900210 - - 0.0.0 + - speakeasy-sdk-regen-1781139145 + - 0.14.1 targets: livepeer-ai: source: livepeer_ai-OAS @@ -17,10 +17,10 @@ targets: livepeer-ai-python: source: livepeer_ai-OAS sourceNamespace: livepeer-ai-oas - sourceRevisionDigest: sha256:0f47b792f474d38abc86f9276b065e4047dc61d6c0899a85a11008e48857db3a - sourceBlobDigest: sha256:7c0df39c1c5f0ffe580b63f5dc6cb0f81181f5361a80f63f41314cf81d0f3bf4 + sourceRevisionDigest: sha256:c08b4efb88a79bec84fc401648fdc358f93a8187dfe69bc5583a95958736f075 + sourceBlobDigest: sha256:39ec4a50475c77391071c743e0ca4984f18ee908b45d5150a6ae12be793ed3c6 codeSamplesNamespace: code-samples-python-livepeer-python - codeSamplesRevisionDigest: sha256:c8ec9be643b93d4a2f53b416df7270cf0cdb44cee849f5de6d2501edef3d2fa9 + codeSamplesRevisionDigest: sha256:9889a545b5f73f7b527e30e19b4cc6f355aabe4ed50d21c55ae3990da416ada8 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/RELEASES.md b/RELEASES.md index 60caa97a..04b9d302 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -138,4 +138,14 @@ Based on: ### Generated - [python v0.10.0] . ### Releases -- [PyPI v0.10.0] https://pypi.org/project/livepeer-ai/0.10.0 - . \ No newline at end of file +- [PyPI v0.10.0] https://pypi.org/project/livepeer-ai/0.10.0 - . + +## 2026-09-03 00:30:04 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.480.0 (2.499.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.11.0] . +### Releases +- [PyPI v0.11.0] https://pypi.org/project/livepeer-ai/0.11.0 - . \ No newline at end of file diff --git a/codeSamples.yaml b/codeSamples.yaml index 261c4e1e..e38cce5c 100644 --- a/codeSamples.yaml +++ b/codeSamples.yaml @@ -135,6 +135,9 @@ actions: "control_url": "", "events_url": "", "model_id": "", + "gateway_request_id": "", + "manifest_id": "", + "stream_id": "", }) assert res.live_video_to_video_response is not None diff --git a/docs/models/components/audioresponse.md b/docs/models/components/audioresponse.md index 0ea3f85a..a2b6c52b 100644 --- a/docs/models/components/audioresponse.md +++ b/docs/models/components/audioresponse.md @@ -7,4 +7,4 @@ Response model for audio generation. | Field | Type | Required | Description | | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | -| `audio` | [components.MediaURL](../../models/components/mediaurl.md) | :heavy_check_mark: | The generated audio. | \ No newline at end of file +| `audio` | [components.MediaURL](../../models/components/mediaurl.md) | :heavy_check_mark: | A URL from which media can be accessed. | \ No newline at end of file diff --git a/docs/models/components/livevideotovideoparams.md b/docs/models/components/livevideotovideoparams.md index 00cdce28..100da605 100644 --- a/docs/models/components/livevideotovideoparams.md +++ b/docs/models/components/livevideotovideoparams.md @@ -10,4 +10,7 @@ | `control_url` | *Optional[str]* | :heavy_minus_sign: | URL for subscribing via Trickle protocol for updates in the live video-to-video generation params. | | `events_url` | *Optional[str]* | :heavy_minus_sign: | URL for publishing events via Trickle protocol for pipeline status and logs. | | `model_id` | *Optional[str]* | :heavy_minus_sign: | Name of the pipeline to run in the live video to video job. Notice that this is named model_id for consistency with other routes, but it does not refer to a Hugging Face model ID. The exact model(s) depends on the pipeline implementation and might be configurable via the `params` argument. | -| `params` | [Optional[components.Params]](../../models/components/params.md) | :heavy_minus_sign: | Initial parameters for the pipeline. | \ No newline at end of file +| `params` | Dict[str, *Any*] | :heavy_minus_sign: | Initial parameters for the pipeline. | +| `gateway_request_id` | *Optional[str]* | :heavy_minus_sign: | The ID of the Gateway request (for logging purposes). | +| `manifest_id` | *Optional[str]* | :heavy_minus_sign: | The manifest ID from the orchestrator (for logging purposes). | +| `stream_id` | *Optional[str]* | :heavy_minus_sign: | The Stream ID (for logging purposes). | \ No newline at end of file diff --git a/docs/models/components/livevideotovideoresponse.md b/docs/models/components/livevideotovideoresponse.md index be6f816c..a0a3620c 100644 --- a/docs/models/components/livevideotovideoresponse.md +++ b/docs/models/components/livevideotovideoresponse.md @@ -10,4 +10,6 @@ Response model for live video-to-video generation. | `subscribe_url` | *str* | :heavy_check_mark: | Source URL of the incoming stream to subscribe to | | `publish_url` | *str* | :heavy_check_mark: | Destination URL of the outgoing stream to publish to | | `control_url` | *Optional[str]* | :heavy_minus_sign: | URL for updating the live video-to-video generation | -| `events_url` | *Optional[str]* | :heavy_minus_sign: | URL for subscribing to events for pipeline status and logs | \ No newline at end of file +| `events_url` | *Optional[str]* | :heavy_minus_sign: | URL for subscribing to events for pipeline status and logs | +| `request_id` | *Optional[str]* | :heavy_minus_sign: | The ID generated for this request | +| `manifest_id` | *Optional[str]* | :heavy_minus_sign: | Orchestrator manifest ID for this request | \ No newline at end of file diff --git a/docs/models/components/params.md b/docs/models/components/params.md deleted file mode 100644 index 11fac312..00000000 --- a/docs/models/components/params.md +++ /dev/null @@ -1,9 +0,0 @@ -# Params - -Initial parameters for the pipeline. - - -## Fields - -| Field | Type | Required | Description | -| ----------- | ----------- | ----------- | ----------- | \ No newline at end of file diff --git a/docs/models/errors/httperror.md b/docs/models/errors/httperror.md index 96dfe158..4d753e3f 100644 --- a/docs/models/errors/httperror.md +++ b/docs/models/errors/httperror.md @@ -7,4 +7,4 @@ HTTP error response model. | Field | Type | Required | Description | | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | -| `detail` | [components.APIError](../../models/components/apierror.md) | :heavy_check_mark: | Detailed error information. | \ No newline at end of file +| `detail` | [components.APIError](../../models/components/apierror.md) | :heavy_check_mark: | API error response model. | \ No newline at end of file diff --git a/docs/sdks/generate/README.md b/docs/sdks/generate/README.md index 787807da..12cd9f3f 100644 --- a/docs/sdks/generate/README.md +++ b/docs/sdks/generate/README.md @@ -452,6 +452,9 @@ with Livepeer( "control_url": "", "events_url": "", "model_id": "", + "gateway_request_id": "", + "manifest_id": "", + "stream_id": "", }) assert res.live_video_to_video_response is not None diff --git a/poetry.lock b/poetry.lock index 431e79a2..92d991e3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -32,7 +32,7 @@ typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\""] trio = ["trio (>=0.23)"] [[package]] @@ -175,7 +175,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -328,7 +328,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" @@ -461,7 +461,7 @@ colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=0.3.6", markers = "python_version == \"3.11\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" diff --git a/pyproject.toml b/pyproject.toml index 3fe1d11c..536ac5d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "livepeer-ai" -version = "0.10.0" +version = "0.11.0" description = "Python Client SDK for the Livepeer AI API." authors = [{ name = "Speakeasy" },] readme = "README-PYPI.md" diff --git a/src/livepeer_ai/_hooks/__init__.py b/src/livepeer_ai/_hooks/__init__.py index 2ee66cdd..e763be4b 100644 --- a/src/livepeer_ai/_hooks/__init__.py +++ b/src/livepeer_ai/_hooks/__init__.py @@ -2,4 +2,3 @@ from .sdkhooks import * from .types import * -from .registration import * diff --git a/src/livepeer_ai/_hooks/sdkhooks.py b/src/livepeer_ai/_hooks/sdkhooks.py index fc014f8b..93c9da54 100644 --- a/src/livepeer_ai/_hooks/sdkhooks.py +++ b/src/livepeer_ai/_hooks/sdkhooks.py @@ -11,7 +11,6 @@ AfterErrorHook, Hooks, ) -from .registration import init_hooks from typing import List, Optional, Tuple from livepeer_ai.httpclient import HttpClient @@ -22,7 +21,6 @@ def __init__(self) -> None: self.before_request_hooks: List[BeforeRequestHook] = [] self.after_success_hooks: List[AfterSuccessHook] = [] self.after_error_hooks: List[AfterErrorHook] = [] - init_hooks(self) def register_sdk_init_hook(self, hook: SDKInitHook) -> None: self.sdk_init_hooks.append(hook) diff --git a/src/livepeer_ai/_version.py b/src/livepeer_ai/_version.py index 0775e8c2..f951fda6 100644 --- a/src/livepeer_ai/_version.py +++ b/src/livepeer_ai/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "livepeer-ai" -__version__: str = "0.10.0" -__openapi_doc_version__: str = "0.0.0" +__version__: str = "0.11.0" +__openapi_doc_version__: str = "0.14.1" __gen_version__: str = "2.499.0" -__user_agent__: str = "speakeasy-sdk/python 0.10.0 2.499.0 0.0.0 livepeer-ai" +__user_agent__: str = "speakeasy-sdk/python 0.11.0 2.499.0 0.14.1 livepeer-ai" try: if __package__ is not None: diff --git a/src/livepeer_ai/models/components/__init__.py b/src/livepeer_ai/models/components/__init__.py index 469c48b6..a2f6262b 100644 --- a/src/livepeer_ai/models/components/__init__.py +++ b/src/livepeer_ai/models/components/__init__.py @@ -45,8 +45,6 @@ from .livevideotovideoparams import ( LiveVideoToVideoParams, LiveVideoToVideoParamsTypedDict, - Params, - ParamsTypedDict, ) from .livevideotovideoresponse import ( LiveVideoToVideoResponse, @@ -132,8 +130,6 @@ "MediaTypedDict", "MediaURL", "MediaURLTypedDict", - "Params", - "ParamsTypedDict", "Security", "SecurityTypedDict", "TextResponse", diff --git a/src/livepeer_ai/models/components/audioresponse.py b/src/livepeer_ai/models/components/audioresponse.py index 38ce89af..d50c7cf8 100644 --- a/src/livepeer_ai/models/components/audioresponse.py +++ b/src/livepeer_ai/models/components/audioresponse.py @@ -10,11 +10,11 @@ class AudioResponseTypedDict(TypedDict): r"""Response model for audio generation.""" audio: MediaURLTypedDict - r"""The generated audio.""" + r"""A URL from which media can be accessed.""" class AudioResponse(BaseModel): r"""Response model for audio generation.""" audio: MediaURL - r"""The generated audio.""" + r"""A URL from which media can be accessed.""" diff --git a/src/livepeer_ai/models/components/livevideotovideoparams.py b/src/livepeer_ai/models/components/livevideotovideoparams.py index 3afd049c..7ab6d8d5 100644 --- a/src/livepeer_ai/models/components/livevideotovideoparams.py +++ b/src/livepeer_ai/models/components/livevideotovideoparams.py @@ -2,18 +2,10 @@ from __future__ import annotations from livepeer_ai.types import BaseModel -from typing import Optional +from typing import Any, Dict, Optional from typing_extensions import NotRequired, TypedDict -class ParamsTypedDict(TypedDict): - r"""Initial parameters for the pipeline.""" - - -class Params(BaseModel): - r"""Initial parameters for the pipeline.""" - - class LiveVideoToVideoParamsTypedDict(TypedDict): subscribe_url: str r"""Source URL of the incoming stream to subscribe to.""" @@ -25,8 +17,14 @@ class LiveVideoToVideoParamsTypedDict(TypedDict): r"""URL for publishing events via Trickle protocol for pipeline status and logs.""" model_id: NotRequired[str] r"""Name of the pipeline to run in the live video to video job. Notice that this is named model_id for consistency with other routes, but it does not refer to a Hugging Face model ID. The exact model(s) depends on the pipeline implementation and might be configurable via the `params` argument.""" - params: NotRequired[ParamsTypedDict] + params: NotRequired[Dict[str, Any]] r"""Initial parameters for the pipeline.""" + gateway_request_id: NotRequired[str] + r"""The ID of the Gateway request (for logging purposes).""" + manifest_id: NotRequired[str] + r"""The manifest ID from the orchestrator (for logging purposes).""" + stream_id: NotRequired[str] + r"""The Stream ID (for logging purposes).""" class LiveVideoToVideoParams(BaseModel): @@ -45,5 +43,14 @@ class LiveVideoToVideoParams(BaseModel): model_id: Optional[str] = "" r"""Name of the pipeline to run in the live video to video job. Notice that this is named model_id for consistency with other routes, but it does not refer to a Hugging Face model ID. The exact model(s) depends on the pipeline implementation and might be configurable via the `params` argument.""" - params: Optional[Params] = None + params: Optional[Dict[str, Any]] = None r"""Initial parameters for the pipeline.""" + + gateway_request_id: Optional[str] = "" + r"""The ID of the Gateway request (for logging purposes).""" + + manifest_id: Optional[str] = "" + r"""The manifest ID from the orchestrator (for logging purposes).""" + + stream_id: Optional[str] = "" + r"""The Stream ID (for logging purposes).""" diff --git a/src/livepeer_ai/models/components/livevideotovideoresponse.py b/src/livepeer_ai/models/components/livevideotovideoresponse.py index cba67eea..c23d05eb 100644 --- a/src/livepeer_ai/models/components/livevideotovideoresponse.py +++ b/src/livepeer_ai/models/components/livevideotovideoresponse.py @@ -17,6 +17,10 @@ class LiveVideoToVideoResponseTypedDict(TypedDict): r"""URL for updating the live video-to-video generation""" events_url: NotRequired[str] r"""URL for subscribing to events for pipeline status and logs""" + request_id: NotRequired[str] + r"""The ID generated for this request""" + manifest_id: NotRequired[str] + r"""Orchestrator manifest ID for this request""" class LiveVideoToVideoResponse(BaseModel): @@ -33,3 +37,9 @@ class LiveVideoToVideoResponse(BaseModel): events_url: Optional[str] = "" r"""URL for subscribing to events for pipeline status and logs""" + + request_id: Optional[str] = "" + r"""The ID generated for this request""" + + manifest_id: Optional[str] = "" + r"""Orchestrator manifest ID for this request""" diff --git a/src/livepeer_ai/models/errors/httperror.py b/src/livepeer_ai/models/errors/httperror.py index 78bcc592..4fa4c63c 100644 --- a/src/livepeer_ai/models/errors/httperror.py +++ b/src/livepeer_ai/models/errors/httperror.py @@ -8,7 +8,7 @@ class HTTPErrorData(BaseModel): detail: components_apierror.APIError - r"""Detailed error information.""" + r"""API error response model.""" class HTTPError(Exception): From 7ab7f1b6615022b5f10847f5979223f5d1ae6a85 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 00:31:27 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow