3 agentes de IA en GitHub Actions sin coste de ejecución
Buenasssss . Como muchos sabéis, llevo un tiempo enfocando mi día a día en la cibers orientada a IA , al final toca seguir estudiando como todos sabéis y una de las cosas que más tiempo me consume es estar al tanto del panorama: nuevos CVEs en librerías de IA, papers de prompt injection, incidentes en prensa, regulación que cambia cada semana…
Después de varias mañanas perdiendo 30 min revisando feeds antes del primer café, decidí montarme un sistema que lo hiciera por mí. Tres agentes que cada día/semana me mandan a mi correo un resumen filtrado y priorizado de lo que importa (por lo menos filtrado por la IA) a falta de ir puliéndolo un poquito más cada vez.
Lo mejor: corre solo en GitHub Actions, me llega al email desde mi propio dominio, y me cuesta 0 €/mes. Os enseño cómo lo he montado por si queréis adaptarlo a vuestro perfil.
El problema: el ruido del threat intel para perfiles especializados
Si tu rol toca ciberseguridad , los feeds tradicionales (Feedly, Twitter/X, newsletters) ya están bien. Pero si te has especializado — como estoy haciendo en mi caso , en IA + seguridad — te encuentras con:
- Demasiado ruido de noticias generalistas que no te aplican.
- Vulnerabilidades en librerías de IA específicas (LangChain, vLLM, Transformers…) que aparecen dispersas.
- Papers de arXiv que salen a cientos cada semana y solo unos pocos son relevantes.
- Cambios regulatorios (EU AI Act, NIST AI RMF) de los que no se realizan ningún post explicativo etc..
La solución: agentes que filtran usando un LLM como criterio(en este caso gemini , pero podéis usar el que queráis realmente).
Arquitectura del sistema

(imagen realizada con gemini , la verdad que queda muy muy bien xD)
Las decisiones clave de diseño:
- GitHub Actions como runtime → gratis (2000 min/mes), no tengo que mantener servidor, secrets cifrados, logs auditados.(Me plantee hacerlo en mi VPS donde alojo la web , pero al final también por probar y trastear me decidí porr github actions , al final estos agentes no consumen mucho)
- Gemini 2.5 Flash como LLM → 1500 requests/día gratis sin tarjeta de crédito. (importante lo de la tarjeta de crédito xD , con claude creo que por ejemplo esto sale a unos 5 dolares al mes máximo)
- Resend como gateway de email → 3000 emails/mes gratis, soporta DKIM/SPF en mi dominio. (si tu lista de envios es grande habría que plantearse otros métodos o pasar por caja)
- Cloudflare DNS → para la verificación del dominio en Resend (SPF + DKIM). Esto ya lo tenía implementado por el dominio.
⚙️ Por qué no en mi VPS: al final por temas de ser práctico , y en parte por la seguridad del VPS etc.. , meter cron jobs con API keys en el mismo host donde tengo el blog expuesto al público no es muy buena idea. Si mañana hay una RCE en algún plugin, no quiero que el atacante encuentre mi token. , que si , que esto es al final for fun como aquel que dice , pero…. tendríais que ver la cantidad de bots que me llegan al blog y DDoS que ya me han intentado tirar , y soy un mindundi.

Los 3 agentes
Agente 1 — Threat Intel diaria (CVEs)
Frecuencia: todos los días a las 06:00 UTC (~08:00 CET en verano).
Qué hace:
- Consulta la API de NVD filtrando CVEs publicados en las últimas 24h con keywords de mi stack:
tensorflow,pytorch,transformers huggingface,langchain,vllm,ollama,llama.cpp,pinecone,weaviate,qdrant,prompt injection,model context protocol, etc. - Consulta GitHub Security Advisories para ecosistemas
pipynpm. - Le pasa todo a Gemini con un prompt que clasifica los hallazgos en:
- 🔴 Crítico — parchear hoy
- 🟡 Atención — revisar esta semana
- 🟢 Informativo — mención breve
- ⚪ Falsos positivos — descartados con razón
Lo más útil: el filtrado de falsos positivos. Hay decenas de librerías que se llaman «transformers» pero no son la de Hugging Face. Gemini lo detecta y lo descarta con una línea de explicación.

