Skip to content

Commit b610945

Browse files
committed
dev: RemoteComboOptions example
Signed-off-by: bigcat88 <bigcat88@icloud.com>
1 parent fdf9290 commit b610945

2 files changed

Lines changed: 130 additions & 0 deletions

File tree

comfy_api_nodes/nodes_elevenlabs.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,85 @@ def execute(cls, voice: str) -> IO.NodeOutput:
233233
return IO.NodeOutput(voice_id)
234234

235235

236+
class ElevenLabsRichVoiceSelector(IO.ComfyNode):
237+
@classmethod
238+
def define_schema(cls) -> IO.Schema:
239+
return IO.Schema(
240+
node_id="ElevenLabsRichVoiceSelector",
241+
display_name="ElevenLabs Voice Selector (Rich)",
242+
category="api node/audio/ElevenLabs",
243+
description="Select an ElevenLabs voice with audio preview and rich metadata.",
244+
inputs=[
245+
IO.Combo.Input(
246+
"voice",
247+
remote_combo=IO.RemoteComboOptions(
248+
route="/proxy/elevenlabs/v2/voices",
249+
refresh_button=True,
250+
refresh=43200000,
251+
use_comfy_api=True,
252+
page_size=100,
253+
item_schema=IO.RemoteItemSchema(
254+
value_field="voice_id",
255+
label_field="name",
256+
preview_url_field="preview_url",
257+
preview_type="audio",
258+
search_fields=["name", "labels.gender", "labels.accent", "labels.use_case"],
259+
),
260+
),
261+
tooltip="Choose a voice with audio preview.",
262+
),
263+
],
264+
outputs=[
265+
IO.Custom(ELEVENLABS_VOICE).Output(display_name="voice"),
266+
],
267+
is_api_node=False,
268+
)
269+
270+
@classmethod
271+
def execute(cls, voice: str) -> IO.NodeOutput:
272+
return IO.NodeOutput(voice) # voice is already the voice_id from item_schema.value_field
273+
274+
275+
class ElevenLabsSharedVoiceSelector(IO.ComfyNode):
276+
@classmethod
277+
def define_schema(cls) -> IO.Schema:
278+
return IO.Schema(
279+
node_id="ElevenLabsSharedVoiceSelector",
280+
display_name="ElevenLabs Shared Voice Selector",
281+
category="api node/audio/ElevenLabs",
282+
description="Browse the ElevenLabs shared voice library (11K+ community voices) with audio preview.",
283+
inputs=[
284+
IO.Combo.Input(
285+
"voice",
286+
remote_combo=IO.RemoteComboOptions(
287+
route="/proxy/elevenlabs/v1/shared-voices",
288+
refresh_button=True,
289+
refresh=43200000,
290+
use_comfy_api=True,
291+
page_size=100,
292+
item_schema=IO.RemoteItemSchema(
293+
value_field="voice_id",
294+
label_field="name",
295+
preview_url_field="preview_url",
296+
preview_type="audio",
297+
description_field="descriptive",
298+
search_fields=["name", "gender", "accent", "use_case", "descriptive"],
299+
),
300+
),
301+
tooltip="Browse shared voices with audio preview.",
302+
),
303+
],
304+
outputs=[
305+
IO.Custom(ELEVENLABS_VOICE).Output(display_name="voice"),
306+
],
307+
is_api_node=False,
308+
)
309+
310+
@classmethod
311+
def execute(cls, voice: str) -> IO.NodeOutput:
312+
return IO.NodeOutput(voice)
313+
314+
236315
class ElevenLabsTextToSpeech(IO.ComfyNode):
237316
@classmethod
238317
def define_schema(cls) -> IO.Schema:
@@ -911,6 +990,8 @@ async def get_node_list(self) -> list[type[IO.ComfyNode]]:
911990
return [
912991
ElevenLabsSpeechToText,
913992
ElevenLabsVoiceSelector,
993+
ElevenLabsRichVoiceSelector,
994+
ElevenLabsSharedVoiceSelector,
914995
ElevenLabsTextToSpeech,
915996
ElevenLabsAudioIsolation,
916997
ElevenLabsTextToSoundEffects,

comfy_api_nodes/nodes_kling.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3242,6 +3242,54 @@ async def execute(
32423242
return IO.NodeOutput(await download_url_to_video_output(final_response.data.task_result.videos[0].url))
32433243

32443244

3245+
KLING_ELEMENT_ID = "KLING_ELEMENT_ID"
3246+
3247+
3248+
class KlingElementSelector(IO.ComfyNode):
3249+
"""Select a Kling preset element (character, scene, effect, etc.) for use in video generation."""
3250+
3251+
@classmethod
3252+
def define_schema(cls) -> IO.Schema:
3253+
return IO.Schema(
3254+
node_id="KlingElementSelector",
3255+
display_name="Kling Element Selector",
3256+
category="api node/video/Kling",
3257+
description="Browse and select a Kling preset element with image preview. Elements provide consistent characters, scenes, costumes, and effects for video generation.",
3258+
inputs=[
3259+
IO.Combo.Input(
3260+
"element",
3261+
remote_combo=IO.RemoteComboOptions(
3262+
route="/proxy/kling/v1/general/advanced-presets-elements",
3263+
refresh_button=True,
3264+
refresh=43200000,
3265+
use_comfy_api=True,
3266+
response_key="data",
3267+
item_schema=IO.RemoteItemSchema(
3268+
value_field="task_result.elements.0.element_id",
3269+
label_field="task_result.elements.0.element_name",
3270+
preview_url_field="task_result.elements.0.element_image_list.frontal_image",
3271+
preview_type="image",
3272+
description_field="task_result.elements.0.element_description",
3273+
search_fields=["task_result.elements.0.element_name", "task_result.elements.0.element_description"],
3274+
),
3275+
),
3276+
tooltip="Select a preset element to use in video generation.",
3277+
),
3278+
],
3279+
outputs=[IO.Custom(KLING_ELEMENT_ID).Output(display_name="element_id")],
3280+
hidden=[
3281+
IO.Hidden.auth_token_comfy_org,
3282+
IO.Hidden.api_key_comfy_org,
3283+
IO.Hidden.unique_id,
3284+
],
3285+
is_api_node=False,
3286+
)
3287+
3288+
@classmethod
3289+
async def execute(cls, element: str) -> IO.NodeOutput:
3290+
return IO.NodeOutput(element)
3291+
3292+
32453293
class KlingExtension(ComfyExtension):
32463294
@override
32473295
async def get_node_list(self) -> list[type[IO.ComfyNode]]:
@@ -3271,6 +3319,7 @@ async def get_node_list(self) -> list[type[IO.ComfyNode]]:
32713319
KlingVideoNode,
32723320
KlingFirstLastFrameNode,
32733321
KlingAvatarNode,
3322+
KlingElementSelector,
32743323
]
32753324

32763325

0 commit comments

Comments
 (0)