
Fredy Acuna / December 8, 2025 / 7 min read
Cloudflare Workers AI te permite ejecutar modelos de IA de forma serverless sin gestionar infraestructura. ¿La mejor parte? Obtienes 10,000 Neurons gratis diarios—suficiente para cientos de conversaciones por día.
En esta guía, construiremos un chatbot simple usando la API REST que puedes llamar desde cualquier aplicación.
| Característica | Beneficio |
|---|---|
| Tier Gratuito | 10,000 Neurons/día (~cientos de conversaciones) |
| Sin Gestión de GPU | Inferencia serverless en el edge de Cloudflare |
| 50+ Modelos | Llama 4, Mistral, Gemma, DeepSeek y más |
| Baja Latencia | Corre en la red global de Cloudflare |
| API Simple | API REST funciona desde cualquier lugar |
Guarda estos valores:
CLOUDFLARE_ACCOUNT_ID=tu-account-id
CLOUDFLARE_API_TOKEN=tu-api-token
El formato del endpoint API es:
https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/run/{MODELO}
Probemos con Llama 3.1 8B usando curl:
curl https://api.cloudflare.com/client/v4/accounts/TU_ACCOUNT_ID/ai/run/@cf/meta/llama-3.1-8b-instruct \
-H "Authorization: Bearer TU_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "system", "content": "Eres un asistente útil."},
{"role": "user", "content": "¿Cuál es la capital de Francia?"}
]
}'
Respuesta:
{
"result": {
"response": "La capital de Francia es París."
},
"success": true
}
Aquí hay algunos modelos populares que puedes usar:
| Modelo | ID | Mejor Para |
|---|---|---|
| Llama 3.1 8B | @cf/meta/llama-3.1-8b-instruct | Chat general, respuestas rápidas |
| Llama 3.1 70B | @cf/meta/llama-3.1-70b-instruct | Tareas complejas, mejor calidad |
| Llama 3.3 70B | @cf/meta/llama-3.3-70b-instruct | Último Llama, optimizado |
| Gemma 3 12B | @cf/google/gemma-3-12b-it | Multilingüe (140+ idiomas) |
| Mistral Small | @cf/mistralai/mistral-small-3.1-24b-instruct | Visión + llamadas a herramientas |
| DeepSeek R1 | @cf/deepseek-ai/deepseek-r1-distill-qwen-32b | Tareas de razonamiento |
| QwQ 32B | @cf/qwen/qwq-32b | Razonamiento competitivo |
Tip: Comienza con
llama-3.1-8b-instructpara pruebas—es rápido y usa menos Neurons.
Aquí hay un ejemplo completo en JavaScript que mantiene el historial de conversación:
const ACCOUNT_ID = 'tu-account-id';
const API_TOKEN = 'tu-api-token';
const MODEL = '@cf/meta/llama-3.1-8b-instruct';
const conversationHistory = [
{ role: 'system', content: 'Eres un asistente útil. Sé conciso.' }
];
async function chat(userMessage) {
// Agregar mensaje del usuario al historial
conversationHistory.push({ role: 'user', content: userMessage });
const response = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/ai/run/${MODEL}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ messages: conversationHistory })
}
);
const data = await response.json();
if (data.success) {
const assistantMessage = data.result.response;
// Agregar respuesta del asistente al historial
conversationHistory.push({ role: 'assistant', content: assistantMessage });
return assistantMessage;
} else {
throw new Error(data.errors?.[0]?.message || 'Error de API');
}
}
// Uso
const answer = await chat('¿Qué es machine learning?');
console.log(answer);
const followUp = await chat('¿Puedes darme un ejemplo?');
console.log(followUp);
Si quieres exponer esto como una API, aquí hay un servidor Express.js simple:
import express from 'express';
const app = express();
app.use(express.json());
const ACCOUNT_ID = process.env.CLOUDFLARE_ACCOUNT_ID;
const API_TOKEN = process.env.CLOUDFLARE_API_TOKEN;
const MODEL = '@cf/meta/llama-3.1-8b-instruct';
app.post('/api/chat', async (req, res) => {
const { messages } = req.body;
if (!messages || !Array.isArray(messages)) {
return res.status(400).json({ error: 'Se requiere array de messages' });
}
try {
const response = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/ai/run/${MODEL}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ messages })
}
);
const data = await response.json();
if (data.success) {
res.json({ response: data.result.response });
} else {
res.status(500).json({ error: data.errors?.[0]?.message });
}
} catch (error) {
res.status(500).json({ error: 'Fallo al obtener respuesta' });
}
});
app.listen(3000, () => console.log('Servidor corriendo en puerto 3000'));
Llámalo desde tu frontend:
const response = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
messages: [
{ role: 'system', content: 'Eres un asistente útil.' },
{ role: 'user', content: '¡Hola!' }
]
})
});
const data = await response.json();
console.log(data.response);
Para un efecto de escritura tipo ChatGPT, habilita streaming:
const response = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/ai/run/${MODEL}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
messages: [{ role: 'user', content: 'Cuéntame una historia' }],
stream: true
})
}
);
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
// Parsear formato SSE: data: {"response": "..."}
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const json = JSON.parse(line.slice(6));
process.stdout.write(json.response);
}
}
}
| Parámetro | Tipo | Descripción |
|---|---|---|
messages | array | Array de objetos mensaje con role y content |
stream | boolean | Habilitar respuestas en streaming (default: false) |
max_tokens | number | Máximo de tokens en respuesta |
temperature | number | Creatividad (0-2, default: 0.6) |
| Rol | Descripción |
|---|---|
system | Configura el comportamiento y personalidad de la IA |
user | El mensaje del humano |
assistant | Respuestas previas de la IA (para contexto) |
Cloudflare usa "Neurons" como unidad de facturación:
| Tier | Neurons | Costo |
|---|---|---|
| Gratis | 10,000/día | $0 |
| Pago | Por 1,000 Neurons | $0.011 |
Ejemplo: Una conversación típica (prompt + respuesta) usa ~100-500 Neurons dependiendo de la longitud. El tier gratuito soporta 20-100 conversaciones/día.
data.success antes de usar la respuesta// Ejemplo: Limitar historial de conversación
if (conversationHistory.length > 20) {
// Mantener prompt de sistema + últimos 19 mensajes
conversationHistory = [
conversationHistory[0],
...conversationHistory.slice(-19)
];
}
messages es un arraymax_tokens si no necesitas respuestas largasAhora tienes un chatbot de IA funcionando con Cloudflare Workers AI con:
Esta es una alternativa económica a OpenAI u otras APIs pagas para proyectos personales y prototipos.