# モデルとクレジット

> client.models で Nodaro インスタンスが提供する AI モデルを一覧表示し、client.credits でクレジット残高を確認して、実行前にモデルの料金を調べます。

Source: https://nodaro.ai/ja/docs/developers/sdk/models-and-credits

**`client.models`** は、Nodaro インスタンスが提供する AI モデルのカタログを返し、**`client.credits`** はクレジット残高と、任意のモデルの料金を返します。この 2 つを組み合わせて使うと、ユーザーが選べるモデルと各実行の料金をあわせて表示できます。これらのメソッドは、[クレジット REST API](https://nodaro.ai/docs/developers/api/credits) と同じエンドポイントを呼び出します。料金と残高があるのは Nodaro Cloud だけで、セルフホスティングの Community エディションと Business エディションにはクレジットの仕組みがありません。[クレジット](https://nodaro.ai/docs/concepts/credits)を参照してください。

## メソッド
| メソッド | 内容 |
| --- | --- |
| [`models.list(opts?)`](#modelslistopts) | モデルを、種類と開発元ごとにグループ化して一覧表示します |
| [`credits.balance()`](#creditsbalance) | クレジット残高とティアを読み取ります |
| [`credits.modelCosts(ids)`](#creditsmodelcostsids) | 最大 50 件のモデルまたはバリアントのクレジット料金を調べます |

## client.models
### models.list(opts?)
モデルのカタログを返します（`GET /v1/models`）。種類（画像、動画、オーディオ）と開発元ごとにグループ化されています。各モデルには、その機能、Nodaro Cloud でのクレジット料金、短いプロンプトのコツが含まれます。このエンドポイントは公開されており、サーバーはレスポンスを 5 分間キャッシュします。MCP の `list_models` ツールも、同じデータを返します。

```ts
list(opts?: {
kind?: "image" | "video" | "audio"
mode?: string
family?: string
featuredOnly?: boolean
}): Promise<ModelsListResult>
```

<TypeTable
type={{
kind: { type: '"image" | "video" | "audio"', description: "この種類のモデルだけに絞ります。" },
mode: { type: 'string', description: "このモードのモデルだけに絞ります。たとえば t2i（テキストから画像）、t2v（テキストから動画）、i2v（画像から動画）です。" },
family: { type: 'string', description: "この開発元のモデルだけに絞ります。たとえば Google です。" },
featuredOnly: { type: 'boolean', default: 'false', description: "おすすめのモデルだけに絞ります。" },
}}
/>

```ts
const catalog = await client.models.list({ kind: "video", mode: "i2v" })

for (const section of catalog.sections) {
for (const family of section.families) {
for (const model of family.models) {
console.log(family.family, model.id, model.durations, model.pricing?.[0]?.credits)
}
}
}
```

結果には、種類ごとの `sections`（それぞれにモデルの `families` を持ちます）、よくある用途向けのモデル ID のリストである `recommendations`、`totalModels` が含まれます。各モデルには、次のフィールドがあります。

| フィールド | 型 | 説明 |
| --- | --- | --- |
| `id` | `string` | モデル ID です。ノード実行の `provider` パラメーターに使います。 |
| `label`、`description` | `string` | 表示名と短い説明です。 |
| `modes` | `string[]` | モデルが何をするかを示します。`t2i`、`i2i`、`t2v`、`i2v` などです。 |
| `useCases` | `string[]` | そのモデルに向いている用途です。 |
| `aspectRatios`、`resolutions`、`qualities`、`durations` | 配列 | モデルが受け付ける値です。該当する場合のみ。 |
| `features` | `string[]` | 追加の機能です。 |
| `pricing` | `{ identifier, credits, note? }[]` | 各バリアントのクレジット料金です。Nodaro Cloud のみ。 |
| `featured` | `boolean` | おすすめのモデルかどうかです。 |
| `promptTips` | `string[]` | そのモデル向けの短いプロンプトのコツです。 |
| `doctrineCovered` | `boolean` | Nodaro が、そのモデルのファミリーについて出典のあるプロンプトのガイダンスを用意している場合にのみ `true` です。「開発元のガイダンス」バッジは、これが `true` の場合にのみ表示してください。 |

同じカタログは、[モデル](https://nodaro.ai/docs/models)のページにもあります。どのモデルを使うかについては、[モデルの選び方](https://nodaro.ai/docs/guides/choosing-models)を参照してください。

## client.credits
### credits.balance()
クレジット残高とティアを返します（`GET /v1/user/credits`）。ログインしているユーザーがいない場合は、`UnauthorizedError` をスローします。

```ts
balance(): Promise<UserBalance>
```

```ts
const balance = await client.credits.balance()
console.log(`${balance.total} credits (${balance.effectiveTier})`)
```

| フィールド | 型 | 説明 |
| --- | --- | --- |
| `total` | `number` | 今すぐ使えるクレジットです。 |
| `subscription` | `number` | 現在のサブスクリプション期間分のクレジットです。 |
| `topup` | `number` | 個別に購入してチャージしたクレジットです。 |
| `dailySpent` | `number` | 本日使用したクレジットです。 |
| `dailyLimit` | `number \| null` | 1 日の利用上限です。上限がない場合は `null` です。 |
| `monthlyAllocation` | `number` | 請求期間ごとに付与されるクレジットです。 |
| `tier` | `string` | 保存されているサブスクリプションのティアです。`"free"` や `"pro"` などです。 |
| `effectiveTier` | `string` | 実際に適用されているティアです。`"payg"` は従量課金を意味し、サブスクリプションはなくても購入したクレジットがあり、すべてのモデルを使え、透かしも 1 日の上限もありません。 |
| `features` | `Record<string, unknown>` | そのティアの機能です。 |
| `periodEnd` | `string \| null` | 請求期間の終了日で、ISO 8601 形式の日付です。 |
| `appCreditsAllowance` | `number` | 無料ティアで、アプリの実行によって得られるクレジットです。 |
| `externalWallet` | `{ available: number \| null }` | デプロイ環境が共有の外部ウォレットを使っている場合にのみ含まれます。`null` は金額が取得できないことを意味します。この場合、代わりに `total` を表示しないでください。[外部ウォレット](https://nodaro.ai/docs/developers/external-wallet)を参照してください。 |

何を表示するか決める際は、`tier` より `effectiveTier` を優先してください。

### credits.modelCosts(ids)
モデルとそのバリアントのクレジット料金を、1 回の呼び出しでまとめて調べます（`POST /v1/credits/model-costs`）。確認されるのは、最初の 50 件までの識別子です。

```ts
modelCosts(ids: string[]): Promise<{
data: Record<string, number>
missing: string[]
errors: string[]
}>
```

<TypeTable
type={{
ids: { type: 'string[]', required: true, description: "料金の識別子です。nano-banana-pro のようなモデル ID か、nano-banana-pro:4K や seedance-2-fast:8s:720p のような、バリアントを含むモデル ID を指定します。" },
}}
/>

```ts
const { data, missing } = await client.credits.modelCosts([
"nano-banana-pro",
"nano-banana-pro:4K",
"seedance-2-fast:8s:720p",
])
console.log(data["nano-banana-pro:4K"])
if (missing.length) console.warn("No price for:", missing)
```

- **`data`** には、料金が付いている各識別子と、そのクレジット料金の対応が入ります。
- **`missing`** には、料金がない識別子が列挙されます。これらにはダッシュを表示してください。
- **`errors`** には、調べるのに失敗した識別子が列挙されます。それ以外の料金は、そのまま返されます。

各モデルの識別子は、[`models.list()`](#modelslistopts) の `pricing` フィールドと、各モデルのページにあります。品質、解像度、長さなどの設定によって料金が変わるため、実行で使うバリアントを指定してください。実行時の料金は、実行が始まるときにもう一度確認されるため、この呼び出しはあくまで見積もりです。

## モデルと料金をあわせて表示する
1 つのノード向けに、各モデルの料金を隣に添えたモデルピッカーを作ります。

```ts
const { data: node } = await client.nodes.get("generate-video")
const { data: prices } = await client.credits.modelCosts(node.providers ?? [])

const options = (node.providers ?? []).map((id) => ({
id,
price: prices[id] ?? null, // null: no price on this instance
}))
```

ノードのデフォルトモデルを使うには、実行時に `provider` を省略します。ユーザーがモデルを選んだ場合は、その ID を `provider` として [`client.nodes.runAndWait()`](https://nodaro.ai/docs/developers/sdk/nodes) に送ります。

## Frequently asked questions

### コードから、Nodaro が提供するモデルを一覧表示するには、どうすればよいですか？

client.models.list() を呼び出します。画像、動画、オーディオのすべてのモデルが種類と開発元ごとにグループ化されて返され、モード、アスペクト比、解像度、長さに加えて、Nodaro Cloud ではクレジット料金も含まれます。

### 実行する前に、1 つのモデルの料金を調べるには、どうすればよいですか？

モデルの料金識別子（nano-banana-pro や nano-banana-pro:4K など）を指定して、client.credits.modelCosts を呼び出します。data フィールドには、各識別子とそのクレジット料金の対応が入ります。

### SDK でクレジット残高を確認するには、どうすればよいですか？

client.credits.balance() を呼び出します。total フィールドは利用できるクレジット数で、サブスクリプションのクレジットとチャージしたクレジットに分かれています。

### セルフホスティング環境に、クレジット料金はありますか？

いいえ。セルフホスティングの Community エディションと Business エディションにはクレジットの仕組みがないため、レスポンスにモデルの料金やクレジットのコストは含まれません。
