From 1d9484a1e0b3aa8b10d5384c319ea52f13828f4a Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Sun, 5 Jul 2026 08:51:13 -0500 Subject: [PATCH] Fix NLU flow: media_id, upload perm, catalog filter, nlu_description field - WpWebhook: inject media_id into context before calling BotRouter so MediaTranscriber can download audio/image (was passing caption='') - BotRouter: use context['media_id'] for transcription (non-breaking fallback) - AiBot::processMedia: fix canUpload to include permType 1 (solo reporta) - AiBot::buildFlowCatalog: include text flows that have nlu_description set - DashboardController + index.php: add nlu_description field per flow card Co-Authored-By: Claude Sonnet 4.6 --- admin/DashboardController.php | 5 +++++ admin/v1/WpWebhook.php | 2 ++ public/index.php | 4 ++++ services/AiBot.php | 7 ++++--- services/BotRouter.php | 5 +++-- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/admin/DashboardController.php b/admin/DashboardController.php index dc0fc4a..4fd5d5e 100644 --- a/admin/DashboardController.php +++ b/admin/DashboardController.php @@ -3383,6 +3383,7 @@ HTML; $flowIdx = 0; foreach ($flows as $fk => $flow) { $ft = $flow['type'] ?? 'text'; + $fNluDesc = self::h($flow['nlu_description'] ?? ''); $fMsg = self::h($flow['message'] ?? ''); $fFn = $flow['function'] ?? 'forward_to_ai'; $fMenu = $flow['menu'] ?? ''; @@ -3498,6 +3499,8 @@ HTML;
ID: + 🧠 NLU: +
@@ -4028,6 +4031,8 @@ function addFlowCard() { '
' + '
' + ' ID: ' + + ' 🧠 NLU:' + + ' ' + ' ' + '
' + '
' + diff --git a/admin/v1/WpWebhook.php b/admin/v1/WpWebhook.php index 7ae675a..7a8ab81 100644 --- a/admin/v1/WpWebhook.php +++ b/admin/v1/WpWebhook.php @@ -480,6 +480,8 @@ class WpWebhook $isNew = self::saveConversation($ctx, $preview, $mediaId); self::forwardToCompany($ctx, $preview, $mediaId); if ($isNew && self::$currentCompany !== null) { + // media_id in context so BotRouter/MediaTranscriber can download the file + $ctx['media_id'] = $mediaId; BotRouter::route(self::$currentCompany, $ctx, $caption, $type); } } diff --git a/public/index.php b/public/index.php index ca13f77..eec0def 100644 --- a/public/index.php +++ b/public/index.php @@ -395,6 +395,7 @@ $routes = [ // Flows $flowKeys = $_POST['flow_key'] ?? []; + $flowNluDescs = $_POST['flow_nlu_desc'] ?? []; $flowTypes = $_POST['flow_type'] ?? []; $flowMessages = $_POST['flow_message'] ?? []; $flowFunctions = $_POST['flow_function'] ?? []; @@ -443,6 +444,9 @@ $routes = [ $f = ['type' => $ftype]; + $nluDesc = trim($flowNluDescs[$i] ?? ''); + if ($nluDesc !== '') $f['nlu_description'] = $nluDesc; + if ($ftype === 'text') { $f['message'] = trim($flowMessages[$i] ?? ''); diff --git a/services/AiBot.php b/services/AiBot.php index f79b550..0ff71db 100644 --- a/services/AiBot.php +++ b/services/AiBot.php @@ -17,7 +17,7 @@ class AiBot default => 'un archivo', }; - $canUpload = $permType === 3; + $canUpload = in_array($permType, [1, 3], true); // 1=solo reporta, 3=ambos $permDesc = $canUpload ? 'El usuario tiene permisos para subir información y reportes.' : 'El usuario solo puede recibir información o descargar informes, NO puede subir archivos.'; @@ -382,8 +382,9 @@ PROMPT; if ($isUpload && !in_array($permType, [1, 3], true)) continue; if ($isDownload && !in_array($permType, [2, 3], true)) continue; - // Skip purely internal/navigation flows - if (in_array($type, ['text', 'image'], true) && !$isUpload && !$isDownload) continue; + // Skip internal/navigation flows unless they have an explicit NLU description + $hasNluDesc = isset($flow['nlu_description']) && $flow['nlu_description'] !== ''; + if (in_array($type, ['text', 'image'], true) && !$isUpload && !$isDownload && !$hasNluDesc) continue; $label = $flow['nlu_description'] ?? $labels[$key] ?? $key; $dir = $isUpload ? 'subida' : ($isDownload ? 'descarga' : ''); diff --git a/services/BotRouter.php b/services/BotRouter.php index a390b91..9ac3e4c 100644 --- a/services/BotRouter.php +++ b/services/BotRouter.php @@ -118,9 +118,10 @@ class BotRouter } if ($nluEnabled && in_array($inputType, ['audio', 'image'], true)) { + $mediaId = $context['media_id'] ?? $input; // injected by WpWebhook::handleMedia $text = $inputType === 'audio' - ? MediaTranscriber::transcribeAudio($input, $company) - : MediaTranscriber::extractFromImage($input, $company); + ? MediaTranscriber::transcribeAudio($mediaId, $company) + : MediaTranscriber::extractFromImage($mediaId, $company); if ($text !== null && trim($text) !== '') { self::log("NLU media [{$inputType}]: texto extraído → \"{$text}\"");