status: "failed". As tarefas falhadas e canceladas não são faturadas. Só paga pelas tarefas concluídas. Numa node app, a tarefa da própria app nunca é faturada. Cada nó de geração ou de LLM é cobrado quando a sua própria tarefa é concluída. Uma falha não cancela nós paralelos nem outros ramos, por isso um nó que seja concluído depois de a app já ter falhado também é cobrado, e essas cobranças não são reembolsadas. Um nó que falhe, seja cancelado ou nunca chegue a começar não é cobrado. Consulte Chaves de API e faturação.
Erros no momento do pedido e tarefas falhadas
Os erros no momento do pedido devolvem um estado4xx ou 5xx. Não é criada nenhuma tarefa. Leia o corpo conforme descrito abaixo.
As tarefas falhadas devolvem um estado de sucesso no momento da submissão. Consulte GET /jobs/{id} ou aguarde um webhook. Quando a tarefa termina, status é "failed" e a falha está no objeto error de nível superior. Não leia result numa tarefa falhada: é omitido (ou null). Só contém o resultado quando status é "completed". Uma tarefa cancelled não tem result nem error.
Ramifique a lógica com base em error.code. message pode ser omitido e, para provider_error e internal, é texto livre do fornecedor. Não faça parsing de message.
Corpos de resposta
Em generate, jobs, assets, styles e node apps, leiamessage ?? error quando o corpo é JSON. Um destes dois campos contém o resumo. Alguns corpos 5xx não são JSON, incluindo um 502 cujo corpo é o texto simples error code: 502. Faça o parsing de forma defensiva: se o corpo não for JSON, ramifique com base no estado HTTP.
A maioria das falhas usa { "message": "..." }, por vezes com campos adicionais (limit, jobType, modelAccessDenial). O JSON inválido e alguns handlers abaixo usam { "error": "..." } em alternativa.
Os endpoints MCP, como /mcp, devolvem erros JSON-RPC, { "jsonrpc", "id", "error": { "code", "message" } }, e não os corpos HTTP descritos nesta página.
Envie Accept: application/json
Os erros { "message" }, incluindo 401 e 404, são JSON quando Accept é application/json ou */*. Quando Accept está ausente, ou é text/html, esses estados são uma página HTML (Content-Type: text/html) e um parser de JSON vai falhar.
Isto é relevante para clientes que não enviam nenhum cabeçalho Accept. O urllib do Python é um deles. O curl envia Accept: */* por predefinição, e o fetch do Node também, pelo que ambos recebem JSON, a menos que substitua Accept.
Os pedidos não autenticados a POST /generate/..., GET /jobs/{id}, GET /styles e GET /assets devolvem 401 {"message":"Unauthorized"} para */* e application/json, e uma página HTML quando Accept está ausente ou é text/html. Um GET /jobs/{id} autenticado para um id desconhecido faz o mesmo com o estado: 404 JSON {"message":"Job not found or unauthorized"} quando Accept pede JSON, e 404 text/html quando Accept está ausente.
O JSON inválido (400) e a validação (422) usam { "error" } e continuam a ser JSON mesmo quando Accept está ausente. O mesmo acontece com o 422 de campo removido, o 410 de fim de vida, o 402 de Zero Data Retention, as respostas { "error" } das node apps e os erros mapeados da API de operações do Agent. Os 402 e 429 resultantes da admissão de uma tarefa POST /generate/... também são JSON, incluindo com um Accept de navegador.
Os 413 e 500 usam { "message" } e seguem Accept, tal como 401 e 404.
Validação (422)
details lista todos os problemas. field é o caminho unido com . ("image_style_references.0.url"). Os erros ao nível do objeto usam uma string vazia, como acontece com a chave desconhecida acima. Várias chaves desconhecidas produzem Unrecognized keys: ... e o mesmo field vazio. expected só é adicionado quando code é "invalid_type".
Um cabeçalho X-Webhook-URL inválido usa este mesmo 422.
GET /jobs com parâmetros de consulta inválidos também devolve este 422. Não é um 400.
Uma verificação de input de Zero Data Retention que falhe dentro da ferramenta devolve 422 com a explicação em message (o formato { "message" }, por isso Accept é relevante). Consulte Zero Data Retention.
Campos removidos e descontinuados (422)
O campo removido batchSize / batch_size usa um 422 diferente. Não existe uma matriz details:
batch_size é removido da mesma forma. field é o nome que tiver enviado.
Um alias de campo descontinuado usa reason "deprecated_field" ou "conflicting_fields", além de replacement, sunset_date e migration_url quando aplicável. Ramifique com base em error e reason. A frase a mostrar a uma pessoa é message.
Modelos em fim de vida (410)
Um modelo que já passou a data de fim de vida devolve 410 com Deprecation: true e um cabeçalho Sunset (uma data RFC 1123):
error é o valor estável "model_unavailable". replacement e migration_url são omitidos quando não existe uma substituição recomendada. Repetir o pedido com o mesmo modelo continuará a devolver 410. Mude para replacement quando estiver definido e consulte Descontinuações.
Um modelo descontinuado mas ainda ativo envia Deprecation e Sunset em todas as respostas, incluindo erros. Usar um alias de campo descontinuado faz o mesmo, incluindo no seu próprio 422. Quando existe um guia de migração, é também enviado um cabeçalho Link: <migration_url>; rel="deprecation".
Códigos de estado
400
O JSON inválido em generate é sempre JSON, sem ser necessário nenhum cabeçalho Accept:
{ "error" } para um URL de input que não consegue usar: Invalid URL for input "<key>", ou Failed to download URL for <key>: …. A mensagem de download abrange também falhas temporárias, por isso, ao contrário de generate (consulte Downloads de input), uma falha de download numa node app é sempre 400. Repita uma vez se o URL for válido.
O JSON inválido em POST /node-apps/{id}/execute não é o 400 de generate acima. Torna-se um 500 { "message": "Internal Error" }, sem texto da exceção, e segue Accept.
Outras respostas 400 em assets e node apps são { "message": "..." } com uma breve explicação, por exemplo No file provided num upload pré-assinado ou Invalid pagination parameters nas versões de node apps. Um upload de asset falhado transmite o estado do serviço de upload (400, 401, 404 ou 500) e pode colocar o texto da resposta deste em message. Esse texto é por vezes uma string JSON. Os parâmetros de consulta inválidos em GET /jobs são 422, não 400.
401
Generate, jobs, assets, styles e node apps:
{ "message": "Presigned upload URL expired" } ou { "message": "Invalid presigned upload URL" }.
402 Pagamento necessário
Para um cliente faturado pela API (uma chave de API, ou MCP com uma chave de API) cujo saldo de API não cubra a tarefa:
message de 402 na API pública:
Uma chamada a generate com Zero Data Retention numa workspace que não o tem ativado devolve este corpo, sempre em JSON:
402. Esses recorrem ao saldo de computação da workspace, e não ao saldo de API.
403
404
Todos os 404 são { "message" }, por exemplo um id de tarefa desconhecido:
Accept torna-os HTML, exceto o Endpoint not found para um modelo que a sua chave ou o seu plano não pode usar, que é sempre JSON. Um GET /jobs/{id} autenticado para um id desconhecido sem Accept é 404 text/html.
Uma operação do Agent desconhecida também é
404 { "message": "Endpoint not found" }, e não o formato { "error", "code" } do Agent.
405
O corpo é texto simples sem cabeçalho Content-Type, não JSON, incluindo quando Accept é application/json. O texto é o método seguido de method not allowed, por exemplo GET method not allowed. Um cabeçalho Allow lista os métodos que o caminho aceita.
413 Payload demasiado grande
Um corpo de pedido demasiado grande é rejeitado com 413. Quando vem da própria API, o corpo segue Accept:
413. Não envie ficheiros inline. Carregue o ficheiro com POST /assets e passe o URL devolvido no pedido de geração.
Downloads de input
Um servidor que devolva404 ou 410 resulta num 422 permanente. O corpo é JSON, e Accept é relevante:
410 do servidor usa a mesma frase com 410. Outras rejeições permanentes usam Input file rejected: ….
Uma falha de download que se pode repetir é 502 ou 504. Ramifique com base no código de estado, não no corpo, e repita.
Um
502 que se repete constantemente para o mesmo URL significa provavelmente que o URL está bloqueado ou danificado. Altere o URL.
As falhas de conversão na exportação 3D também são 502. Esse caminho não foi testado em produção, por isso o corpo também pode chegar como texto simples da Cloudflare error code: 502. Ramifique com base no código de estado e repita. Um 502 que se repete constantemente para o mesmo URL de modelo significa provavelmente que o URL está bloqueado ou danificado.
429 de concorrência
Quando a tarefa não pode entrar em backlog, um pedido acima do limite de concorrência pode ser rejeitado com 429 e Content-Type: application/json:
limit é o seu limite de concorrência para este tipo de tarefa. É contabilizado por utilizador, não por workspace. É aproximado: um pico curto pode ser aceite acima dele, por isso não conte que seja o pedido limit + 1 a falhar. jobType é uma categoria interna de tarefa, não o caminho público do modelo. Não ramifique com base nele.
O Krea 2 também pode devolver apenas { "message": "CONCURRENCY_LIMIT_REACHED" }, sem limit nem jobType, quando a sua fila partilhada está cheia. Esse não é o seu limite. Aguarde e repita.
O backlog só está ativo quando o plano o inclui (Pro e superiores), o modelo o suporta e o pedido não usa Zero Data Retention. De momento, os pedidos ao Krea 2 não entram em backlog em nenhum plano, por isso devolvem 429 acima do limite. Quando está ativo, a tarefa adicional é aceite com status: "backlogged" e começa assim que houver uma vaga livre. Não existe um limite separado para o backlog. Consulte Limites de taxa.
A API não envia Retry-After nem X-RateLimit-*. A resposta inclui cf-ray. Perante um 429, repita com backoff exponencial depois de as tarefas em curso terminarem (consulte GET /jobs/{id} ou use um webhook).
Se uma conclusão posterior esgotar o saldo, as tarefas que ainda estejam no backlog falham com error.code "insufficient_balance". Trata-se de uma tarefa falhada, não de um HTTP 402. Essas tarefas não enviam webhook, por isso consulte GET /jobs/{id} para as tarefas em backlog.
API de operações do Agent
POST /agent/{operation} e GET /agent/session/{sessionId} devolvem { "error", "code"?, "allowedModels"? }. Apenas error é obrigatório. allowedModels está em camelCase. Um turno que falhe depois de ter sido aceite aparece como status: "failed" na sessão, e não como um destes erros HTTP. Consulte Agent.
Um código de erro do Agent não reconhecido continua a ser
422 com { "error", "code" }. O 404 de operação desconhecida e um 500 não tratado usam { "message" } e seguem Accept.
error.code de tarefas falhadas
GET /jobs e GET /jobs/{id} só definem error quando status é "failed". Não existe um result utilizável:
As entregas de webhook para uma tarefa falhada usam o mesmo objeto de tarefa, incluindo
error. Uma entrega de cancelamento não tem error. Um payload com mais de 256 KiB não é enviado, e não são feitas mais entregas para essa tarefa, por isso consulte GET /jobs/{id} em alternativa. Verifique a assinatura antes de confiar no corpo. Consulte Webhooks.
Depuração
Não existe um cabeçalho de id de pedido da Krea. Todas as respostas incluem o cabeçalhocf-ray da Cloudflare. Não é enviado nenhum cabeçalho Retry-After nem X-RateLimit-*.
Quando escrever para support@krea.ai, inclua:
- O
job_id, quando a chamada criou ou referiu uma tarefa - A hora e o endpoint
- Para um erro no momento do pedido, o valor de
cf-ray
Access-Control-Allow-Origin é *. Em generate, jobs, assets, styles e node apps, Access-Control-Expose-Headers não está definido, por isso o fetch do navegador não consegue ler cf-ray, Deprecation nem Sunset. Copie cf-ray do registo de rede, ou a partir de um cliente do lado do servidor.
Em qualquer resposta, verifique Deprecation e Sunset antes de o modelo deixar de aceitar chamadas. Consulte Descontinuações.
Próximos passos
Ciclo de vida das tarefas
Consulte o estado até a tarefa ser concluída, falhar ou ser cancelada
Webhooks
Verifique a assinatura numa entrega de tarefa falhada
Limites de taxa
Quando as tarefas adicionais entram em backlog e quando devolvem 429
Chaves de API e faturação
Carregue o saldo de API após um 402