# プロンプトウィザード

> ざっくりしたアイデアを REST で最適なプロンプトに変えます。ガイド付きの質問をリクエストし、その答えからプロンプトを作成するか、1 回の呼び出しでプロンプトを改善します。

Source: https://nodaro.ai/ja/docs/developers/api/prompt-wizard

**プロンプトウィザード API** は、ざっくりしたアイデアを、生成ノード用の最適化されたプロンプトに変えます。エンドポイントは `POST /v1/prompt-helper/wizard` の 1 つだけで、`action` フィールドによって 3 つのことを行います。ガイド付きの質問をする（`analyze`）、答えからプロンプトを作る（`generate`）、1 段階でプロンプトを書き直す（`enhance`）です。これは、プロンプトのフィールドにある AI ボタンからエディターが開くのと同じウィザードです。

このルートは、どのエディションでも使え、ベアラートークンが必要です。呼び出しのたびに、言語モデルの呼び出し 1 回分のクレジットが確保されます。[認証](https://nodaro.ai/docs/developers/api/authentication)を参照してください。

## エンドポイント
| メソッド | パス | `action` | 戻り値 |
| --- | --- | --- | --- |
| `POST` | `/v1/prompt-helper/wizard` | `analyze` | `{ jobId, questions }` |
| `POST` | `/v1/prompt-helper/wizard` | `generate` | `{ jobId, prompt, recommendedModel? }` |
| `POST` | `/v1/prompt-helper/wizard` | `enhance` | `{ jobId, prompt, recommendedModel? }` |

## ガイド付きの質問をリクエストする
`analyze` は、アイデアと対象のノードタイプを読み取り、プロンプトを最も改善しそうな点について質問を返します。被写体、ライティング、カメラ、雰囲気などです。各質問には候補の答えが付き、ウィザードが判断できる場合は、最も良いものが選択された状態になります。`prompt` を省略すると、ゼロから始められます。この場合、ウィザードは重要な質問を選び、答えは何も選択しません。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/prompt-helper/wizard \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
"action": "analyze",
"nodeType": "generate-image",
"prompt": "a snow leopard on a ridge",
"provider": "nano-banana-pro",
"aspectRatio": "16:9"
}'
```

**TypeScript SDK**

```ts

const client = createClient({
baseUrl: 'https://app.nodaro.ai',
auth: new StaticTokenAuth(process.env.NODARO_API_KEY!),
})

const { questions } = await client.promptHelper.analyze({
nodeType: 'generate-image',
prompt: 'a snow leopard on a ridge',
})
```

**CLI**

```bash
nodaro prompt analyze --node-type generate-image --prompt "a snow leopard on a ridge" --json

# Interactive questions and answers in the terminal:
nodaro prompt wizard --node-type generate-image --prompt "a snow leopard on a ridge"
```

```json
{
"jobId": "3b7d1f9a-5c2e-4a8b-9d6f-1e4c7a2b5d8f",
"questions": [
{
"category": "lighting",
"label": "Lighting",
"options": [
{ "value": "golden-hour", "label": "Golden hour", "description": "Low warm sun, long shadows" },
{ "value": "overcast", "label": "Overcast", "description": "Soft, even light" },
{ "value": "blizzard", "label": "Blizzard haze", "description": "Flat light through blowing snow" }
],
"selected": "golden-hour",
"allowCustom": true
}
]
}
```

レスポンスには、1〜12 件の質問が含まれます。各質問は `{ category, label, options, selected, allowCustom, multi? }` です。

| フィールド | 意味 |
| --- | --- |
| `category` | 質問の id です。答えを送り返すときに、そのまま使います。 |
| `label` | 人に表示される、質問の文言です。 |
| `options` | 候補の答えで、それぞれ `{ value, label, description? }` です。 |
| `selected` | 候補の答えの `value` です。`multi` が `true` の場合は値のリストになり、何も候補がない場合は `null` です。 |
| `allowCustom` | 自分の言葉で答えられるかどうかです。 |
| `multi` | 複数の答えを選べる場合にだけ存在し、`true` になります。 |

## 答えからプロンプトを作成する
`generate` は、答えから最適化された 1 つのプロンプトを作ります。答えた質問ごとに、選択を 1 つ送ります。`{ category, value, isCustom }` です。`value` が自分の言葉の場合は、`isCustom` を `true` にします。`originalPrompt` を追加すると、元のアイデアを結果に織り込めます。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/prompt-helper/wizard \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
"action": "generate",
"nodeType": "generate-image",
"originalPrompt": "a snow leopard on a ridge",
"selections": [
{ "category": "lighting", "value": "golden-hour", "isCustom": false },
{ "category": "camera", "value": "telephoto from below, 400mm", "isCustom": true }
]
}'
```