Agente 2 — Research Digest semanal (White papers)
Frecuencia: lunes a las 07:00 UTC.
Qué hace:
- Consulta arXiv en categorías
cs.CR,cs.LG,cs.AI,cs.CLcon queries:prompt injection,jailbreak,LLM security,agent security,model poisoning,red team LLM,RAG security,tool calling security… - Recolecta posts de blogs de research vía RSS: Anthropic, OpenAI, DeepMind, Lakera, Protect AI, HiddenLayer, Trail of Bits, NCC Group, Schneier…
- Gemini selecciona los 5 papers más relevantes y los 5 posts de industria más importantes, descartando el ruido.
Resultado: un correo que se lee en 5 min con TL;DR + papers destacados + posts de industria + herramientas/releases nuevas.

Agente 3 — Cyber News Weekly (Noticias)
Frecuencia: viernes a las 07:00 UTC.
Qué hace:
- Consulta 14 portales: The Hacker News, Bleeping Computer, Dark Reading, The Record, Krebs on Security, SecurityWeek, CSO Online, CyberScoop, Help Net Security, MIT Technology Review, Wired Security, Ars Technica…
- Gemini filtra agresivamente buscando: noticias de IA + seguridad, regulación, incidentes de gran impacto, movimientos de la industria de IA security.
- Descarta sin piedad: listicles, press releases, advertorials, vulnerabilidades genéricas sin componente IA.
[CAPTURA 4 – Email del Cyber News Weekly mostrando el TL;DR y la sección "🤖 IA + Seguridad"]
Laboratorio: montando el sistema desde cero
Os dejo los pasos resumidos. El repo completo si lo queréis podéis contactarme y os lo paso.
1. Estructura del repo de GitHub

2. El cliente de Gemini (núcleo)
python
from google import genai
from google.genai import types
def analyze_with_gemini(data: dict) -> str:
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
safety = [
types.SafetySetting(category=c, threshold="BLOCK_ONLY_HIGH")
for c in (
"HARM_CATEGORY_DANGEROUS_CONTENT",
"HARM_CATEGORY_HATE_SPEECH",
"HARM_CATEGORY_HARASSMENT",
"HARM_CATEGORY_SEXUALLY_EXPLICIT",
)
]
response = client.models.generate_content(
model="gemini-2.5-flash",
contents=PROMPT.format(datos=json.dumps(data)),
config=types.GenerateContentConfig(
max_output_tokens=32000,
temperature=0.3,
safety_settings=safety,
),
)
return response.text
⚠️ Importante: el
BLOCK_ONLY_HIGHen safety settings es necesario porque tratamos contenido de seguridad (CVEs, exploits, ataques) que con los filtros por defecto de Gemini se queda bloqueado a mitad de respuesta, con esto estuve peleándome hasta que lo ví… , también cuidado con el max_output_tokens , si veis que queréis más info y se os corta el maail tendréis que aumentarlo, siempre teniendo cuidado y valorando el máximo que tenéis disponible dependiendo del LLM con el que trabajéis
3. El workflow de GitHub Actions
yaml
name: Threat Intel diaria
on:
schedule:
- cron: '0 6 * * *' # cada día a las 06:00 UTC
workflow_dispatch: # permite lanzarlo a mano
permissions:
contents: write # para commitear los informes
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install -r requirements.txt
- name: Ejecutar agente
id: run_agent
env:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
NVD_API_KEY: ${{ secrets.NVD_API_KEY }}
run: python -m agents.threat_intel
- name: Enviar email
env:
RESEND_API_KEY: ${{ secrets.RESEND_API_KEY }}
EMAIL_TO: ${{ secrets.EMAIL_TO }}
EMAIL_FROM: ${{ secrets.EMAIL_FROM }}
run: |
python -m agents.notify \
"${{ steps.run_agent.outputs.report_path }}" \
"Threat Intel IA - $(date +%Y-%m-%d)"
- name: Commit del informe
run: |
git config user.name "threat-intel-bot"
git config user.email "[email protected]"
git add reports/threat-intel/
git diff --staged --quiet || git commit -m "informe $(date +%Y-%m-%d)"
git push

