Provider: BytePlus ModelArk
Seedream Has Two Doors and This Is the One You Can Pay For
- provider
Seedream is one of the closed models people actually want in their graph - no weights, no local option, and a reputation for rendering text and product shots cleanly. It lives behind two doors, and they are not interchangeable: Volcengine Ark, the China endpoint, and BytePlus ModelArk, the international one. This node is the second door. If you signed up on the BytePlus side and got ark.ap-southeast.bytepluses.com in your dashboard, this is the node you plug in.
What it actually is
A provider node. It runs no model and generates nothing. Its only job is to hold connection settings and hand them downstream through a provider output of type YOGURT_LLM_PROVIDER - a small object carrying the provider's kind plus whatever you typed into the fields. You wire that into a model node (the pack's Seedream node, or the custom-model nodes), and the model node does the HTTP call.
That split is the whole point of this pack's LLM half. The same Seedream model is reachable through several providers, and swapping providers is a re-wire, not a re-prompt. Connect a provider that doesn't serve the model you picked and the run stops with an error that names the providers that do - annoying, but honest, and much better than silently generating something else.
The four fields
All four are always visible, which is unusual for this pack - compare the model nodes, where the inputs change with the version you pick.
- api_key - empty is fine if you've set up
api_key.jsonor the environment variable. The resolution order is strict: field first, thenbyteplusincustom_nodes/ComfyUI-YogurtNodes/yogurt_nodes/llm/api_key.json, thenBYTEPLUS_API_KEY. Nothing found means the run dies with a message telling you exactly which two places to put it. - base_url - defaults to
https://ark.ap-southeast.bytepluses.com/api/v3when left blank. Set it only if BytePlus gives you a different regional host. - proxy_url -
http://127.0.0.1:7890orsocks5://127.0.0.1:1080style. Useful when the model endpoint is reachable but your own network isn't cooperative. - timeout - seconds,
0means no limit. Image generation regularly takes tens of seconds to a couple of minutes; leave it at 0 unless you have a reason.
The output is a single provider socket. That's it - one wire, no previews.
Install
The pack is on the Comfy Registry, so ComfyUI Manager → search "YogurtNodes" → install, then restart. Manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/yogurt7771/ComfyUI-YogurtNodes
cd ComfyUI-YogurtNodes
pip install -r requirements.txt
That installs five packages (numpy, pillow, openai, google-genai, requests) - use the same Python ComfyUI runs under, which on the Windows portable build means python_embeded\python.exe -m pip .... The README also lists opencv-python, and its pyproject.toml agrees, but requirements.txt doesn't include it. For provider and LLM nodes that's irrelevant; it only bites the Poisson Blend image node.
Then drop your key in a file rather than the widget if you have more than one provider in play:
{ "byteplus": "your-key-here" }
That's custom_nodes/ComfyUI-YogurtNodes/yogurt_nodes/llm/api_key.json. Keep it out of workflow shares - API keys typed into a node widget travel with the workflow JSON.
Where people get tripped up
Wrong door. A BytePlus key on the Volcengine endpoint (or vice versa) fails as an auth error, which reads like "my key is broken." It isn't; it's the wrong host. Defaults are correct if you leave base_url empty and genuinely bought from BytePlus.
Model name doesn't match the door. BytePlus serves the same Seedream line with slightly different model IDs than the China Ark. The pack's Seedream node routes per provider, so let it - if you're hand-typing a model ID into a custom-model node, copy it out of the BytePlus console rather than from a Chinese blog post.
Expecting it to be a chat model. This provider exposes both chat and image protocols, but the thing you came for is image generation. Point it at a chat node with a model id that doesn't exist there and you'll get a 404 dressed up as RuntimeError: ... failed after 1 attempt(s).
Worth knowing before you pay
Per-call pricing is the honest catch with every closed model in a graph (the KB's external-api-nodes.md covers the tradeoffs), and Seedream is no exception - it's the single most common reason people bounce off API nodes and go back to something local. The flip side is the reason this node exists at all: you cannot run Seedream locally at any VRAM, so the only question is which door you go through.
One last thing. retry_count lives on the model node, not here. Keep it at 1 while you're debugging so you see the real error instead of three identical failures.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | Leave empty to use 'byteplus' from api_key.json, then the BYTEPLUS_API_KEY environment variable. | |
| base_url | STRING | Default https://ark.ap-southeast.bytepluses.com/api/v3. | |
| proxy_url | STRING | Proxy URL, e.g. http://127.0.0.1:7890 or socks5://127.0.0.1:1080. | |
| timeout | INT | 00–3600 | Request timeout in seconds; 0 means no limit. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| provider | YOGURT_LLM_PROVIDER | — |