Ir al contenido

Modelo, capacidades y límites

Todos los agentes usan Claude Haiku 4.5 (claude-haiku-4-5-20251001) como default. La elección está fija en src/agents/base.ts:

abstract class BaseAgent {
protected model = "claude-haiku-4-5-20251001";
// …
}

Cualquier agente puede sobrescribir model si necesita un upgrade (ej. Sonnet para razonamiento más denso). Hoy ningún agente lo hace.

CaracterísticaValor
FamiliaClaude 4.5
Versión exactaclaude-haiku-4-5-20251001
Context window200K tokens
Max output tokens8192 (configurable por agente, ver abajo)
Tool use
Visionsí (no se usa hoy en emi)
Idiomasmulti-idioma; respondemos según context.locale
Knowledge cutoffenero 2025
Latencia típica0.5-2s por turno (sin tool loop)

Cada agente extiende BaseAgent y puede ajustar maxTokens, tools y buildSystemPrompt. La tabla refleja el código actual:

AgenteAppmaxTokens outputToolsSystem prompt aprox
salesemahealth1024 (default)1 (lead_management)~80 líneas
supportemaclinic204811 (Aidbox per-tenant)~75 líneas
analyticsemavault20486 (Vault Supabase)~80 líneas
lab_assistantemalab10240 (alpha)~30 líneas
pathology_assistantemapath5120 (planned)~20 líneas
wellness_coachemawellretorna 501 antes de invocar Claude

Generan respuestas con datos tabulares (pacientes, finanzas) que requieren más espacio. Sales y lab/path ven menos complejidad por turno y se quedan en 1024 / 512.

buildSystemPrompt(context, turnCount) puede inyectar:

  • locale — fija el idioma de la respuesta
  • turnCount — cuántos turnos del usuario lleva la conversación
  • tenantId — para queries scope-adas (support / lab / path)
  • patientId / encounterId — clínico
  • sessionId, visitorEmail, referrer — sales (visitante anónimo)

Hoy la base implementación es identidad (return this.systemPrompt). Cada agente puede override para inyectar contexto cuando lo necesite.

Pricing hardcoded en src/lib/cost.ts. Refleja tarifas Anthropic publicadas a la fecha del cutover Wave 3 (2026-05-08). Wave 4 mueve esto a emashared.model_pricing para gestión vía Vault.

Tabla de precios (USD por millón de tokens)

Sección titulada «Tabla de precios (USD por millón de tokens)»
ModeloInputOutput
claude-haiku-4-5-20251001 (en uso)$1.00$5.00
claude-sonnet-4-6-20251101$3.00$15.00
claude-opus-4-7-20260301$15.00$75.00

Para un turn promedio de Haiku con tool loop de 1-2 iteraciones:

AgenteInput típicoOutput típicoCosto USD
sales~600 tokens~150 tokens$0.0014
support (con 1 tool)~1500 tokens~400 tokens$0.0035
analytics (con 1 tool)~1300 tokens~350 tokens$0.0031
lab_assistant~400 tokens~120 tokens$0.0010
pathology_assistant~300 tokens~80 tokens$0.0007

Una conversación típica de 5 turnos en support ronda $0.018 USD.

runAgent agrega tokens input + output a través de todas las iteraciones del tool loop, no solo el último turn (F015). El campo cost_usd en emi_invocations refleja el costo total de la invocación, incluidas las llamadas intermedias del tool use.

Turn 1

input · output

Tool result 1

Turn 2

input · output

Tool result 2

Turn 3

input · output

end_turn

Suma input + output

de los 3 turns

computeCost · USD

emi_invocations.cost_usd

Nunca se loguean ni persisten:

  • Prompts completos del usuario.
  • Responses completos del modelo.
  • Valores PHI (nombre del paciente, RUT, diagnósticos, etc.).

Lo que se persiste en emi_invocations.context_summary (summarizeContext):

  • Presencia de campos sensibles: has_patient_id: true, has_encounter_id: false.
  • Metadata no-PHI: action, locale, route.

Restricciones comunes inyectadas vía system prompt:

  • Sales: no inventar precios, plazos ni compromisos. Derivar decisiones comerciales reales a cal.com.
  • Support: no diagnosticar. Solo asistir al profesional con datos reales del paciente. Si no hay datos, decirlo explícitamente — nunca alucinar.
  • Analytics: no inventar cifras financieras. Si una tool no devuelve el dato, decir que falta.
  • Lab / Pathology: avisar honestamente que las tools de validación llegan en Wave 5+/6.
  • Wellness: no implementado, retorna 501.
  • Ejecutar código arbitrario (no es coding assistant).
  • Acceder a datos de otro tenant — el scoping FHIR + activación per-app
    • meta.tag lo bloquean a nivel de infraestructura.
  • Llamar a APIs externas que no estén declaradas como tool del agente.
  • Mantener memoria entre conversaciones (stateless).
MAX_TOOL_ITERATIONS = 5 // src/lib/claude.ts:5

Si Claude encadena 5 tool calls sin llegar a end_turn, el loop corta y devuelve la última respuesta del modelo. Previene loops infinitos y costos descontrolados.

runAgent reintenta automáticamente:

  • 3 intentos.
  • Backoff exponencial: 1s · 2s · 3s.
  • Si los 3 fallan → 503 al cliente.

CF Workers tiene un deadline de ~30 segundos por request (CPU time limit en plan paid). En la práctica:

  • Un turn simple sin tool: ~1-2s.
  • Un tool loop completo: 5-15s típico.
  • Si las queries a Aidbox/Supabase son lentas, el loop puede acercarse al deadline. Logger estructurado expone latency_ms por invocación para detectar.

tenant_emi_access.daily_invocation_limit define cuántas invocaciones exitosas puede hacer cada tenant por día UTC. Cuenta solo status='success' (F004). Si supera → 403 rate limited.

No hay límite hard hoy. Las tools de support/analytics que pueden devolver mucho (ej. list_appointments sin filtro) deberían paginar del lado de la tool. Si un tool result excede el context window, Claude reportará el error en su siguiente turn.

Anthropic publica nuevas versiones con regularidad (Haiku 4.5 → 4.6 → 5, etc.). La política de emi:

  1. Pinear el modelo exacto (claude-haiku-4-5-20251001) en código. No usar alias automáticos como claude-haiku-latest.
  2. Probar el modelo nuevo en staging antes de promover. Métricas a chequear:
    • Latencia p95 (no debería subir > 20%).
    • Costo USD por invocación.
    • Quality del tool use (que sepa cuándo invocar tool y cuándo no).
  3. Pricing: actualizar cost.ts con los nuevos números antes del bump.
  4. Rollout: change minor del SDK (ej. emi 0.2.x → 0.3.0) con nota en CHANGELOG.

logger.ts emite JSON estructurado con campos:

CampoEjemplo
levelinfo / warn / error
eventagent.run.start / agent.run.complete / tool.execute
request_idUUID por request
appemaclinic
agentsupport
tenant_idUUID
latency_msej. 1234
input_tokens1500
output_tokens380
cost_usd0.00345

Los mismos números viajan a emi_invocations para análisis histórico.