Toti es produits qu'auem lançat a Maladeta Studio acaben en aver besonh de parlar damb persones dehòra d'ua pestanha deth navegador. Lueira envia responses per WhatsApp. Era plataforma de marketplace envia confirmacions de compdes e actualizacions d'expedicion per corrèu electronic. Es aisines internes an besonh d'avisar quauquarrés quan un "job" falhe o se passe un lindau. Cadua d'aguestes causes ei ua foncionalitat petita en era madeisha — dinc que l'as construïda tres o quate còps e t'encuedes que solucions es madeishi problèmas ua e ua auta còp: reprovaments quan un provedidor falhe, "rate limits" entà que non te marquen eth domeni d'enviament, idempotença entà qu'un reprovament de "webhook" non envie eth madeish messatge dus còps, e un registre d'auditoria pr'amor que quauquarrés acabarà demanant "açò l'auem enviat de vertat?".
À compdar d'aguest an deishèrem de solucionar açò per produit e bastírem Maladeta Communications: ua plataforma independenta, multi-tenant e basada en eveniments qu'eth sòn solet trabalh ei recéber eveniments e convertir-les en messatges liurats, per WhatsApp o corrèu, damb generacion de contengut assistida per IA opcionau. Aguest article tracte de perqué la bastírem coma un servici pròpi, coma ei muntada, e un limit qu'auem agut cura de traçar ath sòn entorn.
1. Perqué cada produit que solucione açò solet non escale
Aguest ei eth madeish argument que recor d'auti articles d'aguest blog — eth dera facturacion electronica, eth des signatures eIDAS. Era complexitat que de vertat se compartís entre produits mereish èster absorbida un solet còp, en un solet lòc, en sòrta de solucionar-se de nau per equip, per repositòri, per data limita. Era liurason de messatges a exactament aguesta forma. Resend e WhatsApp (per mejan deth nòste provedidor, Kapso) an cadun es sues pròpies particularitats, "rate limits" e manèras de falhar. Encertar damb es reprovaments e eth "backoff" ei pro delicat entà non voler tres implementacions diferentas desincronizant-se entre eres. E tant compliance coma sostien acaben demanant, tard o d'ora, un registre durador de çò qu'ei estat enviat, a qui, e quan.
Atau qu'en sòrta de que cada produit apère dirèctament a Resend o Kapso, publique un eveniment. Eth motor de comunicacions decidís çò que se passe dempús.
2. Entren eveniments, gèssen messatges
Era forma deth sistèma ei un "pipeline" dirècte, apausadament avorrit:
Sources (Kapso webhook, Lueira event stream)
|
v
ConnectorRegistry
|
v
EventPublisher
|
+----+----+
| |
v v
Postgres Redis Stream
(audit) (real-time)
|
v
Consumer (XREADGROUP, consumer groups)
|
+----------+----------+
| | |
v v v
email Q whatsapp Q ai Q
| | |
v v v
EmailWorker WhatsAppWorker AIWorker
(Resend) (Kapso) (Claude routing/content)
Es fonts extèrnas — un "webhook" de Kapso, eth nòste provedidor de WhatsApp, e un "stream" d'eveniments que ven dera madeisha Lueira — arriben en un ConnectorRegistry, que les normalize e les balhe a un EventPublisher. Aqueth "publisher" escriu en dus lòcs: PostgreSQL, coma registre d'auditoria permanent e consultable — tot eveniment qu'age entrat jamès en sistèma, registrat de manèra durabla, sense excepcions — e un Redis Stream, entath tractament en temps reau.
Un "consumer" liege aqueth "stream" emplegant XREADGROUP, era primitiva de Redis entà un repartiment fisable, ath mens ua viatge, entà un grop de "workers". Repartís es eveniments en tres colas de BullMQ separadas — email, whatsapp e ai — cadua sostienguda peth sòn pròpi "worker". EmailWorker parle damb Resend. WhatsAppWorker parle damb Kapso. AIWorker gerís er encaminament e era generacion de contengut entàs casi qu'un messatge a de èster redigit en sòrta de solament retransmetut. Separar es colas vò díder qu'un provedidor de WhatsApp lent o tombat non blòque jamès era liurason de corrèu.
3. Un limit apausat: liurason, non rasonament
Se as liejut es articles anteriors d'aguest blog sus er agent d'IA de WhatsApp de Lueira e era sua configuracion de "function-calling", saberàs qu'eth RAG, era construccion de "prompts", es cridas ath modèl e es "embeddings" ja víuen en quauque lòc — en repositòri der assistent de Lueira, damb era sua pròpia instància de Qdrant e era sua pròpia orquestracion basada en Mastra. Aurie estat facil, en construir un servici nau que tanben tòque WhatsApp e tanben tòque Claude, deishar que ua part d'aqueth rasonament s'escolèsse de nau ací. Estèrem explicits qu'açò non auie de passar. Era guida de contribucion d'aguest repositòri ditz, literaument: "Es agents d'IA, es "prompts", es cridas ath modèl, es "embeddings" d'articles, Qdrant e era transcripcion apertien ath repositòri der assistent de Lueira. Non reintroduïsques ací un servici d'IA locau ne ua dependéncia dirècta deth SDK de Mastra/Qdrant".
Çò qu'açò vò díder ena practica: quan er AIWorker a besonh de capacitat d'IA reau — respóner a un messatge, generar contengut, transcríuer àudio — apère ar assistant-service independent de Lueira per HTTP, contra "endpoints" coma /ai/reply, /ai/generate e /ai/transcribe. Aguest motor decidís se e com encaminar e enviar un messatge. Ei infrastructura de liurason, non un dusau lòc a on se passe eth rasonament.
4. Escalar es pèças per separat
Coma era capa d'API/webhook, es "workers" des colas e eth "consumer" deth "stream" hèn trabalhs vertadèrament diferents, non an besonh d'escalar amassa. Ua variabla d'entorn PROCESS_TYPE — all, api, worker o consumer — contròle çò que vertadèrament executa ua instància de procès dada. En produccion, podem lheuar mès procèssi worker pendent un pic d'enviaments de WhatsApp sense tocar era capacitat der API, o escalar eth consumer s'eth Redis Stream comence a acumular retard.
Aguesta ei ua pèça d'infrastructura vertadèrament naua — la bastírem en 2026, e non a agut ans entà curar-se en produccion coma quauqui des nòsti auti sistèmas. Mès era sua forma ja se sent corrècta: un solet lòc qu'absorbís es parts fastigosas e partatjadas d'enviar un messatge de manèra fisabla, e ua linha fèrma que lo manten dehòra deth negòci de decidir çò que aqueth messatge aurie de díder.