FormSubmitNode
One place to park every LLM API key
- string
The name is a lie in the best way: FormSubmitNode doesn't submit anything to any server, and it never calls an LLM API. It's a credential-parking spot. You pick a provider, paste your key, hit run, and the node stuffs those values into environment variables inside the ComfyUI process and into a shell file on disk. That's the whole job - and for a narrow slice of workflows, it's exactly what you want.
Why you'd install it
Here's the honest framing: this pack contains exactly one node, and that node only writes config. Nothing in the pack reads it back. So its usefulness depends entirely on you having something else that consumes api_key, api_base, and friends from the environment - a custom node that calls an LLM for prompt rewriting, captioning, or image-to-prompt, or your own script.
If you do have that consumer, the appeal is obvious: instead of hardcoding your key into every node or pasting it into each workflow you share, you run this once and downstream code finds it via os.getenv("api_key"). The provider list tells you who the author had in mind - Doubao, Kimi, DeepSeek, and Qwen sit alongside OpenAI and Claude. That's a China-market-friendly lineup (the README is Chinese-first), which is a niche but real convenience if you juggle several of those APIs.
The inputs that matter
All five inputs are required, and four of them are plain text boxes:
type- pick your provider from the dropdown: Doubao, Qwen, OpenAI, Kimi, DeepSeek, or Claude. This becomesllm_typein the environment.api_key- your key. The field that matters most, and the one you should be careful about (more below).api_base- the endpoint URL. Leave it blank if you're hitting a provider's default; set it only for proxies, gateways, or self-hosted deployments.api_version- mostly Azure-style version strings or gateway junk. For most people this stays empty.api_model- the model name string (thinkdeepseek-chat,gpt-4o) that downstream code will actually call with.
The single output, a STRING named string, is vestigial: the node always returns an empty string. Don't wire it into anything expecting text.
How it actually works
Running the node does three things, and the source is worth checking because the README gets one bit wrong. It sets five environment variables in the ComfyUI server process (llm_type, api_key, api_version, api_base, api_model), then writes them out as export lines to custom_nodes/ComfyUI-Custom-Node-Config/files/config.sh. Note the mismatch: the README claims it saves a config.json, but the code writes a shell script full of export statements. README rot, classic. The file also isn't JSON, so don't go parsing it with a JSON reader.
The node is flagged as an output node, so it terminates a branch and runs when you queue the graph. You'll also spot dead imports (aiohttp.web, PromptServer, json) and a README FAQ about missing HTML forms - the author clearly wanted a real form UI, discovered ComfyUI only renders standard INPUT_TYPES widgets, and shipped this instead. Fine. It works.
How to install it
cd ComfyUI/custom_nodes
git clone https://github.com/pictorialink/ComfyUI-Custom-Node-Config
Then restart ComfyUI. It's also findable through ComfyUI Manager if you search the pack title. Good news: there's no requirements.txt and no model downloads - this pack has zero dependencies beyond Python's stdlib.
Where people get burned
- Env vars don't escape the process. They only exist inside the running ComfyUI server, and only after the node has executed. Downstream Python nodes in the same workflow see them; a separately-launched script does not, unless you
source files/config.shfirst. And nothing survives a ComfyUI restart. - Your key is plaintext everywhere. It's a widget value, so it's embedded in your workflow JSON, and it's written in the clear to
config.shon disk. Share that workflow and you've shared the key. - Trust matters. Custom nodes execute arbitrary Python with your user-level permissions, and the community has a documented horror story (the ComfyUI LLMVISION malware that ended in a federal prosecution). This node is only a config dumper so the risk surface is small, but install it from the real repo, not some repackaged copy.
Honest bottom line: it's a ~10-line node that a competent Python user could write in five minutes. But if you're not that user and you want one visible, clickable place to enter LLM credentials, FormSubmitNode does it without fuss. Treat it as a personal convenience, not infrastructure.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| type | COMBO | 6 options: Doubao, Qwen, OpenAI, Kimi, DeepSeek, Claude | |
| api_key | STRING | — | |
| api_version | STRING | — | |
| api_base | STRING | — | |
| api_model | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| string | STRING | — |