En esta sección
Guías / Arquitectura: cuándo flujo y cuándo Met

Arquitectura: cuándo flujo y cuándo Met

De la plantilla al Met autónomo, cuánto cuesta cada escalón, cómo se combinan flujos y Mets en los dos sentidos, y un ejemplo de punta a punta.

Actualizada el Ver .md

Cómo construir un agente plantea la decisión de fondo: el agente decide la secuencia en cada ejecución; el flujo la decide quien lo construye. Esta guía va un paso más allá, porque en la práctica casi nada bueno es solo una de las dos cosas. Lo que funciona en producción es un flujo que llama a un Met solo en el paso que necesita juicio, o un Met que llama a un flujo para lo que no admite improvisación.

La razón es doble. Cada paso con IA gasta Energía y puede equivocarse; cada paso fijo no gasta y hace siempre lo mismo. Mientras menos pasos dependan del modelo, más barato y más predecible es el proceso.

La escalera

Ordenada del escalón más barato y controlable al más caro y libre:

qué esgasta Energíaúsalo cuando
1. Plantilla, regla o códigotexto fijo, flow.condition, data.code, botones con channel.ask_optionsnola respuesta se conoce de antemano o se puede calcular
2. Una llamada acotadaun Campo IA o un Run aislado (tool_policy: "none")una llamadahay que leer o escribir lenguaje, pero la tarea es una sola y no necesita herramientas
3. Pedirle a Metel nodo agent.ask dentro de un flujoese pasoun paso necesita el criterio o la redacción de un Met; el resto del proceso sigue fijo
4. Un Met que conversael nodo agent.handoff: desde ahí el Met atiende al contactocada turnola conversación no se puede prever; el Met llama Funciones para lo que no admite improvisación

Empieza abajo y sube solo cuando el escalón de abajo no alcanza. Las señales para subir:

Y las señales para bajar, que son las que más ahorran: un Met que hace siempre los mismos pasos en el mismo orden es un flujo o una Función; un Met que elige entre tres opciones fijas es un menú de botones; un Met que solo escribe una frase no necesita sus noventa herramientas.

Escalón 1: plantilla, regla y código

Todo lo que no pasa por un modelo:

Escalón 2: una llamada acotada

Cuando hace falta lenguaje pero no un agente:

const run = await met.runs.create({
  met: 'Extractor',
  tool_policy: 'none',
  input: 'Devuelve solo el NIT y el total de este texto, en JSON: ...',
});

Escalón 3: Pedirle a Met (agent.ask)

El nodo agent.ask («Pedirle a Met») le encarga una tarea a un Met del workspace con dos campos: el Met (met_id) y la instrucción (prompt), que puede llevar referencias a nodos anteriores. La respuesta queda en @{node:<id>.text}.

Dos cosas que conviene saber antes de usarlo:

Escalón 4: un Met que conversa

El nodo agent.handoff vincula un Met a la conversación: a partir de ahí ese Met le responde al contacto. Es el escalón correcto para atender, y el peor para ejecutar procedimientos: lo que tiene pasos fijos —cobrar, agendar, registrar un pedido— va en una Función que el Met llama, con parámetros que la Función valida.

Los dos sentidos de la combinación

sentidocómocuándo
flujo → Metagent.ask para un paso; agent.handoff para entregarle la conversaciónel proceso es fijo y uno de sus pasos necesita juicio o redacción
Met → flujouna Función IA con handler HTTP o con flow_id; el flujo devuelve su resultado con el nodo function.resultel Met conversa y, en algún momento, tiene que ejecutar algo que no puede improvisar

En el segundo sentido, los parámetros de la Función son el contrato: con enum_values el Met solo puede mandar uno de los valores que permitiste, y lo que pasa después lo decide tu flujo o tu backend, no el modelo.

Lo que cuesta cada cosa

Los nodos de lógica, datos y mensajería no gastan Energía. Condiciones, código, botones, plantillas, esperas, bucles y lecturas o escrituras del CRM corren sin modelo. Gastan los nodos que invocan IA: agent.ask, agent.handoff, agent.nudge, image.generate, image.edit, voice.generate, video.generate, y un nodo flow.action cuando una de sus acciones pone a trabajar a un Met. Un nodo mcp.call no pasa por un modelo, pero la herramienta que llama puede tener su propio costo, por ejemplo una que genere imágenes.

Lo que encarece un Met no es solo su nivel. En cada llamada al modelo viajan sus instrucciones y la definición de todas sus herramientas activas, aunque el turno sea trivial: un Met con un prompt largo y decenas de herramientas paga ese contexto para escribir una frase. La parte del contexto que se repite se cobra más barata cuando sale de caché, pero no es gratis. Y el nivel multiplica todo lo anterior.

Rutear también cuesta. Un Run sin met lo atiende el Met principal del workspace, que puede delegar en otro Met: son dos ejecuciones donde una alcanzaba. Con met, el Run va directo a ese Met, sin pasar por el orquestador.

Cómo medirlo: GET /billing/executions filtra por met_id y por run_id, y totals suma todo el filtro (Cuánto cuesta cada llamada). Hoy no hay un costo por flujo en la API, así que usa un truco: dale al paso de IA de tu flujo su propio Met. Filtrando por ese met_id sabes exactamente cuánto cuesta ese paso, corrida por corrida.

