Backend del proyecto multi-agente para programar quirófanos con protocolos de comunicación y eventos en tiempo real.
Stack
- FastAPI (API · ACP) · SQLAlchemy + SQLite (KB)
- SSE (AG-UI) · SPADE (A2A opcional) · Gemini (AI Adapter)
- Python 3.11+
Protocolos (rúbrica)
| Protocolo | Uso en el backend | Ubicación |
|---|---|---|
| ACP | API REST (consultas y reservas) | routers/*.py, app/main.py |
| AG-UI | Eventos en tiempo real (SSE) | app/events.py, routers/events.py |
| A2A | Mensajería entre agentes (SPADE) | agents/*.py |
| AGORA | Subasta/ofertas de sala/slot | agents/or_executor.py, selección en planner.py / reserve.py |
| ANP | Negociación de horarios/personal | agents/anesthesia_exec.py |
| MCP/LMOS | Esquemas de mensajes JSON | app/schemas.py |
Endpoints (ACP)
- Disponibilidad
GET /availability/rooms · GET /availability/staff?role=surgeon|anesthetist|nurse
- Casos
POST /cases · GET /cases · GET /cases/{id}
- Programación
POST /reserve/auto_schedule/{case_id} ➊ AGORA/IA → ➋ validación → ➌ reserva → ➍ CEYE → 🟢 eventos
- IA (sugerencias)
GET /ai/suggest/{case_id}
- Eventos (AG-UI)
GET /events (SSE · tipos: scheduled, supply_ok, supply_alert, conflict, error)
KB (modelo)
- ORRoom:
id,name,has_laparoscopy,has_c_arm - Staff:
id,name,role(surgeon|anesthetist|nurse),active - Procedure:
code,name,est_minutes,needs_* - Kit / ProcedureKit: disponibilidad y requerimientos
- Case:
procedure_code,priority(urgent|elective),asa,status - Reservation:
case_id,room_id,surgeon_id?,anesthetist_id?,start_ts,end_ts
↳ Regla: UNIQUE(room_id, start_ts, end_ts) (no solapes por sala)
Tres flujos (rúbrica)
1) Sala con subasta/propuesta (AGORA) → BIDs / PlanCandidate → mejor opción. 2) Personal (ANP) → negociación simple ante conflicto. 3) Material (ACP + AG-UI) → verificación CEYE → supply_ok/supply_alert.
Correr local
pip install -r requirements.txt
# .env
# DATABASE_URL=sqlite:///./app.db
# CORS_ORIGINS=http://localhost:5173
# GEMINI_API_KEY= # opcional
uvicorn app.main:app --reload
# Swagger: http://localhost:8000/docs