HiAPI
博客

教程

如何通过 hiapi API 使用 grok-imagine-quality/image-to-image:curl、Python 和可用的请求

2026年11月3日
如何通过 hiapi API 使用 grok-imagine-quality/image-to-image:curl、Python 和可用的请求

本指南向你展示如何通过 hiapi 统一任务 API,使用 grok-imagine-quality/image-to-image(Grok Imagine 系列中更高保真度的层级)转换现有图像。你将提交源图像和文本提示词,轮询获取结果,并下载生成的图像。下方的每个请求和响应结构都已对照实时 API 验证。

你需要准备

  • 一个 hiapi API 密钥 — 在仪表盘中创建一个。
  • 一到三个可公开访问的图像 URL用作源。平台会在服务端获取并规范化你的输入媒体,因此本地文件路径和 base64 载荷无法使用 — 请先将图像托管在 API 可访问的位置。

就这些。无需 SDK;任务 API 就是普通的 HTTPS + JSON。

请求模式

grok-imagine-quality/image-to-image 运行在异步任务端点上:你通过 POST /v1/tasks 创建任务,然后轮询 GET /v1/tasks/<taskId>(或注册回调)直到完成。

输入模式是严格的 — 未知字段会以 400 拒绝:

字段 类型 是否必需 说明
prompt string ✅ 要对源图像做什么
image_urls string[] ✅ 1–3 个源/参考图像的公开 URL
aspect_ratio string – 以下之一: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 或 2k — 小写(1K 会返回 400)
output_format string – jpeg、png 或 webp

注意没有什么:没有 size、没有 n、没有 seed、没有 strength 或 consistency 旋钮。输出跟随源图像的程度由你的提示词和你传入的参考图像控制 — 请参见下方 FAQ。

最小可用示例(curl)

创建任务:

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"
    }
  }'

成功创建会返回任务 ID:

{
  "code": 200,
  "data": {
    "taskId": "task_xxxxxxxxxxxx"
  }
}

轮询直到任务达到终态:

curl https://api.hiapi.ai/v1/tasks/task_xxxxxxxxxxxx \
  -H "Authorization: Bearer sk-<your-key>"

运行期间,data.status 为进行中;完成后变为 success,图像位于 data.output:

{
  "code": 200,
  "data": {
    "taskId": "task_xxxxxxxxxxxx",
    "status": "success",
    "output": [
      {
        "url": "https://.../result.png?...&expireAt=...",
        "expireAt": 1760000000
      }
    ]
  }
}

⚠️ 输出 URL 是临时的(注意 expireAt)。任务成功后立即下载字节并存储到你自己的存储中 — 不要热链结果 URL。

如果任务失败,data.status 为 fail,data.error 携带 code 和 message。

Python:创建、轮询、下载

一个只使用 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)")

生产环境注意事项

使用回调代替轮询

对于一次性脚本之外的任何场景,注册回调并跳过轮询循环。添加一个顶层 callback 对象(与 model 和 input 同级):

{
  "model": "grok-imagine-quality/image-to-image",
  "input": { "...": "..." },
  "callback": {
    "url": "https://your-app.example.com/hooks/hiapi",
    "when": "final"
  }
}

when 仅支持 "final" — 当任务达到终态(success 或 fail)时你会收到恰好一次 POST。经验法则:

  • 轮询适用于 CLI、笔记本和批处理作业,这些场景进程本来就会保持存活。每 3–5 秒轮询一次;不要用亚秒级间隔猛击。
  • 回调更适合 Web 后端:没有挂起的连接,没有工作线程在生成期间被占用。在服务端重新获取 GET /v1/tasks/<taskId> 来验证载荷,而不是盲目信任 webhook 正文。

幂等性

任务创建本身不是幂等的 — 如果你的进程在 POST /v1/tasks 之后、持久化 taskId 之前崩溃,重试会创建(并计费)第二个任务。在开始等待之前,将 taskId 以你的内部作业 ID 为键持久化到你自己的存储中,重启时通过轮询存储的 taskId 来恢复,而不是重新创建。

错误处理

你实际会遇到的错误:

  • 401 permission_denied — API 密钥无效或无权访问此模型。响应体包含一个 request_id,你可以发送给支持团队:

    {
      "error": {
        "code": "permission_denied",
        "message": "This API key cannot use the selected model. ...",
        "request_id": "2026...",
        "type": "hiapi_error"
      }
    }
    
  • 400 INVALID_REQUEST — 模式违规,带有精确的消息。此模型的真实示例:

    • prompt: missing required field "prompt" — 你忘记了一个必需字段。
    • image_urls: maxItems: got 12, want 3 — 参考图像太多(最多 3 个)。
    • resolution: value must be one of '1k', '2k' — 你发送了 1K/4K。
    • additional properties 'seed' not allowed — 你传入了此模型不接受的字段。
  • 终态 fail 状态 — 任务被接受但生成失败(例如源 URL 无法获取)。检查 data.error.message,修复输入,然后创建新任务。

对 5xx 和网络错误使用退避重试;不要重试 400 — 在修复载荷之前它们会以相同方式失败。

选择质量层级(以及“一致性”怎么办?)

hiapi 上的 Grok Imagine 系列按层级和模态分为单独的模型 ID。对于图像到图像,你可以选择:

层级就是模型 ID — input 内没有 quality 参数(发送它会返回 400 additional properties 'quality' not allowed)。两个层级的每图像定价在定价页面上。

相关阅读

常见问题

有一致性或强度参数吗? 没有。输入模式仅接受 prompt、image_urls、aspect_ratio、resolution 和 output_format;其他任何内容都会以 400 拒绝。要控制输出跟随源图像的程度,请在提示词中明确说明必须保留什么(“保持产品和标签完全相同,只改变背景”),并通过 image_urls 传入最多 3 张参考图像。

我可以上传本地文件或发送 base64 吗? 不能直接这样做 — image_urls 接受 URL,平台会在服务端获取它们。将文件上传到任何可公开访问的存储(S3、R2、CDN)并传入该 URL。

我可以传入多少张源图像? 1 到 3 张。空数组会失败并显示 minItems: got 0, want 1;超过 3 张会失败并显示 maxItems。

支持哪些分辨率和宽高比? resolution 为 1k 或 2k(仅小写)。aspect_ratio 支持从 2:1 到 1:2 的 14 个值,包括 auto、16:9、1:1、9:16 以及适合手机的 9:19.5/9:20。

输出 URL 有效期多长? 每个输出都带有 expireAt 时间戳。将结果视为短暂的:任务成功后立即下载字节并自行存储。

如何生成多个变体? 没有 n 参数 — 每个变体创建一个任务。任务独立运行,因此你可以并行提交多个。

如果我的密钥正确,401 permission_denied 是什么意思? 密钥存在但无法使用此模型(计划或权限范围)。在仪表盘中检查密钥的模型权限,或使用错误响应体中的 request_id 联系支持。

立即开始构建持久 AI 产物

获取 API 密钥,通过一个基于任务(task)的 API 调用图像、视频和音频模型。

阅读 API 文档