Spen · cuentas de Claude

Enjambre de cuentas de Claude

N suscripciones en un anillo: se usa una cada vez, al agotarse pasa a la siguiente que sirva, y cada llamada queda apuntada con la cuenta que la pagó.

En producción desde el 12/11/2026 Actualizado el 13/11/2026 ADR 0142 · specs consumo y consola

La idea en una frase

Una cuenta cada vez, en anillo, y siempre la siguiente que sirva

Antes había dos cuentas que se intercambiaban el papel (ADR 0110): un ciclo de dos. El enjambre lo generaliza a N. Añadir la tercera, la cuarta o la décima es una línea en el .env, y ninguna parte del código sabe cuántas hay. En producción hay tres.

Con el gasto medido en noviembre (unos 40 puntos de semana al día, y cada cuenta da unos 14 al día), tres cuentas cubren la semana justo y cuatro dan margen.

Dos motores: el enjambre o OpenRouter

El enjambre es uno de los dos motores del agente, y se elige por persona (decidido el 10/11/2026). Antes de mirar ninguna cuenta, se decide el carril de la corrida. Solo en el carril claude entra en juego el anillo.

Desliza para ver el diagrama entero →

Llega una corrida de una persona ¿Qué motor tiene? el de la persona; si no, el de su empresa; si no, el por defecto engine_for(empresa, persona) por defecto claude · el enjambre N cuentas en anillo, una fija para todo el carril planes, uso extra y clave de API lo que describe esta página openrouter · pasarela propia Claude por Vertex, Bedrock de respaldo retención cero · paga su propio saldo, por token otro plan: feat/agent-engine-switch sin respaldo cruzado: si un carril se agota o cae, no pasa al otro
El anillo no decide el carril, y el carril no decide la cuenta. Primero engine_for elige el motor. Solo si sale claude se llama al código de cuentas: el anillo, en llm_mode.
Por defectoclaude. Una persona nueva arranca en el enjambre.
Quién lo cambiaEl superadmin, desde la consola, por empresa y por persona, en caliente. Gana lo más concreto: persona, luego empresa, luego el por defecto. Se guarda en runtime_flags (engine.default, engine.business.<id>, engine.membership.<id>), con 15 s de caché, como usage/switches.py.
Sin respaldo cruzadoEl enjambre agotado no pasa a OpenRouter: su escalera termina como se ve en «Si se acaban todas». OpenRouter caído o sin saldo tampoco pasa al enjambre.
Qué se apuntaLas corridas de OpenRouter quedan en el consumo como openrouter y sin cuenta de Claude: no gastan cupo del anillo.

El detalle del motor está en el ADR 0143 y en docs/changes/active/2026-11-motor-del-agente-por-persona.md. Los dos motores están en producción.

El carril claude, en vivo

Abajo, una semana entera del enjambre pasando en un minuto.

1 2 3 4 5 PLAN Cuenta 1 lun 00:00
Pagado por uso, a precio de API0 USD eq.
  • 1en usorenueva jue 11:0062 %
  • 2listarenueva lun 09:00 · con uso extra8 %
  • 3listarenueva sáb 18:00 · la usa alguien más30 %
  • 4listarenueva vie 18:00 · con uso extra35 %
  • 5listarenueva mar 10:0050 %
Planes del anilloya pagados
Uso extrapor uso
Clave de APIpor token
Sin salidafallan

