Overview y stack
EMA Emi es un orquestador de agentes de IA que atiende a múltiples productos del ecosistema EMA con personalidades especializadas. Una sola URL, un solo deployment, varios agentes detrás. Cada producto cliente envía sus requests a la misma API; emaemi decide qué agente responder según la app de origen y qué tools tiene permitidas.
Estado del producto
Sección titulada «Estado del producto»Versión 0.2.0 — Wave 3 (EMI as a Service) cerrada.
| App | Agente | Status | Tools |
|---|---|---|---|
emahealth | sales | GA | lead_management |
emaclinic | support | GA | aidbox (per-tenant) |
emavault | analytics | GA | supabase-vault |
emalab | lab_assistant | alpha | (planned Wave 5+) |
emapath | pathology_assistant | planned | (Wave 6) |
emawell | wellness_coach | not implemented | (Wave 5+) |
Próximas waves:
- Wave 4: UI en Vault para gestionar
tenant_emi_access, mover pricing aemashared.model_pricing, eliminar depsFHIR_*legacy. - Wave 5+: tools reales para
lab_assistant(validación Valab, abnormal explainer) ywellness_coach. - Wave 6:
pathology_assistantcon CAP synoptic + ICD-O-3.
| Capa | Tecnología | Versión |
|---|---|---|
| Runtime | Cloudflare Workers | — |
| Framework | Hono | ^4.7 |
| Lenguaje | TypeScript | 5+ |
| Modelo LLM | Claude (vía fetch nativo, no SDK) | claude-haiku-4-5-20251001 |
| FHIR client | Aidbox per-tenant + AES-GCM credentials | — |
| Audit / activación | Supabase emashared | — |
| Vault data | Supabase emahub (Vault) | — |
| Tests | Vitest + coverage-v8 | ^4.1 |
| Deploy | Wrangler | ^4 |
Dominio productivo
Sección titulada «Dominio productivo»https://emi.emahealth.io/api/chat
Decisiones formales
Sección titulada «Decisiones formales»17 decisiones registradas (F001-F017) en docs/decisions.md del repo,
fechadas 2026-05-08. Las más importantes:
- F002 —
requiresTenant=falsepara emahealth/emavault (visitantes anónimos / dashboards sin tenant). - F003 —
checkAccesses fail-closed; el rate limit es fail-open. - F005 — nunca loguear prompt/response completos ni PHI.
- F007-F009 — credenciales Aidbox encriptadas con AES-GCM, master key versionada, cache TTL 5 min in-memory por isolate.
- F010-F012 — sales agent escribe leads en
emavault.leadscon upsert por email. - F014-F015 — pricing hardcoded en
cost.ts, tokens agregados a través del tool loop completo.