Documentación
Crea una app de chat en la documentación de NexoRouter.
Crea una app de chat
Este tutorial crea un chat multi-turn de terminal con Node.js, el OpenAI SDK y la API estable de Chat Completions de NexoRouter.
El ejemplo usa requests no streaming para mantenerse dentro de la superficie pública verificada.
Qué vas a construir
- Un cliente con la base URL de NexoRouter.
- Historial de conversación conservado entre turnos.
- Manejo básico de errores.
- Salida de uso para comprobar tokens.
- Un flujo fácil de adaptar a una API backend.
Requisitos
- Node.js 20 o posterior.
- Una cuenta con saldo prepago.
- Una API key activa.
- Un model ID actual copiado desde Models.
1. Crea el proyecto
mkdir nexorouter-chat
cd nexorouter-chat
npm init -y
npm pkg set type=module
npm install openai dotenv
Crea .gitignore:
node_modules
.env
Crea .env:
NEXOROUTER_API_KEY=your_nexorouter_key
NEXOROUTER_MODEL=deepseek-v4-flash
Nunca hagas commit de .env.
2. Envía el primer mensaje
Crea first-message.mjs:
import "dotenv/config";
import OpenAI from "openai";
if (!process.env.NEXOROUTER_API_KEY) {
throw new Error("Missing NEXOROUTER_API_KEY");
}
const client = new OpenAI({
apiKey: process.env.NEXOROUTER_API_KEY,
baseURL: "https://api.nexorouter.com/v1",
timeout: 60_000,
maxRetries: 2,
});
const response = await client.chat.completions.create({
model: process.env.NEXOROUTER_MODEL || "deepseek-v4-flash",
messages: [
{ role: "system", content: "You are a concise technical assistant." },
{ role: "user", content: "Give me a three-step API launch checklist." },
],
max_tokens: 256,
});
console.log(response.choices[0]?.message?.content);
console.log("usage:", response.usage);
Ejecuta:
node first-message.mjs
Después abre Usage Logs y confirma model ID, status, tokens, costo, latencia y request ID.
3. Convierte el script en chat multi-turn
Crea chat.mjs:
import "dotenv/config";
import OpenAI from "openai";
import { createInterface } from "node:readline/promises";
import { stdin as input, stdout as output } from "node:process";
if (!process.env.NEXOROUTER_API_KEY) {
throw new Error("Missing NEXOROUTER_API_KEY");
}
const client = new OpenAI({
apiKey: process.env.NEXOROUTER_API_KEY,
baseURL: "https://api.nexorouter.com/v1",
timeout: 60_000,
maxRetries: 2,
});
const model = process.env.NEXOROUTER_MODEL || "deepseek-v4-flash";
const messages = [
{
role: "system",
content: "You are a concise assistant. State uncertainty and never invent API behavior.",
},
];
const terminal = createInterface({ input, output });
console.log(`Connected to ${model}. Type /exit to stop.`);
while (true) {
const text = (await terminal.question("you> ")).trim();
if (!text) continue;
if (text === "/exit") break;
messages.push({ role: "user", content: text });
try {
const response = await client.chat.completions.create({
model,
messages,
max_tokens: 500,
});
const answer = response.choices[0]?.message?.content ?? "";
messages.push({ role: "assistant", content: answer });
console.log(`assistant> ${answer}`);
console.log(`tokens> ${response.usage?.total_tokens ?? "not reported"}`);
} catch (error) {
console.error("request failed>", error?.status, error?.error?.code, error?.message);
}
}
terminal.close();
Ejecuta:
node chat.mjs
4. Cambia de modelo
No dependas para siempre del ID del tutorial. Copia un modelo disponible desde Models o consulta:
curl https://api.nexorouter.com/v1/models \
-H "Authorization: Bearer $NEXOROUTER_API_KEY"
Luego cambia:
NEXOROUTER_MODEL=exact-model-id
Los model IDs distinguen mayúsculas y minúsculas. Verifica también precio, unidad de cobro y endpoint en la ficha del modelo.
5. Lleva el ejemplo a producción
Antes de exponerlo a usuarios:
- Mueve la llamada a un backend; no publiques la API key.
- Crea una key dedicada con budget y alcance de modelos.
- Limita longitud de mensajes,
max_tokensy concurrencia. - Conserva solo el historial necesario para controlar costo y privacidad.
- Agrega autenticación, rate limit por usuario y validación de entrada.
- Respeta
retry-aftery limita reintentos. - Registra request ID, modelo y status sin secretos.
- Prueba fallos de key, saldo, modelo, timeout y rate limit.
Problemas comunes
| Síntoma | Revisión |
|---|---|
401 invalid_api_key | Key correcta, header Bearer, key activa y base URL. |
404 model_not_found | ID exacto, disponibilidad y alcance de modelos de la key. |
403 insufficient_quota | Saldo del workspace, budget y alcance de la key. |
429 rate_limit_exceeded | retry-after, concurrencia y tamaño del prompt. |
413 request_too_large | Reduce historial o divide el input. |
502 o 504 | Reintento limitado, timeout del cliente u otro modelo. |