API do Seedream 5.0 Pro: gerar imagens com Python
Um POST com o model Dola-Seedream-5.0-pro cria a tarefa de imagem. Veja o código da requisição, o comportamento de tamanho e de selo que observamos e as duas imagens que geramos em 29 de outubro de 2026.
Nesta página
- Qual id de modelo usar e quais operações existem
- O código da requisição
- Os tamanhos e formatos que rodamos, e o que voltou
- O selo e como desligá-lo
- Erros e limites
- Seedream ou GPT Image 2.5 para trabalhar com API?
- FAQ
- Qual id de modelo eu envio para a API?
- Por que a minha imagem tem o selo "AI generated"?
- Quais tamanhos a API aceita?
- Dá para receber PNG em vez de JPEG?
- Posso editar uma imagem existente com o Seedream?
Envie um POST para https://api.omniakey.com/v1/media/tasks com model igual a Dola-Seedream-5.0-pro e a operação de geração, faça polling do id da tarefa até o status virar succeeded e baixe assets[0].url. Por padrão a imagem vem com o selo "AI generated" no canto. Em 29 de outubro de 2026 rodamos essa requisição e uma edição em 1024x1024, e os dois arquivos voltaram como PNG de 1024×1024.
Abaixo ficam o id e as duas operações, o código que rodamos sem alterar, uma lista dos tamanhos que pedimos ao lado dos pixels que lemos em cada arquivo, o selo, a configuração que o desliga (essa não foi executada) e os dois erros que barram uma chamada de criação. As duas imagens são as que fizemos naquele dia.
Qual id de modelo usar e quais operações existem
Use Dola-Seedream-5.0-pro, o id da página do Seedream 5.0 Pro (conferida em 29 de outubro de 2026). A página lista duas operações, texto para imagem e edição de imagem. Ela também diz que gerar e editar custam a mesma tarifa, e que nem o tamanho escolhido nem as imagens de referência anexadas acrescentam valor. As tarifas atuais estão na página de preços.
Estes são os campos que definem uma requisição, antes do prompt:
model:Dola-Seedream-5.0-prooperation:generateoueditparameters.size:1K,1.5K,2K, ouwidthxheightcom umxoutput_format:pngoujpeg, ejpegé o padrão
Os campos de tamanho e formato ficam dentro de parameters. A saída para em 2K: a página do modelo (conferida em 29 de outubro de 2026) não lista tamanho 4K. O Seedream usa um x minúsculo entre os lados, enquanto Qwen e Wan usam asterisco, então mantenha as duas formas separadas num cliente que chama os dois. Nossas execuções usaram a forma widthxheight com 1024x1024 e PNG, e as três faixas ficaram de fora.
A ByteDance vende o mesmo modelo no BytePlus ModelArk com outro id, dola-seedream-5-0-pro-260628. Esse id é do BytePlus, então uma requisição para a OmniaKey quer o id acima.
O código da requisição
O script abaixo é o que rodamos em 29 de outubro de 2026, sem alteração: dois helpers, uma chamada de geração, uma de edição, só biblioteca padrão do Python. Ele lê a sua chave de OMNIAKEY_API_KEY e grava cada PNG na pasta de onde você executa. A documentação da API de imagem descreve os mesmos três passos.
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "Dola-Seedream-5.0-pro"
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def poll(url, attempts=5):
for attempt in range(attempts):
try:
return request("GET", url)
except urllib.error.HTTPError as err:
if err.code < 500 or attempt == attempts - 1:
raise
except urllib.error.URLError:
if attempt == attempts - 1:
raise
time.sleep(5 * (attempt + 1))
def run_task(body, out_path):
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
print("task", task, flush=True)
for _ in range(150):
time.sleep(4)
state = poll(f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # signed link: short-lived, so download now
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=120) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
def generate_image(prompt, out_path, size="1024x1024"):
body = {
"model": MODEL,
"type": "image",
"operation": "generate",
"input": {"prompt": prompt},
"parameters": {"size": size, "output_format": "png"},
}
return run_task(body, out_path)
def edit_image(source_path, prompt, out_path, size="1024x1024"):
with open(source_path, "rb") as f:
image = base64.b64encode(f.read()).decode()
body = {
"model": MODEL,
"type": "image",
"operation": "edit",
"input": {"prompt": prompt, "image": {"data": image, "mime_type": "image/jpeg"}},
"parameters": {"size": size, "output_format": "png"},
}
return run_task(body, out_path)
if __name__ == "__main__":
task = generate_image(
"A glass bottle of cold-pressed orange juice on a pale stone counter, morning light from the left, "
"a single orange slice beside it, shallow depth of field, no text, no logos.",
"juice-bottle.png",
)
print("generate task", task)
task = edit_image(
"cafe-base.jpg",
"Change the red bicycle to matte black. Keep everything else exactly the same: "
"the table, the cup, the window frame and the daylight. Photorealistic, no text, no logos.",
"cafe-edited.png",
)
print("edit task", task)
Os três passos ficam dentro de run_task: crie a tarefa com uma chave de idempotência nova, faça polling da URL da tarefa até o status sair de queued e processing, e baixe a URL do primeiro asset. A chamada de criação responde HTTP 202 com um id que começa com task_, e o status começa como queued (documentação, conferida em 29 de outubro de 2026). Uma tarefa que termina em failed lança o erro da resposta, então o motivo aparece no seu terminal.
Os tamanhos e formatos que rodamos, e o que voltou
As duas execuções pediram a mesma string de tamanho e o mesmo formato, e os dois arquivos voltaram como PNG de 1024×1024.
- Geração — Tamanho pedido:
1024x1024; Pixels no arquivo: 1024×1024; Formato: PNG; Data: 2026-10-29 - Edição — Tamanho pedido:
1024x1024; Pixels no arquivo: 1024×1024; Formato: PNG; Data: 2026-10-29
Leia o tamanho em pixels do arquivo que você baixou. A string de tamanho é o que você pediu; o arquivo é o que você recebeu. Abrimos cada PNG, lemos a largura e a altura e olhamos a imagem ao lado do prompt que a gerou.
A edição é a execução mais interessante. Enviamos um JPEG de 1024×683 de uma janela de café e uma instrução, e voltou uma imagem quadrada. A bicicleta agora está escura, a mesa, a xícara e a planta continuam na foto, e como a saída é quadrada, a janela e a borda da mesa aparecem em outro enquadramento.
Change the red bicycle to matte black. Keep everything else exactly the same: the table, the cup, the window frame and the daylight. Photorealistic, no text, no logos.

