Claude Bridge — Documentacion

Claude Bridge — Nodo personalizado para n8n

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.


Tabla de contenidos

  1. Configuracion inicial
  2. Parametros del nodo
  3. Respuesta del nodo
  4. Ejemplos de uso
  5. Trabajar con archivos e imagenes
  6. Structured output (JSON Schema)
  7. Crear workflows via API de n8n
  8. Estructura JSON completa del nodo
  9. Limites y concurrencia
  10. Troubleshooting

1. Configuracion inicial

Crear la credential

  1. Abre n8n > Credentials > Add Credential
  2. Busca “Claude Bridge API”
  3. Rellena:
  4. Guarda

Estructura JSON de la credential

{
  "name": "claudeBridgeApi",
  "type": "claudeBridgeApi",
  "data": {
    "bridgeUrl": "http://claude-bridge:8000",
    "apiKey": "TU_BRIDGE_API_KEY"
  }
}

Usar el nodo en un workflow

  1. En el editor de n8n, abre el panel de nodos (click en +)
  2. Busca “Claude Bridge” (aparece con el icono de Claude)
  3. Arrastralo al canvas y conectalo
  4. Selecciona la credential “Claude Bridge API” que creaste
  5. Escribe un prompt y ejecuta

2. Parametros del nodo

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

Valores del campo Model

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

3. Respuesta del nodo

Cada ejecucion del nodo devuelve un item JSON con esta estructura:

Respuesta exitosa

{
  "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
}

Respuesta con structured output (json_schema)

{
  "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.

Respuesta con error

{
  "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
}

Acceder a los campos en nodos posteriores

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

4. Ejemplos de uso

4.1 Pregunta simple

Prompt: "Que es la energia fotovoltaica? Responde en 2 frases."
Model: Haiku
Max Turns: 1

4.2 Analisis de datos con expresiones n8n

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

4.3 Clasificacion con Haiku (rapido y barato)

Prompt: "Clasifica este email en: spam, consulta, reclamacion, presupuesto.
Email: {{ $json.body }}"
Model: Haiku
Max Turns: 1

4.4 Generacion de contenido con Opus

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

4.5 Traduccion

Prompt: "Traduce al ingles:\n{{ $json.text }}"
Model: Haiku
Max Turns: 1

5. Trabajar con archivos e imagenes

El nodo detecta automaticamente si el item de entrada tiene datos binarios (archivos, imagenes, PDFs). Los envia a Claude para su analisis.

Como funciona

  1. Un nodo anterior produce datos binarios (HTTP Request, Read Binary File, Gmail Trigger, etc.)
  2. El Claude Bridge los detecta, los convierte a base64 y los envia al bridge
  3. Claude los lee y analiza dentro de su entorno

Flujo: OCR de una imagen

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

Flujo: Extraer datos de un PDF

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

Flujo: Analizar adjunto de email

Gmail Trigger                  →  Claude Bridge
(nuevo email con adjunto)          Prompt: "Resume el documento adjunto
                                    en 3 puntos clave."
                                   Binary Property: attachment_0
                                   Max Turns: 5

Campo Binary Property

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]

Formatos soportados

Formato Soporte Notas
JPEG Si Vision/OCR completo
PNG Si Vision/OCR completo
GIF Si Solo primer frame
WebP Si Vision/OCR completo
PDF Si Hasta 100 paginas, 32 MB
Texto plano Si .txt, .csv, .json, etc.
SVG No No soportado por la API de Anthropic

Limite de tamano

Validacion de archivos

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


6. Structured output (JSON Schema)

Permite obtener respuestas de Claude en formato JSON validado contra un schema. Util para integraciones donde necesitas datos estructurados.

Como usarlo

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).

Ejemplo: Extraer datos de un email

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

Ejemplo: Analisis de sentimiento por lotes

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

7. Crear workflows via API de n8n

Puedes crear workflows que usen Claude Bridge programaticamente usando la API REST de n8n.

Endpoint

POST https://n8n.electriaenergy.com/api/v1/workflows
Header: X-N8N-API-KEY: <tu-api-key-de-n8n>
Content-Type: application/json

Ejemplo: Workflow “Pregunta simple a Claude”

{
  "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": {}
}

Ejemplo: Workflow “OCR de imagen desde URL”

{
  "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": {}
}

Ejemplo: Workflow “Clasificador con Structured Output”

{
  "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": {}
}

Ejemplo: Workflow “Analisis de factura PDF con guardado en Supabase”

{
  "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": {}
}

8. Estructura JSON completa del nodo

Tipo del nodo

n8n-nodes-claude-bridge.claudeBridge

Tipo de credential

claudeBridgeApi

Estructura completa con todos los parametros

{
  "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"
    }
  }
}

Valores validos por campo

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

9. Limites y concurrencia

Concurrencia

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.

Limites de la API del 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)

Limites de Claude (suscripcion Max 20x)

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.

Memoria del VPS

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.


10. Troubleshooting

El nodo no aparece en n8n

Error “Invalid API key”

Error “Timed out after Ns”

Error “Binary property ‘X’ not found”

Error “File ‘X’ declared as image/png but contains HTML/XML”

Error “json_schema is not valid JSON”

Claude devuelve respuestas vacias o cortas

Ver logs del bridge

ssh root@72.60.188.130
docker logs claude-bridge --tail 50
docker logs claude-bridge -f  # seguir en tiempo real

Cada peticion tiene un request_id unico que aparece en request y response para facilitar el debugging.

Reiniciar el bridge

ssh root@72.60.188.130
cd /docker/claude-bridge && docker compose restart

Estado del bridge

curl -s http://claude-bridge:8000/health
# O desde el host:
docker exec claude-bridge curl -s http://localhost:8000/health

API directa del bridge (sin nodo n8n)

Si necesitas llamar al bridge directamente desde un nodo HTTP Request o desde otro sistema:

POST /chat

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
  }'

POST /chat con archivo

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
  }'

POST /chat con structured output

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
  }'

GET /health

curl http://claude-bridge:8000/health

Respuesta: {"status":"ok","concurrent_running":0,"max_concurrent":2,"queue_size":0}