From c4c437abd619092279b06333be59ae8104c63b4e Mon Sep 17 00:00:00 2001 From: saridsa2 Date: Mon, 20 Apr 2026 15:25:35 +0530 Subject: [PATCH] fix(messaging): parse postbackText from Gupshup list_reply, pass selection ID to AI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gupshup list_reply has empty id field — postbackText carries our ID. Fixed ?? to || fallback. Also inject selection_id into user message so AI can extract doctorId from "doc:{uuid}:{name}" format. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/messaging/messaging.controller.ts | 2 +- src/messaging/messaging.service.ts | 8 +++++++- src/messaging/providers/gupshup.provider.ts | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/messaging/messaging.controller.ts b/src/messaging/messaging.controller.ts index 26c6dc3..b3e4738 100644 --- a/src/messaging/messaging.controller.ts +++ b/src/messaging/messaging.controller.ts @@ -13,7 +13,7 @@ export class MessagingController { @Post('webhook') async webhook(@Body() body: any) { - this.logger.log(`[WA-WEBHOOK] Received: ${JSON.stringify(body).substring(0, 300)}`); + this.logger.log(`[WA-WEBHOOK] Received: ${JSON.stringify(body).substring(0, 500)}`); if (!this.provider.validateWebhook(body)) { this.logger.warn('[WA-WEBHOOK] Validation failed — ignoring'); diff --git a/src/messaging/messaging.service.ts b/src/messaging/messaging.service.ts index 3041239..9904640 100644 --- a/src/messaging/messaging.service.ts +++ b/src/messaging/messaging.service.ts @@ -72,9 +72,15 @@ export class MessagingService { // 3. Load conversation history const history = await this.conversation.getHistory(phone); + // For interactive replies, include the selection ID so the AI can + // extract structured data (e.g. "doc:{uuid}:{name}" → doctorId) + let userContent = text; + if (message.type === 'interactive_reply' && message.interactiveReply?.id) { + userContent = `[Selected: ${message.interactiveReply.title}] (selection_id: ${message.interactiveReply.id})`; + } const messages = [ ...history.map(h => ({ role: h.role as 'user' | 'assistant', content: h.content })), - { role: 'user' as const, content: text }, + { role: 'user' as const, content: userContent }, ]; // 4. Build system prompt diff --git a/src/messaging/providers/gupshup.provider.ts b/src/messaging/providers/gupshup.provider.ts index dbab47e..a8020ac 100644 --- a/src/messaging/providers/gupshup.provider.ts +++ b/src/messaging/providers/gupshup.provider.ts @@ -47,12 +47,14 @@ export class GupshupProvider extends MessagingProvider { } if (msgType === 'button_reply' || msgType === 'list_reply') { + // Gupshup sends postbackText (our ID), id can be empty string + const replyId = payload.payload?.postbackText || payload.payload?.id || payload.payload?.reply || ''; return { phone, name, text: payload.payload?.title ?? '', type: 'interactive_reply', interactiveReply: { - id: payload.payload?.id ?? payload.payload?.postbackText ?? '', + id: replyId, title: payload.payload?.title ?? '', }, rawPayload: body,