**TypeScript SDK**

```ts
const { prompt, recommendedModel } = await client.promptHelper.generate({
nodeType: 'generate-image',
originalPrompt: 'a snow leopard on a ridge',
selections: [
{ category: 'lighting', value: 'golden-hour', isCustom: false },
{ category: 'camera', value: 'telephoto from below, 400mm', isCustom: true },
],
})
```

**CLI**

```bash
nodaro prompt generate --node-type generate-image \
  --original-prompt "a snow leopard on a ridge" \
  --selection lighting=golden-hour --selection camera="telephoto from below, 400mm" --json
```

```json
{
"jobId": "9e1a3c5b-7d2f-4b6a-8c4e-2f5d8b1a3c7e",
"prompt": "A snow leopard stands on a rocky ridge at golden hour, low warm sun raking across its spotted coat, shot from below on a 400mm telephoto lens, snow dust drifting in the backlight.",
"recommendedModel": {
"provider": "nano-banana-pro",
"field": "provider",
"label": "Nano Banana Pro",
"reason": "Strong fine detail for fur and snow texture."
}
}
```

`recommendedModel` は、ウィザードが対象のノードに合うモデルを提案できる場合に含まれます。`provider` は設定するモデルの id、`label` はその名前、`reason` は理由の説明です。モデルが 1 つしかないノードタイプでは、推奨はありません。

## 1 回の呼び出しでプロンプトを改善する
`enhance` は、質問を飛ばして、最適化されたプロンプトを直接返します。`analyze` と同じフィールドを受け付け、`selections` は使いません。

**curl**

```bash
curl -X POST https://app.nodaro.ai/v1/prompt-helper/wizard \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "action": "enhance", "nodeType": "text-to-video", "prompt": "a paper boat in a rainy street", "duration": 5 }'
```

**TypeScript SDK**

```ts
const { prompt } = await client.promptHelper.enhance({
nodeType: 'generate-image',
prompt: 'a snow leopard',
})
const image = await client.nodes.runAndWait('generate-image', { prompt })
```

**CLI**

```bash
PROMPT=$(nodaro prompt enhance --node-type generate-image --prompt "snow leopard" --json | jq -r '.prompt')
nodaro nodes run generate-image --param prompt="$PROMPT" --watch
```

## リクエストのフィールド
<TypeTable
type={{
action: { type: "'analyze' | 'generate' | 'enhance'", description: 'ウィザードが行う処理です。', required: true },
nodeType: { type: 'string', description: 'プロンプトの対象となるノードです。たとえば generate-image、text-to-video、generate-music です。質問とモデルの推奨は、これによって決まります。', required: true },
prompt: { type: 'string', description: 'analyze と enhance で使います。ざっくりしたアイデアで、最大 5,000 文字です。' },
selections: { type: 'array', description: 'generate でのみ使い、1 件以上必要です。答えた質問ごとの { category, value, isCustom } です。' },
originalPrompt: { type: 'string', description: 'generate でのみ使います。織り込む元のアイデアで、最大 5,000 文字です。' },
provider: { type: 'string', description: 'プロンプトを実行するモデルです。言い回しをそのモデルに合わせます。' },
style: { type: 'string', description: 'ノードですでに選択されているスタイルです。' },
aspectRatio: { type: 'string', description: 'プロンプトが使われるフレームです。' },
duration: { type: 'number', description: '動画ノードとオーディオノードでの、クリップの長さ（秒）です。' },
nodeContext: { type: 'object', description: 'ノードに接続されている内容です。connectedInputTypes、referenceImageCount、referenceImageUrls（最大 10 件）、hasSourceVideo です。入力ですでにわかっている内容は、ウィザードが省きます。' },
llmModel: { type: 'string', description: 'ウィザードを実行する言語モデルです。料金のティアを決めます。' },
reasoningEffort: { type: "'none' | 'low' | 'medium' | 'high' | 'xhigh' | 'max'", description: 'モデルがどれだけ長く推論するかです。対応するモデルでのみ使えます。xhigh と max は、1 段階上のティアで課金されます。' },
advancedMode: { type: 'boolean', description: 'Gemini モデル専用です。モデルの開発元自身の API で実行するため、temperature、maxTokens、すべての推論レベルが有効になります。1 段階上のティアで課金されます。' },
temperature: { type: 'number', description: 'advancedMode を使う場合の、サンプリングの温度です。' },
maxTokens: { type: 'number', description: 'advancedMode を使う場合の、回答の最大の長さです。' },
}}
/>

