new-term-radar
신규 AI 용어를 매일 추적, X·Hugging Face·GitHub 등에서 모델·제품·레포 이름을 빠르게 수집
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Web app para monitorear y optimizar Facebook e Instagram Ads con agentes autónomos. Está construida con Next.js, React, TypeScript y Supabase.README 전문 보기 ↗
Web app para monitorear y optimizar Facebook e Instagram Ads con agentes autónomos. Está construida con Next.js, React, TypeScript y Supabase.
gpt-5-nano para todos por ahora)./api/cron/monitor.Pulso necesita Supabase también en desarrollo. Configura las secciones Supabase y Conectar Meta y después:
npm install
cp .env.example .env.local
npm run dev
Abre http://localhost:3000 y crea una cuenta. Las cuentas nuevas empiezan con datos demo hasta conectar Meta.
Crea un proyecto en Supabase.
En SQL Editor ejecuta, en orden, todas las migraciones de supabase/migrations (o supabase db push con Supabase CLI).
En Authentication → Sign In / Providers verifica que Email esté habilitado.
En Authentication → URL Configuration define el Site URL (por ejemplo http://localhost:3000) y agrega http://localhost:3000/auth/confirm en Redirect URLs.
En .env.local agrega los datos de Project Settings → API Keys:
SUPABASE_URL=https://tu-proyecto.supabase.co
SUPABASE_SECRET_KEY=sb_secret_...
SUPABASE_PUBLISHABLE_KEY=sb_publishable_...
Cómo funciona:
middleware.ts renueva la sesión en cada solicitud, envía a /login a quien no la tenga y responde 401 en las API. Cada ruta vuelve a verificar la sesión con getClaims() antes de tocar datos.owner_id único y obligatorio) con datos demo.503 en lugar de quedar abierta.SUPABASE_SECRET_KEY omite RLS: nunca le agregues el prefijo NEXT_PUBLIC_ ni la uses desde el navegador. El inicio de sesión ocurre en server actions, así que tampoco la llave publicable necesita llegar al navegador.
Pulso usa OpenAI como único proveedor. El motor de guardrails sigue siendo la autoridad final: los límites mensuales, la variación máxima de 20% y el bloqueo de borrado no dependen del modelo. OpenAI solo recibe métricas y contexto de campañas; entrega análisis, hasta tres acciones estructuradas y respuestas para el asesor conversacional.
Agrega la llave en el servidor (.env.local o Vercel):
OPENAI_API_KEY=sk-...
Por ahora todos los workspaces usan gpt-5-nano, el modelo más económico de OpenAI, definido en DEFAULT_AI_MODEL de lib/ai/openai.ts. Configuración → Modelo de IA muestra el modelo y avisa si la llave no tiene acceso a él. Para volver a permitir que cada workspace elija, agrega modelos a ALLOWED_AI_MODELS; el selector reaparece cuando hay más de uno.
Pulso llama la Responses API únicamente desde el servidor y desactiva el almacenamiento de las respuestas (store: false).
En Meta for Developers, abre tu aplicación y agrega Facebook Login y Marketing API.
Completa META_APP_ID y META_APP_SECRET.
Genera META_TOKEN_ENCRYPTION_KEY:
openssl rand -base64 32
En Facebook Login registra esta URI OAuth válida:
http://localhost:3000/api/meta/callback
Reinicia el servidor y selecciona Conexiones → Conectar con Meta.
La integración solicita ads_read, ads_management, business_management, pages_show_list, pages_read_engagement, pages_manage_ads e instagram_basic. El token inicial se intercambia por uno de larga duración y se cifra antes de guardarse. En modo desarrollo solo funcionará con administradores, desarrolladores o testers de la app. Para ofrecer el SaaS a clientes externos habrá que completar App Review y los requisitos de acceso de Marketing API indicados por Meta.
La versión de Graph API se configura mediante META_GRAPH_VERSION; el valor inicial es v26.0 para evitar acoplarla al código.
Cada sincronización también trae los fondos de cada cuenta publicitaria: si es de prepago, el método de pago tal como lo describe Meta, el saldo disponible, el gasto acumulado y el tope de gasto. El Resumen los muestra y avisa cuando una cuenta de prepago tiene $0, porque sus anuncios no se entregan. Una recarga en el Administrador de anuncios aparece en Pulso cuando Meta ya la acreditó y se vuelve a sincronizar.
Cada ciclo sigue el mismo recorrido:
lib/optimizer.ts) y, si OpenAI está configurado, suma hasta tres acciones estructuradas propuestas por el modelo.Reglas del planeador:
| Situación | Acción |
|---|---|
| Gasto del mes ≥ límite | Pausa todas las campañas activas |
| Proyección a fin de mes > límite | Reduce primero las campañas con menor rendimiento hasta ajustar el ritmo |
| Más de 3 días de presupuesto sin resultados | Pausa la campaña |
| ROAS < 80% de la meta (o CPA 50% sobre el promedio) con 2 días de datos | Reduce 20% |
| Anuncio con frecuencia ≥ 4 y CTR < 70% de la mediana | Pausa el anuncio (fatiga) |
| Anuncio sin resultados que gastó más que su campaña en un día mientras otros convierten | Pausa el anuncio |
| ROAS ≥ 120% de la meta, tendencia estable y margen en el límite | Aumenta hasta 15% |
| Campaña que Pulso pausó por el límite mensual, en un mes nuevo con margen | La reactiva |
| Anuncio que Pulso pausó por fatiga hace 7 días o más, con su campaña activa | Lo reactiva |
Pulso solo deshace pausas propias: nunca reactiva lo que pausaste tú (desde Pulso o desde Meta) ni las pausas por falta de resultados, que no generan datos nuevos mientras están detenidas. Cualquier pausa vigente se puede reactivar con Reactivar en el registro de cambios, siempre sujeta a los guardrails.
Guardrails obligatorios:
budgetChanges).Un candado en el workspace impide que el cron y una ejecución manual optimicen al mismo tiempo. La ROAS objetivo se configura por negocio en Configuración.
npm test # pruebas del planeador y los guardrails
El monitor se ejecuta con GET /api/cron/monitor y Authorization: Bearer $CRON_SECRET; ver Desplegar gratis en Vercel para programarlo.
En Campañas se administra todo sin abrir el Administrador de anuncios:
Cada cambio se aplica en Meta al momento (/api/control) y queda en el registro como tuyo, así los agentes nunca lo deshacen. Tus cambios no están sujetos al 20% de los agentes, pero sí al límite mensual, igual que cualquier reactivación. Cuando fijas un presupuesto, el 20% de los agentes se mide desde ese nuevo valor. Puedes pausar incluso el último anuncio de un conjunto; los agentes no.
Pausar anuncios fatigados no basta si el conjunto se queda sin anuncios frescos. Pulso los reemplaza:
La sincronización guarda el object_story_spec de cada anuncio. Solo se clonan anuncios de imagen con enlace (Página, enlace e imagen); los de video, carrusel o catálogo se renuevan desde el creador de campañas.
Con datos demo, el creador simula el lanzamiento. Con Meta conectado, siempre crea la campaña real: sube la imagen a la biblioteca de la cuenta publicitaria y arma campaña, conjunto (Advantage+ en México, 18–65 años), creativo con imagen y anuncio.
| Objetivo | Campaña | Conjunto | Botón del anuncio | Requisito |
|---|---|---|---|---|
| Ventas | OUTCOME_SALES | Conversión Purchase del Pixel, destino sitio web | Comprar → tu URL | Pixel/dataset con Purchase |
| Prospectos | OUTCOME_LEADS | LEAD_GENERATION en el anuncio | Registrarte → formulario instantáneo | Formulario activo en la Página |
| Mensajes | OUTCOME_ENGAGEMENT | CONVERSATIONS en WhatsApp o Messenger | Enviar mensaje | WhatsApp Business vinculado a la Página (solo WhatsApp) |
pages_manage_ads. Si conectaste Meta antes de este cambio, desconecta y vuelve a conectar para otorgarlo.Nueva campaña guía al dueño del negocio en cuatro pasos:
POST /api/ai/campaign-plan) propone objetivo, público, presupuesto diario y consejos, con la razón de cada uno. Las ubicaciones e intereses que sugiere se buscan en Meta y solo se usan los que Meta reconoce; si la IA propone Ventas sin Pixel o sin sitio web, se cambia a Mensajes.GET /api/meta/targeting-search). Con Advantage+ (predeterminado), la edad y los intereses son sugerencias que Meta puede ampliar, la edad mínima firme es de hasta 25 y el género lo optimiza Meta. Con público exacto se aplican tal cual.
Con Prospectos, si la Página no tiene formularios (o se quiere uno nuevo), Crear formulario nuevo arma el formulario instantáneo ahí mismo: nombre, título y descripción de bienvenida, datos que pide (nombre, correo, teléfono, ciudad), hasta 3 preguntas para calificar (respuesta libre u opción múltiple), tipo Más volumen o Mayor intención, aviso de privacidad (Meta lo exige; Pulso lo recuerda por negocio) y pantalla de agradecimiento con botón al sitio web. Sugerir con IA (POST /api/ai/lead-form) propone los textos y las preguntas. Se crea en la Página con POST /api/meta/lead-forms (token de Página vía pages_manage_ads) y queda elegido para la campaña.POST /api/ai/ad-copy) envía a la IA una versión reducida de la foto o un cuadro del video y devuelve tres opciones con ángulos distintos.Los videos no pasan por Vercel (límite de 4.5 MB por petición): el navegador los sube a Supabase Storage (bucket privado pulso-ad-media, se crea solo) con una URL firmada (POST /api/media/video-upload), Meta los descarga con file_url, Pulso espera a que terminen de procesarse (hasta 150 s) y usa el cuadro capturado como portada. El archivo temporal se borra al terminar.
Publicaciones analiza lo que subes a tu página sin pauta. Actualizar publicaciones (POST /api/posts/sync) trae los últimos 90 días (hasta 50 por página, hasta 5 páginas) con published_posts: texto, fecha y hora, formato (foto, video, reel, álbum, enlace o solo texto), reacciones, comentarios, compartidos y la imagen. Cuando Meta lo permite, añade alcance, impresiones, clics y el desglose de reacciones desde las métricas de la publicación.
Con esos datos Pulso calcula, sin IA:
Analizar con IA (POST /api/ai/posts) suma la lectura del modelo: resumen, cuándo publicar, de 2 a 4 recomendaciones concretas e ideas de publicaciones, guardadas por página.
Las métricas de alcance requieren el permiso read_insights, que ahora se pide al conectar Meta: quien ya tenía Meta conectado debe volver a conectarlo para concederlo. Sin ese permiso, todo lo demás funciona igual con reacciones, comentarios y compartidos. Meta retira métricas de publicaciones con cada versión; si alguna deja de existir, la sincronización continúa sin ella.
En Campañas, el nombre de cada campaña abre su detalle leído en vivo de Meta (GET /api/campaigns/<id>), con tres pestañas:
GET /api/ads/<id>/preview) en feed móvil, feed de escritorio, Instagram, historias y Reels, con su título, texto y enlace. Se muestran hasta 6 anuncios; los enlaces de vista previa los genera Meta y caducan a los pocos minutos.El botón Abrir en Meta lleva a esa campaña en el Administrador de anuncios. Todo se lee en el momento, así que refleja cambios hechos fuera de Pulso sin esperar a la sincronización.
Además de la cuenta publicitaria, el menú lateral tiene un selector Página con las páginas que tienen campañas en esa cuenta (y las campañas sin página detectada). Al elegir una, el Dashboard (inversión, ingresos, ROAS, resultados y gráfica), Campañas y Agentes IA (tarjetas, revisión por campaña y el análisis campaña por campaña) muestran solo sus campañas. El límite mensual, los fondos y la proyección siguen siendo de toda la cuenta, porque así los cobra Meta. La gráfica por página suma las series diarias por campaña que guarda la sincronización (campaignMetrics), así que requiere sincronizar una vez después de actualizar. Nueva campaña preselecciona la página elegida.
Cada tarjeta en Agentes IA muestra un diagnóstico en vivo con los mismos umbrales con los que el agente actúa, su estado (al día, alerta o sin datos) y Ver decisiones, que abre su historial con el estado actual de cada cambio:
| Agente | Qué vigila y hace |
|---|---|
| Supervisor | Proyección del mes contra el límite; reduce el ritmo, pausa al tope y reactiva el mes siguiente |
| Estratega | Propuestas de estrategia con IA (requiere OpenAI) y registro de campañas creadas |
| Analista | Campañas con más de tres días de presupuesto sin resultados y anuncios que no convierten |
| Presupuesto | Campañas bajo la meta (reduce 20%) y la mejor sobre la meta (escala hasta 15%) |
| Audiencias | Frecuencia promedio por campaña; alerta desde 3 (solo avisa, no cambia nada) |
| Creativos | Anuncios con fatiga (frecuencia ≥ 4): pausa, reactiva tras 7 días y crea variantes con IA |
Cada análisis (manual o del monitor) deja en Agentes IA → Revisión por campaña un veredicto y un mensaje para todas las campañas del negocio, también las que van bien, ordenadas con los problemas primero y filtrables por veredicto:
| Veredicto | Cuándo |
|---|---|
| Atención | ROAS bajo 80% de la meta (o costo por resultado 50% sobre el promedio), gasto sin resultados o una reducción/pausa en este análisis |
| Vigilar | Ligeramente bajo la meta, o un cambio frenado por los límites |
| Aprendiendo | Todavía no junta dos días de presupuesto |
| Sin datos | No ha gastado |
| En meta / Excelente | En meta, o 20% por encima y candidata a escalar |
| Pausada / Borrador | Sin evaluación mientras no entregue; indica si la pausó Pulso y cuándo se reactivaría |
En Agentes IA, Analizar campaña por campaña primero revisa la cuenta completa (límite, ritmo y reglas) y después, con OpenAI configurado, analiza cada campaña por separado (POST /api/agents/review, una petición por campaña para no chocar con el tiempo máximo de Vercel). Cada tarjeta muestra el avance en vivo y se reemplaza con el veredicto y resumen de la IA (etiqueta IA) y, si los datos lo justifican, una acción que pasa por los mismos guardrails y respeta el modo: en Copiloto se aprueba o rechaza desde la misma tarjeta. Si la campaña ya tiene una acción de los agentes abierta o de las últimas 24 h, la IA no propone otra. Se puede detener a la mitad; los borradores y campañas sin gasto conservan la revisión por reglas.
Cada mensaje incluye la métrica contra la meta, anuncios con frecuencia alta y, si hubo, la acción de ese análisis con su estado. Se guarda solo la revisión más reciente por negocio, así los ciclos horarios no llenan el registro de actividad.
Cada ciclo registra, por negocio y por día, cuántas veces se revisó la cuenta, cuántas campañas y anuncios activos se vigilaron, las verificaciones del ritmo de gasto contra el límite mensual, las señales de riesgo (fatiga, gasto sin resultados, bajo rendimiento o ritmo excedido) y los cambios aplicados o frenados. Se guardan cinco semanas.
En Reportes, cada negocio tiene:
/r/<token> con los últimos 7 días (inversión, ingresos, ROAS, gráfica diaria), el uso del presupuesto del mes, las campañas y el trabajo de los agentes. El token es aleatorio (192 bits), no da acceso a Pulso, no se indexa y se puede generar de nuevo o desactivar en cualquier momento./api/cron/weekly-report) o con Enviar ahora.Para activarlo:
Ejecuta la migración supabase/migrations/202609130002_create_pulso_report_links.sql. Los enlaces viven en una tabla con RLS y sin políticas: solo el servidor los lee.
Crea una cuenta en Resend, verifica tu dominio y crea una API key.
Agrega en el servidor:
RESEND_API_KEY=re_...
REPORTS_FROM_EMAIL="Reportes <[email protected]>"
El cron semanal no reenvía un negocio si ya se envió en los últimos 6 días, y usa claves de idempotencia de Resend para que un reintento no duplique correos.
Cada llamada a OpenAI pasa por callModel (lib/ai/openai.ts) y queda en la tabla pulso_ai_logs de Supabase (migración 202609170001_create_pulso_ai_logs.sql):
analyze_campaigns, campaign_review, ask, ad_variants, campaign_plan, ad_copy, lead_form), ruta de la API, página de la app (dashboard, agents, campaigns, new-campaign) o monitor para el cron.lib/ai/usage.ts.entry: la solicitud enviada (las imágenes se reemplazan por su tipo y tamaño), la respuesta exacta de OpenAI, el resultado que usó Pulso y el error si falló (también se registran los errores de lectura, por ejemplo JSON inválido o respuesta cortada).Si el registro falla (por ejemplo, sin la migración aplicada), la función sigue funcionando y el error solo aparece en los logs del servidor. La tabla tiene RLS sin políticas: solo la clave secreta la lee. La vista pulso_ai_usage_daily suma el consumo por día de Ciudad de México.
El backoffice vive en backoffice/: una app Next.js aparte, protegida con usuario y contraseña, que muestra consumo por cliente, negocio, función y página, cada llamada con su JSON y exportación a JSON. Se despliega como otro proyecto de Vercel con Root Directory backoffice; los pasos están en backoffice/README.md. Está excluida del tsconfig, ESLint y build de la app principal.
El plan Hobby de Vercel ejecuta Next.js completo (páginas, API, middleware y cron). Es para uso personal o no comercial; cuando cobres a clientes, cambia a Pro.
Supabase
supabase/migrations.https://tu-app.vercel.app y agrega https://tu-app.vercel.app/auth/confirm en Redirect URLs.GitHub y Vercel
Variables de entorno (Vercel → Settings → Environment Variables, entorno Production):
| Variable | Valor |
|---|---|
NEXT_PUBLIC_APP_URL | https://tu-app.vercel.app |
SUPABASE_URL, SUPABASE_SECRET_KEY, SUPABASE_PUBLISHABLE_KEY | Desde Supabase → API Keys |
META_APP_ID, META_APP_SECRET, META_GRAPH_VERSION | Desde tu app de Meta |
META_TOKEN_ENCRYPTION_KEY | Un valor fijo; si cambia, los tokens de Meta guardados dejan de descifrarse |
CRON_SECRET | openssl rand -hex 32 |
OPENAI_API_KEY | Tu llave de OpenAI |
RESEND_API_KEY, REPORTS_FROM_EMAIL | Desde Resend, con dominio verificado |
NEXT_PUBLIC_APP_URL se fija al compilar: si la agregas después del primer despliegue, vuelve a desplegar.
Meta: en Facebook Login → Settings agrega https://tu-app.vercel.app/api/meta/callback a las URI de redirección OAuth válidas.
Monitoreo cada hora: Hobby solo permite el cron diario de vercel.json. Para revisar límites cada hora, crea un trabajo en cron-job.org:
https://tu-app.vercel.app/api/cron/monitor, método , cada hora.npm run typecheck
npm run lint
npm test
npm run build
GETAuthorization: Bearer <tu CRON_SECRET>.