会员
制作

API 文档

概览

Base URL:https://aihuanjie.com/api/v1

所有接口都需要通过 用户设置 页面生成一把 API 密钥,随每个请求以 Bearer Token 的形式发送:

Authorization: Bearer {你的密钥}

如果你所在的网络环境/托管平台会过滤掉 Authorization 请求头(部分主机的反向代理会这样做),也可以改用这个等效的自定义请求头,二选一即可:

X-Api-Key: {你的密钥}

必须带的请求头

Header说明
AuthorizationBearer {密钥}X-Api-Key 二选一,缺失或无效返回 401
X-Api-Key{密钥}(不带 Bearer 前缀)Authorization 二选一——某些托管环境会过滤掉 Authorization 头时用这个
Content-Typeapplication/json请求体是 JSON 时必需
Acceptapplication/json必需——不带这个头,请求参数校验失败时可能不会返回你期望的 JSON 错误格式(框架层面的内容协商行为),务必带上

响应格式约定

成功响应统一包在 data 字段里:

{ "data": { ... } }

失败响应统一是:

{ "message": "出错原因", "errors": { "字段名": ["具体错误"] } }

errors 字段只在请求参数校验失败(422)时才有,其它错误只有 message

限流

按密钥限流,分两档:真正会触发生成的接口(预估生成耗时、提交生成任务)是 600 次/分钟;查询生成任务状态这个接口是 3000 次/分钟(轮询用,成本低所以额度更宽松)。这两个数字都刻意设得很高——正常使用(哪怕你的网站背后有很多用户在同时用同一把密钥)基本不会碰到,只是留一道防线,防止密钥泄露被恶意刷、或者代码出 bug 死循环调用。超过限制返回 429,具体每个接口的限流档位见各自的错误响应表格。

密钥的权限在生成密钥时设置,具体去 用户设置 页面配置。
workflow_id: 7 ZImageTurbo图生图

ZImageTurbo生态图生图片的默认工作流。

可用参数

参数名类型是否必填说明
cfg 数字(含小数) 选填 AI 遵循提示词的强度,越高越听提示词,越低越自由,但过高可能让画面不自然。
denoise 数字(含小数) 选填 从一张已有图出发时,这次生成重画多少。0.1 几乎不动原图,1 完全重画。
positive_prompt 字符串 必填 控制生成图片的正面提示词。
reference_image 图片(base64,自动上传到 ComfyUI) 必填 一个基准图片,以此图片为基准,根据提示词生成类似结构的图片。
seed 整数 选填 决定 AI 生图初始随机噪声的数字,其他参数不变时换种子,就会生成不同的图片。如果想生成类似的图片,种子填一样的更容易出相似图片。
steps 整数 选填 AI 去噪生成图片的迭代次数,通常越高细节越充分,但生成越慢,超过一定值后提升很小。

查看这个工作流 →

workflow_id: 5 ZImageTurbo文生图

ZImageTurbo生态文生图片的默认工作流。

可用参数

参数名类型是否必填说明
batch_size 整数 必填 设定一次行生成的张数,生成张数越多,价格越贵。
cfg 数字(含小数) 选填 AI 遵循提示词的强度,越高越听提示词,越低越自由,但过高可能让画面不自然。
image_height 整数 必填 生成图片的高度(像素)。
image_width 整数 必填 生成图片的宽度(像素)
positive_prompt 字符串 必填 正面提示词
seed 整数 选填 决定 AI 生图初始随机噪声的数字,其他参数不变时换种子,就会生成不同的图片。如果想生成类似的图片,种子填一样的更容易出相似图片。
steps 整数 选填 AI 去噪生成图片的迭代次数,通常越高细节越充分,但生成越慢,超过一定值后提升很小。

查看这个工作流 →

workflow_id: 6 ZImageTurbo文生图+ControlNet

ZImageTurbo生态文生图片的默认工作流有ControlNet的加入。

可用参数

参数名类型是否必填说明
batch_size 整数 必填 设定一次行生成的张数,生成张数越多,价格越贵。
cfg 数字(含小数) 选填 AI 遵循提示词的强度,越高越听提示词,越低越自由,但过高可能让画面不自然。
controlnet_processor 字符串 必填 不同的
controlnet_strength 数字(含小数) 必填 决定生成结果受参考图约束的程度,数值越高越接近参考图的特征,越低则越自由。
image_height 整数 必填 生成图片的高度(像素)。
image_width 整数 必填 生成图片的宽度(像素)
positive_prompt 字符串 必填 正面提示词
reference_image 图片(base64,自动上传到 ComfyUI) 必填 用来给controlnet控制生成图片的参考图片。
seed 整数 选填 决定 AI 生图初始随机噪声的数字,其他参数不变时换种子,就会生成不同的图片。如果想生成类似的图片,种子填一样的更容易出相似图片。
steps 整数 选填 AI 去噪生成图片的迭代次数,通常越高细节越充分,但生成越慢,超过一定值后提升很小。

