SDK、框架与客户端
用官方 SDK、常见框架、编程助手和聊天客户端调用 ModelSite:配置项、对应端点和每一项的验证状态
ModelSite 提供两个入口,用对应的官方 SDK 即可,无需专用客户端:
| 格式 | SDK | base_url | 实际请求路径 | 鉴权头 |
|---|---|---|---|---|
| OpenAI | openai | https://api.modelsite.ai/v1 | /v1/chat/completions、/v1/responses、/v1/embeddings | Authorization: Bearer |
| Anthropic | anthropic / @anthropic-ai/sdk | https://api.modelsite.ai(不带 /v1) | /v1/messages | Authorization: Bearer |
文本模型入口只从 Authorization: Bearer 读取 Key,不读 x-api-key。这决定了 Anthropic 协议的客户端必须走 Bearer(auth_token、ANTHROPIC_AUTH_TOKEN),见下文。以 /api/v1、/api/v3、/v2 开头的视频和图像入口还额外接受 X-API-KEY,这是 ComfyUI 自带 API 节点发送的头;同时带了两种头时以 Authorization: Bearer 为准。见在 ComfyUI 中使用 ModelSite。
验证状态说明
下面每个条目都标一档验证状态,只有这三档:
| 状态 | 含义 |
|---|---|
| 已核对官方文档 | 该工具官方文档里有自定义 base URL 或 OpenAI 兼容服务商的配置项,条目里附文档地址。我们没有运行过该工具。 |
| 已用桩服务实测请求 | 在隔离环境装了该工具,让它请求本机的桩服务(不是 ModelSite,不产生费用),记录它实际发出的路径、鉴权头和请求体字段。条目里写明测试的版本。 |
| 未验证 | 只有间接依据,或平台一侧是否满足该工具的协议要求无法从代码判断。条目里写明原因。 |
桩服务只能证明客户端发出了什么,不能证明 ModelSite 的每个上游模型都能处理这些请求。条目里的「限制」一栏写的是我们读代码或官方文档得到的、使用时要注意的差异。没有依据的工具不收录,见未收录的工具。
API Key
新 Key 格式为 sk-ms- 加 64 位十六进制字符,共 70 个字符;早期的 sk-relay- 开头旧 Key 仍可用。下面所有示例都从环境变量 MODELSITE_API_KEY 读取,不要把真实 Key 写进源码:
export MODELSITE_API_KEY="sk-ms-xxxxxxxx" # 换成控制台里复制的完整 KeyOpenAI SDK 只读环境变量 OPENAI_API_KEY,Anthropic SDK 读 ANTHROPIC_API_KEY 或 ANTHROPIC_AUTH_TOKEN,都不会自动读取 MODELSITE_API_KEY。下面的示例因此都显式把它传给 SDK 或工具。
官方 SDK
OpenAI SDK
- 做什么:用官方 OpenAI SDK 调用 Chat Completions、Responses、Embeddings。
- 需要填:
base_url=https://api.modelsite.ai/v1;Key =Authorization: Bearer;模型 = 平台模型 ID,如glm-5.3-flash。 - 对应端点:
/v1/chat/completions、/v1/responses、/v1/embeddings。 - 验证状态:已用桩服务实测请求(OpenAI Python 2.54.0、Node 6.49.0)。
- 限制:
/v1/responses在模型的上游不原生支持 Responses 时走转换路径,与 OpenAI 官方存在差异,详见 Codex CLI 条目的限制。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.modelsite.ai/v1",
api_key=os.environ["MODELSITE_API_KEY"],
)
# 非流式
resp = client.chat.completions.create(
model="glm-5.3-flash",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
# 流式
stream = client.chat.completions.create(
model="glm-5.3-flash",
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="")同一个 client 还可以调用 client.responses.create(...)(/v1/responses)和 client.embeddings.create(...)(/v1/embeddings),参数见 Responses 与 Embeddings。
Anthropic SDK
- 做什么:用官方 Anthropic SDK 调用 Messages。
- 需要填:
base_url=https://api.modelsite.ai(不带/v1);Key 传给auth_token/authToken,不是api_key;模型 = 平台模型 ID。 - 对应端点:
/v1/messages。 - 验证状态:已用桩服务实测请求(Anthropic Python 1.15.0、Node 0.135.0)。用
api_key时 Key 只出现在x-api-key头里,平台返回401。
import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.modelsite.ai", # 不带 /v1,SDK 自己拼 /v1/messages
auth_token=os.environ["MODELSITE_API_KEY"], # 发 Authorization: Bearer
)
# 非流式
msg = client.messages.create(
model="glm-5.3-flash",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
)
print(msg.content[0].text)
# 流式
with client.messages.stream(
model="glm-5.3-flash",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
) as stream:
for text in stream.text_stream:
print(text, end="")SDK 会自动带上 anthropic-version: 2023-06-01;如果你自己设置了 anthropic-beta,平台会转发给上游。
框架
LangChain(Python)
- 做什么:用
langchain-openai的ChatOpenAI调用 Chat Completions。 - 需要填:
base_url=https://api.modelsite.ai/v1;api_key= Key;model= 平台模型 ID。 - 对应端点:
/v1/chat/completions(非流式与流式)。 - 验证状态:已用桩服务实测请求(langchain-openai 1.7.2)。
base_url与api_key参数见 LangChain 官方文档,未传base_url时依次读OPENAI_API_BASE、OPENAI_BASE_URL。 - 限制:官方文档说明
ChatOpenAI只面向 OpenAI 官方规范,第三方模型返回的非标准字段(例如reasoning_content)不会被提取或保留。需要读取思考内容时,直接用 OpenAI SDK,或改用该模型的专用集成包。
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
base_url="https://api.modelsite.ai/v1",
api_key=os.environ["MODELSITE_API_KEY"],
model="glm-5.3-flash",
)
print(llm.invoke("你好").content)LlamaIndex(Python)
- 做什么:用
llama-index-llms-openai-like的OpenAILike调用任意 OpenAI 兼容的 Chat Completions 服务。 - 需要填:
api_base=https://api.modelsite.ai/v1;api_key= Key;model= 平台模型 ID;is_chat_model=True。 - 对应端点:
/v1/chat/completions(chat与stream_chat)。 - 验证状态:已用桩服务实测请求(llama-index-llms-openai-like 0.8.1)。
- 限制:我们只测了
chat与stream_chat两个调用;Embedding、工具调用等没有测。
import os
from llama_index.llms.openai_like import OpenAILike
from llama_index.core.llms import ChatMessage
llm = OpenAILike(
model="glm-5.3-flash",
api_base="https://api.modelsite.ai/v1",
api_key=os.environ["MODELSITE_API_KEY"],
is_chat_model=True,
)
print(llm.chat([ChatMessage(role="user", content="你好")]).message.content)Vercel AI SDK(TypeScript)
- 做什么:用
ai加@ai-sdk/openai-compatible(或@ai-sdk/anthropic)调用。 - 需要填:
baseURL=https://api.modelsite.ai/v1;apiKey(OpenAI 兼容)或authToken(Anthropic)= Key;模型 = 平台模型 ID。 - 对应端点:
createOpenAICompatible(...).chatModel()与createOpenAI(...).chat()走/v1/chat/completions;@ai-sdk/anthropic走/v1/messages。 - 验证状态:已用桩服务实测请求(ai 6.0.309、
@ai-sdk/openai-compatible2.0.85、@ai-sdk/openai3.0.130、@ai-sdk/anthropic3.0.133)。 - 限制:
createOpenAI(...)(model)默认请求的是/v1/responses,不是 Chat Completions。要走 Chat Completions,用.chat(model)。@ai-sdk/anthropic的baseURL要带/v1(和 Anthropic 官方 SDK 相反,实测它直接拼/messages)。@ai-sdk/anthropic传apiKey时 Key 在x-api-key头里,平台不读,必须传authToken。
import { generateText } from 'ai'
import { createOpenAICompatible } from '@ai-sdk/openai-compatible'
const modelsite = createOpenAICompatible({
name: 'modelsite',
baseURL: 'https://api.modelsite.ai/v1',
apiKey: process.env.MODELSITE_API_KEY,
})
const { text } = await generateText({
model: modelsite.chatModel('glm-5.3-flash'),
prompt: '你好',
})编程助手
Claude Code
- 做什么:Anthropic 的终端编程助手,走 Anthropic Messages 协议。
- 需要填:
ANTHROPIC_BASE_URL=https://api.modelsite.ai;ANTHROPIC_AUTH_TOKEN= Key;ANTHROPIC_MODEL= 平台模型 ID。 - 对应端点:
/v1/messages(流式)。 - 验证状态:已用桩服务实测请求(Claude Code 2.1.303)。配置项见 Claude Code 官方网关文档。
export ANTHROPIC_BASE_URL="https://api.modelsite.ai"
export ANTHROPIC_AUTH_TOKEN="$MODELSITE_API_KEY"
export ANTHROPIC_MODEL="glm-5.3-flash"
claude实测它发出的请求:
POST /v1/messages?beta=true,Authorization: Bearer,stream: true,带 20 个工具定义。网关只按路径转发,会忽略?beta=true。- 请求体里有
thinking(实测值{"type":"adaptive","display":"omitted"})、context_management(clear_thinking_20251015)、output_config(effort)。请求头带多个anthropic-beta值。 - 这次只发出了一个
/v1/messages请求,没有请求count_tokens。
限制:
- 必须用
ANTHROPIC_AUTH_TOKEN。官方文档说明ANTHROPIC_API_KEY以x-api-key发送,平台不读,返回401;apiKeyHelper会同时发两个头,也可用。 - GLM 模型与
medium强度。glm-5.3和glm-5.3-flash支持的强度是low、high、max;当强度设为medium时,请求按high执行。其他对话模型按你发送的强度执行。细节和一次实测见 Claude Code。 - 对不认识的模型 ID,Claude Code 会提示并按 200k 上下文窗口处理,修正方法见 官方 model-config 页面。
- 官方文档说明
opus/sonnet/haiku别名默认解析为 Anthropic 官方模型 ID,可以用ANTHROPIC_DEFAULT_OPUS_MODEL、ANTHROPIC_DEFAULT_SONNET_MODEL、ANTHROPIC_DEFAULT_HAIKU_MODEL改指向平台模型 ID。 - 平台在解析请求时不会因为不认识的顶层字段拒绝请求,这些字段会被保留;对不走 Anthropic 原生端点的模型,它们会被带到上游。各模型的上游是否接受
context_management等字段,我们没有逐个验证。 如果返回400且提示Extra inputs are not permitted之类,按官方排障表设置CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1。 - 工具调用与多轮对话没有端到端实测(桩服务只返回文本)。
Codex CLI
- 做什么:OpenAI 的终端编程助手,只走 Responses 协议。
- 需要填:
~/.codex/config.toml里自定义model_providers:base_url=https://api.modelsite.ai/v1,env_key指向放 Key 的环境变量,wire_api = "responses";model= 平台模型 ID。 - 对应端点:
/v1/responses(流式)。 - 验证状态:已用桩服务实测请求(codex-cli 0.142.2)。
model_providers字段见 Codex 官方配置文档。平台一侧有已知差异,见下方限制。
model = "glm-5.3-flash"
model_provider = "modelsite"
[model_providers.modelsite]
name = "ModelSite"
base_url = "https://api.modelsite.ai/v1"
env_key = "MODELSITE_API_KEY"
wire_api = "responses"实测它发出的请求:
POST /v1/responses,Authorization: Bearer,stream: true,store: false。- 工具类型有
function、namespace、web_search;请求体里还有include、prompt_cache_key、client_metadata。 MODELSITE_API_KEY没设置时,Codex 本地直接报Missing environment variable,不会发请求。- 对平台模型 ID,Codex 提示
Model metadata ... not found并使用兜底元数据。OpenRouter 的 Codex 指南也记录了同样的提示。
限制:
- Codex 只走
/v1/responses。当模型的上游不原生支持 Responses 时,平台走转换路径,与 OpenAI 官方不一致:转换路径已按官方对齐:流式事件带sequence_number,response.created/in_progress/completed回显请求字段,reasoning 用官方的summary结构(流式与非流式一致),output里 reasoning 在前,流式与非流式的id都以resp_开头。仍有差异:function_call 项的id与call_id相同;拒答内容块用text而不是refusal;回显的store、truncation、previous_response_id等只是回显,转换路径不执行。这些对齐有单元测试(官方事件序列)覆盖,Codex 是否能正确解析,我们仍没有对真实平台做端到端验证。 - 转换路径下,请求里的
store、include、previous_response_id等 Responses 专有字段没有 Chat Completions 对应项,会被丢弃。 - 按代码,转换路径把
function和custom工具转成 Chat Completions 的函数工具,把web_search转成web_search_options,对namespace类型没有转换分支。web_search_options上游是否接受,我们没有验证;实测在config.toml里设web_search = "disabled"(DeepSeek 的 Codex 指南也用这个键)后,请求里不再带web_search工具。
OpenCode
- 做什么:开源终端编程助手,通过
opencode.json的自定义服务商接入 OpenAI 兼容端点。 - 需要填:
npm=@ai-sdk/openai-compatible;options.baseURL=https://api.modelsite.ai/v1;options.apiKey= Key;models里列出平台模型 ID。 - 对应端点:
/v1/chat/completions(流式,带tools)。 - 验证状态:已用桩服务实测请求(OpenCode 1.2.27)。配置项见 OpenCode 官方服务商文档。
- 限制:官方文档说明
@ai-sdk/openai-compatible用于/v1/chat/completions;模型走/v1/responses时要换@ai-sdk/openai,此时适用 Codex 条目里关于 Responses 的限制。
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"modelsite": {
"npm": "@ai-sdk/openai-compatible",
"name": "ModelSite",
"options": {
"baseURL": "https://api.modelsite.ai/v1",
"apiKey": "{env:MODELSITE_API_KEY}"
},
"models": {
"glm-5.3-flash": { "name": "GLM 5.3 Flash" }
}
}
}
}运行时用 opencode run -m modelsite/glm-5.3-flash "你好"。
Aider
- 做什么:终端里的 git 结对编程工具。
- 需要填:
OPENAI_API_BASE=https://api.modelsite.ai/v1;OPENAI_API_KEY= Key;--model openai/加平台模型 ID。 - 对应端点:
/v1/chat/completions(流式)。 - 验证状态:已用桩服务实测请求(Aider 0.86.2)。配置项见 Aider 官方文档。
- 限制:模型名必须加
openai/前缀;官方文档说明 Aider 对不认识的模型会给出警告。Aider 读的是OPENAI_API_KEY,所以这里要把 Key 导出到这个变量。
export OPENAI_API_BASE="https://api.modelsite.ai/v1"
export OPENAI_API_KEY="$MODELSITE_API_KEY"
aider --model openai/glm-5.3-flashCline
- 做什么:VS Code 里的编程助手,用 OpenAI Compatible 服务商接入。
- 需要填:API Provider =
OpenAI Compatible;Base URL =https://api.modelsite.ai/v1;API Key = Key;Model ID = 平台模型 ID。 - 对应端点:OpenAI 兼容的 Chat Completions,即
/v1/chat/completions。 - 验证状态:已核对官方文档:Cline OpenAI Compatible 配置,其中 Base URL、API Key、Model ID 三项与上面一致;我们没有运行过 Cline,它具体请求哪个路径没有实测。
- 限制:官方文档提示 Base URL 不能是
https://api.openai.com/v1,模型 ID 各服务商不同;上下文窗口、最大输出、是否支持工具调用等是可选的「Model Configuration」,需要按平台模型的实际能力自己填。
Continue
- 做什么:VS Code / JetBrains 的编程助手与 CLI。
- 需要填:
config.yaml里models的一项:provider: openai,apiBase: https://api.modelsite.ai/v1,apiKey= Key,model= 平台模型 ID。 - 对应端点:
provider: openai默认走 Chat Completions,即/v1/chat/completions。 - 验证状态:已核对官方文档:Continue OpenAI provider,其中 OpenAI 兼容服务改
apiBase的示例与上面一致;我们没有运行过 Continue。 - 限制:官方文档说明 Continue 对 o 系列和 gpt-5 模型默认走
/responses,可用useResponsesApi: false关闭;平台模型 ID 不属于这两类,我们没有验证它对其他模型名的路径选择。
models:
- name: glm-5.3-flash
provider: openai
model: glm-5.3-flash
apiBase: https://api.modelsite.ai/v1
apiKey: sk-ms-xxxxxxxx聊天客户端
Cherry Studio
- 做什么:桌面聊天客户端,在「自定义服务商」里接入 OpenAI 兼容端点。
- 需要填:提供商类型 =
OpenAI;API 地址 =https://api.modelsite.ai(客户端自动补/v1/chat/completions),或https://api.modelsite.ai/v1/chat/completions#;API 密钥 = Key;模型 = 手动添加模型列表里的模型 ID。 - 对应端点:
/v1/chat/completions。 - 验证状态:已核对官方文档:Cherry Studio 服务商配置,其中「填根地址会自动补
/v1/chat/completions」「以#结尾则只用你填的地址」两条与上面一致;我们没有在客户端里实机点过。
Open WebUI
- 做什么:自托管的网页聊天界面,在「连接」里添加 OpenAI 兼容服务。
- 需要填:设置 > 管理员 > 连接 > 添加连接:URL =
https://api.modelsite.ai/v1;API Key = Key;模型 ID 白名单按需填。 - 对应端点:
/v1/chat/completions;「验证连接」会请求GET /v1/models。 - 验证状态:已核对官方文档:Open WebUI 的 OpenAI 兼容服务商页,其中字段与上面一致;我们没有运行过 Open WebUI。平台的
GET /v1/models由网关直接返回(见网关路由代码),需要带Authorization: Bearer。 - 限制:官方文档说明保存连接时不会自动测试,「验证连接」失败不等于聊天不可用;如果
/models返回的列表不符合预期,可以在模型 ID 白名单里手动填。
工作流平台
暂无收录条目:Dify、n8n 等没有取到官方文档里自定义 OpenAI 兼容端点的配置页,也没有实测。
未收录的工具
下面的工具没有收录,原因是缺少依据,不代表它们不能用:
- Cursor:官方文档站没取到「覆盖 OpenAI Base URL」那一页,目前只有第三方网关文档和论坛帖子,其中提到该功能只覆盖对话面板、需要付费计划、与 Cursor 自带模型互相影响,这些我们都没有验证。
- Chatbox、LobeChat、Roo Code、Kilo Code、GitHub Copilot、Gemini CLI、Qwen Code、Goose、Zed 等:没有查到官方文档里的配置项,也没有实测。
- Dify、n8n、Flowise 等工作流平台:同上。
其中凡是支持「OpenAI 兼容服务商 + 自定义 Base URL」的,可参考上面 Cline、Continue、OpenCode 的字段:Base URL 填 https://api.modelsite.ai/v1,模型填平台模型 ID;但这只是类比,不是验证过的结论。
常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
OpenAI SDK 返回 404 page not found | base_url 漏了 /v1,SDK 请求的是 /chat/completions | 改成 https://api.modelsite.ai/v1 |
Anthropic SDK 返回 404 | base_url 多写了 /v1,SDK 拼出 /v1/v1/messages,平台没有这个路由 | 改成 https://api.modelsite.ai(@ai-sdk/anthropic 例外,要带 /v1) |
401,missing or invalid authorization header | Anthropic 协议的客户端用了 api_key / apiKey / ANTHROPIC_API_KEY,Key 在 x-api-key 头里,平台不读 | 改用 auth_token / authToken / ANTHROPIC_AUTH_TOKEN |
401,invalid key format | Key 不以 sk-ms- 或 sk-relay- 开头,或长度不足 20 | 回控制台复制完整 Key |
401,invalid API key | Key 已撤销、过期或复制不全 | 在控制台检查 Key 状态与有效期 |
| 报缺少 API Key | 以为 SDK 会读 MODELSITE_API_KEY | 显式把它传给 api_key / auth_token,或改用工具自己的环境变量名 |
Codex 报 Missing environment variable | env_key 指向的环境变量没有设置 | 先 export MODELSITE_API_KEY=... 再启动 Codex |
| 模型不存在 | 用了上游官方模型名(如 DeepSeek 官方的 deepseek-flash) | 使用平台模型 ID,见 模型列表 |
测试方法
「已用桩服务实测请求」的做法:在隔离目录安装工具并使用独立的 HOME 与配置目录,让它请求监听在 127.0.0.1 的桩服务,桩服务记录路径、鉴权头和请求体字段后返回固定的最小响应。过程中没有使用真实 Key,也没有调用任何付费 API。404 与 401 的响应来自对 api.modelsite.ai 的无 Key 请求。