# プロンプト変数

> ノードのラベルを波かっこで囲んで、別のノードの値をプロンプトに入れる方法を説明します。2 本のパイプでデフォルト値を設定し、@ でキャラクターや名前付きの画像を添付できます。

Source: https://nodaro.ai/ja/docs/concepts/prompt-variables

**プロンプト変数**は、別のノードの値をプロンプトに入れます。`{Mood}` のようにノードのラベルを波かっこで囲んで書くと、プロンプトの実行時に、Nodaro がそれをそのノードのテキストや選択内容に置き換えます。変数を使えば、プロンプトを一度書くだけで、その一部をほかのノード、ピッカー、リストの項目から変更できます。キャラクター、ロケーション、画像の場合は、`@` メンションを使うと、言葉だけでなく画像そのものを添付できます。

## 仕組み
Workflow: 「画像生成」のプロンプトは、ほかの 2 つのノードを指定しています。実行時に、変数は Subject ノードのテキストと、ムードピッカーの文言に置き換わります。

- テキスト → 画像生成 (prompt)
- ムード → 画像生成 (look)

1. 値の取得元となるノードに、「Subject」のようなラベルを付けます。ピッカーには、「Mood」のようなラベルがすでに付いています。
2. 別のノードのプロンプトに、`A portrait of {Subject}, {Mood}, soft window light` のように、ラベルを波かっこで囲んで書きます。
3. 取得元のノードを、プロンプトのあるノードに接続します。ピッカーの値は、接続しなくてもワークフローのどこからでも使えます。
4. ノードを実行します。Nodaro は、各変数を対応するノードの現在の値に置き換えます。

プロンプトエディターで `{` を入力すると、変数を挿入できます。変数名では、大文字と小文字は区別されません。`{mood}`、`{Mood}`、`{MOOD}` はすべて、「Mood」というラベルのノードを指します。変数ごとに取得元が 1 つに決まるように、取得元のノードにはそれぞれ異なるラベルを付けてください。

## デフォルト値
変数には、2 本のパイプの後に、代わりに使う値（フォールバック）を付けられます。変数の値を提供するものが何もない場合、Nodaro はこのフォールバックを使います。

