# Converse com LLMs e gere embeddings

> Chat Completions e embeddings no formato da OpenAI, para todos os modelos de texto do catálogo, cobrados por token.

`POST /chat/completions` e `POST /embeddings` seguem o formato da OpenAI, então qualquer SDK da OpenAI funciona: troque a URL base para `https://api.cut.pro/api/v1` e use a sua chave. O `model` é um `id` com `endpoint: chat_completions` ou `embeddings` de [`GET /models`](/models).

```ts

const client = new OpenAI({ baseURL: "https://api.cut.pro/api/v1", apiKey: process.env.CUTPRO_API_KEY });

const answer = await client.chat.completions.create({
	model: "anthropic/claude-sonnet-5-5",
	messages: [{ role: "user", content: "Escreva três títulos para um vídeo sobre café." }],
});
```

```bash
curl -X POST https://api.cut.pro/api/v1/chat/completions \
  -H "X-Api-Key: $CUTPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "deepseek/deepseek-v4.1-flash", "messages": [{ "role": "user", "content": "Oi!" }], "stream": true }'
```

- **Streaming**: com `stream: true`, a resposta vem em server-sent events, como na OpenAI.
- **Esforço de raciocínio**: `reasoning_effort` (`low`, `medium`, `high`) ou `reasoning: { effort }`, nos modelos que listam esse campo em `supported_parameters`.
- **Tools, imagens e saída estruturada**: `tools`, partes `image_url` nas mensagens e `response_format` vão como você mandar, onde o modelo aceita.
- **Custo**: por token lido e escrito, nos preços de `GET /models`. Frações de crédito somam e saem do saldo como créditos inteiros. Uma resposta sem streaming informa o custo em `usage.credits`.

> O saldo precisa cobrir o máximo que a chamada pode custar, contando o `max_tokens` da resposta (ou o limite do modelo, quando não vier). Sem saldo, a resposta é `402 INSUFFICIENT_CREDITS`.

## Erros

| Code | Quando |
|---|---|
| `REQUEST_INVALID` | O corpo não é um pedido válido, ou o modelo recusou os campos enviados. |
| `MODEL_UNAVAILABLE` | O modelo não existe no catálogo ou não está disponível agora. |
| `INSUFFICIENT_CREDITS` | Saldo insuficiente. `extra.credits_needed` diz quanto falta cobrir. |
| `AI_UNAVAILABLE` | O modelo não respondeu. Tente de novo. |
