GPT-6 Sol e Claude Opus 5.5 disponíveisGPT-6 Sol pela metade do preço do 5.6 Sol

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.

Kiki, OmniaKey COO7 min de leitura
Nesta página

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-pro
  • operation: generate ou edit
  • parameters.size: 1K, 1.5K, 2K, ou widthxheight com um x
  • output_format: png ou jpeg, e jpeg é 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.

python
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.

prompt
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.
À esquerda: uma janela de café com uma bicicleta vermelha do lado de fora. À direita: a mesma janela depois da edição, com a bicicleta escura, num enquadramento quadrado.
À esquerda: a foto de origem que enviamos, 1024×683. À direita: a saída de uma edição em 29 de outubro de 2026, tamanho 1024x1024. A bicicleta agora está escura. A saída é quadrada, então a janela e a borda da mesa aparecem em outro enquadramento.

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.

prompt
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:

Uma garrafa de vidro de suco de laranja com uma fatia de laranja sobre um balcão de pedra clara, com um selo AI generated discreto no canto.
Gerada com o Seedream 5.0 Pro pela API da OmniaKey em 29 de outubro de 2026, tamanho 1024x1024, configurações padrão. O selo discreto de 'AI generated' fica no canto inferior direito.

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ê enviaO que volta
Chamada de criação sem chave de idempotência400 missing_idempotency_key
Mesma chave e mesmo corpo, de novo200 com a tarefa existente, nada novo cobrado
Mesma chave, corpo alterado409 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.

Envie um cabeçalho 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

Seedream 5.0 ProAPI de imagensPythontexto para imagemAPI

Artigos relacionados

Artigos recentes