ai-api 多模型网关 · 接口文档

图片生成(gpt-image-2 / banana)+ 文本对话 14 模型(claude-opus-5-5 / claude-opus-5 / claude-opus-4-8 / claude-sonnet-4-6 / claude-sonnet-5 / gpt-6-astra / gpt-5.5 / gpt-5.6-sol / gpt-5.6-terra / kimi-k3 / deepseek-v4-flash / deepseek-v4-pro / glm-5.3 / glm-5.3-flash,对外都兼容 OpenAI 接口)。单入口、多渠道主备 + 自动故障转移,对调用方透明。

概览

基址https://ai-api.dahe2016.com
数据格式请求/响应均为 application/json(图生图的参考图可传 URL 或 base64)
调用方只需关心提示词 prompt + 比例 ratio + 文生图/图生图 mode(+ 尺寸档 size / 张数 n)
多渠道容错(对调用方透明)后端多渠道互为备份;某渠道故障时网关自动切换到可用渠道出图再返回,你完全无需感知、也无需做任何处理,照常拿 data[].url 即可。

鉴权

除只读/页面类端点外,写操作需在请求头带网关 key:

复制Authorization: Bearer <你的网关KEY>

key 错误或缺失 → 401。新增/吊销 key 由服务端 .env 管理(一行一个,行首加 # 即吊销)。

生成图片

POST/v1/images

请求字段

字段类型必填默认说明
promptstring必填—文本提示词,中英文均可
modelstring可选gpt-image-2gpt-image-2(快,~20–90s)/ banana(Nano Banana 2,画质强,主用渠道同步 ~16s;主用不可用时会回退到异步渠道,可能 2–4 分钟,客户端超时仍请设 ≥300s)
ratiostring可选3:4比例,取值见下;auto=交给模型判断。banana 主用渠道(hfsyapi/apiyi)支持全套比例;仅在回退到 otuapi 时才收窄为 1:1 / 9:16 / 16:9 / auto
modestring可选t2it2i=文生图 / i2i=图生图
imagestring | string[]i2i 必填—参考图,单张或数组。三种都行:在线 URL / DataURL(data:image/png;base64,...)/ 裸 base64(无在线图、只有本地文件时直接传 base64 即可,网关会自动识别图片类型补成 DataURL)
sizestring可选1k尺寸档 1k/2k/4k。当前两个渠道都只出 1k(hfsyapi 精确 1k、otuapi auto≈1k),2k/4k 传了也按 1k 出
ninteger可选1出图数 [1, 10]。网关对上游并发 n 次单图请求,绝不传 N

ratio 取值: auto1:13:44:32:33:29:1616:91:22:11:33:19:2121:9

示例 · 文生图(curl)

复制curl -X POST https://ai-api.dahe2016.com/v1/images \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"小红书封面 香港保险避坑 扁平插画 红黄撞色大标题","ratio":"3:4","n":2}'

示例 · 图生图(curl)

复制curl -X POST https://ai-api.dahe2016.com/v1/images \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"i2i","image":"https://example.com/ref.jpg","prompt":"改成夜景霓虹风格","ratio":"3:4"}'

没有在线 URL(只有本地图)时,把 image 换成图片的 base64 即可,例如 Python:image = base64.b64encode(open("a.png","rb").read()).decode() 再放进 body。

Python

复制import httpx
r = httpx.post(
  "https://ai-api.dahe2016.com/v1/images",
  headers={"Authorization": "Bearer "+KEY},
  json={"prompt":"...", "ratio":"3:4", "n":1},
  timeout=320)
for it in r.json()["data"]:
    print(it["url"])

JavaScript (fetch)

复制const r = await fetch("/v1/images", {
  method:"POST",
  headers:{ "Content-Type":"application/json",
            "Authorization":"Bearer "+KEY },
  body: JSON.stringify({prompt:"...", ratio:"3:4", n:1})
});
const d = await r.json();
console.log(d.data.map(x=>x.url));

响应

响应体永远是 JSON。HTTP 状态:200=至少 1 张成功(可能部分失败,看 errors)|502=全部失败|400=参数错误|401=key 无效。

下面这个例子请求 2 张(n=2),成功 1 张、失败 1 张——同时展示 data[] 和 errors[] 两种结构:

复制{
  "created": 1782286822,
  "ratio": "3:4", "mode": "t2i", "size": "1k",
  "requested": 2, "succeeded": 1, "failed": 1,
  "data": [
    {
      "url": "https://ai-api.dahe2016.com/img/5a8e1395abcd.png",
      "provider": "otuapi",
      "upstream_size": "auto",
      "width": 1086, "height": 1448,
      "bytes": 2000215, "elapsed_ms": 51000
    }
  ],
  "errors": [
    {
      "index": 1,
      "tried": [
        { "channel": "otuapi",     "error": "HTTP 403: insufficient_user_quota" },
        { "channel": "otuapi", "error": "HTTP 403: insufficient_user_quota" }
      ],
      "elapsed_ms": 62000
    }
  ]
}

顶层字段

字段类型说明
createdint生成时间戳(秒)
ratio / mode / sizestring本次实际使用的比例 / 模式 / 尺寸档(回显)
requestedint请求张数(= 入参 n)
succeededint成功张数(= data 长度)
failedint失败张数(= errors 长度)
dataarray成功的图,每项见下;全失败时为 []
errorsarray失败的图,每项见下;全成功时为 []

data[] — 每张成功图

字段类型说明
urlstring本站稳定链接,永久有效,可直接 <img src> 引用(这是你要用的图片地址)
providerstring实际出图渠道:hfsyapi 或 otuapi(故障转移时可能是备用渠道,对你无影响)
upstream_sizestring上游实际 size 参数:hfsyapi 为精确像素如 768x1024;otuapi 恒为 auto(比例靠提示词控)
width / heightint成品图真实像素
bytesint图片字节大小
elapsed_msint这张图耗时(毫秒)

errors[] — 每个失败项

字段类型说明
indexint这是第几张(从 0 起)
triedarray各渠道的尝试记录 [{channel, error}],主备都试过的报错都在里面,便于排查
elapsed_msint这张图耗时(毫秒)
怎么用:遍历 data[] 取每个 url 即可(succeeded 张)。要严谨就判一下 failed>0 时看 errors[].index 知道哪几张没出、为什么。

文本 / 对话 · 14 个模型

14 个文本模型:claude 系 ctok 主 / hfsyapi 备(claude-opus-5-5 例外,hfsyapi 未上架故无备用);gpt 系 2026-09-17 起走 aitechflux 主 / hfsyapi 备;kimi-k3/deepseek-v4-flash/deepseek-v4-pro/glm-5.3/glm-5.3-flash 直连原厂单渠道无备用。对外都兼容 OpenAI 接口 /v1/chat/completions;claude 系另外支持 Anthropic 原生 /v1/messages。渠道切换对调用方透明。

模型 id(精确,区分大小写)家族 / 上游协议主 / 备渠道可用接口
claude-opus-5Claude · Anthropic 原生ctok 主 / sudocode 备/v1/chat/completions + /v1/messages
claude-opus-4-8Claude · Anthropic 原生ctok 主 / sudocode 备/v1/chat/completions + /v1/messages
claude-sonnet-4-6Claude · Anthropic 原生ctok 主 / sudocode 备/v1/chat/completions + /v1/messages
claude-sonnet-5Claude · Anthropic 原生ctok 主 / sudocode 备/v1/chat/completions + /v1/messages
gpt-6-astraGPT · OpenAI 原生aitechflux 主 / hfsyapi 备仅 /v1/chat/completions
gpt-5.5GPT · OpenAI 原生aitechflux 主 / hfsyapi 备仅 /v1/chat/completions
gpt-5.6-solGPT · OpenAI 原生aitechflux 主 / hfsyapi 备仅 /v1/chat/completions
gpt-5.6-terraGPT · OpenAI 原生aitechflux 主 / hfsyapi 备仅 /v1/chat/completions
kimi-k3Moonshot · OpenAI 原生直连,无备用仅 /v1/chat/completions
deepseek-v4-flashDeepSeek · OpenAI 原生直连,无备用仅 /v1/chat/completions
deepseek-v4-proDeepSeek · OpenAI 原生直连,无备用仅 /v1/chat/completions
glm-5.3智谱 BigModel · OpenAI 原生直连,无备用仅 /v1/chat/completions
glm-5.3-flash智谱 BigModel · OpenAI 原生直连,无备用仅 /v1/chat/completions
模型 id 严格匹配:model 必须精确等于上表十三个 id 之一(区分大小写),对不上一律 400 报错,绝不默认。gpt-*/kimi-*/deepseek-*/glm-* 都是 OpenAI 原生,发到 /v1/messages 会 400,请走 /v1/chat/completions。kimi-k3 / deepseek-v4-flash/pro / glm-5.3(-flash) 都是"始终思考"模型:内容主要出现在 reasoning_content,max_tokens 给太小会被思考过程耗尽、导致 content 为空且 finish_reason=length——最简单的做法是不传 max_tokens,三家上游各自有宽松默认值(kimi-k3 默认 131,072),实测不传更稳。
图生图(mode=i2i)· 2026-09-17 已修复:gpt-image-2 与 banana 的 i2i 都正常可用,参考图传 URL / DataURL / 裸 base64 都行。(2026-09-14~17 期间 gpt-image-2 的 i2i 曾全面失败,原因是当时的主用渠道对 gpt-image 模型族硬拒 base64 参考图;已于 09-17 换到 aitechflux 渠道解决,同时修好了此前「比例不生效」的问题。)
usage 口径(claude 系):Anthropic 的 input_tokens 不含缓存部分,OpenAI 的 prompt_tokens 含——网关按 OpenAI 口径换算:prompt_tokens = input_tokens + cache_creation_input_tokens + cache_read_input_tokens,其中缓存读取量单列在 prompt_tokens_details.cached_tokens;缓存写入量按 1.25 倍计价、OpenAI 侧没有对应字段,网关额外透出一个 cache_creation_input_tokens 键,便于按全价输入 / 缓存写 / 缓存读三档核算成本。流式同样带 usage:传了 stream_options.include_usage 就在收尾后单发一个 choices: [] 的 usage 块(OpenAI 规范做法),没传则挂在收尾块上,两种给法 usage 都只出现一次,直接累加不会重复。(2026-09-04 修复前:非流式只报 input_tokens,带缓存时少报约 5 倍;流式完全不吐 usage。)
端点协议什么时候用
POST/v1/chat/completionsOpenAI 兼容(14 模型全支持;claude 系后端转 Anthropic,其余纯透传)OpenAI SDK、Open WebUI、LangChain 等——推荐统一走这个
POST/v1/messagesAnthropic 原生透传(仅 claude 系,字段一个不改)Anthropic 官方 SDK / 想要最原生的 tool use 体验
GET/v1/modelsOpenAI 兼容模型列表给 Open WebUI 等自动发现,返回上述 14 个真实 id

鉴权:与图片同一套网关 key,Authorization: Bearer <KEY> 或 x-api-key: <KEY>(Anthropic SDK 习惯)都认。

示例 · OpenAI 兼容 /v1/chat/completions(14 模型通用)

复制curl -X POST https://ai-api.dahe2016.com/v1/chat/completions \
  -H "Authorization: Bearer $KEY" \
  -H "content-type: application/json" \
  -d '{"model":"gpt-5.5","stream":true,
       "messages":[{"role":"user","content":"从1数到20"}]}'

