Automatiza la revisión de código con n8n y Ollama en seis nodos
Al terminar, cada pull request de tu repositorio recibirá en menos de un minuto una primera revisión escrita por un modelo de código que corre en tu propia máquina, publicada en Discord o Slack. Sin clave de API, sin coste por revisión y sin que el código salga de tu red. El workflow tiene seis nodos y funciona en un portátil con 8 GB de RAM libres.

Qué necesitas
- n8n, instalado en tu servidor o en su nube. En local:
docker run -d --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n --add-host=host.docker.internal:host-gateway docker.n8n.io/n8nio/n8n. - Ollama con un modelo de código:
ollama pull qwen2.5-coder:7b(4,7 GB, cuantización Q4_K_M). - Un repositorio en GitHub o GitLab donde puedas crear webhooks.
- Una URL de webhook de Discord o de Slack.
- Treinta minutos.
Si n8n corre en Docker y Ollama en el anfitrión, la URL de Ollama dentro de n8n es http://host.docker.internal:11434 y Ollama debe arrancar con OLLAMA_HOST=0.0.0.0. En los ejemplos escribimos localhost por claridad.
Qué hace el workflow
- Recibe un webhook cuando se abre un PR.
- Descarga el diff (los cambios de código).
- Envía el diff a Ollama para que lo revise.
- Formatea la revisión como un mensaje legible.
- La publica en Discord (o Slack, o correo).
- Responde al webhook confirmando que la revisión se publicó.
flowchart LR
GH["PR en GitHub"] --> WH["Webhook n8n"]
WH --> DIFF["Obtener diff"]
DIFF --> AI["Revisión con Ollama"]
AI --> FMT["Formatear"]
FMT --> DC["Aviso en Discord"]
style GH fill:#1E293B,color:#FAFAFA
style AI fill:#059669,color:#FAFAFA
style DC fill:#F5A623,color:#0B1628
Paso 1: el disparador
Crea un workflow nuevo y añade un nodo Webhook: método POST, ruta pr-review. n8n te muestra una URL del tipo https://tu-n8n.com/webhook/pr-review.
Regístrala en GitHub: Settings → Webhooks → Add webhook, tipo de contenido application/json, evento “Pull requests”. Abre un PR de prueba y comprueba en n8n que llega un objeto con pull_request.title, pull_request.user.login y pull_request.diff_url. Si no llega nada, GitHub muestra el motivo en la pestaña “Recent Deliveries” del webhook.
Paso 2: obtener el diff
Añade un nodo Code que descargue el diff y recorte lo que no cabe en el contexto del modelo:
const pr = $input.first().json.pull_request;
const diff = await this.helpers.httpRequest({ url: pr.diff_url, method: 'GET' });
return [{ json: {
title: pr.title,
author: pr.user.login,
url: pr.html_url,
diff: String(diff).slice(0, 12000), // ~3.000 tokens
} }];
Para repositorios privados, añade la cabecera Authorization: Bearer <token> a la petición. El recorte a 12.000 caracteres es deliberado: un modelo de 7B revisa mejor un diff acotado que uno enorme.
Paso 3: enviar a Ollama
Añade un nodo HTTP Request: método POST, URL http://localhost:11434/api/generate, cuerpo JSON. Como el diff contiene saltos de línea y comillas, construye el cuerpo con una expresión en lugar de pegarlo a mano:
{{ JSON.stringify({
model: "qwen2.5-coder:7b",
stream: false,
options: { num_ctx: 8192, num_predict: 600 },
prompt: "Revisa este diff de código. Céntrate en bugs, seguridad, rendimiento y estilo. Sé concreto y cita las líneas afectadas.\n\nDiff:\n" + $json.diff
}) }}
La respuesta de Ollama trae la revisión en el campo response. Si el nodo devuelve un error de conexión, ejecuta curl localhost:11434/api/tags desde la máquina de n8n: si no responde, es la red entre contenedores del apartado anterior.
Paso 4: formatear la revisión
Otro nodo Code:
const review = $input.first().json.response;
const pr = $('Obtener diff').first().json;
const texto = `**Revisión automática**\n**PR:** ${pr.title} (${pr.url})\n**Autor:** ${pr.author}\n\n${review}\n\n_Generada en local con Ollama + qwen2.5-coder:7b_`;
return [{ json: { content: texto.slice(0, 1900) } }]; // Discord admite 2.000 caracteres
Paso 5: publicar en Discord
Nodo HTTP Request: método POST, URL de tu webhook de Discord, cuerpo { "content": "{{ $json.content }}" }. Para Slack, el cuerpo es { "text": ... }.
Paso 6: responder al webhook
Nodo Respond to Webhook que devuelva { "status": "reviewed" }. Sin él, GitHub marca la entrega como fallida aunque todo haya funcionado.
Descarga el workflow
El workflow con estos seis nodos está listo para importar: ai_code_review.json. En n8n: Import from File. Sustituye la URL de Discord y, si hace falta, la dirección de Ollama.
Qué medimos
Medido el 09-09-2026 en nuestra estación (NVIDIA GB10, 128 GB de memoria unificada, compartida con otros servicios) con curl contra /api/generate.
| Modelo | Tarea | Resultado |
|---|---|---|
| qwen2.5-coder:7b | Leer un diff de 2.983 tokens | 1,7 s |
| qwen2.5-coder:7b | Generar 400 tokens de revisión, ventana de 8K | 17,2 tokens/s (unos 23 s) |
| qwen2.5-coder:7b | Generar 400 tokens, ventana por defecto | 33,2 tokens/s (12,0 s) |
| qwen2.5-coder:7b | Memoria en GPU (ollama ps) | 4,7 GB |
En un Mac mini M4 la generación de un modelo de 7B ronda los 35 tokens/s según Compute Market, así que una revisión tarda entre 15 y 30 segundos desde que se abre el PR.
Cuánto cuesta frente a la nube
Una revisión envía unos 3.000 tokens y recibe 400. Con los precios de OpenAI y de Anthropic de septiembre de 2026:
| Opción | Coste por revisión | 20 PR al día, 22 días |
|---|---|---|
| Local (Ollama en un Mac mini) | 0 | ~3,25 EUR de electricidad |
| GPT-5 | ~0,008 $ | ~3,50 $ |
| Claude Sonnet 5 | ~0,010 $ | ~4,40 $ |
Seamos claros: a este volumen la nube también es barata. El motivo para hacerlo en local es que el código propietario no sale de tu red y que el revisor sigue funcionando cuando la API externa no.
Qué modelo elegir
| Modelo | Punto fuerte | Mejor para | Tamaño en disco |
|---|---|---|---|
| qwen2.5-coder:7b | Sigue instrucciones, muchos lenguajes | Revisión general | 4,7 GB (medido) |
| deepseek-r1:14b | Razonamiento paso a paso | Bugs lógicos complejos | 9,0 GB (medido) |
| phi4:14b | Rápido y conciso | Comprobaciones rápidas | ~9 GB (biblioteca de Ollama) |
| llama3.3:70b | Análisis profundo | Revisiones de arquitectura | ~43 GB (biblioteca de Ollama) |
Empieza por qwen2.5-coder:7b. Si tu máquina tiene 32 GB o más, prueba deepseek-r1:14b en diffs con lógica enrevesada. Un modelo de 7B detecta bien lo evidente (concatenar entrada de usuario en una consulta SQL, un None sin comprobar), pero no conoce tu arquitectura: trátalo como una primera pasada, no como sustituto de la revisión humana.
Siguientes pasos
- Publica la revisión como comentario en el propio PR con un nodo GitHub.
- Pide salida en JSON con el formato estructurado de Ollama para separar bugs de sugerencias de estilo.
- Aplica la misma idea a tus documentos: Monta un RAG local con n8n y Ollama.
- Conecta el agente a más herramientas: n8n + MCP para agentes de IA.
- Explora la biblioteca de workflows y el catálogo de modelos.
Trabaja con nosotros
Montamos este tipo de automatizaciones en el hardware de nuestros clientes y las medimos antes de entregarlas. Si quieres que revisemos tu flujo de desarrollo, escríbenos o mira cómo trabajamos en consultoría.