Contenido
Tutorial de JavaScript y Node.js con Ollama: integra chat y streaming
Instalación
npm install ollama
Conversación básica
import ollama from "ollama";
const response = await ollama.chat({
model: "qwen3:8b",
messages: [
{ role: "system", content: "Responde en español." },
{ role: "user", content: "¿Cuál es la diferencia entre JavaScript y TypeScript?" },
],
});
console.log(response.message.content);
(Usa ES modules: pon la extensión .mjs al archivo o configura "type": "module" en package.json.)
Salida en streaming
import ollama from "ollama";
const stream = await ollama.chat({
model: "qwen3:8b",
messages: [{ role: "user", content: "Escribe un poema breve de cuatro versos" }],
stream: true,
});
for await (const part of stream) {
process.stdout.write(part.message.content);
}
Cancelar la generación
Cuando el usuario pulse «Detener»:
const stream = await ollama.chat({ model: "qwen3:8b", messages, stream: true });
setTimeout(() => stream.abort(), 3000); // Cancelar después de 3 segundos
try {
for await (const part of stream) process.stdout.write(part.message.content);
} catch (err) {
if (err.name === "AbortError") console.log("\nDetenido");
}
Conectarse a otro host
import { Ollama } from "ollama";
const client = new Ollama({ host: "http://192.168.1.50:11434" });
const res = await client.chat({ model: "qwen3:8b", messages: [{ role: "user", content: "Hola" }] });
Usar Ollama en el navegador
import ollama from "ollama/browser";
Para llamar a Ollama local directamente desde una página web, configura OLLAMA_ORIGINS para permitir el origen de la página. Consulta Variables de entorno y configuración. En productos de producción, normalmente tu propio backend reenvía las solicitudes, para que el navegador no se conecte directamente a Ollama.
Sin instalar el paquete: usar fetch directamente
const res = await fetch("http://localhost:11434/api/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "qwen3:8b",
messages: [{ role: "user", content: "Hola" }],
stream: false,
}),
});
const data = await res.json();
console.log(data.message.content);
Gestionar el streaming con fetch
La respuesta en streaming contiene un JSON por línea (NDJSON):
const res = await fetch("http://localhost:11434/api/chat", {
method: "POST",
body: JSON.stringify({ model: "qwen3:8b", messages: [{ role: "user", content: "Cuenta del 1 al 10" }] }),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buffer = "";
while (true) {
const { value, done } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop(); // La última línea puede estar incompleta; consérvala para la siguiente lectura
for (const line of lines) {
if (!line.trim()) continue;
const chunk = JSON.parse(line);
process.stdout.write(chunk.message?.content ?? "");
}
}
Usar OpenAI SDK
npm install openai
import OpenAI from "openai";
const openai = new OpenAI({ baseURL: "http://localhost:11434/v1", apiKey: "ollama" });
const completion = await openai.chat.completions.create({
model: "qwen3:8b",
messages: [{ role: "user", content: "Hola" }],
});
console.log(completion.choices[0].message.content);
Una API sencilla con Express
Envuelve Ollama en tu propia API para que la llame el frontend:
import express from "express";
import ollama from "ollama";
const app = express();
app.use(express.json());
app.post("/api/ask", async (req, res) => {
const { question } = req.body;
res.setHeader("Content-Type", "text/plain; charset=utf-8");
const stream = await ollama.chat({
model: "qwen3:8b",
messages: [
{ role: "system", content: "Responde de forma concisa en español." },
{ role: "user", content: question },
],
stream: true,
});
for await (const part of stream) res.write(part.message.content);
res.end();
});
app.listen(3000, () => console.log("http://localhost:3000"));
curl -N -X POST http://localhost:3000/api/ask \
-H "Content-Type: application/json" \
-d '{"question":"¿Qué es una API?"}' Actualizado 12 de octubre de 2026