- `{person || man}` は、[**人物**](https://nodaro.ai/docs/nodes/creative-controls/person)（Person）ピッカーが接続されていればそれを使い、なければ「man」という単語を使います。人物ピッカーがない場合、プロンプト `generate a {person || man} running` は「generate a man running」になります。
- パイプの後に何もない `{person || }` は、値を提供するノードがない場合、何も入りません。
- フォールバックの前後のスペースは削除されます。

多くの標準[プリセット](https://nodaro.ai/docs/concepts/presets)では、`{brand || a modern tech startup}` のようなデフォルト値を使っています。そのため、変更せずに実行しても、プリセットは妥当な結果になります。変数全体を自分の言葉に置き換えるか、一致するラベルのノードを接続して、実行時に値を入れてください。

## 強調表示
設定パネルのプロンプトエディターと、Ctrl+E で開く大きなプロンプトエディターでは、変数が次のように強調表示されます。

| 強調表示 | 意味 |
| --- | --- |
| シアン | 接続されたノードがこの名前を提供しているか、組み込みのテンプレート変数の名前です。 |
| アンバー | この名前を提供する接続済みのノードが、まだありません。これはエラーではなく警告です。デフォルト値のある変数は、そのまま機能します。 |

デフォルト値のある変数では、デフォルトのテキストが使われる場合は、明るく表示されます。接続されたノードの値に置き換わる場合は、グレーの取り消し線付きで表示されます。

ノードが送信するテキストを正確に確認するには、ノードのプロンプト欄を**編集**から**最終**に切り替えるか、設定パネルのプロンプト欄で**最終プロンプトを表示**をクリックします。最終ビューでは、プロンプトの各部分が出どころごとに色分けされ、凡例として**変化に富む**、**ピッカー**、**スニペット**、**前後のテキスト**、**リファレンス**、**スタイル**、**ネガティブ**が表示されます。**最終プロンプトをコピー**で、結果をコピーできます。

![最終ビューで表示した画像生成のプロンプト。解決された変数、ピッカーの文言、前後のテキストが異なる色で表示され、その下に色の凡例があります。](https://nodaro.ai/docs-media/screens/en/concepts/prompt-final-view.light.webp)

## 変数を解決できない場合
- **どのノードにも一致しない名前があると、実行は止まります**。デフォルト値のない変数が、ワークフローのどこにも存在しないノードを指定している場合、何かが送信されたり課金されたりする前に実行は拒否されます。そのため、入力ミスで誤った画像が作られることはありません。
- **値のないノードは、空のテキストになります**。ノードは存在するものの、まだ何も出力していない場合、デフォルト値のない変数は空のテキストになります。
- **接続されたテキストは書き換えられません**。変数ではなく入力を通して届いたテキストは、そのまま使われます。その中の波かっこは、変数として扱われません。
- **予約されている名前があります**。プロンプトテンプレートでは、`{userPrompt}` のような組み込みの名前をいくつか使います。これらの名前は、ノードのラベルではありません。

**ノードが足りない場合**：プロンプトのあるノードを選択し、Tab を押してノードを追加します。**自動接続**がオンの場合、接続ダイアログに、プロンプトの**不足している変数**が表示されます。1 つを選ぶと、新しいノードにその名前が付き、自動で接続されます。

## 直接入力したプロンプトと接続したプロンプト
ノードには、直接入力したプロンプトと、**プロンプト**入力に接続したプロンプトを同時に持たせることができます。

- **画像生成**（Generate Image）と**動画生成**（Generate Video）では、接続したプロンプトが、直接入力したプロンプトの後に追加されます。直接入力したプロンプトで、接続したノードをすでに変数として指定している場合、そのテキストは変数の位置にだけ入ります。接続したプロンプトを追加しないようにするには、設定パネルの**プロンプト挿入**にある**プロンプトを挿入**をオフにします。接続がグレーになるのは、ノードが接続したテキストを使わない場合だけです。これは、**プロンプトを挿入**がオフで、プロンプトで接続したノードを指定していない場合か、そのノードの後に別のテキストノードが接続されている場合に起こります。グレーの接続にポインターを合わせると、理由が「未使用：『プロンプトを挿入』がオフです」または「未使用：後から接続したテキストノードに置き換えられています」と表示されます。
- **ほかのノード**では、直接入力したプロンプトが優先されます。接続したプロンプトが使われるのは、直接入力したプロンプトが空の場合か、直接入力したプロンプトがそれを変数として指定している位置だけです。ノードが接続したプロンプトを使わない場合、接続はグレーになり、「プロンプトで参照されていません」と表示されます。
- **バッチ**では、リストの各項目が、その実行のプロンプトを置き換えます。[リストとバッチ処理](https://nodaro.ai/docs/concepts/lists-and-batching)を参照してください。

## ピッカーがテキストを追加する仕組み
**ムード**（Mood）、**ライティング**（Lighting）、**フレーミング**（Framing）などの[ピッカー](https://nodaro.ai/docs/nodes/creative-controls)は、モデルを実行しません。接続先のノードのプロンプトに、検証済みの文言を次の 2 つの方法のいずれかで追加します。

- **ルックまたはエレメントに接続した場合**：ピッカーの文言が、[画像生成](https://nodaro.ai/docs/nodes/image/generate-image)または[動画生成](https://nodaro.ai/docs/nodes/video/generate-video)のプロンプトの末尾に追加されます。追加しないようにするには、設定パネルで**ルックを挿入**または**エレメントを挿入**をオフにします。
- **変数として指定した場合**：`{Mood}` と書くと、書いた位置にピッカーの文言がそのまま入ります。これは、接続していなくても、どのプロンプトでも機能します。

カタログのピッカーには、どれも**プロンプトヒント**の切り替えがあります。**フル**は選択内容の長い説明を追加し、**コンパクト**は短い用語だけを追加します。コンパクトを使うと、多くのピッカーを 1 つのノードに接続したときにも、プロンプトを短く保てます。ピッカー自体の**カスタムテキスト（前）**と**カスタムテキスト（後）**は、どちらのモードでも文言の前後に追加されます。ピッカーが追加する言葉を正確に確認するには、ピッカーを**プロンプト**または**両方**の表示モードに切り替えます。

## @ によるキャラクターと画像のメンション
`@` メンションは、リファレンス画像を添付し、入力した位置に対応するフレーズを書き込みます。画像ノードや動画ノードのプロンプトで `@` を入力すると、候補から選べます。

| メンション | 添付されるもの |
| --- | --- |
| キャラクター（例：`@maya`） | 接続された[**キャラクターアセット**](https://nodaro.ai/docs/nodes/assets/character)（Character Asset）ノードの、承認済みのキャラクター画像と説明 |
| ロケーション（例：`@old-library`） | 接続された[**ロケーションアセット**](https://nodaro.ai/docs/nodes/assets/location)（Location Asset）ノードの、ロケーションの画像と説明 |
| 名前付きの画像（例：`@town:1`） | 「Town」というラベルが付いた、接続済みの[**画像アップロード**](https://nodaro.ai/docs/nodes/image/upload-image)（Upload Image）ノード |
| クリーチャーやオブジェクト（例：`@nessie:1`） | 接続済みの[**動物／クリーチャーアセット**](https://nodaro.ai/docs/nodes/assets/creature)（Animal/Creature Asset）ノード、または[**オブジェクト／小道具アセット**](https://nodaro.ai/docs/nodes/assets/object)（Object/Props Asset）ノード。候補の一覧がないため、手で入力します。 |

メンションでは、リファレンスから何を使うかも指定できます。`@town:1:background` は「the background from reference image A」になり、`@maya:1:clothes` は服だけを使います。キャラクターとロケーションは、プロンプト内にチップとして表示されます。チップのサムネイルをクリックすると、そのキャラクターやロケーションの別の画像を選べます。チップのラベルをクリックすると、そこから何を使うかを選べます。すべての役割と顔の固定については、[リファレンスの役割](https://nodaro.ai/docs/guides/reference-roles)で説明しています。

数字で始まるラベルはメンションに使えないため、名前を変更してください。キャラクターやロケーションが画像と同じ名前の場合は、キャラクターやロケーションが優先されます。

## 接続したリファレンスの指定
[Seedance 2](https://nodaro.ai/docs/models/video/seedance-2) のように複数のリファレンスを受け付ける動画モデルでは、位置を表すトークンを使って、フレーズを接続済みのリファレンスの 1 つに向けられます。

| トークン | 変換後 |
| --- | --- |
| `{image:1:person}` | 「the person from @image_1」 |
| `{image:2:jacket}` | 「the jacket from @image_2」 |
| `{image:1}` | 「the subject in @image_1」 |
| `{video:1:clip}` | 「the clip from @video_1」 |
| `{audio:1:voice}` | 「the voice from @audio_1」 |

番号は、まず**画像リファレンス**に接続した画像に順番どおりに付けられ、次に**アセット**に接続したアセットに付けられます。接続したリファレンスの数より大きい番号のトークンは、単なるラベルになります。リファレンスに対応していないモデルも、単なるラベルとして読み取ります。

## 変数を使える場所
- 画像、動画、オーディオ、音楽、音声、テキストの各ノードの**プロンプト**と、[**テキスト**](https://nodaro.ai/docs/nodes/automate/text)（Text）ノードのテキスト。
- **前後のテキスト**：[プロンプトの前後のテキスト](https://nodaro.ai/docs/concepts/prompt-pre-post-text)を参照してください。
- **リストの項目**：バッチの各項目に、変数を含められます。
- **一部のユーティリティ設定**：たとえば、[**セレクター**](https://nodaro.ai/docs/nodes/automate/selector)（Selector）ノードの除数、値、シードのフィールドです。

値ではなく再利用できるテキストを挿入するには、プロンプトで `/` を入力して[プロンプトスニペット](https://nodaro.ai/docs/guides/prompt-snippets)を開きます。スニペットは、プレーンテキストとして挿入されます。

## Frequently asked questions

### Nodaro のプロンプト変数とは何ですか？

プロンプトの中に、{Mood} のように波かっこで囲んで書いたノードのラベルです。ノードの実行時に、Nodaro は変数をそのノードのテキストや選択内容に置き換えます。そのため、プロンプトの一部を別のノードから変更できます。

### 存在しないノードを変数で指定すると、どうなりますか？

何かが送信されたり課金されたりする前に、実行が止まります。そのため、入力ミスで誤った結果が作られることはありません。名前を修正するか、2 本のパイプの後にデフォルト値を追加してください。

### 変数にデフォルト値を設定するには、どうすればよいですか？

{person || man} のように、2 本のパイプの後にデフォルト値を書きます。Nodaro は、接続されたノードがあればそのノードを使い、なければ「man」という単語を使います。{person || } のようにデフォルト値が空の場合は、何も入りません。

### 変数がアンバーで強調表示されるのはなぜですか？

アンバーは、その名前を提供する接続済みのノードがまだないことを表します。これはエラーではなく警告です。デフォルト値のある変数はそのまま機能し、ピッカーの値は接続しなくても使えます。

### 変数と @ メンションの違いは何ですか？

変数はテキストを挿入します。@ メンションは、キャラクター、ロケーション、名前付きの画像をリファレンス画像として添付し、入力した位置に「the person from reference image A」のようなフレーズを書き込みます。