OpenAI Python SDK:OpenAI(base_url="https://ai-api.dahe2016.com/v1", api_key=KEY),model 填 14 个 id 任一(如 claude-opus-4-8 / gpt-6-astra / kimi-k3 / deepseek-v4-pro / glm-5.3)。

示例 · Anthropic 原生 /v1/messages(仅 claude 系)

复制curl -X POST https://ai-api.dahe2016.com/v1/messages \
  -H "x-api-key: $KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-4-6","max_tokens":1024,
       "messages":[{"role":"user","content":"你好"}]}'

Anthropic 官方 Python SDK:Anthropic(base_url="https://ai-api.dahe2016.com", api_key=KEY),model 填 claude-opus-4-8 或 claude-sonnet-4-6,tool use 照常。

claude 系的脾气:claude-* 不接受 temperature / top_p / top_k(传了上游会 400),OpenAI 兼容层已自动丢弃,你无需关心;gpt-* 则照常接受这些参数(纯透传)。流式为 SSE,网关已下发 X-Accel-Buffering: no,逐字流出。
图片输入(视觉):OpenAI 接口的 content 数组支持 image_url(data URL 或公网 http(s) URL)——发给 claude-* 网关会自动转成 Anthropic image block,发给 gpt-* 原样透传。
错误透传:请求本身被上游拒绝(400/413/422,如参数非法、图片过大)时,网关原样返回上游的状态码和错误体(响应头 x-aiapi-channel 指明渠道)——看到 4xx 先检查自己的请求;502 才是网关所有渠道都挂了。

