Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.3.0"
".": "0.4.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 2
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/luma-ai-karanganesan/luma-agents-8c7d85e2069e3534dcda3725e7302111b927d91ce792eb7273b3a87be3ffc8de.yml
openapi_spec_hash: a481b3007a224955e993b2bd9148e596
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/luma-ai-karanganesan/luma-agents-623f635887ce1fa0ae27e34bd57c3899f711c692fe384490a1720bfa433b5181.yml
openapi_spec_hash: a10aeaa02d4f855626f29b5ac8f8d30f
config_hash: 568a665c8e6fc263237a92e593afc737
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.4.0 (2026-06-11)

Full Changelog: [v0.3.0...v0.4.0](https://github.com/lumalabs/luma-agents-python/compare/v0.3.0...v0.4.0)

### Features

* **api:** add keyframe_indexes and keyframes fields to video_options ([f8d3c16](https://github.com/lumalabs/luma-agents-python/commit/f8d3c165670eebfd44609c3d7c51772745bfcf59))

## 0.3.0 (2026-06-08)

Full Changelog: [v0.2.0...v0.3.0](https://github.com/lumalabs/luma-agents-python/compare/v0.2.0...v0.3.0)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "luma-agents"
version = "0.3.0"
version = "0.4.0"
description = "The official Python library for the luma API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/luma_agents/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "luma_agents"
__version__ = "0.3.0" # x-release-please-version
__version__ = "0.4.0" # x-release-please-version
2 changes: 1 addition & 1 deletion src/luma_agents/types/video_edit_options_param.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
class VideoEditOptionsParam(TypedDict, total=False):
"""Ray 3.2 video-to-video edit controls.

Only valid under `video.edit` when `type` is `video_edit`.
Only valid under `video.edit` when `type` is `video_edit`. The source video must be 18 seconds or shorter; output duration matches the source.
"""

auto_controls: Optional[bool]
Expand Down
31 changes: 27 additions & 4 deletions src/luma_agents/types/video_options_param.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from __future__ import annotations

from typing import Optional
from typing import Iterable, Optional
from typing_extensions import TypedDict

from .video_duration import VideoDuration
Expand All @@ -26,7 +26,8 @@ class VideoOptionsParam(TypedDict, total=False):
edit: Optional[VideoEditOptionsParam]
"""Ray 3.2 video-to-video edit controls.

Only valid under `video.edit` when `type` is `video_edit`.
Only valid under `video.edit` when `type` is `video_edit`. The source video must
be 18 seconds or shorter; output duration matches the source.
"""

end_frame: Optional[ImageRefParam]
Expand All @@ -46,6 +47,25 @@ class VideoOptionsParam(TypedDict, total=False):
hdr: Optional[bool]
"""Generate HDR video. Requires HDR access. Not supported for video_reframe."""

keyframe_indexes: Optional[Iterable[int]]
"""
Parallel list of non-negative, unique output-frame positions where each
keyframes[i] is anchored, in the duration x 24fps grid (5s -> 0..120, 10s ->
0..240). Must match keyframes in length.
"""

keyframes: Optional[Iterable[ImageRefParam]]
"""
Image-to-video guide frames (type=video only), each pinned to an output-frame
position via the parallel keyframe_indexes. 1-64 anchors: a single anchor is a
valid start-pinned i2v (an alternate to start_frame), and any count up to 64
places guide frames at arbitrary positions. Unlike start_frame/end_frame (the
legacy 2-frame surface), this supports arbitrary positions, 10s durations, and
HDR. Mutually exclusive with start_frame / end_frame / loop. Only supported on
model ray-3.2. For video-to-video keyframes use video.edit.keyframes on
type=video_edit instead.
"""

loop: Optional[bool]
"""Generate a seamlessly looping video.

Expand All @@ -55,8 +75,11 @@ class VideoOptionsParam(TypedDict, total=False):
resolution: Optional[VideoResolution]
"""Ray 3.2 video output resolution.

1080p is public for video generation; video_reframe 1080p is still rolling out
and may return a coming-soon validation error until enabled for the caller.
360p is the draft tier (fast, low-cost previews), accepted on type=video,
video_edit, and video_reframe; on type=video it is SDR-only (not valid with
hdr=true). 1080p is public for video generation; video_reframe 1080p is still
rolling out and may return a coming-soon validation error until enabled for the
caller.
"""

source_position: Optional[SourcePositionParam]
Expand Down
2 changes: 1 addition & 1 deletion src/luma_agents/types/video_resolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@

__all__ = ["VideoResolution"]

VideoResolution: TypeAlias = Literal["540p", "720p", "1080p"]
VideoResolution: TypeAlias = Literal["360p", "540p", "720p", "1080p"]
22 changes: 20 additions & 2 deletions tests/api_resources/test_generations.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,17 @@ def test_method_create_with_all_params(self, client: Luma) -> None:
},
"exr_export": True,
"hdr": True,
"keyframe_indexes": [0],
"keyframes": [
{
"data": "data",
"generation_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
"media_type": "media_type",
"url": "url",
}
],
"loop": True,
"resolution": "540p",
"resolution": "360p",
"source_position": {
"h_norm": 1,
"w_norm": 1,
Expand Down Expand Up @@ -250,8 +259,17 @@ async def test_method_create_with_all_params(self, async_client: AsyncLuma) -> N
},
"exr_export": True,
"hdr": True,
"keyframe_indexes": [0],
"keyframes": [
{
"data": "data",
"generation_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
"media_type": "media_type",
"url": "url",
}
],
"loop": True,
"resolution": "540p",
"resolution": "360p",
"source_position": {
"h_norm": 1,
"w_norm": 1,
Expand Down