Tutorial
Como usar o imagen-4.0-ultra através da API HiAPI: curl, Python e exemplos de requisição executáveis
Guia passo a passo para chamar o modelo de imagem de maior qualidade a partir do endpoint compatível com OpenAI da HiAPI
O que é o imagen-4.0-ultra e quando escolhê-lo
O imagen-4.0-ultra é o nível de maior fidelidade da série imagen-4.0, e a HiAPI o expõe como modelo de geração de imagens no mesmo endpoint compatível com OpenAI usado para chat e outras séries de modelos. O modelo mental é simples: você envia um corpo de requisição JSON estruturado que descreve a imagem e recebe de volta dados de imagem — não o resultado de uma conclusão de chat.
Escolher entre os níveis depende principalmente da tarefa, não de um ranking:
- Rascunhos e iteração. Se você está explorando prompts, testando composições ou gerando miniaturas para definir a direção, modelos de imagem mais leves retornam mais rápido e custam menos por geração. Reserve o ultra para a rodada que realmente importa.
- Materiais finais. Key visuals, visuais de marketing e qualquer conteúdo que humanos vão examinar em tamanho original se beneficiam do nível de detalhe do ultra, da aderência ao prompt e da capacidade de lidar com cenas complexas que contêm múltiplos sujeitos ou elementos semelhantes a texto.
- Pipelines em lote com controle de qualidade. Um padrão comum é produzir rascunhos amplamente com um modelo leve e depois reexecutar apenas os prompts selecionados no imagen-4.0-ultra. Como a HiAPI coloca o ID do modelo no corpo da requisição, trocar de nível é apenas mudar uma string, não fazer uma nova integração.
Algumas expectativas precisam ser definidas desde já. A geração de imagens não é instantânea; uma única requisição ultra pode levar bem mais tempo que uma conclusão de texto, então projete o cliente com timeouts folgados e não presuma latência abaixo de um segundo. E como a resposta carrega dados binários de imagem em vez de um array choices, qualquer código de parsing escrito para modelos de chat não se aplica — planeje isso desde o início.
Se você não tem certeza se precisa do ultra, envie primeiro uma requisição mínima, verifique a saída na resolução em que você realmente pretende entregar e depois compare com níveis mais leves. Julgar a qualidade da imagem por uma prévia reduzida é enganoso.
Pré-requisitos e configuração de autenticação
Antes de enviar a primeira requisição, confirme três coisas: você tem uma chave de API da HiAPI, sabe a URL base do endpoint da API compatível com OpenAI e sua ferramenta consegue fazer requisições HTTPS (curl, ou Python com requests, ou até httpx).
Mantenha a chave longe do seu código
Armazene a chave em uma variável de ambiente em vez de colá-la no script:
export HIAPI_API_KEY="your_api_key_here"
Em produção, use o gerenciador de segredos da plataforma e injete o valor em tempo de execução. Fazer commit de chaves no repositório é a forma mais comum de vazamento de credenciais, e rotacionar uma chave é muito mais doloroso do que lê-la de uma variável de ambiente.
Cabeçalhos de autenticação
Cada requisição carrega o cabeçalho padrão de token Bearer:
Authorization: Bearer $HIAPI_API_KEY
Content-Type: application/json
Os dois cabeçalhos importam. A falta de Content-Type pode fazer o servidor rejeitar ou interpretar mal o corpo da requisição, às vezes apresentando um erro genérico confuso em vez de uma mensagem de validação clara.
A mesma chave e o mesmo padrão de cabeçalho funcionam em todas as séries de modelos da HiAPI, e esse é o ganho prático do endpoint unificado: uma credencial, um cliente, vários modelos.
Verificação rápida de sanidade
Se você tiver um ID de modelo com suporte a chat em mãos, enviar primeiro uma requisição de texto simples é uma forma de baixo custo de confirmar que a chave e os cabeçalhos estão corretos antes de depurar o corpo de uma requisição de imagem. Separar problemas de autenticação de problemas de corpo de requisição economiza tempo de verdade. Se a requisição de texto funcionar e a de imagem falhar, você já sabe que o problema está no corpo da requisição de imagem.
Montando o corpo da requisição
Comece com o menor corpo de requisição capaz de gerar uma imagem: o ID do modelo mais um prompt. Todo o resto é otimização opcional.
{
"model": "imagen-4.0-ultra",
"prompt": "A sunlit reading room with tall windows, a wooden desk, and shelves of worn books, soft dust motes in the light"
}
Duas regras o mantêm sustentável. Primeiro, o ID do modelo deve ser exatamente o que a HiAPI registra para esse modelo — sem espaços, sem sufixo de versão inventado por você. Segundo, o prompt é linguagem natural pura; escreva como se descrevesse uma imagem a um fotógrafo, preferindo substantivos concretos e pistas de iluminação ou composição em vez de adjetivos abstratos.
Formatos de prompt que costumam funcionar
- Primeiro o sujeito, depois a cena, depois o estilo. "A fox in a snowy birch forest, morning light, shallow depth of field" é mais confiável do que uma pilha de palavras-chave de estilo.
- Seja específico sobre a composição. Mencione o ângulo de câmera, o enquadramento ou o layout quando forem importantes para o seu caso de uso.
- Evite contradições. Pedir "minimalista" e "detalhes ornamentais elaborados" na mesma frase costuma produzir um compromisso indesejado.
Tamanho e proporção
Modelos de imagem costumam aceitar opções de largura/altura ou de proporção, mas o nome exato dos parâmetros e os valores suportados variam por modelo. Não adivinhe: consulte a documentação de parâmetros do modelo na HiAPI e use apenas os valores listados. Se você passar um tamanho ou proporção sem suporte no modelo, espere um erro de validação — não um fallback silencioso.
O fluxo seguro é: comece com os padrões, confirme uma resposta bem-sucedida e só então adicione um parâmetro de tamanho por vez, verificando a saída. Se a requisição começar a falhar depois de adicionar um parâmetro, você localizou a causa na última mudança.
Não inclua nenhum parâmetro opcional na primeira requisição. Um corpo com dois campos que funciona é uma base melhor do que um corpo com dez campos que falha.
Uma requisição curl executável
Depois de exportar a chave, este é o formato de requisição que você pode copiar e adaptar:
curl -sS -X POST "$HIAPI_BASE_URL/images/generations" \
-H "Authorization: Bearer $HIAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "imagen-4.0-ultra",
"prompt": "A sunlit reading room with tall windows, a wooden desk, and shelves of worn books, soft dust motes in the light"
}'
O que cada parte faz:
-X POST— a geração de imagens é uma operação de criação, não de leitura.- URL — a rota de geração de imagens no endpoint compatível com OpenAI da HiAPI. Defina
HIAPI_BASE_URLcom a URL base mostrada na documentação da HiAPI, para que o caminho continue correto mesmo se o host mudar. - Os dois cabeçalhos — autenticação Bearer e tipo de conteúdo JSON, como descrito acima.
- Corpo
-d— o mesmo JSON que você vai reutilizar em Python. As aspas importam: envolva o payload em aspas simples para impedir que o shell expanda qualquer coisa dentro dele.
Dicas de depuração
Acrescente -i para incluir os cabeçalhos de resposta, assim você vê o status HTTP mesmo quando o corpo é grande. Se quiser confirmar o que foi realmente enviado, acrescente -v e leia a linha da requisição — isso expõe rapidamente uma URL malformada ou um cabeçalho ausente.
Se a saída no terminal for uma grande massa de base64 ou ruído binário, a requisição foi bem-sucedida. Não a canalize para logs; consulte a seção de tratamento de resposta para uma abordagem mais limpa. Redirecionar a resposta bruta para um arquivo (> out.json) é aceitável para uma verificação pontual.
Quando o curl retorna um status de sucesso e um corpo analisável, você tem um contrato verificado. A etapa em Python deve reproduzir esse JSON exatamente (em estrutura), para que qualquer falha posterior seja atribuída ao código, e não a uma requisição diferente.
A mesma requisição em Python
Com requests, a chamada equivalente fica próxima da versão curl, o que torna a verificação cruzada trivial:
import os
import requests
base_url = os.environ["HIAPI_BASE_URL"]
api_key = os.environ["HIAPI_API_KEY"]
payload = {
"model": "imagen-4.0-ultra",
"prompt": (
"A sunlit reading room with tall windows, a wooden desk, "
"and shelves of worn books, soft dust motes in the light"
),
}
response = requests.post(
f"{base_url}/images/generations",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
},
json=payload,
timeout=120,
)
response.raise_for_status()
result = response.json()
Alguns pontos que importam na prática:
json=payloadserializa o dicionário e define o tipo de conteúdo para você. Ainda assim, você pode passar os cabeçalhos explicitamente por clareza ou para manter a paridade com o curl.timeout=120não é decoração. A geração de imagens pode ser lenta; sem timeout explícito, você herda o padrão da biblioteca, que pode ser menor do que o esperado, e o aborto do cliente parece uma falha do servidor.raise_for_status()transforma respostas 4xx e 5xx em exceções, em vez de deixar um corpo de erro malformado fluir para o seu código de parsing.
Encapsule para reutilizar
Coloque a chamada em uma função pequena que recebe o prompt e parâmetros opcionais, retorna o resultado analisado e registra apenas o ID do modelo, o comprimento do prompt, o código de status e o tempo decorrido. Essa linha de log basta para depurar a maioria dos problemas, sem armazenar megabytes de dados de imagem em agregadores de log.
Como o corpo da requisição é JSON puro, a mesma função serve para outros modelos de imagem na HiAPI — troque o ID do modelo e, se necessário, o parâmetro de tamanho suportado. Mantenha alguns prompts de exemplo no script de teste, para que, após qualquer atualização do cliente, você possa reexecutar uma requisição sabidamente funcional e obter sinal rapidamente.
Tratando a resposta de imagem
A resposta é um payload de imagem, não uma conclusão de chat. Não procure por choices[0].message.content — escreva o código de parsing de acordo com o que a rota de imagens realmente retorna, conforme documentado pela HiAPI.
Parsing defensivo
A resposta costuma carregar os dados da imagem como uma string base64, às vezes acompanhada de metadados. Só decodifique depois de confirmar que o campo existe:
import base64
item = result["data"][0]
image_b64 = item.get("b64_json")
if image_b64 is None:
# 某些响应可能携带 URL 或其他格式;请查阅文档
raise ValueError(f"Unexpected image payload keys: {list(item)}")
image_bytes = base64.b64decode(image_b64)
with open("output.png", "wb") as f:
f.write(image_bytes)
O list(item) na mensagem de erro é a parte útil: quando o payload mudar, ele mostra as chaves reais em vez de deixar você adivinhar.
Registre logs sem despejar binários
Nunca registre o corpo bruto da resposta de uma requisição de imagem — ele é enorme e em grande parte ilegível. Registre o código de status, o comprimento do conteúdo, o ID do modelo e o hash ou a contagem de bytes da imagem decodificada. Isso basta para verificar que cada prompt produziu uma imagem diferente, sem inflar o armazenamento.
Hábitos operacionais
- Valide antes de armazenar. Confirme que os bytes decodificados começam com uma assinatura de imagem reconhecível e capture erros de decodificação no ponto onde você grava o arquivo.
- Escrita atômica. Grave em um caminho temporário e renomeie após o sucesso, para que uma falha no meio da escrita não deixe um arquivo truncado com aparência válida.
- Salve o prompt junto com a saída. Guarde o prompt, o ID do modelo e quaisquer parâmetros de tamanho ao lado de cada imagem. Quando um stakeholder pedir uma variante mais tarde, você vai precisar da requisição original.
- Defina uma política de retenção. Imagens geradas se acumulam; decida cedo onde elas ficam e por quanto tempo.
Diagnosticando requisições que falham
A maioria das falhas na primeira requisição se enquadra em três categorias. Verifique-as nesta ordem antes de mexer no prompt.
Falhas de autenticação
401 ou 403 quase sempre significa cabeçalho incorreto. Verifique se o esquema é exatamente Bearer, seguido de um espaço e da chave, sem espaços à direita ou aspas extras. Confirme que a variável de ambiente está realmente definida no shell ou processo onde você executa a requisição — uma chave exportada em um terminal não existe em outro. Se você rotacionou a chave recentemente, certifique-se de que o valor antigo não continua em cache em um arquivo de configuração ou segredo de implantação.
ID de modelo errado
Uma resposta de modelo não encontrado significa que o campo model não corresponde ao ID registrado na HiAPI. Copie o identificador da documentação de modelos da HiAPI em vez de digitá-lo novamente; um caractere errado ou um sufixo de versão inventado basta para causar a falha. Se você trocou o ID do modelo para comparar níveis, verifique se a substituição caiu no corpo da requisição e não apenas em um comentário.
Parâmetros rejeitados
Um erro de validação apontando um campo geralmente significa tamanho, proporção ou parâmetro opcional sem suporte no modelo. Remova todos os campos opcionais, confirme que a requisição mínima com dois campos funciona e então adicione os parâmetros um por vez. Isso isola o problema imediatamente.
Outros sintomas
- 200 mas corpo vazio ou não analisável — você provavelmente está lendo o campo errado. Verifique as chaves de nível superior antes de indexar dentro do payload.
- Timeout no cliente mas cobrança no servidor — seu timeout pode ser curto demais; aumente-o e tente de novo uma vez com o mesmo prompt antes de declarar falha.
- JSON diferente entre curl e Python — imprima o payload serializado em Python e compare com a string
-ddo curl. Essa diferença explica a maioria dos relatos de "funciona no curl".
Percorrendo esses itens em ordem, você resolve a grande maioria dos problemas de primeira integração sem alterar uma palavra do prompt. Depois, após cada atualização de cliente ou SDK, execute um prompt sabidamente funcional com um pequeno script de teste para detectar regressões cedo.
Artigos relacionados
Ver todos os artigos →-
Tutorial
Como chamar hailuo-2.3-fast/image-to-video pela API HiAPI: curl e Python na prática
A primeira requisição executável do nível rápido e econômico de geração de vídeo a partir de imagem — do ID do modelo ao download do MP4
-
Tutorial
Como chamar hailuo-2.3/text-to-video pela API HiAPI: curl, Python e exemplos de requisição executáveis
-
Tutorial
Usar Kandinsky 6.0 Pro text-to-video na HiAPI: tutorial de curl e Python
Demonstração prática com foco na requisição: montar a chamada de prompt para clipe de vídeo, enviar a requisição, consultar o status de conclusão e baixar o resultado