接 Open WebUI

Open WebUI 原生只认 OpenAI 兼容协议,所以走 /v1/chat/completions——claude 系网关后端转成 Anthropic 原生,其余纯透传,14 个模型都能用。

设置项填什么
位置管理面板 → 设置 → 外部连接(Connections)→ OpenAI API → 新增
API Base URLhttps://ai-api.dahe2016.com/v1(务必带 /v1 结尾)
API Key你的网关 key(找服务端 .env 里 AIAPI_KEY_openwebui 那把)
模型保存后自动出现全部 14 个(来自 /v1/models,如 claude-opus-5 / claude-opus-4-8 / gpt-5.5 / kimi-k3 / glm-5.3);若没自动出,手动填对应 id 即可
想要纯 Anthropic 原生进 Open WebUI?Open WebUI 没有对任意 base 的 Anthropic 连接器,只能装第三方 Anthropic「函数/管道(pipe)」插件、把它的 base 指到本网关 /v1/messages(仅 claude 系)——更折腾且随版本变。日常推荐就用上面的 OpenAI 兼容连接,14 模型统一、简单稳定。

图片托管

GET/img/{filename} — 网关把上游图下载落地后,以本站稳定 URL 提供(免鉴权,可直接 <img> 引用)。

为什么要落地:上游链接是临时的(hfsyapi OSS 签名链、otuapi 图床 2h)。网关下载存到本站,返回的 url 不会过期。落地图超过 IMAGE_TTL_DAYS 天会被自动清理(默认 7 天)。

