Phota Generate
Putting a real person (or pet) in a generated image, properly
- subject_1
- subject_2
- IMAGE
The hero node of the pack
PhotaGenerate is text-to-image where a trained profile supplies the subject's true likeness. This is the node the README's dog example is built around: train a profile from six photos of the animal, then write "a portrait of [[profile]] as an astronaut" and get the same recognizable dog in a spacesuit - no LoRA, no insightface, no model downloads.
If you've been around local ComfyUI, you know the alternatives and their friction. A character LoRA means training on your own GPU and managing weights. IP-Adapter or InstantID give you a face from a single reference, but the likeness is approximate - the community's own verdict in the knowledge base is that InstantID "gets close to a likeness and stops." Reactor is a pixel swap bolted on after the fact. Phota's bet is that a hosted training run on 5–50 photos buys you identity that survives generation and edits. It's a real tradeoff, not a magic trick: you pay per image, and your prompts and results leave your machine.
How it works
The prompt uses inline placeholders. [[profile]] expands to all connected subjects together; [[profile1]] and [[profile2]] place each subject in a distinct role - "[[profile1]] teaching [[profile2]] to shake paws" maps each to a different profile. If you forget the placeholders entirely, the node splices the references in for you, appending something like "Featuring [[id_a]] and [[id_b]]." to your prompt.
Profiles can arrive three ways: comma-separated IDs in the profile_id field, or the typed subject_1 / subject_2 sockets fed from a Phota Profile Selector or Train Profile node. The sockets always bind subject_1 to [[profile1]] and subject_2 to [[profile2]] regardless of what's typed - that's the way to get two subjects into distinct roles without fighting the text.
The inputs that matter
- prompt - multiline. The default is already a good template: "A portrait of
[[profile]]on a mountain summit at golden hour." - num_outputs - 1–4 images per run.
- aspect_ratio / resolution / quality - 1:1/3:4/4:3/9:16/16:9, 1K–4K. Leave
qualityon auto unless you're ongpt-image-2; some models reject the field. - base_model - dropdown populated live from the API (
flux-2,flux-2-pro,gpt-image-2,nb2,qwen-image-2,seedream-5-pro).autouses the server default.
Output is a single IMAGE socket, straight into PreviewImage or a Save node. The generation runs async, so a slow call doesn't stall other queued workflows.
Install, key, and an honest note
Search Phota API Nodes in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/photalabs/comfyui-phota
Restart, and you're done - the only dependency is requests, and nothing runs locally. You need a key from platform.photalabs.com; set it via PHOTA_API_KEY or phota.ini rather than the api_key widget, because widget values get embedded in shared workflow JSON/PNG.
The honest note: this is a small, newer service. There's no wall of community threads to lean on, so the README's example workflows are the best way to judge it - drag generate.json onto the canvas and see whether the likeness beats your local IP-Adapter setup. If you're already happy with a trained LoRA, this is a convenience play, not an upgrade. If you have no GPU and a person you want to feature consistently, it's arguably the most direct route that exists in ComfyUI right now.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | A portrait of [[profile]] on a mountain summit at golden hour. | Write [[profile]] for all connected subjects together, or [[profile1]]/[[profile2]] to place each subject in a distinct role. |
| num_outputs | INT | 11–4 | — |
| aspect_ratio | COMBO | auto | 6 options: auto, 1:1, 3:4, 4:3, 9:16, 16:9 |
| resolution | COMBO | 1K | 3 options: 1K, 2K, 4K |
| quality | COMBO | auto | 4 options: auto, low, medium, high |
| profile_idopt | STRING | Profile ID(s) for identity preservation — connect a Phota Profile Selector or paste IDs, comma-separated for multiple subjects. The typed subject_1/subject_2 sockets take precedence for placeholder positions. | |
| api_keyopt | STRING | Leave empty (recommended) to use the PHOTA_API_KEY environment variable or phota.ini. A key typed here is saved inside the workflow — do not share such workflows. | |
| base_modelopt | COMBO | auto | Base model. 'auto' uses the API default. |
| subject_1opt | PHOTA_PROFILE | Typed profile reference; fills [[profile1]] (and joins [[profile]]). | |
| subject_2opt | PHOTA_PROFILE | Typed profile reference; fills [[profile2]] (and joins [[profile]]). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |