No updates detected yet. GitHub releases will appear here.
Reservas de clases para un gimnasio con asistente IA (API de Claude, salidas JSON validadas con Zod) · Next.js 14, TypeScript, Prisma, PostgreSQL
翻訳待ち
Loading the full README.
Read the full README ↗PWA para un gimnasio pequeño de clases reducidas (máx. 4 personas): los socios reservan y cancelan clases, el administrador gestiona clases, pagos y usuarios, y un asistente con IA (Claude API) hace de entrenador para el socio y de analista para el dueño.
▶ Probar la demo — entra con un clic como Socio o Admin, sin registrarte.
Next.js 14 · TypeScript · Prisma · PostgreSQL (Supabase) · NextAuth · Tailwind · Claude API (@anthropic-ai/sdk) · zod · Vercel
| Para quién | Qué hace |
|---|---|
Socio (/inicio, /perfil) | Rellena un mini cuestionario (objetivo, nivel, duración, alimentación) y recibe un plan de entreno semanal ajustado a su tarifa (1, 2 o 3 días) y a su asistencia real, más sugerencias de nutrición. |
Admin (/admin/ia) | Resumen semanal con lo que va bien, lo que preocupa y 3 acciones concretas, a partir de ocupación, pagos y gastos. |
Admin (/admin/ia) | Socios a reactivar (no vienen, cuota vencida, cancelaciones tardías): la IA redacta un aviso personal para cada uno y el admin lo revisa antes de enviarlo. |
flowchart LR
subgraph Navegador
UI["Páginas React<br/>/inicio · /perfil · /admin/ia"]
end
subgraph Servidor["Servidor Next.js (Vercel)"]
API["Route handlers<br/>/api/ai/plan · /api/ai/profile<br/>/api/ai/admin/resumen · /api/ai/admin/reactivacion"]
GUARD["Sesión NextAuth + rol<br/>límites de uso y caché"]
CTX["contexto.ts / admin.ts<br/>datos mínimos y cifras ya calculadas"]
CLIENT["client.ts · generarJSON()<br/>tool_choice + JSON Schema<br/>validación con zod"]
end
DB[("PostgreSQL · Prisma<br/>reservas, perfil fitness,<br/>planes y informes IA")]
CLAUDE["Claude API<br/>claude-haiku-4-5"]
UI -- "fetch (sin API key)" --> API
API --> GUARD
GUARD --> CTX
CTX -- "lee" --> DB
CTX --> CLIENT
CLIENT -- "ANTHROPIC_API_KEY<br/>solo en el servidor" --> CLAUDE
CLAUDE -- "JSON estructurado" --> CLIENT
API -- "guarda plan / informe" --> DB
API -- "JSON validado" --> UI
ADMIN en las de admin) y los límites de uso.generarJSON() llama a Claude obligándole a usar una tool con JSON Schema y valida la respuesta con zod. Si no cuadra, la ruta devuelve error en lugar de pintar algo roto.AiPlan, AiReport) y la interfaz lo pinta como tarjetas, no como texto plano.Código: src/lib/ai/ (cliente, contexto del socio, prompts de coach y admin) y src/app/api/ai/.
¿Por qué Claude?
tool_choice. La API devuelve directamente el objeto, y zod lo valida en mi lado.ANTHROPIC_MODEL sin tocar código.client.ts): cambiar de modelo o de proveedor afecta a un archivo, no a toda la app.¿Cómo protejo la API key?
ANTHROPIC_API_KEY solo se lee en src/lib/ai/client.ts, que solo se importa desde route handlers del servidor. No lleva prefijo NEXT_PUBLIC_, así que Next.js nunca la mete en el JavaScript del navegador..env (en .gitignore); en producción es una variable Secret de Vercel.ADMIN: el middleware protege las páginas /admin/* y cada ruta de API vuelve a comprobar la sesión y el rol por su cuenta.¿Cómo controlo el gasto?
429 al pasarse).AI_ADMIN_DAILY_LIMIT (20 por defecto).max_tokens acotado en cada llamada (1.500–3.000) y modelo pequeño por defecto.Administrador
Socio
This is the beginning of the README. Read the rest at the original. Read the full README ↗