Geração de imagens (API OpenAI Images)
Geração síncrona de imagens no formato da API OpenAI Images: parâmetros, uma espera de até 300 segundos, cobrança somente por uma imagem concluída e configuração do Cherry Studio. A edição é feita por meio de /api/media/generate de forma assíncrona.
POST /v1/images/generations gera imagens no formato da API OpenAI Images: você envia uma solicitação e recebe a imagem na mesma resposta. Ele é um adaptador sobre a mesma fila que POST /api/media/generate: os modelos, o preço, a verificação de saldo, o failover de fornecedores e a cobrança são compartilhados, portanto a mesma geração custa o mesmo nos dois endereços.
curl https://getvibeapi.com/v1/images/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"nano-banana","prompt":"a red bicycle on a bridge","n":1,"size":"1024x1024"}'Resposta (HTTP 200):
{
"created": 1792706400,
"data": [{ "url": "https://getvibeapi.com/media/r/…/0.png" }]
}Passe a chave como Authorization: Bearer sk-pv-… ou x-api-key. O SDK oficial da OpenAI funciona sem alterações:
from openai import OpenAI
client = OpenAI(base_url="https://getvibeapi.com/v1", api_key="sk-pv-...", timeout=600)
image = client.images.generate(model="nano-banana", prompt="a red bicycle on a bridge", size="1024x1024")
print(image.data[0].url)Parâmetros do corpo
| Parâmetro | Tipo | Descrição |
|---|---|---|
modelreq. | string | Um id de modelo de imagem de /api/media-catalog (kind: "image"), por exemplo, nano-banana, gpt-image-2, flux-2. Um id com prefixo do fornecedor (google/nano-banana) e uma variante fixada (gpt-image-2:network) também são aceitos. Modelos de vídeo e áudio são recusados aqui com 400. |
promptreq. | string | Descrição da imagem. |
n | number | Somente 1: cada geração é uma tarefa separada com seu próprio preço. Para gerar várias imagens, envie várias solicitações. |
size | string | É considerado como uma proporção de aspecto: 1024x1024 → 1:1, 1792x1024 → 16:9, 1024x1792 → 9:16, 1536x1024 → 3:2, 1024x1536 → 2:3; outros valores são reduzidos exatamente (1920x1080 → 16:9). Uma proporção que o modelo não oferece é recusada com a lista de tamanhos compatíveis — não há substituição pela correspondência mais próxima. "auto" ou a ausência do campo significa o padrão do modelo. |
quality | string | Somente para modelos com um parâmetro de qualidade no catálogo; um valor incompatível é recusado. "auto" o omite. |
response_format | "url" | "b64_json" | url por padrão. b64_json retorna o arquivo no corpo da resposta (até 20 MB). |
user | string | Aceito e ignorado. |
Campos desconhecidos e background, style, output_format, output_compression, moderation, stream e partial_images são recusados com 400 pelo nome, em vez de serem descartados silenciosamente — caso contrário, você pagaria por uma imagem que não pediu. Modelos que precisam de uma imagem de origem (edição, aumento de resolução, preenchimento) não funcionam neste endereço, porque não há como passar uma imagem aqui; use POST /api/media/generate.
Espera e tempo limite
A solicitação permanece aberta até a conclusão da tarefa, por até 300 segundos. O tempo mediano é de 15 a 85 segundos, dependendo do modelo; gerações individuais nos modelos mais lentos levam de 3 a 4 minutos. Defina o tempo limite do cliente como pelo menos 300 segundos (o padrão do SDK da OpenAI é 600).
- Toda resposta, incluindo erros após a criação da tarefa, contém o cabeçalho
x-pv-media-job-idcom o id da tarefa. - Se a tarefa não for concluída em 300 segundos, a resposta será
504comcause: image_generation_timeoute o id da tarefa na mensagem. A geração continua em execução: obtenha-a emGET /api/media/jobs/{id}. - Se a conexão cair (tempo limite do app, rede), a tarefa ainda será concluída.
GET /v1/images/generations?limit=20(até 100) lista as imagens recentes desta chave com o status, os links e o valor cobradocost_rub.
Faturamento
Nada é cobrado no envio. Somente uma geração concluída com sucesso é cobrada, pelo mesmo preço de /api/media-catalog e da cotação de POST /api/media/price. Uma geração malsucedida retorna 502 com a mensagem "Nothing was charged" e não custa nada. O valor cobrado é retornado no cabeçalho x-pv-cost-rub. Se o saldo não puder cobrir a geração, a resposta será 402 antes do início de qualquer tarefa.
data[].url apontam para nosso domínio e ficam disponíveis por 7 dias após a conclusão da geração; depois respondem 410 media_result_expired. Salve os arquivos do seu lado.Erros
| Parâmetro | Tipo | Descrição |
|---|---|---|
400 | invalid_request_error | Invalid body: unknown_parameter, unsupported_parameter, unsupported_n, unsupported_size, unsupported_quality, unsupported_model_kind. Fix the request. |
401 / 403 | authentication_error / permission_error | Chave inválida ou o IP que fez a chamada não está na lista de permissões da chave. |
402 | insufficient_quota | Saldo insuficiente para esta geração. Nenhuma tarefa foi criada. |
404 | not_found_error | model_not_found — não há nenhum modelo de imagem com esse nome. Consulte /api/media-catalog. |
429 | rate_limit_error | Limite de taxa de mídia; tente novamente após Retry-After. |
502 | upstream_error | A geração falhou. Nada foi cobrado; você pode tentar novamente. |
503 | upstream_error | O modelo está indisponível em todos os fornecedores no momento. Nenhuma tarefa foi criada; tente novamente mais tarde ou escolha outro modelo. |
504 | upstream_error | image_generation_timeout — o trabalho ainda está em execução; recupere-o pelo ID indicado por x-pv-media-job-id. |
Apps para desktop (Cherry Studio e outros)
Qualquer app que possa gerar imagens por meio de um provedor compatível com OpenAI funciona. Usando o Cherry Studio como exemplo:
- Adicione um provedor do tipo OpenAI com o endereço da API
https://getvibeapi.com(o app adiciona/v1por conta própria) e sua chavesk-pv-…. - Adicione o modelo manualmente, usando um id de
https://getvibeapi.com/api/media-catalog(somente entradas comkind: "image"), por exemplo,nano-bananaougpt-image-2. A lista de modelos do app mostra modelos de texto; os modelos de mídia não aparecem nela. - Gere a partir do recurso de pintura / geração de imagens do app, não a partir do chat comum. O chat envia a solicitação para
/v1/chat/completions, onde os modelos de imagem não funcionam. - Se o app permitir definir um tempo limite da solicitação, defina-o como pelo menos 300 segundos. Uma imagem da qual o app desistiu aparece em
GET /v1/images/generations. Tentar novamente pelo app cria uma nova geração, que é cobrada separadamente.
O modo que edita uma imagem enviada em aplicativos desse tipo é chamado de /v1/images/edits, que também é disponibilizado (veja abaixo).
Editing: /v1/images/edits
POST /v1/images/edits recebe a solicitação do SDK da OpenAI (multipart/form-data: o arquivo em image, ou vários arquivos em image[], com prompt, model, size, quality e response_format) ou JSON com images: [{"image_url": "…"}]. Ele funciona como a geração acima: a mesma resposta, o mesmo tempo de espera, o mesmo x-pv-media-job-id e o mesmo preço que POST /api/media/generate com uma imagem de origem; uma edição malsucedida não é cobrada. O modo de edição do modelo é escolhido no catálogo. Um mask é recusado com 400 unsupported_parameter, e um modelo que não aceita imagem de origem com model_cannot_edit. Para uma edição com máscara, use POST /api/media/generate e consulte GET /api/media/jobs/{id} — veja o guia de geração assíncrona. Vídeos não são gerados de forma síncrona: /v1/video/generations e /v1/videos também respondem com 410 (detalhes).
ID do Nano Banana Pro
No catálogo e em códigos novos, use nano-banana-pro. Para migrar clientes assíncronos existentes, o valor gemini-3-pro-image ainda é aceito apenas no campo model da solicitação /api/media/generate e é resolvido para o mesmo modelo público. Ele não é publicado na descoberta nem nos preços.