查看这个工作流 →

workflow_id: 3 幻界明舟图片修改

本工作流能够任意修改图片中人物的状态,动作,行为等等。也可以添加删除物品。

可用参数

参数名类型是否必填说明
image 图片(base64,自动上传到 ComfyUI) 必填
negative_prompt 字符串 选填 负面图示词
positive_prompt 字符串 必填 正面提示词

查看这个工作流 →

POST https://aihuanjie.com/api/v1/estimates 预估生成耗时

传一张图片和一个工作流 id,返回这个工作流在这次输入图片尺寸下大概要跑多久、以及这次生成要花多少幻晶(不会真正提交生成任务,纯预估,不扣任何幻晶)。预估基于该工作流历史上真实完成的生成记录校准出来,第一次使用某个工作流、还没有历史数据时无法给出精确预估。

预估假设走的是常驻服务器这条路径;实际提交生成任务时如果常驻服务器繁忙会自动溢出到 Serverless,届时可能因为冷启动而更慢——这个接口给出的是正常情况下的参考值,不是精确保证。

price 里的币数与「提交生成任务」真正扣的是同一套计价,可以先查价再决定要不要提交。price.priceable 是 false 时,这个工作流暂时无法定价,提交生成任务会返回 422。

API 调用只能用付费币(紫幻晶),免费币在这条路径上不可用——所以 price.currency 恒为 paid。

需要的权限

密钥必须具备 generate(提交生成任务)权限,否则返回 403。

请求体

字段类型必需说明
workflow_id integer 要跑的工作流 id,必须是已发布状态,草稿状态的工作流 id 会返回 404
image string 图片内容,base64 编码。支持纯 base64 字符串,也支持带 data:image/png;base64,... 前缀的 data URI。解码后大小不能超过 20MB。

示例请求

curl -X POST "https://aihuanjie.com/api/v1/estimates" \
  -H "Authorization: Bearer {你的密钥}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": 12,
    "image": "iVBORw0KGgoAAAANSUhEUgAA...(省略,实际请求里放完整 base64)"
}'

示例响应(200)

{
    "data": {
        "workflow_id": 12,
        "image": {
            "width": 1024,
            "height": 1024,
            "megapixels": 1.048599999999999976552089719916693866252899169921875
        },
        "estimate": {
            "precision": "parametric",
            "estimated_seconds": 42.2999999999999971578290569595992565155029296875,
            "sample_size": 18,
            "expected_megapixels": 1.048599999999999976552089719916693866252899169921875,
            "megapixels_source": "submitted_image"
        },
        "price": {
            "priceable": true,
            "currency": "paid",
            "coins": 43,
            "by_batch_size": {
                "1": 43,
                "2": 82,
                "4": 155
            }
        }
    }
}

字段说明

字段说明
estimate.precisionparametric——按历史数据校准出的"秒/百万像素"系数算出来的,相对精确;rough——历史数据不足以拆出这个系数,退化成历史耗时的粗略平均,跟这次图片大小无关;none——这个工作流还没有任何成功完成的历史记录,无法预估
estimate.estimated_seconds预估耗时(秒)。precision 是 none 时为 null
estimate.sample_size用了多少条历史记录计算出这个预估
estimate.megapixels_sourcesubmitted_image——用的是你这次传的图片真实尺寸;historical_average——用的是历史平均尺寸;null——历史数据不够拆出系数,没用上像素信息(此时 precision 已经是 rough)
price.priceable这个工作流现在能不能定价。false 时 coins 为 null,提交生成任务会返回 422
price.coins出 1 张要花多少幻晶(付费币)。这就是提交生成任务时真正扣的数字
price.by_batch_size各张数档位对应的币数。批量有固定开销摊薄,所以不是简单的整数倍;档位以这里列出的为准,传别的数字会返回 422(视频类工作流固定只有 1 段)

错误响应

状态码触发条件示例
401 未认证——没带 Authorization 头,或者密钥无效/已删除 {"message":"Unauthenticated."}
403 密钥没有 generate 权限 {"message":"这把密钥没有\"提交生成任务\"权限。"}
404 workflow_id 不存在,或者对应工作流还是草稿状态 {"message":"工作流不存在,或者还没发布。"}
422 workflow_id/image 缺失或类型不对 {"message":"请求参数有误。","errors":{"image":["The image field is required."]}}
422 image 不是合法的 base64 编码 {"message":"image 字段不是合法的 base64 编码。"}
422 解码后的图片超过大小上限 {"message":"图片过大,超过 20MB 限制。"}
422 解码后的内容不是合法的图片文件 {"message":"image 字段不是合法的图片文件。"}
429 超过限流(600 次/分钟,正常使用基本不会碰到,只在异常高频调用时触发) {"message":"Too Many Attempts."}
POST https://aihuanjie.com/api/v1/generations 提交生成任务