Lo que va pasando

    Simulación con datos inventados: una semana en un minuto. Cada cuenta renueva su semana a una hora distinta, y la 3 la usa también alguien de fuera. «Semana sin cupo» enseña la escalera de pago entera.

    Plan
    Ya pagado. Se gasta primero.
    Por uso
    Uso extra o clave de API: factura por token.
    En uso
    La cuenta actual.
    Agotada
    Hasta su hora de renovación.
    Correo
    Aviso al equipo.

    El ciclo

    Cómo pasa de una cuenta a otra

    Todas las corridas del carril claude (chat, rutinas, avisos, memoria) usan la cuenta actual. Solo cuando topa con su límite, o empieza a pagar uso extra, se busca otra, empezando por la siguiente del anillo.

    Desliza para ver el diagrama entero →

    Llega un mensaje o una rutina Corre con la cuenta actual todas las corridas usan la misma ¿topó con el límite? no Responde y apunta qué cuenta pagó sí La apunta como agotada hasta su hora de renovación ¿alguna otra sirve? desde la siguiente del anillo sí Pasa a ser la actual y se queda hasta agotarse reintenta el mensaje si murió al empezar no Escalera de pago uso extra, API y correo
    La vía punteada es el ciclo. El cambio no va a «la siguiente» sin más, sino a la siguiente que sirva: si está agotada, se salta. Y la que pasa a ser la actual se queda hasta agotarse, aunque mientras tanto se renueve otra.
    SituaciónQué hace
    La actual topa con su límiteLa apunta como agotada hasta su hora de renovación, que viene en el propio aviso de límite, y busca a partir de la siguiente. Vale igual para la ventana de 5 horas que para la semana.
    La actual empieza a pagar uso extraSi otra del anillo sirve, pasa a ella antes de pagar nada. El uso extra se deja para cuando no queda ninguna.
    La siguiente está agotadaLa salta y mira la de después.
    Llega al final del anilloSigue por la primera.
    Ninguna sirvePasa a la escalera de pago (siguiente sección) y manda un correo.
    Otra se renueva mientras la actual va bienQueda lista, sin cambiar nada: espera su turno.
    El mensaje que topóSe reintenta una vez en la cuenta nueva si murió al empezar. Si ya había hecho algo, no se repite.
    Un token deja de entrarEsa cuenta se aparta hasta que cambie su token, se manda un correo y el ciclo sigue sin ella.
    Las que esperanUna llamada mínima cada hora a cada una, para saber su % y cuándo se renueva. Si la encuentra agotada, la apunta una sola vez en la línea de tiempo y el anillo la salta.
    La del perfil, al 99 %Si una cuenta del anillo es la sesión del perfil (la palabra perfil en la lista), el monitor de cada 10 minutos la da por agotada al 99 % de su semana, sin esperar a que falle un mensaje. Las cuentas de token cambian al topar.

    Si se acaban todas

    La escalera de pago, y la vuelta

    Primero se gastan todos los planes, que ya están pagados. Si se agotan todos y ninguno se ha renovado todavía, se usa el uso extra de cualquier cuenta que lo tenga y, después, la clave de API. En cuanto una cuenta se renueva, se vuelve a su plan.

    Desliza para ver el diagrama entero →

    ya pagado 1 Plan de la cuenta actual una sola cuenta para todo, hasta que se agote se agota pasa a la siguiente del anillo ya pagado 2 Plan de la siguiente que sirva da la vuelta entera al anillo, saltando las agotadas correo ninguna sirve todas agotadas y ninguna renovada por uso 3 Uso extra de cualquiera la primera del anillo que lo tenga activado correo ninguna lo tiene o todas llegaron a su tope del mes por token 4 Clave de API la de la consola de Anthropic, con su tope de gasto correo sin saldo No queda nada los mensajes fallan · correo cada 3 h hasta que algo vuelva en cuanto una se renueva, vuelve a su plan
    La vía punteada de la derecha es la que ahorra dinero. En el uso extra y en la API se paga por token. Por eso, en cuanto cualquier cuenta se renueva, se vuelve a su plan sin esperar a nada más.
    EscalónQué se pagaCuándo se sale
    1 y 2 PlanesNada más: ya están pagados.Todas agotadas y ninguna renovada.
    3 Uso extraA precio de API, en la factura de esa cuenta.Ninguna lo tiene activado, o todas llegaron a su tope del mes. El tope se apunta por cuenta y por mes.
    4 Clave de APIPor token, con su tope de gasto.Sin saldo. No se vuelve a probar en 24 h.
    La vueltaNada: se vuelve a un plan.Desde la API, a la hora de renovación más cercana se vuelve a probar el plan. Desde el uso extra, el siguiente mensaje pasa a la primera cuenta que vuelva a servir.
    En producción, la clave de API no tiene saldo desde el 13/11: mientras no se le cargue, el escalón 4 no existe y el fondo de la escalera es el uso extra. Ver «Decisiones», al final.
    Una palanca a mano, no un escalón. Si el anillo va justo, el superadmin puede pasar a OpenRouter a quien más gasta, y las cuentas duran más. Es una decisión de la consola, persona a persona o empresa a empresa; el sistema nunca la toma solo, porque entre los dos carriles no hay respaldo cruzado.

    Dos reglas

    Lo que hace que el ciclo funcione con N cuentas

    Las dos parecen detalles, pero sin ellas el anillo se vacía antes de tiempo o se salta cuentas llenas.

    Regla 1 · Una cuenta fija, no una por mensaje

    Vale para todas las personas del carril claude. La alternativa era repartir: un mensaje por la 1, el siguiente por la 2, el siguiente por la 3. Parece más justo y sale peor. Aquí van doce mensajes seguidos de una misma conversación, por los dos caminos.

    Fija · lo que hace Spense agota la 1: la caché se rehace una vez
    111111122222
    Cuenta 10 %
    Cuenta 20 %
    Cuenta 30 %
    Veces que hubo que reescribir la caché: 0
    Alternando · una cuenta por mensajecada turno cae en otra cuenta
    123123123123
    Cuenta 10 %
    Cuenta 20 %
    Cuenta 30 %
    Veces que hubo que reescribir la caché: 0
    lee la historia de la caché (0,1 por token)la escribe entera otra vez (1,25 por token)
    Mismo trabajo, dos resultados. Fija: la caché se rehace 2 veces y la cuenta 3 queda intacta para después. Alternando: 12 veces, se gasta bastante más cupo y las tres cuentas llegan casi al límite a la vez. Cifras ilustrativas.
    FijaAlternando
    CachéLeer la historia cuesta 0,1 por token.Reescribirla cuesta 1,25 por token, unas 12 veces más. Las cuentas se vacían antes.
    RenovacionesSe agotan de una en una, con las renovaciones repartidas por la semana.Se agotan todas casi a la vez: cuando una no da más, las demás tampoco.

    Regla 2 · Si muchas conversaciones topan a la vez, se cambia una sola vez

    Spen corre en cinco procesos a la vez (el backend y cuatro workers). Cuando la cuenta actual se agota, todas las conversaciones que estaban en marcha lo descubren casi en el mismo segundo, y cada una intenta cambiar de cuenta. Con dos cuentas da igual, porque «la otra» siempre es la misma. Con N, no.

    Ejemplo: a las 14:00:00 se agota la cuenta 1 y cinco conversaciones (A a E) topan con el límite a la vez. Las cuentas 2 a 5 están llenas.

    Sin la regla«pasa a la siguiente de la actual»
    1
    2
    3
    4
    5
    1. A
    2. B
    3. C
    4. D
    5. E
    mal Se ha saltado cuatro cuentas llenas y ha vuelto a la 1, que está agotada.
    Con la regla«si la actual sigue siendo la 1, pasa a la siguiente»
    1
    2
    3
    4
    5
    1. A
    2. B
    3. C
    4. D
    5. E
    bien Un solo cambio, a la 2. Las otras cuatro ven que ya se cambió.

    En la base es una sola orden atómica: cambiar la actual solo si todavía es la que se agotó.

    Trazabilidad, consola y avisos

    Qué cuenta pagó cada cosa, dónde se ve y quién se entera

    Antes lo gastado se apuntaba por hueco («plan» o «backup»), y el hueco principal tuvo tres cuentas distintas en dos semanas. Ahora cada llamada se apunta contra la cuenta real, que se reconoce por la huella de su token, nunca por el token.

    Qué se apuntaDóndePara qué
    Cada cuenta: cuál es la actual, si está agotada y hasta cuándo, si está apartada o su token no entra, y su última lectura (ventanas de 5 h y de la semana)runtime_flags
    una clave por cuenta, de la casa
    El estado del anillo, compartido por el backend y los workers. La consola lo lee de la base en cada visita.
    Cada suceso: cambio de cuenta (de cuál a cuál y por qué), agotada, paso al uso extra o a la API, sin salida, token roto, vuelta a la suscripción, apartada y devueltaclaude_account_events
    tabla de la casa
    La línea de tiempo de la consola: cuándo entró y salió cada una, y por qué.
    Cada llamada al modelousage_entries.claude_account
    la clave de la cuenta; via dice plan (o backup si era otra del anillo), extra o api, y openrouter en el otro motor, donde la cuenta va vacía
    Cuánto gastó Spen con cada cuenta, por persona, empresa y tipo de trabajo.
    Uso ajenoSe calcula en la lectura de cada hora: la semana de una cuenta que espera sube 3 puntos o más sin que Spen haya apuntado nada con ellaSaber si alguien más usa la cuenta: un correo por cuenta y semana, y los puntos, en la consola.

    En la consola de superadmin

    Está en Proveedores (/consola/proveedores), con una versión corta en el Resumen: el anillo pequeño, por dónde se paga y la semana de la cuenta en uso. La consola lee el anillo de la base en cada visita, así que enseña lo mismo que usa el worker en ese momento.

    Capturas de la consola de verdad, con datos inventados: un anillo de siete cuentas, la 1 en uso y la 2 agotada.

    Desliza para ver la captura entera →

    Cabecera de Cuentas de Claude: se paga por el plan, la cuenta 1 en uso con el 75 % de su semana, cupo para unos 12 días, próxima renovación y cuántas cuentas pueden entrar
    Arriba, lo que hay que saber de un vistazo: por dónde se paga, qué cuenta está en uso y cuál viene después, para cuántos días da el cupo que queda al ritmo actual, cuándo se renueva la próxima y cuántas pueden entrar.

    Desliza para ver la captura entera →

    La escalera de cuatro pasos. El primero es el anillo de siete cuentas con el porcentaje de cada una, y debajo la lista ordenada; después uso extra, clave de API y sin salida
    La escalera, con el anillo dentro. Cada cuenta lleva su semana en el arco: verde si le queda cupo, ámbar si le queda poco o paga extra, rojo si está agotada. La actual va con borde y la siguiente, con borde punteado. Debajo, la lista empieza por la que está en uso y sigue de la que más lleva a la que menos, con tres a la vista y el resto plegado. Los otros pasos dicen qué cuenta tiene uso extra, la clave de API por sus cuatro últimos caracteres (y si tiene saldo) y qué pasa si no queda nada. La consola junta en un paso los dos escalones de planes.

    Desliza para ver la captura entera →

    Línea de tiempo: la cuenta 1 se agota, se salta la 2 y se pasa a la 3; la 3 se agota y se paga su uso extra
    La línea de tiempo. Cada cambio de cuenta, cada agotamiento y cada paso al uso extra o a la API, con su hora y su porqué. En esta, la 1 se agota, se salta la 2 (agotada) y se pasa a la 3; cuando la 3 se agota también, se paga su uso extra.

    Desliza para ver la captura entera →

    Tabla con el detalle de cada cuenta: estado, uso extra, gasto de los últimos 7 días y uso ajeno
    El detalle por cuenta: si tiene uso extra, lo que Spen gastó con ella en los últimos 7 días y si alguien más la usa.
    BotónQué hace
    Leer las cuentas ahoraLanza la lectura de cada hora en el momento, sin esperar a la siguiente.
    Hacer actual
    en el menú de cada cuenta
    Pasa a esa cuenta en el momento. No deja si su token no inicia sesión. Si se estaba pagando por la clave de API, se vuelve a su plan.
    Apartar y devolverSaca una cuenta del anillo sin tocar el .env; si era la actual, pasa a la siguiente. Al devolverla espera su turno: no vuelve a ser la actual.

    Cada botón queda apuntado con quién lo pulsó, y el cambio, en la línea de tiempo.

    Los correos

    Llegan en texto plano a cada dirección de SUPPORT_EMAIL (una o varias, separadas por comas; a cada una le llega el suyo). Antes estos avisos iban por WhatsApp a ADMIN_WHATSAPP_ALERTS, que en Spen está vacío, y no le llegaban a nadie. Los cambios normales entre cuentas no mandan correo: quedan en la consola.

    CuándoQué diceCuántas veces
    queda pocoEl cupo que queda en todo el anillo da para menos de 24 h al ritmo de las últimas horas, y no llega a la próxima renovación.Una vez por incidente
    todas agotadasSe pasa al uso extra de la cuenta N, que se paga aparte.Una vez
    sin uso extraSe pasa a la clave de API.Una vez
    sin salidaNi uso extra ni API: los mensajes fallan.Al empezar y cada 3 h mientras dure
    token rotoLa cuenta N no inicia sesión: hay que sacar su token otra vez.Una vez por token
    uso ajenoEl % de la cuenta N sube sin que Spen la use.Una vez por cuenta y semana
    recuperadoSe vuelve al plan de una cuenta después de haber pagado por uso.Una vez

    Así llega el que da tiempo a reaccionar (las cifras son inventadas):

    DeSpen
    Paracada dirección de SUPPORT_EMAIL
    AsuntoClaude: queda poco cupo en el anillo

    Al ritmo de las últimas horas (unos 1,66 puntos por hora), el cupo que queda en el anillo da para unas 18 h. La próxima renovación es el 19/11 11:00 UTC, dentro de 30 h.

    Para estirarlo: añadir una cuenta al anillo, o pasar a otro motor a quien más gasta desde la consola.

    Las cuentas:
    - cuenta 1: agotada hasta el 19/11 11:00 UTC, 100 % de la semana, renueva el 19/11 11:00 UTC
    - cuenta 2: agotada hasta el 23/11 09:00 UTC, 100 % de la semana, renueva el 23/11 09:00 UTC
    - cuenta 3: en uso, 70 % de la semana, renueva el 21/11 18:00 UTC

    Consola: spen.ai/consola/proveedores

    En marcha

    Añadir o quitar una cuenta, y lo que ya se ha comprobado

    Añadir la cuenta N+1

    1 2 3 4

    Cuentas en el anillo: 4

    CLAUDE_ACCOUNT_TOKENS=sk-ant-oat01-…3f2a,sk-ant-oat01-…91bc,sk-ant-oat01-…0d7e,sk-ant-oat01-…c4a8

    Una sola línea en el .env, aquí partida para leerla. Una línea más y, al arrancar, una cuenta más en el anillo, al final.

    1. Sacar su token.
      claude setup-token con esa cuenta, una vez. Vale un año.
    2. Añadirlo al final de CLAUDE_ACCOUNT_TOKENS en el .env de la caja.
      El orden de la lista es el orden del anillo. La palabra perfil en la lista es la sesión del perfil del CLI, en lugar de un token.
    3. Recrear los contenedores en un hueco sin mensajes.
      Es el único paso con espera, y va como cualquier despliegue: con un sí explícito y una copia de la base antes.
    4. Al arrancar, entra al final del anillo.
      Se la reconoce por los 12 primeros caracteres de la huella de su token, nunca por el token. Su semana se lee en la lectura de cada hora, o al pulsar «Leer las cuentas ahora».
    5. Para quitar una, se borra su línea.
      Sale del anillo y de la consola. Sus sucesos y su consumo se quedan en la base, con su clave.
    6. Si un token deja de entrar, se cambia en su sitio.
      Mismo puesto en la lista, token nuevo. La consola la sigue llamando por su número; su clave cambia, porque sale de la huella del token.

    Lo que ya se ha comprobado

    QuéCómo
    El anillo con N cuentas, el cambio único entre procesos y la escalera enteraPruebas del backend contra Postgres (test_claude_ring, test_claude_ring_db)✓
    Los siete correos: uno por incidente, con los números en castellanotest_claude_notices✓
    La consola: lo que enseña, los tres botones, y que nunca sale un token ni la clave de API enteratest_claude_ring_console y las pruebas del dibujo del anillo✓
    En producción con tres cuentas, desde el 12/11 a las 03:44 UTCEl 12/11 a las 17:05 una cuenta se agotó y se pasó a la siguiente que servía, saltando la agotada✓
    El aviso de uso ajenoSaltó el 12/11 con una cuenta que subía sin que Spen la usara, y la base lo confirmó: Spen no la había usado✓
    La consola nueva, la de las capturasEn producción✓

    Decisiones

    1hecho Los correos van a SUPPORT_EMAIL, una o varias direcciones separadas por comas; a cada una le llega el suyo.
    2hecho «Queda poco» avisa con menos de 24 h de cupo (CLAUDE_LOW_RUNWAY_HOURS).
    3hecho La consola lleva botones para leer las cuentas ya, hacer actual una y apartarla o devolverla.
    4por ahora no El anillo no admite claves de API como miembros: la vía de pago por uso es el motor openrouter.
    5abierto La clave de API de producción no tiene saldo desde el 13/11 a las 09:48 UTC. Mientras no se le cargue, el fondo de la escalera es el uso extra, y si ninguna cuenta lo tiene, los mensajes fallan hasta la primera renovación: pasó el 13/11 entre las 09:48 y las 11:00 UTC.
    6abierto Que las cuentas de token cambien también al 99 % de su semana, como la del perfil, con el porcentaje que trae cada corrida, en lugar de esperar a que un mensaje tope.