O selo e como desligá-lo
Toda saída carrega um selo "AI generated" no canto, a menos que você defina watermark como false em parameters, segundo a página do modelo (conferida em 29 de outubro de 2026). A página coloca o selo no canto inferior direito, e é ali que ele aparece na saída padrão abaixo: discreto e pequeno. Deixe watermark fora da requisição e você recebe o selo.
A glass bottle of cold-pressed orange juice on a pale stone counter, morning light from the left, a single orange slice beside it, shallow depth of field, no text, no logos.
Aqui está essa saída, feita com as configurações padrão:

A configuração com watermark false não foi executada: o limite de gasto por execução da ferramenta do blog barrou a chamada antes de ela sair.
Erros e limites
Dois cabeçalhos decidem se uma chamada de criação passa: o bearer token e um Idempotency-Key.
| O que você envia | O que volta |
|---|---|
| Chamada de criação sem chave de idempotência | 400 missing_idempotency_key |
| Mesma chave e mesmo corpo, de novo | 200 com a tarefa existente, nada novo cobrado |
| Mesma chave, corpo alterado | 409 idempotency_key_reused |
A mesma chave com o mesmo corpo é o retry que você quer: a tarefa existente volta e nada novo é cobrado. A mesma chave com prompt ou tamanho alterado devolve 409, então crie uma chave nova para cada requisição nova. A chave pode ter até 255 caracteres (documentação, conferida em 29 de outubro de 2026).
Mantenha o corpo da requisição abaixo de 1 MiB, com a imagem em Base64 incluída, e reduza uma foto de origem grande antes de enviar. Quando uma tarefa termina com sucesso, a URL de download na resposta é um link assinado que dura cerca de uma hora, segundo a documentação, então baixe o arquivo na hora ou faça polling de novo para pegar um link novo.
Um cabeçalho nos surpreendeu em 29 de outubro de 2026. Um POST enviado com o User-Agent padrão do urllib do Python voltou HTTP 403 com o corpo error code: 1010 do Cloudflare. Nosso próprio cabeçalho User-Agent chegou à API, e nada foi cobrado.
User-Agent seu, como omniakey-example/1. O padrão do Python levou o 403 acima em 29 de outubro de 2026.Seedream ou GPT Image 2.5 para trabalhar com API?
Quem decide é o trabalho. Na nossa edição, o Seedream 5.0 Pro mudou o objeto que nomeamos, a bicicleta, e manteve a maior parte da cena, embora o enquadramento tenha mudado; as duas execuções foram uma janela de café e uma garrafa de suco. A chamada é um corpo só com operation em generate ou edit, e a origem pode ser uma URL pública ou Base64 inline (documentação, conferida em 29 de outubro de 2026).
Para ver o resultado do mesmo prompt ao lado do GPT Image 2, a comparação Seedream 5.0 Pro vs GPT Image 2 mostra as duas saídas de um prompt. Para a mesma forma de gerar e editar em outro modelo, o tutorial da API do GPT Image 2.5 percorre a requisição e os tamanhos. Rode o seu prompt mais difícil no candidato antes de migrar um pipeline, e depois confira as tarifas.
FAQ
Qual id de modelo eu envio para a API?
Dola-Seedream-5.0-pro, o id da requisição de exemplo da página do modelo (conferida em 29 de outubro de 2026). O dola-seedream-5-0-pro-260628 do próprio ByteDance pertence ao BytePlus ModelArk, e a OmniaKey usa o id acima.
Por que a minha imagem tem o selo "AI generated"?
Toda saída do Seedream 5.0 Pro carrega o selo no canto inferior direito, a menos que você defina watermark como false, segundo a página do modelo (conferida em 29 de outubro de 2026). Nossa execução com as configurações padrão em 29 de outubro de 2026 trouxe o selo.
Quais tamanhos a API aceita?
As faixas 1K, 1.5K e 2K, ou a forma widthxheight com um x minúsculo entre os lados (página do modelo, conferida em 29 de outubro de 2026). A saída para em 2K, e nossas duas execuções pediram 1024x1024.
Dá para receber PNG em vez de JPEG?
Dá. output_format aceita png ou jpeg, e JPEG é o padrão (documentação, conferida em 29 de outubro de 2026). Rodamos PNG nas duas execuções e recebemos PNG de volta.
Posso editar uma imagem existente com o Seedream?
Sim: envie operation em edit com o prompt e a imagem de origem, seja em Base64 inline com o mime type, seja como URL pública. A edição da janela de café está na seção de tamanhos acima.
Modelos deste artigo
Artigos relacionados
Seedream 5.0 Pro vs GPT Image 2: teste com o mesmo prompt e preço
Seis trabalhos, os mesmos prompts, três modelos: o que cada um fez e quanto custou.
GPT Image 2.5 API: gerar e editar imagens em Python
Um POST cria a tarefa e um GET lê o resultado. Aqui estão o código da requisição, os tamanhos que rodamos em 29 de outubro de 2026 e uma edição mostrada antes e depois.
Kling 3.0 API: código da requisição de texto para vídeo e clipes reais
Uma tarefa de texto para vídeo é um POST com o modelo kling-3.0. Aqui estão o código da requisição, os campos que ela recebe e dois clipes de 5 segundos que fizemos em 29 de outubro de 2026, com as medidas.
Artigos recentes
- Clapping Cat Meme AI: faça seu pet bater palmas com imagem para vídeo
- Como usar as APIs do Claude e do GPT no DeepSeek Harness
- Alternativa à API do FLUX Kontext: edite imagens com o GPT Image 2
- Guia de prompts do Kling 3.0: estrutura, exemplos e clipes reais
- Guia de prompts do MiniMax H3: estrutura, exemplos e clipes reais