trans4 / docs /pt-BR /reference /http-api.md
Mayo
docs: update to match current implementation
725264a unverified
---
title: Referência da API HTTP
---
# Referência da API HTTP
O Koharu expõe uma API HTTP local em:
```text
http://127.0.0.1:<PORT>/api/v1
```
Esta é a mesma API usada pela UI desktop e pela Web UI em modo headless.
## Modelo de runtime
Comportamento atual importante:
- a API é servida pelo mesmo processo da GUI ou do runtime headless
- o servidor faz bind em `127.0.0.1` por padrão; use `--host` para fazer bind em outro lugar
- a API e o servidor MCP compartilham o mesmo projeto carregado, modelos e estado do pipeline
- quando nenhum `--port` é fornecido, o Koharu escolhe uma porta local aleatória
- tudo, exceto `/api/v1/downloads`, `/api/v1/operations` e `/api/v1/events`, retorna `503 Service Unavailable` até o app terminar a inicialização
## Modelo de recursos
A API é centrada em projetos. Apenas um projeto fica aberto por vez e contém:
- uma lista de `Pages` indexada por `PageId`
- `Nodes` por página (camadas de imagem, máscaras, blocos de texto) referenciados por `NodeId`
- um armazenamento `Blob` endereçado por conteúdo, que guarda os bytes brutos das imagens por hash Blake3
- um snapshot de `Scene` montado a partir dessas peças, avançado por um contador `epoch`
- um histórico de mutações `Op` que podem ser desfeitas ou refeitas
As mutações sempre passam pela camada de histórico (`POST /history/apply`), de modo que a cena, o autosave e os assinantes de eventos permaneçam sincronizados.
## Formatos comuns de response
Tipos de response frequentemente usados incluem:
- `MetaInfo` — versão do app e label do dispositivo de ML
- `EngineCatalog` — ids das engines instaláveis por etapa do pipeline
- `ProjectSummary` — id, nome, caminho, contagem de páginas, último acesso
- `SceneSnapshot``{ epoch, scene }`
- `LlmState` — estado atual de carga do LLM (status, target, error)
- `LlmCatalog` — modelos locais + de provedor agrupados por família
- `JobSummary``{ id, kind, status, error }`
- `DownloadProgress` — id do pacote, contagens de bytes, status
## Endpoints
### Meta
| Método | Path | Finalidade |
| ------ | ----------- | --------------------------------------------------- |
| `GET` | `/meta` | obtém a versão do app e o backend de ML ativo |
| `GET` | `/engines` | lista as engines de pipeline registradas por etapa |
### Fontes
| Método | Path | Finalidade |
| ------ | ------------------------------------- | ---------------------------------------------------------------- |
| `GET` | `/fonts` | catálogo combinado de fontes do sistema + Google Fonts para render |
| `GET` | `/google-fonts` | catálogo do Google Fonts como uma lista isolada |
| `POST` | `/google-fonts/{family}/fetch` | baixa e faz cache de uma família do Google Fonts |
| `GET` | `/google-fonts/{family}/{file}` | serve o arquivo TTF/WOFF em cache |
### Projetos
Todo projeto vive sob o diretório gerenciado `{data.path}/projects/`; clientes nunca fornecem caminhos do filesystem.
| Método | Path | Finalidade |
| -------- | --------------------------------- | ------------------------------------------------------------------- |
| `GET` | `/projects` | lista os projetos gerenciados |
| `POST` | `/projects` | cria um novo projeto (body `{ name }`) |
| `POST` | `/projects/import` | extrai um arquivo `.khr` em um diretório novo e o abre |
| `PUT` | `/projects/current` | abre um projeto gerenciado por `id` |
| `DELETE` | `/projects/current` | fecha a sessão atual |
| `POST` | `/projects/current/export` | exporta o projeto atual; retorna bytes binários |
`POST /projects/current/export` aceita `{ format, pages? }` onde `format` é um de `khr`, `psd`, `rendered`, `inpainted`. Quando o formato produz múltiplos arquivos, a response é `application/zip`.
### Páginas
| Método | Path | Finalidade |
| ------ | --------------------------------------- | ----------------------------------------------------------- |
| `POST` | `/pages` | cria páginas a partir de N arquivos de imagem enviados (multipart) |
| `POST` | `/pages/from-paths` | caminho rápido só para Tauri que importa por caminho absoluto |
| `POST` | `/pages/{id}/image-layers` | adiciona um node de imagem Custom a partir de um arquivo enviado |
| `PUT` | `/pages/{id}/masks/{role}` | faz upsert de um node de máscara a partir de bytes PNG brutos |
| `GET` | `/pages/{id}/thumbnail` | obtém a thumbnail da página (cache em WebP) |
`role` é `segment` ou `brushInpaint`. `POST /pages` aceita um campo opcional `replace=true`; a importação é ordenada pelo nome de arquivo em ordem natural.
### Cena e blobs
| Método | Path | Finalidade |
| ------ | ------------------- | ----------------------------------------------------------------------- |
| `GET` | `/scene.json` | snapshot completo da cena para clientes web/UI |
| `GET` | `/scene.bin` | `Snapshot { epoch, scene }` codificado em postcard para o cliente Tauri |
| `GET` | `/blobs/{hash}` | bytes brutos do blob por hash Blake3 |
`/scene.bin` inclui o epoch atual no header de response `x-koharu-epoch`.
### Histórico (mutações)
Todas as mutações da cena passam por aqui. Cada response retorna `{ epoch }`.
| Método | Path | Finalidade |
| ------ | ------------------- | ------------------------------------------- |
| `POST` | `/history/apply` | aplica um `Op` (incluindo `Op::Batch`) |
| `POST` | `/history/undo` | reverte a última op aplicada |
| `POST` | `/history/redo` | reaplica a última op desfeita |
`Op` é a união discriminada que cobre add/remove/update node, add/remove page, batch e outras transições da cena. O body é a variante com tag JSON.
### Pipelines
| Método | Path | Finalidade |
| ------ | ------------- | ------------------------------------------------ |
| `POST` | `/pipelines` | inicia uma execução de pipeline como uma operação |
Campos do body:
- `steps` — ids das engines a executar em ordem (validados contra o registry)
- `pages` — subconjunto opcional de `PageId`s; omita para processar o projeto inteiro
- `region` — bounding box opcional para o inpainter (fluxo de pincel de reparo)
- `targetLanguage`, `systemPrompt`, `defaultFont` — overrides opcionais por execução
A response carrega um `operationId`. O progresso e a conclusão chegam em `/events` como `JobStarted`, `JobProgress`, `JobWarning` e `JobFinished`.
### Operações
`/operations` é o registry unificado para jobs em andamento e recém-concluídos (pipelines + downloads).
| Método | Path | Finalidade |
| -------- | --------------------- | ------------------------------------------------------------------ |
| `GET` | `/operations` | snapshot de toda operação em andamento ou recente |
| `DELETE` | `/operations/{id}` | cancela uma execução de pipeline; remoção best-effort para downloads |
### Downloads
| Método | Path | Finalidade |
| ------ | ------------------- | ------------------------------------------------ |
| `GET` | `/downloads` | snapshot de todo download ativo ou recente |
| `POST` | `/downloads` | inicia o download de um pacote de modelo (`{ modelId }`) |
`modelId` é um id de pacote declarado via `declare_hf_model_package!` (ex.: `"model:comic-text-detector:yolo-v5"`). A response é `{ operationId }`, reutilizando o id do pacote.
### Controle do LLM
O modelo carregado é um recurso singleton em `/llm/current`.
| Método | Path | Finalidade |
| -------- | ---------------- | ------------------------------------------------ |
| `GET` | `/llm/current` | estado atual (status, target, error) |
| `PUT` | `/llm/current` | carrega o target informado (local ou de provedor) |
| `DELETE` | `/llm/current` | descarrega / libera o modelo |
| `GET` | `/llm/catalog` | lista os modelos locais + de provedor disponíveis |
`PUT /llm/current` aceita um `LlmLoadRequest`:
- targets de provedor — `{ kind: "provider", providerId, modelId }`
- targets locais — `{ kind: "local", modelId }`
- `options { temperature, maxTokens, customSystemPrompt }` opcional
`PUT /llm/current` retorna `204` assim que a tarefa de carga é enfileirada. O estado pronto efetivo é publicado como `LlmLoaded` em `/events`.
### Configuração
| Método | Path | Finalidade |
| -------- | --------------------------------------- | --------------------------------------------------- |
| `GET` | `/config` | lê o `AppConfig` atual |
| `PATCH` | `/config` | aplica um `ConfigPatch`; persiste e faz broadcast |
| `PUT` | `/config/providers/{id}/secret` | salva (ou sobrescreve) a chave de API de um provedor |
| `DELETE` | `/config/providers/{id}/secret` | limpa a chave de API armazenada de um provedor |
`AppConfig` expõe os top-level `data`, `http`, `pipeline` e `providers`:
- `data.path` — diretório de dados local usado para runtime, cache de modelos e projetos
- `http { connectTimeout, readTimeout, maxRetries }` — client HTTP compartilhado usado por downloads e requests baseados em provedor
- `pipeline { detector, fontDetector, segmenter, bubbleSegmenter, ocr, translator, inpainter, renderer }` — id da engine selecionada para cada etapa
- `providers[] { id, baseUrl?, apiKey? }` — chaves de API salvas vão e voltam como o placeholder redatado `"[REDACTED]"`; nunca o segredo bruto
Ids de provedores embutidos:
- `openai`
- `gemini`
- `claude`
- `deepseek`
- `deepl`
- `google-translate`
- `caiyun`
- `openai-compatible`
As chaves de API ficam armazenadas no credential store da plataforma, não em `config.toml`. Fazer PATCH de `apiKey: ""` limpa a chave salva; fazer PATCH de `"[REDACTED]"` mantém o valor inalterado. As rotas dedicadas `/config/providers/{id}/secret` são a forma explícita, fora do PATCH, de gerenciar o segredo de um provedor.
## Stream de eventos
O Koharu expõe um stream de Server-Sent Events em:
```text
GET /events
```
Comportamento:
- uma conexão nova (sem header `Last-Event-ID`) começa com um evento `Snapshot` contendo os registries atuais de jobs e downloads
- na reconexão, o servidor reenvia, em ordem, os eventos com `seq > Last-Event-ID` que ainda estão no buffer; se o id solicitado já saiu do ring, o servidor reenvia um `Snapshot`
- cada evento ao vivo é emitido com seu `seq` no campo `id:` do SSE
- um keepalive de 15 segundos é mantido
As variantes de evento atualmente incluem:
- `Snapshot` — estado completo inicial para clientes novos e em recuperação de atraso
- `JobStarted`, `JobProgress`, `JobWarning`, `JobFinished` — ciclo de vida do job de pipeline
- `DownloadProgress` — ticks de progresso de download de pacote
- `ConfigChanged` — config foi aplicada via `PATCH /config` ou via uma rota de segredo
- `LlmLoaded`, `LlmUnloaded` — transições do ciclo de vida do LLM
- `SceneAdvanced` — emitido quando uma mutação de cena avança o epoch
## Workflow típico
A ordem normal da API para um projeto novo é:
1. `POST /projects` — cria o projeto
2. `POST /pages` (ou `/pages/from-paths` no Tauri) — importa as imagens
3. `PUT /llm/current` — carrega um modelo de tradução (local ou de provedor)
4. `POST /pipelines` — dispara `detect → ocr → translate → inpaint → render`
5. acompanha `GET /events` até `JobFinished`
6. `POST /projects/current/export` com `format = "rendered"` ou `"psd"`
Para controle mais fino, faça `POST /history/apply` com payloads `Op` explícitos em vez de rodar um pipeline completo.
Se você prefere acesso orientado a agentes em vez de orquestrar endpoints HTTP, veja a [Referência das ferramentas MCP](mcp-tools.md).