subpool
by vprotti
README.md
<div align="center">
<img src="https://raw.githubusercontent.com/vprotti/subpool/main/docs/icon.png" width="120" alt="subpool">
# subpool
**Várias assinaturas de IA, um pool só. O Codex e o Claude Code delegam tarefas para a conta que ainda tem cota.**
[nasmac.app](https://nasmac.app) · [English](README.en.md) · [npm](https://www.npmjs.com/package/subpool)
<img src="https://raw.githubusercontent.com/vprotti/subpool/main/docs/terminal.png" width="720" alt="O subpool listando quatro contas com uso, cooldown e estratégia, e uma tarefa rodando na conta com mais cota">
</div>
---
Grátis, sem conta, sem servidor. Um MCP server e uma CLI que guardam um pool de assinaturas — Claude Code (via `claude`) e ChatGPT (via `codex`) — e mandam cada tarefa de código para a conta menos usada. Bateu no limite, a conta entra em cooldown e a tarefa segue na próxima.
```
codex ──▶ subpool (MCP) ──▶ claude -p perfil claude-work
├─▶ claude -p perfil claude-personal
├─▶ codex exec perfil codex-team
└─▶ codex exec perfil codex-alt
```
Cada conta vive num diretório de perfil isolado e roda pelo **CLI oficial** do fornecedor. O subpool não fala com a API da Anthropic nem da OpenAI, não lê o cofre de credenciais de ninguém e não copia nada de `~/.claude` ou `~/.codex`.
## Por que existe
Uma assinatura acaba no meio da tarefa. Duas assinaturas viram troca manual de conta, `CLAUDE_CONFIG_DIR` na mão e a pergunta "qual ainda tem cota?". Eu queria abrir o Codex, pedir a tarefa e deixar a escolha da conta com quem sabe o número: um roteador que conta tokens por janela de 5 horas e 7 dias, igual aos limites dos dois serviços.
## Instalar
```bash
npm i -g subpool
```
Node 20+ e o `claude` e/ou o `codex` no PATH. macOS, Linux e WSL.
## Vincular contas
```bash
subpool link claude work # abre o login do Claude no navegador
subpool link claude personal
subpool link codex team # abre o login do ChatGPT para o Codex
subpool link codex alt --device-auth
subpool ls
```
Cada `link` cria `~/.subpool/profiles/<provider>-<id>` e roda o login oficial ali dentro (`claude auth login` ou `codex login`). O login que você já tem em `~/.claude` e `~/.codex` continua intacto.
Máquina sem navegador, ou Keychain do macOS atrapalhando: gere um token de longa duração com `claude setup-token` em qualquer lugar e cole com
```bash
subpool link claude ci --token # pede o token, grava em profiles/claude-ci/token com modo 0600
```
`subpool check` mostra quem está logado. `subpool unlink <id>` remove a conta e o perfil.
## Registrar no Codex e no Claude Code
```bash
subpool install codex # grava [mcp_servers.subpool] em ~/.codex/config.toml
subpool install claude # roda `claude mcp add subpool --scope user -- …`
```
Dentro do Codex ou do Claude Code, é uma tool:
> Use `delegate` para implementar o formulário de login em `/Users/eu/app` e aguarde o resultado.
O `delegate` escolhe a conta, roda a tarefa naquele CLI dentro do diretório informado, registra os tokens e devolve a mensagem final do worker. O worker começa sem memória: a tarefa precisa ser autocontida.
## Tools MCP
| Tool | O que faz |
| --- | --- |
| `delegate` | Roda uma tarefa de código na melhor conta. `task`, `cwd`, e opcionais `provider`, `account`, `permission`, `model`, `max_turns`, `system_prompt`, `wait` (padrão `true`), `wait_sec` (quanto esperar pelo resultado, padrão 300), `timeout_sec` (limite duro do worker, padrão 1800). |
| `job_wait`, `job_result`, `job_cancel`, `jobs_list` | Acompanham tarefas longas. Se o `delegate` devolver `status: "running"`, chame `job_wait`. |
| `accounts_list`, `accounts_usage` | Tokens por conta nas janelas de 5h e 7d, utilização, cooldown, totais por fornecedor. |
| `account_set`, `set_strategy` | Liga/desliga conta, peso, orçamento, modelo; estratégia de roteamento. |
| `link_help` | Os comandos exatos para vincular outra conta. |
Resources: `subpool://accounts` e `subpool://usage`.
## Distribuição de tokens
```bash
subpool strategy least-used # padrão: menor utilização primeiro
subpool strategy weighted # tokens das últimas 5h / peso
subpool strategy round-robin
subpool strategy priority # ordem do config, próxima conta ao bater limite
subpool set work --tokens-5h 400000 --tokens-7d 2500000
subpool set alt --weight 2
subpool set personal --disable
subpool set personal --clear-cooldown
```
Utilização é `usado / orçamento` nas janelas que têm orçamento, ou `tokens das últimas 5h / peso` quando não tem. Empate vai para a conta usada há mais tempo.
Quando o CLI reporta limite de uso, a conta entra em cooldown até o horário de reset que ele imprimiu (ou 30 minutos, sem horário) e a tarefa é refeita na próxima conta elegível, até `maxAttempts` (3). Erro de login vale 6 horas de cooldown; sobrecarga do serviço, 2 minutos. Falha comum da tarefa não faz failover: o erro volta para quem pediu.
## Permissões
| `permission` | claude | codex |
| --- | --- | --- |
| `read-only` | `--permission-mode plan`, sem Edit/Write/Bash | `--sandbox read-only` |
| `edit` (padrão) | `--permission-mode acceptEdits` | `--sandbox workspace-write` |
| `full` | `--dangerously-skip-permissions` | `--dangerously-bypass-approvals-and-sandbox` |
## CLI
```
subpool serve servidor MCP em stdio
subpool link <claude|codex> <id> [--token] [--device-auth] [--weight N] [--tokens-5h N] [--tokens-7d N] [--model M]
subpool unlink <id> [--keep-profile]
subpool ls [--json]
subpool usage [--json]
subpool check [id]
subpool set <id> [--enable|--disable] [--weight N] [--tokens-5h N] [--tokens-7d N] [--model M] [--clear-cooldown]
subpool strategy [name]
subpool run <task...> [-C dir] [--provider p] [--account id] [--permission p] [--model m] [--timeout s] [--json]
subpool jobs [--json]
subpool install <codex|claude> [--scope user|local|project] [--tool-timeout s]
subpool uninstall <codex|claude>
subpool doctor
```
`subpool run "escreva testes para src/router.ts" -C ~/app` roteia direto do terminal, sem cliente MCP. `subpool doctor` confere binários, pasta, config e o login de cada conta.
## Privacidade
- **Não existe servidor.** Nada seu sai da máquina além do que os próprios CLIs já mandam para a Anthropic e a OpenAI.
- **Credencial é dos CLIs.** O login acontece no `claude` e no `codex`, dentro do perfil da conta. O subpool só guarda o token de longa duração se você escolher `--token`, e aí em arquivo com modo 0600.
- **O que ele grava:** `usage.jsonl` com tokens, custo e resultado de cada execução; `state.json` com cooldowns; `jobs/*.json` com o texto da tarefa e a resposta do worker, para o `jobs` e o `job_result`. Nenhum deles tem token de acesso.
- **Ambiente limpo.** Antes de rodar um worker, `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN` e afins são removidos do ambiente, para que a conta do perfil seja a usada e nenhuma conta veja a credencial da outra.
Vincule apenas contas suas ou autorizadas e siga os termos de cada fornecedor.
## Arquivos
```
~/.subpool/config.json contas, estratégia, padrões
~/.subpool/usage.jsonl uma linha por execução, compactado para 8 dias a cada serve
~/.subpool/state.json cooldowns, cursor do round-robin, último uso
~/.subpool/jobs/<id>.json snapshot de cada job
~/.subpool/profiles/<p>-<id> CLAUDE_CONFIG_DIR ou CODEX_HOME daquela conta
```
`SUBPOOL_HOME` muda a pasta. `SUBPOOL_CLAUDE_BIN` e `SUBPOOL_CODEX_BIN` apontam para outros binários.
## Detalhes que evitam susto
- Chamada de tool no Codex expira em `tool_timeout_sec`; o `subpool install codex` grava 3600. No Claude Code o limite é `MCP_TOOL_TIMEOUT` (ms) no ambiente do próprio `claude`.
- Tarefa longa: `delegate` com `wait: false` e depois `job_wait`. O worker não é morto quando a espera acaba, só quando `timeout_sec` acaba.
- Vários servidores ao mesmo tempo (um por sessão do Codex) compartilham o mesmo ledger e os mesmos cooldowns, com lock de arquivo.
- Os dois fornecedores mudam mensagem de limite sem avisar. Se uma conta ficou em cooldown sem motivo, `subpool set <id> --clear-cooldown` e uma issue com a mensagem ajudam.
## Compilar do código
```bash
git clone https://github.com/vprotti/subpool.git
cd subpool
npm install
npm run build
npm test
```
Os testes não chamam o `claude` nem o `codex` reais: usam fixtures dos formatos de saída e binários falsos. `docs/ARCHITECTURE.md` descreve cada módulo e os fatos verificados sobre os dois CLIs.
## Estrutura
```
src/server.ts MCP server: tools e resources
src/cli.ts comandos
src/core/router.ts escolha da conta e failover
src/core/ledger.ts ledger de uso, janelas 5h/7d, cooldowns
src/core/limits.ts detecção de limite e horário de reset
src/providers/claude.ts adapter do claude -p (stream-json)
src/providers/codex.ts adapter do codex exec --json
src/install/ registro no config.toml do Codex e no Claude Code
```
Dependências: `@modelcontextprotocol/sdk`, `zod`, `commander`.
## Contribuir
Bug, ideia ou dúvida: [abra uma issue](https://github.com/vprotti/subpool/issues). Pull requests são bem-vindos — leia o [CONTRIBUTING](CONTRIBUTING.md) antes.
Se o subpool te poupou uma troca de conta, uma ⭐ no repositório ajuda outras pessoas a encontrarem o projeto.
## Licença
[MIT](LICENSE). Use, modifique e redistribua à vontade, inclusive comercialmente.
Não tem relação com a Anthropic nem com a OpenAI. Os nomes e marcas são de cada empresa.
---
<div align="center">
Feito por <a href="https://viniciusprotti.com.br">Vinicius Protti</a> · <a href="https://nasralla.com.br">Nasralla Serviços Digitais</a><br>
Mais apps grátis em <a href="https://nasmac.app"><strong>nasmac.app</strong></a>
</div>
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues