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

图片生成gpt-image-2 / banana)+ 文本对话 13 模型claude-opus-5 / claude-opus-4-8 / claude-sonnet-4-6 / claude-sonnet-5 / claude-fable-5 / gpt-5.4 / gpt-5.5 / gpt-5.6-luna / gpt-5.6-sol / gpt-5.6-terra / kimi-k3 / deepseek-v4-flash / deepseek-v4-pro,对外都兼容 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,画质强但走异步任务、可能 2–4 分钟,客户端超时设 ≥300s)
ratiostring可选3:4比例,取值见下;auto=交给模型判断。banana 目前主用渠道仅 1:1 / 9:16 / 16:9 / auto,其余按 auto
modestring可选t2it2i=文生图 / i2i=图生图
imagestring | string[]i2i 必填参考图,单张或数组。三种都行:在线 URL / DataURLdata: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实际出图渠道:hfsyapiotuapi(故障转移时可能是备用渠道,对你无影响)
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 知道哪几张没出、为什么。

文本 / 对话 · 13 个模型

13 个文本模型:claude 系与 gpt 系多渠道主备 + 自动故障转移;kimi-k3/deepseek-v4-flash/deepseek-v4-pro 直连原厂单渠道无备用对外都兼容 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
claude-fable-5Claude · Anthropic 原生ctok 主 / sudocode 备/v1/chat/completions + /v1/messages
gpt-5.4GPT · OpenAI 原生ctok 主 / sudocode 备 /v1/chat/completions
gpt-5.5GPT · OpenAI 原生ctok 主 / sudocode 备 /v1/chat/completions
gpt-5.6-lunaGPT · OpenAI 原生ctok 主 / sudocode 备 /v1/chat/completions
gpt-5.6-solGPT · OpenAI 原生ctok 主 / sudocode 备 /v1/chat/completions
gpt-5.6-terraGPT · OpenAI 原生ctok 主 / sudocode 备 /v1/chat/completions
kimi-k3Moonshot · OpenAI 原生直连,无备用 /v1/chat/completions
deepseek-v4-flashDeepSeek · OpenAI 原生直连,无备用 /v1/chat/completions
deepseek-v4-proDeepSeek · OpenAI 原生直连,无备用 /v1/chat/completions
模型 id 严格匹配:model 必须精确等于上表十三个 id 之一(区分大小写),对不上一律 400 报错,绝不默认gpt-*/kimi-*/deepseek-* 都是 OpenAI 原生,发到 /v1/messages 会 400,请走 /v1/chat/completionskimi-k3 与 deepseek-v4-flash/pro 是"始终思考"模型:内容主要出现在 reasoning_contentmax_tokens 给太小会被思考过程耗尽、导致 content 为空且 finish_reason=length——最简单的做法是不传 max_tokens,两家上游各自有宽松默认值(kimi-k3 默认 131,072),实测不传更稳。
端点协议什么时候用
POST/v1/chat/completionsOpenAI 兼容(13 模型全支持;claude 系后端转 Anthropic,其余纯透传)OpenAI SDK、Open WebUI、LangChain 等——推荐统一走这个
POST/v1/messagesAnthropic 原生透传(仅 claude 系,字段一个不改)Anthropic 官方 SDK / 想要最原生的 tool use 体验
GET/v1/modelsOpenAI 兼容模型列表给 Open WebUI 等自动发现,返回上述 13 个真实 id

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

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

复制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 填 13 个 id 任一(如 claude-opus-4-8 / gpt-5.4 / kimi-k3 / deepseek-v4-pro)。

示例 · 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)modelclaude-opus-4-8claude-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 原生,其余纯透传,13 个模型都能用。

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

图片托管

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 的标签 = .envAIAPI_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)。