Proxy de la API de GitHub que agrupa múltiples PAT para compartir el presupuesto de límite de tasa, almacena en caché las respuestas de lectura en memoria y pasa las mutaciones con la autenticación del propio cliente. Diseñado para configuraciones multi-agente (OpenAB, OpenClaw, coding agents personalizados) que comparten los mismos repos.

ghpool es un proxy de la API de GitHub diseñado para configuraciones multi-agente donde varios coding agents (bots de OpenAB, workers de OpenClaw, agents personalizados) comparten los mismos repos y agotan los límites de tasa por token de GitHub.
Hace tres cosas:
Authorization del cliente y se reenvían con ese token, así el log de auditoría de GitHub aún muestra qué agent hizo la escrituraEsta plantilla despliega ghpool como un servicio solo interno:
Los servicios hermanos se conectan usando estas variables de entorno (auto-expuestas):
| Variable | Valor |
|---|---|
GHPOOL_HOSTNAME | hostname del contenedor (p. ej. ghpool.zeabur.internal) |
GHPOOL_BASE_URL | URL base completa (p. ej. http://ghpool.zeabur.internal:8080) |
Cómo enrutar un cliente a través de ghpool depende de qué sea:
Coding agents (Claude Code, Codex, agents personalizados): la mayoría honra GITHUB_API_BASE para sobrescribir el endpoint de la API de GitHub.
export GITHUB_API_BASE=${GHPOOL_BASE_URL}
gh CLI: usa el shim ghp que viene con ghpool — un reemplazo drop-in que enruta lecturas a través de ghpool y escrituras a través del gh real. El gh plano no soporta completamente las sobrescrituras de URL base (comandos integrados como gh issue list usan GraphQL internamente y la evitan); ghp es la ruta confiable.
HTTP directo:
curl ${GHPOOL_BASE_URL}/repos/owner/repo
Las escrituras siempre requieren el header Authorization del propio cliente — ghpool nunca inyecta uno para mutaciones, así que el log de auditoría de GitHub aún muestra qué agent hizo la escritura.
La plantilla inicializa el pool con un PAT (GHPOOL_PAT_DEFAULT). Para añadir más:
GHPOOL_PAT_<ID> (p. ej. GHPOOL_PAT_BOT_CLAUDE, GHPOOL_PAT_BOT_CODEX) con el PAT como valor — el <ID> se convierte en el nombre de la identidad reportado por /statsCualquier variable de entorno que coincida con el prefijo GHPOOL_PAT_* se descubre automáticamente.
| Path | Propósito |
|---|---|
GET /<github-api-path> | GET proxy de la API REST de GitHub (agrupado + cacheado) |
POST /graphql | GraphQL — queries agrupadas+cacheadas, mutaciones pasan con autenticación del cliente |
GET /healthz | Verificación de salud |
GET /stats | Presupuestos del pool, ratios de aciertos de caché, estadísticas por identidad |
GHPOOL_ALLOWED_OWNERS se aplica: solicitudes a cualquier org/usuario no en esta lista devuelven 403, así un PAT filtrado solo expone los repos que listaste explícitamenteAuthorization del cliente (sin autenticación = 401), así el proxy no se puede usar como puerta de escritura anónimaghpool es un binario Rust único (imagen distroless) — extremadamente ligero. La memoria está dominada por la caché en memoria (max 10000 entradas por defecto). Si haces proxy de un volumen de solicitudes muy alto, aumenta la RAM proporcionalmente.