サポートされていないか省略された `reasoningEffort` は、そのモデル自身のデフォルトを使います。Gemini モデルではないモデルに `advancedMode` を指定すると、`400 advanced_mode_unsupported` が返されます。使用できる言語モデルとそのティアについては、[**プロンプト**（Prompt）](https://nodaro.ai/docs/nodes/automate/prompt)ノードを参照してください。

## クレジット
1 回の呼び出しは、言語モデルの呼び出し 1 回分で、`llmModel` のティアで課金され、呼び出しの開始時にクレジットが確保されます。ガイド付きの流れは、`analyze` の後に `generate` と、2 回分の呼び出しになります。新しい質問をリクエストすると、さらに 1 回分かかります。呼び出しが `500` または `502` で失敗した場合、クレジットは返還されます。

## MCP から使う
AI アシスタントは、`workflows:execute` スコープで、`analyze_prompt`、`generate_prompt`、`enhance_prompt` を通じて同じエンドポイントを使います。ツールは同じフィールドを受け付け、Gemini モデルでは `advanced_mode`、`temperature`、`max_tokens` も使えます。[MCP ツールリファレンス](https://nodaro.ai/docs/mcp/tools)を参照してください。

## エラー
| ステータス | コード | 意味 |
| --- | --- | --- |
| `400` | `validation_error` | ボディが無効です。たとえば、不明な `action` や、`selections` のない `generate` です。 |
| `400` | `advanced_mode_unsupported` | Gemini モデルではないモデルに `advancedMode` が送られました。 |
| `401` | `unauthorized` | トークンがないか、無効か、取り消されています。 |
| `402` | `insufficient_credits` | Nodaro Cloud のみです。アカウントが、呼び出しの料金をまかなえません。 |
| `500` | `llm_error` | 言語モデルの呼び出しが失敗しました。クレジットは返還されます。間隔をあけて再試行してください。 |
| `502` | `malformed_response` | モデルの回答を使用できませんでした。クレジットは返還されます。 |
| `503` | `provider_unavailable` | このインスタンスには、言語モデルが設定されていません。 |

## Frequently asked questions

### analyze、generate、enhance は、どう違いますか？

analyze は、ざっくりしたアイデアを、候補の答え付きのガイド付きの質問に変えます。generate は、選んだ答えから、最適化された 1 つのプロンプトを作ります。enhance は、質問を飛ばして、1 回の呼び出しでプロンプトを書き直します。

### プロンプトウィザードの料金は、どのくらいですか？

1 回の呼び出しは、言語モデルの呼び出し 1 回分で、llmModel で選んだモデルのティアで課金されます。ガイド付きの流れをすべて行うと、analyze の後に generate と、合計 2 回の呼び出しになります。新しい質問をリクエストすると、さらに 1 回分かかります。

### プロンプトウィザードは、モデルを推奨しますか？

多くの場合、推奨します。generate と enhance は、対象のノードに合うモデルとその理由を示す recommendedModel を返すことがあります。モデルが 1 つしかないノードタイプでは、推奨はありません。

### ウィザードは、どのノードタイプに対応していますか？

generate-image、image-to-video、generate-music など、プロンプトを持つ生成ノードです。質問とモデルの推奨をノードに合わせるため、ノードタイプを nodeType として渡してください。
