HiAPI
博客

教程

如何通过 hiapi API 使用 ideogram-v4:curl、Python 以及一个可用的请求

2026年11月3日
如何通过 hiapi API 使用 ideogram-v4:curl、Python 以及一个可用的请求

Ideogram 模型的名声建立在一件大多数图像模型至今仍搞不定的事情上:排版。海报上的标题拼写正确,标志上的字母干净利落,招牌文字不会糊成一团乱码。ideogram-v4 和其他所有图像、视频模型一样,通过同一个统一任务 API 在 hiapi 上可用,本指南会完整走一遍这个请求:可直接复制粘贴的 curl 版本、完整的 Python 脚本、schema 实际校验的参数(它们和 Ideogram 原生 API 暴露的并不相同),以及你在实践中会遇到的错误。

你要构建什么,需要准备什么

目标:向 POST /v1/tasks 发送一个文本提示词,等待任务完成,然后下载一张文字按照你的要求渲染出来的图像。

你只需要一样东西:一个 hiapi API 密钥 —— 在控制台中创建一个。它在每个请求中作为 Bearer token 使用。没有免费的未认证层级;下面所有调用都假定使用 Authorization: Bearer sk-...。

和 hiapi 上的所有模型一样,ideogram-v4 是异步的:你创建一个任务,立刻拿到一个 taskId,然后要么轮询结果,要么接收回调。不存在同步的“在一个 HTTP 连接上等 40 秒”模式——而且对于图像生成来说,你本来也不会想要这种模式。

最小请求:curl

创建任务:

curl -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer $HIAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ideogram-v4",
    "input": {
      "prompt": "一张复古装饰艺术风格的爵士音乐节海报。主标题文字 \"MIDNIGHT & BRASS\" 使用粗体金色字体,背景为深海军蓝,副标题 \"Live at the Riverside, Fridays\" 在其下方使用纤细的无衬线字体。",
      "rendering_speed": "BALANCED",
      "aspect_ratio": "3:4"
    }
  }'

响应会立即返回,任务 id 位于 data.taskId(形如 tk-hiapi-...)。轮询它:

curl https://api.hiapi.ai/v1/tasks/tk-hiapi-XXXXXXXX \
  -H "Authorization: Bearer $HIAPI_KEY"

在图像生成期间,data.status 会依次经过 queued 和 handling。到达终态时会变成 success 或 fail。成功时,图像 URL 位于 data.output[0].url:

{
  "code": 200,
  "data": {
    "taskId": "tk-hiapi-XXXXXXXX",
    "status": "success",
    "output": [
      { "url": "https://.../result.png?...expireAt=..." }
    ]
  }
}

这个 URL 有一点要注意:它是签名的,而且会过期(expireAt)。任务成功后立刻下载字节内容,并保存到你自己的存储中。永远不要把热链接存进数据库。

ideogram-v4 实际接受的参数

这是值得精确对待的部分。如果你读过 Ideogram 自己的文档,就会知道其原生 API 暴露了风格预设、魔法提示词开关、负面提示词和批量数量。hiapi 的 ideogram-v4 任务 schema 有意做得更小,校验器会拒绝 schema 之外的任何内容。以下是经过实时 API 确认的完整范围:

字段 必填 类型 / 取值
prompt 是 string
rendering_speed 是 "TURBO"、"BALANCED"、"QUALITY"
aspect_ratio 否 "1:1"、"16:9"、"4:3"、"9:16"、"3:4"
seed 否 整数

两个必填字段都会强制校验。发送空 input 会得到:

invalid input: prompt: missing required field "prompt";
rendering_speed: missing required field "rendering_speed"

枚举值拼错时,错误会告诉你合法取值:

invalid input: rendering_speed: value must be one of 'TURBO', 'BALANCED', 'QUALITY'

而 Ideogram 原生接口中不在上表里的任何内容,都会被当作未知属性拒绝——style_type、magic_prompt、negative_prompt、num_images、size 以及图像输入都会返回 400,例如:

invalid input: <root>: additional properties 'style_type' not allowed

实际影响:

  • 排版控制完全依靠提示词。 把你想渲染的确切文本用双引号放进提示词里,并描述字体(“粗体装饰艺术字体”、“纤细几何无衬线体”、“手绘招牌字体”)。这就是获得 Ideogram 赖以成名的海报/标志/招牌效果的方式——没有单独的风格参数可以依赖。
  • 每个任务一张图像。 没有 n 或 num_images。如果你想要四个候选,就提交四个任务,并分别轮询每个 taskId。
  • seed 是你的可复现性旋钮。 相同的提示词 + 相同的 seed 会给你一个稳定的起点,便于迭代措辞。
  • 仅支持文生图。 该模型 schema 不接受参考图像。如果你的工作流需要图生图,请选择支持该功能的模型——参见如何用一个 API 密钥调用多个图像模型,在不改动集成代码的情况下切换模型。

关于 rendering_speed:TURBO 是快速层级,适合在你迭代提示词措辞时打草稿;QUALITY 是缓慢、精细的层级,适合最终渲染;BALANCED 是合理的默认值。定价按每张图像的使用量计费——当前价格请查看定价页面。

完整的 Python 脚本

同样的流程——创建、轮询、下载——带有超时和终态处理。唯一依赖是 requests(pip install requests)。

import os
import time
import requests

