# Modelos e créditos

> Liste os modelos de IA de uma instância do Nodaro com client.models, consulte seu saldo de créditos e veja o preço de um modelo antes de executá-lo.

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

**`client.models`** retorna o catálogo de modelos de IA que uma instância do Nodaro oferece, e **`client.credits`** retorna seu saldo de créditos e o preço de qualquer modelo. Use os dois juntos para mostrar aos usuários quais modelos eles podem escolher e quanto custa cada execução. Os métodos chamam os mesmos endpoints da [API REST de créditos](https://nodaro.ai/docs/developers/api/credits). Preços e saldos existem no Nodaro Cloud; as instalações self-hosted Community e Business não têm sistema de créditos. Veja [Créditos](https://nodaro.ai/docs/concepts/credits).

## Métodos
| Método | O que faz |
| --- | --- |
| [`models.list(opts?)`](#modelslistopts) | Lista os modelos, agrupados por tipo e por fabricante |
| [`credits.balance()`](#creditsbalance) | Lê seu saldo de créditos e seu nível |
| [`credits.modelCosts(ids)`](#creditsmodelcostsids) | Consulta o preço em créditos de até 50 modelos ou variações |

## client.models
### models.list(opts?)
Retorna o catálogo de modelos (`GET /v1/models`), agrupado por tipo (imagem, vídeo, áudio) e por fabricante. Cada modelo traz seus recursos, seus preços em créditos no Nodaro Cloud e dicas curtas de prompt. O endpoint é público, e o servidor guarda a resposta em cache por 5 minutos. A ferramenta `list_models` do MCP retorna os mesmos dados.

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

<TypeTable
type={{
kind: { type: '"image" | "video" | "audio"', description: "Apenas modelos deste tipo." },
mode: { type: 'string', description: "Apenas modelos com este modo, como t2i (texto para imagem), t2v (texto para vídeo) ou i2v (imagem para vídeo)." },
family: { type: 'string', description: "Apenas modelos deste fabricante, como o Google." },
featuredOnly: { type: 'boolean', default: 'false', description: "Apenas os modelos em destaque." },
}}
/>

```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)
}
}
}
```

O resultado tem `sections`, uma por tipo, cada uma com `families` de modelos; `recommendations`, listas de IDs de modelos para tarefas comuns; e `totalModels`. Cada modelo tem estes campos:

| Campo | Tipo | Descrição |
| --- | --- | --- |
| `id` | `string` | O ID do modelo, para o parâmetro `provider` de uma execução de nó. |
| `label`, `description` | `string` | O nome de exibição e uma descrição curta. |
| `modes` | `string[]` | O que o modelo faz, como `t2i`, `i2i`, `t2v` ou `i2v`. |
| `useCases` | `string[]` | As tarefas para as quais o modelo é indicado. |
| `aspectRatios`, `resolutions`, `qualities`, `durations` | arrays | Os valores que o modelo aceita, quando se aplicam. |
| `features` | `string[]` | Recursos extras. |
| `pricing` | `{ identifier, credits, note? }[]` | O preço em créditos de cada variação: o preço cobrado por uma execução, o mesmo número do botão **Executar**. Apenas no Nodaro Cloud. |
| `featured` | `boolean` | Se o modelo está em destaque. |
| `promptTips` | `string[]` | Dicas curtas de prompt para o modelo. |
| `doctrineCovered` | `boolean` | `true` apenas quando o Nodaro obteve orientações de prompt para a família do modelo. Mostre um selo de “orientação do fabricante” apenas quando o valor for `true`. |

O mesmo catálogo está nas páginas de [Modelos](https://nodaro.ai/docs/models). Para saber qual modelo usar, leia [Como escolher um modelo](https://nodaro.ai/docs/guides/choosing-models).

## client.credits
### credits.balance()
Retorna seu saldo de créditos e seu nível (`GET /v1/user/credits`). Lança `UnauthorizedError` quando não há nenhum usuário conectado.

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

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

| Campo | Tipo | Descrição |
| --- | --- | --- |
| `total` | `number` | Os créditos que você pode gastar agora. |
| `subscription` | `number` | Os créditos do período atual da assinatura. |
| `topup` | `number` | Os créditos que você comprou à parte. |
| `dailySpent` | `number` | Os créditos gastos hoje. |
| `dailyLimit` | `number \| null` | O limite diário de gastos, ou `null` quando não há limite. |
| `monthlyAllocation` | `number` | Os créditos concedidos por período de cobrança. |
| `tier` | `string` | O nível de assinatura armazenado, como `"free"` ou `"pro"`. |
| `effectiveTier` | `string` | O nível realmente aplicado. `"payg"` significa pagamento conforme o uso: sem assinatura, mas com créditos comprados, com todos os modelos, sem marca d'água e sem limite diário. |
| `features` | `Record<string, unknown>` | Os recursos do nível. |
| `periodEnd` | `string \| null` | O fim do período de cobrança, como data ISO 8601. |
| `appCreditsAllowance` | `number` | Os créditos ganhos com a execução de apps, no nível gratuito. |
| `externalWallet` | `{ available: number \| null }` | Presente quando a implantação usa uma carteira externa compartilhada. `null` significa que o valor não está disponível. Não mostre `total` no lugar dele. Veja [Carteiras externas](https://nodaro.ai/docs/developers/external-wallet). |

Prefira `effectiveTier` a `tier` quando decidir o que mostrar.

### credits.modelCosts(ids)
Consulta o preço em créditos de modelos e das variações deles em uma única chamada (`POST /v1/credits/model-costs`). Verifica no máximo os 50 primeiros identificadores.

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

<TypeTable
type={{
ids: { type: 'string[]', required: true, description: "Identificadores de preço: um ID de modelo, como nano-banana-pro, ou um ID de modelo com a variação, como nano-banana-pro:4K ou seedance-2-fast:8s:720p." },
}}
/>

```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`** associa cada identificador que tem preço ao seu preço em créditos.
- **`missing`** lista os identificadores que não têm preço. Mostre um traço para eles.
- **`errors`** lista os identificadores cuja consulta falhou. Os outros preços chegam mesmo assim.

Os identificadores de cada modelo estão no campo `pricing` de [`models.list()`](#modelslistopts) e na página de cada modelo. Configurações como qualidade, resolução e duração mudam o preço, então informe a variação que a execução vai usar. O preço é verificado de novo quando a execução começa, então esta chamada é uma prévia.

## Mostrar os modelos com os preços
Monte um seletor de modelos para um nó, com o preço ao lado de cada modelo:

```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
}))
```

Omita `provider` em uma execução para usar o modelo padrão do nó. Quando um usuário escolher um modelo, envie o ID dele como `provider` para [`client.nodes.runAndWait()`](https://nodaro.ai/docs/developers/sdk/nodes).

## Frequently asked questions

### Como listar pelo código os modelos que o Nodaro oferece?

Chame client.models.list(). Ele retorna todos os modelos de imagem, vídeo e áudio, agrupados por tipo e por fabricante, com modos, proporções, resoluções, durações e, no Nodaro Cloud, os preços em créditos.

### Como descobrir o preço de um modelo antes de executá-lo?

Chame client.credits.modelCosts com os identificadores de preço do modelo, como nano-banana-pro ou nano-banana-pro:4K. O campo data associa cada identificador ao seu preço em créditos.

### Como consultar meu saldo de créditos com o SDK?

Chame client.credits.balance(). O campo total é o número de créditos disponíveis, divididos entre créditos da assinatura e créditos de recarga.

### As instalações self-hosted têm preços em créditos?

Não. As instalações self-hosted Community e Business não têm sistema de créditos, então os preços dos modelos e os custos em créditos ficam de fora das respostas delas.