Niveles

Cada Met tiene un nivel, que se elige con model al crearlo o editarlo (Mets y sus herramientas):

modelpara qué
agilrápido y el que menos Energía gasta por respuesta: clasificar, extraer, escribir una frase corta, responder lo que ya está en sus instrucciones
brillanteel de todos los días: atender, combinar datos, redactar con criterio
geniorazona más y gasta más: decisiones con muchas variables, textos largos y delicados
await met.agents.update(redactorId, { model: 'agil' });

La regla práctica: ágil para tareas acotadas. Si la tarea cabe en una instrucción de dos líneas y una respuesta de una frase, subirla de nivel no la mejora; solo la encarece. Los nodos de imagen y video de un flujo eligen su propio nivel; agent.ask usa el del Met.

Contexto acotado

Mientras menos contexto cargue un Met, menos cuesta cada turno y menos formas tiene de desviarse:

Controlar la salida

Un modelo puede devolver algo razonable pero equivocado. Antes de que su salida llegue a un cliente, un flujo la revisa sin IA:

  1. Valida con código. flow.condition compara valores pero no mide largos ni busca patrones, así que la validación va en un data.code que devuelve un sí o un no, y la condición lo lee:

js // Datos de entrada: {"texto": "@{node:redactar.text}"} const t = String(entrada.texto || '').trim(); const ok = t.length > 0 && t.length <= 120 && !/https?:\/\/|www\./i.test(t); return { ok, texto: t };

Después, un flow.condition con @{node:validar.result.ok} igual a true.

  1. Ten un respaldo fijo. La rama «Si no» envía un texto que escribiste tú. Si el modelo falla, el contacto recibe algo correcto en vez de nada o de algo raro.
  2. Lo que publica, cobra o envía pasa por una persona. Cuando un Met pide publicar en redes, cobrar, facturar, gastar pauta o enviar una plantilla que Meta cobra, la acción puede quedar esperando la aprobación de alguien del negocio (Aprobaciones humanas). Un flujo no tiene un nodo de aprobación: lo que envía por su cuenta sale sin revisión, y por eso tiene que ser texto fijo o una salida validada.
  3. Acota lo que el Met puede pedir. En una Función, enum_values y los parámetros obligatorios hacen que lo que llega a tu backend tenga la forma que esperas.

Ejemplo de punta a punta: responder comentarios

Es el patrón con el que Meteor responde los comentarios de sus propias publicaciones: cuando alguien comenta la palabra clave, recibe la información por mensaje privado, una respuesta pública corta y un «Me gusta». Solo un paso de los seis usa IA.

pasonodoqué hacegasta Energía
1trigger.start con el disparador social.comment_receivedarranca con un comentario nuevo de la cuenta elegida que contiene la palabra clave (contains, sin distinguir mayúsculas)no
2mcp.call → meta_reply_to_comment_privatemanda por privado un texto fijo con la información y el enlaceno
3mcp.call → meta_like_commentle da «Me gusta» al comentario (solo en Facebook; en Instagram se omite)no
4agent.askle pide al Met redactor una frase para responder en públicosí
5data.code + flow.conditionvalida la frase: que exista, que no pase de 120 caracteres y que no tenga enlacesno
6mcp.call → meta_reply_to_commentpublica la frase validada o, por la rama «Si no», un texto fijo de respaldono

Los datos del comentario llegan en el disparador: @{trigger.payload.comment_id}, @{trigger.payload.comment_text}, @{trigger.payload.platform} y @{trigger.payload.account_id}. Cada comentario se reserva antes de correr el flujo, así que un mismo comentario no lo dispara dos veces.

La instrucción del paso 4 cabe en tres líneas:

Escribe una respuesta pública de una sola frase, cálida y de máximo 120 caracteres,
sin enlaces ni datos de contacto, para este comentario: @{trigger.payload.comment_text}

El Met redactor va en agil, con instrucciones breves sobre el tono de la marca y sus herramientas apagadas con disabled_tools. Lo que se pone en riesgo con la IA es poco —una frase— y aun así no sale sin pasar por la validación.

Las Rutinas son este mismo patrón

Las Rutinas de Met —crear y publicar en redes, anunciar lo que vendes, hacer seguimiento a tus clientes— están construidas así por dentro:

Preguntas frecuentes

¿Un flujo sin pasos de IA consume Energía?

No. Los nodos de lógica, datos y mensajería no invocan un modelo. Ojo con lo que sí tiene costo fuera de la Energía: una plantilla de WhatsApp fuera de la ventana de 24 horas la cobra Meta.

¿Puedo elegir el nivel de un nodo agent.ask?

No por nodo: el paso usa el nivel del Met que eliges. Si necesitas un paso en ágil y otro en brillante, usa dos Mets.

¿Cuándo conviene un Run aislado en vez de agent.ask?

Cuando llamas desde tu backend y la tarea es una sola extracción o clasificación sobre un texto o un documento. El Run aislado no carga herramientas ni contexto; agent.ask corre dentro de un flujo y el Met lo hace con todo lo que tiene.