API_BASE = "https://api.hiapi.ai/v1/tasks"
HEADERS = {
    "Authorization": f"Bearer {os.environ['HIAPI_KEY']}",
    "Content-Type": "application/json",
}

def create_task(prompt: str, rendering_speed: str = "BALANCED",
                aspect_ratio: str = "1:1", seed: int | None = None) -> str:
    input_obj = {
        "prompt": prompt,
        "rendering_speed": rendering_speed,
        "aspect_ratio": aspect_ratio,
    }
    if seed is not None:
        input_obj["seed"] = seed
    resp = requests.post(API_BASE, headers=HEADERS,
                         json={"model": "ideogram-v4", "input": input_obj},
                         timeout=60)
    data = resp.json()
    task_id = (data.get("data") or {}).get("taskId")
    if not task_id:
        raise RuntimeError(f"create failed: HTTP {resp.status_code} {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:
        resp = requests.get(f"{API_BASE}/{task_id}", headers=HEADERS, timeout=30)
        task = resp.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} not done after {timeout_s}s")

if __name__ == "__main__":
    task_id = create_task(
        prompt=('为一家名为 "Driftwood" 的咖啡品牌设计极简标志,'
                '单词 Driftwood 使用温暖的衬线字体字标,单色,'
                '奶油色背景'),
        rendering_speed="QUALITY",
        aspect_ratio="1:1",
        seed=42,
    )
    print("task:", task_id)
    task = wait_task(task_id)
    url = task["output"][0]["url"]
    png = requests.get(url, timeout=120).content   # 签名 URL 会过期 - 立即下载
    with open("driftwood-logo.png", "wb") as f:
        f.write(png)
    print("saved driftwood-logo.png,", len(png), "bytes")

生产环境注意事项:回调、幂等性和错误

轮询 vs. 回调。 对于一次生成一张图像的交互式工具,每隔几秒轮询更简单,而且完全够用。对于批处理或服务端工作负载,在创建请求中添加回调,让 hiapi 把终态结果 POST 给你:

{
  "model": "ideogram-v4",
  "input": { "prompt": "...", "rendering_speed": "BALANCED" },
  "callback": { "url": "https://your.domain.example/hiapi/hook", "when": "final" }
}

有两个约束,都在创建时强制执行:URL 必须是 https:// 且可从公网访问,when 只接受 "final"——如果你尝试其他值,API 会直接返回 invalid callback.when: only 'final' is supported。让你的处理程序对 taskId 幂等,快速返回 2xx,并为回调始终未到达的任务保留轮询兜底。如果回调没有到达,先按照为什么你的 hiapi 任务回调没有触发排查,再怪罪队列。

幂等性。 创建任务不是幂等的——每次成功的 POST /v1/tasks 都是一个新任务和一次新计费。收到 taskId 后立刻把它和你自己的任务 id 关联存储,之后任何重试都轮询已存储的 taskId,而不要重新提交。

你实际会看到的错误。

  • 401 伴随 "code": "permission_denied"——密钥无效或无法使用该模型。消息会明确说明:“This API key cannot use the selected model. Please check permissions or use another key.” 在控制台中修复,不要重试。
  • 400 伴随 "error_code": "INVALID_REQUEST"——校验失败。message 会指出具体字段和合法取值;阅读它,修正请求体。用相同的请求体重试会永远失败。
  • GET /v1/tasks/{id} 上的 404 "task not found"——任务 id 错误,或任务是用另一个密钥创建的。
  • 已被接受的任务出现 fail 状态——检查轮询响应中的 data.error.code / data.error.message。这些可以安全地作为新任务重试。

相关阅读

常见问题

hiapi 上的 ideogram-v4 支持图生图或参考图像吗? 不支持。该模型的任务 schema 只接受 prompt、rendering_speed、aspect_ratio 和 seed——任何图像输入字段都会以 400 被拒绝。如果你需要编辑或重绘现有图像,请使用支持图生图的模型(例如 gpt-image-2 系列)。

我应该用哪个 rendering_speed? 在你优化提示词和文本确切措辞时,用 TURBO 迭代,然后用 QUALITY 和相同的 seed 重新渲染最终胜出的版本。如果你只渲染一次,BALANCED 是不错的默认值。

如何让 ideogram-v4 渲染出确切的文字? 把字面文本用双引号放进提示词,并在周围描述排版:主标题文字 "SUMMER SALE",使用粗重压缩无衬线体。较短的字符串比完整句子渲染更可靠;如果长行渲染出来是乱的,就把它拆成主标题和副标题。

可以在一个请求中生成多张图像吗? 不可以——一个任务生成一张图像。改为并行提交多个任务;每个任务都有自己的 taskId,并独立排队。

为什么我的密钥对其他模型有效,却得到 401 permission_denied? 模型访问权限是按密钥配置的。在控制台中检查该密钥的模型权限,或创建一个有权访问 ideogram-v4 的新密钥。

输出 URL 的有效期是多久? 它是一个带 expireAt 时间戳的签名 URL。把它当作分钟级而非天级:任务一到达 success 就下载图像,并自己保存文件。

有哪些可用的宽高比? 正好五种:1:1、16:9、4:3、9:16 和 3:4。没有自由格式的 size 参数——带 size 的请求会作为未知属性被拒绝。

立即开始构建持久 AI 产物

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

阅读 API 文档