Funciones y flujos
Haz que tu Met llame a tu propio backend: una Función con handler HTTP o un flujo, vinculada al Met.
Una Función IA es UNA herramienta que el Met puede llamar (scopes functions:read / functions:write). Cuando el Met decide usarla, recolecta los argumentos según tus parameters y dispara el handler que definiste. Así conectas tu propio backend a la conversación.
Parámetros: el schema de la tool
Cada FunctionParameter entra al JSON schema que ve el LLM. Solo name es obligatorio:
const parameters = [
{ name: 'sku', description: 'Código de producto', required: true },
{ name: 'moneda', description: 'Moneda del precio', enum_values: ['COP', 'USD'] },
];
Campos disponibles: name, description, required, type ('string' | 'number' | 'boolean'), enum_values (lista cerrada; null/[] = libre) y save_to (el field_key del contacto donde persistir el valor recolectado, o null para no guardar).
Una Función sin handler queda inerte (no invocable). Tienes dos caminos para dárselo.
A) Handler HTTP directo
El camino más corto para pegarle a tu endpoint: pasa http. Los argumentos que el Met recolecta viajan como body JSON a tu URL.
const fn = await met.functions.create({
name: 'consultar_precio',
description: 'Consulta el precio vigente de un SKU en nuestro backend',
prompt: 'Úsala cuando el cliente pregunte por el precio de un producto.',
parameters,
http: {
url: 'https://api.tu-empresa.com/precios',
method: 'POST',
auth_workspace_variable: 'api_token',
sign_secret_variable: 'firma_precios',
timeout_ms: 15000,
},
});
Los secretos NO van en crudo.
auth_workspace_variable(Bearer token, se envía comoAuthorization) ysign_secret_variable(secreto de firma) se referencian por nombre de variable del workspace. Créalas antes conmet.variables.set('api_token', 'sk_live_…', { encrypted: true })— ver Variables del workspace.
Meteor firma cada llamada con X-Met-Signature (mismo HMAC que los webhooks). Verifícala en tu endpoint sin escribir HMAC a mano:
const handle = met.tools.createHandler(process.env.FIRMA_PRECIOS);
app.post('/precios', (req, res) => {
let call;
try { call = handle(req.rawBody, req.headers['x-met-signature']); }
catch { return res.status(400).end(); }
res.json({ result: buscarPrecio(call.arguments) });
});
Los headers estáticos NO sensibles van en headers. timeout_ms es opcional (default 30s, tope 60s).
B) Flujo (flow_id)
Cuando necesitas lógica multi-paso, ramas o varios nodos, apunta la Función a un Meteor Flow (scopes flows:write / automations:execute). El patrón es create → update con el lienzo → publish:
const flow = await met.flows.create({ name: 'llamar-mi-api' });
await met.flows.update(flow.id, {
draft_definition: {
nodes: [{ id: 'call', type: 'http.request', url: 'https://api.tu-empresa.com/precios' }],
edges: [],
},
});
await met.flows.publish(flow.id); // el Met solo invoca la versión publicada
const fn = await met.functions.create({ name: 'consultar_precio', parameters, flow_id: flow.id });
El nodo http.request puede firmar la petición con X-Met-Signature igual que el handler directo. Prueba el flujo antes de publicar con met.flows.run(flow.id, { use_draft: true }).
Vincular al Met
Crear la Función no la activa en ningún Met: hay que vincularla.
await met.functions.link(agentId, fn.id); // idempotente
await met.functions.listForAgent(agentId); // → [12, 34] (ids vinculados)
await met.functions.unlink(agentId, fn.id); // desvincular
Para confirmar que tu Función quedó disponible como tool de un Met, usa
met.agents.tools(agentId): devuelve cada herramienta con susource('function'para las tuyas) y si estádisabled. Ver Mets y herramientas.
End-to-end
import Met from '@meteor.ia/sdk';
const met = new Met(process.env.MET_API_KEY, { workspaceId: 130 });
// 1. Secreto por variable (no en crudo)
await met.variables.set('api_token', process.env.API_TOKEN, { encrypted: true });
// 2. Función con handler HTTP
const fn = await met.functions.create({
name: 'consultar_precio',
description: 'Consulta el precio vigente de un SKU',
parameters: [{ name: 'sku', description: 'Código de producto', required: true }],
http: { url: 'https://api.tu-empresa.com/precios', method: 'POST', auth_workspace_variable: 'api_token' },
});
// 3. Vincular al Met y probar con un run que la use
await met.functions.link(agentId, fn.id);
const run = await met.runs.create({ met: 'Valeria', input: '¿Cuánto vale el SKU AB-12?' });
console.log(run.output); // el Met llamó a tu endpoint y respondió con el precio
Ver Ejecutar Mets (Runs) para el detalle de runs.create.