Agente de IA para WhatsApp com NestJS e Zavu
Combine a arquitetura modular do NestJS com o AI Gateway da Zavu para oferecer suporte inteligente em WhatsApp.
Setup
bashnpx nest new whatsapp-agent cd whatsapp-agent npm install @zavudev/sdk @nestjs/config
ConfigModule
src/app.module.ts:typescriptimport { Module } from '@nestjs/common' import { ConfigModule } from '@nestjs/config' import { WebhookModule } from './webhook/webhook.module' @Module({ imports: [ConfigModule.forRoot({ isGlobal: true }), WebhookModule] }) export class AppModule {}
Service
src/webhook/zavu.service.ts:typescriptimport { Injectable } from '@nestjs/common' import Zavudev from '@zavudev/sdk' import { ConfigService } from '@nestjs/config' @Injectable() export class ZavuService { private client: Zavu constructor(private config: ConfigService) { this.client = new Zavu({ apiKey: this.config.get('ZAVUDEV_API_KEY') }) } async reply(messageId: string, contactId: string) { return this.client.senders.agent.reply({ senderId: this.config.get('ZAVU_SENDER_ID'), messageId, contactId }) } }
Controller
src/webhook/webhook.controller.ts:typescriptimport { Controller, Post, Req, Res, Headers, HttpException } from '@nestjs/common' import * as crypto from 'crypto' import { ZavuService } from './zavu.service' @Controller('webhooks') export class WebhookController { constructor(private readonly zavu: ZavuService) {} @Post('whatsapp') async handle(@Req() req, @Res() res, @Headers('x-zavu-signature') signature: string) { const secret = process.env.ZAVU_WEBHOOK_SECRET const digest = crypto.createHmac('sha256', secret).update(req.rawBody).digest('hex') if (!crypto.timingSafeEqual(Buffer.from(digest), Buffer.from(signature || ''))) { throw new HttpException('invalid signature', 401) } const event = req.body if (event.type === 'message.received') { await this.zavu.reply(event.data.message.id, event.data.contact.id) } res.json({ status: 'ok' }) } }
Ative rawBody em main.ts:
typescriptapp.use(json({ verify: (req: any, res, buf) => (req.rawBody = buf) }))
Criando o agente
typescriptawait zavu.senders.agent.create({ senderId: process.env.ZAVU_SENDER_ID, name: 'Nest Support', provider: 'zavu', model: 'gemini-pro', systemPrompt: 'Responda clientes SaaS em PT-BR', contextWindowMessages: 10, enabled: true })
Knowledge bases e ferramentas
client.senders.agent.knowledge_bases.attachpara anexar docsclient.senders.agent.tools.createpara expor APIs internas (ex.: verificar pedido)
Observabilidade
Use interceptors Nest para logar cada execucao do agente e envie metricas ao Prometheus ou OpenTelemetry.
Deploy
- Dockerize (Node 20) e suba em Kubernetes/ECS
- Configure secrets via AWS SSM/Azure Key Vault
- Configure auto scaling baseado em QPS do webhook