4. El envío de email vía Resend
Para que el correo salga desde mi propio dominio ([email protected]) y no desde el sandbox de Resend, hay que verificar el dominio en Resend añadiendo 3 registros DNS:
- TXT SPF en
send.cibersecblog.com - TXT DKIM en
resend._domainkey.cibersecblog.com - MX en
send.cibersecblog.com
Ojo aquí: como mi correo principal es ProtonMail, era importante que estos registros NO tocasen los registros existentes de Proton. Como van todos a un subdominio (send.), conviven perfectamente.

5. Configurar los secrets en GitHub
En Settings → Secrets and variables → Actions del repo, añadir:
| Secret | Valor |
|---|---|
GEMINI_API_KEY | API key de https://aistudio.google.com/apikey |
RESEND_API_KEY | API key de https://resend.com/api-keys |
EMAIL_TO | Emails a los que queréis enviar |
EMAIL_FROM | CiberSec Bot <[email protected]> |
NVD_API_KEY | opcional, sube el rate limit de NVD (la verdad que esta parte es muy interesante) |

DMARC (por tema de seguridad realmente)
Como plus añadí también un registro DMARC a cibersecblog.com para tener visibilidad de intentos de spoofing:
Type: TXT
Name: _dmarc
Content: v=DMARC1; p=none; rua=mailto:[email protected]; pct=100
En modo p=none (monitoring) recibo reports semanales si alguien intenta hacerse pasar por mi dominio. Cuando lleve unas semanas con SPF + DKIM bien asentados, pasaré a p=quarantine o p=reject.
Consideraciones de seguridad
Aunque sea un sistema «hobby», hay cosas que conviene tener en cuenta:
- API keys en GitHub Secrets: cifradas en reposo, solo descifradas en memoria durante la ejecución del workflow (1-2 min). Cuando termina, la VM se destruye. No persisten en disco.
- Repo privado: los informes contienen análisis de vulnerabilidades. El repo es privado por defecto.
- Permisos mínimos: el workflow tiene
contents: writepara poder commitear informes, nada más. No tiene acceso a Issues, Pull Requests, Actions ni a otros repos. - Prompt injection en los datos de entrada: los CVEs y feeds RSS son texto controlado por terceros. Aunque es muy improbable, en teoría un atacante podría meter prompt injection en una descripción de CVE para alterar mi informe. Mitigación: el informe solo se manda a mí mismo, las acciones del workflow son inmutables (commit + email), no toma decisiones automatizadas con efecto externo.
- Rate limits del free tier: si en algún momento Gemini saturase su free tier, los agentes fallarían en silencio (sin email). Tengo monitoring vía Actions notifications.
Coste real del sistema
Llevo ya unos días con esto corriendo, números reales:
| Componente | Coste |
|---|---|
| GitHub Actions | 0 € (uso < 60 min/mes de los 2000 gratis) |
| Gemini 2.5 Flash API | 0 € (uso < 50 requests/mes de los 45.000 gratis) |
| Resend | 0 € (uso 3 emails/semana de 3000 gratis) |
| NVD + arXiv + RSS | 0 € (APIs públicas) |
| TOTAL | 0 €/mes |
Y lo más bonito: es escalable. Si añado un agente número 4 (regulación, por ejemplo) o subo la frecuencia, sigo dentro de free tiers cómodamente.
Conclusión
Lo que más me ha gustado de montar esto no es el ahorro (que también), sino que adapta el automatizar recopilación de noticias/papers etc.. a mi perfil concreto. Los servicios comerciales tipo SOCRadar o Recorded Future están guapos , pero no me convencían del todo.
Para los próximos posts ya estoy trabajando en:
- Agente 4 — Compliance IA: tracker mensual de EU AI Act, NIST AI RMF, ISO 42001 y normativas españolas.
- Agente 5 — Red team lab local: usando Ollama en mi GPU para probar prompt injection contra agentes en sandbox. (esto aportará bastante la duda es si consigo automatizarlo para tenerlo en algún sitio publicado y hacer pruebas con el desde cualquier sitio)
- Dashboard privado en mi VPS para tener histórico navegable de los informes.
Si queréis montar algo parecido y os atascáis (por ejemplo tema de sacar las api y donde configurar ya que en este post no he podido explicarlo por que si no parecería la biblia en verso), me podéis pegar un toque por Twitter o LinkedIn.
Nos vemos en el siguiente!