ComfyUI の API でプロンプトを書き換えても、生成される絵の内容が変わらない
ComfyUI の API でプロンプトを差し替えても絵が変わらない(CLIPTextEncodeSDXL の text_g / text_l)
ComfyUI の API 形式の workflow でプロンプトを書き換えたのに、出てくる絵が変わらない。CLIPTextEncodeSDXL には text という入力がなく、書いたキーは黙って捨てられる。text_g と text_l を書き換えれば直る。
- 公開
- 書き手
- 開発記録をもとに AI が書いた(本人の確認はまだ)
- 検査
- 別の AI による校正・根拠の照合と、機密の検査を通した(2026.10.14)
- 裏取り
- 公開前に AI が別に確かめた:ComfyUI の master(0.40.0)のソースで、CLIPTextEncodeSDXL の入力が text_g / text_l で text がないこと、検証(validate_inputs)が定義した入力だけを見ること、実行時(get_input_data)に定義にない値を渡さないことを確かめた。画像の生成は試していない。(2026.10.14)
- 根拠
- 4 件
先に結論
- SDXL 用のノード
CLIPTextEncodeSDXLにはtextという入力がない。プロンプトはtext_gとtext_lの二つに入る。 - API 形式の workflow で
inputs["text"]に書いても、ComfyUI はエラーを出さない。定義にないキーは黙って捨てられ、元のプロンプトのまま生成される。 text_gとtext_lを書き換えれば直る。書き換える先のキーがなければ止まるようにしておくと、同じ取り違えに気づける。
症状:テーマを変えても絵が同じ
ComfyUI に workflow を API で送り、テーマごとにプロンプトを差し替えて絵を作る比較用のスクリプトで起きた。
テーマ名は変わるのに、出てくる絵の内容はほぼ同じ。エラーは出ない。開発記録の時点では、ComfyUI の再起動の影響も疑っていた。
原因:書いたキーがノードに届いていない
スクリプトは、プロンプトのノードの inputs["text"] を書き換えていた。通常の CLIPTextEncode ならそれで合っている。
ところが SDXL 用の CLIPTextEncodeSDXL の入力は、ComfyUI のソースではこうなっている。
| ノード | プロンプトの入力 |
|---|---|
CLIPTextEncode |
text |
CLIPTextEncodeSDXL |
text_g, text_l |
CLIPTextEncodeSDXLRefiner |
text |
text は CLIPTextEncodeSDXL の入力ではない。それでも送った JSON は通る。
- 送られた workflow の検証(
execution.pyのvalidate_inputs)は、ノードが定義している入力だけを見る。余分なキーは調べないので、エラーにならない。 - 実行時(同じファイルの
get_input_data)は、定義にない入力のうち、ほかのノードへのリンクでない値(文字列など)をノードに渡さない。
結果として inputs["text"] に書いた新しいテーマは捨てられ、ノードは元の text_g / text_l のまま絵を作る。
直し方:text_g と text_l を書き換える
API 形式の workflow は、ノードの番号ごとに class_type と inputs を持つ JSON。CLIPTextEncodeSDXL のところはこういう形になる。
"6": {
"class_type": "CLIPTextEncodeSDXL",
"inputs": {
"clip": ["4", 1],
"width": 1024, "height": 1024,
"crop_w": 0, "crop_h": 0,
"target_width": 1024, "target_height": 1024,
"text_g": "...",
"text_l": "..."
}
}
書き換えるのは text_g と text_l。二つとも同じ文にするなら、こう書ける。ノードの種類で分けずに、あるキーだけを書き換え、どれもなければ止める。
def set_prompt(prompt, node_id, text):
inputs = prompt[node_id]["inputs"]
keys = [k for k in ("text_g", "text_l", "text") if k in inputs]
if not keys:
raise KeyError(f"node {node_id} has no text input: {sorted(inputs)}")
for k in keys:
inputs[k] = text
大事なのは、もとからあるキーだけを書き換えること。決め打ちのキー名に代入する書き方だと、名前を間違えたときに新しいキーが足されるだけで、何も起きずに通ってしまう。
確かめ方
ComfyUI 本体は動かさずに、ソースから写した「定義にない入力は捨てる」規則で、ノードに届くプロンプトを三つのテーマで比べた。
| 書き換えたキー | ノードに届いたプロンプト |
|---|---|
text |
3 テーマとも元のまま(1 種類) |
text_g / text_l |
テーマごとに別(3 種類) |
手元の workflow で確かめるなら、送る直前の JSON で、プロンプトのノードの inputs のキーを見る。text_g / text_l があるのに text も増えていたら、この取り違えが起きている。
開発記録では、text_g / text_l を書き換えるよう直したあと、テーマごとに正しく絵が変わった。
確かめた環境
| 項目 | 版 |
|---|---|
| ComfyUI のソース | v0.35.0 と、master(0.40.0) |
| 再現に使った Python | 3.13.14(標準ライブラリだけ) |
再現は、ComfyUI を動かさずに workflow の書き換えだけを試したもの。画像の生成までは確かめていない。