Este ejercicio consiste en crear un flujo de trabajo en n8n que actúe como un puente (proxy) entre un cliente de IA (Open WebUI) y los datos reales de la AEMET, procesados por un modelo local de Ollama.
El primer objetivo es crear un punto de entrada que, al ser consultado, devuelva el JSON técnico de la estación meteorológica de Valencia.
Configuración detallada:
GETclima-valenciaWhen Last Node Finisheshttps://opendata.aemet.es/opendata/api/observacion/convencional/datos/estacion/8416Y (Estación Valencia Aeropuerto).api_key con tu token de AEMET OpenData.datos. json.datos.Añadiremos una capa de inteligencia para que la respuesta no sea un JSON técnico, sino un informe humano.
Instrucciones:
1. Instalar y levantar **Ollama** con el modelo ''llama3'' o ''mistral''.
2. En n8n, añadir el nodo **Ollama** (o un AI Agent con el modelo Ollama).
3. Configurar el **Prompt**:
> "Actúa como un meteorólogo. Basándote en estos datos: Temperatura {{ $json[0].ta }}°C y Humedad {{ $json[0].hr }}%, genera un breve informe del tiempo en Valencia en español."
4. Ahora, el flujo debe devolver una cadena de texto amigable.
Este es el paso crítico. Para que Open WebUI reconozca nuestro n8n como si fuera "ChatGPT", debemos disfrazar la respuesta. Las aplicaciones de IA no esperan un texto suelto, esperan un objeto JSON específico.
Configuración Técnica para el alumno:
POST y el path v1/chat/completions.{
"id": "chatcmpl-n8n-aemet",
"object": "chat.completion",
"created": {{ Math.floor(Date.now() / 1000) }},
"model": "aemet-valencia-bot",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{{ $node["Ollama"].json.output }}"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0
}
}
¿Por qué hacemos esto?
[0].Finalmente, integramos nuestro n8n como un proveedor de servicios en la interfaz de usuario.
Instrucciones:
/v1/chat/completions).Para que una interfaz como Open WebUI o cualquier cliente compatible pueda consumir nuestro flujo de n8n, el Webhook debe comportarse exactamente como un servidor de OpenAI. Esto implica cumplir con una ruta específica y una estructura de respuesta estricta.
Open WebUI busca por defecto el recurso en la ruta estándar de la API de Chat. Por lo tanto, el nodo Webhook de n8n debe configurarse con:
POSTv1/chat/completionsWhen Last Node Finishes (Esto es crítico: n8n debe esperar a que Ollama termine para responder al chat).El cliente de chat espera un objeto JSON complejo. Si n8n responde solo con texto plano, el chat dará un error de "Formato Inválido". El nodo final Respond to Webhook debe configurarse para devolver un JSON con esta estructura mínima:
{
"id": "chatcmpl-n8n-aemet",
"object": "chat.completion",
"created": {{ Math.floor(Date.now() / 1000) }},
"model": "aemet-valencia-bot",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{{ $node["Ollama"].json.output }}"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0
}
}
| Campo | Función |
| id | Identificador único de la respuesta. Usamos un prefijo estático seguido de un ID aleatorio si se desea. |
| created | Marca de tiempo en formato Unix (segundos). En n8n usamos la expresión Math.floor(Date.now() / 1000). |
| model | Nombre que aparecerá en la interfaz del chat como "modelo activo". |
| choices[0].message.content | Aquí es donde insertamos la respuesta generada por el nodo de Ollama. Es el texto que el usuario leerá en su burbuja de chat. |
| finish_reason | Indica que la IA ha terminado de hablar. Debe ser "stop" para que el chat cierre la conexión correctamente. |
En la configuración de conexiones de Open WebUI:
https://n8n.tu-centro.es/webhook/.v1/chat/completions al final de esa URL para realizar la petición POST.