几行代码,接入所有大模型
TokenHub 完全兼容 OpenAI 接口规范。只需替换 base_url 与 API Key,现有代码、SDK 与框架即可调用云端大厂模型、本地私有模型和企业知识库。
# 现有 OpenAI 代码,只改两个环境变量
# Base URL 替换为你部署的 TokenHub 地址
$ export OPENAI_BASE_URL=http://localhost:8080/v1
$ export OPENAI_API_KEY=th-********************
$ python app.py
✓ model=auto → deepseek-chat 412ms 1,206 tokens
✓ model=ollama/qwen2.5:7b 286ms 843 tokens
# 用量已计入项目「智能客服」· 示例输出
5 分钟完成第一次调用
先在自己的服务器上部署 TokenHub,再用 OpenAI 官方 SDK 发起调用。任何兼容 OpenAI 协议的客户端都可以同样方式接入。
-
部署 TokenHub
从下载页获取 Docker 镜像或安装包,部署到你自己的服务器,默认监听
8080端口。首次打开http://localhost:8080时创建管理员账号。# 以 Docker 为例(镜像地址将在正式发布时公布) docker run -d --name tokenhub \ -p 8080:8080 \ -v $(pwd)/tokenhub-data:/data \ <镜像地址待发布>:2.3.0 -
获取 API Key
在你自己部署的 TokenHub 管理后台中添加模型(云端厂商 Key 或本地模型地址),然后进入「API Keys」新建密钥,可为密钥绑定项目、可用模型与 Token 配额。密钥以
th-开头,仅在创建时完整显示一次。# 建议通过环境变量管理密钥,不要写入代码仓库 export TOKENHUB_API_KEY="th-your-api-key" # 替换为你部署的 TokenHub 地址 export TOKENHUB_BASE_URL="http://localhost:8080/v1" -
安装 SDK
直接使用 OpenAI 官方 SDK,无需安装额外依赖;也可以使用任意 HTTP 客户端。
# Python pip install openai # Node.js npm install openai -
发起第一次调用
model可填写具体模型名(如deepseek-chat、qwen-plus、ollama/qwen2.5:7b),或填写auto由路由策略自动选择。# 替换为你部署的 TokenHub 地址 curl http://localhost:8080/v1/chat/completions \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [ {"role": "system", "content": "你是一名专业的企业助理"}, {"role": "user", "content": "用三句话介绍 TokenHub"} ], "temperature": 0.7 }'import os from openai import OpenAI client = OpenAI( base_url="http://localhost:8080/v1", # 替换为你部署的 TokenHub 地址 api_key=os.environ["TOKENHUB_API_KEY"], ) resp = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是一名专业的企业助理"}, {"role": "user", "content": "用三句话介绍 TokenHub"}, ], temperature=0.7, ) print(resp.choices[0].message.content) print(resp.usage) # prompt / completion / total tokensimport OpenAI from "openai"; const client = new OpenAI({ baseURL: "http://localhost:8080/v1", // 替换为你部署的 TokenHub 地址 apiKey: process.env.TOKENHUB_API_KEY, }); const resp = await client.chat.completions.create({ model: "deepseek-chat", messages: [ { role: "system", content: "你是一名专业的企业助理" }, { role: "user", content: "用三句话介绍 TokenHub" }, ], temperature: 0.7, }); console.log(resp.choices[0].message.content); -
开启流式输出
设置
stream: true,以 SSE(Server-Sent Events)逐段返回内容,首字更快出现,适合对话类界面。最后一条消息为data: [DONE]。curl -N http://localhost:8080/v1/chat/completions \ -H "Authorization: Bearer $TOKENHUB_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen-plus", "stream": true, "messages": [ {"role": "user", "content": "写一段产品发布会开场白"} ] }' # 返回(节选): # data: {"choices":[{"index":0,"delta":{"content":"各位"}}]} # data: {"choices":[{"index":0,"delta":{"content":"来宾"}}]} # data: [DONE]stream = client.chat.completions.create( model="qwen-plus", messages=[{"role": "user", "content": "写一段产品发布会开场白"}], stream=True, ) for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True)const stream = await client.chat.completions.create({ model: "qwen-plus", messages: [{ role: "user", content: "写一段产品发布会开场白" }], stream: true, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ""); }
与 OpenAI 一致的接口设计
所有接口均以 JSON 交互,使用 Bearer Token 鉴权。Base URL 请替换为你部署的 TokenHub 地址。
| 能力 | 方法 | 路径 | 说明 |
|---|---|---|---|
| 模型调用(OpenAI 兼容) | |||
| Chat Completions | POST | /chat/completions | 对话补全,支持流式输出、工具调用、多模态输入(取决于模型) |
| Embeddings | POST | /embeddings | 文本向量化,可调用云端或本地 Embedding 模型 |
| Rerank | POST | /rerank | 对候选文档按相关性重新排序,常用于 RAG 检索后处理 |
| Models | GET | /models | 列出当前 Key 有权限调用的全部模型 |
| GET | /models/{model_id} | 查询单个模型的详情、上下文长度与单价 | |
| TokenHub 扩展 | |||
| Knowledge Bases | GET | /knowledge_bases | 列出可访问的知识库 |
| POST | /knowledge_bases/{kb_id}/documents | 上传文档,自动解析、切片与向量化 | |
| POST | /knowledge_bases/{kb_id}/search | 混合检索,返回片段与原文出处 | |
| DELETE | /knowledge_bases/{kb_id}/documents/{doc_id} | 删除文档及其向量数据 | |
| Usage | GET | /usage | 按时间、项目、模型查询 Token 用量与费用 |
* 扩展接口的字段与路径以正式 API 文档为准;在对话接口中传入 knowledge_base 参数即可直接启用 RAG。
把内网推理服务注册到 TokenHub
任何提供 OpenAI 兼容接口的推理服务都可以接入。注册后,本地模型与云端模型使用同一套 API、权限与计量。
- 在推理服务器上拉取模型以 Qwen2.5 7B 与 bge-m3 Embedding 模型为例。
- 允许内网访问Ollama 默认只监听本机,设置
OLLAMA_HOST后启动服务。 - 在 TokenHub 中添加模型管理后台「模型接入 → 添加本地模型」,选择 Ollama 并填写地址,平台会自动探测可用模型。
- 按统一方式调用使用
名称/模型格式的模型名,与云端模型调用方式完全一致。
# ① 拉取模型
ollama pull qwen2.5:7b
ollama pull bge-m3
# ② 监听内网地址并启动
OLLAMA_HOST=0.0.0.0:11434 ollama serve
# ③ TokenHub 本地模型配置(等价 YAML 示例)
provider: ollama
name: local-qwen
base_url: http://10.0.0.21:11434
models:
- qwen2.5:7b
- bge-m3 # 同时作为知识库 Embedding 模型
# ④ 调用时使用 model="local-qwen/qwen2.5:7b"
- 启动 vLLM OpenAI 兼容服务建议设置
--api-key,仅允许 TokenHub 访问。 - 确认服务可用从 TokenHub 所在服务器请求
/v1/models,确认网络连通。 - 以「OpenAI 兼容服务」类型注册填写地址、密钥与模型别名,可设置并发上限与超时。
- 配置路由与容灾可将本地模型设为主模型、云端模型作为备用,或反之。
# ① 启动服务(示例:单机 2 卡)
vllm serve Qwen/Qwen2.5-14B-Instruct \
--port 8000 \
--tensor-parallel-size 2 \
--api-key local-secret
# ② 连通性检查
curl http://10.0.0.22:8000/v1/models \
-H "Authorization: Bearer local-secret"
# ③ TokenHub 本地模型配置(等价 YAML 示例)
provider: openai-compatible
name: local-vllm
base_url: http://10.0.0.22:8000/v1
api_key: ${VLLM_API_KEY}
models:
- id: Qwen/Qwen2.5-14B-Instruct
alias: qwen2.5-14b
fallback: deepseek-chat # 本地不可用时自动切换
* 命令与配置为示意,IP、模型与字段名请以实际环境和正式版本为准。Xinference、LM Studio、SGLang 等同样可按「OpenAI 兼容服务」方式接入。
兼容你正在使用的开发生态
基于 OpenAI 兼容协议,主流 SDK、开发框架与 AI 应用平台只需修改 Base URL 和 Key 即可接入。
OpenAI 官方 SDK
Python · Node.js · Go · Java 等设置 base_url / baseURL 与 API Key 即可,无需更换依赖。
LangChain
Python · JS使用 ChatOpenAI 与 OpenAIEmbeddings,指定 TokenHub 地址即可构建链与 Agent。
LlamaIndex
Python通过 OpenAI-Like LLM 与 Embedding 接口接入,便于复用现有索引与检索流程。
Dify
AI 应用平台在模型供应商中添加「OpenAI-API-compatible」,统一由 TokenHub 管理权限与计量。
Open WebUI 等对话客户端
自托管对话界面配置 OpenAI 兼容连接,为员工提供统一入口,额度与审计由 TokenHub 管控。
任意 HTTP 客户端
curl · requests · fetch标准 REST + SSE 接口,任何语言都可直接调用,无需专用 SDK。
* 以上工具均通过 OpenAI 兼容协议接入,TokenHub 与相关项目不存在官方合作关系,名称及商标归各自所有者所有。
错误码与处理建议
错误响应沿用 OpenAI 的格式,便于复用现有的异常处理逻辑。
| HTTP | 错误码 | 含义 | 建议处理 |
|---|---|---|---|
| 400 | invalid_request | 参数缺失或格式错误 | 检查请求体与字段类型 |
| 400 | context_length_exceeded | 输入超出模型上下文长度 | 精简消息或换用长上下文模型 |
| 401 | invalid_api_key | API Key 无效、过期或已禁用 | 在管理后台确认密钥状态 |
| 403 | permission_denied | 无权调用该模型或知识库 | 联系管理员授予对应权限 |
| 404 | model_not_found | 模型不存在或未启用 | 调用 /models 获取可用列表 |
| 429 | rate_limit_exceeded | 触发每分钟请求或 Token 限流 | 指数退避后重试 |
| 429 | quota_exceeded | 项目或密钥配额已用尽 | 申请提升配额,重试无效 |
| 500 | internal_error | 网关内部错误 | 携带 request_id 联系支持 |
| 502 | upstream_error | 上游模型服务返回错误 | 可重试,或配置备用模型 |
| 503 | model_unavailable | 模型暂不可用(含本地服务离线) | 启用故障自动切换 |
| 504 | upstream_timeout | 上游响应超时 | 调整超时或改用流式输出 |
错误响应示例
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "项目请求频率超出限制",
"request_id": "req_8f2c…"
}
}
- 仅对 429(限流)与 5xx 进行重试
- 使用指数退避,并读取
Retry-After响应头 - 记录
request_id,便于在调用日志中定位
更多文档与支持
下载与安装
安装包、安装命令与系统要求。
前往下载API 文档
完整的接口参数、响应字段与示例。
更新日志
新功能、优化与修复记录。
查看更新技术支持
接入问题与故障排查,联系技术团队。
联系我们