Zhenzhen Sora2 Character
One @mention, same actor in every Sora 2 shot
- id
- username
- permalink
- profile_picture_url
- response
Character consistency is the reason most people abandon text-to-video in disgust. Comfly_sora2_character is the Comfly pack's answer: it clips a few seconds out of a Sora 2 video, registers that person as a reusable character, and gives you a username you can drop into any future Sora 2 prompt with an @ in front. @alice_walking_down_street and the same person shows up. Multiple characters per scene? The README says you can guest-star several at once, just stack the @s.
Like every node in this pack, it's a relay call to ai.comfly.chat - same API key, no local compute, billed per character extraction.
The two ways to feed it
url- a direct link to a Sora 2 video (hosted somewhere reachable).from_task- atask_idfrom a previousComfly_sora2generation. This is the convenient one: generate, then immediately register the actor from the same job's task id.
They're mutually exclusive - the node errors if you fill both, or neither. Pick one.
timestamps is where people stumble. It's a start,end string like "1,3", and the extracted clip must be between 1 and 3 seconds long (the node checks the difference). Three seconds of clean footage is plenty to learn a face, but a two-frame wobble in your source video will do the learning for you, badly. The seed just gives you reproducibility across runs.
What you get back
id- the internal character idusername- the string you actually use. This is the important one: type@usernameinto aComfly_sora2prompt to summon the character.permalink- a link to the character's page on the relay, if you need to show someoneprofile_picture_url- the extracted mugshotresponse- the JSON log
There's no image or video output, which surprises people. This node produces identity, not content - wire username into the text of your video node's prompt, not into a node socket.
Install
Standard for the pack: ComfyUI Manager → search "Comfyui_Comfly" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/ainewsto/Comfyui_Comfly
API key from ai.comfly.chat goes in the optional api_key field and is persisted to Comflyapi.json.
Where it gets fiddly
The whole flow is: generate a Sora 2 video → run this node on its task_id → drop @username into the next prompt. Two things bite. First, the 1–3 second clip window is strict, so pick timestamps that isolate a clean, well-lit moment - a face in motion beats a blink. Second, this all rides on the relay's Sora 2 backend, and character extraction on a low-res or fast-cut clip comes back looking like a stranger. If your cast member drifts across shots, re-extract from a better source video rather than tweaking the prompt. It's a neat trick when it works - just budget a couple of attempts to get a registration you trust.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| timestamps | STRING | 1,3 | — |
| seed | INT | 00–2147483647 | — |
| urlopt | STRING | — | |
| from_taskopt | STRING | — | |
| api_keyopt | STRING | — | |
| skip_erroropt | BOOLEAN | false | 开启后,节点失败时不报错、按旧行为返回默认空结果;关闭时(默认)失败直接抛出错误。 |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| id | STRING | — |
| username | STRING | — |
| permalink | STRING | — |
| profile_picture_url | STRING | — |
| response | STRING | — |