# Conversa con LLMs y genera embeddings

> Chat Completions y embeddings en el formato de OpenAI, para todos los modelos de texto del catálogo, cobrados por token.

`POST /chat/completions` y `POST /embeddings` siguen el formato de OpenAI, así que cualquier SDK de OpenAI funciona: cambia la URL base a `https://api.cut.pro/api/v1` y usa tu clave. `model` es un `id` con `endpoint: chat_completions` o `embeddings` de [`GET /models`](/es/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: "Escribe tres títulos para un video 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": "¡Hola!" }], "stream": true }'
```

- **Streaming**: con `stream: true`, la respuesta llega en server-sent events, como en OpenAI.
- **Esfuerzo de razonamiento**: `reasoning_effort` (`low`, `medium`, `high`) o `reasoning: { effort }`, en los modelos que lo listan en `supported_parameters`.
- **Tools, imágenes y salida estructurada**: `tools`, partes `image_url` en los mensajes y `response_format` van como los envíes, donde el modelo los acepta.
- **Costo**: por token leído y escrito, a los precios de `GET /models`. Las fracciones de crédito se suman y salen del saldo como créditos enteros. Una respuesta sin streaming informa su costo en `usage.credits`.

> El saldo tiene que cubrir lo máximo que la llamada puede costar, contando el `max_tokens` de la respuesta (o el límite del modelo, si no viene). Sin saldo, la respuesta es `402 INSUFFICIENT_CREDITS`.

## Errores

| Code | Cuándo |
|---|---|
| `REQUEST_INVALID` | El cuerpo no es un pedido válido, o el modelo rechazó los campos enviados. |
| `MODEL_UNAVAILABLE` | El modelo no está en el catálogo o no está disponible ahora. |
| `INSUFFICIENT_CREDITS` | Saldo insuficiente. `extra.credits_needed` dice cuánto necesita la llamada. |
| `AI_UNAVAILABLE` | El modelo no respondió. Inténtalo de nuevo. |
