diff --git a/app/Services/GeminiIntentService.php b/app/Services/GeminiIntentService.php index 132d820..2083736 100755 --- a/app/Services/GeminiIntentService.php +++ b/app/Services/GeminiIntentService.php @@ -120,7 +120,6 @@ Acciones válidas — devuelve EXACTAMENTE una de estas: - credenciales.listar → ver contraseña, cómo entrar, "no puedo acceder", "dame el usuario", "mis datos de Netflix", "cómo me conecto" - historial.ver → historial de compras, "qué he comprado", "mis pedidos", "mis servicios activos" - perfil.ver → ver perfil, mis datos personales, cambiar información -- asesor.solicitar → hablar con persona, "quiero un asesor", "necesito ayuda de alguien", "soporte humano" Ejemplos de clasificación: "hacer recarga" → recarga.iniciar @@ -132,8 +131,6 @@ Ejemplos de clasificación: "hay promociones" → promo.listar "mis contraseñas" → credenciales.listar "no puedo entrar a mi cuenta" → credenciales.listar -"hablar con alguien" → asesor.solicitar - Texto del usuario: "{$texto}" Responde ÚNICAMENTE con JSON válido, sin markdown, sin explicación: diff --git a/app/Services/TelegramBotService.php b/app/Services/TelegramBotService.php index 02dd64e..d280fe2 100755 --- a/app/Services/TelegramBotService.php +++ b/app/Services/TelegramBotService.php @@ -1277,6 +1277,26 @@ class TelegramBotService // ─── Free text fallback ─────────────────────────────────── + private function detectarPorKeywords(string $texto): ?string + { + $patrones = [ + 'recarga.iniciar' => '/recargar|recarg[ao]|cargar\s*saldo|poner\s*plata|depositar|agregar\s*plata|quiero\s*saldo|meter\s*plata/i', + 'servicios.listar' => '/servicios?|planes?|cat[aá]logo|qu[eé]\s*tienen|qu[eé]\s*hay|netflix|disney|hbo|max|prime|spotify|crunchyroll|paramount|precio|cu[aá]nto\s*vale|cu[aá]nto\s*cuesta/i', + 'promo.listar' => '/promo|oferta|combo|descuento|especial|barato|econom/i', + 'credenciales.listar' => '/credencial|contrase[ñn]a|usuario|no\s*puedo\s*entrar|no\s*accedo|mis\s*datos|c[oó]mo\s*(entro|accedo|me\s*conecto)|mi\s*(cuenta|netflix|spotify)/i', + 'historial.ver' => '/historial|compras?|pedidos?|servicios?\s*activos?|qu[eé]\s*compr[eé]|mis\s*servicios/i', + 'perfil.ver' => '/perfil|mis\s*datos|mi\s*informaci[oó]n|cambiar\s*datos/i', + ]; + + foreach ($patrones as $accion => $patron) { + if (preg_match($patron, $texto)) { + return $accion; + } + } + + return null; + } + private function handleFreeText(string $chatId, array $state): void { if (! ($state['user_id'] ?? null)) { @@ -1284,8 +1304,18 @@ class TelegramBotService return; } - // Intentar detectar intención con Gemini antes de mostrar menú $texto = $state['data']['last_text'] ?? ''; + + // Detección rápida por palabras clave (más fiable que IA para frases coloquiales) + if ($texto) { + $accionLocal = $this->detectarPorKeywords($texto); + if ($accionLocal) { + $this->dispatchAction($chatId, $accionLocal, $state); + return; + } + } + + // Fallback: Gemini para frases ambiguas if ($texto) { $accion = app(GeminiIntentService::class)->detectar($texto, $state['user_id'] ?? null, 'telegram'); if ($accion && $accion['action'] !== 'menu.principal') {