Tutorial
Como usar grok-imagine-quality/image-to-image pela API hiapi: curl, Python e requisições funcionais
Este guia mostra como transformar imagens existentes usando grok-imagine-quality/image-to-image (o nível de maior fidelidade da família Grok Imagine) através da API de tarefas unificada da hiapi. Você enviará a imagem de origem e um prompt de texto, consultará o resultado por polling e baixará a imagem gerada. Cada estrutura de requisição e resposta abaixo foi validada contra a API ao vivo.
O que você precisa
- Uma chave de API hiapi — crie uma no painel.
- Uma a três URLs de imagem publicamente acessíveis para usar como origem. A plataforma busca e normaliza sua mídia de entrada no lado do servidor, portanto caminhos de arquivo locais e payloads base64 não funcionam — hospede a imagem em um local acessível pela API primeiro.
É só isso. Sem SDK; a API de tarefas é HTTPS + JSON comum.
Modo de requisição
grok-imagine-quality/image-to-image roda no endpoint de tarefas assíncronas: você cria uma tarefa via POST /v1/tasks e depois consulta GET /v1/tasks/<taskId> (ou registra um callback) até a conclusão.
O esquema de entrada é estrito — campos desconhecidos são rejeitados com 400:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
prompt |
string | ✅ | O que fazer com a imagem de origem |
image_urls |
string[] | ✅ | 1–3 URLs públicas de imagens de origem/referência |
aspect_ratio |
string | – | Um dos seguintes: auto, 2:1, 20:9, 19.5:9, 16:9, 4:3, 3:2, 1:1, 2:3, 3:4, 9:16, 9:19.5, 9:20, 1:2 |
resolution |
string | – | 1k ou 2k — minúsculo (1K retorna 400) |
output_format |
string | – | jpeg, png ou webp |
Observe o que não existe: sem size, sem n, sem seed, sem botões de strength ou consistency. O quanto a saída segue a imagem de origem é controlado pelo seu prompt e pelas imagens de referência que você passa — veja o FAQ abaixo.
Exemplo mínimo funcional (curl)
Criar uma tarefa:
curl -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer sk-<your-key>" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-quality/image-to-image",
"input": {
"prompt": "Turn this product photo into a clean studio shot on a light gray background with soft shadows",
"image_urls": ["https://your-cdn.example.com/source.jpg"],
"aspect_ratio": "1:1",
"resolution": "2k",
"output_format": "png"
}
}'
Uma criação bem-sucedida retorna um ID de tarefa:
{
"code": 200,
"data": {
"taskId": "task_xxxxxxxxxxxx"
}
}
Consulta até a tarefa atingir um estado terminal:
curl https://api.hiapi.ai/v1/tasks/task_xxxxxxxxxxxx \
-H "Authorization: Bearer sk-<your-key>"
Durante a execução, data.status está em andamento; ao concluir, torna-se success e a imagem fica em data.output:
{
"code": 200,
"data": {
"taskId": "task_xxxxxxxxxxxx",
"status": "success",
"output": [
{
"url": "https://.../result.png?...&expireAt=...",
"expireAt": 1760000000
}
]
}
}
⚠️ A URL de saída é temporária (observe expireAt). Baixe os bytes imediatamente após o sucesso da tarefa e armazene no seu próprio armazenamento — não faça hotlink da URL de resultado.
Se a tarefa falhar, data.status é fail e data.error carrega code e message.
Python: criar, consultar, baixar
Um script completo usando apenas requests:
import time
import requests
API_BASE = "https://api.hiapi.ai/v1/tasks"
API_KEY = "sk-<your-key>"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
def create_task(prompt: str, image_urls: list[str]) -> str:
payload = {
"model": "grok-imagine-quality/image-to-image",
"input": {
"prompt": prompt,
"image_urls": image_urls, # 1-3 public URLs
"aspect_ratio": "1:1",
"resolution": "2k", # lowercase: "1k" or "2k"
"output_format": "png",
},
}
r = requests.post(API_BASE, headers=HEADERS, json=payload, timeout=60)
data = r.json()
task_id = (data.get("data") or {}).get("taskId")
if not task_id:
raise RuntimeError(f"create failed: {data}")
return task_id
def wait_task(task_id: str, timeout_s: int = 600, poll_interval: int = 5) -> dict:
deadline = time.time() + timeout_s
while time.time() < deadline:
r = requests.get(f"{API_BASE}/{task_id}", headers=HEADERS, timeout=30)
task = r.json().get("data") or {}
status = task.get("status")
if status == "success":
return task
if status == "fail":
err = task.get("error") or {}
raise RuntimeError(f"task failed: {err.get('code')} {err.get('message')}")
time.sleep(poll_interval)
raise TimeoutError(f"task {task_id} still running after {timeout_s}s")
if __name__ == "__main__":
task_id = create_task(
prompt="Turn this product photo into a clean studio shot on a light gray background",
image_urls=["https://your-cdn.example.com/source.jpg"],
)
print("task:", task_id)
task = wait_task(task_id)
url = task["output"][0]["url"]
# The output URL expires -- download immediately and persist yourself
img = requests.get(url, timeout=120).content
with open("result.png", "wb") as f:
f.write(img)
print(f"saved result.png ({len(img)} bytes)")
Considerações para produção
Use callback em vez de polling
Para qualquer cenário além de scripts únicos, registre um callback e pule o laço de polling. Adicione um objeto callback de nível superior (no mesmo nível de model e input):
{
"model": "grok-imagine-quality/image-to-image",
"input": { "...": "..." },
"callback": {
"url": "https://your-app.example.com/hooks/hiapi",
"when": "final"
}
}
when suporta apenas "final" — você recebe exatamente um POST quando a tarefa atinge um estado terminal (success ou fail). Regra de ouro:
- Polling é bom para CLI, notebooks e jobs em lote, onde o processo já permanece vivo. Consulte a cada 3–5 segundos; não martele com intervalos de subsegundos.
- Callback é melhor para backends web: sem conexões pendentes, sem threads de trabalho presas durante a geração. Rebusque
GET /v1/tasks/<taskId>no servidor para validar o payload, em vez de confiar cegamente no corpo do webhook.
Idempotência
A criação de tarefa não é idempotente por si só — se seu processo falhar após POST /v1/tasks mas antes de persistir o taskId, uma nova tentativa criará (e cobrará) uma segunda tarefa. Persista o taskId no seu próprio armazenamento usando seu ID de job interno como chave antes de começar a esperar, e ao reiniciar recupere consultando o taskId armazenado em vez de recriar.
Tratamento de erros
Erros que você realmente encontrará:
401permission_denied— chave de API inválida ou sem acesso a este modelo. O corpo da resposta inclui umrequest_idque você pode enviar ao suporte:{ "error": { "code": "permission_denied", "message": "This API key cannot use the selected model. ...", "request_id": "2026...", "type": "hiapi_error" } }400INVALID_REQUEST— violação de esquema, com mensagem precisa. Exemplos reais deste modelo:prompt: missing required field "prompt"— você esqueceu um campo obrigatório.image_urls: maxItems: got 12, want 3— imagens de referência demais (máximo 3).resolution: value must be one of '1k', '2k'— você enviou1K/4K.additional properties 'seed' not allowed— você passou um campo que este modelo não aceita.
Estado terminal
fail— a tarefa foi aceita mas a geração falhou (por exemplo, a URL de origem não pôde ser buscada). Verifiquedata.error.message, corrija a entrada e crie uma nova tarefa.
Use retry com backoff para 5xx e erros de rede; não repita 400 — eles falharão da mesma forma até você corrigir o payload.
Escolhendo o nível de qualidade (e o que fazer com "consistência"?)
A família Grok Imagine na hiapi é dividida em IDs de modelo separados por nível e modalidade. Para imagem para imagem, você pode escolher:
grok-imagine-quality/image-to-image— o nível de alta fidelidade descrito neste artigo; mais lento, melhor preservação de detalhes.grok-imagine/image-to-image— o nível padrão; mesmo esquema de requisição, mais rápido e mais barato por imagem.
O nível é o ID do modelo — não há parâmetro quality dentro de input (enviá-lo retorna 400 additional properties 'quality' not allowed). O preço por imagem de ambos os níveis está na página de preços.
Leitura relacionada
- Página do modelo grok-imagine-quality/image-to-image — playground e preços
- Como usar grok-imagine/text-to-image — gere a imagem de origem primeiro
- Como usar grok-imagine/image-to-video — anime seu resultado
- Documentação hiapi — autenticação, API de tarefas e o resto da plataforma
Perguntas frequentes
Existe parâmetro de consistência ou intensidade?
Não. O esquema de entrada aceita apenas prompt, image_urls, aspect_ratio, resolution e output_format; qualquer outra coisa é rejeitada com 400. Para controlar o quanto a saída segue a imagem de origem, declare explicitamente no prompt o que deve ser preservado ("mantenha o produto e o rótulo exatamente iguais, mude apenas o fundo") e passe até 3 imagens de referência via image_urls.
Posso fazer upload de arquivos locais ou enviar base64?
Não diretamente — image_urls aceita URLs, e a plataforma as busca no servidor. Faça upload do arquivo para qualquer armazenamento publicamente acessível (S3, R2, CDN) e passe essa URL.
Quantas imagens de origem posso passar?
1 a 3. Um array vazio falha com minItems: got 0, want 1; mais de 3 falha com maxItems.
Quais resoluções e proporções são suportadas?
resolution é 1k ou 2k (somente minúsculo). aspect_ratio suporta 14 valores de 2:1 a 1:2, incluindo auto, 16:9, 1:1, 9:16 e as proporções para celular 9:19.5/9:20.
Quanto tempo dura a URL de saída?
Cada saída traz um timestamp expireAt. Trate os resultados como efêmeros: baixe os bytes imediatamente após o sucesso da tarefa e armazene você mesmo.
Como gerar múltiplas variações?
Não há parâmetro n — crie uma tarefa por variação. As tarefas rodam independentemente, então você pode enviar várias em paralelo.
Se minha chave está correta, o que significa 401 permission_denied?
A chave existe mas não pode usar este modelo (plano ou escopo de permissão). Verifique as permissões de modelo da chave no painel ou entre em contato com o suporte usando o request_id no corpo do erro.
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