diff --git a/built-in-nodes/partner-node/video/luma/luma-concepts.mdx b/built-in-nodes/partner-node/video/luma/luma-concepts.mdx
deleted file mode 100644
index b14a9e0d7c..0000000000
--- a/built-in-nodes/partner-node/video/luma/luma-concepts.mdx
+++ /dev/null
@@ -1,111 +0,0 @@
----
-title: "Luma Concepts - ComfyUI Native Node Documentation"
-description: "A helper node that provides concept guidance for Luma image generation"
-sidebarTitle: "Luma Concepts"
-icon: "circle"
----
-
-
-
-The Luma Concepts node allows you to apply predefined camera concepts to the Luma generation process, providing precise control over camera angles and perspectives without complex prompt descriptions.
-
-## Node Function
-
-This node serves as a helper tool for Luma generation nodes, enabling users to select and apply predefined camera concepts. These concepts include different shooting angles (like overhead or low angle), camera distances (like close-up or long shot), and movement styles (like push-in or follow). It simplifies the creative workflow by providing an intuitive way to control camera effects in the generated output.
-
-## Parameters
-
-### Basic Parameters
-
-| Parameter | Type | Description |
-| --------- | ------ | ---------------------------------------------------------- |
-| concept1 | select | First camera concept choice, includes various presets and "none" |
-| concept2 | select | Second camera concept choice, includes various presets and "none" |
-| concept3 | select | Third camera concept choice, includes various presets and "none" |
-| concept4 | select | Fourth camera concept choice, includes various presets and "none" |
-
-### Optional Parameters
-
-| Parameter | Type | Description |
-| ------------ | ------------- | --------------------------------------------------------- |
-| luma_concepts| LUMA_CONCEPTS | Optional Camera Concepts to merge with selected concepts |
-
-### Output
-
-| Output | Type | Description |
-| ------------- | ------------- | ---------------------------------------------- |
-| luma_concepts | LUMA_CONCEPT | Combined object containing all selected concepts|
-
-## Usage Examples
-
-
-Luma Text to Video Workflow Example
-
-
-
-Luma Image to Video Workflow Example
-
-
-## How It Works
-
-The Luma Concepts node offers a variety of predefined camera concepts including:
-- Camera distances (close-up, medium shot, long shot)
-- View angles (eye level, overhead, low angle)
-- Movement types (push-in, follow, orbit)
-- Special effects (handheld, stabilized, floating)
-
-Users can select up to 4 concepts to use together. The node creates an object containing the selected camera concepts, which is then passed to Luma generation nodes. During generation, Luma AI uses these camera concepts to influence the viewpoint and composition of the output, ensuring the results reflect the chosen photographic effects.
-
-By combining multiple camera concepts, users can create complex camera guidance without writing detailed prompt descriptions. This is particularly useful when specific camera angles or compositions are needed.
-
-## Source Code
-
-[Node source code (Updated on 2025-05-03)]
-
-```python
-
-class LumaConceptsNode(ComfyNodeABC):
- """
- Holds one or more Camera Concepts for use with Luma Text to Video and Luma Image to Video nodes.
- """
-
- RETURN_TYPES = (LumaIO.LUMA_CONCEPTS,)
- RETURN_NAMES = ("luma_concepts",)
- DESCRIPTION = cleandoc(__doc__ or "") # Handle potential None value
- FUNCTION = "create_concepts"
- CATEGORY = "api node/image/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "concept1": (get_luma_concepts(include_none=True),),
- "concept2": (get_luma_concepts(include_none=True),),
- "concept3": (get_luma_concepts(include_none=True),),
- "concept4": (get_luma_concepts(include_none=True),),
- },
- "optional": {
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to add to the ones chosen here."
- },
- ),
- },
- }
-
- def create_concepts(
- self,
- concept1: str,
- concept2: str,
- concept3: str,
- concept4: str,
- luma_concepts: LumaConceptChain = None,
- ):
- chain = LumaConceptChain(str_list=[concept1, concept2, concept3, concept4])
- if luma_concepts is not None:
- chain = luma_concepts.clone_and_merge(chain)
- return (chain,)
-
-
-```
\ No newline at end of file
diff --git a/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx b/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx
deleted file mode 100644
index b8c2578e68..0000000000
--- a/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx
+++ /dev/null
@@ -1,210 +0,0 @@
----
-title: "Luma Image to Video - ComfyUI Native Partner Nodes Documentation"
-description: "A node that converts static images to dynamic videos using Luma AI"
-sidebarTitle: "Luma Image to Video"
-icon: "circle"
----
-
-
-
-The Luma Image to Video node uses Luma AI's technology to transform static images into smooth, dynamic videos, bringing your images to life.
-
-## Node Function
-
-This node connects to Luma AI's image-to-video API, allowing users to create dynamic videos from input images. It understands the image content and generates natural, coherent motion while maintaining the original visual style. Combined with text prompts, users can precisely control the video's dynamic effects.
-
-## Parameters
-
-### Basic Parameters
-
-| Parameter | Type | Default | Description |
-| ---------- | ------- | ------- | ------------------------------------------------------- |
-| prompt | string | "" | Text prompt describing video motion and content |
-| model | select | - | Video generation model to use |
-| resolution | select | "540p" | Output video resolution |
-| duration | select | - | Video length options |
-| loop | boolean | False | Whether to loop the video |
-| seed | integer | 0 | Seed value for node rerun, results are nondeterministic |
-
-### Optional Parameters
-
-| Parameter | Type | Description |
-| ------------- | ------------- | ----------------------------------------------------- |
-| first_image | image | First frame of video (required if no last_image) |
-| last_image | image | Last frame of video (required if no first_image) |
-| luma_concepts | LUMA_CONCEPTS | Concepts for controlling camera motion and shot style |
-
-### Requirements
-
-- Either **first_image** or **last_image** must be provided
-- Each image input (first_image and last_image) accepts only 1 image
-
-### Output
-
-| Output | Type | Description |
-| ------ | ----- | --------------- |
-| VIDEO | video | Generated video |
-
-## Usage Example
-
-
-Luma Image to Video Workflow Tutorial
-
-
-## Source Code
-
-[Node Source Code (Updated 2025-05-03)]
-```python
-
-class LumaImageToVideoGenerationNode(ComfyNodeABC):
- """
- Generates videos synchronously based on prompt, input images, and output_size.
- """
-
- RETURN_TYPES = (IO.VIDEO,)
- DESCRIPTION = cleandoc(__doc__ or "") # Handle potential None value
- FUNCTION = "api_call"
- API_NODE = True
- CATEGORY = "api node/video/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "prompt": (
- IO.STRING,
- {
- "multiline": True,
- "default": "",
- "tooltip": "Prompt for the video generation",
- },
- ),
- "model": ([model.value for model in LumaVideoModel],),
- # "aspect_ratio": ([ratio.value for ratio in LumaAspectRatio], {
- # "default": LumaAspectRatio.ratio_16_9,
- # }),
- "resolution": (
- [resolution.value for resolution in LumaVideoOutputResolution],
- {
- "default": LumaVideoOutputResolution.res_540p,
- },
- ),
- "duration": ([dur.value for dur in LumaVideoModelOutputDuration],),
- "loop": (
- IO.BOOLEAN,
- {
- "default": False,
- },
- ),
- "seed": (
- IO.INT,
- {
- "default": 0,
- "min": 0,
- "max": 0xFFFFFFFFFFFFFFFF,
- "control_after_generate": True,
- "tooltip": "Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.",
- },
- ),
- },
- "optional": {
- "first_image": (
- IO.IMAGE,
- {"tooltip": "First frame of generated video."},
- ),
- "last_image": (IO.IMAGE, {"tooltip": "Last frame of generated video."}),
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to dictate camera motion via the Luma Concepts node."
- },
- ),
- },
- "hidden": {
- "auth_token": "AUTH_TOKEN_COMFY_ORG",
- },
- }
-
- def api_call(
- self,
- prompt: str,
- model: str,
- resolution: str,
- duration: str,
- loop: bool,
- seed,
- first_image: torch.Tensor = None,
- last_image: torch.Tensor = None,
- luma_concepts: LumaConceptChain = None,
- auth_token=None,
- **kwargs,
- ):
- if first_image is None and last_image is None:
- raise Exception(
- "At least one of first_image and last_image requires an input."
- )
- keyframes = self._convert_to_keyframes(first_image, last_image, auth_token)
- duration = duration if model != LumaVideoModel.ray_1_6 else None
- resolution = resolution if model != LumaVideoModel.ray_1_6 else None
-
- operation = SynchronousOperation(
- endpoint=ApiEndpoint(
- path="/proxy/luma/generations",
- method=HttpMethod.POST,
- request_model=LumaGenerationRequest,
- response_model=LumaGeneration,
- ),
- request=LumaGenerationRequest(
- prompt=prompt,
- model=model,
- aspect_ratio=LumaAspectRatio.ratio_16_9, # ignored, but still needed by the API for some reason
- resolution=resolution,
- duration=duration,
- loop=loop,
- keyframes=keyframes,
- concepts=luma_concepts.create_api_model() if luma_concepts else None,
- ),
- auth_token=auth_token,
- )
- response_api: LumaGeneration = operation.execute()
-
- operation = PollingOperation(
- poll_endpoint=ApiEndpoint(
- path=f"/proxy/luma/generations/{response_api.id}",
- method=HttpMethod.GET,
- request_model=EmptyRequest,
- response_model=LumaGeneration,
- ),
- completed_statuses=[LumaState.completed],
- failed_statuses=[LumaState.failed],
- status_extractor=lambda x: x.state,
- auth_token=auth_token,
- )
- response_poll = operation.execute()
-
- vid_response = requests.get(response_poll.assets.video)
- return (VideoFromFile(BytesIO(vid_response.content)),)
-
- def _convert_to_keyframes(
- self,
- first_image: torch.Tensor = None,
- last_image: torch.Tensor = None,
- auth_token=None,
- ):
- if first_image is None and last_image is None:
- return None
- frame0 = None
- frame1 = None
- if first_image is not None:
- download_urls = upload_images_to_comfyapi(
- first_image, max_images=1, auth_token=auth_token
- )
- frame0 = LumaImageReference(type="image", url=download_urls[0])
- if last_image is not None:
- download_urls = upload_images_to_comfyapi(
- last_image, max_images=1, auth_token=auth_token
- )
- frame1 = LumaImageReference(type="image", url=download_urls[0])
- return LumaKeyframes(frame0=frame0, frame1=frame1)
-
-```
\ No newline at end of file
diff --git a/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx b/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx
deleted file mode 100644
index d22021184a..0000000000
--- a/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx
+++ /dev/null
@@ -1,177 +0,0 @@
----
-title: "Luma Text to Video - ComfyUI Native Node Documentation"
-description: "A node that converts text descriptions to videos using Luma AI"
-sidebarTitle: "Luma Text to Video"
-icon: "circle"
----
-
-
-
-The Luma Text to Video node lets you create high-quality, smooth videos from text descriptions using Luma AI's video generation technology.
-
-## Node Function
-
-This node connects to Luma AI's text-to-video API, allowing users to generate dynamic video content from detailed text prompts.
-
-## Parameters
-
-### Basic Parameters
-
-| Parameter | Type | Default | Description |
-| ------------ | ------- | ------------ | ------------------------------------------------------- |
-| prompt | string | "" | Text prompt describing the video content to generate |
-| model | select | - | Video generation model to use |
-| aspect_ratio | select | "ratio_16_9" | Video aspect ratio |
-| resolution | select | "res_540p" | Video resolution |
-| duration | select | - | Video length options |
-| loop | boolean | False | Whether to loop the video |
-| seed | integer | 0 | Seed value for node rerun, results are nondeterministic |
-
-
-When using Ray 1.6 model, duration and resolution parameters will not take effect.
-
-
-### Optional Parameters
-
-| Parameter | Type | Description |
-| ------------- | ------------- | -------------------------------------------------------- |
-| luma_concepts | LUMA_CONCEPTS | Camera concepts to control motion via Luma Concepts node |
-
-### Output
-
-| Output | Type | Description |
-| ------ | ----- | --------------- |
-| VIDEO | video | Generated video |
-
-## Usage Example
-
-
-Luma Text to Video Workflow Example
-
-
-## Source Code
-
-[Node source code (Updated on 2025-05-03)]
-```python
-
-class LumaTextToVideoGenerationNode(ComfyNodeABC):
- """
- Generates videos synchronously based on prompt and output_size.
- """
-
- RETURN_TYPES = (IO.VIDEO,)
- DESCRIPTION = cleandoc(__doc__ or "") # Handle potential None value
- FUNCTION = "api_call"
- API_NODE = True
- CATEGORY = "api node/video/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "prompt": (
- IO.STRING,
- {
- "multiline": True,
- "default": "",
- "tooltip": "Prompt for the video generation",
- },
- ),
- "model": ([model.value for model in LumaVideoModel],),
- "aspect_ratio": (
- [ratio.value for ratio in LumaAspectRatio],
- {
- "default": LumaAspectRatio.ratio_16_9,
- },
- ),
- "resolution": (
- [resolution.value for resolution in LumaVideoOutputResolution],
- {
- "default": LumaVideoOutputResolution.res_540p,
- },
- ),
- "duration": ([dur.value for dur in LumaVideoModelOutputDuration],),
- "loop": (
- IO.BOOLEAN,
- {
- "default": False,
- },
- ),
- "seed": (
- IO.INT,
- {
- "default": 0,
- "min": 0,
- "max": 0xFFFFFFFFFFFFFFFF,
- "control_after_generate": True,
- "tooltip": "Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.",
- },
- ),
- },
- "optional": {
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to dictate camera motion via the Luma Concepts node."
- },
- ),
- },
- "hidden": {
- "auth_token": "AUTH_TOKEN_COMFY_ORG",
- },
- }
-
- def api_call(
- self,
- prompt: str,
- model: str,
- aspect_ratio: str,
- resolution: str,
- duration: str,
- loop: bool,
- seed,
- luma_concepts: LumaConceptChain = None,
- auth_token=None,
- **kwargs,
- ):
- duration = duration if model != LumaVideoModel.ray_1_6 else None
- resolution = resolution if model != LumaVideoModel.ray_1_6 else None
-
- operation = SynchronousOperation(
- endpoint=ApiEndpoint(
- path="/proxy/luma/generations",
- method=HttpMethod.POST,
- request_model=LumaGenerationRequest,
- response_model=LumaGeneration,
- ),
- request=LumaGenerationRequest(
- prompt=prompt,
- model=model,
- resolution=resolution,
- aspect_ratio=aspect_ratio,
- duration=duration,
- loop=loop,
- concepts=luma_concepts.create_api_model() if luma_concepts else None,
- ),
- auth_token=auth_token,
- )
- response_api: LumaGeneration = operation.execute()
-
- operation = PollingOperation(
- poll_endpoint=ApiEndpoint(
- path=f"/proxy/luma/generations/{response_api.id}",
- method=HttpMethod.GET,
- request_model=EmptyRequest,
- response_model=LumaGeneration,
- ),
- completed_statuses=[LumaState.completed],
- failed_statuses=[LumaState.failed],
- status_extractor=lambda x: x.state,
- auth_token=auth_token,
- )
- response_poll = operation.execute()
-
- vid_response = requests.get(response_poll.assets.video)
- return (VideoFromFile(BytesIO(vid_response.content)),)
-
-```
\ No newline at end of file
diff --git a/docs.json b/docs.json
index efb998de25..0cfa57a484 100644
--- a/docs.json
+++ b/docs.json
@@ -1154,14 +1154,6 @@
"built-in-nodes/partner-node/video/kwai_vgi/kling-text-to-video"
]
},
- {
- "group": "Luma",
- "pages": [
- "built-in-nodes/partner-node/video/luma/luma-concepts",
- "built-in-nodes/partner-node/video/luma/luma-image-to-video",
- "built-in-nodes/partner-node/video/luma/luma-text-to-video"
- ]
- },
{
"group": "MiniMax",
"pages": [
@@ -4859,14 +4851,6 @@
"zh/built-in-nodes/partner-node/video/kwai_vgi/kling-text-to-video"
]
},
- {
- "group": "Luma",
- "pages": [
- "zh/built-in-nodes/partner-node/video/luma/luma-concepts",
- "zh/built-in-nodes/partner-node/video/luma/luma-image-to-video",
- "zh/built-in-nodes/partner-node/video/luma/luma-text-to-video"
- ]
- },
{
"group": "MiniMax",
"pages": [
@@ -8738,14 +8722,6 @@
"ja/built-in-nodes/partner-node/video/kwai_vgi/kling-text-to-video"
]
},
- {
- "group": "Luma",
- "pages": [
- "ja/built-in-nodes/partner-node/video/luma/luma-concepts",
- "ja/built-in-nodes/partner-node/video/luma/luma-image-to-video",
- "ja/built-in-nodes/partner-node/video/luma/luma-text-to-video"
- ]
- },
{
"group": "MiniMax",
"pages": [
@@ -16767,6 +16743,42 @@
{
"source": "/ko/development/comfy-router/models/veo/veo-3-0-generate-001/code",
"destination": "/ko/development/comfy-router/models"
+ },
+ {
+ "source": "/built-in-nodes/partner-node/video/luma/luma-concepts",
+ "destination": "/built-in-nodes/LumaConceptsNode"
+ },
+ {
+ "source": "/built-in-nodes/partner-node/video/luma/luma-image-to-video",
+ "destination": "/tutorials/partner-nodes/luma/luma-image-to-video"
+ },
+ {
+ "source": "/built-in-nodes/partner-node/video/luma/luma-text-to-video",
+ "destination": "/tutorials/partner-nodes/luma/luma-text-to-video"
+ },
+ {
+ "source": "/zh/built-in-nodes/partner-node/video/luma/luma-concepts",
+ "destination": "/zh/built-in-nodes/LumaConceptsNode"
+ },
+ {
+ "source": "/zh/built-in-nodes/partner-node/video/luma/luma-image-to-video",
+ "destination": "/zh/tutorials/partner-nodes/luma/luma-image-to-video"
+ },
+ {
+ "source": "/zh/built-in-nodes/partner-node/video/luma/luma-text-to-video",
+ "destination": "/zh/tutorials/partner-nodes/luma/luma-text-to-video"
+ },
+ {
+ "source": "/ja/built-in-nodes/partner-node/video/luma/luma-concepts",
+ "destination": "/ja/built-in-nodes/LumaConceptsNode"
+ },
+ {
+ "source": "/ja/built-in-nodes/partner-node/video/luma/luma-image-to-video",
+ "destination": "/ja/tutorials/partner-nodes/luma/luma-image-to-video"
+ },
+ {
+ "source": "/ja/built-in-nodes/partner-node/video/luma/luma-text-to-video",
+ "destination": "/ja/tutorials/partner-nodes/luma/luma-text-to-video"
}
]
}
diff --git a/ja/built-in-nodes/partner-node/video/luma/luma-concepts.mdx b/ja/built-in-nodes/partner-node/video/luma/luma-concepts.mdx
deleted file mode 100644
index 27a6bb2f81..0000000000
--- a/ja/built-in-nodes/partner-node/video/luma/luma-concepts.mdx
+++ /dev/null
@@ -1,111 +0,0 @@
----
-title: "Luma Concepts - ComfyUI ネイティブノードドキュメント"
-description: "Luma 画像生成に向けたコンセプトガイドを提供する補助ノード"
-sidebarTitle: "Luma Concepts"
-icon: "circle"
-translationSourceHash: 34251163
-translationFrom: built-in-nodes/partner-node/video/luma/luma-concepts.mdx, zh/built-in-nodes/partner-node/video/luma/luma-concepts.mdx
----
-
-
-
-Luma Concepts ノードは、事前に定義されたカメラコンセプトを Luma 生成プロセスに適用できるようにし、複雑なプロンプト記述を必要とせずに、カメラアングルや視点を精密に制御できます。
-
-## ノードの機能
-
-このノードは、Luma 生成ノードの補助ツールとして機能し、ユーザーが事前に定義されたカメラコンセプト(例:上から見たアングルや低角度、クローズアップやロングショットといった撮影距離、プッシュインやフォローといったカメラの動き)を選択・適用できるようにします。これにより、生成結果におけるカメラ効果を直感的に制御でき、クリエイティブなワークフローが簡素化されます。
-
-## パラメータ
-
-### 基本パラメータ
-
-| パラメータ | 型 | 説明 |
-| ---------- | ------ | ------------------------------------------------------------ |
-| concept1 | 選択 | 最初のカメラコンセプト選択肢。各種プリセットおよび「none」を含む |
-| concept2 | 選択 | 2番目のカメラコンセプト選択肢。各種プリセットおよび「none」を含む |
-| concept3 | 選択 | 3番目のカメラコンセプト選択肢。各種プリセットおよび「none」を含む |
-| concept4 | 選択 | 4番目のカメラコンセプト選択肢。各種プリセットおよび「none」を含む |
-
-### オプションパラメータ
-
-| パラメータ | 型 | 説明 |
-| ---------------- | ------------- | ------------------------------------------------------ |
-| luma_concepts | LUMA_CONCEPTS | オプションのカメラコンセプト。ここで選択したコンセプトと統合されます |
-
-### 出力
-
-| 出力 | 型 | 説明 |
-| -------------- | ------------- | ---------------------------------- |
-| luma_concepts | LUMA_CONCEPT | 選択されたすべてのコンセプトを含む統合オブジェクト |
-
-## 使用例
-
-
-Luma Text to Video ワークフローの例
-
-
-
-Luma Image to Video ワークフローの例
-
-
-## 動作原理
-
-Luma Concepts ノードは、以下のような多様な事前定義カメラコンセプトを提供しています:
-- 撮影距離(クローズアップ、ミディアムショット、ロングショット)
-- 視点の高さ(アイレベル、オーバーヘッド、ローアングル)
-- カメラの動き(プッシュイン、フォロー、オービット)
-- 特殊効果(ハンドヘルド、スタビライズド、フローティング)
-
-ユーザーは最大4つのコンセプトを同時に選択できます。このノードは、選択されたカメラコンセプトを含むオブジェクトを作成し、それを Luma 生成ノードへ渡します。生成処理中、Luma AI はこれらのカメラコンセプトをもとに出力の視点や構図を制御し、選択された写真表現効果を正確に反映させます。
-
-複数のカメラコンセプトを組み合わせることで、詳細なプロンプト記述を書かずに高度なカメラ指示を実現できます。これは、特定のカメラアングルや構図が求められる場合に特に有効です。
-
-## ソースコード
-
-[ノードのソースコード(2025-05-03 更新)]
-
-```python
-
-class LumaConceptsNode(ComfyNodeABC):
- """
- Holds one or more Camera Concepts for use with Luma Text to Video and Luma Image to Video nodes.
- """
-
- RETURN_TYPES = (LumaIO.LUMA_CONCEPTS,)
- RETURN_NAMES = ("luma_concepts",)
- DESCRIPTION = cleandoc(__doc__ or "") # Handle potential None value
- FUNCTION = "create_concepts"
- CATEGORY = "api node/image/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "concept1": (get_luma_concepts(include_none=True),),
- "concept2": (get_luma_concepts(include_none=True),),
- "concept3": (get_luma_concepts(include_none=True),),
- "concept4": (get_luma_concepts(include_none=True),),
- },
- "optional": {
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to add to the ones chosen here."
- },
- ),
- },
- }
-
- def create_concepts(
- self,
- concept1: str,
- concept2: str,
- concept3: str,
- concept4: str,
- luma_concepts: LumaConceptChain = None,
- ):
- chain = LumaConceptChain(str_list=[concept1, concept2, concept3, concept4])
- if luma_concepts is not None:
- chain = luma_concepts.clone_and_merge(chain)
- return (chain,)
-
diff --git a/ja/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx b/ja/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx
deleted file mode 100644
index 109b8c9f5a..0000000000
--- a/ja/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx
+++ /dev/null
@@ -1,210 +0,0 @@
----
-title: "Luma Image to Video - ComfyUI ネイティブ API ノードドキュメント"
-description: "Luma AI を使用して静止画を動画に変換するノード"
-sidebarTitle: "Luma Image to Video"
-icon: "circle"
-translationSourceHash: 469e3619
-translationFrom: built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx, zh/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx
----
-
-
-
-Luma Image to Video ノードは、Luma AI の技術を活用して静止画を滑らかでダイナミックな動画に変換し、画像に命と動きを吹き込みます。
-
-## ノードの機能
-
-このノードは Luma AI の「画像→動画」API に接続し、入力画像からダイナミックな動画を生成します。画像の内容を理解し、元のビジュアルスタイルを維持したまま自然で一貫性のある動きを生成します。テキストプロンプトと組み合わせることで、ユーザーは動画のダイナミックな効果を正確に制御できます。
-
-## パラメータ
-
-### 基本パラメータ
-
-| パラメータ | 型 | デフォルト値 | 説明 |
-| ----------- | ------- | ------------ | ------------------------------------------------ |
-| prompt | 文字列 | "" | 動画の動きおよびコンテンツを記述するテキストプロンプト |
-| model | 選択肢 | - | 使用する動画生成モデル |
-| resolution | 選択肢 | "540p" | 出力動画の解像度 |
-| duration | 選択肢 | - | 動画の長さオプション |
-| loop | ブール値 | False | 動画をループ再生するかどうか |
-| seed | 整数 | 0 | ノード再実行時のシード値(実際の結果はシードに依存せず非決定的) |
-
-### オプションパラメータ
-
-| パラメータ | 型 | 説明 |
-| --------------- | --------------- | -------------------------------------------------- |
-| first_image | 画像 | 動画の最初のフレーム(`last_image` が未指定の場合は必須) |
-| last_image | 画像 | 動画の最後のフレーム(`first_image` が未指定の場合は必須) |
-| luma_concepts | LUMA_CONCEPTS | カメラの動きやショットスタイルを制御するためのコンセプト |
-
-### 要件
-
-- **first_image** または **last_image** のいずれか一方は必ず指定する必要があります
-- 各画像入力(`first_image` および `last_image`)には、1 枚の画像のみを指定できます
-
-### 出力
-
-| 出力 | 型 | 説明 |
-| ----- | ---- | ------------ |
-| VIDEO | 動画 | 生成された動画 |
-
-## 使用例
-
-
-Luma Image to Video ワークフローチュートリアル
-
-
-## ソースコード
-
-[ノードソースコード(2025-05-03 更新)]
-```python
-
-class LumaImageToVideoGenerationNode(ComfyNodeABC):
- """
- Generates videos synchronously based on prompt, input images, and output_size.
- """
-
- RETURN_TYPES = (IO.VIDEO,)
- DESCRIPTION = cleandoc(__doc__ or "") # Handle potential None value
- FUNCTION = "api_call"
- API_NODE = True
- CATEGORY = "api node/video/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "prompt": (
- IO.STRING,
- {
- "multiline": True,
- "default": "",
- "tooltip": "Prompt for the video generation",
- },
- ),
- "model": ([model.value for model in LumaVideoModel],),
- # "aspect_ratio": ([ratio.value for ratio in LumaAspectRatio], {
- # "default": LumaAspectRatio.ratio_16_9,
- # }),
- "resolution": (
- [resolution.value for resolution in LumaVideoOutputResolution],
- {
- "default": LumaVideoOutputResolution.res_540p,
- },
- ),
- "duration": ([dur.value for dur in LumaVideoModelOutputDuration],),
- "loop": (
- IO.BOOLEAN,
- {
- "default": False,
- },
- ),
- "seed": (
- IO.INT,
- {
- "default": 0,
- "min": 0,
- "max": 0xFFFFFFFFFFFFFFFF,
- "control_after_generate": True,
- "tooltip": "Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.",
- },
- ),
- },
- "optional": {
- "first_image": (
- IO.IMAGE,
- {"tooltip": "First frame of generated video."},
- ),
- "last_image": (IO.IMAGE, {"tooltip": "Last frame of generated video."}),
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to dictate camera motion via the Luma Concepts node."
- },
- ),
- },
- "hidden": {
- "auth_token": "AUTH_TOKEN_COMFY_ORG",
- },
- }
-
- def api_call(
- self,
- prompt: str,
- model: str,
- resolution: str,
- duration: str,
- loop: bool,
- seed,
- first_image: torch.Tensor = None,
- last_image: torch.Tensor = None,
- luma_concepts: LumaConceptChain = None,
- auth_token=None,
- **kwargs,
- ):
- if first_image is None and last_image is None:
- raise Exception(
- "At least one of first_image and last_image requires an input."
- )
- keyframes = self._convert_to_keyframes(first_image, last_image, auth_token)
- duration = duration if model != LumaVideoModel.ray_1_6 else None
- resolution = resolution if model != LumaVideoModel.ray_1_6 else None
-
- operation = SynchronousOperation(
- endpoint=ApiEndpoint(
- path="/proxy/luma/generations",
- method=HttpMethod.POST,
- request_model=LumaGenerationRequest,
- response_model=LumaGeneration,
- ),
- request=LumaGenerationRequest(
- prompt=prompt,
- model=model,
- aspect_ratio=LumaAspectRatio.ratio_16_9, # ignored, but still needed by the API for some reason
- resolution=resolution,
- duration=duration,
- loop=loop,
- keyframes=keyframes,
- concepts=luma_concepts.create_api_model() if luma_concepts else None,
- ),
- auth_token=auth_token,
- )
- response_api: LumaGeneration = operation.execute()
-
- operation = PollingOperation(
- poll_endpoint=ApiEndpoint(
- path=f"/proxy/luma/generations/{response_api.id}",
- method=HttpMethod.GET,
- request_model=EmptyRequest,
- response_model=LumaGeneration,
- ),
- completed_statuses=[LumaState.completed],
- failed_statuses=[LumaState.failed],
- status_extractor=lambda x: x.state,
- auth_token=auth_token,
- )
- response_poll = operation.execute()
-
- vid_response = requests.get(response_poll.assets.video)
- return (VideoFromFile(BytesIO(vid_response.content)),)
-
- def _convert_to_keyframes(
- self,
- first_image: torch.Tensor = None,
- last_image: torch.Tensor = None,
- auth_token=None,
- ):
- if first_image is None and last_image is None:
- return None
- frame0 = None
- frame1 = None
- if first_image is not None:
- download_urls = upload_images_to_comfyapi(
- first_image, max_images=1, auth_token=auth_token
- )
- frame0 = LumaImageReference(type="image", url=download_urls[0])
- if last_image is not None:
- download_urls = upload_images_to_comfyapi(
- last_image, max_images=1, auth_token=auth_token
- )
- frame1 = LumaImageReference(type="image", url=download_urls[0])
- return LumaKeyframes(frame0=frame0, frame1=frame1)
diff --git a/ja/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx b/ja/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx
deleted file mode 100644
index 80a696df00..0000000000
--- a/ja/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx
+++ /dev/null
@@ -1,177 +0,0 @@
----
-title: "Luma Text to Video - ComfyUI ネイティブノードドキュメント"
-description: "Luma AI を使用してテキスト記述を動画に変換するノード"
-sidebarTitle: "Luma Text to Video"
-icon: "circle"
-translationSourceHash: 1bb8f5a8
-translationFrom: built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx, zh/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx
----
-
-
-
-Luma Text to Video ノードは、Luma AI の動画生成技術を活用して、テキストによる説明から高品質で滑らかな動画を生成します。
-
-## ノードの機能
-
-このノードは Luma AI の「テキストから動画へ」API に接続し、詳細なテキストプロンプトに基づいてダイナミックな動画コンテンツを生成できるようにします。
-
-## パラメーター
-
-### 基本パラメーター
-
-| パラメーター | 型 | デフォルト値 | 説明 |
-| -------------- | ------- | ------------ | -------------------------------------------------------- |
-| prompt | 文字列 | "" | 生成する動画の内容を記述するテキストプロンプト |
-| model | 選択肢 | - | 使用する動画生成モデル |
-| aspect_ratio | 選択肢 | "ratio_16_9" | 動画のアスペクト比 |
-| resolution | 選択肢 | "res_540p" | 動画の解像度 |
-| duration | 選択肢 | - | 動画の長さオプション |
-| loop | ブール値 | False | 動画をループ再生するかどうか |
-| seed | 整数 | 0 | ノードの再実行を制御するためのシード値(実際の出力はシードに依存せず非決定的) |
-
-
-Ray 1.6 モデルを使用する場合、`duration` および `resolution` パラメーターは無効になります。
-
-
-### オプションパラメーター
-
-| パラメーター | 型 | 説明 |
-| ---------------- | ---------------- | ------------------------------------------------------------ |
-| luma_concepts | LUMA_CONCEPTS | Luma Concepts ノードを介してカメラモーションを制御するためのカメラコンセプト(任意) |
-
-### 出力
-
-| 出力 | 型 | 説明 |
-| ----- | ---- | ------------ |
-| VIDEO | 動画 | 生成された動画 |
-
-## 使用例
-
-
-Luma Text to Video ワークフローの例
-
-
-## ソースコード
-
-[ノードのソースコード(2025-05-03 更新)]
-```python
-
-class LumaTextToVideoGenerationNode(ComfyNodeABC):
- """
- Generates videos synchronously based on prompt and output_size.
- """
-
- RETURN_TYPES = (IO.VIDEO,)
- DESCRIPTION = cleandoc(__doc__ or "") # Handle potential None value
- FUNCTION = "api_call"
- API_NODE = True
- CATEGORY = "api node/video/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "prompt": (
- IO.STRING,
- {
- "multiline": True,
- "default": "",
- "tooltip": "Prompt for the video generation",
- },
- ),
- "model": ([model.value for model in LumaVideoModel],),
- "aspect_ratio": (
- [ratio.value for ratio in LumaAspectRatio],
- {
- "default": LumaAspectRatio.ratio_16_9,
- },
- ),
- "resolution": (
- [resolution.value for resolution in LumaVideoOutputResolution],
- {
- "default": LumaVideoOutputResolution.res_540p,
- },
- ),
- "duration": ([dur.value for dur in LumaVideoModelOutputDuration],),
- "loop": (
- IO.BOOLEAN,
- {
- "default": False,
- },
- ),
- "seed": (
- IO.INT,
- {
- "default": 0,
- "min": 0,
- "max": 0xFFFFFFFFFFFFFFFF,
- "control_after_generate": True,
- "tooltip": "Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.",
- },
- ),
- },
- "optional": {
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to dictate camera motion via the Luma Concepts node."
- },
- ),
- },
- "hidden": {
- "auth_token": "AUTH_TOKEN_COMFY_ORG",
- },
- }
-
- def api_call(
- self,
- prompt: str,
- model: str,
- aspect_ratio: str,
- resolution: str,
- duration: str,
- loop: bool,
- seed,
- luma_concepts: LumaConceptChain = None,
- auth_token=None,
- **kwargs,
- ):
- duration = duration if model != LumaVideoModel.ray_1_6 else None
- resolution = resolution if model != LumaVideoModel.ray_1_6 else None
-
- operation = SynchronousOperation(
- endpoint=ApiEndpoint(
- path="/proxy/luma/generations",
- method=HttpMethod.POST,
- request_model=LumaGenerationRequest,
- response_model=LumaGeneration,
- ),
- request=LumaGenerationRequest(
- prompt=prompt,
- model=model,
- resolution=resolution,
- aspect_ratio=aspect_ratio,
- duration=duration,
- loop=loop,
- concepts=luma_concepts.create_api_model() if luma_concepts else None,
- ),
- auth_token=auth_token,
- )
- response_api: LumaGeneration = operation.execute()
-
- operation = PollingOperation(
- poll_endpoint=ApiEndpoint(
- path=f"/proxy/luma/generations/{response_api.id}",
- method=HttpMethod.GET,
- request_model=EmptyRequest,
- response_model=LumaGeneration,
- ),
- completed_statuses=[LumaState.completed],
- failed_statuses=[LumaState.failed],
- status_extractor=lambda x: x.state,
- auth_token=auth_token,
- )
- response_poll = operation.execute()
-
- vid_response = requests.get(response_poll.assets.video)
- return (VideoFromFile(BytesIO(vid_response.content)),)
diff --git a/ja/tutorials/partner-nodes/pricing.mdx b/ja/tutorials/partner-nodes/pricing.mdx
index 93363f8069..3852dfa8aa 100644
--- a/ja/tutorials/partner-nodes/pricing.mdx
+++ b/ja/tutorials/partner-nodes/pricing.mdx
@@ -3,7 +3,7 @@ title: "Partner Node 価格"
description: "Anthropic、OpenAI、Kling、Luma など全プロバイダーの Partner Node クレジット価格。モデル、トークン種別、生成種別ごとに分類。"
sidebarTitle: "料金"
mode: "wide"
-translationSourceHash: e04bd27e
+translationSourceHash: 4fff04dc
translationFrom: tutorials/partner-nodes/pricing.mdx
translationBlockHashes:
"_intro": ada9999a
@@ -24,7 +24,7 @@ translationBlockHashes:
"Krea": fb20c257
"Kling": 32a38b1d
"Lightricks": 3ba8d019
- "Luma": 83bd95b0
+ "Luma": 69345678
"Meshy": eed5c458
"Meta": a253fe9a
"Minimax": 5d425719
@@ -789,7 +789,7 @@ HeyGen Video 1.0 のクリップは 5〜15 秒で、選択した解像度のレ
### 動画
- **非推奨**: 旧版の **Luma Text to Video** および **Luma Image to Video** ノードは非推奨です。Luma はこれらのノードが使用するエンドポイントを 2026年10月24日 に削除します。以下の ray-2、ray-flash-2、ray-1-6 の行は参考として残されています。
+ **非推奨**: 旧版の **Luma Text to Video** および **Luma Image to Video** ノードは非推奨です。Luma はこれらのノードが使用するエンドポイントを 2026年10月24日 に削除します。代わりに **Luma Ray 3.2** ノードを使用してください。以下の ray-2、ray-flash-2、ray-1-6 の行は参考として残されています。**ray-1-6** は 2026年9月以降提供されていないため、期限までは **ray-2** と **ray-flash-2** のみ実行できます。
各 `duration` 選択肢について、フラットな **/実行** 価格がノードバッジと一致します。**Edit** および **reframe** は **(クレジット / 秒)× 動画長** で課金されます。**ray-1-6** は常に **105.50 / 実行** です。
diff --git a/ko/tutorials/partner-nodes/pricing.mdx b/ko/tutorials/partner-nodes/pricing.mdx
index 59c1cab5fc..cce313c4f2 100644
--- a/ko/tutorials/partner-nodes/pricing.mdx
+++ b/ko/tutorials/partner-nodes/pricing.mdx
@@ -3,7 +3,7 @@ title: "Partner Node 가격"
description: "Anthropic, OpenAI, Kling, Luma 등 모든 제공업체의 Partner Node 크레딧 가격을 모델, 토큰 유형, 생성 유형별로 구분합니다."
sidebarTitle: "가격 정책"
mode: "wide"
-translationSourceHash: e04bd27e
+translationSourceHash: 4fff04dc
translationFrom: tutorials/partner-nodes/pricing.mdx
translationBlockHashes:
"_intro": ada9999a
@@ -24,7 +24,7 @@ translationBlockHashes:
"Krea": fb20c257
"Kling": 32a38b1d
"Lightricks": 3ba8d019
- "Luma": 83bd95b0
+ "Luma": 69345678
"Meshy": eed5c458
"Meta": a253fe9a
"Minimax": 5d425719
@@ -789,7 +789,7 @@ HeyGen Video 1.0 클립은 5~15초이며, 선택한 해상도의 요율로 청
### 비디오
- **사용 중단 예정**: 레거시 **Luma 텍스트 투 비디오** 및 **Luma 이미지 → 비디오** 노드는 곧 사용이 중단됩니다. Luma는 이 노드들이 사용하는 엔드포인트를 2026년 10월 24일에 제거합니다. 아래의 ray-2, ray-flash-2, ray-1-6 행은 참고용으로 유지됩니다.
+ **사용 중단 예정**: 레거시 **Luma 텍스트 투 비디오** 및 **Luma 이미지 → 비디오** 노드는 곧 사용이 중단됩니다. Luma는 이 노드들이 사용하는 엔드포인트를 2026년 10월 24일에 제거합니다. 대신 **Luma Ray 3.2** 노드를 사용하세요. 아래의 ray-2, ray-flash-2, ray-1-6 행은 참고용으로 유지됩니다. **ray-1-6**은 2026년 9월부터 제공되지 않으므로 종료 시점까지는 **ray-2**와 **ray-flash-2**만 실행할 수 있습니다.
각 `duration` 선택에 대한 고정 **/실행** 가격은 노드 배지와 일치합니다. **편집** 및 **리프레임**은 **(크레딧 / 초) × 비디오 길이**로 청구됩니다. **ray-1-6**은 항상 **105.50 / 실행**입니다.
diff --git a/tutorials/partner-nodes/pricing.mdx b/tutorials/partner-nodes/pricing.mdx
index 2214f0f91d..ac55fbce05 100644
--- a/tutorials/partner-nodes/pricing.mdx
+++ b/tutorials/partner-nodes/pricing.mdx
@@ -738,7 +738,7 @@ Resolution maps to `1280x720` / `720x1280` (720p), `1920x1080` / `1080x1920` (10
### Video
- **Deprecated**: The legacy **Luma Text to Video** and **Luma Image to Video** nodes are deprecated, and Luma removes the endpoints they use on October 24, 2026. The ray-2, ray-flash-2, and ray-1-6 rows below are retained for reference.
+ **Deprecated**: The legacy **Luma Text to Video** and **Luma Image to Video** nodes are deprecated, and Luma removes the endpoints they use on October 24, 2026. Use the **Luma Ray 3.2** nodes instead. The ray-2, ray-flash-2, and ray-1-6 rows below are retained for reference; **ray-1-6** stopped being served in September 2026, so only **ray-2** and **ray-flash-2** run until the cutoff.
Flat **/run** prices match the node badge for each `duration` choice. **Edit** and **reframe** bill **(credits / sec) × video length**. **ray-1-6** is always **105.50 / run**.
diff --git a/zh/built-in-nodes/partner-node/video/luma/luma-concepts.mdx b/zh/built-in-nodes/partner-node/video/luma/luma-concepts.mdx
deleted file mode 100644
index 22b48cfcc3..0000000000
--- a/zh/built-in-nodes/partner-node/video/luma/luma-concepts.mdx
+++ /dev/null
@@ -1,111 +0,0 @@
----
-title: "Luma Concepts - ComfyUI 原生节点文档"
-description: "为Luma图像生成提供概念引导的辅助节点"
-sidebarTitle: "Luma Concepts"
-icon: "circle"
----
-
-
-
-Luma Concepts 节点允许你将预定义的镜头概念应用到Luma生成过程中,提供更精确的镜头和视角控制,无需复杂的提示词描述。
-
-## 节点功能
-
-此节点作为Luma生成节点的辅助工具,让用户能够选择和应用预定义的镜头概念,这些概念包括不同的拍摄角度(如俯视、仰视)、镜头距离(如特写、远景)、运动方式(如推进、跟随)等摄影参数。它简化了创作工作流程,提供了一种直观的方式来控制生成结果的镜头效果。
-
-## 参数说明
-
-### 基本参数
-
-| 参数 | 类型 | 说明 |
-| -------- | ------ | ---------------------------------------- |
-| concept1 | 选择项 | 第一个镜头概念选择,包含多种预设镜头选项和"none" |
-| concept2 | 选择项 | 第二个镜头概念选择,包含多种预设镜头选项和"none" |
-| concept3 | 选择项 | 第三个镜头概念选择,包含多种预设镜头选项和"none" |
-| concept4 | 选择项 | 第四个镜头概念选择,包含多种预设镜头选项和"none" |
-
-### 可选参数
-
-| 参数 | 类型 | 说明 |
-| ------------- | ------------- | ----------------------------------------------------- |
-| luma_concepts | LUMA_CONCEPTS | 可选的额外Camera Concepts,会与此处选择的镜头概念合并 |
-
-### 输出
-
-| 输出 | 类型 | 说明 |
-| ------------- | ------------ | ------------------------------ |
-| luma_concepts | LUMA_CONCEPT | 包含所有选定镜头概念的组合对象 |
-
-## 使用示例
-
-
-Luma Text to Video 工作流示例
-
-
-
-Luma Image to Video 工作流示例
-
-
-## 工作原理
-
-Luma Concepts 节点提供了丰富的预定义镜头概念供选择,包括但不限于:
-- 不同的拍摄距离(如特写、中景、远景)
-- 视角高度(如地平、俯视、仰视)
-- 运动方式(如推进、跟随、环绕)
-- 特殊效果(如手持、稳定、漂浮)
-
-用户可以从这些选项中选择最多4个概念组合使用。节点会创建一个包含所选镜头概念的对象,该对象随后传递给Luma生成节点。在生成过程中,Luma AI会根据这些镜头概念来影响生成结果的视角和构图,确保输出图像体现所选的摄影效果。
-
-通过组合多个镜头概念,用户可以创建复杂的镜头指导,而无需撰写详细的提示词描述。这对于需要特定摄影视角或构图的场景特别有用。
-
-## 源码参考
-
-[节点源码 (更新于2025-05-03)]
-
-```python
-
-class LumaConceptsNode(ComfyNodeABC):
- """
- Holds one or more Camera Concepts for use with Luma Text to Video and Luma Image to Video nodes.
- """
-
- RETURN_TYPES = (LumaIO.LUMA_CONCEPTS,)
- RETURN_NAMES = ("luma_concepts",)
- DESCRIPTION = cleandoc(__doc__ or "") # 处理可能的 None 值
- FUNCTION = "create_concepts"
- CATEGORY = "api node/image/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "concept1": (get_luma_concepts(include_none=True),),
- "concept2": (get_luma_concepts(include_none=True),),
- "concept3": (get_luma_concepts(include_none=True),),
- "concept4": (get_luma_concepts(include_none=True),),
- },
- "optional": {
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to add to the ones chosen here."
- },
- ),
- },
- }
-
- def create_concepts(
- self,
- concept1: str,
- concept2: str,
- concept3: str,
- concept4: str,
- luma_concepts: LumaConceptChain = None,
- ):
- chain = LumaConceptChain(str_list=[concept1, concept2, concept3, concept4])
- if luma_concepts is not None:
- chain = luma_concepts.clone_and_merge(chain)
- return (chain,)
-
-
-```
\ No newline at end of file
diff --git a/zh/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx b/zh/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx
deleted file mode 100644
index 7f336d9a7d..0000000000
--- a/zh/built-in-nodes/partner-node/video/luma/luma-image-to-video.mdx
+++ /dev/null
@@ -1,218 +0,0 @@
----
-title: "Luma Image to Video - ComfyUI 原生合作伙伴节点文档"
-description: "使用Luma AI将静态图像转换为动态视频的节点"
-sidebarTitle: "Luma Image to Video"
-icon: "circle"
----
-
-
-
-Luma Image to Video 节点允许你使用Luma AI的先进技术,将静态图像转换为流畅、动态的视频内容,为图像赋予生命力和动态特性。
-
-## 节点功能
-
-此节点连接到Luma AI的图像到视频API,让用户能够基于输入图像创建动态视频。它可以理解图像中的内容并生成自然、连贯的动作,同时保持原始图像的视觉风格和特性。结合文本提示词,用户可以精确控制生成视频的动态效果。
-
-## 参数说明
-
-### 基本参数
-
-| 参数 | 类型 | 默认值 | 说明 |
-| ---------- | ------ | ------ | ------------------------- |
-| prompt | 字符串 | "" | 描述视频动作和内容的文本提示词 |
-| model | 选择项 | - | 使用的视频生成模型 |
-| resolution | 选择项 | "540p" | 输出视频分辨率 |
-| duration | 选择项 | - | 视频时长选项 |
-| loop | 布尔值 | False | 是否循环播放视频 |
-| seed | 整数 | 0 | 种子值,用于确定节点是否应重新运行,但实际结果与种子无关 |
-
-### 可选参数
-
-| 参数 | 类型 | 说明 |
-| ------------- | ------------- | --------------------------------------------------- |
-| first_image | 图像 | 视频的第一帧图像(与last_image至少需要提供一个) |
-| last_image | 图像 | 视频的最后一帧图像(与first_image至少需要提供一个) |
-| luma_concepts | LUMA_CONCEPTS | 用于控制相机运动和镜头效果的概念引导 |
-
-### 参数要求
-
-- **first_image** 和 **last_image** 至少需要提供其中一个
-- 每个图像输入(first_image和last_image)最多只接受1张图片
-
-### 输出
-
-| 输出 | 类型 | 说明 |
-| ----- | ---- | -------------- |
-| VIDEO | 视频 | 生成的视频结果 |
-
-## 使用示例
-
-
-Luma Image to Video 工作流教程
-
-
-## 工作原理
-
-Luma Image to Video 节点分析输入图像的内容和结构,然后结合文本提示词来确定如何为图像添加动态效果。它使用Luma AI的生成模型理解图像中的对象、人物或场景,并创建合理、连贯的动作序列。
-
-用户可以通过提示词描述期望的动作类型、方向和强度,节点将据此生成相应的视频效果。通过设置不同的参数,如分辨率和时长,用户可以进一步定制输出视频的特性。
-
-此外,通过提供起始帧和最后帧参考图像,用户可以指定视频的起始和结束状态,使动作朝特定方向发展。概念引导功能则允许用户进一步控制视频的整体风格、相机运动和美学效果。
-
-## 源码参考
-
-[节点源码 (更新于2025-05-03)]
-```python
-
-class LumaImageToVideoGenerationNode(ComfyNodeABC):
- """
- Generates videos synchronously based on prompt, input images, and output_size.
- """
-
- RETURN_TYPES = (IO.VIDEO,)
- DESCRIPTION = cleandoc(__doc__ or "") # 处理可能为 None 的值
- FUNCTION = "api_call"
- API_NODE = True
- CATEGORY = "api node/video/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "prompt": (
- IO.STRING,
- {
- "multiline": True,
- "default": "",
- "tooltip": "Prompt for the video generation",
- },
- ),
- "model": ([model.value for model in LumaVideoModel],),
- # "aspect_ratio": ([ratio.value for ratio in LumaAspectRatio], {
- # "default": LumaAspectRatio.ratio_16_9,
- # }),
- "resolution": (
- [resolution.value for resolution in LumaVideoOutputResolution],
- {
- "default": LumaVideoOutputResolution.res_540p,
- },
- ),
- "duration": ([dur.value for dur in LumaVideoModelOutputDuration],),
- "loop": (
- IO.BOOLEAN,
- {
- "default": False,
- },
- ),
- "seed": (
- IO.INT,
- {
- "default": 0,
- "min": 0,
- "max": 0xFFFFFFFFFFFFFFFF,
- "control_after_generate": True,
- "tooltip": "Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.",
- },
- ),
- },
- "optional": {
- "first_image": (
- IO.IMAGE,
- {"tooltip": "First frame of generated video."},
- ),
- "last_image": (IO.IMAGE, {"tooltip": "Last frame of generated video."}),
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to dictate camera motion via the Luma Concepts node."
- },
- ),
- },
- "hidden": {
- "auth_token": "AUTH_TOKEN_COMFY_ORG",
- },
- }
-
- def api_call(
- self,
- prompt: str,
- model: str,
- resolution: str,
- duration: str,
- loop: bool,
- seed,
- first_image: torch.Tensor = None,
- last_image: torch.Tensor = None,
- luma_concepts: LumaConceptChain = None,
- auth_token=None,
- **kwargs,
- ):
- if first_image is None and last_image is None:
- raise Exception(
- "At least one of first_image and last_image requires an input."
- )
- keyframes = self._convert_to_keyframes(first_image, last_image, auth_token)
- duration = duration if model != LumaVideoModel.ray_1_6 else None
- resolution = resolution if model != LumaVideoModel.ray_1_6 else None
-
- operation = SynchronousOperation(
- endpoint=ApiEndpoint(
- path="/proxy/luma/generations",
- method=HttpMethod.POST,
- request_model=LumaGenerationRequest,
- response_model=LumaGeneration,
- ),
- request=LumaGenerationRequest(
- prompt=prompt,
- model=model,
- aspect_ratio=LumaAspectRatio.ratio_16_9, # 被忽略,但 API 出于某种原因仍需要它
- resolution=resolution,
- duration=duration,
- loop=loop,
- keyframes=keyframes,
- concepts=luma_concepts.create_api_model() if luma_concepts else None,
- ),
- auth_token=auth_token,
- )
- response_api: LumaGeneration = operation.execute()
-
- operation = PollingOperation(
- poll_endpoint=ApiEndpoint(
- path=f"/proxy/luma/generations/{response_api.id}",
- method=HttpMethod.GET,
- request_model=EmptyRequest,
- response_model=LumaGeneration,
- ),
- completed_statuses=[LumaState.completed],
- failed_statuses=[LumaState.failed],
- status_extractor=lambda x: x.state,
- auth_token=auth_token,
- )
- response_poll = operation.execute()
-
- vid_response = requests.get(response_poll.assets.video)
- return (VideoFromFile(BytesIO(vid_response.content)),)
-
- def _convert_to_keyframes(
- self,
- first_image: torch.Tensor = None,
- last_image: torch.Tensor = None,
- auth_token=None,
- ):
- if first_image is None and last_image is None:
- return None
- frame0 = None
- frame1 = None
- if first_image is not None:
- download_urls = upload_images_to_comfyapi(
- first_image, max_images=1, auth_token=auth_token
- )
- frame0 = LumaImageReference(type="image", url=download_urls[0])
- if last_image is not None:
- download_urls = upload_images_to_comfyapi(
- last_image, max_images=1, auth_token=auth_token
- )
- frame1 = LumaImageReference(type="image", url=download_urls[0])
- return LumaKeyframes(frame0=frame0, frame1=frame1)
-
-```
\ No newline at end of file
diff --git a/zh/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx b/zh/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx
deleted file mode 100644
index 4cf39b191d..0000000000
--- a/zh/built-in-nodes/partner-node/video/luma/luma-text-to-video.mdx
+++ /dev/null
@@ -1,177 +0,0 @@
----
-title: "Luma Text to Video - ComfyUI 原生节点文档"
-description: "使用Luma AI将文本描述转换为视频的节点"
-sidebarTitle: "Luma Text to Video"
-icon: "circle"
----
-
-
-
-Luma Text to Video 节点允许你使用Luma AI的创新视频生成技术,通过文本描述创建高质量、流畅的视频内容。
-
-## 节点功能
-
-此节点连接到Luma AI的文本到视频API,让用户能够通过详细的文本提示词生成动态视频内容。
-
-## 参数说明
-
-### 基本参数
-
-| 参数 | 类型 | 默认值 | 说明 |
-| ------------ | ------ | ------------ | -------------------------------------------------------- |
-| prompt | 字符串 | "" | 描述要生成视频内容的文本提示词 |
-| model | 选择项 | - | 使用的视频生成模型 |
-| aspect_ratio | 选择项 | "ratio_16_9" | 视频宽高比 |
-| resolution | 选择项 | "res_540p" | 视频分辨率 |
-| duration | 选择项 | - | 视频时长选项 |
-| loop | 布尔值 | False | 是否循环播放视频 |
-| seed | 整数 | 0 | 随机种子,用于决定节点是否需要重新运行;实际结果与种子无关 |
-
-
-当使用 Ray 1.6 模型时,duration 和 resolution 参数将不会生效。
-
-
-### 可选参数
-
-| 参数 | 类型 | 说明 |
-| ------------- | ------------- | ----------------------------------------------------- |
-| luma_concepts | LUMA_CONCEPTS | 可选的摄像机概念,通过Luma Concepts节点控制摄像机运动 |
-
-### 输出
-
-| 输出 | 类型 | 说明 |
-| ----- | ---- | -------------- |
-| VIDEO | 视频 | 生成的视频结果 |
-
-## 使用示例
-
-
-Luma Text to Video 工作流示例
-
-
-## 源码参考
-
-[节点源码 (更新于2025-05-03)]
-```python
-
-class LumaTextToVideoGenerationNode(ComfyNodeABC):
- """
- Generates videos synchronously based on prompt and output_size.
- """
-
- RETURN_TYPES = (IO.VIDEO,)
- DESCRIPTION = cleandoc(__doc__ or "") # 处理可能为 None 的值
- FUNCTION = "api_call"
- API_NODE = True
- CATEGORY = "api node/video/Luma"
-
- @classmethod
- def INPUT_TYPES(s):
- return {
- "required": {
- "prompt": (
- IO.STRING,
- {
- "multiline": True,
- "default": "",
- "tooltip": "Prompt for the video generation",
- },
- ),
- "model": ([model.value for model in LumaVideoModel],),
- "aspect_ratio": (
- [ratio.value for ratio in LumaAspectRatio],
- {
- "default": LumaAspectRatio.ratio_16_9,
- },
- ),
- "resolution": (
- [resolution.value for resolution in LumaVideoOutputResolution],
- {
- "default": LumaVideoOutputResolution.res_540p,
- },
- ),
- "duration": ([dur.value for dur in LumaVideoModelOutputDuration],),
- "loop": (
- IO.BOOLEAN,
- {
- "default": False,
- },
- ),
- "seed": (
- IO.INT,
- {
- "default": 0,
- "min": 0,
- "max": 0xFFFFFFFFFFFFFFFF,
- "control_after_generate": True,
- "tooltip": "Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.",
- },
- ),
- },
- "optional": {
- "luma_concepts": (
- LumaIO.LUMA_CONCEPTS,
- {
- "tooltip": "Optional Camera Concepts to dictate camera motion via the Luma Concepts node."
- },
- ),
- },
- "hidden": {
- "auth_token": "AUTH_TOKEN_COMFY_ORG",
- },
- }
-
- def api_call(
- self,
- prompt: str,
- model: str,
- aspect_ratio: str,
- resolution: str,
- duration: str,
- loop: bool,
- seed,
- luma_concepts: LumaConceptChain = None,
- auth_token=None,
- **kwargs,
- ):
- duration = duration if model != LumaVideoModel.ray_1_6 else None
- resolution = resolution if model != LumaVideoModel.ray_1_6 else None
-
- operation = SynchronousOperation(
- endpoint=ApiEndpoint(
- path="/proxy/luma/generations",
- method=HttpMethod.POST,
- request_model=LumaGenerationRequest,
- response_model=LumaGeneration,
- ),
- request=LumaGenerationRequest(
- prompt=prompt,
- model=model,
- resolution=resolution,
- aspect_ratio=aspect_ratio,
- duration=duration,
- loop=loop,
- concepts=luma_concepts.create_api_model() if luma_concepts else None,
- ),
- auth_token=auth_token,
- )
- response_api: LumaGeneration = operation.execute()
-
- operation = PollingOperation(
- poll_endpoint=ApiEndpoint(
- path=f"/proxy/luma/generations/{response_api.id}",
- method=HttpMethod.GET,
- request_model=EmptyRequest,
- response_model=LumaGeneration,
- ),
- completed_statuses=[LumaState.completed],
- failed_statuses=[LumaState.failed],
- status_extractor=lambda x: x.state,
- auth_token=auth_token,
- )
- response_poll = operation.execute()
-
- vid_response = requests.get(response_poll.assets.video)
- return (VideoFromFile(BytesIO(vid_response.content)),)
-
-```
\ No newline at end of file
diff --git a/zh/tutorials/partner-nodes/pricing.mdx b/zh/tutorials/partner-nodes/pricing.mdx
index 3caaf7feeb..3692e3db38 100644
--- a/zh/tutorials/partner-nodes/pricing.mdx
+++ b/zh/tutorials/partner-nodes/pricing.mdx
@@ -3,7 +3,7 @@ title: "Partner Node 定价"
description: "各提供商(包括 Anthropic、OpenAI、Kling 和 Luma)的 Partner Node 积分定价,按模型、Token 类型和生成类型细分。"
sidebarTitle: "定价"
mode: "wide"
-translationSourceHash: e04bd27e
+translationSourceHash: 4fff04dc
translationFrom: tutorials/partner-nodes/pricing.mdx
translationBlockHashes:
"_intro": ada9999a
@@ -24,7 +24,7 @@ translationBlockHashes:
"Krea": fb20c257
"Kling": 32a38b1d
"Lightricks": 3ba8d019
- "Luma": 83bd95b0
+ "Luma": 69345678
"Meshy": eed5c458
"Meta": a253fe9a
"Minimax": 5d425719
@@ -789,7 +789,7 @@ HeyGen Video 1.0 的片段时长为 5 到 15 秒,按所选分辨率的费率
### 视频
- **已弃用**:旧版 **Luma 文本转视频** 和 **Luma 图像转视频** 节点已弃用,Luma 将于 2026 年 10 月 24 日移除其使用的接口。下表中的 ray-2、ray-flash-2 和 ray-1-6 行仅作参考保留。
+ **已弃用**:旧版 **Luma 文本转视频** 和 **Luma 图像转视频** 节点已弃用,Luma 将于 2026 年 10 月 24 日移除其使用的接口,请改用 **Luma Ray 3.2** 节点。下表中的 ray-2、ray-flash-2 和 ray-1-6 行仅作参考保留;**ray-1-6** 自 2026 年 9 月起已停止提供,因此在截止日期之前只有 **ray-2** 和 **ray-flash-2** 可用。
固定 **/次** 价格与每个 `duration` 选项的节点徽章一致。**编辑**和**重构图**按 **(积分/秒) × 视频长度**计费。**ray-1-6** 始终 **105.50 / 次**。