{"versao":1,"autenticacao":"Authorization: Bearer <chave criada em /admin>","observacoes":["Gerar imagem devolve um job_id; acompanhe em GET /v1/job/{id} ou mande um callback_url https:// e o site avisa quando fechar.","Acompanhar o job e baixar os bytes nao contam no limite diario da chave -- sao parte do pedido que ja foi cobrado.","Nem a conversa nem o texto grande ficam gravados: o que entra e o que sai de POST /v1/chat/completions e de POST /v1/perguntar nao vira linha nenhuma neste site. Fica so o consumo -- quantos tokens, por qual chave.","POST /v1/chat/completions e GET /v1/models seguem o dialeto da OpenAI: aponte qualquer cliente compativel para esta /v1 com a chave no lugar da chave da OpenAI.","POST /mcp (fora da /v1, mesma chave no Authorization) fala MCP: e o endereco a por como conector remoto no claude.ai, e as ferramentas de la sao estas mesmas rotas. Um JSON-RPC por POST, sem SSE; o GET responde 405. Cada chamada de ferramenta conta um no limite da chave -- a conversa de protocolo nao conta."],"rotas":{"POST /v1/chat/completions":{"descricao":"Conversa com o modelo de texto, no dialeto da OpenAI. Repasse com fila e cota: sem 'tools' nesta versao.","entrada":{"model":"string, um de GET /v1/models (opcional: o primeiro)","messages":"lista de {role, content}","stream":"bool, opcional","...":"os demais campos do dialeto vao como vieram"},"saida":"o corpo do servidor de texto, intacto (JSON ou SSE)"},"GET /v1/models":{"descricao":"Os modelos que esta API aceita. Nao conta no limite.","saida":{"object":"list","data":"lista de {id, object, owned_by}"}},"POST /v1/perguntar":{"descricao":"Texto grande + uma pergunta sobre ele, sem stream. Para o que nao cabe numa conversa: resumir um relatorio inteiro, achar um padrao num log. O modelo e escolhido pelo site (o de contexto longo do /admin), nao por quem chama; a resposta sai de uma vez, com os tokens contados.","entrada":{"texto":"string, ate 20 MB","pergunta":"string","modelo":"string, opcional: um de GET /v1/models"},"saida":{"resposta":"string","modelo":"string","tokens":"{entrada, saida}"},"limite_pratico":"o teto de 20 MB e o da porta, nao o do modelo: 1 M de contexto anunciado em 16 GB de VRAM nao e 1 M -- o KV cache estoura por volta de 200 mil tokens (~800 KB de texto). Passando disso a rota devolve o recado do servidor de texto com o codigo dele, e nao um 500."},"GET /v1/status":{"descricao":"Como esta a placa agora: fila, VRAM, modelos de texto carregados, ComfyUI online. Publica: sem chave, nao conta, e nao diz nada sobre ninguem -- so numeros da maquina. Sirva para decidir 'peco agora ou espero'.","saida":{"placa":"{comfy_online, vram_livre_gb, vram_total_gb}","texto":"{online, modelos_carregados}","fila":"{tamanho, em_curso: chat|image|documento|null, esperando: {chat: n, image: n, documento: n} -- todas as chaves sempre, 0 quando ninguem daquele tipo espera}","interruptores":"{chat, imagem}"}},"POST /v1/icone":{"descricao":"Uma frase em portugues vira um Lottie de poucos KB.","entrada":{"pedido":"string, ate 300 caracteres"},"saida":{"receita":"objeto","lottie":"objeto","aviso":"string"}},"POST /v1/imagem":{"descricao":"Enfileira uma imagem na placa. Nao espera ficar pronta.","entrada":{"prompt":"string","negative":"string, opcional","batch":"int, 1 a 4, padrao 1: quantas figuras. Conta uma por figura no limite da chave, e um lote sem saldo para todas e recusado inteiro","width":"int, opcional","height":"int, opcional","steps":"int, opcional","cfg":"float, opcional","seed":"int, opcional","checkpoint":"string, opcional","estilo":"string, opcional","workflow":"string, opcional: o jeito de desenhar. Sem isto vale o padrao do /admin; os nomes sao os do seletor de Imagens","com_o_meu_traco":"bool, opcional: desenha com o traço de estilo que o dono deste site treinou. O site escolhe o jeito de desenhar e escreve a palavra-chave do estilo na frente do prompt -- não é preciso saber qual é. Recusa com 400 quando ninguém treinou nenhum, e não aceita junto de um 'workflow' de outro nome","callback_url":"string https:// publica, opcional: quando o job fechar, o site faz um POST la"},"saida":{"job_id":"int","params":"objeto"},"callback":{"quando":"ao fechar o job -- done, error ou cancelado -- uma vez, com 10 s de espera; se falhar, nao tenta de novo (GET /v1/job/{id} continua valendo).","corpo":"o mesmo JSON de GET /v1/job/{id}","headers":{"X-Studio-Job":"o job_id","X-Studio-Assinatura":"sha256=<HMAC-SHA256 hex do corpo, com o segredo deste site>"},"recusas":"http://, endereco interno (127.0.0.1, 10.x, localhost...) e nome que resolva para dentro respondem 400 antes de o job nascer."}},"GET /v1/job/{id}":{"descricao":"Como vai o job. Quando status=done, images tem os nomes.","saida":{"status":"queued|running|done|error","progress":"0..1","position":"int ou null","images":"lista de nomes","error":"string ou null"}},"GET /v1/imagem/{arquivo}":{"descricao":"Os bytes PNG de uma imagem sua, pelo nome que o job devolveu.","saida":"image/png"},"POST /v1/documentos/buscar":{"descricao":"Procura nos SEUS documentos. Vetorial quando da, por palavras sempre. E a mesma busca que a tela de Documentos faz, e responde 503 quando o dono desliga os documentos no painel.","entrada":{"consulta":"string, ate 200 caracteres","k":"int, 1 a 20, padrao 5"},"saida":{"trechos":"lista de {documento, texto, pontos}"}},"GET /v1/documentos":{"descricao":"Os seus documentos e em quantos trechos cada um foi fatiado.","saida":{"documentos":"lista de {id, nome, status, n_trechos, vetorizado}"}},"POST /v1/buscar":{"descricao":"Busca na web pelo SearXNG deste site. Sai do IP desta VPS e fica registrada com a conta dona da chave, a data e o IP -- e passa pela lista de expressoes que o site recusa (403, tambem registrado).","entrada":{"consulta":"string, ate 200 caracteres"},"saida":{"resultados":"lista de {titulo, url, resumo}"}},"POST /v1/ler":{"descricao":"Le uma pagina e devolve o texto dela. Mesma saida e mesmo registro da POST /v1/buscar: quem recebe a visita ve o endereco desta VPS, e nao o de quem pediu.","entrada":{"url":"string"},"saida":{"titulo":"string","texto":"string"}}}}