提交一次真正的生成任务。传工作流 id,以及这个工作流开放的具名参数值——每个工作流开放哪些参数、参数类型是什么、是否必填,见下方「可用工作流」列表;没传的选填参数会使用默认值,必填参数缺失会返回 422。

这个接口只负责提交任务,不会等待生成完成——用返回的 job_id 调用下面的「查询生成任务」接口自行轮询。

这个接口会**真正扣费**:按下方「可用工作流」列表里那个工作流的价格扣**付费币(紫幻晶)**,免费币在 API 上不可用。余额不够时返回 402,不会欠费。想先知道要花多少,用上面的「预估生成耗时」接口查 price。

生成失败或超时会**全额退回**,成功才真正结算——扣费在提交那一刻先冻结,任务到终态时才落账。

同一个账号在站内和 API 上共用同一份并发额度(普通用户 1 个、会员 4 个);额度占满时返回 429,等在跑的任务结束再提交。

提示词与图片参数都会先过内容审核,未通过时返回 422 且**不扣任何幻晶**。

出几张由 parameters 里那个张数参数决定(没传就是 1 张),账单严格按这个数字算;传一个不在允许档位里的数字会返回 422。

如果你在设置页给这把密钥设了「消费限额」,超出限额时返回 429(不是 402)——限额是按「最近 N 个整点小时」滑动计算的,统计的是提交时冻结的币数,生成失败退回的部分不回冲。

价钱只看工作流与张数,**不按参数动态计价**;作为对价,参数里的数值会被夹在这个工作流每个参数各自的取值范围内(下方「可用工作流」列表里标着的最小值/最大值),超出范围不报错,按边界值执行,字符串超长会被截断。

这个接口没有单独的 image 字段——图片和文字/数字/开关这些参数走同一个入口:都放在 parameters 对象里,key 用这个工作流给这个参数起的名字(在下方「可用工作流」列表里能查到,类型标"图片"的那一行)。同一个工作流可能有 0 个、1 个、甚至多个图片参数,具体看它开放了哪些。

需要的权限

密钥必须具备 generate(提交生成任务)权限,否则返回 403。

请求体

字段类型必需说明
workflow_id integer 要跑的工作流 id,见下方「可用工作流」列表
parameters object 参数名 => 值,支持字符串/整数/数字/布尔值/图片(不支持数组/对象)。具体每个工作流开放哪些参数、类型是什么、是否必填,见下方「可用工作流」列表;传一个不存在的参数名,或者漏传某个必填参数,都会返回 422。类型是"图片"的参数,值必须是 base64 编码的图片内容(纯 base64 字符串或者带 data:image/...;base64, 前缀的 data URI 都可以),解码后大小上限 20MB。

示例请求

curl -X POST "https://aihuanjie.com/api/v1/generations" \
  -H "Authorization: Bearer {你的密钥}" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": 12,
    "parameters": {
        "prompt_text": "a cat, masterpiece",
        "seed": 12345,
        "source_image": "iVBORw0KGgoAAAANSUhEUgAA...(省略,实际请求里放完整 base64,仅当工作流定义了图片类型参数时才需要传)"
    }
}'

示例响应(200)

{
    "data": {
        "job_id": 88,
        "status": "pending",
        "execution_path": "persistent",
        "charged_coins": 43
    }
}

字段说明

字段说明
job_id这次生成任务的 id,用来调用「查询生成任务」接口
status任务刚创建时的状态,通常是 pending(走常驻服务器)或 running(走 Serverless,已经提交出去了)
execution_pathpersistent——走常驻服务器;serverless——常驻服务器繁忙,溢出到了 Serverless
charged_coins这次冻结的幻晶数量(付费币)。任务成功后按这个数字结算,失败或超时全额退回

错误响应

