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
请求字段
| 字段 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
prompt | string | 必填 | — | 文本提示词,中英文均可 |
model | string | 可选 | gpt-image-2 | gpt-image-2(快,~20–90s)/ banana(Nano Banana 2,画质强但走异步任务、可能 2–4 分钟,客户端超时设 ≥300s) |
ratio | string | 可选 | 3:4 | 比例,取值见下;auto=交给模型判断。banana 目前主用渠道仅 1:1 / 9:16 / 16:9 / auto,其余按 auto |
mode | string | 可选 | t2i | t2i=文生图 / i2i=图生图 |
image | string | string[] | i2i 必填 | — | 参考图,单张或数组。三种都行:在线 URL / DataURL(data:image/png;base64,...)/ 裸 base64(无在线图、只有本地文件时直接传 base64 即可,网关会自动识别图片类型补成 DataURL) |
size | string | 可选 | 1k | 尺寸档 1k/2k/4k。当前两个渠道都只出 1k(hfsyapi 精确 1k、otuapi auto≈1k),2k/4k 传了也按 1k 出 |
n | integer | 可选 | 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
}
]
}
顶层字段
| 字段 | 类型 | 说明 |
|---|---|---|
created | int | 生成时间戳(秒) |
ratio / mode / size | string | 本次实际使用的比例 / 模式 / 尺寸档(回显) |
requested | int | 请求张数(= 入参 n) |
succeeded | int | 成功张数(= data 长度) |
failed | int | 失败张数(= errors 长度) |
data | array | 成功的图,每项见下;全失败时为 [] |
errors | array | 失败的图,每项见下;全成功时为 [] |
data[] — 每张成功图
| 字段 | 类型 | 说明 |
|---|---|---|
url | string | 本站稳定链接,永久有效,可直接 <img src> 引用(这是你要用的图片地址) |
provider | string | 实际出图渠道:hfsyapi 或 otuapi(故障转移时可能是备用渠道,对你无影响) |
upstream_size | string | 上游实际 size 参数:hfsyapi 为精确像素如 768x1024;otuapi 恒为 auto(比例靠提示词控) |
width / height | int | 成品图真实像素 |
bytes | int | 图片字节大小 |
elapsed_ms | int | 这张图耗时(毫秒) |
errors[] — 每个失败项
| 字段 | 类型 | 说明 |
|---|---|---|
index | int | 这是第几张(从 0 起) |
tried | array | 各渠道的尝试记录 [{channel, error}],主备都试过的报错都在里面,便于排查 |
elapsed_ms | int | 这张图耗时(毫秒) |
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-5 | Claude · Anthropic 原生 | ctok 主 / sudocode 备 | /v1/chat/completions + /v1/messages |
claude-opus-4-8 | Claude · Anthropic 原生 | ctok 主 / sudocode 备 | /v1/chat/completions + /v1/messages |
claude-sonnet-4-6 | Claude · Anthropic 原生 | ctok 主 / sudocode 备 | /v1/chat/completions + /v1/messages |
claude-sonnet-5 | Claude · Anthropic 原生 | ctok 主 / sudocode 备 | /v1/chat/completions + /v1/messages |
claude-fable-5 | Claude · Anthropic 原生 | ctok 主 / sudocode 备 | /v1/chat/completions + /v1/messages |
gpt-5.4 | GPT · OpenAI 原生 | ctok 主 / sudocode 备 | 仅 /v1/chat/completions |
gpt-5.5 | GPT · OpenAI 原生 | ctok 主 / sudocode 备 | 仅 /v1/chat/completions |
gpt-5.6-luna | GPT · OpenAI 原生 | ctok 主 / sudocode 备 | 仅 /v1/chat/completions |
gpt-5.6-sol | GPT · OpenAI 原生 | ctok 主 / sudocode 备 | 仅 /v1/chat/completions |
gpt-5.6-terra | GPT · OpenAI 原生 | ctok 主 / sudocode 备 | 仅 /v1/chat/completions |
kimi-k3 | Moonshot · OpenAI 原生 | 直连,无备用 | 仅 /v1/chat/completions |
deepseek-v4-flash | DeepSeek · OpenAI 原生 | 直连,无备用 | 仅 /v1/chat/completions |
deepseek-v4-pro | DeepSeek · OpenAI 原生 | 直连,无备用 | 仅 /v1/chat/completions |
model 必须精确等于上表十三个 id 之一(区分大小写),对不上一律 400 报错,绝不默认。gpt-*/kimi-*/deepseek-* 都是 OpenAI 原生,发到 /v1/messages 会 400,请走 /v1/chat/completions。kimi-k3 与 deepseek-v4-flash/pro 是"始终思考"模型:内容主要出现在 reasoning_content,max_tokens 给太小会被思考过程耗尽、导致 content 为空且 finish_reason=length——最简单的做法是不传 max_tokens,两家上游各自有宽松默认值(kimi-k3 默认 131,072),实测不传更稳。| 端点 | 协议 | 什么时候用 |
|---|---|---|
POST/v1/chat/completions | OpenAI 兼容(13 模型全支持;claude 系后端转 Anthropic,其余纯透传) | OpenAI SDK、Open WebUI、LangChain 等——推荐统一走这个 |
POST/v1/messages | Anthropic 原生透传(仅 claude 系,字段一个不改) | Anthropic 官方 SDK / 想要最原生的 tool use 体验 |
GET/v1/models | OpenAI 兼容模型列表 | 给 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),model 填 claude-opus-4-8 或 claude-sonnet-4-6,tool use 照常。
claude-* 不接受 temperature / top_p / top_k(传了上游会 400),OpenAI 兼容层已自动丢弃,你无需关心;gpt-* 则照常接受这些参数(纯透传)。流式为 SSE,网关已下发 X-Accel-Buffering: no,逐字流出。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 URL | https://ai-api.dahe2016.com/v1(务必带 /v1 结尾) |
| API Key | 你的网关 key(找服务端 .env 里 AIAPI_KEY_openwebui 那把) |
| 模型 | 保存后自动出现全部 13 个(来自 /v1/models,如 claude-opus-5 / claude-opus-4-8 / gpt-5.5 / kimi-k3);若没自动出,手动填对应 id 即可 |
/v1/messages(仅 claude 系)——更折腾且随版本变。日常推荐就用上面的 OpenAI 兼容连接,13 模型统一、简单稳定。图片托管
GET/img/{filename} — 网关把上游图下载落地后,以本站稳定 URL 提供(免鉴权,可直接 <img> 引用)。
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 无权)
by_key 的标签 = .env 里 AIAPI_KEY_标签=token 的标签部分。key 只在 .env 维护(一行一个、# 吊销),网页不配置 key。比例 ↔ 后端 映射参考
调用方只传 ratio,网关按下表翻译。hfsyapi(主)走精确 size,otuapi(备)走提示词描述。
| ratio | hfsyapi · size 参数 | otuapi |
|---|---|---|
| 1:1 | 1024x1024 | 统一 size:auto+ 比例进提示词 (约 1k 原生分辨率, 如 3:4 出 1086×1448) |
| 3:4 | 768x1024 | |
| 4:3 | 1024x768 | |
| 9:16 | 720x1280 | |
| 16:9 | 1280x720 | |
| 2:3 | 672x1008 | |
| 3:2 | 1008x672 | |
| 4:5 | 832x1040 | |
| 5:4 | 1040x832 | |
| 21:9 | 1344x576 | |
其余(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[] 有每个渠道的报错) |
- 延迟:单张约 20–90s(同步出图 = 整张图生成时间);客户端超时建议 ≥300s。
- 并发:对外可并发;网关对上游始终 n=1 多次请求(传 N 会掉质量)。
- 冷启动 504:hfsyapi 偶发超时,网关会转备用渠道;两家都失败才返回 502。
- 图别长期引用上游链:用网关返回的
url(本站落地,永久有效)。