# ノードの実行

> ワークフローを組まずに、TypeScript から Nodaro のノードを実行します。ノードタイプの検出、実行の開始と待機、リファレンスやカメラの演出の指定までを扱います。

Source: https://nodaro.ai/ja/docs/developers/sdk/nodes

**`client.nodes`** は、Nodaro サーバーが対応するノードタイプを一覧表示し、ワークフローを組まずに、そのうちどれでも直接実行します。実行は、パラメーターをそのノードのエンドポイント `POST /v1/<type>` に送信し、待機できるジョブを返します。これは、[CLI](https://nodaro.ai/docs/developers/cli) が `nodaro nodes run` で使うのと同じ経路で、Nodaro の MCP ツールが使う経路でもあります。REST での見方については、[単体のノードを実行する](https://nodaro.ai/docs/developers/api/nodes)を参照してください。

## メソッド
| メソッド | 内容 |
| --- | --- |
| [`nodes.list()`](#list) | すべてのノードタイプを、モデルとクレジットの料金とともに一覧表示します |
| [`nodes.get(type)`](#gettype) | 1 つのノードタイプを読み取ります |
| [`nodes.run(type, params?, options?)`](#runtype-params-options) | ノードを開始し、すぐにジョブ ID を返します |
| [`nodes.runAndWait(type, params?, opts?)`](#runandwaittype-params-opts) | ノードを開始し、そのジョブをポーリングして、出力を返します |
| [`nodes.runMany(type, paramsList, opts?)`](#runmanytype-paramslist-opts) | 1 つのノードで複数の実行を同時に開始し、すべてを待機します |

## client.nodes
### list()
サーバーが対応するすべてのノードタイプを一覧表示します。応答は、サーバー側で 5 分間キャッシュされることがあります。この呼び出しは無料で、スコープも必要ありません。

```ts
list(): Promise<{ data: NodeDescriptor[] }>
```

```ts
const { data: nodes } = await client.nodes.list()

const imageGenerators = nodes.filter((n) => n.category === "ai-image")
const takesReferences = nodes.filter((n) => n.capabilities?.includes("supports-reference-image"))
```

各 `NodeDescriptor` は、次のフィールドを持ちます。

| フィールド | 型 | 説明 |
| --- | --- | --- |
| `type` | `string` | API のタイプです。`generate-image` などです。`run()` に渡します。 |
| `label` | `string` | エディターでのノードの名前です。 |
| `category` | `string` | カテゴリーです。`ai-image`、`ai-video`、`ai-audio`、`ai-text`、`processing`、`parameter` などです。 |
| `description` | `string` | 1 行の説明です。 |
| `outputType` | `string` | `text`、`image`、`video`、`audio`、`data`、`none` のいずれかです。 |
| `creditCost` | `number \| string` | クレジットの料金です。固定の場合は数値、モデルによって異なる場合は `"2-620"` のような範囲です。Nodaro Cloud のみです。 |
| `providers` | `string[]` | ノードが実行できるモデル ID で、`provider` パラメーターに使います。 |
| `capabilities` | `string[]` | `supports-reference-image` や `supports-end-frame` などのフラグです。 |
| `inputSchema` | `{ fields }` | 設定できる入力フィールドで、それぞれ `key`、`type`、`required`、`options` を持ちます。 |
| `maxDurationSec` | `number` | ノードが受け付ける最長の長さです。長さの制限があるノードにだけ存在します。 |
| `providerResolutions` | `Record<string, string[]>` | 各モデルが受け付ける解像度で、モデルによって異なる場合に存在します。 |

セルフホスティングの Community と Business のインストール環境にはクレジットの仕組みがないため、そのディスクリプターには `creditCost` が含まれません。

### get(type)
1 つのノードタイプのディスクリプターを読み取ります。

```ts
get(type: string): Promise<{ data: NodeDescriptor }>
```

<TypeTable
type={{
type: { type: 'string', required: true, description: "ノードの API タイプです。generate-image や generate-video などです。" },
}}
/>

```ts
const { data: node } = await client.nodes.get("generate-video")
console.log(node.providers)  // every video model id
console.log(node.creditCost) // Nodaro Cloud only
```

モデルの横に料金を表示するには、`node.providers` を [`client.credits.modelCosts()`](https://nodaro.ai/docs/developers/sdk/models-and-credits) に渡します。

### run(type, params?, options?)
1 つのノードを開始し、すぐに応答を返します。ボディは `POST /v1/<type>` に送信されます。これは、すべての生成ノードが使うルートです。フィールド名は、そのノードの入力フィールドと一致します。

```ts
run(type: string, params?: Record<string, unknown>, options?: { idempotencyKey?: string }): Promise<RunNodeResult>
```

<TypeTable
type={{
type: { type: 'string', required: true, description: "ノードの API タイプです。generate-image、image-to-video、text-to-speech などです。" },
params: { type: 'Record<string, unknown>', default: '{}', description: "リクエストボディです。generate-image、generate-video、text-to-video、assemble-narrated-video には、下に一覧する型付きのパラメーターがあります。" },
idempotencyKey: { type: 'string', description: "Idempotency-Key ヘッダーとして送信されます。タイムアウトしたリクエストを再試行するときは同じ値を再利用してください。そうすることで、実行が 2 回開始されたり、2 回課金されたりしません。" },
}}
/>

```ts
const result = await client.nodes.run("generate-image", {
prompt: "A snow leopard in the mountains",
provider: "nano-banana-2",
})

if ("jobId" in result) {
const { data: job } = await client.jobs.getStatus(result.jobId)
console.log(job.status)
}
```

**返ってくるもの。**ほとんどのノードタイプは非同期です。結果には `jobId` が含まれ、ワーカーが生成を行います。終わるまで [`client.jobs.getStatus(jobId)`](https://nodaro.ai/docs/developers/sdk/jobs-and-executions) をポーリングするか、`runAndWait()` を使います。`combine-text` などの一部のインラインノードタイプは、`jobId` を返さずに、完全な結果をすぐに返します。`jobId` の有無で分岐してください。

**パラメーターの補正。**画像のノードタイプ（`generate-image`、`image-to-image`、`edit-image`）では、選んだモデルが受け付けない値を、サーバーが補正することがあります。実行は補正された値のまま進み、確保されるクレジットもそれに合わせたものになります。結果には、補正されたフィールドごとに 1 つのエントリーを持つ `adjustments` が含まれます。

```ts
const result = await client.nodes.run("generate-image", {
prompt: "A snow leopard",
provider: "gpt-image-2",
aspectRatio: "3:2",
})
if ("adjustments" in result && result.adjustments?.length) {
for (const a of result.adjustments) {
console.warn(`${a.field}: ${a.from} -> ${a.to ?? "(dropped)"} (${a.reason})`)
}
}
```

各補正は、`field`（`aspectRatio`、`resolution`、`quality`、`duration` のいずれか）、`from`、`to`、`reason` を持ちます。何も変わらなかった場合、`adjustments` は存在しません。

アカウントが支払えない場合は `InsufficientCreditsError` を、ストレージが満杯の場合は `StorageExceededError` を、デプロイ環境のコンテンツポリシーがリクエストを拒否した場合は `JobBlockedError` をスローします。[エラー](https://nodaro.ai/docs/developers/sdk/errors)を参照してください。

### runAndWait(type, params?, opts?)
1 つの非同期ノードを、完了まで実行します。内部で `run()` を呼び出し、`jobId` を受け取って、ジョブが終わるまで [`client.jobs.getStatus()`](https://nodaro.ai/docs/developers/sdk/jobs-and-executions) をポーリングします。ステータスが `completed` になると、ジョブの出力で解決されます。

```ts
runAndWait(type: string, params?: Record<string, unknown>, opts?: RunAndWaitOptions): Promise<NodeJobOutput>
```

<TypeTable
type={{
type: { type: 'string', required: true, description: "ノードの API タイプです。" },
params: { type: 'Record<string, unknown>', default: '{}', description: "リクエストボディです。run() と同じです。" },
signal: { type: 'AbortSignal', description: "待機を停止し、JobAbortedError で拒否します。ジョブ自体は実行され続けます。" },
onProgress: { type: '(status: JobStatusResult) => void', description: "ポーリングごとに、ジョブのステータスとともに呼び出されます。モデルが報告する場合、status.progress は 0 から 100 まで変化します。" },
pollMs: { type: 'number', default: '2000', description: "ポーリングする間隔で、ミリ秒単位です。" },
maxMs: { type: 'number', default: '900000', description: "JobTimeoutError になるまでの、合計の待機時間で、ミリ秒単位です。" },
idempotencyKey: { type: 'string', description: "実行のリクエストとともに送信されます。同じリクエストを再試行するときに再利用します。" },
}}
/>

```ts
const output = await client.nodes.runAndWait(
"generate-video",
{ prompt: "Rain falls on a neon street at night", provider: "seedance-2-fast", duration: 4 },
{ onProgress: (s) => console.log(`${s.progress ?? 0}%`) },
)
console.log(output.videoUrl, output.thumbnailUrl)
```

出力は `NodeJobOutput` です。画像ノードでは `imageUrl`、動画ノードでは `videoUrl` と `thumbnailUrl`、オーディオノードでは `audioUrl`、それ以外にもノードが書き込むフィールドがあります。たとえば、[**音源分離**](https://nodaro.ai/docs/nodes/audio/audio-separation)（Audio Separation）は、ステムごとに 1 つの URL を追加します。`vocalUrl` や `instrumentalUrl` などです。

次の型付きエラーをスローします。

| エラー | 発生する場合 |
| --- | --- |
| `InsufficientCreditsError`、`StorageExceededError`、`JobBlockedError` | ポーリングが始まる前に、実行のリクエストが拒否された場合です。 |
| `JobFailedError` | ジョブが `failed` または `cancelled` で終わった場合です。`jobId` とジョブのエラーメッセージを持ちます。 |
| `JobTimeoutError` | `maxMs` が経過した場合です。ジョブはキャンセルされません。 |
| `JobAbortedError` | 自分の `signal` が発火した場合です。ジョブはキャンセルされません。 |
| `JobHeldError` | コンテンツポリシーのあるデプロイ環境で、ジョブが人によるレビューのために保留されている場合です。 |

**復旧に時間がかかる場合。**モデルが、ワーカーがあきらめた後に結果を返すことがあります。その場合、プラットフォームが復旧している間、ジョブは `recovering: true` のまま `processing` にとどまります。遅いモデルでは、数十分かかることがあります。`JobTimeoutError` で待機が終わった場合は、後で `client.jobs.get(jobId)` を使ってジョブを取得するか、`maxMs` を上げてください。

### runMany(type, paramsList, opts?)
1 つのノードタイプで複数の実行を同時に開始し、すべてを待機します。たとえば、候補のグリッドを生成する場合です。各エントリーは `runAndWait()` を通して実行されます。

```ts
runMany(type: string, paramsList: Record<string, unknown>[], opts?: RunAndWaitOptions): Promise<RunManyResult[]>
```

<TypeTable
type={{
type: { type: 'string', required: true, description: "ノードの API タイプで、すべての実行で使われます。" },
paramsList: { type: 'Record<string, unknown>[]', required: true, description: "実行ごとに 1 つのリクエストボディです。" },
opts: { type: 'RunAndWaitOptions', description: "すべての実行で共有される signal、onProgress、pollMs、maxMs です。共有された signal は、バッチ全体を停止します。" },
}}
/>

```ts
const results = await client.nodes.runMany("generate-image", [
{ prompt: "A snow leopard at sunrise" },
{ prompt: "A snow leopard at golden hour" },
{ prompt: "A snow leopard at blue hour" },
])
for (const { jobId, output } of results) console.log(jobId, output.imageUrl)
```

すべての実行が終わると解決され、入力順に、エントリーごとの `{ jobId, output }` が返されます。いずれかの実行が失敗すると、`runAndWait()` と同じエラーで、すぐに拒否されます。その後にいちばんよい結果を選ぶには、URL を [`client.reduce.run()`](https://nodaro.ai/docs/developers/sdk/llm-and-reduce) に渡します。

## 型付きパラメーター
4 つのノードタイプには型付きのパラメーターがあり、コードエディターがそのフィールドを補完し、チェックします。それ以外のノードタイプは、すべて素のオブジェクトを受け取ります。そのフィールドは、そのノードの入力フィールドで、`inputSchema` と、[ノードリファレンス](https://nodaro.ai/docs/nodes)のそのノードのページに一覧表示されています。3D シーンのノードにも型付きのパラメーターがあります。[3D シーン](https://nodaro.ai/docs/developers/sdk/scenes-3d)を参照してください。

| ノードタイプ | パラメーターの型 | ノードのページ |
| --- | --- | --- |
| `generate-image` | `GenerateImageParams` | [**画像生成**（Generate Image）](https://nodaro.ai/docs/nodes/image/generate-image) |
| `generate-video` | `GenerateVideoParams` | [**動画生成**（Generate Video）](https://nodaro.ai/docs/nodes/video/generate-video) |
| `text-to-video` | `TextToVideoParams` | [**動画生成**](https://nodaro.ai/docs/nodes/video/generate-video) |
| `assemble-narrated-video` | `AssembleNarratedVideoParams` | [**ナレーション付き動画を合成**（Assemble Narrated Video）](https://nodaro.ai/docs/nodes/video/assemble-narrated-video) |

型付きのパラメーターのオブジェクトは、そのルートのほかのフィールドも受け付けます。サーバーは、ボディ全体を検証します。

### GenerateImageParams
<TypeTable
type={{
prompt: { type: 'string', description: "画像に写るものです。" },
provider: { type: 'string', description: "モデル ID です。nano-banana-2 や gpt-image-2 などです。省略すると、そのノードのデフォルトのモデルになります。" },
negativePrompt: { type: 'string', description: "モデルが避けるべき内容です。" },
referenceImageUrls: { type: 'string[]', description: "リファレンス画像の URL で、connectedReferences の後に追加されます。" },
connectedReferences: { type: 'ConnectedReference[]', description: "エディターが接続するのと同じ形の、ラベル付きのリファレンスです。下の「リファレンス」を参照してください。" },
describedReferences: { type: 'DescribedReference[]', description: "名前を付けて説明できるが、画像を持っていない被写体を最大 10 個です。" },
referenceOrder: { type: 'string[]', description: "モデルに見せる順序で並べた、リファレンス ID です。" },
direction: { type: 'object', description: "ピッカー ID による、カメラなどの演出です。下の「演出」を参照してください。" },
}}
/>

### GenerateVideoParams
画像から動画を作る経路です。開始フレーム、任意の終了フレーム、リファレンスを使います。

<TypeTable
type={{
prompt: { type: 'string', description: "クリップの中で起こることです。開始フレームがある場合は省略できます。" },
provider: { type: 'string', description: "モデル ID です。seedance-2-fast や kling-3.0 などです。" },
imageUrl: { type: 'string', description: "開始フレームです。" },
endFrameUrl: { type: 'string', description: "終了フレームです。対応しているモデルで使えます。" },
frameFit: { type: '"original" | "ratio" | "resolution"', default: '"resolution"', description: "開始フレームや終了フレームの変形方法です。resolution はモデルがレンダリングするサイズにリサイズし、ratio はアスペクト比だけを合わせ、original はそのまま送信します。" },
frameDelivery: { type: '"auto" | "frame" | "reference"', default: '"auto"', description: "フレームを、実際の開始フレームとして送るか、開始フレームという名前のリファレンス画像として送るかです。auto はモデルごとに選びます。" },
referenceImageUrls: { type: 'string[]', description: "リファレンス画像です。" },
referenceVideoUrls: { type: 'string[]', description: "リファレンス動画で、対応しているモデルで使えます。" },
referenceAudioUrls: { type: 'string[]', description: "リファレンスオーディオで、対応しているモデルで使えます。" },
referenceVideoCaptions: { type: 'string[]', description: "リファレンス動画ごとのキャプションで、同じ順序で並べます。" },
referenceAudioCaptions: { type: 'string[]', description: "リファレンスオーディオのクリップごとのキャプションで、同じ順序で並べます。" },
connectedReferences: { type: 'ConnectedReference[]', description: "ラベル付きのリファレンスです。" },
describedReferences: { type: 'DescribedReference[]', description: "画像のない、名前付きの被写体です。" },
referenceOrder: { type: 'string[]', description: "リファレンスの順序です。" },
direction: { type: 'object', description: "ピッカー ID による、カメラと動きの演出です。" },
}}
/>

### TextToVideoParams
プロンプトだけで動画を作る経路で、`POST /v1/text-to-video` です。プロンプトは必須で、開始フレームと終了フレームは代わりに `generate-video` が扱います。text-to-video のモードがないモデルは、`400 image_required` を返します。

<TypeTable
type={{
prompt: { type: 'string', required: true, description: "クリップの中で起こることです。" },
provider: { type: 'string', description: "モデル ID です。" },
duration: { type: 'number', description: "長さ（秒）です。指定できる値はモデルによって異なります。" },
sound: { type: 'boolean', description: "ネイティブの音声で、音声をレンダリングするモデルで使えます。" },
negativePrompt: { type: 'string', description: "避けたい内容です。" },
aspectRatio: { type: 'string', description: "フレームの形で、16:9 などです。" },
resolution: { type: 'string', description: "解像度で、720p などです。" },
seed: { type: 'number', description: "固定のシードで、対応しているモデルで使えます。" },
referenceImageUrls: { type: 'string[]', description: "リファレンス画像です。" },
referenceVideoUrls: { type: 'string[]', description: "リファレンス動画です。" },
referenceAudioUrls: { type: 'string[]', description: "リファレンスオーディオです。" },
direction: { type: 'object', description: "ピッカー ID による、カメラと動きの演出です。" },
subject: { type: 'object', description: "人物や動物などの、被写体のピッカー ID で、演出の言い回しより前に置かれます。" },
}}
/>

### AssembleNarratedVideoParams
動画のブロックをナレーションとつなぎ合わせて、1 本の動画にします。実行の料金は `3 + ceil(blocks / 6)` クレジットです。各ブロックをナレーションに合わせる方法については、[**ナレーション付き動画を合成**](https://nodaro.ai/docs/nodes/video/assemble-narrated-video)を参照してください。

<TypeTable
type={{
blocks: { type: '{ videoUrl: string; audioUrl?: string }[]', required: true, description: "1〜60 個のブロックで、再生順に並べます。" },
voiceVolume: { type: 'number', default: '100', description: "ナレーションの音量で、0〜200 です。" },
clipAudioVolume: { type: 'number', default: '40', description: "クリップ自体の音声の音量で、0〜200 です。" },
maxSlowdown: { type: 'number', default: '1.5', description: "クリップをナレーションに合わせるために、どれだけ遅くしてよいかで、1〜2 です。" },
trimStartFrames: { type: 'number', default: '0', description: "各クリップの先頭から切り取るフレーム数で、0〜120 です。" },
trimEndFrames: { type: 'number', default: '0', description: "各クリップの末尾から切り取るフレーム数で、0〜120 です。" },
}}
/>

## リファレンス
`generate-image`、`generate-video`、`text-to-video` は、エディターが接続するのと同じ形でリファレンスを受け付けます。サーバーは、それらをプロンプト内で `@image_1` のような番号付きの指示に変換するので、自分で「Image 1 is...」のように書く必要はありません。

- **`connectedReferences`** は、`ConnectedReference` エントリーのリストで、エディターの接続されたリファレンスと同じ形をしており、SDK からエクスポートされています。サーバーは重複を取り除き、そのモデルが受け付ける数だけ残します。`referenceOrder` は、ID によってその順序を決めます。
- **顔の固定。**エントリーは `identityLock: { enabled: true, text? }` を持てます。この場合、サーバーは、そのリファレンスのアイデンティティを保つようモデルに伝える短い一文を追加します。`text` は組み込みの言い回しを置き換え、その中の `{ref}` はリファレンスの名前を表します。デフォルトではオフです。
- **`describedReferences`** は、名前は分かるが画像がない被写体のために、最大 10 個の `{ name, description }` エントリーを受け付けます。台本の役どころなどです。それぞれが、プロンプト内で `Name — description.` という行になります。モデルがその人物だと分かるように、プロンプトの文章にも名前を残してください。
- リファレンスのエントリーの **`descriptionOverride`** は、この実行に限って、保存されている説明を置き換えます。
- **動画とオーディオのリファレンスのキャプション。**`referenceVideoCaptions` と `referenceAudioCaptions` は、`referenceVideoUrls` と `referenceAudioUrls` の順序に従います。各キャプションは、プロンプト内で `@video_1: caption.` または `@audio_1: caption.` のように表示されます。
- **プロンプト内で画像のリファレンスをメンションする。**`generate-image` では、リファレンスに名前を付けて、`@<name>:<index>` または `@<name>:<index>:<role>` として（たとえば `@town:1:background`）メンションできます。メンションすると、プロンプトのその位置に、そのリファレンスまたはその役割が反映されます。`~lock` と `~nolock` は、キャラクターのメンションと同じように使えます。

使える役割については[リファレンスの役割](https://nodaro.ai/docs/guides/reference-roles)を、アイデンティティの扱いについては[キャラクターの一貫性](https://nodaro.ai/docs/guides/consistent-characters)を参照してください。

## 演出
`generate-image`、`generate-video`、`text-to-video` は、言葉の代わりに、ピッカー **ID** による `direction` オブジェクトを受け付けます。Nodaro が各 ID に対応する検証済みの言い回しをプロンプトに書き込むので、コードは ID を送るだけで、言い回しは常に最新の状態に保たれます。

```ts
await client.nodes.runAndWait("generate-image", {
prompt: "A detective waits under a street lamp",
direction: { shotSize: "wide-shot", timeOfDay: "golden-hour", mood: "suspicious" },
})
```

- **キー**は、`shotSize`、`lightingStyle`、`style`、`mood`、`photographer`、`era` などのピッカーの次元です。動画のルートでは、`cameraMotion`、`actionFx`、`transition`、`loopSubject`、`temporal` の各キーなど、動きに関するキーが加わります。
- **値**は、1 つの ID か、ID の配列です。複数の値を取れる次元では、それぞれの上限までを残し、残りは取り除かれます。リクエストが拒否されるのは、1 つのキーにつき 8 個を超える値、または 1 つの ID につき 100 文字を超える場合だけです。
- **不明なキーと ID は、拒否されずに読み飛ばされます。**空の `direction` は、プロンプトを変更しません。
- **1 つのマップが、画像と動画の両方に対応します。**静止画専用のキーを動画の実行に送っても、受け付けられ、何も追加されません。
- `extend-video` は `direction` を受け付けません。そのプロンプトは、既存のクリップの続きだからです。

有効な ID は、[`client.pickerCatalogs`](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts) から取得します。すべての次元については、[ピッカーカタログ](https://nodaro.ai/docs/developers/picker-catalogs)を参照してください。

## 言語モデルのノード
`run(type, params)` は `/v1/<type>` に送信します。言語モデルのノードでこのルートが存在するのは、`generate-script`、`image-critic`、`qa-check`、`describe-to-picker` だけです。それ以外の言語モデルのノードは、より長いパスを使うため、[`client.request()`](https://nodaro.ai/docs/developers/sdk/client#requestmethod-path-options) で呼び出します。

| ノードタイプ | エンドポイント |
| --- | --- |
| `llm-chat` | `/v1/llm-chat/generate` |
| `after-effects` | `/v1/after-effects/generate` |
| `motion-graphics` | `/v1/motion-graphics/generate` |
| `lottie-overlay` | `/v1/lottie-overlay/generate` |
| `3d-title` | `/v1/3d-title/generate` |
| `image-to-text` | `/v1/image-to-text/describe` |
| `video-composer` | `/v1/scene-graph/generate` |

```ts
await client.nodes.run("generate-script", {
prompt: "A 3-scene product launch script for a smart water bottle",
reasoningEffort: "high",
})
```

- **`reasoningEffort`** は、モデルによって `"none"`、`"low"`、`"medium"`、`"high"`、`"xhigh"`、`"max"` のいずれかです。省略するか、そのモデルが対応していない段階を送信すると、モデルのデフォルトになります。`xhigh` と `max` は、クレジットのティアが 1 段階上がります。モデルとそのティアについては、[**プロンプト**（Prompt）](https://nodaro.ai/docs/nodes/automate/prompt)を参照してください。
- **`advancedMode: true`** は、Gemini モデルを、その開発元の API 上で直接実行します。`temperature`、`maxTokens`、推論の全範囲が完全に有効になるのは、そこだけです。`reasoningEffort` による上昇分に加えて、クレジットのティアが 1 段階上がります。このオプションがないモデルは、`400 advanced_mode_unsupported` を返します。
- **ストリーミングはラップされていません。**SDK は、プロンプトノードのストリーミングの応答を読み取りません。読み取り可能なストリームを使う `fetch` を使ってください。

## モデル固有のルール
一部の動画モデルは、ほかのモデルにはない値を受け付けます。各モデルのページに、すべての選択肢と料金が一覧表示されています。

- **[Seedance 2](https://nodaro.ai/docs/models/video/seedance-2)** は、`resolution: "4k"` と、`aspectRatio: "adaptive"` または `"21:9"` を受け付けます。[Seedance 2 Fast](https://nodaro.ai/docs/models/video/seedance-2-fast) と [Seedance 2 Mini](https://nodaro.ai/docs/models/video/seedance-2-mini) は、480p または 720p でのみレンダリングします。
- **[Seedance 2.5](https://nodaro.ai/docs/models/video/seedance-2-5)** は、480p、720p、1080p でレンダリングし、1 回の呼び出しで最大 30 秒を作れ、画像 30 個、動画 10 個、オーディオ 10 個のリファレンスを受け付けます。開始フレームがある場合、そのフレームのアスペクト比を使い、明示的な `aspectRatio` は拒否します。
- **[MiniMax Hailuo 3](https://nodaro.ai/docs/models/video/minimax-h3)**（`minimax-h3`）は、画像 9 個、動画 3 個、オーディオ 3 個のリファレンスを、`resolution: "2K"`（デフォルト）または `"768P"` で受け付けます。それ以外の値は、2K としてレンダリングされ、課金されます。
- **[Wan 3.0](https://nodaro.ai/docs/models/video/wan-3-0)**（`wan-3` と、より高速な `wan-3-prime`）は、画像 10 個、動画 5 個、オーディオ 5 個のリファレンスを受け付けます。リファレンスのリストは、`imageUrl` や `endFrameUrl` と組み合わせられません。`duration` は 2〜30 の整数で、`resolution` は `480p`、`720p`、`1080p` のいずれかです。
- **[Gemini Omni Flash](https://nodaro.ai/docs/models/video/gemini-omni-flash)** は、[Gemini Omni](https://nodaro.ai/docs/models/video/gemini-omni) と同じリクエストを受け付けます。長さは 4、6、8、10 秒のいずれか、解像度は 720p〜4K、フレームは 16:9 または 9:16 のみです。

**テキストから音声。**`provider` を省略すると、[**テキストから音声**](https://nodaro.ai/docs/nodes/audio/text-to-speech)（Text to Speech）は、3,000 文字までのテキストに [ElevenLabs v3](https://nodaro.ai/docs/models/audio/elevenlabs-v3) を使います。それより長いテキストは、上限が 40,000 文字の [ElevenLabs Turbo v2.5](https://nodaro.ai/docs/models/audio/elevenlabs-turbo-v2-5) にフォールバックするため、途中で切れることはありません。自分で指定した `provider` は、常にそのまま使われます。

## スクレイパーとその他の入力ノード
入力ノードも、同じように実行します。[**Web スクレイピング**](https://nodaro.ai/docs/nodes/automate/web-scrape)（Web Scrape）などのスクレイパーは、すぐに応答します。結果には、履歴のための `jobId` と、データ自体の両方が含まれるため、ポーリングせずに使えます。リクエストのフィールドは、そのノードの入力フィールドで、`inputSchema` に一覧表示されています。

## Frequently asked questions

### Nodaro の SDK で画像を生成するには、どうすればよいですか？

ノードタイプ generate-image と prompt を指定して、client.nodes.runAndWait を呼び出します。ジョブの出力で解決され、その imageUrl が生成された画像です。

### run と runAndWait の違いは何ですか？

run はノードを開始し、すぐに jobId を返します。runAndWait はノードを開始し、2 秒ごとにジョブをポーリングして、ジョブが完了すると出力で解決されます。

### runAndWait は、どのくらいの時間待機しますか？

デフォルトでは最大 15 分です。maxMs オプションで変更できます。タイムアウトしてもジョブはキャンセルされず、通常はサーバー側でそのまま完了します。

### どのノードタイプを実行できますか？

client.nodes.list() を呼び出すと、サーバーが対応するすべてのノードタイプを、カテゴリー、出力タイプ、モデル、クレジットの料金とともに取得できます。ノードリファレンスのすべてのノードには、API のタイプがあります。

### リクエストを再試行するときに、二重に課金されないようにするには、どうすればよいですか？

run または runAndWait のオプションで idempotencyKey を指定し、再試行するときは同じキーを再利用します。プラットフォームは、2 回目の実行を開始する代わりに、最初の実行を返します。
