teamToken Image Edit
The closed-model restyle node, and the 1:1 trap that eats your photo
- image
- images
- cost_usd
teamToken Image Edit is teamToken Image with the reference image promoted from optional to required. You give it a picture and an instruction - "make it winter", "remove the person on the left", "turn this sketch into a photograph" - and a closed model edits it and hands back a normal IMAGE. Same gateway, same key, same per-image billing, same hard requirement that the picture leaves your machine.
Why you'd reach for it instead of a local edit model: instruction-following and text rendering. The Nano Banana line and the GPT Image tiers are simply better at "do the thing I described" than anything you can run locally, and they hold a subject's identity across an aggressive restyle in a way that a CFG-guided local Kontext-style model still struggles with. Why you might not: the local edit ecosystem caught up a lot in 2026, and a local edit costs you electricity instead of $0.03 a shot. If you're doing twenty variations to find one you like, local is cheaper. If you're doing one precise edit on a shot that matters, this is the node.
How it works
Source image in, PNG data URL out to /v1/images/edits. That endpoint sounds like a multipart upload, but the gateway treats it identically to /v1/images/generations - plain JSON body, base64 image inside it, no form encoding. Your IMAGE tensor is converted frame by frame: a single-frame batch rides as one reference, a multi-frame batch is sent as a list, so a batch of candidate sources all go up in one request. The gateway returns base64 inline when it's fast, or a 202 job id the node polls when it isn't. Nothing is uploaded to a CDN you chose; it goes where the gateway puts it.
The seed widget is not sent to the API at all. It exists so ComfyUI's own input-equality cache has something to move: identical inputs reuse the previous result for free, and changing the seed forces a fresh, charged generation. That's also the fastest way to get variation out of a prompt you like.
The inputs that matter
Required: model, image, prompt. Optional: aspect_ratio, resolution, n, seed, api_key, server_url.
model- 12 entries in the bundled snapshot:nano-banana-2,nano-banana-pro,grok-image, and ninegpt-image-2variants split across low/medium/high quality and 1K/2K/4K. The list is pulled live from the gateway catalog, so it grows without a node update.prompt- how to edit. Not optional, and a whitespace-only prompt is refused with[EMPTY_PROMPT]before you're billed anything.aspect_ratioandresolution- and here's the trap. The widget defaults to 1:1 and the node always sends it. Drop a 3:2 landscape or a 9:16 vertical in, leave the widget alone, and you've asked the provider to re-render your edit into a square. Set it to match your source unless you actually want a reframe.n- up to 10 edited variants per request, returned as one batchedIMAGE.
Outputs: images and cost_usd. The cost string is the real charge for that call, which is the honest way to find out what a 4K high-quality edit actually costs on your account.
Install
Identical to the rest of the pack, because it is the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/TeamToken-store/ComfyUI-teamToken
pip install requests
# restart ComfyUI
Or ComfyUI-Manager → search ComfyUI-teamToken. One dependency (requests), no model files, no GPU work. Then set the key once - Settings → teamToken → API key, or export TEAMTOKEN_API_KEY=sk-... before launching - and keep it out of the node's api_key field, which writes the key into your workflow file where every export and screenshot can leak it.
Where people get burned
Edits that come back recomposed. Nine times out of ten it's the 1:1 default above. The other time it's the model deciding the source needed "improving", which is normal for instruction-following edit models - be literal in the prompt, and say what must not change.
A square, tiny, or oddly cropped result at 1K. resolution is a tier, not a promise. 1K on a 4K source means the provider is downscaling; ask for the tier you need and pay for it.
A 402 mid-run. Balance ran out. Failed generations aren't charged, but you'll only find out the balance is empty when a node errors - top up at app.teamtoken.store.
Errors you can act on. The gateway forwards provider messages verbatim: GEMINI_RAI_MEDIA_FILTERED on a Nano Banana edit means the provider's safety layer refused, not that your node is broken. Nothing local changes that - there are no weights to abliterate on a closed model, and a reseller that advertises looser filtering is still passing your prompt to the same provider, which does its own refusal.
Job ids don't last. Results live 7 days server-side. The node hands you the bytes immediately, so this only matters if you re-poll an old id later and get an "expired" error.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | Image model, fetched live from the teamToken catalog | |
| image | IMAGE | Source image to edit / restyle | |
| prompt | STRING | How to edit the source image | |
| aspect_ratioopt | COMBO | Output aspect ratio (default 1:1) | |
| resolutionopt | COMBO | Output resolution tier (default 1K) | |
| nopt | INT | 11–10 | How many edited images to generate in one request |
| seedopt | INT | 00–18446744073709550000 | Change to force a fresh (paid) generation; identical inputs reuse the cached result |
| api_keyopt | STRING | Overrides the teamToken settings key. ⚠️ This value is saved INTO the workflow file — prefer the teamToken Settings pane or $TEAMTOKEN_API_KEY so your key isn't shared with the workflow | |
| server_urlopt | STRING | Leave empty to use the teamToken settings / env / default gateway |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| cost_usd | STRING | — |