vm@portfolio
Idioma
Caso de estudio · IA conversacional

Un vendedor que toma pedidos por chat — sin sueldo, sin horario.

Yerbi es un agente de pedidos B2B para una yerbatera. Lee lenguaje natural, cotiza desde el catálogo en vivo, arma el pedido, pide confirmación y lo escribe directo en el CRM — todo dentro de Telegram.

n8nClaudeSalesforce + ApexMongoDBTelegram
Yerbi
online
Message…
➤
El problema

Los pedidos llegan por chat — dispersos y a cualquier hora.

Un cliente escribe “hola”, después “mandame 2 tradicionales”, después “y 1 barbacuá” — tres mensajes, una intención. El equipo de ventas tiene horario; el cliente no. Para cuando alguien responde, ya le compró al que contestó primero.
  • →Los mensajes fuera de hora se acumulan de noche, fines de semana y feriados.
  • →La ventana que importa son minutos — mientras el cliente todavía está decidiendo.
  • →Pasar cada pedido al CRM a mano es lento y pierde trazabilidad.
  • →Un bot de menú ("marcá 1") se siente robótico y lo abandonan.
Cómo funciona

Siete nodos, una respuesta limpia.

El flujo es event-driven. Cada fragmento de Telegram se bufferea; una ventana de silencio corta los une antes de que el agente corra — así tres mensajes rápidos producen una única respuesta pensada.

Paso 1 · Ingesta

Telegram Trigger

Cada mensaje entrante golpea el webhook del bot y arranca una ejecución. Todavía no se responde nada.

Telegram TriggerExtract Fields
Paso 2 · Buffer

Agregar al buffer de mensajes

El fragmento se guarda en un buffer por chat (Redis / MongoDB) con timestamp. Esto es lo que permite tratar varios mensajes como uno.

Load BufferAppendSave Buffer
Paso 3 · Debounce

Esperar, y la compuerta de silencio

La ejecución espera unos segundos. Si llegó un fragmento más nuevo mientras tanto, esta corrida aborta — solo sobrevive la última. Eso garantiza exactamente una respuesta por ráfaga.

WaitReload BufferRead & Clear (gate)
Paso 4 · Identificar

¿Quién es este cliente?

Una búsqueda en Salesforce matchea el chat de Telegram con una Cuenta. Los clientes desconocidos van primero a un flujo de registro multi-paso.

Identify ClientClient Found?Registration
Paso 5 · Razonar

El agente Claude

El mensaje unificado más el contexto del cliente se le pasan al agente. Razona sobre la intención y decide qué herramienta llamar — con memoria de conversación entre turnos.

Prepare PromptAI AgentMemory
Paso 6 · Actuar

Las herramientas pegan a Salesforce

Tres herramientas hacen el trabajo real: leer el catálogo, leer pedidos anteriores y crear un pedido. La creación pasa por un endpoint Apex, así es una transacción atómica.

search_catalogget_orderscreate_order · Apex
Paso 7 · Responder

Una respuesta de vuelta

La respuesta del agente se envía a Telegram y el intercambio se loguea. Si el modelo alguna vez falla, una rama de fallback igual responde — al cliente nunca se lo deja en visto.

Send ResponseLog ConversationFallback
El proceso

La parte difícil no fue cablear la IA. Fue hacerla confiable.

Algunas de las decisiones y callejones sin salida en el camino:

Concurrencia

Mensajes fragmentados

Responder cada fragmento rompía la conversación. Mi primer buffer hacía un read-modify-write y, con mensajes casi simultáneos, a veces dejaba pasar dos corridas — una race condition real.

→ → Broker event-driven + una compuerta de ventana de silencio que une la ráfaga y deja que una sola corrida responda.
Confiabilidad

Frenar la alucinación

Un bot que inventa un precio o un número de stock es peor que no tener bot. Al principio improvisaba sin drama.

→ → Grounding estricto + temperatura baja: catálogo, precios y pedidos solo pueden venir de las herramientas, nunca del modelo.
Integridad

Pedidos que no pueden existir a medias

Un pedido creado por la mitad en el CRM es data corrupta. Tiene que ser todo o nada.

→ → Un endpoint Apex REST propio crea la Oportunidad y sus líneas en una sola transacción del lado del servidor.
Realidad de infra

El backend desapareció

La dev org gratuita de Salesforce se desactivó sola tras inactividad, llevándose toda la capa de datos justo antes de una demo.

→ → Reconstruí la capa de datos como un módulo mockeable para que el agente corra standalone, con la integración real al CRM guardada en código.
Resiliencia

Nunca dejar a un cliente en visto

Si el proveedor del modelo tiene un hipo, el cliente igual merece una respuesta.

→ → Dos reintentos más una rama de error con "on error → continue" — la respuesta está garantizada.
Producto

Sacar las reglas de negocio del prompt

Estados internos, confirmación explícita antes de crear, nunca exponer IDs internos — demasiado importante para dejárselo a un modelo de lenguaje.

→ → La lógica de negocio vive del lado del servidor en Salesforce; el prompt solo maneja la conversación.
Bajo el capó

El stack, y qué hace cada parte.

ServicioRolCosto
Telegram Bot APIRecibe y envía mensajes por webhookGratis
Anthropic · ClaudeRazonamiento del agente y tool-callingPago
Salesforce REST + ApexCatálogo, pedidos, creación atómicaDev org
MongoDB AtlasBroker de debounce + historial de conversaciónFree M0
n8nOrquesta todo el flujoSelf-host
Yerbi

Caso de estudio de portfolio. La marca "Yerbatera del Litoral" y todos los datos son ficticios; la integración (Telegram · n8n · Claude · Salesforce · MongoDB) es real. Hecho por Valentino Millimaci.