健康检查

GET/healthz — 免鉴权,只报活(拿来做探活/监控即可)。

复制{ "ok": true }

请求统计

按网关 key、并在每个 key 下再按模型统计请求次数 + 成功/失败(一个 key 可能调多个模型)。统计随每次 /v1/images 累加,持久化、重启不丢。可视化见 /admin。

GET/v1/stats — 读取统计(需 KEY)

复制{
  "since": 1782200000,
  "total": { "requests": 128, "images_ok": 240, "images_failed": 3 },
  "by_key": {
    "pic-banana": {
      "requests": 50, "images_ok": 95, "images_failed": 2, "last_ts": 1782284733,
      "models": {                                    // ← 该 key 按模型细分
        "gpt-image-2": { "requests": 30, "ok": 58, "failed": 1 },
        "banana":      { "requests": 20, "ok": 37, "failed": 1 }
      }
    }
  },
  "by_channel": { "hfsyapi": 60, "apiyi": 35, "otuapi": 5 },
  "by_model":   { "gpt-image-2": 58, "banana": 37 }
}

POST/v1/stats/reset — 清零(仅管理员:`x-admin-password` 头;计费周期动作,调用方 KEY 无权)

key 标签从哪来:by_key 的标签 = .env 里 AIAPI_KEY_标签=token 的标签部分。key 只在 .env 维护(一行一个、# 吊销),网页不配置 key。

比例 ↔ 后端 映射参考

调用方只传 ratio,网关按下表翻译。hfsyapi(主)走精确 size,otuapi(备)走提示词描述。

ratiohfsyapi · size 参数otuapi
1:11024x1024统一 size:auto
+ 比例进提示词
(约 1k 原生分辨率,
如 3:4 出 1086×1448)
3:4768x1024
4:31024x768
9:16720x1280
16:91280x720
2:3672x1008
3:21008x672
4:5832x1040
5:41040x832
21:91344x576
其余(9:21 / 1:2 / 2:1 / 1:3 / 3:1 / auto)回退 1024x1024 + 提示词兜底

注:size 是给上游的入参,成品实际分辨率更高(如 3:4 传 768×1024,出图 1086×1448)。hfsyapi 只有 1K 档,2k/4k 入参无效。

错误与坑

HTTP含义
200至少 1 张成功(也可能部分失败,看 errors[])
400参数错误(ratio/size 不支持、i2i 缺 image、n 超限等)
401网关 key 错误或缺失
502全部渠道都失败(errors[] 有每个渠道的报错)

在线试一试

注意:这里会真实调用后端出图,每次都会产生费用。key 仅保存在你本机浏览器(localStorage)。