三个概念,先分清
| 名称 | 是什么 | 干什么用 |
|---|---|---|
渠道 | 一家服务商 + 一把密钥 | 比如「一号通道」= DeepSeek + 某把 key |
id(代号) | 你在界面上看到的、聊天记录里存的名字 | 可以自己起,比如 d5、my-model |
upstream | 真正发给服务商的模型名 | 由服务商决定,比如 deepseek-flash |
为什么要分开:同一个底层模型可以挂好几份(换不同密钥分开额度), 界面上各叫各的名字,互不影响。
所有写接口都要管理员身份。先登录拿 cookie,后续请求带着它:
# 1. 登录(成功后会在 cookie 里拿到会话) curl -c cookie.txt -X POST https://kns-ai.com/api/login \ -H 'Content-Type: application/json' \ -d '{"identifier":"admin","password":"你的密码"}' # 2. 之后的每个请求都带上 -b cookie.txt
/api/models/custom往某个已有的渠道里加一个模型,不动这个渠道的其他模型。加完立即生效,不用重启。
| 字段 | 必填 | 说明 |
|---|---|---|
channel | 是 | 渠道名,必须已存在(看 GET /api/channels) |
id | 是 | 代号,界面上显示和选择用它 |
name | 否 | 界面上显示的名字,留空=同 id |
upstream | 否 | 真实模型名,留空=同 id |
curl -b cookie.txt -X POST https://kns-ai.com/api/models/custom \ -H 'Content-Type: application/json' \ -d '{"channel":"一号通道","id":"d5","name":"D5 轻思考","upstream":"deepseek-flash"}' # 返回 {"ok":true,"added":"d5","channel":"一号通道","channels":4,"models":15,"default":"d1"}
/api/models/custom?channel=..&id=..curl -b cookie.txt -X DELETE 'https://kns-ai.com/api/models/custom?channel=%E4%B8%80%E5%8F%B7%E9%80%9A%E9%81%93&id=d5' # 渠道里至少要留一个模型;整条不要了请用「删渠道」
/api/channels接一家全新的服务商。接口要求符合 OpenAI 规范:POST {地址}/chat/completions、
GET {地址}/models、Authorization: Bearer <密钥>。
DeepSeek、通义、智谱、Kimi、Moonshot、OpenAI、vLLM、Ollama、One-API 都符合。
curl -b cookie.txt -X POST https://kns-ai.com/api/channels \ -H 'Content-Type: application/json' \ -d '{ "name": "某新渠道", "base_url": "https://api.example.com/v1", "api_key": "sk-xxxx", "models": [ "gpt-4o-mini", {"id":"x1","name":"X1 轻","upstream":"gpt-4o-mini"} ] }' # models 两种写法都行:纯字符串,或带 id/name/upstream 的对象
models 里没写的模型就会消失。
只想加一个模型请用上面的 /api/models/custom。
| 接口 | 用途 |
|---|---|
GET/api/channels | 所有渠道、密钥掩码、每条渠道下有哪些模型 |
GET/api/models | 界面上能选的模型清单(按优先级排序) |
GET/api/version | 当前版本 |
POST/api/channels/test | 试连一个地址和密钥,返回可用模型列表(不保存) |
DELETE/api/channels/{name} | 删掉一整条渠道 |
同一个模型挂了,会按这个顺序往下试,全自动:
① 这个模型自己的渠道
② 同一个底层模型的其他通道(换一把密钥,比如主 key 欠费就换备 key)
③ 再换别的模型(重思考 → 混元 → 千问 → 智谱)
所以只要同一类模型挂了两个通道,一个出问题另一个就能顶上,用户感觉不到。
upstream 写对了吗?那个模型在该账号下有权限吗?余额够吗?