状态码触发条件示例
401 未认证——没带 Authorization 头,或者密钥无效/已删除 {"message":"Unauthenticated."}
403 密钥没有 generate 权限 {"message":"这把密钥没有\"提交生成任务\"权限。"}
404 workflow_id 不存在,或者不是「可用工作流」列表里的 id {"message":"工作流不存在,或者还没发布。"}
422 workflow_id 缺失或类型不对,或者 parameters 里某个值是数组/对象 {"message":"请求参数有误。","errors":{"workflow_id":["The workflow id field is required."]}}
422 这个工作流暂时不可用(不应该发生在「可用工作流」列表里出现过的 id 上,如果遇到请联系我们) {"message":"这个工作流暂时不可用,请稍后再试或联系我们。"}
422 参数处理失败——传了一个不存在的参数名、缺少某个必填参数、或者某个参数的值类型不对 {"message":"参数替换失败。","errors":{"parameters":["未知参数:foo(这个工作流没有定义同名的参数映射)","缺少必填参数:prompt_text"]}}
422 图片类型参数处理失败——不是合法的 base64/图片文件、或者超过大小上限 {"message":"图片参数处理失败。","errors":{"parameters":["参数「source_image」:不是合法的图片文件。"]}}
422 张数不在允许的档位里 {"message":"张数只能是 1 / 2 / 4 之一。"}
422 提示词或图片没通过内容审核(**不扣任何幻晶**) {"message":"内容审核未通过:未成年人相关内容。请修改后重试。"}
402 付费币(紫幻晶)不足。不允许欠费——先充值或兑换卡密,再重试 {"message":"紫幻晶不足:本次需要 43 枚,当前可用 12 枚。"}
403 账号当前不能提交生成任务(邮箱未验证,或者账号处于封禁 / 禁生成状态) {"message":"这个账号当前不能提交生成任务(邮箱未验证,或者账号处于封禁 / 禁生成状态)。"}
429 并发额度已占满(站内与 API 共用同一份额度),等在跑的任务结束再提交 {"message":"你还有 1 个任务正在进行,同时最多只能跑 1 个。等它完成后再提交。","errors":{"concurrency":{"allowed":false,"tier":"default","limit":1,"in_flight":1,"remaining":0}}}
429 短时间内多次被内容审核拒绝,已进入暂停期 {"message":"你在 1 小时内被拒绝多次,已暂停生成,请 47 分钟后再试。"}
429 这把密钥自己设的用量配额已用满(在设置页给密钥设过「消费限额」时才可能出现)。充值没用,要么等窗口过去,要么在设置页调高/取消这把密钥的配额 {"message":"这把密钥的用量配额已用满:最近 24 小时内上限 100 枚紫幻晶,已用 100 枚。等窗口过去,或在设置页调整这把密钥的配额。","errors":{"quota":{"enabled":true,"limit":100,"window_hours":24,"used":100,"requested":43,"remaining":0,"allowed":false}}}
500 服务端故障(例如图片上传到 ComfyUI 失败)。这类错误不代表请求有问题,隔几秒重试即可;**不会扣任何幻晶** {"message":"Server Error"}
429 超过限流(600 次/分钟,正常使用基本不会碰到,只在异常高频调用时触发) {"message":"Too Many Attempts."}
GET https://aihuanjie.com/api/v1/generations/{job_id} 查询生成任务

查询一次生成任务的当前状态和结果图。只能查通过你自己这个账号(不区分具体是哪一把密钥)提交过的任务,查别人的任务 id 会返回 404。

目前只能轮询,没有 webhook 回调机制——建议每隔几秒查一次,直到 status 变成 completed 或 failed。

需要的权限

密钥必须具备 generate(提交生成任务)权限,否则返回 403。

示例请求

curl -X GET "https://aihuanjie.com/api/v1/generations/{job_id}" \
  -H "Authorization: Bearer {你的密钥}" \
  -H "Accept: application/json"

示例响应(200)

{
    "data": {
        "job_id": 88,
        "status": "completed",
        "execution_path": "persistent",
        "progress_percent": 100,
        "progress_message": null,
        "error_message": null,
        "charged_coins": 43,
        "outputs": [
            {
                "id": 201,
                "url": "https://cdn.example.com/civitai/generations/88/0.png",
                "title": null,
                "width": 1024,
                "height": 1024
            }
        ]
    }
}

字段说明

字段说明
statuspending|claimed|running|completed|failed
progress_percent0-100,粗粒度进度,不是每个节点的精确进度;不确定时为 null
error_messagestatus 是 failed 时的具体错误信息,其它状态下为 null
charged_coins这次任务当初冻结/扣掉的幻晶数量(付费币)。任务失败或超时时这笔钱会全额退回,这个字段仍然显示当初按什么价扣的
outputs结果图片列表,生成完成前是空数组

错误响应

状态码触发条件示例
401 未认证——没带 Authorization 头,或者密钥无效/已删除 {"message":"Unauthenticated."}
403 密钥没有 generate 权限 {"message":"这把密钥没有\"提交生成任务\"权限。"}
404 job_id 不存在,或者不是你自己账号提交的任务 {"message":"生成任务不存在。"}
429 超过限流(3000 次/分钟,比提交生成任务宽松得多,专门为轮询设计,正常使用基本不会碰到) {"message":"Too Many Attempts."}
广告位 728×90