Category: AI

  • Qué es un modelo multimodal: tu imagen también son tokens

    Qué es un modelo multimodal: tu imagen también son tokens

    Hace unas semanas metí un pantallazo de un dashboard de facturación en una llamada a la API y le pedí al modelo el total del mes.

    Me devolvió una cifra. Redonda, con su símbolo de euro, con toda la seguridad del mundo.

    Estaba mal. No un poco mal: mal de otro trimestre.

    Mi primer reflejo fue culpar al OCR. Craso error, porque ahí no había ningún OCR. Y ese fue el momento en el que entendí que llevaba meses usando un modelo multimodal sin tener ni idea de lo que pasaba entre mi fetch y la respuesta.

    El modelo no leyó mi dashboard. Lo convirtió en tokens y predijo qué números encajaban ahí.


    Qué es un modelo multimodal

    Un modelo multimodal es un modelo de IA que acepta más de un tipo de entrada —texto, imagen, audio o vídeo— porque convierte todas esas entradas a vectores del mismo espacio y las procesa con un único transformer. No hay un "módulo de visión" que mira y luego le cuenta al modelo lo que hay: todo acaba siendo la misma sopa de números, y el modelo sigue haciendo lo único que sabe hacer, predecir el siguiente token.

    Lo esencial, antes de entrar en detalle:

    • Entrada no es salida. Que un modelo acepte imágenes no significa que las genere. Claude entiende imágenes; no las produce ni las edita.
    • Se factura por parches. Claude trocea la imagen en bloques de 28×28 px y cobra cada bloque como un visual token.
    • El coste es de prompt. Una captura de 1000×1000 px son 1.296 tokens de entrada antes de que el modelo escriba una palabra.
    • El conteo es aproximado. La documentación de Anthropic lo admite: los conteos de objetos y las coordenadas no son exactos.

    Cómo funciona: tu imagen no entra como imagen, entra como tokens

    Un modelo multimodal procesa una imagen en tres pasos: un encoder la trocea en parches y convierte cada parche en un vector, una capa de proyección lleva esos vectores a la misma dimensionalidad que los embeddings de texto, y el transformer los mezcla con los tokens de tu prompt como si fueran palabras. Si ya tienes claro que la IA no piensa, predice, es una extensión bastante elegante de la misma idea.

    Un LLM de texto tiene un tokenizador: parte tu string en trozos y a cada trozo le asigna un vector de N dimensiones. Ese vector es lo que come el transformer.

    Un modelo multimodal añade una pieza delante: un encoder por cada modalidad. Para imagen suele ser un Vision Transformer que trocea el bitmap en parches cuadrados y convierte cada parche en un vector. Para audio, algo equivalente sobre el espectrograma.

    Después viene el truco de todo esto: una capa de proyección que traduce esos vectores a la misma dimensionalidad que los embeddings de texto. Pasada esa capa, el transformer los procesa con la misma maquinaria: no hay una ruta especial para lo visual. El vector del parche 47 de tu JPEG y el de la palabra "factura" son vecinos en el mismo espacio, aunque el modelo sepa perfectamente cuál vino de dónde.

    Anthropic lo documenta de forma literal: Claude ve las imágenes en parches de 28×28 píxeles y a cada parche lo llama visual token. No es una metáfora divulgativa, es la unidad de facturación.

    El detalle que rompe la intuición: la secuencia final es una lista plana donde los tokens de la imagen y los de tu prompt están mezclados, atendiéndose unos a otros con el mismo mecanismo de atención de siempre.

    No hay un ojo. Hay una secuencia más larga.

    Y ojo con la confusión que cuesta dinero en reuniones de producto: que un modelo acepte imágenes no significa que las genere. Claude entiende imágenes, no las produce ni las edita. Gemini y la familia GPT sí generan, con endpoints y precios propios. Cuando alguien proponga "usar IA multimodal", pregunta si habla de entrada o de salida.


    El código: mandar una imagen de verdad

    Así se envía una imagen a Claude con el SDK oficial de TypeScript. Fíjate en el orden: la imagen antes del texto, porque la propia documentación de Anthropic recomienda esa estructura.

    import Anthropic from "@anthropic-ai/sdk";
    import { readFile } from "node:fs/promises";
    
    const anthropic = new Anthropic(); // lee ANTHROPIC_API_KEY del entorno
    
    const imageData = (await readFile("factura.jpg")).toString("base64");
    
    const message = await anthropic.messages.create({
      model: "claude-opus-5",
      max_tokens: 16000, // el thinking va dentro de este tope: no lo dejes corto
      messages: [
        {
          role: "user",
          content: [
            {
              type: "image",
              source: {
                type: "base64",
                media_type: "image/jpeg",
                data: imageData,
              },
            },
            {
              type: "text",
              text: "Extrae total, fecha y NIF. Devuelve JSON. Si un campo no es legible, null.",
            },
          ],
        },
      ],
    });
    
    console.log(message.usage.input_tokens); // aquí está la factura de verdad
    

    Si la imagen ya vive en una URL pública, te ahorras el base64:

    // sustituye el bloque de imagen del array content por este
    const imageBlock: Anthropic.ImageBlockParam = {
      type: "image",
      source: { type: "url", url: "https://ejemplo.com/factura.jpg" },
    };
    

    Loguea usage.input_tokens desde el primer día. Es la diferencia entre una demo bonita y saber lo que te va a costar en producción.

    Y ese null del prompt no es adorno: cuando el modelo te devuelve JSON extraído de un píxel borroso, necesitas un esquema que valide antes de que ese dato toque tu base de datos. Es el patrón que trabajo en el curso de Zod: el modelo propone, el schema dispone.


    Cuánto cuesta una imagen en un modelo multimodal

    Una imagen cuesta ⌈ancho / 28⌉ × ⌈alto / 28⌉ visual tokens en la API de Claude. Es aritmética pública y simple, y aun así aquí es donde se tuercen la mayoría de los proyectos multimodales: nadie hace la cuenta antes.

    Los modelos de Claude 4.7 en adelante están en el tier de alta resolución (borde largo máximo 2576 px, tope de 4.784 visual tokens); los anteriores, en el estándar (1568 px, 1.568 tokens). Si te pasas, la imagen se reescala antes de procesarse.

    Estas son las cifras que publica la documentación oficial de visión de Anthropic:

    Imagen Tier estándar Tier alta resolución
    200×200 px 64 tokens 64 tokens
    1000×1000 px 1.296 tokens 1.296 tokens
    1920×1080 px 1.560 tokens (reescalada a 1456×819) 2.691 tokens
    3840×2160 px (4K) 1.560 tokens (reescalada) 4.784 tokens (reescalada a 2576×1449)

    Traduce eso a dinero. Con Opus 5 a 5 $ por millón de tokens de entrada (precios de julio de 2026), mil capturas de 1000×1000 salen por unos 6,48 $ y mil capturas en 4K por unos 23,92 $. La cuenta la puedes rehacer tú: 1.296 × 5 / 1.000.000 × 1.000.

    Parece barato hasta que lo multiplicas por un agente que itera catorce veces sobre la misma pantalla.

    Con audio pasa lo mismo en otra escala. Gemini documenta 32 tokens por segundo, o sea 1.920 tokens por minuto. Una reunión de una hora son unos 115.000 tokens de entrada antes de que el modelo escriba una sola palabra.

    Tres consecuencias prácticas:

    1. Redimensiona antes de subir. Mandar un 4K cuando el texto se lee perfectamente a 1200 px es tirar tokens y latencia a la basura.
    2. En conversaciones de varios turnos, usa la Files API. Con base64 el payload entero viaja otra vez en cada turno, porque el historial se reenvía completo. Con file_id subes una vez y referencias. Ojo: hoy va por anthropic.beta.files.upload y hay que pasar betas: ["files-api-2025-04-14"].
    3. La imagen infla el prompt, no la respuesta. Ese coste es todo de entrada y el modelo lo digiere antes del primer token. La latencia sube aunque respondas tres líneas.

    Dónde falla un modelo multimodal (y falla más de lo que crees)

    Un modelo multimodal alucina con imágenes por el mismo motivo por el que la IA se inventa cosas con texto: no hay un módulo de verdad, hay una distribución de probabilidad. La diferencia es que con una imagen mala el modelo tiene menos señal y más margen para rellenar con lo plausible.

    Mi dashboard fue justo eso. Cifras pequeñas, reescaladas, con poco contraste. El modelo generó el número que estadísticamente encajaba en ese hueco.

    La documentación de Anthropic reconoce los límites sin maquillaje. Con imágenes de baja calidad, rotadas o de menos de 200 píxeles, alucina. Los conteos de objetos son aproximados. Las coordenadas, también. Y no puede determinar si una imagen fue generada por IA: si se lo preguntas, se inventa la respuesta.

    Léelo otra vez: el conteo es aproximado. Si tu caso de uso es "cuántos palés hay en esta foto" y tu negocio depende de esa cifra, tienes un problema de arquitectura, no de prompt.

    Sobre el OCR: un modelo multimodal entiende un documento con layout raro, tablas torcidas o manuscritos mucho mejor que Tesseract. Pero un OCR clásico es determinista y trazable. El modelo puede darte dos respuestas distintas para la misma imagen, y si le pides coordenadas te las da aproximadas, nunca como una región verificable contra el original. En un pipeline de compliance eso es inaceptable.

    Modelo multimodal OCR clásico (Tesseract, Textract)
    Layout variable, manuscritos, fotos malas Muy bueno Malo
    Misma imagen → misma salida No garantizado
    Trazabilidad de dónde salió el dato No la da Sí, con bounding boxes
    Coste Por visual token, escala con la resolución Plano o por página
    Entiende el contenido ("¿este ticket es de comida?") No
    Apto para compliance sin revisión humana No

    Cuándo usar un modelo multimodal y cuándo es un martillo caro

    Mi regla, después de comerme varias facturas de API sin necesidad:

    Si el dato ya existe en forma estructurada, no le mandes la foto. Si tienes el PDF con capa de texto, extrae el texto. Si tienes la API del dashboard, llama a la API. Mandar una captura de algo que podías consultar en JSON es la forma más cara de leer un número.

    Usa multimodal cuando la información vive en la disposición visual y no en el contenido. Un ticket arrugado fotografiado de noche. Un diagrama en una pizarra. El screenshot de una UI rota que un usuario manda por soporte. Ahí la alternativa no es un parser peor: es que no hay alternativa.

    Y vigílalo dentro del bucle agéntico. Si montas un agente que navega e interpreta pantallas, cada iteración multiplica el coste visual. Esa distinción entre IA generativa e IA agéntica importa mucho más cuando cada paso arrastra 2.700 tokens de imagen.

    Y si lo que necesitas es buscar entre miles de imágenes en vez de razonar sobre una, ya no quieres un modelo generativo: quieres embeddings multimodales e índice vectorial. Lo tienes montado paso a paso en el pipeline multimodal con Gemini Embedding 2.

    La decisión que va antes —si tu problema es de búsqueda, de RAG o de fine-tuning— la desmenucé aquí.


    Lo que puedes hacer hoy

    Coge la funcionalidad multimodal que tengas en marcha o en el backlog y haz una sola cosa: calcula sus visual tokens con la fórmula, multiplícalos por tu volumen mensual real y compáralo con lo que cuesta resolverlo sin imagen.

    En más casos de los que esperas descubrirás que ibas a pagar por interpretar un pantallazo de un dato que ya tenías en una tabla. En el resto tendrás el número exacto para defender el proyecto delante de quien firma.

    Los modelos multimodales no son magia ni son un timo. Son un canal de entrada más, con su precio por parche y su margen de error. Trátalos como lo que son: una dependencia cara. Mídela antes de casarte con ella.

    Cómo encaja esto en un producto completo —qué resuelve el modelo y qué resuelve código normal— lo trabajo de principio a fin en Construye con IA. Y si prefieres discutirlo con gente que está construyendo lo mismo esta semana, estamos en Dominicode Labs.


    Preguntas frecuentes

    ¿Qué es un modelo multimodal en una frase?

    Un modelo que acepta varios tipos de entrada —texto, imagen, audio, vídeo— porque los convierte todos a vectores del mismo espacio antes de procesarlos. En la práctica, para el desarrollador significa una sola cosa: tu imagen entra en el prompt como tokens, cuesta como tokens y se factura como tokens.

    ¿Un modelo multimodal "ve" la imagen como una persona?

    No. Trocea el bitmap en parches, convierte cada parche en un vector y los intercala con los tokens de tu prompt. No hay percepción: hay una secuencia de números sobre la que se aplica atención. Por eso describe con precisión una escena compleja y a la vez falla contando cuatro objetos.

    ¿Cuántos tokens cuesta enviar una imagen?

    Depende de la resolución y del proveedor. En la API de Claude son ⌈ancho / 28⌉ × ⌈alto / 28⌉ visual tokens, con reescalado automático si superas el límite del modelo: 1000×1000 px son 1.296 tokens y un 4K llega al tope de 4.784 en el tier de alta resolución. Son cifras aproximadas de la documentación oficial, así que loguea usage.input_tokens en vez de fiarte de una estimación.

    ¿Es mejor un modelo multimodal que un OCR clásico?

    Para documentos con layout variable, manuscritos o fotos malas, casi siempre sí. Para pipelines que necesitan determinismo, trazabilidad y coste plano, no. Muchos sistemas serios usan los dos, con el modelo actuando solo sobre lo que el OCR no resuelve.

    ¿Los modelos multimodales también generan imágenes?

    No todos. Aceptar imágenes como entrada y producirlas como salida son capacidades distintas. Claude entiende imágenes pero no las genera ni las edita, según su propia documentación. Gemini y la familia GPT sí tienen generación, con endpoints y precios propios. Confirma cuál de las dos necesitas antes de planificar la feature.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Cómo evaluar un proyecto de IA: cinco preguntas antes de aprobar

    Cómo evaluar un proyecto de IA: cinco preguntas antes de aprobar

    Un responsable de operaciones entra en la reunión con la frase ya montada: "queremos un agente para las devoluciones".

    Primera pregunta del árbol. ¿Los pasos son siempre los mismos, y en el mismo orden?

    Sí. Salvo cuando el importe supera cierto umbral.

    Fin del árbol. En la pregunta uno.

    Lo que necesitaba era un workflow con una excepción. Y estaba presupuestando diez veces eso.

    Esto es lo que no sale en la diapositiva de nadie que venga a venderte algo, y es el fondo de cómo evaluar un proyecto de IA: el resultado más frecuente de hacerlo bien es descubrir que no hacía falta un agente. No es falta de ambición. Es lo que hace que el proyecto siga vivo dentro de dos años.

    Y hay un motivo egoísta para que te importe aunque tú no firmes ningún presupuesto: la decisión mala la acabas implementando tú.

    Si lo que buscas es el vocabulario —qué es un agente y qué no—, está entero en esta guía. Aquí no definimos nada. Aquí decidimos, y le ponemos precio a cada decisión.


    Resumen rápido

    • Cinco preguntas, en orden, y se para en la primera que aplique. No es un cuestionario: es un árbol.
    • Cada peldaño que subes multiplica el coste. La gracia está en pararse en el más bajo que resuelve el problema.
    • En IA el éxito es lo que dispara el coste: se paga por uso, así que si la herramienta gusta, la factura sube con ella.

    Cómo evaluar un proyecto de IA: el árbol de cinco preguntas

    Evaluar un proyecto de IA es recorrer estas cinco preguntas en orden y parar en la primera que aplique:

    1. ¿Los pasos son siempre los mismos, y en el mismo orden? Si sí, es un workflow, no un agente.
    2. ¿Basta con leer y escribir texto, sin tocar ningún otro sistema? Si sí, basta un chat con buen contexto.
    3. ¿Hay que decidir sobre la marcha según lo que se encuentre? Si no, workflow otra vez.
    4. Si se equivoca, ¿se puede deshacer? Si no, agente con una persona aprobando cada acción con consecuencias.
    5. ¿Puedes medir si lo ha hecho bien? Si no, todavía no va a producción.

    Cada peldaño que superas multiplica el coste, así que evaluar bien un proyecto de IA consiste en pararse en el escalón más bajo que resuelve el problema.

    La decisión se toma casi siempre al revés. Alguien quiere hacer algo con IA y después busca dónde encajarlo. Así es como acabas pagando la flexibilidad de un agente para ejecutar cinco pasos que nunca cambian.

    El árbol invierte el orden. Primero el problema, después la herramienta. Y así es como se ve cuando lo pones en una hoja, que es la forma en que de verdad se usa en una reunión:

      1. ¿Los pasos son siempre los mismos,
         y en el mismo orden?
           └─ SÍ → workflow. No agente.
           ↓ NO
    
      2. ¿Basta con leer y escribir texto,
         sin tocar ningún otro sistema?
           └─ SÍ → un chat con buen contexto.
           ↓ NO
    
      3. ¿Hay que decidir sobre la marcha
         según lo que se encuentre?
           └─ NO → workflow otra vez.
           ↓ SÍ
    
      4. Si se equivoca, ¿se puede deshacer?
           └─ NO → agente, pero con una
                    persona aprobando todo
                    lo que tenga consecuencias.
           ↓ SÍ
    
      5. ¿Puedes medir si lo ha hecho bien?
           └─ NO → todavía no va a producción.
           ↓ SÍ
    
         → Adelante. Empieza con los permisos
           mínimos y ábrelos según se los gane.
    

    Ninguna de las cinco es técnica: se contestan describiendo el proceso. Vamos una a una, con el precio de quedarse en cada peldaño al lado. Porque el árbol no va de arquitectura. Va de dinero.


    Uno. ¿Los pasos son siempre los mismos y en el mismo orden?

    Si la respuesta es sí, ya has terminado. No necesitas un agente: necesitas un workflow.

    Más barato, más rápido, auditable, y no improvisa. Cuando falla, el informe de incidencia cabe en una línea: falló el paso tres. Eso también es dinero, porque nadie factura horas reconstruyendo qué pasó.

    Esta pregunta se salta por una razón muy humana: describir un proceso como "variable" suena mejor que describirlo como "cinco pasos y una excepción". Pero el caso de las devoluciones es el típico, no la anomalía. Los pasos son fijos salvo un caso, y ese salvo se convierte en el argumento para presupuestar un sistema entero.

    Un if no es variedad. Es un if.

    Y aquí está el multiplicador que hace que esta pregunta valga tanto dinero: un agente que da quince vueltas en lugar de tres no cuesta cinco veces más. Cuesta bastante más, porque el coste no crece con el número de vueltas, sino con la suma de todas las anteriores: cada una reenvía el contexto completo. Un workflow ejecuta los pasos que escribiste y para.

    Muchos candidatos a agente son procesos que pueden escribirse tal cual, y los desmenucé en cómo automatizar tu proceso de desarrollo con IA.

    Lo que pagas aquí: ingeniería una vez, ejecución predecible. Es el único escalón donde la factura no depende de que la herramienta guste.


    Dos. ¿Basta con leer y escribir texto, sin tocar ningún otro sistema?

    Si es que sí, te sobra con un chat con buen contexto. Súmale tus documentos y ya está.

    Redactar, resumir, reformular, clasificar. Nada de eso toca un sistema ni necesita permisos, y montarlo es cuestión de días.

    Lo que se subestima aquí no es la capacidad. Es la latencia.

    Un asistente que tarda ocho segundos sirve perfectamente para redactar un informe. El mismo asistente delante de un cliente al teléfono es inaceptable. La calidad es idéntica; el uso, imposible. Y un agente multiplica esa espera por el número de vueltas: lo que en un chat son ocho segundos, en un agente pueden ser dos minutos.

    Regla que uso siempre: si hay una persona esperando, la latencia es un requisito, no un detalle. Si el proceso corre de madrugada, da igual lo que tarde.

    Lo que pagas aquí: sube con el número de personas, no con la complejidad. Es el escalón que menos sorpresas da.


    Tres. ¿Hay que decidir sobre la marcha según lo que se encuentre?

    Si es que no, workflow otra vez.

    Esta pregunta existe porque hay procesos que tocan varios sistemas —por eso pasaron la dos— pero donde el orden sigue estando escrito de antemano. Leer un correo, extraer datos, meterlos en el CRM, avisar por Slack. Toca cuatro cosas. No decide ninguna.

    El error de asignación es carísimo y se repite: mover datos de un sitio a otro no necesita un modelo eligiendo el siguiente paso. Necesita una automatización de las de siempre, con IA solo en el hueco donde hace falta criterio.

    El árbol decide un proyecto entero. Cuando lo que tienes delante es un backlog y no un presupuesto, la unidad cambia: se decide tarea por tarea, y eso está en cómo clasificar tareas de desarrollo para delegarlas a la IA.

    Lo que pagas aquí: lo mismo que en la uno, más las ramas que hay que mantener. Sigue siendo el barato.


    Cuatro. Si se equivoca, ¿se puede deshacer?

    Si la respuesta es no, la respuesta tampoco es "no lo hagas". Es: agente sí, pero con una persona aprobando cada acción con consecuencias.

    Sin excepciones. Y sin renegociarlo a la baja tres semanas después porque aprobar es un incordio.

    Pagar, contratar, publicar, borrar, escribir a clientes reales, migrar datos de producción. Ninguna de esas se deshace con un ctrl+Z, y todas tienen un coste que ya no es de infraestructura: es de reputación, de contrato o de nómina.

    La parte que no aparece en ninguna hoja de cálculo: esa persona es un coste recurrente y no escala. Revisar el diez por ciento de las salidas es viable con cien casos al día e imposible con diez mil. El proveedor absorbe el volumen sin despeinarse. Quien lo vigila, no.

    Y si el proyecto solo sale a cuenta cuando quitas al humano de en medio, entonces no sale a cuenta. Eso es información valiosa, y llega gratis si haces la pregunta antes de firmar.

    Lo que pagas aquí: el modelo por las vueltas, más el tiempo de quien aprueba. Este es el peldaño donde el presupuesto cambia de orden de magnitud, no de porcentaje.


    Cinco. ¿Puedes medir si lo ha hecho bien?

    Si es que no, no lo pongas en producción todavía.

    No porque vaya a salir mal desde el primer día. Al revés: va a salir bien, porque los pilotos salen bien.

    El problema llega después. Sin forma de medir no vas a saber si empeora, y va a empeorar: cambias de modelo, cambia el tipo de casos que llegan, alguien toca un prompt. Todo eso ocurre sin que salte ninguna alarma, porque no hay alarma.

    Medir son dos cosas y hacen falta las dos. Una señal automática que diga si la ejecución fue correcta. Y la traza de qué decidió el sistema y con qué información, que es lo que te deja reconstruir un incidente en vez de opinar sobre él — la lista de qué guardar de cada ejecución la tienes en este repaso de observabilidad para agentes.

    Decidir qué salida es aceptable antes de construir, en lugar de parchearlo cuando ya ha explotado, es el trabajo que describo en el libro de Spec-Driven Development. No es burocracia: es lo que hace que la pregunta cinco tenga respuesta el día que la haces.

    Lo que pagas aquí: todo lo anterior más la infraestructura de medir. Y esa no se va nunca, porque es la que sostiene el resto.

    Si llegas al final del árbol, adelante. Un agente es la respuesta correcta y merece la pena. Empieza con los permisos mínimos y ábrelos según se los gane.


    Dónde te paras y qué pagas

    Cada parada del árbol tiene un perfil de coste distinto, y esa es la información que falta en casi todos los presupuestos:

    Dónde se para el árbol Lo que pagas de verdad
    Pregunta 1 → workflow Ingeniería una vez. Ejecución predecible
    Pregunta 2 → chat con contexto Por conversación. Sube con las personas
    Pregunta 3 → workflow otra vez Igual que 1, más ramas que mantener
    Pregunta 4 → agente con aprobación Modelo × vueltas + tiempo de quien aprueba
    Pregunta 5 → agente instrumentado Todo lo anterior + medir, para siempre

    Esta tabla es la razón de que el orden de las preguntas no sea decorativo.

    Anthropic lo dice sin rodeos en Building effective agents (diciembre de 2024): la recomendación es buscar siempre la solución más simple posible, y eso "puede significar no construir sistemas agénticos en absoluto". Es la empresa que te cobra por vuelta diciéndote que des menos vueltas.


    Cuánto cuesta un proyecto de IA: la cuenta que casi nadie hace

    Un proyecto de IA no se paga por licencia: se paga por uso. Un taxímetro, no un abono.

    En el software al que estás acostumbrado, el usuario número mil sale casi gratis. Aquí no: cada respuesta rehace un cálculo entero, y ese cálculo cuesta dinero.

    De ahí sale la frase que te va a servir en cualquier reunión de presupuesto: en IA, el éxito es lo que dispara el coste. Si la herramienta gusta y la usa todo el mundo, la factura sube en la misma proporción. Al revés de lo que espera un director financiero.

    Así que la cuenta es esta, y se hace antes: coste por consulta × número de consultas al mes, con el escenario de que la herramienta guste.

    Un piloto de diez personas y una implantación de dos mil no se diferencian en dos veces. Se diferencian en dos órdenes de magnitud. Y dos detalles estropean cualquier estimación hecha a ojo: lo que sale se cobra varias veces más caro que lo que entra —está en las tarifas públicas de Anthropic y en las de cualquier otro proveedor—, y una conversación larga cuesta más que la suma de sus mensajes, porque cada turno reenvía todo lo anterior.

    Esa asimetría entre lo que entra y lo que sale, con los números de coste al lado, la desglosé en IA generativa vs IA agéntica.

    El piloto es el diez por ciento del trabajo aunque parezca el noventa

    Un piloto se monta en semanas y sale bien: casos elegidos, gente motivada y alguien vigilando de cerca.

    Producción es otra cosa. Aparecen los casos raros, los usos que nadie previó, el mantenimiento de la base de conocimiento y la factura de verdad. Y aparece el punto que más proyectos entierra: quién se ocupa de esto dentro de un año. El piloto lo llevó alguien con ilusión en un rato libre. Producción necesita un dueño en el organigrama.

    Piloto Producción
    Casos Elegidos a mano Los que lleguen, incluidos los raros
    Usuarios Motivados y avisados Todos, y sin leer las instrucciones
    Supervisión Alguien mirando de cerca Una revisión semanal que hay que asignar
    Coste Casi ruido Coste por consulta × volumen real
    Dueño Quien tuvo la idea Una persona en el organigrama

    La regla, dura a propósito: si al terminar el piloto no sabes decir quién lo mantiene, cuánto costará al volumen real y quién lo revisa cada semana, el piloto no ha terminado. Ha terminado la parte divertida.

    Cómo evaluar un proyecto de IA cuando no hay un "antes" que medir

    Empieza por procesos donde puedas medir el antes. Es la regla que evita la mayoría de los disgustos, y se entiende sola: si no sabes cuánto tardabais en tramitar una devolución antes de la IA, tampoco vas a poder demostrar que ahora tardáis menos. Y sin eso, la renovación del presupuesto se decide por sensaciones.

    Cuidado con lo que eliges medir, porque lo que midas es lo que vas a conseguir. Si mides volumen tendrás volumen: más documentos generados, más tickets cerrados y ninguna certeza de que algo haya mejorado. Qué métricas dicen la verdad lo desarrollé en cómo medir la productividad de equipos que usan IA.


    Por qué te importa aunque tú no firmes nada

    Este árbol es cosa de quien firma. Por eso te importa a ti.

    Cuando alguien aprueba un agente para un proceso de cinco pasos fijos, tú eres quien pasa los seis meses siguientes intentando que un sistema no determinista se comporte de forma determinista. Vas a montar guardrails para forzar un orden que cabía en un switch. Vas a depurar ejecuciones que no se repiten. Vas a explicar por qué sube la factura.

    Todo eso era evitable en la pregunta uno, en una reunión de veinte minutos a la que probablemente no te invitaron.

    La jugada es sencilla: haz tú las cinco preguntas, en voz alta, antes de que se decida nada. No hace falta ser quien firma para ser quien pregunta.

    Y cuando la decisión ya está tomada y lo que te llega es una frase de reunión, el trabajo es traducirla antes de que se convierta en alcance: cómo explicar IA a tu jefe y las seis frases que acaban en tu sprint.

    Y si quieres contrastar el árbol antes de usarlo, esa conversación pasa cada semana en Dominicode Labs, con gente que ya tiene estos sistemas corriendo.

    Y si quieres el recorrido de idea a producto con este criterio aplicado desde el primer día, es el camino del curso Construye con IA.


    Lo único que tienes que hacer hoy

    Coge el proyecto de IA que ya está aprobado. Ese, no el que viene.

    Y contesta la pregunta uno: ¿los pasos son siempre los mismos y en el mismo orden?

    Si la respuesta empieza por "sí, salvo cuando…", ese salvo es la conversación que tienes que provocar esta semana. Porque casi siempre es un if, y estás pagando por un sistema que decide para no tener que escribirlo.

    El árbol sale de un libro que estoy terminando, El mapa de la inteligencia artificial: 120 conceptos para gente que decide sin escribir código. Mientras tanto, esos conceptos colocados por zonas —y estas cinco preguntas en formato imprimible— los tienes gratis en el mapa desplegable.

    Imprímelo y déjalo en la sala de reuniones. Mejor aún: pásaselo a quien te aprueba el presupuesto. Ahí es donde de verdad hace su trabajo.


    Preguntas frecuentes

    ¿Cómo se evalúa si un proyecto de IA merece la pena?

    Con un árbol de cinco preguntas que se recorre en orden y se detiene en la primera que aplique: si los pasos son siempre los mismos, si basta con leer y escribir texto, si hay que decidir sobre la marcha, si el error es reversible y si puedes medir el resultado. Cada peldaño que subes multiplica el coste y el riesgo, así que evaluar bien es pararse en el escalón más bajo que resuelve el problema.

    ¿Cuándo compensa pagar por un agente y cuándo basta con un workflow?

    Un agente solo justifica su precio cuando el camino cambia según lo que el sistema encuentra durante la ejecución, y pagar flexibilidad para un proceso fijo es el error más caro de esta lista. Si los pasos están fijados de antemano, un workflow es más barato, más rápido y auditable. Si el trabajo se agota en leer y escribir texto sin tocar otros sistemas, un chat con buen contexto y tus documentos resuelve el caso en días.

    ¿Por qué la primera pregunta ahorra tanto dinero?

    Porque corta los proyectos más caros antes de que existan. Un agente que da quince vueltas en lugar de tres multiplica la factura, y cada vuelta reenvía todo el contexto anterior, así que el coste no crece con el número de pasos sino con la suma de todos los anteriores. Cuando el proceso es fijo salvo una excepción, pagas por una decisión que se toma miles de veces y siempre sale igual.

    ¿Cuánto cuesta realmente un proyecto de IA?

    No se paga por licencia, se paga por uso: la cuenta correcta es coste por consulta multiplicado por consultas al mes, calculada con el escenario de que la herramienta guste. Un piloto de diez personas y una implantación de dos mil se separan en dos órdenes de magnitud, no en dos veces. Súmale lo que casi nunca se presupuesta: quien revisa, el mantenimiento de la base de conocimiento y el dueño del sistema.

    ¿Por qué un piloto que funciona no garantiza que el proyecto funcione?

    Porque el piloto se hace con casos elegidos, gente motivada y alguien vigilando de cerca. En producción aparecen los casos raros, los usos que nadie previó, los límites de las APIs y la supervisión semanal. Lo que no escala no es la infraestructura, que el proveedor absorbe sin inmutarse: es la parte humana de revisar, mantener y decidir.

    ¿Qué hago si no puedo medir si el sistema lo hace bien?

    No lo pones en producción todavía. Sin una señal que diga si una ejecución fue correcta no vas a enterarte de que el sistema empeora, y va a empeorar en cuanto cambie el modelo, cambien los casos o alguien toque un prompt. Antes de subirlo necesitas dos cosas: una comprobación automática del resultado y la traza de qué decidió el sistema con qué información.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Por qué la IA se inventa cosas — y por qué no es un fallo

    Por qué la IA se inventa cosas — y por qué no es un fallo

    Le pides las tres sentencias más relevantes sobre un asunto. Te devuelve tres: tribunal, número, año, en el formato exacto en que se citan estas cosas.

    Dos existen.

    La tercera no. Y es indistinguible de las otras dos.

    No está peor escrita. No lleva una nota al pie que diga "esta me la he inventado". No hay cambio de tono, ni duda, ni titubeo. Tiene la misma pinta de ser verdad que las otras dos.

    Y aquí está lo que casi nadie cuenta cuando explica por qué la IA se inventa cosas: no falló nada. El sistema hizo exactamente lo mismo que hace cuando acierta.

    Esto no es un ejercicio teórico. El 22 de junio de 2023, el juez P. Kevin Castel impuso una sanción de 5.000 dólares —solidariamente a dos abogados y a su despacho— en el caso Mata v. Avianca, nº 1:22-cv-01461 del Distrito Sur de Nueva York (678 F. Supp. 3d 443). Habían presentado un escrito con seis sentencias inventadas de principio a fin, con citas internas a resoluciones que tampoco existen.

    Lo mejor viene ahora: uno de ellos le preguntó a ChatGPT si esos casos eran reales. Respondió que sí, y añadió que podían encontrarse en Westlaw, LexisNexis y el Federal Reporter.

    Y aquí está el detalle que casi nadie cuenta: el juez no sancionó por el error. Escribió que usar una herramienta de IA no tiene "nada de intrínsecamente impropio". Sancionó porque, después de que la parte contraria y dos órdenes del tribunal cuestionaran la existencia de esas sentencias, siguieron defendiéndolas.

    Nadie hackeó nada. El modelo no se rompió. Solo hizo su trabajo.


    ¿Por qué la IA se inventa cosas?

    Porque un modelo de lenguaje no busca la respuesta correcta: genera la continuación más probable, pieza a pieza, sobre una distribución de probabilidad aprendida en el entrenamiento. Cuando lo plausible coincide con lo cierto, decimos que acierta. Cuando no coincide, decimos que alucina. Es el mismo mecanismo, el mismo nivel de seguridad en el tono y el mismo aspecto en la pantalla.

    Una alucinación de la IA es exactamente eso: una salida plausible y falsa —una cita, una fecha, un identificador, un método de librería— generada con el mismo procedimiento y con la misma confianza aparente que una salida correcta.

    Lo importante es lo que no hay: en ningún punto del proceso existe un paso que pregunte "¿esto es verdad?".

    No es que se salte la comprobación. Es que la comprobación no está en el diseño. Nadie la quitó porque nunca estuvo.

    Si lo tienes claro en términos de predicción — la misma idea que hay detrás de cualquier algoritmo de machine learning — deja de ser sorprendente. Un sistema entrenado para que la salida sea verosímil produce salidas verosímiles. Ni más ni menos.

            el modelo optimiza UNA cosa:
         que la continuación sea plausible
                        │
            ┌───────────┴─────────────┐
       coincide con              no coincide
        la verdad                con la verdad
            │                         │
        "acierta"                 "alucina"
            └────── el mismo ─────────┘
                   mecanismo
                        │
            y en ningún punto de este
            recorrido hay un paso que
            pregunte: ¿esto es verdad?
    

    Dos nombres distintos para el mismo comportamiento. La diferencia no la pone el modelo: la pone el mundo, al coincidir o no con lo que salió.


    Qué es una alucinación de la IA: el retrato robot que no se parece a nadie

    La analogía que mejor me funciona cuando lo explico en una reunión: un dibujante de retratos robot buenísimo que nunca ha visto al sospechoso.

    Tiene una técnica excelente. Conoce las proporciones, sabe qué rasgos aparecen juntos. Le das una descripción vaga y te devuelve un retrato limpio, coherente, con una nariz que encaja con esos pómulos.

    El retrato está bien hecho. Es convincente. Y puede no parecerse a nadie.

    Eso es una alucinación. No un borrón, no un garabato: un dibujo correcto de una persona que no existe.


    Lo contraintuitivo: alucina más cuando la pregunta tiene forma de respuesta

    Aquí es donde casi todo el mundo tiene el modelo mental invertido.

    La intuición dice: alucina cuando no sabe. Falso. O al menos, insuficiente.

    Alucina más cuando la pregunta parece tener una respuesta con una forma muy clara. Una referencia bibliográfica tiene una forma reconocible. Un artículo de una ley tiene una forma. Una fecha tiene una forma. Un número de sentencia tiene una forma.

    Y lo plausible es exactamente lo que el modelo optimiza. Dale un hueco con forma nítida y lo rellenará con algo que tenga esa forma.

    Corolario práctico y algo perverso: preguntar por una normativa que no existe es la manera más fiable de provocar una alucinación. No porque el modelo sea tonto, sino porque la pregunta le da la plantilla y él es muy bueno rellenando plantillas.

    Hay datos que lo respaldan. En Why Language Models Hallucinate (Kalai, Nachum, Vempala y Zhang, 4 de septiembre de 2025) —tres de los cuatro autores firman por OpenAI; Vempala, por Georgia Tech— los autores le preguntaron tres veces a DeepSeek-V3 por el cumpleaños de uno de ellos, indicándole explícitamente que respondiera solo si lo sabía. Obtuvieron tres fechas: "03-07", "15-06" y "01-01". Ninguna correcta.

    Con el título de su tesis doctoral, tres modelos distintos devolvieron tres títulos distintos. Ninguno acertó ni el título ni el año. Y el detalle que más dice: los tres inventados sonaban mejor que el de verdad.

    Y por si crees que esto solo pasa con datos oscuros: al preguntar cuántas D hay en "DEEPSEEK", los modelos del estudio respondieron 2, 3, y en algunos casos 6 y 7. La respuesta es 1. No es un problema de que le falte información. Está delante.


    No es mentir, y no es un disparate

    Dos precisiones que cambian la conversación con cualquier stakeholder.

    No es mentir. Mentir exige dos cosas: saber la verdad y decir otra cosa a propósito. Aquí no hay ninguna de las dos. No hay intención, y no hay una representación interna de "la verdad" separada de la salida que se pueda contradecir.

    Y las alucinaciones nunca son disparates. Esto es lo que las hace peligrosas. Si el modelo te dijera que el artículo aplicable es el 4.912 de una ley con 90 artículos, lo cazarías al instante.

    Lo que hace es devolverte el artículo 27.3. Verosímil. Bien formateado. En medio de tres párrafos que sí son correctos.

    Ese es el riesgo real: no la barbaridad evidente, sino el dato razonable que sobrevive a la revisión rápida y acaba en producción, en un informe o delante de un cliente. Y se agrava con el tiempo, porque cuando la herramienta lleva doscientos aciertos seguidos, revisar se convierte en echar un vistazo.


    Excelente cuando basta lo plausible. Peligroso cuando tiene que ser exacto

    Esta es la línea que de verdad importa, y la que deberías tener pegada al monitor antes de decidir dónde metes un LLM.

    Lo que le pides ¿Basta con que sea plausible? Veredicto
    Redactar, reformular, dar forma a un borrador Sí — lo plausible es lo bueno Úsalo sin miedo
    Resumir un documento con datos dentro La prosa sí; las cifras y los nombres, no Comprueba cada dato contra el original
    Traducir, ordenar ideas, dar nombre a cosas Sí, con repaso Úsalo
    Generar código que luego compila y se testea Sí — tienes verificador Úsalo, el compilador es tu red
    Una fecha, una cifra, un artículo de una ley No Verificador obligatorio
    Una referencia, un ID, una versión de librería No Verificador obligatorio

    Fíjate en la fila del código, porque es la que explica por qué los modelos funcionan tan bien escribiendo código y tan mal citando fuentes. En código tienes un verificador que se ejecuta: compilador, tipos, tests, linter. La alucinación se cae sola en dos segundos.

    En una cita bibliográfica no hay compilador. Nadie la ejecuta. Solo alguien leyéndola y asintiendo.

    Si tu caso de uso no tiene verificador, tú eres el verificador. Y tú te cansas.


    ¿Se arregla? El paper que medio internet cita al revés

    Existe la versión pesimista: "es intrínseco, no esperes que se arregle". Y existe el paper de Kalai y compañía, que se cita constantemente para apoyar esa frase, diciendo lo contrario.

    Lo que sostienen es esto: las alucinaciones no son un misterio. Empiezan como errores de clasificación binaria bajo presión estadística — si en los datos de entrenamiento un hecho aparece una sola vez, el modelo no tiene con qué distinguirlo de una invención. Su ejemplo: si el 20% de las fechas de nacimiento aparecen exactamente una vez en el preentrenamiento, cabe esperar que el modelo base alucine en al menos el 20% de esas fechas.

    Y luego viene la parte incómoda. Persisten, dicen, por cómo se puntúa a los modelos. Los benchmarks que dominan los leaderboards corrigen en binario: acierto o fallo. Un "no lo sé" puntúa igual que un fallo — cero. Revisaron las diez evaluaciones que dominan esos leaderboards —GPQA, MMLU-Pro, IFEval, Omni-MATH, BBH, MATH, MuSR, SWE-bench, HLE y WildBench— y en nueve de las diez reconocer incertidumbre no da ningún crédito. La única que da algo es WildBench, y con un matiz cruel: su rúbrica puede puntuar más bajo un "no lo sé" que una respuesta mediocre con datos inventados.

    Con esa regla, adivinar siempre es la estrategia óptima. Estamos entrenando buenos examinandos, no sistemas fiables.

    Su propuesta es tan poco glamurosa que por eso nadie la tuitea: cambiar la puntuación de los benchmarks que ya existen, declarando en el enunciado el umbral de confianza — responde solo si tienes más de t de confianza, el fallo resta t/(1−t) puntos, el acierto suma 1 y el "no lo sé" suma 0. Con t = 0.9, cada fallo cuesta nueve.

    Así que sí: la parte del problema que viene de los incentivos es corregible, y eso es una buena noticia.

    Lo que no cambia es el diseño de fondo. Puedes premiar la abstención y conseguir que el modelo diga "no lo sé" muchísimo más a menudo. No conviertes eso en un paso de comprobación de hechos que antes no existía. Mientras la salida se genere por probabilidad, tu arquitectura tiene que contemplar que a veces será plausible y falsa.

    No es una razón para no usarlo. Es una razón para diseñar con eso dentro.


    Cómo evitar alucinaciones en tu código: 5 decisiones para mañana

    Aquí es donde este post se separa de los cincuenta artículos que explican qué son las alucinaciones y terminan con un "revisa siempre las respuestas". Gracias, muy útil.

    Cinco decisiones concretas. Y antes, lo que caza cada una — porque ninguna las caza todas:

    Defensa Qué caza Qué NO caza
    Schema de salida (Zod) Respuestas con la forma equivocada Un ID inventado con la forma correcta
    Consulta a la fuente SKUs, IDs y referencias que no existen Datos que existen pero no aplican
    Cita literal verificada Atribuir algo real a una fuente que no lo dice Una fuente que dice algo falso
    Rama "no lo sé" en el schema El relleno por campo obligatorio La invención cuando el modelo "cree" saber
    Test de abstención Que el sistema invente en preguntas sin respuesta Errores en preguntas que sí tienen respuesta

    1. Verificar en lugar de confiar

    Cada dato factual que salga del modelo y entre en tu sistema pasa por tres filtros, en este orden: schema, tipos, fuente.

    El schema te da forma. Los tipos te dan garantías en compilación. Y la fuente te da la única cosa que el modelo no puede darte: verdad.

    import { z } from 'zod';
    
    // El schema valida la forma. NO valida que el ID exista.
    const Producto = z.object({
      sku: z.string().regex(/^[A-Z]{3}-\d{6}$/),
      precio: z.number().positive(),
    });
    
    const extraido = Producto.parse(salidaDelModelo); // ✅ forma correcta
    const real = await db.productos.findBySku(extraido.sku); // ✅ existencia
    if (!real) throw new SkuInventadoError(extraido.sku); // error tuyo, no de Zod
    

    Un SKU inventado pasa el regex sin problema. Tiene exactamente la forma de un SKU — recuerda: forma clara, invención fiable. La única defensa es la consulta.

    2. Grounding: dale las fuentes delante y exígele la cita

    Si el modelo tiene el texto real en la ventana de contexto, no necesita inventar. Eso es RAG y por qué gana a fine-tuning para problemas de conocimiento — y si quieres verlo montado con código, tienes la implementación completa aquí.

    Pero pedir la cita no basta. Hay que comprobarla:

    // Sin normalizar, un espacio doble o una tilde tumban la comprobación.
    const normalizar = (s: string) =>
      s.normalize('NFD').replace(/[\u0300-\u036f]/g, '')
        .replace(/\s+/g, ' ')
        .trim()
        .toLowerCase();
    
    const cita = normalizar(respuesta.citaLiteral);
    
    // Ojo: includes('') es true. Una cita vacía "aparece" en cualquier documento.
    const citaVerificada =
      cita.length >= 30 &&
      fuentes.some(f =>
        f.id === respuesta.fuenteId && normalizar(f.texto).includes(cita)
      );
    

    Determinista, barato, sin llamadas extra. Si la cita literal no aparece en el documento que dice citar, la respuesta se descarta. Con esto cazas la clase de fallo más caro que existe: la respuesta correcta atribuida a una fuente que no dice eso.

    3. Déjale una salida: "no lo sé" tiene que ser una opción legal

    Este es el error más repetido en las integraciones que reviso: un schema con todos los campos obligatorios y ninguna rama para la ignorancia.

    Cada campo obligatorio sin salida es una invitación a rellenar. Si tu tipo dice que articulo: string es obligatorio, has convertido "no lo sé" en una respuesta imposible de expresar.

    const Respuesta = z.discriminatedUnion('estado', [
      z.object({
        estado: z.literal('encontrado'),
        articulo: z.string(),
        citaLiteral: z.string().min(30), // una cita de cinco caracteres "aparece" en casi cualquier documento
        fuenteId: z.string(),
      }),
      z.object({
        estado: z.literal('no_esta_en_las_fuentes'),
        queFaltaria: z.string(),
      }),
    ]);
    

    Y dilo también en el prompt, explícito: si la información no está en los documentos proporcionados, responde con estado no_esta_en_las_fuentes. No completes con conocimiento propio.

    Dos frases. Baja las invenciones de forma muy visible. Es la misma lógica de los umbrales de confianza del paper, aplicada a tu endpoint.

    4. Dónde no lo metes sin verificador

    Ninguna de estas cosas entra a un sistema por generación directa: identificadores, precios, cantidades, fechas límite, versiones de dependencias, nombres de métodos de una librería, artículos de normativa, referencias.

    Lo de los nombres de métodos merece un párrafo. Cuando le pides código con una librería poco común, el modelo te devuelve el método que debería existir según todas las APIs parecidas que ha visto. Bien nombrado, con la firma coherente, perfectamente plausible. Y no existe.

    Y hay una variante peor con los nombres de paquete: el compilador no te salva de un npm install de una dependencia que el modelo se ha inventado y que alguien ya ha registrado con ese nombre exacto, esperando precisamente eso.

    Da igual que bajes la temperatura a 0. Eso te quita variabilidad, no te da verdad: te devuelve la misma respuesta plausible casi siempre. Si era falsa, ahora es falsa de forma reproducible. Y ni el "casi siempre" está garantizado: en una API la salida a temperatura 0 todavía puede cambiar según cómo se agrupen las peticiones concurrentes en el servidor.

    5. Que los tests no comparen la salida literal

    Un test que hace expect(salida).toBe("...") sobre una respuesta generada está roto de nacimiento. Cambias de modelo o de versión y se cae sin que nada haya empeorado.

    Testea propiedades, no cadenas:

    • La salida valida contra el schema, siempre.
    • Toda cita literal aparece en la fuente que dice citar.
    • Ningún fuenteId sale del conjunto de fuentes inyectadas.
    • Y el que más información da: un conjunto de preguntas cuya respuesta no está en el corpus, donde lo que se comprueba es que el sistema se abstiene. Si tu tasa de abstención en ese conjunto es baja, tu sistema está inventando y todavía no lo sabes.

    Esa cuarta propiedad es el equivalente en tu repo de lo que propone el paper para los benchmarks: dejar de premiar el acierto por adivinar.

    Decidir esto antes de escribir código —qué salida es aceptable y cómo se comprueba— en lugar de parchearlo cuando ya ha explotado, es exactamente el trabajo que describo en Spec-Driven Development.

    Y en el curso Construye con IA montamos estos verificadores dentro del flujo. Es la diferencia entre un prototipo que impresiona en la demo y algo que puedes dejar corriendo.


    La única conclusión que importa

    Deja de preguntarte si el modelo alucina. Alucina, porque es la misma operación con la que acierta.

    Y no es que sea inevitable —el propio paper describe un sistema que puede abstenerse—. Es que tú no puedes construir asumiendo que ya está resuelto.

    La pregunta correcta es otra: ¿en qué punto de mi sistema se detecta un dato falso, y qué pasa si ese punto no existe?

    Si la respuesta es "lo detecta la persona que lo lea", no tienes un sistema. Tienes un borrador con muy buena presentación.

    Elige hoy el dato factual más crítico que salga de un modelo en tu código y ponle un verificador determinista. Uno. Media hora de trabajo. Vas a dormir mejor.

    Y si te has quedado con ganas de ordenar el resto del terreno — grounding, RAG, salida estructurada, evaluación y el resto de los 120 conceptos colocados por zonas, con sus conexiones dibujadas — tengo un mapa de la IA en una hoja para imprimir, gratis aquí. Funciona muy bien para pasársela a quien aprueba estos presupuestos.


    Preguntas frecuentes

    ¿Por qué la IA se inventa cosas?

    Porque un modelo de lenguaje genera la continuación más probable de un texto, token a token, sobre una distribución de probabilidad aprendida en el entrenamiento. Su objetivo es que la salida resulte plausible, no que sea verdadera. Cuando lo plausible coincide con lo cierto, acierta; cuando no coincide, alucina. En ningún momento del proceso hay un paso que verifique si lo generado es verdad: esa comprobación no forma parte del diseño, así que hay que añadirla fuera del modelo.

    ¿Qué son las alucinaciones de la IA exactamente?

    Son salidas plausibles y falsas: una referencia con el formato exacto de una referencia real, una cifra verosímil, una cita bien construida, un método de librería que podría existir. Nunca son disparates evidentes, y por eso son peligrosas. El riesgo no es que el modelo diga algo absurdo, que cualquiera detectaría, sino que introduzca un dato razonable en medio de varios párrafos correctos y ese dato sobreviva a la revisión rápida hasta llegar a producción.

    ¿La IA miente cuando alucina?

    No. Mentir exige saber la verdad y decir otra cosa de forma deliberada, y en un modelo de lenguaje no se da ninguna de las dos condiciones: no hay intención, y no existe una representación interna de la verdad separada de la salida que se pueda contradecir. Por eso tampoco sirve enfadarse con el modelo ni pedirle que "no invente". Lo que sirve es cambiar el diseño alrededor: darle las fuentes, exigirle cita y verificarla con código.

    ¿Cuándo alucina más un modelo de lenguaje?

    Contra lo que parece, no solo cuando no sabe algo. Alucina más cuando la pregunta parece tener una respuesta con una forma muy clara y reconocible: una fecha, un artículo de una ley, un número de sentencia, una referencia bibliográfica. Como el modelo optimiza plausibilidad, un hueco con forma nítida se rellena con algo que tenga esa forma. Preguntar por una normativa que no existe es una de las maneras más fiables de provocar una invención.

    ¿Se pueden eliminar las alucinaciones del todo?

    Se reducen mucho y no se eliminan. Funcionan tres palancas: grounding (darle las fuentes en el contexto), exigir cita literal y verificarla contra el documento, y permitir explícitamente "no lo sé" en el prompt y en el schema de salida. El paper Why Language Models Hallucinate (2025) añade una cuarta a nivel de industria: cambiar la puntuación de los benchmarks, que hoy casi todos dan cero tanto al fallo como al "no lo sé" y por tanto premian adivinar.

    ¿Bajar la temperatura a 0 evita las alucinaciones?

    No. La temperatura controla cuánta variabilidad hay al muestrear el siguiente token, no si el contenido es cierto. Con temperatura 0 el modelo elige en cada paso el token más probable, así que tiendes a obtener siempre la misma respuesta —aunque ni eso está garantizado en una API, donde el resultado depende de cómo se agrupen las peticiones concurrentes—. Si esa respuesta es falsa, ahora es falsa de forma consistente, que engaña más porque parece estabilidad.

    ¿Alucinan menos los modelos de razonamiento?

    Menos en lo que se puede calcular: si la respuesta se deduce paso a paso, más cómputo ayuda. Pero razonar no añade un paso de comprobación contra el mundo, así que en datos que solo se pueden saber —una fecha, una referencia, un identificador— el problema es idéntico. Why Language Models Hallucinate lo atribuye a los incentivos de evaluación, no a la capacidad: mientras un "no lo sé" puntúe igual que un fallo, adivinar sigue siendo la estrategia óptima para cualquier modelo, razone o no.

    ¿Cómo pruebo que mi integración con un LLM no inventa datos?

    No compares la salida literal con una cadena esperada: se rompe en cada cambio de modelo sin que nada haya empeorado. Testea propiedades. Que la salida valide contra el schema, que toda cita literal aparezca en la fuente que dice citar, que ningún identificador de fuente esté fuera del conjunto inyectado, y sobre todo mantén un conjunto de preguntas cuya respuesta no exista en tu corpus, midiendo que el sistema se abstiene en lugar de rellenar.


    Si quieres ver estos verificadores funcionando dentro de proyectos reales, con la arquitectura y el código completos, es parte de lo que trabajamos en Dominicode Labs. Problemas de producción, decisiones que puedes aplicar esta semana.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Qué es la inteligencia artificial, de verdad: no piensa, predice

    Qué es la inteligencia artificial, de verdad: no piensa, predice

    Hay una pregunta que casi nadie hace en voz alta delante de sus compañeros.

    "Oye, pero qué es la inteligencia artificial en realidad. ¿La cosa piensa o no piensa?"

    No la definición del folleto. El mecanismo. Qué hay al otro lado del cable.

    Es incómoda porque lleva otra dentro: si llevas año y medio escribiendo prompts a diario, ¿cómo es que todavía no lo sabes?

    Y no es una duda académica. Es la razón exacta por la que te sorprendes cuando el modelo inventa un método que no existe, cuando falla sumando cuatro cifras o cuando "olvida" lo que le dijiste cuarenta mensajes atrás.

    La tesis cabe en cuatro palabras: la IA no piensa, predice.

    En una frase: la inteligencia artificial es el campo de la informática que construye sistemas capaces de resolver tareas que asociamos a la inteligencia humana. En su forma dominante hoy —los modelos de lenguaje— el mecanismo es una función con miles de millones de parámetros que recibe una secuencia de tokens y estima la probabilidad del siguiente, repitiendo ese paso hasta terminar la respuesta. No comprende ni razona en el sentido humano: estima continuaciones probables. Lo que sigue es por qué esa diferencia cambia cómo diseñas tu software.


    La definición de inteligencia artificial que no sirve para nada

    La encontrarás en cualquier buscador con alguna variante de esto: la capacidad de las máquinas para realizar tareas que requieren inteligencia humana.

    No es falsa. Es inútil. Define una cosa comparándola con otra que tampoco sabemos definir, y no te permite tomar ni una decisión de ingeniería.

    El pecado original está en el acta de nacimiento del campo. El término lo acuñó John McCarthy en la propuesta del 31 de agosto de 1955 para el Dartmouth Summer Research Project, firmada también por Marvin Minsky, Nathaniel Rochester y Claude Shannon. La conjetura de partida era que cualquier rasgo de la inteligencia puede describirse, en principio, con tanta precisión que se pueda construir una máquina que lo simule.

    Fíjate en el verbo. Simular. Ni ser, ni comprender.

    Lo que en 1955 era una hipótesis de trabajo, en 2026 es un departamento de marketing. En algún punto alguien borró "simular" y se quedó con "inteligencia".


    Qué es la inteligencia artificial de verdad: predicción estadística

    Quítale el nombre bonito. Debajo de ChatGPT, Claude o Copilot hay una función: enorme, con miles de millones de parámetros ajustados durante el entrenamiento, pero una función.

    Recibe una secuencia de tokens y devuelve una distribución de probabilidad sobre el siguiente token. Eso es todo lo que hace en una pasada.

    // Una pasada del modelo, simplificada al hueso
    type Token = number; // id dentro del vocabulario
    type LLM = (contexto: Token[]) => Map<Token, number>; // probabilidad de ser el siguiente
    

    No devuelve "la respuesta". Devuelve, para cada token de su vocabulario, la probabilidad de que sea el siguiente. Un algoritmo de muestreo elige uno, lo añade a la secuencia y la función se ejecuta otra vez. Y otra. Hasta que sale un token de parada.

    Lo que lees en tu editor es ese bucle repetido cientos de veces. En ningún momento el sistema decide qué quiere decir y luego lo redacta. Redactar es lo único que hace.

    Y un token no es una palabra: es un fragmento frecuente de caracteres. La regla gruesa de los conceptos básicos de la API de OpenAI son unos 4 caracteres o 0,75 palabras por token en inglés, y varía según modelo e idioma.

    El detalle parece trivial y no lo es: el número 4.096 no entra en el modelo como el número 4.096, entra partido en trozos. Y aunque entrara limpio, tampoco hay un algoritmo de suma debajo: solo continuación probable.

    La arquitectura que lo hizo posible es el Transformer, de Attention Is All You Need (2017); las piezas de debajo las desglosé en algoritmos de machine learning que todo developer debería entender.

    Piénsalo así: es el autocompletado de tu móvil con un doctorado. La diferencia con el T9 es de escala y arquitectura, no de propósito: los dos estiman qué viene después.


    Diferencia entre inteligencia artificial, machine learning y LLM

    La diferencia es de anidamiento: la inteligencia artificial es el campo entero, el machine learning es un método dentro de ese campo y un LLM es un tipo concreto de modelo de machine learning. Cuando alguien dice "la IA" sin decir de cuál de estos cuatro niveles habla, casi siempre está vendiéndote algo.

    Nivel Qué es Ejemplos
    Inteligencia artificial El campo entero. Incluye técnicas sin aprendizaje: reglas, búsqueda, planificación Un motor de ajedrez clásico, un sistema experto
    Machine learning Un método dentro de la IA: en vez de programar reglas, se ajustan parámetros con datos. Cuando esos modelos son redes neuronales profundas se llama deep learning Spam, churn, recomendadores
    LLM Un tipo de modelo de deep learning: red neuronal transformer entrenada, en su fase base, para predecir el siguiente token GPT, Claude, Gemini, Llama
    Sistema agéntico No es un modelo: es el software que envuelve al LLM con herramientas, permisos y un bucle Claude Code, Cursor

    Los tres primeros niveles están anidados: cada uno contiene al siguiente. El cuarto no es un nivel del mismo tipo — es producto construido encima.

    Así que no toda la IA es machine learning, no todo el machine learning es un LLM, y el chat que abres cada mañana no es un modelo: es un producto con un modelo dentro. Buena parte de lo que te sorprende ocurre en el producto.

    Esa última fila es la que más confusión genera hoy, y le dediqué un post entero: IA generativa vs IA agéntica.

    Si esta tabla te ha ordenado algo, hay una versión mucho más grande: el mapa de la IA, con 120 conceptos colocados por zonas y las conexiones dibujadas, en una hoja para imprimir. Es gratis, y funciona especialmente bien para pasársela a la gente de producto o de negocio que te pregunta estas cosas en las reuniones.


    Por qué esta distinción te cambia decisiones reales

    Aquí es donde la teoría empieza a pagar facturas.

    Entender que el sistema estima en lugar de saber explica de golpe los cinco fallos que más tiempo te hacen perder, y cambia la decisión que tomas en cada uno.

    Lo que ves Causa real Qué hacer
    Inventa un método o una cita "No lo sé" es una continuación menos probable que una respuesta bien redactada Verificador delante: schema, tipos, consulta a la fuente
    "Olvida" lo que dijiste 40 mensajes atrás Cada petición es stateless; alguien recortó el historial que se reenvía Curar el contexto antes de cambiar de modelo
    Falla sumando cuatro cifras Los números entran partidos en tokens: predice, no calcula Darle una herramienta: intérprete, calculadora, query
    No conoce algo de esta semana Sin herramienta de búsqueda solo tiene sus parámetros y tu contexto Declarar la tool de búsqueda o inyectar el dato con RAG
    Dos ejecuciones idénticas dan salidas distintas Hay muestreo; con seed las salidas son mostly deterministic, no deterministas Testear propiedades, no igualdad literal

    Las cinco filas son el mismo hecho visto desde cinco ángulos.

    No hay ningún paso de comprobación

    Si el sistema devuelve continuaciones probables, "no lo sé" es solo otra continuación posible, y suele ser menos probable que una respuesta con pinta de correcta. En ningún momento se pregunta si lo que escribe es verdad: no es que se salte la comprobación, es que la comprobación no existe.

    En septiembre de 2025, investigadores de OpenAI y Georgia Tech publicaron Why Language Models Hallucinate, que sostiene que el problema es corregible: el entrenamiento y las evaluaciones premian adivinar por encima de reconocer incertidumbre. Mientras ese incentivo siga ahí, ningún dato factual del modelo debería entrar en tu sistema sin un verificador delante.

    Desarrollé el mecanismo completo —por qué ocurre, cómo se detecta y qué se puede hacer— en por qué la IA se inventa cosas.

    Qué es la ventana de contexto de un LLM (y por qué no es memoria)

    La ventana de contexto es el número máximo de tokens que caben en una sola petición, sumando lo que envías y lo que el modelo genera. No es memoria: es el tamaño del formulario que rellenas en cada llamada. Con la regla de 0,75 palabras por token, una ventana de 200.000 tokens equivale a unas 150.000 palabras por petición, y se vacía entera en la siguiente.

    El modelo no recuerda nada. La documentación de OpenAI lo dice con esas palabras: cada petición de generación es independiente y stateless, y para varios turnos tienes que reenviar los mensajes anteriores en cada llamada.

    Lo que percibes como "la conversación" es un array que alguien vuelve a mandar entero cada vez —tu código, o el servidor del proveedor si delegas el estado— y tiene que caber en la ventana de contexto junto con la respuesta que se genera.

    Cuando el chat "olvida" lo de hace cuarenta mensajes es porque alguien decidió recortar o resumir ese historial. Ese alguien es el producto, no el modelo.

    De ahí que curar lo que entra en la ventana rinda más que cambiar de modelo, y que escribir una especificación antes de delegar funcione tan bien: le das el contexto exacto en lugar de esperar que lo adivine. Es la metodología que documenté en el libro de Spec-Driven Development.

    Las herramientas pesan más que el modelo

    Si el modelo predice texto, todo lo que requiera verdad, cálculo o estado tiene que venir de fuera.

    Eso es RAG: recuperar documentos relevantes y meterlos en el contexto antes de generar, idea formalizada por Lewis et al. en 2020 en Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, que combina memoria paramétrica y no paramétrica. Y es también una calculadora o una query a tu base de datos.

    Ojo con la búsqueda web, el malentendido más común: es una herramienta, no una capacidad del modelo. En la API de OpenAI se declara en el array de tools y el modelo decide si la usa. Un LLM a pelo no consulta internet.

    Con eso claro, "¿qué modelo es mejor?" pierde interés frente a "¿qué contexto y qué herramientas le estoy dando?". Ese desplazamiento es, en el fondo, cómo ha cambiado el trabajo del developer con IA.

    No es una función pura, y tu CI necesita saberlo

    Como hay muestreo, la misma entrada no produce la misma salida. La temperatura no es un ajuste de creatividad: es cuánto aplanas o afilas la distribución antes de muestrear. Por encima de 1 la aplanas y entran tokens improbables; por debajo de 1 la afilas; en 0 te quedas siempre con el más probable.

    Y aunque la fijes a cero y pases un seed, no tienes determinismo garantizado. El cookbook de OpenAI sobre el parámetro seed habla de salidas mostly deterministic y avisa de que el determinismo no está garantizado. De hecho expone un system_fingerprint precisamente porque la configuración del backend cambia por debajo sin que tú lo pidas.

    Traducción para tu pipeline: no compares la salida literal de un LLM en un test. Testea propiedades —que el JSON valide contra el schema, que el código compile, que estén los campos obligatorios—. Un expect(salida).toBe("...") contra un modelo es un test rojo esperando su turno.


    Lo que la inteligencia artificial no es

    No razona como un humano. Los modelos de razonamiento se entrenan con refuerzo para generar más tokens intermedios antes de responder, y eso mejora mucho los problemas de varios pasos. Pero es el mismo mecanismo con más pasadas: más recorrido, no otra naturaleza.

    No consulta internet por defecto. Sin una herramienta de búsqueda conectada solo tiene lo que quedó en sus parámetros y lo que tú le pegas en el contexto.

    No aprende de tus conversaciones. Durante la inferencia los pesos están congelados: nada de lo que escribes modifica el modelo. Que tus datos se usen para entrenar versiones futuras es política de producto, no mecánica; en la API de OpenAI, por ejemplo, no se usan salvo opt-in explícito, y conviene revisar la política de tu plan porque cambia entre proveedores.

    No es determinista. Trátalo como un servicio externo con variabilidad, no como una función de tu código.

    No es inteligencia artificial general. Todo lo que hay hoy en producción es IA estrecha: sistemas entrenados para una distribución concreta de tareas. La AGI, un sistema con competencia general equivalente a la humana, sigue siendo un objetivo declarado de los laboratorios y no un producto que puedas llamar por API. Cuando un titular afirma que "la IA ya piensa", casi siempre está midiendo un benchmark estrecho.


    Qué hacer con esto mañana

    1. Cambia la pregunta cuando falle. De "¿el modelo sabe esto?" a "¿está esto en el contexto que le he enviado?". Imprime el payload real antes de culpar al modelo: casi siempre el problema estaba ahí.

    2. Pon un verificador entre el modelo y tu sistema. Schema, tipos, un test, una consulta a la fuente. Si la salida entra directa a producción sin filtro, no tienes una feature de IA: tienes una lotería bien presentada.

    3. Elimina los tests de igualdad literal sobre salidas de LLM. Sustitúyelos por comprobaciones de propiedades, y hazlo esta semana.

    4. Escribe lo que quieres antes de pedirlo. Un párrafo de especificación con el resultado esperado y sus límites vale más que veinte iteraciones de prompt: lo que no esté escrito lo rellenará con lo más probable.


    La frase que te llevas

    La próxima vez que alguien te pregunte si la IA piensa, tienes una respuesta mejor que sí o no.

    No piensa. Estima qué sigue. Y lo hace tan bien que a veces lo confundimos con pensar.

    Cambiar la metáfora del cerebro por la de una función de predicción no te vuelve más escéptico ni te quita potencia. Te vuelve mejor ingeniero: dejas de sorprenderte por lo que hace el sistema y empiezas a diseñar alrededor de sus límites reales.

    Si el siguiente paso es pasar de escribir prompts a construir sistemas que trabajen solos, empieza por la guía para dar el salto a los agentes de IA. Y si quieres el camino completo, de la idea al producto con especificaciones, herramientas y verificación, es lo que montamos paso a paso en el curso Construye con IA. Si prefieres hacerlo acompañado, te espero en Dominicode Labs.


    Preguntas frecuentes

    ¿Qué es la inteligencia artificial, en una sola frase?

    Es el campo que construye sistemas capaces de resolver tareas que asociamos a la inteligencia humana. En su forma dominante hoy —los modelos de lenguaje— el mecanismo es una función con miles de millones de parámetros que, dada una secuencia de tokens, estima la probabilidad del siguiente y repite ese paso hasta completar la respuesta. No hay comprensión ni intención: hay estimación estadística sobre secuencias.

    ¿La inteligencia artificial piensa o razona de verdad?

    No en el sentido en que lo hace una persona. Un modelo no forma una intención y luego la expresa: genera la continuación más probable token a token. Los llamados modelos de razonamiento producen más tokens intermedios antes de la respuesta final, lo que mejora bastante los problemas de varios pasos, pero siguen ejecutando el mismo mecanismo predictivo con más pasadas. Cambia la cantidad de proceso, no su naturaleza.

    ¿Cuál es la diferencia entre inteligencia artificial, machine learning y un LLM?

    Son capas anidadas. La inteligencia artificial es el campo completo e incluye técnicas sin aprendizaje, como los sistemas de reglas o la búsqueda. El machine learning es un método dentro de ese campo: en lugar de programar las reglas, se ajustan parámetros a partir de datos. Un LLM es un tipo concreto de modelo de machine learning, una red neuronal transformer entrenada para predecir el siguiente token. Y el chat que usas no es ninguna de las tres: es un producto que envuelve un LLM.

    ¿La IA aprende de mis conversaciones?

    El modelo no se modifica mientras hablas con él: durante la inferencia sus pesos están congelados y nada de lo que escribes cambia sus parámetros. Cuestión distinta es si el proveedor guarda tus datos y los usa para entrenar versiones futuras, y eso depende del plan y de la empresa. En la API de OpenAI, por ejemplo, los datos no se usan para entrenar salvo opt-in explícito.

    ¿Por qué un LLM falla en operaciones matemáticas sencillas?

    Porque no calcula: predice texto. Los números se dividen en tokens antes de entrar al modelo, así que una cifra larga no llega como cantidad sino como una serie de fragmentos. Lo que estima es cómo suele continuar un cálculo escrito, no cuál es su resultado. Por eso la solución correcta es darle una herramienta —un intérprete, una calculadora, una query— en lugar de confiar en su aritmética.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Opus 5 vs GPT-5.6 vs Kimi K3: qué modelo para qué trabajo

    Opus 5 vs GPT-5.6 vs Kimi K3: qué modelo para qué trabajo

    Un lunes cambié el modelo de un agente que llevaba semanas funcionando bien. El nuevo costaba la mitad por millón de tokens de salida: quince dólares contra veinticinco. Una línea de configuración, cinco segundos, dinero ahorrado.

    El viernes miré la factura. Había subido.

    No era un bug del proveedor. Era que la tarifa por millón de tokens no te dice cuántos tokens vas a gastar, y ese segundo número decide lo que pagas.

    De eso va esta comparativa de Opus 5 vs GPT-5.6 vs Kimi K3: de trabajo real, no de specs. De cada modelo por separado ya hay un análisis en este blog. Aquí hay una sola pregunta, repetida cuatro veces: para este trabajo concreto, ¿cuál de los tres y por qué?


    Opus 5 vs GPT-5.6 vs Kimi K3: los tres de un vistazo

    Claude Opus 5 GPT-5.6 Sol Kimi K3
    Entrada / salida por millón $5 / $25 $5 / $30 $3 / $15
    Contexto 1M tokens 1,05M tokens 1M tokens
    Intelligence Index sin medición pública 58,9 57
    Pesos cerrados cerrados abiertos
    Rasgo diferencial thinking adaptativo por defecto contexto de 1,05M y tres tiers de precio pesos abiertos: cualquiera puede servirlo

    Esa tabla no decide nada. La pongo porque es lo que vas a encontrar en los otros veinte posts que has leído esta semana, y porque quiero enseñarte por qué te lleva a la decisión equivocada.

    Un apunte que me niego a esconder: Opus 5 no tiene medición pública en el índice independiente de Artificial Analysis. Salió el 24 de julio de 2026, después de la última ronda de medición.

    Las referencias que sí existen: Claude Fable 5 puntúa 59,9 costando unos $50 por millón de salida, y Claude Opus 4.8 —la generación anterior de la misma familia— puntúa 56.

    Opus 5 está por encima de ese 56, probablemente bastante. Pero "probablemente" no es un número y no voy a inventármelo.


    El truco del precio: por qué el orden se invierte

    Kimi K3 parece el barato. Quince dólares por millón de salida contra los veinticinco de Opus 5 y los treinta de Sol. Mitad de precio que el más caro.

    El problema es que un modelo no te cobra por millón de tokens: te cobra por los tokens que emite. Y cuánto emite para resolver la misma tarea es una propiedad del modelo, igual que su precio.

    En el análisis de Kimi K3 salió el dato medido: durante la evaluación independiente, Kimi K3 consumió 130 millones de tokens de salida frente a una media de 63 millones. Eso es 2,06 veces la media. Su coste efectivo por millón de tokens útiles no es $15, es $15 × 2,06 ≈ $31.

    Míralo sobre una tarea concreta. Supón un trabajo que requiere 100.000 tokens de salida útiles:

    Modelo Tokens que emite Precio salida Coste
    Claude Opus 5 100.000 $25 / M $2,50
    GPT-5.6 Sol 100.000 $30 / M $3,00
    Kimi K3 (a precio de lista) 100.000 $15 / M $1,50
    Kimi K3 (verbosidad medida 2,06×) 206.000 $15 / M $3,09

    El barato acaba siendo el más caro de los tres. No por poco: $3,09 contra los $2,50 de Opus 5.

    Ahora la parte incómoda. Estoy comparando una cifra medida contra dos cifras de lista, y eso no es justo. Opus 5 también gasta más de lo que sugiere su tarifa: el thinking viene adaptativo y activado por defecto, max_tokens es un tope duro que cubre razonamiento y respuesta juntos, y esos tokens de razonamiento se facturan como salida. Encima escribe respuestas más largas que la generación anterior por diseño. No existe medición pública de ese sobrecoste: cuando exista, su columna también subirá.

    La conclusión que te llevas no es "Kimi es caro". Es esta: ninguno de los tres se paga a precio de lista, y el único que tiene el multiplicador publicado es Kimi. Cualquier comparativa que ordene los tres modelos por su tarifa está ordenando por el número equivocado.


    Trabajo 1: agente de coding que corre largo

    Para un agente de coding que corre durante horas, la elección es Claude Opus 5 en effort xhigh. No por la tarifa: porque en sesiones largas la verbosidad se compone en vez de sumarse, y lo que arruina la factura son los reintentos.

    Sesiones de horas. Decenas de tool calls. Cada turno reenvía el contexto acumulado de todos los turnos anteriores.

    Aquí la verbosidad deja de ser un coste lineal y se vuelve compuesto. El output del turno 3 es input del turno 4, del 5 y del 20. Un modelo que escribe el doble no te cuesta el doble en ese turno: te infla el contexto de todos los siguientes. Pagas esa respuesta larga una vez como salida y luego otras quince como entrada.

    Kimi compensa parte con un cache hit agresivo a $0,30 por millón —un 90% de descuento—, pero el caching abarata reenviar el contexto, no lo hace más pequeño. El techo de la ventana llega igual, y llega antes.

    Arrancar en xhigh es la recomendación de Anthropic para coding y trabajo agéntico, y coincide con lo que veo trabajando: en sesiones largas lo que arruina la factura no son los tokens, son los reintentos. Una tarea que el modelo barato tiene que repetir tres veces cuesta más que una que el caro resuelve a la primera.

    Un aviso, porque migrar a Opus 5 no es cambiar el string del modelo. Si vienes de Opus 4.8, hay dos cambios que rompen código: el thinking viene activado por defecto y desactivarlo con effort xhigh o max devuelve un 400. Los dos, con el código antes y después, están en los breaking changes de Claude Opus 5. Revísalos antes de mover tráfico.

    Y si al medir descubres que buena parte de tu agente nunca necesitó un modelo frontera —pasa más de lo que la gente admite—, Claude Sonnet 5 cubre ese terreno por mucho menos dinero. Enrutar por dificultad de tarea ahorra más que elegir bien el modelo caro.


    Trabajo 2: una pasada grande sobre un repo grande

    Para trabajo input-heavy de una sola pasada, Kimi K3 es genuinamente el más barato de los tres. Es el caso donde la tabla de precios acierta: el peso está en la entrada y la verbosidad solo penaliza la salida.

    Metes 800.000 tokens de código, pides un análisis de arquitectura o una migración planificada, y recoges veinte mil tokens de informe.

    Aquí se invierte todo lo anterior. El peso está en la entrada, no en la salida, y la verbosidad solo castiga la salida.

    Con esos 800K de entrada: Opus 5 y Sol cobran $5 por millón, o sea $4,00 cada uno. Kimi cobra $3: $2,40. La salida es tan pequeña en comparación que el multiplicador de verbosidad casi no mueve la aguja.

    Ahí no hay trampa que deshacer: el número de la tabla de precios es el número que pagas.

    La ventana de contexto se sobrevende. Lo que sí importa es que Anthropic cobra la ventana completa de 1M a tarifa estándar, sin recargo por contexto largo. Y si tu repo no cabe en 1M, tu problema no es el modelo: es que necesitas trocear e indexar antes de preguntar.

    Aquí los pesos abiertos de Kimi valen algo concreto, y no es lo que la gente cree: cualquier proveedor puede servirlo, así que no dependes de un único vendor para el precio, la disponibilidad ni la política de retención. Eso presiona a la baja lo que te cobran.


    Trabajo 3: volumen alto y simple

    Clasificar diez mil tickets. Extraer entidades de un lote de documentos. Normalizar un CSV enorme a JSON.

    La respuesta correcta a "¿cuál de los tres?" es ninguno de los tres.

    Los números, sobre 10.000 documentos de 2.000 tokens de entrada y 200 de salida cada uno (20M y 2M en total):

    Modelo Entrada 20M Salida 2M Total
    GPT-5.6 Luna $20 $12 $32
    Kimi K3 (lista) $60 $30 $90
    Kimi K3 (verbosidad 2,06×) $60 $61,80 $121,80
    Claude Opus 5 $100 $50 $150
    GPT-5.6 Sol $100 $60 $160

    Luna sale cinco veces más barato que Sol en un trabajo donde la diferencia de inteligencia entre ambos es irrelevante, porque la tarea no pide razonar: pide seguir un formato. Y bajas otro 50% mandándolo por Batch API si no necesitas la respuesta en caliente. El desglose de las tres variantes está en la guía de la API de GPT-5.6.

    Una honestidad sobre mi propia tabla: ese 2,06× se midió en evaluaciones difíciles, no clasificando tickets. Si fuerzas un esquema de salida estricto, la verbosidad se desploma en cualquiera de los tres. Que es justo lo que deberías hacer, porque el error caro aquí no es el modelo: es confiar en que la salida llegue bien formada. Valídala con un esquema y falla ruidosamente cuando no encaje —es lo que enseño en el curso de Zod, y un parseo estricto en la frontera evita más incidencias que cualquier upgrade de modelo.


    Trabajo 4: orquestación y tool calling

    Aquí esperaba encontrar el argumento que le da la vuelta al precio de GPT-5.6 Sol. Me equivocaba, y prefiero contarlo que maquillarlo.

    Programmatic Tool Calling deja que el modelo escriba código que se ejecuta en un sandbox aislado y coordine varias llamadas a herramientas dentro de un mismo turno, sin ida y vuelta a la API entre cada una. Los resultados intermedios de las herramientas no entran en el contexto: solo entra el resultado final. La mecánica está en la guía de la API de GPT-5.6.

    El problema para esta comparativa es que no es exclusivo de OpenAI. Anthropic tiene la misma función, con el mismo nombre, y claude-opus-5 aparece en su tabla de modelos compatibles. No desempata nada.

    Y ahora fíjate dónde cae el ahorro, porque es donde casi todo el mundo se equivoca. Anthropic mide un 37% menos de tokens en tareas complejas de research —de 43.588 a 27.297 de media— y un 24% menos de tokens de entrada en benchmarks de búsqueda agéntica.

    De entrada. No de salida. Tiene todo el sentido: lo que se recorta son los resultados intermedios que ya no viajan al contexto. Así que quien te presente esto como un descuento sobre la tarifa de salida está moviendo el número a la columna equivocada — justo el truco que denuncié dos secciones más arriba.

    Por cierto: OpenAI no publica ningún porcentaje para su implementación. Su guía dice que el efecto depende de la tarea y de las respuestas de las herramientas, y recomienda medir contra tu propia línea base. Si ves un rango concreto atribuido a OpenAI por ahí, pídele la fuente a quien lo publique.

    Mi elección aquí es la misma que en el trabajo 1: Claude Opus 5. No porque gane el tool calling —empata—, sino porque a igualdad de función te lo llevas con la tarifa de salida más baja de los dos: $25 contra $30.


    El criterio que sí sirve

    Una sola métrica: coste por tarea resuelta.

    coste por tarea resuelta = coste medio por intento / tasa de éxito
    

    Los reintentos dominan el resultado y no aparecen en ninguna comparativa. Con números que me invento a propósito, para que veas la forma y no para que te los creas: un modelo a $31 efectivos con un 80% de acierto sale a $38,75 por tarea resuelta; otro a $25 con un 95% de acierto sale a $26,32. El que parecía el caro por tarifa de lista sale un 32% más barato por tarea resuelta. Pon tus tasas reales, que solo tú las tienes.

    Para medirlo necesitas dos cosas. La primera, una definición escrita de qué significa "resuelto": los tests pasan, el diff no toca ficheros fuera de alcance, el JSON valida contra el esquema. Escribir eso antes de medir es literalmente una spec, y es la mitad del método que desarrollo en el libro de Spec-Driven Development.

    La segunda, correr esas evals con tus prompts y tu andamiaje. Y ojo, porque es lo que más gente ignora: el harness que envuelve al modelo cambia el resultado tanto como el modelo. Si cambias las dos variables a la vez, no has medido nada.

    Es el mismo criterio que aplico en el curso Construye con IA: montar la eval antes de elegir el modelo, no después de que llegue la factura.


    Veredicto: qué modelo para qué trabajo

    Trabajas con un agente de coding a diario. Claude Opus 5 en xhigh, y enruta a Sonnet 5 todo lo que tus evals demuestren que no necesita frontera. El ahorro real está en el enrutado, no en la tarifa.

    Tu carga está dominada por herramientas encadenadas. Cualquiera de los dos cerrados, pero enciende el tool calling programático: el ahorro está en la función, no en la marca del modelo. Mídelo un mes contra tu factura anterior mirando solo la línea de tokens de entrada, que es donde cae. Si no se mueve, tu flujo no era tan tool-heavy como creías.

    Procesas repos o corpus grandes de una pasada. Kimi K3. Aquí el precio bajo de entrada es real, la verbosidad apenas te toca, y los pesos abiertos te quitan la dependencia de un único proveedor.

    Clasificas, extraes o transformas en masa. Ninguno de los tres. GPT-5.6 Luna o un modelo de gama baja, con esquema estricto y Batch API. Frente a Sol, eso es un 80% menos de factura.

    Necesitas el techo absoluto de inteligencia y el coste es secundario. Claude Fable 5, a 59,9 y unos $50 por millón de salida. Es un caso raro. Si crees que es el tuyo, mídelo antes: casi nunca lo es.

    Haz una cosa hoy. Coge las diez últimas tareas que le mandaste a tu agente, córrelas contra dos modelos con el mismo harness y anota dos columnas: coste total y cuántas salieron bien a la primera. Divide. En media hora sabrás más que leyendo comparativas durante un mes.

    Es lo que hacemos, modelo a modelo, en Dominicode Labs.


    Preguntas frecuentes sobre Opus 5, GPT-5.6 y Kimi K3

    ¿Cuál es más barato entre Opus 5, GPT-5.6 y Kimi K3?

    Depende de si miras el precio de lista o el coste real por tarea. Por tarifa gana Kimi K3: $3 de entrada y $15 de salida por millón, frente a $5/$25 de Opus 5 y $5/$30 de GPT-5.6 Sol. Pero Kimi emite 2,06 veces los tokens de la media medida, lo que sitúa su coste efectivo de salida en unos $31 por millón, por encima de los otros dos. Con una salvedad que hay que decir: 2,06× es una cifra medida y las de Opus 5 y Sol son de lista. Los tres gastan más de lo que sugiere su tarifa —Opus 5 razona por defecto y factura ese razonamiento como salida—, pero Kimi es el único con el multiplicador publicado. En trabajo dominado por la entrada —repos grandes, documentos largos— Kimi sí es genuinamente el barato, porque la verbosidad solo penaliza la salida.

    ¿Por qué Opus 5 no tiene puntuación en el Intelligence Index?

    Porque se publicó el 24 de julio de 2026, después de la última ronda de medición del índice independiente de Artificial Analysis. Los puntos de referencia disponibles son Claude Opus 4.8 con 56 y Claude Fable 5 con 59,9. Que falte la medición del modelo más nuevo no es un detalle menor: durante las primeras semanas solo tienes los benchmarks del fabricante, y esos se publican siempre en el escenario que más favorece.

    ¿Qué modelo elijo para un agente de coding que corre durante horas?

    Claude Opus 5, arrancando en effort xhigh, que es lo que recomienda Anthropic para coding y trabajo agéntico. La razón no es la tarifa: en sesiones largas el output de cada turno se convierte en input de todos los siguientes, así que la verbosidad se compone en lugar de sumarse. Y lo que arruina la factura son los reintentos: una tarea que hay que repetir tres veces con el modelo barato cuesta más que una que sale a la primera con el caro.

    ¿Qué gano realmente con Programmatic Tool Calling?

    Que el modelo escriba código en un sandbox aislado para coordinar varias llamadas a herramientas en un solo turno, en vez de ir y volver a la API entre cada una. Los resultados intermedios de las herramientas no entran en el contexto, así que el ahorro cae sobre los tokens de entrada, no sobre los de salida. Anthropic mide un 37% menos de tokens en tareas complejas de research y un 24% menos de tokens de entrada en benchmarks de búsqueda agéntica; son cifras del propio fabricante, no de un tercero, y OpenAI no publica ningún porcentaje para su implementación. Sobre todo: no es un diferenciador entre modelos, porque tanto GPT-5.6 como Claude Opus 5 lo soportan.

    ¿Cómo calculo el coste por tarea resuelta en mi proyecto?

    Divide el coste medio por intento entre tu tasa de éxito. Para eso necesitas antes una definición escrita de qué significa "resuelto" en tu caso —tests en verde, diff dentro del alcance previsto, JSON que valida contra su esquema— y correr las mismas tareas con el mismo harness para todos los modelos que compares. Si cambias de modelo y de andamiaje a la vez, no estás midiendo el modelo: estás midiendo el ruido.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Llevo 15 años programando: esto es lo que cambió con la IA

    Llevo 15 años programando: esto es lo que cambió con la IA

    Hace quince años, construir una funcionalidad significaba abrir un archivo en blanco y teclear cada línea hasta que compilaba. Cuando me atascaba, Stack Overflow. Cuando Stack Overflow fallaba, la documentación. Cuando la documentación mentía, prueba y error durante horas. Así aprendí el oficio y así trabajé la primera mitad de mi carrera.

    Esta mañana he construido un módulo completo sin teclear una sola línea de implementación a mano.

    Llevo quince años en esto y he visto pasar muchas modas. El desarrollo de software con IA no es una más. Es lo único que ha cambiado de raíz cómo hago mi trabajo. Pero no por la razón que casi todo el mundo repite en LinkedIn.

    Lo que ha cambiado no son las herramientas. Es el rol.

    Ya no me pagan por escribir código. Me pagan por decidir qué código debe existir, especificarlo bien y verificar que lo que se ha escrito es correcto. El tecleo —la parte que durante quince años fue la mayor parte del oficio— se ha vuelto la parte barata.

    Y si quieres la definición limpia, esta es la mía: el desarrollo de software con IA es la práctica de construir software delegando la escritura del código a modelos y agentes, mientras el developer se reserva las tres decisiones que siguen siendo suyas —qué construir, cómo debe encajar y si lo generado es correcto—.


    De escribir código a orquestarlo: así se programa con IA hoy

    Antes, un día productivo se medía en líneas. Hoy se mide en decisiones acertadas.

    La sesión de esta mañana fue así: abrí un documento, describí qué quería —el comportamiento, los límites, los casos que no debía tocar—, se lo pasé a un agente y me fui a por café. Cuando volví, había un diff de trescientas líneas esperándome.

    Mi trabajo empezó ahí. Leerlo entero. Cuestionar tres decisiones. Rechazar una. Aprobar el resto.

    No escribí la implementación. La orquesté.

    Si tuviera que resumir el cambio en una tabla, sería esta:

    Antes Ahora
    Unidad de medida Líneas escritas Decisiones acertadas
    Cuello de botella Teclear rápido y conocer la API Especificar con precisión
    Habilidad clave Saber escribir código Saber leer y revisar código
    Riesgo principal Bugs por descuido Deuda por código que nadie entendió
    Tu rol Autor Director y revisor

    Y ese cambio no fue de un día para otro. Fue una escalera. Primero el autocompletado —GitHub Copilot en 2021—, que adivinaba el final de la línea. Después el chat, ChatGPT y compañía, al que le pegabas un error y te devolvía una respuesta plausible. Y ahora el agente autónomo, del estilo de Claude Code o Cursor, que lee tu repo, ejecuta comandos, mira la salida y decide el siguiente paso sin ti. Si todavía andas en el primer escalón, la guía de Agentes de IA es el mejor sitio para entender qué hace distinto al último.

    Esa forma de trabajar en bucle —delegar, observar, corregir, repetir— tiene su propia disciplina, y la desarrollé entera en Loop Engineering: la evolución del desarrollo con IA. Porque diseñar bien ese bucle es hoy más determinante que elegir el modelo de moda.


    El cuello de botella del desarrollo de software con IA se movió: ahora está en especificar

    Durante años, el cuello de botella era teclear rápido y conocer la API de memoria. El que escribía más limpio y más rápido ganaba.

    Hoy el cuello de botella es otro: describir con precisión lo que quieres.

    Un agente hace lo que le pides al pie de la letra, no lo que querías decir. Todo lo que no especificas, lo inventa. Y lo inventa con una seguridad que asusta.

    Por eso el trabajo de más valor ya no es escribir la función. Es escribir la especificación de la función: el resultado esperado, los límites, los casos borde, lo que queda explícitamente fuera del alcance.

    Esto no es teoría. Es la metodología que uso a diario y la que documenté entera en el libro de Spec-Driven Development: especificar primero, delegar después. Si quieres el porqué antes que el cómo, lo cuento en Spec-Driven Development: la forma de evitar el caos con la IA.

    El developer que sabe redactar una buena especificación multiplica su trabajo. El que sigue tratando al agente como un buscador —"hazme esto"— se pasa el día corrigiendo basura.


    Lo que NO ha cambiado (y por qué el senior vale más que nunca)

    Aquí está la parte incómoda para los que venden que la IA ya programa sola.

    Nada de esto elimina al developer con criterio. Lo hace imprescindible.

    Un agente escribe trescientas líneas en dos minutos. Pero no sabe si esas trescientas líneas encajan en tu arquitectura. No sabe si van a ser un infierno de mantener dentro de un año. No sabe si acaba de duplicar una lógica que ya existía en otro módulo. El agente optimiza para que el criterio de parada se cumpla, no para que el sistema siga vivo dentro de dos años.

    Ese juicio sigue siendo tuyo.

    Y no es una manía mía de señor mayor. El informe DORA 2025 de Google Cloud, hecho con cerca de 5.000 profesionales de todo el mundo, encontró que el 90% ya usa IA en su trabajo y más del 80% dice que le ha subido la productividad. Pero un 30% reconoce tener poca o ninguna confianza en el código que esa IA genera.

    Ahí tienes la foto exacta del oficio hoy: casi todos delegamos, casi nadie firma a ciegas. Esa distancia entre "lo uso todos los días" y "no me fío" es, literalmente, la descripción de tu nuevo puesto de trabajo.

    Y ojo con confundir velocidad con progreso. Generar código rápido no es lo mismo que avanzar rápido. Un diff de trescientas líneas que nadie entiende no es velocidad, es deuda con intereses. Por eso "más rápido" y "mejor" no son la misma métrica, y desarrollé cómo distinguirlas en Cómo medir la productividad de un equipo con IA.

    Hay tres cosas que la IA no ha tocado, y son exactamente las que definen a un buen ingeniero:

    • El criterio. Saber qué construir y, sobre todo, qué no construir.
    • La arquitectura. Decidir cómo encajan las piezas para que el sistema aguante el paso del tiempo.
    • Saber leer código. Porque revisar es la nueva forma de escribir. Un diff que no entiendes es un diff que no puedes aprobar.

    Lo diré claro: hoy saber leer código importa más que saber escribirlo. Escribir lo hace la máquina. Leerlo, entenderlo y detectar dónde se ha equivocado sigue siendo humano.


    Al que no se adapta no lo sustituye la IA

    El miedo que oigo en cada charla es siempre el mismo: "¿La IA me va a quitar el trabajo?".

    No. Pero un developer que orquesta, especifica y revisa bien va a hacer el trabajo de tres que siguen tecleando línea a línea. Y las empresas lo van a notar en la nómina antes de lo que crees.

    No te sustituye la IA. Te sustituye el compañero que sabe usarla.

    La brecha ya no está entre el que programa y el que no. Está entre el que ha movido su trabajo hacia arriba en la cadena —del tecleo a la decisión— y el que sigue midiendo su día en líneas escritas a mano, orgulloso de un esfuerzo que la máquina hace gratis.

    Esa segunda persona no está en peligro por la IA. Está en peligro por negarse a cambiar de rol.


    Qué puedes hacer hoy

    Si llevas años programando y sientes que el suelo se mueve, tienes razón. Se mueve. Pero a tu favor, si haces el cambio a tiempo.

    Deja de medir tu jornada en líneas escritas. Empieza a medirla en decisiones acertadas, especificaciones claras y diffs bien revisados.

    Coge mañana una tarea aburrida y acotada —migrar un módulo, añadir tests a un servicio— y en vez de teclearla, especifícala y delégala. Luego siéntate a revisar el resultado como revisarías el pull request de un junior brillante pero despistado. Ahí, en esa revisión, es donde vas a hacer tu trabajo de senior a partir de ahora.

    Ese es el músculo nuevo. Y como todo músculo, se entrena.

    Si quieres ver este flujo completo montado de principio a fin —de la idea a un producto funcionando, especificando y delegando de verdad— es exactamente lo que construimos en el curso Construye con IA. Y si prefieres hacer el cambio acompañado, con proyectos reales y gente que ya está en esto, te espero en Dominicode Labs.

    El código dejó de ser el trabajo. El criterio para dirigirlo es el trabajo. Muévete hacia ahí.


    Preguntas frecuentes

    ¿La IA va a reemplazar a los programadores?

    No a los programadores con criterio. La IA reemplaza el tecleo, que era la parte mecánica del oficio, no el juicio. Un agente escribe código muy rápido, pero no decide qué construir, no diseña una arquitectura que aguante el tiempo ni sabe si su propia solución es mantenible. Lo que sí ocurre es que un developer que sabe orquestar, especificar y revisar hace el trabajo de varios que siguen escribiendo cada línea a mano. El riesgo no es la IA: es no adaptarse a usarla.

    ¿Necesito seguir aprendiendo a programar si la IA escribe el código?

    Sí, y hoy más que nunca. La IA escribe código, pero alguien tiene que leerlo, entenderlo y decidir si es correcto. No puedes aprobar un diff que no comprendes ni detectar un fallo de arquitectura si no sabes cómo debería estar construido. Saber programar deja de ser una habilidad de producción y pasa a ser una habilidad de criterio y revisión. Sin esa base, delegar en un agente es apostar a ciegas.

    ¿Por dónde empiezo a programar con IA?

    Por una tarea real, aburrida y acotada, no por un proyecto ambicioso. Coge algo que sepas hacer a mano en media hora —migrar un módulo, añadir tests, actualizar una dependencia—, escríbele una especificación clara al agente en lugar de un "hazme esto" y luego revisa el resultado línea a línea. Cuando eso te salga limpio, sube el listón. Trabajar primero la especificación y después delegar es la base de la metodología Spec-Driven Development, y es el orden que evita el caos.

    ¿Qué habilidades necesita hoy un developer?

    Tres que la IA no cubre. Criterio para decidir qué construir y qué no. Arquitectura para que las piezas encajen y el sistema sobreviva al paso del tiempo. Y capacidad de leer código ajeno —ahora, código generado— para revisarlo y aprobarlo con confianza. A eso se suma una habilidad nueva: saber especificar con precisión lo que quieres, porque todo lo que no le dices al agente, se lo inventa. El tecleo rápido ya no está en la lista.

    ¿Sigue haciendo falta un developer senior si la IA programa sola?

    Más que antes. La IA baja el coste de escribir código, lo que multiplica la cantidad de código que se genera y, con él, la superficie donde algo puede salir mal. Alguien tiene que poner criterio arquitectónico, revisar lo que produce el agente y frenar las decisiones que optimizan por cerrar la tarea a costa de la mantenibilidad. Ese trabajo es exactamente el de un senior. La IA no elimina ese rol: lo hace el más valioso del equipo.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Claude Opus 5: los 2 breaking changes que rompen tu código

    Claude Opus 5: los 2 breaking changes que rompen tu código

    Cambias una línea. Un campo model dentro de un JSON. Diez segundos de trabajo, deploy a staging, a otra cosa.

    Veinte minutos después el endpoint de resúmenes devuelve textos cortados a mitad de frase. Y una ruta concreta —la de análisis largo, la que más te importa— devuelve 400 sin que hayas tocado nada más.

    No es un bug de Anthropic. Eres tú, migrando a Claude Opus 5 como si fuera un cambio de versión menor.

    No lo es. Y el problema es que casi todo lo que vas a leer estos días sobre este modelo son tablas de benchmarks. El titular es que cuesta la mitad que Fable 5. La letra pequeña es que si no tocas dos parámetros, tu aplicación empieza a devolver respuestas cortadas y errores 400.

    Este post va de la letra pequeña.


    Qué es Claude Opus 5 y qué cambia respecto a Opus 4.8

    Claude Opus 5 es el modelo más capaz de Anthropic, disponible desde el 24 de julio de 2026 con el identificador de API claude-opus-5, sin sufijo de fecha. Cuesta $5 por millón de tokens de entrada y $25 de salida —el mismo precio que Opus 4.8— y trae dos breaking changes respecto a la generación anterior: el thinking viene activado por defecto y desactivarlo deja de ser compatible con los niveles de effort xhigh y max.

    Atributo Claude Opus 5 Claude Opus 4.8
    ID de API claude-opus-5 claude-opus-4-8
    Precio entrada / salida $5 / $25 por millón $5 / $25 por millón
    Fast mode (solo API de Anthropic) $10 / $50 por millón
    Thinking al omitir el parámetro Adaptativo, activado Desactivado
    Qué cubre max_tokens Thinking + respuesta Solo la respuesta
    Effort por defecto en la API high
    thinking: disabled + xhigh/max HTTP 400 Válido
    Mínimo para prompt caching 512 tokens 1024 tokens
    Ventana de contexto 1M tokens (defecto y máximo)
    Salida máxima 128K tokens
    Rate limits Cubo propio Pool combinado Opus 4.x

    Está disponible en Claude.ai, Claude Code, Claude Cowork, la API de Anthropic, Amazon Bedrock (anthropic.claude-opus-5), Google Cloud y Microsoft Foundry. Es el modelo por defecto en Claude Max y el más potente disponible en Claude Pro. Los datos de esta tabla están contrastados con la documentación oficial de Anthropic.


    Los benchmarks de Claude Opus 5, en treinta segundos

    Sí, los números son buenos. Los despacho rápido porque no son el tema.

    En CursorBench 3.2, a máximo effort, Claude Opus 5 se queda a un 0,5% del pico de Fable 5 —a la mitad de coste por tarea—. En ARC-AGI 3 triplica la puntuación del siguiente mejor modelo. En Frontier-Bench v0.1 más que dobla el rendimiento de Opus 4.8. Los tres resultados salen de las cifras publicadas por Anthropic.

    No es el mejor en todo: sigue por detrás de Mythos 5 en tareas de ciberseguridad ofensiva. Y Anthropic lo describe como su modelo mejor alineado hasta la fecha, con la menor tasa de comportamiento engañoso.

    Si vienes de Claude Opus 4.8, pagas lo mismo por token por un modelo bastante mejor. Con un matiz que casi nadie menciona: Opus 5 piensa por defecto y escribe más largo, así que gasta más tokens por tarea. Misma tarifa no significa misma factura. Y si estabas pagando el premium de Fable 5 por tareas de agente, ahí sí: Anthropic mide la mitad de coste por tarea.

    Perfecto. Ahora la parte que rompe cosas.


    Breaking change 1 de Claude Opus 5: el thinking viene activado por defecto

    En Claude Opus 5, omitir el parámetro thinking ejecuta thinking adaptativo; en Opus 4.8 y 4.7 omitirlo significaba no razonar. Este es el cambio que corta tus respuestas a mitad de frase.

    Antes, el silencio equivalía a "no razones, contéstame". Ahora el silencio es un sí.

    Y aquí viene la parte que duele: max_tokens es un tope duro sobre thinking más texto de respuesta, juntos. No son dos presupuestos separados.

    Si tenías max_tokens ajustado al milímetro para tu respuesta —y todo el que ha optimizado costes lo tiene ajustado al milímetro— el modelo se gasta parte de ese presupuesto razonando y la respuesta se corta.

    Este código funcionaba perfectamente ayer:

    import Anthropic from "@anthropic-ai/sdk";
    const client = new Anthropic();
    
    // Opus 4.8 — omitir "thinking" = sin razonamiento; 1024 tokens íntegros para la respuesta
    const res = await client.messages.create({
      model: "claude-opus-4-8",
      max_tokens: 1024,
      messages: [{ role: "user", content: prompt }],
    });
    

    Cambias el model a claude-opus-5 y esos 1024 tokens ahora se reparten entre razonamiento y respuesta. Nadie te avisa: no hay error, solo un texto que termina a media frase.

    Tienes dos salidas. La buena:

    // Opus 5 — thinking explícito y presupuesto con margen
    const res = await client.messages.create({
      model: "claude-opus-5",
      max_tokens: 8192, // cubre thinking + respuesta
      thinking: { type: "adaptive", display: "summarized" },
      output_config: { effort: "medium" },
      messages: [{ role: "user", content: prompt }],
    });
    

    Y la que replica el comportamiento anterior:

    thinking: { type: "disabled" }
    

    Cuidado con esa segunda, porque tiene trampa. Es exactamente el breaking change número dos.

    Sobre display: los tokens de razonamiento en crudo no se devuelven nunca. El valor por defecto es "omitted". Si pones "summarized" recibes un resumen legible del razonamiento, útil para logs y para depurar por qué el modelo llegó a donde llegó.


    Breaking change 2: desactivar el thinking en Opus 5 está capado a effort high

    Esta es la que devuelve 400.

    En Opus 5 la escala completa de effort es low, medium, high, xhigh y max. El valor por defecto de la API es high.

    Combinar thinking: { type: "disabled" } con effort xhigh o max devuelve HTTP 400. En Opus 4.8 esa combinación era perfectamente válida.

    // Válido en Opus 4.8 — error 400 en Opus 5
    const res = await client.messages.create({
      model: "claude-opus-5",
      max_tokens: 4096,
      thinking: { type: "disabled" },
      output_config: { effort: "xhigh" }, // 400
      messages: [{ role: "user", content: prompt }],
    });
    

    Y ahora el detalle que hace que esto sea peligroso de verdad: la validación es por petición. No hay un chequeo global al arrancar. Puedes tener veinte llamadas funcionando con thinking desactivado y effort high, y que la veintiuna —la que sube a xhigh para el caso difícil— se rechace. Las anteriores funcionando no te protegen de nada.

    Traducido: cualquier ruta de tu código que desactive el thinking hay que auditarla antes de migrar, no después. Búscalo con un grep por "disabled" y revisa qué effort viaja en cada una de esas peticiones.

    Mi recomendación es no mantener esa ruta. En lugar de desactivar el thinking, bájalo a effort medium con thinking activado:

    // Sustituto recomendado para las rutas que antes desactivaban thinking
    thinking: { type: "adaptive" },
    output_config: { effort: "medium" },
    

    En Opus 5 los niveles low y medium rinden inusualmente bien. La intuición de "menos effort, peor respuesta" que traías de la generación anterior ya no aplica igual: prueba medium antes de asumir que necesitas high.

    Con un matiz, para que nadie me lea en diagonal: para coding y trabajo agéntico, Anthropic recomienda arrancar en xhigh y bajar solo donde tus evals demuestren que la calidad aguanta. Lo de medium es el sustituto de las rutas que antes desactivaban el thinking, no un consejo para bajarle el effort a tu agente de coding. Y si al bajarlo compruebas que la tarea nunca necesitó Opus, Claude Sonnet 5 cubre buena parte de ese terreno por bastante menos dinero.


    El tercer sitio donde revienta: el rechazo que llega con un 200

    Este no está en la lista oficial de breaking changes, pero te va a tirar producción igual.

    Los clasificadores de seguridad pueden declinar una petición. Cuando lo hacen, la API devuelve HTTP 200 con stop_reason: "refusal". No es un error. Tu try/catch no lo captura, tu retry no se dispara, tu monitorización no lo ve.

    Y content llega vacío: un array sin bloques. Así que este patrón —el que escribe todo el mundo la primera vez— revienta con un TypeError:

    const res = await client.messages.create({ /* ... */ });
    const text = res.content[0].text; // 💥 TypeError: content llega vacío
    

    La corrección son cuatro líneas:

    const res = await client.messages.create({ /* ... */ });
    
    if (res.stop_reason === "refusal") {
      logger.warn("Petición declinada por los clasificadores", { requestId: res.id });
      return fallbackResponse();
    }
    
    const text = res.content.find((b) => b.type === "text")?.text ?? "";
    

    Dos datos más que ayudan aquí. Un rechazo que llega antes de emitir output no se factura, aunque sí consume rate limit. Y si no quieres montar el fallback a mano, Anthropic tiene un parámetro fallbacks en modo "default" (con el beta header server-side-fallback-2026-07-01) que reencamina la petición rechazada a otro modelo dentro de la misma llamada: los rechazos de categoría ciber caen a Opus 4.8.

    Comprueba stop_reason antes de leer content. Siempre. Con este modelo y con el siguiente.


    Dos cambios de comportamiento que te van a sorprender

    Escribe respuestas más largas por defecto. Y bajar el effort no lo arregla —es un eje distinto—. Si necesitas respuestas breves, pídelo en el prompt de forma explícita: límite de palabras, formato, o ambos.

    Verifica su propio trabajo sin que se lo pidas. Esta es la importante, porque invierte una buena práctica de prompting que era válida hasta la semana pasada.

    Todos tenemos system prompts con alguna variante de "revisa tu respuesta antes de contestar". En Opus 5 esas instrucciones provocan verificación excesiva: más tokens, más latencia, misma calidad. La solución no es reescribirlas con mejor redacción. Es borrarlas.

    Con la delegación en subagentes el ajuste es distinto. Opus 5 delega más que Opus 4.8 por defecto, así que los empujones que añadiste para forzarla ahora sobran. Pero aquí no basta con borrar: la recomendación de Anthropic es poner límites —en qué escenarios se delega, o cuántos subagentes como máximo—. Pasas de empujar a acotar.

    Es la parte contraintuitiva del oficio: mantener un system prompt no es acumular reglas, es borrarlas cuando el modelo ya no las necesita. Es exactamente el criterio que trabajo en el curso Construye con IA, donde el prompt se trata como código con mantenimiento, no como un texto que se escribe una vez y se olvida.


    Lo que mejora en Claude Opus 5 sin que toques nada

    El mínimo de prompt caching baja a 512 tokens. En Opus 4.8 eran 1024, y el umbral está en la documentación de prompt caching. Prompts de sistema que antes se quedaban justo por debajo del umbral y no cacheaban, ahora sí cachean, sin cambiar una línea de código.

    Si tienes muchas llamadas cortas y repetitivas, revisa la factura la semana que viene: puede bajar sola. Y si aún no tienes el caching bien montado, la mecánica completa está en Prompt Caching en Claude: reduce tu factura de API un 90%.

    Otros dos datos que conviene tener a mano: la ventana de contexto es de 1M tokens —es a la vez el valor por defecto y el máximo— con 128K tokens de salida. Y los rate limits de Opus 5 son un cubo separado del pool combinado de Opus 4.x: al migrar tráfico no heredas tu cuota anterior. Si mueves un volumen serio, comprueba límites antes del despliegue y no el lunes por la mañana con todo el tráfico encima.


    Cómo migrar a Claude Opus 5 en 4 pasos

    Cuatro pasos, en este orden:

    1. Grep por "disabled" en todas tus llamadas al thinking. Cada resultado, con su effort al lado. Si hay xhigh o max, es un 400 esperándote.
    2. Revisa tus max_tokens. Todo lo que esté ajustado al límite de la respuesta necesita margen para el thinking, o cambia a thinking: { type: "disabled" } con effort high como máximo.
    3. Comprueba stop_reason antes de leer content. Cuatro líneas.
    4. Borra las instrucciones de auto-verificación de tus system prompts. No las reescribas. Y en las de delegación, cambia el empujón por un límite: cuándo se delega y cuántos subagentes como máximo.

    Media hora de trabajo. Y a cambio: te acercas a la inteligencia frontera de Fable 5 por la mitad de coste por tarea.

    Si quieres ver este tipo de migraciones aplicadas sobre proyectos reales —con los prompts, el código y los errores que salen por el camino— es lo que hacemos en Dominicode Labs, y voy publicando los análisis modelo a modelo en el canal de YouTube.

    El precio lo pone Anthropic. Los 400 los pones tú.


    Preguntas frecuentes sobre Claude Opus 5

    ¿Cuánto cuesta Claude Opus 5?

    $5 por millón de tokens de entrada y $25 por millón de tokens de salida, exactamente el mismo precio que tenía Opus 4.8. Fable 5 cuesta $10/$50, así que Opus 5 se acerca a esa franja de inteligencia frontera por la mitad. Existe un fast mode disponible únicamente en la API de Anthropic que cuesta el doble: $10/$50. En suscripciones, es el modelo por defecto de Claude Max y el más potente disponible en Claude Pro.

    ¿Qué se rompe al migrar de Opus 4.8 a Claude Opus 5?

    Dos cosas concretas. Primera: el parámetro thinking ahora viene activado por defecto, y como max_tokens es un tope duro sobre thinking más respuesta juntos, los presupuestos ajustados provocan respuestas cortadas a mitad de frase. Segunda: thinking: { type: "disabled" } combinado con effort xhigh o max devuelve un error 400, cuando en Opus 4.8 esa combinación era válida. A eso conviene sumar una tercera comprobación: los rechazos de los clasificadores llegan como HTTP 200 con stop_reason: "refusal", no como error.

    ¿Cómo desactivo el thinking en Claude Opus 5?

    Con thinking: { type: "disabled" }, pero solo puedes hacerlo hasta effort high. Si envías esa configuración con xhigh o max, la petición se rechaza con un 400. Y ojo: la validación se hace petición a petición, así que una llamada posterior que suba el effort se rechazará aunque todas las anteriores hayan funcionado. En la mayoría de casos compensa más bajar a effort medium con el thinking activado, porque en Opus 5 los niveles low y medium rinden bastante mejor de lo que esperarías.

    ¿Sigo necesitando el «revisa tu respuesta antes de contestar» en mis prompts?

    No, y además es contraproducente. Opus 5 verifica su propio trabajo sin que se lo pidas, así que esas instrucciones provocan verificación excesiva: gastas más tokens y añades latencia sin ganar calidad. La recomendación es borrarlas, no reescribirlas. Con la delegación en subagentes el ajuste es distinto: los empujones para forzarla sobran, pero Anthropic recomienda sustituirlos por un límite explícito —en qué escenarios se delega y cuántos subagentes como máximo—, porque Opus 5 delega más que Opus 4.8 por defecto.

    ¿Hay que cambiar algo para aprovechar el prompt caching en Opus 5?

    Nada. El mínimo de tokens necesario para cachear baja de 1024 a 512, así que los prompts que antes eran demasiado cortos para entrar en caché ahora cachean automáticamente, sin tocar código. Si tu carga de trabajo son muchas llamadas cortas con un system prompt repetido, es probable que la factura baje sola tras migrar.

    ¿Puedo mover todo mi tráfico de Opus 4.x a Opus 5 de golpe?

    Técnicamente sí, pero revisa los rate limits antes. Los límites de Opus 5 son un cubo separado del pool combinado de Opus 4.x, de modo que al migrar no heredas la cuota que ya tenías asignada. Si mueves un volumen alto sin comprobarlo, puedes empezar a recibir throttling con un código que hasta ese momento no lo veía nunca.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • IA generativa vs IA agéntica: la diferencia que decide tu stack

    IA generativa vs IA agéntica: la diferencia que decide tu stack

    Hace unas semanas un CTO me escribió para que le ayudara a "medir el retorno de la IA" en su equipo. Doce developers, doce licencias, una factura mensual que ya se notaba en la hoja de gastos.

    Le pregunté qué hacían exactamente con ellas.

    "Autocompletar. Y a veces le preguntan cosas al chat."

    Ahí estaba todo. Ese equipo no tenía un problema de retorno: tenía un problema de categoría. Estaban pagando IA generativa y esperando resultados de IA agéntica.

    Y la diferencia entre IA generativa vs IA agéntica no es una discusión de nomenclatura para ponentes de conferencia. Es la decisión que determina qué compras, cuánto pagas cada mes y qué trabajo puedes delegar de verdad.

    En 2026, seguir describiendo el trabajo de un programador con IA como "IA generativa" es señal de llevar dos años de retraso.


    Resumen rápido

    • IA generativa es un sistema que produce un artefacto (texto, código, JSON) a partir de un prompt y termina ahí: no ejecuta nada, no verifica nada, no conserva estado.
    • IA agéntica es un sistema que recibe un objetivo en lugar de un prompt, tiene acceso a herramientas y repite el ciclo observar → decidir → actuar → verificar hasta cumplir un criterio de parada.
    • El modelo puede ser el mismo. Lo que cambia es la capa que lo envuelve: herramientas, permisos y criterio de parada.
    • Regla de decisión: si existe una señal automática de verdad (tests, typecheck, build, lint) que diga si el trabajo está bien hecho, es territorio de agente. Si el único verificador eres tú leyendo, es territorio de prompt.
    • Coste: un agente consume unas 4 veces más tokens que un chat; un sistema multi-agente, unas 15 (Anthropic, junio 2025).

    Lo que compraste no era generativa: era autocompletado caro

    El equipo de ese CTO usaba la IA exactamente igual que en 2023. Escribir media línea, aceptar la sugerencia gris. Abrir un chat, pegar un stack trace, copiar la respuesta de vuelta al editor.

    Eso funciona. Ahorra minutos. Pero el trabajo sigue siendo tuyo: tú lees el repo, tú decides, tú ejecutas, tú verificas si la respuesta era correcta, tú vuelves a preguntar cuando no lo era.

    La IA hace la parte fácil —escribir texto plausible— y tú te quedas con el bucle completo. Con doce licencias, lo que compras es doce veces la parte fácil.

    El salto de productividad real no está en generar mejor código. Está en dejar de ser tú quien cierra el bucle.


    ¿Qué es la IA generativa? Tú pides, ella escupe

    La IA generativa es un sistema que produce un artefacto a partir de un prompt y termina ahí. Entra un prompt, sale texto, código, un JSON, un diagrama. Se acabó.

    No tiene estado. No sabe qué hay en tu repositorio salvo lo que le pegas. No sabe si su respuesta compiló. No sabe si el test pasó. No puede saberlo, porque no ejecuta nada.

    Eso no es un defecto. Es el diseño. Y para tareas de un solo salto es imbatible: latencia de segundos, coste de céntimos, resultado inmediato.

    Un regex complejo. El mensaje de un commit a partir de un diff. Explicar qué demonios hace esa función de 2019 que nadie toca. Convertir un objeto de ejemplo en una interfaz de TypeScript.

    En todos esos casos, montar un agente es como contratar una mudanza para llevar una caja de zapatos al piso de arriba.


    ¿Qué es la IA agéntica? Lee, decide, ejecuta y vuelve

    La IA agéntica es un sistema que recibe un objetivo en lugar de un prompt, tiene acceso a herramientas y permiso para usarlas. Aquí el contrato cambia por completo.

    El agente lee ficheros. Ejecuta comandos. Mira la salida. Decide el siguiente paso a partir de lo que ha visto, no de lo que tú le contaste. Y repite hasta que se cumple un criterio de parada.

    Ese mecanismo tiene nombre y lo desmonté pieza a pieza en Agentic loop: el mecanismo detrás de los agentes de IA.

    Ese ciclo —observar, decidir, actuar, verificar, repetir— es todo el asunto. Lo he desarrollado a fondo en Loop Engineering: la evolución definitiva del desarrollo con IA, porque diseñar bien ese bucle es hoy más determinante que elegir modelo.

    Fíjate en que el modelo puede ser exactamente el mismo. Claude generando texto en una web y Claude arreglando un test en tu CI son el mismo peso de red neuronal. Lo que cambia es lo que hay alrededor: las herramientas que le das, los permisos que aceptas, la señal que le dice si ha terminado.

    Un LLM solo no es un agente, igual que un motor no es un coche. Esa capa que lo envuelve —el harness— es la que hace el trabajo, y lo expliqué en detalle en El Agentic Harness: por qué un LLM por sí solo no es un producto.

    La prueba práctica para distinguirlas: pídele algo cuyo resultado no puedas predecir sin ejecutar código. "Arregla el test que falla en CI" no lo resuelve un chat, por bueno que sea el modelo. Requiere leer el log, formular una hipótesis, tocar el código y volver a ejecutar. Eso es un agente o no es nada.

    Si vienes de cero con esto, la guía definitiva de Agentes de IA cubre los fundamentos y lo dejas para después de este.


    IA generativa o IA agéntica: cuál usar en cada tarea

    Esta es la asignación que uso a diario: a la izquierda la tarea, a la derecha la categoría que la resuelve con el menor coste y la menor latencia.

    Tarea Generativa o agéntica Por qué
    Escribir un regex o una query SQL puntual Generativa Salida única, la verificas tú en cinco segundos
    Redactar el mensaje de un commit Generativa El contexto está en el diff, no hay bucle que cerrar
    Explicar una función o un fichero legacy que no entiendes Generativa Necesitas comprensión, no cambios en disco
    Renombrar un concepto de dominio en 40 archivos Agéntica Hay que leer el repo, decidir caso a caso y comprobar que compila — no es el rename del IDE: cambian nombres, strings, rutas y documentación
    Arreglar un test en rojo que puedes reproducir en local Agéntica Requiere hipótesis, ejecución y reintento con la salida real
    Migrar un módulo de RxJS a Signals Agéntica Cambios encadenados con verificación continua vía tests
    Generar mocks o datos de ejemplo Generativa Un salto, coste mínimo, no toca disco
    Subir una dependencia mayor con breaking changes Agéntica El error aparece al ejecutar, no al leer
    Escribir la primera versión de un componente aislado Generativa Lo revisas tú de un vistazo; el bucle no aporta

    El patrón se ve solo: si existe una señal automática de verdad —tests, typecheck, build, lint— que diga si el trabajo está bien hecho, es territorio de agente. Si el único verificador eres tú leyendo, es territorio de prompt.


    El error caro: meter un agente donde bastaba un prompt

    Este es el fallo que más veo desde que los agentes se pusieron de moda. Y sale caro en cuatro dimensiones.

    Coste. Un agente no hace una llamada al modelo: hace decenas. Anthropic publicó las cifras de su sistema de investigación multi-agente en junio de 2025: los agentes consumen unas 4 veces más tokens que una interacción de chat, y los sistemas multi-agente unas 15 veces más. Está medido en tareas de investigación, pero el orden de magnitud se traslada. Cuando delegas a un agente algo que resolvía un prompt, estás multiplicando la factura por un trabajo idéntico.

    Latencia. El chat te responde en segundos. El agente tarda minutos porque lee, ejecuta, falla, reintenta. Para una tarea de treinta segundos, esa espera es una pérdida neta de tiempo, no una ganancia.

    No determinismo. Con un prompt, si la respuesta no te gusta, la descartas y ya está. Con un agente, cada ejecución toma un camino distinto: puede tocar archivos que no esperabas, reescribir un test en lugar de arreglar el código o "resolver" el fallo borrando la aserción que molestaba. Dos ejecuciones del mismo objetivo rara vez producen el mismo diff.

    Superficie de fallo. Un chat solo puede equivocarse en el texto. Un agente con permisos de escritura y shell puede equivocarse en tu disco, en tu historial de git y en tu base de datos de desarrollo. Cada herramienta que le das es potencia y es riesgo, en la misma proporción.

    Resumido en una tabla:

    Dimensión Prompt (generativa) Agente (agéntica)
    Coste Una llamada al modelo Decenas de llamadas: ~4x tokens, ~15x si es multi-agente
    Latencia Segundos Minutos: lee, ejecuta, falla, reintenta
    Determinismo Descartas la respuesta y repites Cada ejecución toma un camino distinto
    Superficie de fallo El texto que devuelve Tu disco, tu historial de git, tu base de datos de desarrollo

    Mi regla, sin matices: si puedes verificar el resultado leyéndolo en menos de un minuto, no necesitas un agente.


    Cómo migrar tu flujo de una a otra en 3 pasos

    Si hoy vives en el chat y quieres pasar al bucle, no empieces instalando frameworks. Empieza por aquí.

    1. Cierra el bucle de verificación antes de dar un solo permiso

    Un agente sin forma de comprobar su propio trabajo es un generador de texto con acceso a tu disco. Es la peor combinación posible.

    Antes de delegar nada, asegúrate de que existe un comando que responde sí o no:

    # El criterio de parada del agente: un comando que responde sí o no
    npm test && npx tsc --noEmit && npm run lint
    

    Ese comando es el criterio de parada. Si tu proyecto no tiene tests que corran rápido y en verde, tu primer trabajo agéntico es conseguirlos —y si trabajas con Angular y andas flojo ahí, el curso de Testing en Angular con Jest y Testing Library resuelve justo esa base.

    Sin señal de verdad no hay agente. Hay ruleta.

    2. Escribe la especificación, no el prompt

    Un prompt describe una petición. Una especificación describe un resultado esperado, sus límites y qué queda fuera del alcance.

    La diferencia importa porque el agente va a tomar cientos de microdecisiones que tú no vas a supervisar. Todo lo que no esté escrito lo va a inventar.

    Es la metodología que uso a diario y la que documenté entera en el libro de Spec-Driven Development: especificar primero, delegar después. Cambia el resultado más que cambiar de modelo.

    3. Empieza por una tarea aburrida, acotada y reversible

    Nada de "refactoriza la arquitectura". Elige algo que te lleve entre veinte y cuarenta minutos a mano, con criterio de éxito objetivo y sobre una rama nueva.

    Migrar un módulo. Añadir tests a un servicio. Actualizar una dependencia. Ejecuta, revisa el diff completo, mide cuánto ha tardado y cuánto has tenido que corregir.

    Si quieres ver ese primer trabajo delegado en la terminal, lo hago paso a paso con Claude Code.

    Sube el listón solo cuando esa tarea salga limpia dos veces seguidas. Y cuando llegue el momento de elegir herramientas de verdad, tengo mi criterio completo en Stack IA agéntica en 2026: qué usar, qué ignorar y cuál elijo.


    La pregunta que resuelve el 90% de las decisiones

    No memorices la tabla. Quédate con una sola pregunta antes de abrir cualquier herramienta:

    ¿Existe una señal automática que diga si el trabajo está bien hecho?

    Si existe, delega el bucle: es trabajo de agente. Si no existe, el bucle eres tú, y lo que necesitas es un buen prompt y tus ojos encima.

    Esa pregunta te ahorra factura y sustos.

    Si quieres ver el bucle completo montado de principio a fin —del objetivo a un producto funcionando, con especificaciones, herramientas y verificación— es exactamente lo que construimos en el curso Construye con IA. Y si prefieres hacerlo acompañado, con proyectos reales y gente que ya está en esto, te espero en Dominicode Labs.


    Preguntas frecuentes

    ¿Cuál es la diferencia entre IA generativa e IA agéntica?

    La IA generativa produce un artefacto a partir de un prompt y ahí termina: no ejecuta código, no verifica su propia salida y no conserva estado entre peticiones. La IA agéntica recibe un objetivo, dispone de herramientas para leer ficheros y ejecutar comandos, y repite el ciclo observar, decidir, actuar y verificar hasta cumplir un criterio de parada. El modelo subyacente puede ser el mismo en ambos casos; lo que cambia es la capa que lo envuelve. La prueba práctica para distinguirlas es pedir algo cuyo resultado no puedas predecir sin ejecutar código: eso solo lo resuelve un agente.

    ¿La IA agéntica sustituye a la IA generativa?

    No. La agéntica se construye encima de la generativa: el modelo que razona dentro del agente es el mismo tipo de modelo que responde en un chat. Lo que cambia es la capa que lo envuelve, con herramientas, permisos y un criterio de parada. En un flujo de trabajo real conviven las dos, y la mayoría de tus interacciones diarias seguirán siendo generativas porque son más rápidas y más baratas.

    ¿Cuánto más caro sale usar un agente en vez de un chat?

    Entre 4 y 15 veces más en consumo de tokens. Según los datos publicados por Anthropic en junio de 2025, un agente consume alrededor de 4 veces más tokens que una interacción de chat, y un sistema multi-agente unas 15 veces más. La cifra exacta depende del modelo y de la tarea, pero el orden de magnitud es ese: el agente solo compensa cuando la tarea es suficientemente valiosa como para justificar el gasto.

    ¿Un chat con acceso a herramientas ya es un agente?

    Solo si cierra el bucle. Ejecutar una búsqueda web y devolverte el resultado sigue siendo un salto único. Un agente encadena decisiones: usa la salida de una herramienta para elegir la siguiente acción, evalúa si ha cumplido el objetivo y reintenta cuando no. Si el sistema no puede reintentar por su cuenta a partir de lo que ha observado, es un chat con extras.

    ¿Necesito un framework de agentes para empezar?

    No al principio. Los asistentes de terminal actuales — Claude Code, Codex CLI, Gemini CLI — ya traen el bucle implementado, y con eso cubres la mayoría de tareas de desarrollo diario. El framework empieza a tener sentido cuando construyes un agente propio para un producto: cuando necesitas orquestar varios pasos, persistir estado entre ejecuciones o exponer herramientas específicas de tu dominio.

    ¿Qué tareas no delegaría hoy a un agente?

    Tres tipos. Las que no tienen verificación automática, porque no hay forma de saber si acertó sin revisarlo todo a mano. Las irreversibles: migraciones sobre datos de producción, borrados, despliegues sin rollback. Y las decisiones de arquitectura, porque un agente optimiza para que el criterio de parada se cumpla, no para que el sistema siga siendo mantenible dentro de dos años. Esa parte todavía es tuya.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Cómo construir un agente de IA y su MCP server paso a paso

    Cómo construir un agente de IA y su MCP server paso a paso

    Hace tres semanas un dev me escribió por Telegram con un MCP server funcionando. Lo había construido siguiendo un tutorial. Arrancaba, registraba sus tools, Claude Code lo detectaba. Todo perfecto.

    Su pregunta era: "¿y ahora cómo hago que mi agente lo use?".

    No supo responderse porque el tutorial terminaba justo ahí. Y ese es el problema con casi todo el material que hay sobre MCP: te enseñan a construir el enchufe, pero nunca el aparato que se enchufa. O al revés — te enseñan a montar un agente con tools locales y jamás mencionan por qué querrías sacarlas a un servidor.

    Son dos mitades de la misma pieza. Y separadas no sirven de mucho.

    Este post construye las dos. Un MCP server real en TypeScript, un agente que lo consume, y el puente entre ambos. Código verificado contra el SDK, no de memoria. Al final sabrás también cuándo no deberías montar un MCP server, que es una decisión que mucha gente se salta.


    Las dos mitades: quién expone y quién consume

    Un MCP server expone capacidades: tools, resources y prompts. No tiene inteligencia. No decide nada. Es un catálogo de funciones con un contrato estándar delante. Si no tienes claro el concepto de fondo, este post explica qué es Model Context Protocol antes de meterte en código.

    Un agente es lo contrario: tiene el modelo, tiene el bucle, y decide qué llamar y cuándo. Lo que no tiene es acceso a tu mundo — a tu base de datos, a tu API interna, a tus postmortems.

    MCP es el estándar que une las dos cosas sin que se conozcan entre sí. Escribes el server una vez, y lo consumen Claude Code, Claude Desktop, tu agente propio y el agente que escriba tu compañero el mes que viene.

    Esa reutilización es todo el valor de MCP. Recuérdalo, porque en la última sección lo usaremos para decidir si te hace falta.

    Vamos a construir un server sobre un caso que a cualquiera con sistemas en producción le suena: un histórico de incidencias. Datos internos, API que nadie más va a integrar, y consultas que un modelo puede hacer mucho mejor que un dashboard.


    Paso 1: el MCP server en TypeScript

    Construir un MCP server en TypeScript requiere tres piezas: el paquete @modelcontextprotocol/sdk con zod como peer dependency, una instancia de McpServer, y un transporte stdio. Este paso monta las tres sobre un caso real.

    Primero, versiones. Y aquí hay que ser preciso porque el ecosistema está en transición.

    La versión de producción hoy es la v1, en el paquete @modelcontextprotocol/sdk (última: 1.29.0). Es sobre la que vas a construir. Hay una v2 en beta que lo cambia bastante, y le dedico una sección entera más abajo — pero no construyas sobre ella todavía.

    mkdir mcp-incidencias && cd mcp-incidencias
    npm init -y
    npm install @modelcontextprotocol/sdk zod
    npm install -D typescript @types/node tsx
    

    zod es peer dependency obligatoria del SDK v1, no es opcional.

    En tu package.json añade "type": "module", y en el tsconfig.json usa "module": "NodeNext" y "target": "ES2022". Sin eso los imports con extensión .js te van a dar guerra.

    Ahora el servidor. Archivo src/server.ts:

    import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
    import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
    import { z } from 'zod';
    
    type Severidad = 'baja' | 'media' | 'alta';
    
    interface Incidencia {
      id: string;
      servicio: string;
      fecha: string;
      severidad: Severidad;
      titulo: string;
      causaRaiz: string;
    }
    
    // En producción esto sale de tu base de datos.
    const INCIDENCIAS: Incidencia[] = [
      {
        id: 'INC-101',
        servicio: 'checkout-api',
        fecha: '2026-05-14',
        severidad: 'alta',
        titulo: 'Timeouts masivos en pasarela de pago',
        causaRaiz: 'Pool de conexiones agotado tras un deploy sin migrar el límite.'
      },
      {
        id: 'INC-118',
        servicio: 'checkout-api',
        fecha: '2026-06-02',
        severidad: 'media',
        titulo: 'Latencia elevada en cálculo de impuestos',
        causaRaiz: 'Consulta N+1 introducida al añadir el desglose por región.'
      },
      {
        id: 'INC-124',
        servicio: 'auth-service',
        fecha: '2026-06-21',
        severidad: 'alta',
        titulo: 'Sesiones invalidadas de forma masiva',
        causaRaiz: 'Rotación de claves JWT desplegada sin periodo de solapamiento.'
      }
    ];
    
    const server = new McpServer({ name: 'incidencias', version: '1.0.0' });
    

    Fíjate en los imports: llevan la extensión .js y la ruta interna del paquete (/server/mcp.js). No es @modelcontextprotocol/sdk a secas. Es el error más habitual al empezar.

    Ahora registramos la primera tool:

    const ORDEN: Record<Severidad, number> = { baja: 0, media: 1, alta: 2 };
    
    server.registerTool(
      'buscar_incidencias',
      {
        title: 'Buscar incidencias',
        description:
          'Busca incidencias de producción de un servicio, filtrando por severidad mínima. ' +
          'Úsala cuando necesites el histórico de fallos de un servicio concreto.',
        inputSchema: {
          servicio: z.string().describe('Nombre del servicio, por ejemplo: checkout-api'),
          severidadMinima: z.enum(['baja', 'media', 'alta']).default('baja')
        },
        outputSchema: {
          total: z.number(),
          incidencias: z.array(
            z.object({
              id: z.string(),
              fecha: z.string(),
              severidad: z.string(),
              titulo: z.string()
            })
          )
        }
      },
      async ({ servicio, severidadMinima }) => {
        const encontradas = INCIDENCIAS.filter(
          (i) => i.servicio === servicio && ORDEN[i.severidad] >= ORDEN[severidadMinima]
        ).map(({ id, fecha, severidad, titulo }) => ({ id, fecha, severidad, titulo }));
    
        const output = { total: encontradas.length, incidencias: encontradas };
    
        return {
          content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
          structuredContent: output
        };
      }
    );
    

    Un detalle que ahorra tardes: inputSchema acepta tanto la forma en crudo ({ servicio: z.string() }) como un z.object() completo. El SDK normaliza las dos por dentro y el JSON Schema que acaba llegando al modelo es idéntico. Uso la forma cruda porque es menos ruido, pero si vienes de otra librería y te sale envolver, no rompes nada.

    Guárdalo, porque dentro de un momento vamos a ver otra librería donde esa flexibilidad no existe.

    Lo segundo: la description no es documentación, es prompt. Es literalmente lo único que el modelo lee para decidir si usa esta tool. Una descripción vaga es una tool que nunca se llama, o que se llama cuando no toca. Escríbela pensando en el modelo, incluyendo cuándo usarla.

    Segunda tool, con manejo de errores:

    server.registerTool(
      'detalle_incidencia',
      {
        title: 'Detalle de incidencia',
        description: 'Devuelve la causa raíz completa de una incidencia por su ID (formato INC-XXX).',
        inputSchema: {
          id: z.string().describe('Identificador, por ejemplo: INC-101')
        }
      },
      async ({ id }) => {
        const incidencia = INCIDENCIAS.find((i) => i.id === id);
    
        if (!incidencia) {
          return {
            content: [{ type: 'text', text: `No existe ninguna incidencia con ID ${id}.` }],
            isError: true
          };
        }
    
        return {
          content: [
            {
              type: 'text',
              text: `${incidencia.id} — ${incidencia.titulo}\nServicio: ${incidencia.servicio}\nFecha: ${incidencia.fecha}\nSeveridad: ${incidencia.severidad}\nCausa raíz: ${incidencia.causaRaiz}`
            }
          ]
        };
      }
    );
    

    isError: true en lugar de lanzar una excepción. La diferencia importa: con isError el modelo recibe el mensaje y puede corregirse solo — reintentar con otro ID, o decirle al usuario que no existe. Si lanzas, revientas la conexión y el agente se queda ciego.

    Y el arranque:

    const transport = new StdioServerTransport();
    await server.connect(transport);
    
    console.error('MCP server de incidencias escuchando en stdio');
    

    console.error, nunca console.log. En transporte stdio, stdout es el canal JSON-RPC. Un solo console.log mete texto suelto en la tubería y rompe el protocolo con un error de parseo que no dice nada útil. Todo tu logging va a stderr.

    Ya tienes la mitad de la pieza. Si quieres comprobar que funciona antes de seguir, no hace falta registrarlo en ningún cliente: npx @modelcontextprotocol/inspector npx tsx src/server.ts levanta MCP Inspector, la herramienta oficial, y te deja ver las tools registradas e invocarlas a mano desde el navegador.

    Si además quieres usarlo desde Claude Code, tengo aparte las notas sobre registrar un MCP server en Claude Code — es el complemento natural de esta sección, no un camino alternativo.


    Paso 2: el agente que consume las tools

    El agente se construye con el Tool Runner del SDK de Anthropic (client.beta.messages.toolRunner), que ejecuta por ti el bucle completo: llama al modelo, ejecuta la tool que pida, le devuelve el resultado, y repite hasta obtener una respuesta final.

    Aquí hay una confusión que veo constantemente y conviene despejarla antes de escribir una línea, porque son dos productos distintos de Anthropic:

    • Tool Runner (client.beta.messages.toolRunner, dentro del SDK normal @anthropic-ai/sdk): automatiza el bucle sobre las tools que defines. Sin tools integradas, sin sandbox. Tú pones todo.
    • Claude Agent SDK (@anthropic-ai/claude-agent-sdk): es Claude Code empaquetado como librería, con tools integradas de serie — leer y escribir ficheros, bash, grep.

    No son versiones distintas de lo mismo. Para este caso queremos el Tool Runner, porque lo que nos interesa es controlar exactamente qué tools existen.

    npm install @anthropic-ai/sdk
    

    Un agente mínimo con una tool local:

    import Anthropic from '@anthropic-ai/sdk';
    import { betaZodTool } from '@anthropic-ai/sdk/helpers/beta/zod';
    import { z } from 'zod';
    
    const client = new Anthropic(); // lee ANTHROPIC_API_KEY del entorno
    
    const buscarIncidencias = betaZodTool({
      name: 'buscar_incidencias',
      description: 'Busca incidencias de producción de un servicio por severidad mínima.',
      inputSchema: z.object({
        servicio: z.string().describe('Nombre del servicio, por ejemplo: checkout-api'),
        severidadMinima: z.enum(['baja', 'media', 'alta']).default('baja')
      }),
      run: async (input) => {
        // aquí llamarías a tu API real
        return JSON.stringify({ servicio: input.servicio, total: 0, incidencias: [] });
      }
    });
    
    const respuesta = await client.beta.messages.toolRunner({
      model: 'claude-opus-4-8',
      max_tokens: 16000,
      thinking: { type: 'adaptive' },
      messages: [
        {
          role: 'user',
          content: '¿Qué incidencias graves ha tenido checkout-api? Resume el patrón que veas.'
        }
      ],
      tools: [buscarIncidencias]
    });
    
    console.log(respuesta.content);
    

    Fíjate en la diferencia con el server: en betaZodTool el inputSchema tiene que ser un z.object() completo. Aquí no hay normalización que te salve — pasarle la forma en crudo no funciona.

    Las tres convenciones de schema que se confunden entre sí

    El mismo concepto cambia de formato según la librería. Es la causa más frecuente de tools que se registran pero nunca se llaman bien:

    Librería y función Propiedad Formato esperado
    MCP SDK v1 — registerTool inputSchema Forma cruda o z.object(); el SDK normaliza las dos
    Anthropic SDK — betaZodTool inputSchema z.object() completo, obligatorio
    Anthropic SDK — betaTool inputSchema JSON Schema plano (el que devuelve listTools())

    Las tres reciben inputSchema en camelCase. El input_schema en snake_case que quizá tengas visto es lo que viaja por la red hacia la API, no lo que le pasas al helper. Escribir snake_case en cualquiera de los tres revienta con un TypeError.

    Tres cosas más sobre los parámetros, que están cambiadas respecto a lo que quizá tengas memorizado:

    • El modelo es claude-opus-4-8. Sin sufijo de fecha.
    • thinking va con { type: 'adaptive' }. budget_tokens está eliminado en Opus 4.8 y devuelve un 400.
    • temperature, top_p y top_k rechazan cualquier valor que no sea el por defecto y devuelven 400. Si arrastras un temperature: 0 de un proyecto viejo, esa llamada falla. Se dirige el comportamiento por prompt, no por sampling.

    max_tokens alrededor de 16000 para peticiones normales, hasta ~64000 si haces streaming.

    El Tool Runner ejecuta el bucle completo por ti: llama al modelo, si pide una tool la ejecuta, le devuelve el resultado, y repite hasta que el modelo da una respuesta final. Ese bucle es el corazón de cualquier agente — y si quieres entender por qué la calidad del bucle importa más que el modelo que metas dentro, lo desarrollo aquí. Para los fundamentos de la API, este crash course te cubre.


    Paso 3: conectar las dos mitades

    Conectar el agente con el MCP server consiste en levantar un cliente MCP, pedirle sus tools con listTools() y traducirlas al formato del Tool Runner con betaTool. Así el agente ejecuta las tools reales del server en vez de copias locales.

    Ahora lo que casi nadie enseña. El agente del paso anterior tiene la tool duplicada en local. Queremos que consuma las tools reales del MCP server, sin reescribirlas.

    Para eso montamos un cliente MCP, le preguntamos qué tools tiene, y las traducimos al formato del Tool Runner:

    import Anthropic from '@anthropic-ai/sdk';
    import { betaTool } from '@anthropic-ai/sdk/helpers/beta/json-schema';
    import { Client } from '@modelcontextprotocol/sdk/client/index.js';
    import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
    
    const transport = new StdioClientTransport({
      command: 'npx',
      args: ['tsx', 'src/server.ts']
    });
    
    const mcp = new Client({ name: 'agente-incidencias', version: '1.0.0' });
    await mcp.connect(transport);
    
    // 1. Descubrimos las tools que expone el server
    const { tools } = await mcp.listTools();
    
    // 2. Las convertimos en tools ejecutables para el Tool Runner
    const puente = tools.map((tool) =>
      betaTool({
        name: tool.name,
        description: tool.description ?? '',
        inputSchema: tool.inputSchema as any,
        run: async (input) => {
          const resultado = await mcp.callTool({
            name: tool.name,
            arguments: input as Record<string, unknown>
          });
          return JSON.stringify(resultado.content);
        }
      })
    );
    
    // 3. El agente ya usa las tools reales del server
    const respuesta = await new Anthropic().beta.messages.toolRunner({
      model: 'claude-opus-4-8',
      max_tokens: 16000,
      thinking: { type: 'adaptive' },
      messages: [
        {
          role: 'user',
          content:
            'Revisa las incidencias graves de checkout-api, mira el detalle de cada una ' +
            'y dime si hay un patrón común en las causas raíz.'
        }
      ],
      tools: puente
    });
    
    console.log(respuesta.content);
    await mcp.close();
    

    Eso es el circuito completo. Aquí usamos betaTool en lugar de betaZodTool porque listTools() devuelve JSON Schema, no Zod. Encaja directo: le pasas el inputSchema tal cual llega del server.

    Y ojo con el detalle que más despista de todo el post: los helpers reciben inputSchema en camelCase, pero lo que viaja a la API es input_schema en snake_case. Si escribes tools a mano contra la API cruda usas snake_case; con los helpers, siempre camelCase. Escribir input_schema: dentro de betaTool no da un error de validación bonito — revienta con un TypeError antes de tocar la red.

    Cuando entiendas el mecanismo, el SDK ya trae ese puente hecho:

    import { mcpTools } from '@anthropic-ai/sdk/helpers/beta/mcp';
    
    const puente = mcpTools(tools, mcp);
    

    Merece la pena haber escrito el map a mano una vez: cuando el helper falle, sabrás qué está haciendo por dentro.

    Lo potente es que ese map no sabe nada de tus tools. Añade una tercera tool al server y el agente la tiene disponible en el siguiente arranque, sin tocar el código del agente. Ahí es donde MCP paga lo que cuesta.

    Al ejecutarlo verás al agente encadenar solo: llama a buscar_incidencias, recibe dos IDs, llama a detalle_incidencia con cada uno, y razona sobre las causas raíz. Nadie le dijo el orden.

    La otra vía: el conector MCP remoto

    Si en vez de stdio despliegas el server sobre HTTP, la API de Claude puede conectarse a él directamente, sin cliente MCP en tu código:

    const message = await client.beta.messages.create({
      model: 'claude-opus-4-8',
      max_tokens: 16000,
      betas: ['mcp-client-2025-11-20'],
      mcp_servers: [
        {
          type: 'url',
          url: 'https://incidencias.tudominio.com/mcp',
          name: 'incidencias'
        }
      ],
      tools: [{ type: 'mcp_toolset', mcp_server_name: 'incidencias' }],
      messages: [{ role: 'user', content: '¿Qué incidencias graves tuvo checkout-api?' }]
    });
    

    El conector MCP remoto exige declarar mcp_servers y tools a la vez. Declarar solo mcp_servers hace que la petición se rechace con un error de validación, aunque parezca redundante — ya has dicho dónde está el server, ¿para qué repetirlo? Cada server declarado en mcp_servers necesita su entrada { type: 'mcp_toolset', mcp_server_name: '<nombre>' } dentro de tools, y el mcp_server_name debe coincidir exactamente con el name del server.

    Ojo también: esta vía requiere un server con URL pública. Un server stdio no sirve aquí, para eso está el puente de arriba. La documentación del conector MCP de la API de Anthropic detalla el resto de campos disponibles.


    MCP v2 y la spec 2026-07-28: qué cambia y por qué no tienes que migrar

    El 28 de julio de 2026 salen la spec MCP 2026-07-28 y las SDK estables de la v2. Vas a ver posts en tono de urgencia. Ignóralos.

    La documentación oficial es explícita en dos puntos. Sobre las versiones, la v1.x sigue siendo "the supported release for production" y mantiene bugfixes y parches de seguridad al menos 6 meses después de que v2 sea estable. Y sobre el protocolo, la guía de la revisión lo cierra: "Nothing in v2 puts a 2026-07-28 byte on the wire by default" — hablar la revisión nueva es siempre un opt-in explícito. Migrar a v2 es opcional y va separado de la fecha del protocolo.

    Puedes seguir las dos fuentes de primera mano: la especificación del protocolo y el SDK de TypeScript en GitHub.

    El servidor que acabas de construir sigue funcionando. No hay nada que correr a arreglar.

    Dicho eso, la v2 no es un cambio cosmético y merece que sepas qué trae, porque cambia decisiones de arquitectura:

    Se parte el paquete. El monolítico @modelcontextprotocol/sdk desaparece en favor de @modelcontextprotocol/server, @modelcontextprotocol/client y @modelcontextprotocol/core. La v2 no sale como versión nueva del paquete viejo: son paquetes distintos. Por eso no hay riesgo de que te llegue sola en un npm update.

    Protocolo stateless. Cuando activas la revisión nueva, desaparecen el handshake initialize y la gestión de sesión. Traducido a infraestructura: escalas con un round-robin normal, sin sticky sessions. Si has sufrido balanceo con sesiones MCP, esta es la razón para migrar. Ojo: en la v2 el modo de 2025 sigue siendo el por defecto; la revisión 2026-07-28 se activa explícitamente.

    Multi Round-Trip Requests. Una tool puede pedir input al usuario a mitad de llamada, sin mantener un stream abierto — con inputRequired() y acceptedContent(). Confirmaciones y flujos de autorización dejan de ser un apaño.

    Cabeceras enrutables Mcp-Method y Mcp-Name, para que gateways y rate limiters enruten sin parsear el body. Si expones MCP detrás de un API gateway, esto te ahorra trabajo.

    Bring-your-own-schema. inputSchema y outputSchema aceptan cualquier Standard Schema: Zod v4 y ArkType directos, Valibot vía adaptador, o JSON Schema plano con fromJsonSchema. Se acabó estar atado a Zod. El registro pasa a server.registerTool(name, config, handler).

    Si vas a experimentar con la beta, el consejo oficial es fijar versiones exactas y poner cotas superiores en las dependencias, para no comerte un major por sorpresa.

    Mi recomendación: construye en v1, lee la guía de v2, y migra cuando tengas un motivo concreto — escalado horizontal o flujos que necesiten input a media llamada. No antes.


    Cuándo NO necesitas un MCP server

    Esta sección te puede ahorrar una semana.

    Si tu agente va a usar solo tus propias tools, dentro de tu propio proceso, no montes un MCP server. El Tool Runner con tools locales (betaZodTool y punto) es más simple, más rápido de depurar y no añade un proceso extra ni serialización por medio. Todo el paso 1 de este post sobra en ese escenario.

    MCP gana cuando aparece la palabra reutilización:

    • Quieres las mismas tools en Claude Code, en Claude Desktop y en tu agente.
    • Varios equipos van a consumir la misma capacidad y no quieres que cada uno la reimplemente.
    • Quieres una frontera de permisos clara: el server decide qué se puede hacer, el agente solo pide.
    • Necesitas versionar y desplegar las capacidades por separado del agente.

    Si no marcas ninguna, tu MCP server es una capa de indirección que no compra nada.

    Y una consecuencia que se ve poco: en cuanto varios clientes consumen tus tools, las descripciones dejan de ser tuyas y pasan a ser una API pública. Cambiar una description puede romper el comportamiento del agente de otro equipo sin que nada falle en rojo. Trátalas con el mismo cuidado que un contrato.


    Qué hacer con esto hoy

    Coge el código del paso 1, cámbiale el array INCIDENCIAS por una consulta real a tu base de datos, y ejecuta el puente del paso 3. En una tarde tienes un agente hablando con tus datos internos.

    Y cuando lo tengas funcionando, la parte difícil no será el código. Será decidir qué tools expones y cómo las describes — porque ahí es donde un agente pasa de demo a herramienta que usas todos los días.

    Ese salto, el de convertir una prueba de concepto en producto, es justo lo que trabajamos en el curso Construye con IA: De la Idea al Producto con Claude Code, con este mismo flujo de specs, tools y agentes. Si prefieres el método antes que la herramienta, en el libro Spec-Driven Development está el sistema completo para definir qué construyes antes de escribir la primera línea.

    Y si quieres los proyectos completos y las versiones de esto que corren en producción, están en Dominicode Labs.


    FAQ

    ¿Puedo usar el mismo MCP server con Claude Code y con mi agente propio a la vez?

    Sí, y es exactamente para lo que sirve MCP. El server no sabe quién le llama. Claude Code lo lanza como proceso hijo por stdio, y tu agente hace lo mismo con StdioClientTransport. Mismo binario, dos consumidores, cero código duplicado.

    ¿Tengo que migrar mi server a la v2 el 28 de julio?

    No. La v2 llega en paquetes nuevos (@modelcontextprotocol/server, /client y /core), no como actualización del paquete actual, así que no te va a llegar por un npm update. La v1.x sigue siendo la versión soportada para producción y mantiene bugfixes y parches de seguridad al menos 6 meses tras la salida de v2. Además, hablar la revisión 2026-07-28 es siempre un opt-in explícito: nada la pone en el cable por defecto.

    ¿Cuál es la diferencia real entre el Tool Runner y el Claude Agent SDK?

    El Tool Runner automatiza el bucle sobre tools que defines tú, y nada más: sin tools integradas, sin sandbox. El Claude Agent SDK es Claude Code como librería, y viene con tools de ficheros, bash y grep de serie. Si quieres control total sobre qué puede hacer el agente, Tool Runner. Si quieres un agente que opere sobre un repositorio desde el minuto uno, Agent SDK.

    Mi server arranca pero el cliente da error de parseo JSON. ¿Qué pasa?

    Casi seguro tienes un console.log en algún sitio. En stdio, stdout es el canal JSON-RPC exclusivo del protocolo. Cualquier texto que escribas ahí corrompe el flujo. Cambia todos los console.log por console.error y vuelve a probar.

    ¿Por qué mi tool aparece registrada pero el modelo nunca la llama?

    Dos causas, por frecuencia. La primera es la description: si es vaga, el modelo no sabe cuándo aplica. Escríbela diciendo explícitamente en qué situación usarla. La segunda es que el schema no describa bien los campos — añade .describe() a cada uno, porque el modelo los lee para saber con qué rellenarlos.

    ¿Cómo pruebo mi MCP server sin registrarlo en un cliente?

    Con MCP Inspector, la herramienta oficial: npx @modelcontextprotocol/inspector npx tsx src/server.ts. Abre una interfaz web donde ves las tools registradas, su schema, y puedes invocarlas con argumentos a mano. Es la forma más rápida de saber si el fallo está en el server o en cómo lo consume el cliente.

    ¿Puedo usar temperature para que el agente sea más determinista?

    No con Opus 4.8. temperature, top_p y top_k rechazan cualquier valor que no sea el por defecto y devuelven un 400. Tampoco existe ya budget_tokens para thinking — se usa thinking: { type: 'adaptive' }. Si migras código de modelos anteriores, revisa esos parámetros primero. El comportamiento se dirige por prompt.

    ¿El conector MCP de la API sirve para un server local por stdio?

    No. mcp_servers con type: 'url' necesita un endpoint HTTP accesible desde la API de Anthropic. Para un server local usas el puente del paso 3: cliente MCP por stdio y las tools traducidas al Tool Runner.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

    Más contenido sobre agentes e IA aplicada al desarrollo en el canal de YouTube de Dominicode. Y si estás empezando con agentes, esta guía es el punto de partida.

  • Cómo meter Hermes Agent en tu flujo de trabajo diario

    Cómo meter Hermes Agent en tu flujo de trabajo diario

    Llevo meses metiendo Hermes Agent en mi flujo de trabajo diario, y el momento en que decidí hacerlo en serio no fue leyendo la documentación. Fue una noche en la que tenía Claude Code abierto en una terminal, revisando un PR que no avanzaba. Slack abierto en otra pestaña, esperando una respuesta que tardaba. Y un cron corriendo a las 3am que revisaba PRs pendientes en tres repos con un script de bash que yo mismo mantenía a mano.

    Me detuve a mirar ese script y vi algo incómodo: acababa de reinventar, con cron y bash, exactamente lo que Hermes Agent hace nativo. Desde ese día dejó de ser un experimento de fin de semana — pasó a ser la pieza que corre en segundo plano mientras yo hago otra cosa.

    Para quien no lo tenga fresco: Hermes Agent es el framework open source de agentes autónomos de Nous Research — sandbox Docker, memoria persistente y soporte multicanal (CLI, Telegram, Discord, Slack, WhatsApp, Signal). Dicho eso, este post no es una intro de "qué es Hermes Agent". Es cómo lo uso yo: cuándo lo disparo desde el móvil en vez de abrir la laptop, dónde le doy acceso real a mi código sin miedo a que rompa nada, y qué reviso antes de conectarlo a un VPS con datos reales.


    Claude Code y Hermes Agent no compiten — resuelven turnos distintos

    La primera pregunta que me hacen es la obvia: ¿esto reemplaza a Claude Code? No. Si alguien te dice que sí, no lo ha usado en serio.

    Claude Code vive en tu editor. Es una sesión interactiva: tú escribes, el agente responde, revisas el diff, iteras. Pair programming con alguien que no se cansa. La sesión termina cuando cierras la terminal.

    Hermes Agent vive en otro sitio: en background, disparado por un evento — un mensaje, un cron, un webhook — y sigue corriendo aunque cierres la laptop.

    La regla que uso: si estoy decidiendo diseño en tiempo real, Claude Code. Si la tarea es "revisa esto, hazlo, y avísame" — y puedo estar en el metro sin laptop — es trabajo para Hermes Agent.


    Instalar Hermes Agent en menos de un minuto

    En Linux, macOS, WSL2 o Termux:

    curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
    

    En Windows nativo, sin WSL, desde PowerShell:

    iex (irm https://hermes-agent.nousresearch.com/install.ps1)
    

    El instalador de Windows resuelve solo uv, Python 3.11, Node.js, ripgrep, ffmpeg y un Git Bash portable — sin pedirte permisos de administrador. Esperaba instalar media docena de dependencias a mano. No hizo falta.


    Los comandos que necesitas el primer día

    Después de instalar, el wizard completo:

    hermes setup
    

    Si prefieres ir pieza por pieza:

    • hermes — abre el chat interactivo, punto de arranque de cualquier sesión
    • hermes model — elige proveedor y modelo LLM
    • hermes tools — configura qué herramientas están habilitadas
    • hermes gateway — levanta el gateway de mensajería (Telegram, Discord, Slack…)
    • hermes doctor — diagnostica problemas de configuración antes de que te den una sorpresa
    • hermes update — mantiene el binario en la última versión

    Si no quieres juntar API keys de cada proveedor por separado, hermes setup --portal hace login OAuth contra el Nous Portal: más de 300 modelos, web search, imágenes, TTS y browser en la nube bajo una sola suscripción. Es el atajo para no tener seis .env con llaves sueltas.


    Sacarlo de la terminal: dispararlo desde el móvil

    Aquí está el cambio real de flujo de trabajo. Antes de Hermes, "revisar algo desde el móvil" era abrir una app de VNC o SSH y sufrir un teclado táctil. Con el gateway de mensajería, no:

    hermes gateway setup    # Configura Telegram, Discord, Slack, WhatsApp, Signal
    hermes gateway start
    hermes gateway status
    

    El mismo agente que usas en la CLI responde en Telegram, Discord, Slack, WhatsApp o Signal, con los mismos slash commands:

    • /new o /reset — arrancar de cero
    • /model — cambiar de modelo
    • /personality — cambiar de contexto/personalidad
    • /retry y /undo — cuando algo sale mal
    • /compress — cuando la conversación se alarga
    • /usage — ver el gasto
    • /insights --days 7 — resumen semanal
    • /stop (o Ctrl+C en la CLI) — interrumpirlo

    En la práctica: voy caminando, me acuerdo de que quiero que revise un PR, le escribo por Telegram, y sigo caminando. Eso es lo que cambió — no la inteligencia del modelo, la fricción de acceder a él.


    El sandbox: que toque código real sin que te dé miedo

    La parte que a cualquier developer con experiencia le genera desconfianza, con razón: darle a un agente acceso de ejecución en tu máquina o servidor.

    Hermes soporta seis backends — local, Docker, SSH, Singularity, Modal, Daytona. Para cualquier cosa que toque un repo real, uso Docker (aquí entré en más detalle sobre por qué en la guía completa de Docker sandboxing en Hermes Agent):

    hermes config set terminal.backend docker
    

    No es un sandbox decorativo. El hardening por defecto elimina todas las capabilities de Linux y solo re-agrega tres: DAC_OVERRIDE, CHOWN, FOWNER. Límite de 256 procesos. /tmp como tmpfs de 512MB nosuid. /var/tmp con noexec y nosuid a 256MB. Bloqueo de escalación de privilegios (no-new-privileges). Límites de CPU, memoria (5GB por defecto) y disco (50GB por defecto).

    La diferencia práctica: si el agente ejecuta un comando destructivo dentro del sandbox, se lleva el contenedor, no tu servidor. Es la diferencia entre "cometí un error" y "cometí un error y ahora restauro un backup".


    Conectar las herramientas que ya usas: MCP

    Lo que hace que Hermes valga la pena en tu día a día no es que chatee bien — es que puede tocar las herramientas que ya usas. Los servidores MCP se declaran en ~/.hermes/config.yaml:

    mcp_servers:
      github:
        command: npx
        args: ["-y", "@modelcontextprotocol/server-github"]
        env:
          GITHUB_PERSONAL_ACCESS_TOKEN: "ghp_xxx"
    

    Con eso conectado, el agente revisa issues, comenta PRs o abre ramas sin que tú abras GitHub. Si ya construyes servidores MCP para Claude Code, funcionan igual aquí — el protocolo es el mismo, el cliente cambia (si quieres el detalle completo de cómo montar un servidor MCP propio, lo cubrí en Model Context Protocol: conecta tu base de datos a la IA). Es la misma lógica de interoperabilidad que trabajamos en el curso Construye con IA al conectar agentes a herramientas reales de producción.


    El checklist antes de darle acceso a algo real (VPS, producción)

    Esto diferencia un despliegue de fin de semana de uno que no te explota en la cara. Antes de conectar Hermes a un VPS, reviso la lista completa, no las tres primeras líneas:

    1. Nunca actives GATEWAY_ALLOW_ALL_USERS=true — define allowlists explícitos por plataforma
    2. Usa el backend de contenedor (terminal.backend: docker) para aislar la ejecución
    3. Configura límites de recursos en ~/.hermes/config.yaml
    4. Guarda secretos en ~/.hermes/.env con permisos restringidos — nunca en config.yaml
    5. Usa códigos de DM pairing en vez de IDs de usuario hardcodeados
    6. Audita el command_allowlist con regularidad, no solo la primera vez
    7. Define terminal.cwd para limitar el directorio de trabajo del agente
    8. Corre el gateway como usuario no-root
    9. Monitorea ~/.hermes/logs/ — que no falle no significa que hizo lo correcto
    10. Mantente actualizado con hermes update

    Si quieres esta lista y la chuleta completa de comandos en una sola hoja para imprimir, la armé gratis aquí: dominicode.com/hermes-agent. Y si tu siguiente paso es un VPS propio, el paso a paso completo está en cómo desplegar Hermes Agent en tu propio VPS con Docker.


    El modo YOLO no es tan yolo como suena

    Hay un modo --yolo (también /yolo, o HERMES_YOLO_MODE=1) que salta las confirmaciones de comandos. Lo uso cuando confío en la tarea y no quiero aprobar cada paso — casi siempre dentro del sandbox de Docker, nunca contra mi máquina local sin aislar.

    Incluso en YOLO hay un blocklist permanente que no se salta nunca: rm -rf /, fork bombs, escritura directa a dispositivos. No es marketing, es una capa que existe pase lo que pase.

    De fábrica también trae:

    • Protección SSRF — bloquea IPs privadas, loopback, link-local, CGNAT y metadata de nube antes de cualquier fetch
    • Filtrado de credenciales en subprocesos MCP — solo pasa variables seguras como PATH, HOME, USER, LANG
    • Escaneo de context files contra prompt injection
    • Advisories de supply-chainhermes doctor te avisa directo si algo tiene una vulnerabilidad conocida

    Qué hacer hoy

    No necesitas resolver todo esto en una tarde. Esto es lo que haría en tu lugar.

    Instala Hermes hoy y corre hermes setup. No conectes nada todavía — úsalo desde la CLI un par de días, como probarías cualquier herramienta nueva.

    Cuando le confíes algo real, cambia el backend a Docker antes de darle acceso a un repo que te importe. Es un comando, no una migración.

    Y antes de conectarlo a un VPS o a mensajería pública, pasa por el checklist completo de arriba. Es la diferencia entre automatizar tu flujo de trabajo y crear un incidente de seguridad con tu nombre encima.

    Si estás diseñando cómo encajan Claude Code, Hermes y el resto de tu stack de IA — no solo conectando un agente suelto — es el tipo de conversación que tenemos cada semana en Dominicode Labs con developers que ya tienen esto en producción. (Ya estamos preparando, además, un curso completo dedicado solo a esto — sin fecha todavía, pero viene.)


    FAQ — Preguntas frecuentes sobre Hermes Agent

    ¿Hermes Agent es lo mismo que Claude Code?

    No. Claude Code es una sesión interactiva en tu editor para pair programming en tiempo real: tú decides, el agente ejecuta, revisas el diff al instante. Hermes Agent corre en background, disparado por mensajería o eventos, y sigue trabajando aunque cierres la laptop. Son complementarios, no competidores.

    ¿Necesito un servidor o VPS para usarlo?

    No para empezar. hermes corre local desde tu CLI en Linux, macOS, WSL2, Termux o Windows nativo. Un VPS se vuelve necesario cuando quieres el gateway de mensajería disponible 24/7 sin depender de que tu laptop esté encendida — ahí entra el checklist de seguridad de este post.

    ¿Es gratis?

    El framework es open source. Lo que cuesta es el consumo de tokens del proveedor que elijas con hermes model, o la suscripción del Nous Portal si usas hermes setup --portal para acceder a los 300+ modelos sin gestionar API keys sueltas.

    ¿Qué tan seguro es darle acceso a mi terminal?

    Depende del backend. Correr hermes directo contra tu máquina local sin sandbox es la opción de mayor riesgo. Cambiar a terminal.backend: docker te da capabilities reducidas, límites de proceso, memoria y disco, y contención real. Sumado al checklist de este post, es un nivel razonable para producción.

    ¿Puedo usarlo con modelos locales?

    Sí, vía Ollama, con su endpoint compatible con la API de OpenAI en localhost:11434/v1 — cualquier modelo con tool calling funciona. La restricción real es de contexto: el agente necesita al menos 64.000 tokens disponibles para el system prompt, los esquemas de herramientas y la conversación, así que un modelo local con ventana pequeña queda descartado desde el arranque. Prueba primero con un modelo mediano (14B-32B) que soporte tool calling y esa ventana de contexto antes de comprometerte a un flujo 100% local.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.