Nodo que permite enviar prompts a Claude Code desde cualquier workflow de n8n. Soporta texto, archivos, imagenes (OCR/vision), PDFs y structured output con JSON Schema.
Funciona con tu suscripcion Claude Max/Pro — sin coste adicional de API, sin limite de llamadas diarias.
http://claude-bridge:8000BRIDGE_API_KEY del
archivo /docker/claude-bridge/.env del VPS{
"name": "claudeBridgeApi",
"type": "claudeBridgeApi",
"data": {
"bridgeUrl": "http://claude-bridge:8000",
"apiKey": "TU_BRIDGE_API_KEY"
}
}| Parametro | Tipo | Requerido | Default | Descripcion |
|---|---|---|---|---|
| Prompt | string (multiline) | Si | - | El texto que se envia a Claude. Soporta expresiones n8n:
{{ $json.campo }},
{{ $('Nodo anterior').item.json.dato }} |
| Model | opciones | No | Default | Modelo de Claude a usar: Default (el del CLI), Sonnet (rapido, barato), Opus (mas capaz), Haiku (ultra-rapido, economico) |
| System Prompt | string (multiline) | No | - | Instrucciones de sistema que se anaden al prompt base de Claude. Ejemplo: “Eres un experto en energia solar. Responde siempre en espanol.” |
| JSON Schema | JSON editor | No | - | Schema JSON para obtener respuesta estructurada y validada. Debe ser
un objeto con "type": "object". Ver seccion 6 |
| Binary Property | string | No | (vacio) | Nombre de la propiedad binaria del item a enviar como archivo. Vacio
= envia todas las propiedades binarias. Valores tipicos:
data, attachment_0, file |
| Max Turns | numero | No | 10 | Maximo de turnos agenticos que Claude puede usar. Para preguntas simples: 1-3. Para analisis complejos: 10+. Para structured output: minimo 3 |
| Timeout (Seconds) | numero | No | 300 | Tiempo maximo de espera en segundos (10-1800). Si se excede, el proceso se cancela y devuelve error |
| Continue On Error | boolean | No | false | Si es true, el workflow continua aunque Claude devuelva
error (el error aparece en el output). Si es false, el
workflow se detiene |
| Valor en el nodo | Valor interno | Modelo real | Uso recomendado |
|---|---|---|---|
| Default | "" |
El default del CLI (normalmente Sonnet) | Uso general |
| Sonnet | "sonnet" |
claude-sonnet-4-6 | Equilibrio velocidad/calidad |
| Opus | "opus" |
claude-opus-4-6 | Tareas complejas, razonamiento profundo |
| Haiku | "haiku" |
claude-haiku-4-5 | Tareas simples, clasificacion, respuestas rapidas |
Cada ejecucion del nodo devuelve un item JSON con esta estructura:
{
"success": true,
"result": "Texto de la respuesta de Claude",
"session_id": "c8ba42ce-3523-4b85-8c51-84aa5ff3d864",
"error": null,
"duration_seconds": 2.94,
"model": "sonnet",
"request_id": "ad04204a-5c47-4440-8e02-494fdd937953",
"is_error": false
}{
"success": true,
"result": {
"colors": ["Red", "Blue", "Yellow"]
},
"session_id": "282d5331-7855-4436-b34f-77ba81947969",
"error": null,
"duration_seconds": 8.07,
"model": null,
"request_id": "12a3c205-9d9d-40e3-bbdd-5868aa11903d",
"is_error": false
}Nota: cuando usas json_schema, el campo
result es un objeto JSON, no un
string.
{
"success": false,
"result": null,
"session_id": null,
"error": "Timed out after 30s",
"duration_seconds": 30.02,
"model": "sonnet",
"request_id": "90590f53-b583-4d3f-a7eb-8457037d6071",
"is_error": true
}En cualquier nodo conectado despues del Claude Bridge:
| Expresion n8n | Devuelve |
|---|---|
{{ $json.result }} |
La respuesta de Claude (string o objeto) |
{{ $json.success }} |
true o false |
{{ $json.error }} |
Mensaje de error (si fallo) |
{{ $json.duration_seconds }} |
Tiempo de ejecucion |
{{ $json.model }} |
Modelo usado |
{{ $json.request_id }} |
ID unico de la peticion (para debugging) |
{{ $json.session_id }} |
ID de sesion de Claude (informativo) |
{{ $json.result.colors }} |
Acceso a campos de structured output |
Prompt: "Que es la energia fotovoltaica? Responde en 2 frases."
Model: Haiku
Max Turns: 1
Conecta un nodo Supabase o HTTP Request antes del Claude Bridge:
Prompt: "Analiza estas ofertas energeticas y recomienda la mejor:
{{ JSON.stringify($json.ofertas) }}"
Model: Sonnet
System Prompt: "Eres un experto en tarifas electricas espanolas. Considera PVPC, indexadas y fijas."
Max Turns: 5
Prompt: "Clasifica este email en: spam, consulta, reclamacion, presupuesto.
Email: {{ $json.body }}"
Model: Haiku
Max Turns: 1
Prompt: "Genera un informe ejecutivo semanal a partir de estos datos de ventas.
{{ JSON.stringify($json.sales_data) }}"
Model: Opus
System Prompt: "Genera informes profesionales en espanol. Incluye metricas clave, tendencias y recomendaciones."
Max Turns: 10
Prompt: "Traduce al ingles:\n{{ $json.text }}"
Model: Haiku
Max Turns: 1
El nodo detecta automaticamente si el item de entrada tiene datos binarios (archivos, imagenes, PDFs). Los envia a Claude para su analisis.
HTTP Request → Claude Bridge
(descarga imagen de URL) Prompt: "Haz OCR de esta imagen.
Extrae todo el texto que veas."
Max Turns: 3
Configuracion del HTTP Request: - URL:
https://ejemplo.com/factura.jpg - Response Format:
File
Read Binary File → Claude Bridge
(lee factura.pdf del disco) Prompt: "Extrae: numero factura,
fecha, importe total, concepto.
Devuelve en formato tabla."
Max Turns: 5
Gmail Trigger → Claude Bridge
(nuevo email con adjunto) Prompt: "Resume el documento adjunto
en 3 puntos clave."
Binary Property: attachment_0
Max Turns: 5
| Valor | Comportamiento |
|---|---|
| (vacio) | Envia todas las propiedades binarias del item |
data |
Envia solo la propiedad data (default de la mayoria de
nodos) |
attachment_0 |
Envia solo attachment_0 (tipico de triggers de
email) |
file |
Envia solo la propiedad file |
Si la propiedad indicada no existe, el nodo lanza un error descriptivo:
Binary property 'attachment_0' not found. Available: [data, image]
| Formato | Soporte | Notas |
|---|---|---|
| JPEG | Si | Vision/OCR completo |
| PNG | Si | Vision/OCR completo |
| GIF | Si | Solo primer frame |
| WebP | Si | Vision/OCR completo |
| Si | Hasta 100 paginas, 32 MB | |
| Texto plano | Si | .txt, .csv, .json, etc. |
| SVG | No | No soportado por la API de Anthropic |
El bridge valida los archivos antes de enviarlos a Claude: - Verifica que el contenido coincide con el MIME type declarado (magic bytes) - Detecta HTML disfrazado de imagen (error comun cuando una URL devuelve una pagina de error) - Devuelve mensajes de error claros si el archivo es invalido
Permite obtener respuestas de Claude en formato JSON validado contra un schema. Util para integraciones donde necesitas datos estructurados.
En el campo JSON Schema, introduce un schema JSON valido:
{
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["positivo", "negativo", "neutro"]
},
"confidence": {
"type": "number"
},
"summary": {
"type": "string"
}
},
"required": ["sentiment", "confidence", "summary"]
}Importante: max_turns debe ser al menos
3 cuando usas JSON Schema (Claude necesita turnos extra
para validar el schema).
Prompt: "Extrae los datos de este email de un cliente:
{{ $json.email_body }}"
JSON Schema:
{
"type": "object",
"properties": {
"nombre": { "type": "string" },
"email": { "type": "string" },
"telefono": { "type": "string" },
"motivo": { "type": "string", "enum": ["consulta", "reclamacion", "presupuesto", "otro"] },
"urgente": { "type": "boolean" }
},
"required": ["nombre", "motivo"]
}
Max Turns: 5
Respuesta:
{
"success": true,
"result": {
"nombre": "Juan Garcia",
"email": "juan@ejemplo.com",
"telefono": "612345678",
"motivo": "presupuesto",
"urgente": false
}
}Acceso en nodos posteriores:
{{ $json.result.nombre }} → "Juan Garcia"
{{ $json.result.motivo }} → "presupuesto"
{{ $json.result.urgente }} → false
Prompt: "Analiza el sentimiento de este texto:
{{ $json.review }}"
JSON Schema:
{
"type": "object",
"properties": {
"sentiment": { "type": "string", "enum": ["positive", "negative", "neutral"] },
"score": { "type": "number", "minimum": 0, "maximum": 1 },
"keywords": { "type": "array", "items": { "type": "string" } }
},
"required": ["sentiment", "score"]
}
Model: Haiku
Max Turns: 3
Puedes crear workflows que usen Claude Bridge programaticamente usando la API REST de n8n.
POST https://n8n.electriaenergy.com/api/v1/workflows
Header: X-N8N-API-KEY: <tu-api-key-de-n8n>
Content-Type: application/json
{
"name": "Claude - Pregunta Simple",
"nodes": [
{
"parameters": {},
"id": "trigger-1",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"prompt": "Que es la energia fotovoltaica? Responde en 2 frases.",
"model": "haiku",
"systemPrompt": "",
"jsonSchema": "",
"binaryProperty": "",
"maxTurns": 1,
"timeout": 60,
"continueOnError": false
},
"id": "claude-1",
"name": "Claude Bridge",
"type": "n8n-nodes-claude-bridge.claudeBridge",
"typeVersion": 1,
"position": [500, 300],
"credentials": {
"claudeBridgeApi": {
"id": "CREDENTIAL_ID",
"name": "Claude Bridge API"
}
}
}
],
"connections": {
"Manual Trigger": {
"main": [
[{ "node": "Claude Bridge", "type": "main", "index": 0 }]
]
}
},
"settings": {}
}{
"name": "Claude - OCR Imagen URL",
"nodes": [
{
"parameters": {},
"id": "trigger-1",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"url": "https://ejemplo.com/documento.jpg",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"id": "http-1",
"name": "Descargar Imagen",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [500, 300]
},
{
"parameters": {
"prompt": "Haz OCR de esta imagen. Extrae todo el texto visible.",
"model": "sonnet",
"systemPrompt": "",
"jsonSchema": "",
"binaryProperty": "data",
"maxTurns": 3,
"timeout": 120,
"continueOnError": false
},
"id": "claude-1",
"name": "Claude OCR",
"type": "n8n-nodes-claude-bridge.claudeBridge",
"typeVersion": 1,
"position": [750, 300],
"credentials": {
"claudeBridgeApi": {
"id": "CREDENTIAL_ID",
"name": "Claude Bridge API"
}
}
}
],
"connections": {
"Manual Trigger": {
"main": [
[{ "node": "Descargar Imagen", "type": "main", "index": 0 }]
]
},
"Descargar Imagen": {
"main": [
[{ "node": "Claude OCR", "type": "main", "index": 0 }]
]
}
},
"settings": {}
}{
"name": "Claude - Clasificador Emails",
"nodes": [
{
"parameters": {},
"id": "trigger-1",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"prompt": "Clasifica este email:\n\n{{ $json.email_body }}",
"model": "haiku",
"systemPrompt": "Eres un clasificador de emails para una empresa de energia solar.",
"jsonSchema": "{\"type\":\"object\",\"properties\":{\"categoria\":{\"type\":\"string\",\"enum\":[\"consulta\",\"reclamacion\",\"presupuesto\",\"spam\",\"otro\"]},\"prioridad\":{\"type\":\"string\",\"enum\":[\"alta\",\"media\",\"baja\"]},\"resumen\":{\"type\":\"string\"}},\"required\":[\"categoria\",\"prioridad\",\"resumen\"]}",
"binaryProperty": "",
"maxTurns": 3,
"timeout": 60,
"continueOnError": true
},
"id": "claude-1",
"name": "Clasificar Email",
"type": "n8n-nodes-claude-bridge.claudeBridge",
"typeVersion": 1,
"position": [500, 300],
"credentials": {
"claudeBridgeApi": {
"id": "CREDENTIAL_ID",
"name": "Claude Bridge API"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "cond-1",
"leftValue": "={{ $json.result.prioridad }}",
"rightValue": "alta",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
}
},
"id": "if-1",
"name": "Es Urgente?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [750, 300]
}
],
"connections": {
"Manual Trigger": {
"main": [
[{ "node": "Clasificar Email", "type": "main", "index": 0 }]
]
},
"Clasificar Email": {
"main": [
[{ "node": "Es Urgente?", "type": "main", "index": 0 }]
]
}
},
"settings": {}
}{
"name": "Claude - Analisis Factura PDF",
"nodes": [
{
"parameters": {},
"id": "trigger-1",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [250, 300]
},
{
"parameters": {
"filePath": "/files/factura.pdf"
},
"id": "read-1",
"name": "Leer PDF",
"type": "n8n-nodes-base.readBinaryFiles",
"typeVersion": 1,
"position": [500, 300]
},
{
"parameters": {
"prompt": "Extrae todos los datos de esta factura electrica.",
"model": "sonnet",
"systemPrompt": "Eres un experto en facturas electricas espanolas. Conoces las tarifas 2.0TD, 3.0TD, 6.xTD.",
"jsonSchema": "{\"type\":\"object\",\"properties\":{\"numero_factura\":{\"type\":\"string\"},\"fecha_emision\":{\"type\":\"string\"},\"periodo\":{\"type\":\"string\"},\"cups\":{\"type\":\"string\"},\"comercializadora\":{\"type\":\"string\"},\"potencia_contratada_kw\":{\"type\":\"number\"},\"consumo_total_kwh\":{\"type\":\"number\"},\"importe_total_eur\":{\"type\":\"number\"},\"tarifa\":{\"type\":\"string\"},\"desglose\":{\"type\":\"object\",\"properties\":{\"energia_eur\":{\"type\":\"number\"},\"potencia_eur\":{\"type\":\"number\"},\"impuesto_electrico_eur\":{\"type\":\"number\"},\"iva_eur\":{\"type\":\"number\"}}}},\"required\":[\"numero_factura\",\"importe_total_eur\",\"consumo_total_kwh\"]}",
"binaryProperty": "data",
"maxTurns": 5,
"timeout": 120,
"continueOnError": false
},
"id": "claude-1",
"name": "Extraer Datos Factura",
"type": "n8n-nodes-claude-bridge.claudeBridge",
"typeVersion": 1,
"position": [750, 300],
"credentials": {
"claudeBridgeApi": {
"id": "CREDENTIAL_ID",
"name": "Claude Bridge API"
}
}
},
{
"parameters": {
"operation": "create",
"tableId": "facturas",
"fieldsUi": {
"fieldValues": [
{ "fieldName": "numero_factura", "fieldValue": "={{ $json.result.numero_factura }}" },
{ "fieldName": "fecha_emision", "fieldValue": "={{ $json.result.fecha_emision }}" },
{ "fieldName": "cups", "fieldValue": "={{ $json.result.cups }}" },
{ "fieldName": "consumo_kwh", "fieldValue": "={{ $json.result.consumo_total_kwh }}" },
{ "fieldName": "importe_eur", "fieldValue": "={{ $json.result.importe_total_eur }}" },
{ "fieldName": "tarifa", "fieldValue": "={{ $json.result.tarifa }}" },
{ "fieldName": "raw_json", "fieldValue": "={{ JSON.stringify($json.result) }}" }
]
}
},
"id": "supabase-1",
"name": "Guardar en Supabase",
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [1000, 300],
"credentials": {
"supabaseApi": {
"id": "SUPABASE_CREDENTIAL_ID",
"name": "Supabase account"
}
}
}
],
"connections": {
"Manual Trigger": {
"main": [
[{ "node": "Leer PDF", "type": "main", "index": 0 }]
]
},
"Leer PDF": {
"main": [
[{ "node": "Extraer Datos Factura", "type": "main", "index": 0 }]
]
},
"Extraer Datos Factura": {
"main": [
[{ "node": "Guardar en Supabase", "type": "main", "index": 0 }]
]
}
},
"settings": {}
}n8n-nodes-claude-bridge.claudeBridge
claudeBridgeApi
{
"parameters": {
"prompt": "Tu prompt aqui. Soporta {{ $json.expresiones }}",
"model": "",
"systemPrompt": "",
"jsonSchema": "",
"binaryProperty": "",
"maxTurns": 10,
"timeout": 300,
"continueOnError": false
},
"id": "uuid-unico",
"name": "Claude Bridge",
"type": "n8n-nodes-claude-bridge.claudeBridge",
"typeVersion": 1,
"position": [500, 300],
"credentials": {
"claudeBridgeApi": {
"id": "CREDENTIAL_ID",
"name": "Claude Bridge API"
}
}
}| Campo | Valores | Tipo JSON |
|---|---|---|
prompt |
Cualquier string, min 1 char, max 200,000 chars | string |
model |
"", "sonnet", "opus",
"haiku" |
string |
systemPrompt |
Cualquier string, max 50,000 chars. Vacio = sin system prompt | string |
jsonSchema |
JSON Schema valido como string, o vacio | string |
binaryProperty |
Nombre de propiedad binaria, o vacio | string |
maxTurns |
1-50 | number |
timeout |
10-1800 | number |
continueOnError |
true / false |
boolean |
El bridge procesa maximo 2 peticiones simultaneas
(configurable via MAX_CONCURRENT en .env). Las
peticiones adicionales se encolan automaticamente.
Importante: el timeout cuenta desde que llega la peticion, NO desde que empieza a procesarse. Si hay cola, una peticion puede expirar antes de llegar a Claude.
Recomendacion: si iteras sobre arrays grandes (>5
items), usa un nodo Split In Batches con
batchSize=1 antes del Claude Bridge.
| Limite | Valor |
|---|---|
| Peticiones simultaneas | 2 (configurable) |
| Tamano de prompt | 200,000 caracteres |
| Tamano de system prompt | 50,000 caracteres |
| Tamano de JSON schema | 20,000 caracteres |
| Archivos por peticion | 10 |
| Tamano por archivo | 25 MB |
| Timeout maximo | 1,800 segundos (30 min) |
| Timeout default | 300 segundos (5 min) |
No hay limite de llamadas diarias. El consumo es por tokens, igual que usar Claude Code interactivamente. Modelos mas caros (Opus) consumen mas tokens por respuesta.
El bridge tiene un limite de 2 GB de RAM. Cada llamada a Claude
consume ~600 MB mientras se ejecuta. Con MAX_CONCURRENT=2,
el pico es ~1.4 GB.
docker exec n8n-n8n-1 cat /home/node/.n8n/nodes/package.jsoncd /docker/n8n && docker compose restart n8n/docker/claude-bridge/.env en el campo
BRIDGE_API_KEYMAX_CONCURRENT"type": "object" en el nivel raizmax_turns (minimo 3 para structured output, 5+
para analisis)ssh root@72.60.188.130
docker logs claude-bridge --tail 50
docker logs claude-bridge -f # seguir en tiempo realCada peticion tiene un request_id unico que aparece en
request y response para facilitar el debugging.
ssh root@72.60.188.130
cd /docker/claude-bridge && docker compose restartcurl -s http://claude-bridge:8000/health
# O desde el host:
docker exec claude-bridge curl -s http://localhost:8000/healthSi necesitas llamar al bridge directamente desde un nodo HTTP Request o desde otro sistema:
curl -X POST http://claude-bridge:8000/chat \
-H "X-API-Key: TU_BRIDGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Hola, como estas?",
"model": "sonnet",
"system_prompt": "Responde en espanol",
"max_turns": 3,
"timeout": 60
}'curl -X POST http://claude-bridge:8000/chat \
-H "X-API-Key: TU_BRIDGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Describe esta imagen",
"files": [{
"filename": "foto.jpg",
"content_base64": "BASE64_DEL_ARCHIVO",
"mime_type": "image/jpeg"
}],
"max_turns": 3,
"timeout": 60
}'curl -X POST http://claude-bridge:8000/chat \
-H "X-API-Key: TU_BRIDGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Lista 3 colores primarios",
"json_schema": "{\"type\":\"object\",\"properties\":{\"colors\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"colors\"]}",
"max_turns": 3,
"timeout": 60
}'curl http://claude-bridge:8000/healthRespuesta:
{"status":"ok","concurrent_running":0,"max_concurrent":2,"queue_size":0}