💬 Comment Responder (FB + IG)
Archivo: /Users/user/rifai-agents/agentes/social/comment-responder.ts · Plist: com.rifai.comment-responder (solo en ~/Library/LaunchAgents/, no en cron/) · Horario: cada 5 min (StartInterval 300s, RunAtLoad false)
Qué hace
Escanea cada 5 minutos los comentarios recientes en los últimos posts de la Página de Facebook y de la cuenta de Instagram Business de RifKings. Genera y publica una respuesta breve de community manager con un LLM local (modelo haiku vía gemini-cli), enriquecida con productos reales del catálogo (Brain). Filtra comentarios propios, spam de emojis y, sobre todo, detecta comentarios sensibles (quejas, "estafa", "no llegó", etc.) que NO responde automáticamente, sino que escala a Cristina por notificación. Mantiene estado para no responder dos veces el mismo comentario.
Cómo funciona
1. Carga .env y el estado data/comment-responder-state.json (lista de replied_ids e histórico).
2. Para cada plataforma (fb, ig): pide a Graph API los últimos ~10 posts/media con sus 20 comentarios.
3. Por cada comentario nuevo (no en replied_ids): salta si es de la propia página, si tiene menos de 4 caracteres, o si ya fue respondido.
4. Si isSensitive() detecta palabras rojas (estafa, fraude, devolución, roto, etc.) → notifica como social_negative_comment para que el humano responda manualmente y marca el comentario como tratado.
5. Si es normal: buildSystemPrompt() añade al prompt base 2 productos relevantes del Brain (getRelatedProducts), genera respuesta con claude() (haiku, máx ~30 palabras) y la publica vía Graph API (/{commentId}/comments en FB, /{commentId}/replies en IG).
6. Guarda estado (recorta a 500 ids / 200 entradas de historial) y, si hubo respuestas o escalados, manda resumen por el router.
Datos/APIs
- Meta Graph API v21.0 (Facebook Page + Instagram Business): leer posts/media+comentarios, publicar respuestas.
- LLM local
gemini-cli(/Users/user/rifai-agents/tools/gemini-cli, modelo haiku) — no consume API externa de pago. - Brain (
brain/tools/brain.js→getRelatedProducts) para contexto de catálogo. - notify-router (
tools/notify-router.js) eventossocial_engagementysocial_negative_comment. - Vars
.env:META_PAGE_ID(fallback 112610281241802),META_PAGE_TOKENoMETA_ACCESS_TOKEN,INSTAGRAM_BUSINESS_ID(fallback 17841401185807202).
Cómo probarlo
cd /Users/user/rifai-agents && npx tsx agentes/social/comment-responder.ts
No tiene flag FORCE; cada ejecución consulta la API real y publica respuestas reales. Para una prueba sin publicar, hazlo con un comentario de control o revisa primero el estado. Salida esperada: cabecera 💬 Comment Responder, conteo de comentarios por FB/IG, líneas ✅ respondido o escalados, y resumen 📊 Procesados / Respondidos / Saltados / Sensibles.
Si se rompe / recuperar
launchctl unload ~/Library/LaunchAgents/com.rifai.comment-responder.plist
launchctl load ~/Library/LaunchAgents/com.rifai.comment-responder.plist
Logs: /Users/user/rifai-agents/logs/comment-responder.out.log y .err.log. Causas típicas: token Meta caducado (errores en respuestas Graph), gemini-cli ausente, o estado corrupto (data/comment-responder-state.json). El plist NO está versionado en cron/; conviene copiarlo allí.
Cómo replicarlo
- Token de Página Meta con permisos
pages_manage_engagement+instagram_manage_comments. - IDs de Página FB e IG Business en
.env. - Binario LLM local
tools/gemini-cli(o sustituirclaude()por otra API). - Módulo Brain con
getRelatedProducts(o quitar el enriquecimiento). tools/notify-routerconfigurado para los eventos sociales.- Archivo de estado JSON para deduplicar + plist con
StartInterval300.