As chaves ficam na sua máquina, o prompt é editável antes de gastar, os arquivos são seus e cada centavo aparece escrito.

Ele guarda as suas chaves, conhece o formato que cada modelo espera, reescreve o pedido no estilo daquele modelo, envia, acompanha, baixa o arquivo e anota o custo. Nada disso é difícil — e esse é o ponto: é exatamente a camada pela qual os serviços de wrapper cobram assinatura.
fal, Kling, Agnes, kie e um servidor local na sua GPU vivem atrás do mesmo adapter. Nenhum é obrigatório: o que faltar aparece indisponível com o motivo, e o estúdio sobe assim mesmo.
Três unidades que não se somam — dólar, crédito de plano e zero. O consumo real é medido pelo delta da conta, e o que não dá para saber antes de rodar é marcado como desconhecido em vez de chutado.
Roteamento, catálogo, preço, disponibilidade e retry são código determinístico. O modelo é ferramenta contratada por tarefa, nunca gerente — por isso o custo é previsível.
O mesmo caminho vale para você na tela e para um agente conectado por MCP.
A reescrita é mostrada e editável antes de você gastar. É o lugar mais barato para pegar um mal-entendido — depois de enviar, o conserto custa outra rodada.
Gemini, depois OpenRouter, depois o Codex local. Com um único refinador, a cota dele derruba o estúdio inteiro — foi o que aconteceu em produção, e por isso virou corrente.
Toda mídia é espelhada localmente de propósito: as URLs dos provedores expiram (24h no Kling, temporárias na Agnes). O que você gerou não some quando o link morre.
| Provedor | Modelos | Como cobra | O que precisa |
|---|---|---|---|
| fal.ai | 37 | dólar, preço ao vivo | FAL_KEY |
| Kling | 26 | créditos do plano | CLI oficial com login OAuth |
| Agnes AI | 4 | zero | AGNES_API_KEY |
| kie.ai | 4 | créditos | KIE_API_KEY |
| inemaimg | 2 | zero (sua GPU) | servidor local no ar |
Node é o único requisito de verdade. Todo provedor é opcional e degrada sozinho — uma chave que falta deixa aqueles modelos indisponíveis, com o motivo e como resolver, e o estúdio continua abrindo.
Node 24 recomendado, porque o estúdio usa o node:sqlite nativo — sem banco externo, sem serviço para subir.
node -v # v22.5 ou maior
Para gerar qualquer coisa. Comece pelos de custo zero se quiser experimentar sem gastar.
# grátis, sem cartão apihub.agnes-ai.com # Agnes
Um refinador (Google AI Studio ou OpenRouter); Chrome para imprimir PDF; Codex ou Claude Code para o construtor de sites com agente.
# sem refinador, o prompt vai cru # — e a Agnes recusa não-inglês
Comandos reais, na ordem. Do zero ao primeiro arquivo gerado leva alguns minutos — a maior parte é o npm install.
Sem etapa de build: o estúdio roda direto do código.
git clone https://github.com/inematds/bench-studio-en.git cd bench-studio-en npm install
O .env.example documenta as 19 variáveis: o que cada uma destrava, como cobra e onde criar a chave. Preencha só o que você tiver.
cp .env.example .env # .env é ignorado pelo git
Sobe a API e a interface juntas. A interface fica em localhost:5200 e a API em localhost:8787.
npm run dev # abre em http://localhost:5200
Botão Config, no topo à direita. Ele mostra cada variável: presente ou não, de onde veio e os 4 últimos caracteres — nunca o valor. Dá para testar cada provedor ali e gravar o .env sem sair da tela. Por segurança, só aceita gravação de quem está na própria máquina.
# ordem de leitura, do mais forte para o mais fraco
exportado no shell > .env do projeto > ~/.env
73 modelos é muito para rolar. Em Model catalog, filtre por provedor e desligue o que não vai usar. É preferência, não bloqueio: o modelo some dos seletores, mas um Redo de um resultado antigo continua funcionando.
# voltar ao estado de fábrica: apague o arquivo rm data/catalog-prefs.json
O botão No cost liga exatamente os modelos de custo zero. Use-os para achar o prompt que funciona; depois gaste no modelo que renderiza melhor.
# 6 modelos a custo zero: Agnes (4) + servidor local (2)
Vem sem senha, de propósito — falar com a própria máquina não deveria pedir uma. Se for expor na rede, defina: fica guardada como hash scrypt, e trocar a senha derruba quem já estava dentro.
npm run set-password # pergunta sem ecoar npm run set-password -- --remove # tira a senha
De fábrica só a própria máquina enxerga o estúdio. Abrir para fora são três coisas — a interface escutando na rede, a regra de firewall e lembrar de desfazer as duas. Um comando faz tudo, e o close desfaz exatamente o que o open fez.
./scripts/remote.sh open # publica no IP da máquina ./scripts/remote.sh status # aberto ou fechado, e com qual proteção ./scripts/remote.sh close # volta a só-local
O open oferece a senha antes de abrir. Diga sim e ele chama o set-password; responda n e o estúdio abre sem senha, que é o padrão. A oferta existe por um motivo duro: a senha só se define na própria máquina — pela rede é 403, mesmo já logado. É essa regra que impede quem achar a porta aberta de pôr uma senha própria e te trancar para fora. Numa VPS, a ordem certa é npm install → npm run set-password → remote.sh open. A porta da API (8787) nunca é publicada.
./scripts/remote.sh open --ip 203.0.113.7 # só esse endereço ./scripts/remote.sh open --firewall # liga o ufw (SSH liberado antes)
A aba Connect entrega a configuração MCP pronta para Claude, Codex e Cursor. O agente enxerga o mesmo elenco de modelos que você — não uma lista paralela.
npm run mcp # servidor MCP em stdio
Os contratos rodam em segundos. O e2e usa navegador de verdade e pede o Chromium do Playwright uma vez.
npm run test:contracts # 30 testes npx playwright install chromium && npm run test:e2e
Coisas aprendidas rodando o estúdio de verdade, não lendo a documentação dos provedores.
Ele é editável antes do envio. Corrigir ali é grátis; corrigir depois custa outra geração.
Com um só, uma cota estourada derruba tudo — e o sintoma aparece longe da causa: a Agnes passa a recusar por português.
Todo resultado carrega modelo, controles, prompt refinado, ideia original e anexos. O Redo devolve tudo, para você mudar uma coisa sem pagar outra reescrita.
Veo, Nano Banana, gpt-image e gemini-image aparecem por mais de um provedor, com contas diferentes: dólar no fal, crédito de plano no Kling. O provedor aparece ao lado do nome — é escolha real, não duplicata.
Todo job do Kling é cobrado, inclusive os que falham. Nada é reenviado sem você mandar.
Cada arquivo é espelhado localmente: ~1,3 MB por imagem, 0,7–5 MB por vídeo. O estúdio ocioso usa 274 MB de RAM e quase nenhuma CPU.
Codex e Claude Code escrevem os arquivos e corrigem os próprios erros. Os motores de modelo puro (Qwen local, OpenRouter) não precisam de sandbox e custam zero, mas pedem mais supervisão.
Um site ou PDF de sua autoria calibra o acabamento — tokens, fontes, paleta, raios. Marca, texto, estrutura e arquivos nunca são copiados.
A postura de fábrica é a mais fechada possível sem atrapalhar: tudo em loopback, sem senha, e nada sai da sua máquina além das chamadas aos provedores que você configurou.
Lidas no servidor, nunca devolvidas à interface. A tela mostra presença, origem e os 4 últimos caracteres. O .env é gravado com permissão só do dono.
Mesmo com sessão válida, trocar chave ou senha pela rede é recusado. A checagem sobrevive ao proxy de desenvolvimento: uma origem encaminhada só é aceita quando o socket já é local.
Hash scrypt, cookie httpOnly, sessão de 12h. Ela protege a API e os arquivos gerados. Esconder também a casca da interface é trabalho de proxy reverso, não deste processo — e isso está dito na documentação, não escondido.
Na ordem do que protege mais. O open é postura de teste: tráfego em HTTP puro, legível no caminho.
| # | O que fazer | Como |
|---|---|---|
| 1 | Pôr senha na instalação | npm run set-password antes do open — pela rede não dá, nem depois de logado |
| 2 | Manter a API em loopback | é o padrão; BENCH_API_HOST=0.0.0.0 é opt-out consciente |
| 3 | Restringir quem alcança | remote.sh open --ip <seu-ip>, ou Tailscale (nenhuma porta aberta) |
| 4 | Ligar o firewall | remote.sh open --firewall — e confira também o painel da VPS |
| 5 | HTTPS na frente | nginx/Caddy + Let's Encrypt servindo o dist/ e proxy para 127.0.0.1:8787, com X-Forwarded-For |
| 6 | Usuário próprio, não root | unidade systemd, .env em 600 |
| 7 | Fechar ao terminar | ./scripts/remote.sh close — exposição esquecida é a que custa crédito |
O que está pronto foi medido; o que está por fazer está listado sem promessa de data.