fix(telegram): keyword matching antes de Gemini para frases coloquiales de voz
'vamos a hacer una recarga' no era detectado por Gemini (thinkingBudget=0 + frases coloquiales). Agrega detectarPorKeywords() con regex para las 6 acciones principales. Gemini queda como fallback para casos ambiguos. También elimina asesor.solicitar del prompt de GeminiIntentService. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
aaf395af34
commit
1adfffd907
@@ -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:
|
||||
|
||||
@@ -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') {
|
||||
|
||||
Reference in New Issue
Block a user