feat: media via AI, text via NormalBot only, ai_for_media toggle

- Text/interactive/button messages → NormalBot only, never escalates to AI
- Image/audio/video/document → AiBot.processMedia() if ai_for_media enabled,
  else falls back to category greeting menu
- AiBot.processMedia() uses permission_type context so AI acknowledges uploads
  for perm 3 and redirects others to their menu
- WpWebhook.handleMedia now calls BotRouter so the bot responds to media
- Admin UI: checkbox toggle "Procesar imágenes y archivos con IA" in AI tab
- categoryMenuFallback() extracted in BotRouter as shared helper

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-28 13:28:56 -05:00
co-authored by Claude Sonnet 4.6
parent 4d7dd0f306
commit 6f799c3829
5 changed files with 95 additions and 10 deletions
+11
View File
@@ -2362,6 +2362,7 @@ HTML;
$greetingVal = self::h($config['greeting'] ?? '');
$fallbackVal = self::h($config['fallback'] ?? '');
$aiPromptVal = self::h($config['ai_prompt'] ?? '');
$aiForMediaChecked = ($config['ai_for_media'] ?? true) ? 'checked' : '';
$aiModelVal = self::h($config['ai_model'] ?? 'gpt-4o-mini');
$aiTempVal = self::h((string)($config['ai_temperature'] ?? 0.7));
$aiProviderVal = self::h($config['ai_provider'] ?? '');
@@ -2618,6 +2619,16 @@ HTML;
<textarea name="ai_prompt" rows="4" placeholder="Eres un asistente virtual de {$cName}...">{$aiPromptVal}</textarea>
<div style="font-size:11px;color:#7a8291;margin-top:3px">Instrucciones que define el comportamiento de la IA</div>
</div>
<div class="form-group">
<label style="display:flex;align-items:center;gap:10px;cursor:pointer">
<input type="checkbox" name="ai_for_media" value="1" {$aiForMediaChecked}>
<span>Procesar imágenes y archivos con IA</span>
</label>
<div style="font-size:11px;color:#7a8291;margin-top:3px">
Cuando el usuario envía imagen, audio o documento, la IA analiza el contenido según los permisos del usuario.
Si está desactivado, el bot muestra el menú de categoría directamente.
</div>
</div>
</div>
<!-- ─── GENERAL ──────────────────────────────────────────────────────── -->