Commit Graph
2 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Opus 5 97e66b82e3 fix(umind): el aviso de tope se repetía en cada despliegue y el cliente no se enteraba
Qué pasa cuando un cliente supera el tope de consumo de su plan: el servicio
sigue funcionando y el excedente se factura en el próximo ciclo. Es la decisión
de diseño y no cambia — cortarle el asistente a un negocio en medio de una
conversación con un cliente suyo es peor que la factura.

Lo que sí estaba mal es cómo se avisaba.

El control de "a este ya le avisé" vivía en memoria, con un ponytail: que
asumía reinicios raros. Con despliegue automático en cada push, ese flag se
borra varias veces por día: el mismo cliente pasado de tope recibía el aviso de
nuevo en el siguiente mensaje, y otra vez, y otra. Ahora se marca en la base,
con un UPDATE condicionado que además lo hace atómico — dos mensajes que crucen
el tope a la vez, o dos réplicas del proceso, avisan una sola vez.

Y el aviso iba sólo al Telegram del staff. El dueño del negocio, que es el que
va a recibir la factura con el excedente, no se enteraba por ningún lado: tenía
que entrar al panel a mirar. Ahora le llega un correo que dice cuánto lleva
consumido, cuánto incluye su plan y —lo más importante— que su asistente sigue
funcionando con normalidad.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 19:20:54 -05:00
Lizandro GuarnizoandClaude Sonnet 5 08265510ea feat(umind): mide el consumo de IA, OCR y transcripción por tenant
Es la base del cobro por uso: hasta ahora no había ninguna medición de
consumo en todo el repo.

- UmindUso registra cada evento facturable con el costo YA calculado al
  precio vigente del plan. Congelarlo evita que subir un precio revalúe
  consumo pasado, que haría indefendible una factura ante un reclamo.
- callAI devuelve los tokens que reportó el proveedor (campo usage, igual
  en todos los OpenAI-compatibles; input+output en Anthropic). Se mide
  cada ronda de tool-calling, no solo la última: todas gastan tokens.
- ExtraerTextoOCR y TranscribirAudioSelfHosted reciben agenteID; 0 = no
  medir, que es lo que pasan los botones "Probar" del panel de staff.
- Aviso al superar el tope del plan, una vez por mes y sin cortar el
  servicio. El flag de "ya avisé" es en memoria a propósito.
- GET /app/umind/uso con filtros de fecha: resumen por tipo + detalle.
- Test del cálculo de costo por tipo, incluida fracción de 1k tokens y
  tenant sin plan.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-13 11:41:23 -05:00