一条 LibreChat 自定义 端点,背靠 整个 模型 目录
LibreChat 是开源、可自托管的 ChatGPT 风格聊天界面,任何 OpenAI 兼容 API 都能在 librechat.yaml 里加为自定义端点。一条指向 Router One 的配置,就能让实例上所有用户在端点菜单里用到目录中的 Claude、GPT、Gemini、Grok 与 DeepSeek 聊天模型;每一轮对话都以 POST /v1/chat/completions 发到网关、走配置的 Key 计费,共享部署的账单可以在控制台 → 日志里逐条对清。网关在大陆可直连,部署在国内服务器上也不用代理,支付宝或银行卡即可充值。配置本身只有几行 YAML,真正决定花费与稳定性的是:模型列表怎么加载、会话标题由哪个模型生成、用户是否自带 Key,以及哪些请求参数会把对话改发到别的端点。从 v0.8.7 起,自定义端点还可以声明 provider: anthropic,把 Claude ID 发到 /v1/messages。按 LibreChat v0.8.7(2026 年 6 月 24 日发布)与 v0.8.8-rc4(2026 年 9 月 23 日)的文档与源码核对(2026-09-29)。
挂载 librechat.yaml,把 Key 放进 .env
LibreChat 从项目根目录的 librechat.yaml 读取配置,CONFIG_PATH 环境变量可以指向别的路径。用 Docker 部署时,LibreChat 文档要求把 docker-compose.override.yml.example 复制为 docker-compose.override.yml,并启用下面的挂载,把 ./librechat.yaml 挂到 api 容器的 /app/librechat.yaml。Key 写进 .env 的 ROUTER_ONE_API_KEY,在 YAML 里用 ${ROUTER_ONE_API_KEY} 引用,这样 Key 不会出现在配置文件和版本库里。请为这个实例单独创建一把 Router One Key 并设置 maxSpend 消费上限:所有用户的对话、每一次标题请求和每一步 Agent 调用都记在这把 Key 上,这个上限就是整个部署的硬性止损。LibreChat 只在启动时读取这个文件,每次修改后用 docker compose down && docker compose up -d 重启生效;文件校验不通过时它会报错退出,所以重启后先看 api 容器的日志。
services:
api:
volumes:
- type: bind
source: ./librechat.yaml
target: /app/librechat.yaml把 LibreChat 配置到 Router One base URL
在 endpoints.custom 下新增一条,已有的其他端点保持不动。name 是用户在端点菜单里看到的名称,apiKey 引用 .env 里的变量。baseURL 填 https://api.router.one/v1:除非设置了 directEndpoint: true,LibreChat 会自己拼上 /chat/completions,所以不要填完整的端点地址。models.fetch 设为 true 时,LibreChat 会带着 Key 请求 GET {baseURL}/models 拉取列表;models.default 是请求失败时显示的兜底列表,而 fetch: true 与非空的 default 列表至少要有一个,LibreChat 才接受这条配置。titleConvo 打开会话标题,titleModel 指定生成标题的模型。示例里给标题用的是比对话模型便宜的目录 ID,原因见下面的标题一节:
# librechat.yaml — add under your existing endpoints: key
endpoints:
custom:
- name: "Router One"
apiKey: "${ROUTER_ONE_API_KEY}"
baseURL: "https://api.router.one/v1"
models:
default: ["anthropic/claude-sonnet-5", "openai/gpt-5.6-sol", "deepseek-v4-flash"]
fetch: true
titleConvo: true
titleModel: "anthropic/claude-haiku-4.5"
modelDisplayLabel: "Router One"
# .env
ROUTER_ONE_API_KEY=sk-your-router-one-key加载 模型 列表:自动 拉取,还是 固定的 default 列表
fetch: true 时,LibreChat 会用端点的 Key 请求 GET https://api.router.one/v1/models。Router One 只在带有效 Key 时才响应这个请求,返回的是目录中的全部 ID,也包括图像生成模型,而它们不能处理对话轮次。共享实例上,精选的菜单通常更合适:设置 fetch: false,在 default 里只列出希望大家使用的聊天模型 ID,从 /models 原样复制、保留厂商前缀,例如 anthropic/claude-sonnet-5、openai/gpt-5.6-sol、google/gemini-3.8-flash、grok-4.7 或 deepseek-v4-flash。这样用户只能在你列出的模型里选,LibreChat 也完全不会请求模型列表;目录以后新增的模型,要加进列表后才会出现。如果希望用户不改 librechat.yaml 就能看到目录里的新模型,就保留 fetch: true。两种方式下,列表加载不出来时,用户看到的都是 default。
标题 请求,以及 其他 没人手动 发起的 请求
titleConvo: true 时,每个新会话都会多发一次请求,让模型生成一个简短标题。默认情况下,LibreChat 在第一条消息发出时立即启动它,与回答并行(titleTiming: immediate)。执行它的模型由 titleModel 决定,默认值 gpt-3.5-turbo 不在 Router One 的目录里,所以请显式设置 titleModel,不要依赖默认值。current_model 直接复用用户选中的模型,省事,但每个标题都按该模型的价格计费;换成 anthropic/claude-haiku-4.5 或 deepseek-v4-flash 这类更便宜的目录聊天模型,标题的花费就很低;titleConvo: false 则关闭标题。在控制台 → 日志里,标题请求是一条单独的短请求,挂在标题模型的 ID 下,就在触发它的那一轮对话旁边。你在 librechat.yaml 其他地方启用的、会自己调用模型的功能(例如记忆),使用这个端点时也按同样方式计费。
让每个 用户自带 Key
把 apiKey 设为 user_provided,LibreChat 会在用户第一次选择该端点时在界面里向他索取 Key,并按其文档加密保存。之后每个人的请求都记在自己的 Router One Key 上,受自己的 maxSpend 上限约束,部署方的 Key 完全不参与;在控制台 → 日志里按 API Key 筛选,就能看到某一个用户的请求。fetch: true 时,LibreChat 会用该用户保存的 Key 加载模型列表(按 v0.8.7 与 v0.8.8-rc4 源码),还没填 Key 的用户看到的是 default 列表。baseURL 也可以设为 user_provided,但这时 LibreChat 不会把端点里配置的请求头转发到用户填写的地址;Router One 不需要额外的请求头。
让 Claude 走 /v1/messages:再加 一个 provider: anthropic 端点
上面的端点已经能通过 Chat Completions 使用 Claude ID。从 v0.8.7 起,自定义端点也可以设置 provider: anthropic,改用 LibreChat 原生的 Anthropic 客户端和 Anthropic Messages API。这条配置的 baseURL 要填主机根地址 https://api.router.one,因为客户端会自己拼上 /v1/messages;Key 复用同一个变量,客户端以 x-api-key 请求头发送,Router One 接受这种写法。Router One 在 /v1/messages 上服务 Claude 系列与 DeepSeek V4 的 ID,其他聊天模型 ID 发到这里会收到 HTTP 400 must be called via /v1/chat/completions。按 LibreChat 自己为这种 provider 给出的示例,把 ID 列在 default 里并设置 fetch: false,再给这条端点起一个不同的名称,方便用户区分两个端点。无论走哪个端点,对话在控制台 → 日志里都记在同一个目录 ID 下。
# 为 Claude ID 走 /v1/messages 再加一条自定义端点(LibreChat v0.8.7+)
- name: "Router One (Claude)"
provider: "anthropic"
apiKey: "${ROUTER_ONE_API_KEY}"
baseURL: "https://api.router.one"
models:
default: ["anthropic/claude-sonnet-5", "anthropic/claude-haiku-4.5"]
fetch: false
titleConvo: true
titleModel: "anthropic/claude-haiku-4.5"让端点 保持 Chat Completions:web_search 与 useResponsesApi
自定义端点发送的是 Chat Completions。按 v0.8.8-rc4 源码,LibreChat 只会对 OpenAI 官方地址自动改用 Responses API,所以只要 addParams 里没有另外指定,Router One 端点就一直走 /v1/chat/completions。有两个 addParams 键会改变这一点:web_search: true 会把端点切到 Responses API 并附加托管的 web_search 工具,Router One 会接受并计量这个工具字段,但自己不执行工具;useResponsesApi: true 则直接切换。在 /v1/responses 上,Claude 系列 ID 会收到 HTTP 400 model '<id>' must be called via /v1/messages or /v1/chat/completions,Gemini 的 ID 在这里同样不提供,所以这两个键都不要加。dropParams 可以去掉 LibreChat 默认发送的参数,例如 stop、user、frequency_penalty 或 presence_penalty;当控制台 → 日志里的 400 错误点名其中某个参数时再用它。
Agent、图片上传与 文件 检索
LibreChat 的 Agent 可以使用自定义端点的模型,而 Agent 依靠工具调用工作,所以请选详情页标明支持工具调用的 ID。如果网关返回 HTTP 400,错误信息含 has no chat candidate that supports requested capabilities: tool_calling,说明所选 ID 不支持工具调用,请换模型。上传的图片会作为图片输入发给模型,所以要选详情页标明支持图片输入的 ID:deepseek-v4-flash 这类只支持文本的 ID 会收到 HTTP 400,错误信息含 has no chat candidate that supports requested capabilities: vision。针对上传文档的文件检索由 LibreChat 独立的 RAG 服务完成,它需要 embeddings 模型,而 Router One 没有 embeddings 端点(POST /v1/embeddings 返回 404),所以请给这个服务配置提供 embeddings 的供应商,Router One 只负责对话。
在控制台 → 日志里 核对前几轮 对话
重启后选中 Router One 端点和一个模型,发一条简短的消息。控制台 → 日志应当在精确的目录 ID 下显示这一轮的 tokens、费用、状态、总耗时,以及产生过输出的流式请求的首字延迟(TTFT);打开 titleConvo 时,还会在标题模型的 ID 下多出一条标题请求。401 说明 Key 没有送到:检查 .env 里是否定义了 ROUTER_ONE_API_KEY,以及修改后 api 容器是否已重新创建。404 且错误信息要求 base URL 以 /v1 结尾,说明 baseURL 少了 /v1。控制台 → 日志里查不到某个请求只是线索,不能单独下结论:它可能没到达网关,也可能在调用模型之前就被拒绝(Key 校验失败的 401、余额不足或 Key 达到 maxSpend 上限的 402、Key 或账户限额触发的 429,或模型 ID、端点不对的 400 / 404),或仍在等待定价,所以也要看 api 容器的日志。LibreChat 还能按你在 tokenConfig 里填写的费率自行估算费用,这些数字只取决于你填的值,实际扣费以控制台 → 日志为准。
LibreChat 该填 哪个 模型 ID?
从 /models 页复制精确的模型 ID,保留大小写、连字符和版本后缀,不要用展示名称代替。打开该模型的详情页,核对支持的 API 端点、上下文窗口和工具调用等能力,再与 LibreChat 当前选择的 provider 和功能对应。模型出现在目录里,不等于当前客户端能调用它的所有功能。建议为每个客户端或应用单独建 API Key,并设置 maxSpend 消费上限。
LibreChat 用的是哪种 API 协议?
OpenAI 兼容描述的是接口格式,不能据此推断 Chat Completions(/v1/chat/completions)、Responses(/v1/responses)和 Anthropic Messages(/v1/messages)可以互换。先核对工具当前版本、provider 配置和实际请求路径,再查模型详情与 API 兼容性事实页。一次普通对话成功,也不能证明服务端工具、历史状态或文件编辑功能都受支持。
在请求日志里 核对 LibreChat 的调用
先在 LibreChat 发出一次简单文本请求,再到控制台 → 日志按时间、模型和 request_id 找到这条记录,核对 Token、花费、总耗时和状态码。成功后再分别验证流式输出、工具调用和多轮历史。失败时保留实际请求路径、完整错误消息及 request_id;没有对应日志时,要么请求没到达网关(客户端配置或网络问题),要么网关在调用模型之前就拒绝了它——Key 问题的 401、余额不足或 Key 达到 maxSpend 上限的 402、Key 或账户自身限额触发的 429,或模型 ID、端点不对的 400 / 404;在输出任何内容之前就失败的流式请求也可能没有日志。看客户端收到的状态码和错误消息就能区分是哪一种;先确认这一点,再判断是不是网关或上游故障。
常见 问题
models.fetch 和固定 模型 列表 怎么选?
想让目录里的模型一上线就出现,用 fetch: true:LibreChat 会带着 Key 请求 GET /v1/models,default 列表只在请求失败时兜底。拉取到的列表包含图像生成 ID,它们不能回答对话。想控制用户能看到什么,就用 fetch: false 加一份明确的 default 列表,比如从 /models 原样复制三个聊天模型 ID;用户只能在你列出的模型里选。
为什么每个新 会话 都会在 控制台 → 日志里多出 一条 请求?
那是标题请求。titleConvo: true 时,第一条消息一发出,LibreChat 就会让 titleModel 生成一个简短标题。把 titleModel 设为 anthropic/claude-haiku-4.5 这类便宜的目录聊天模型;想让对话模型自己起标题就保留 current_model;也可以设置 titleConvo: false。不要省略 titleModel:它的默认值 gpt-3.5-turbo 不在 Router One 的目录里。
能让 用户自带 Router One Key 吗?
能。把 apiKey 改成 user_provided,LibreChat 会在界面里向每位用户索取 Key,并按其文档加密保存。每个人的花费都记在自己的 Key 和钱包上,受各自的 maxSpend 上限约束,这是共享实例分账最省事的办法。fetch: true 时,模型列表会用每个用户保存的 Key 加载。
LibreChat 里的 Claude 能走 原生 Messages API 吗?
能,需要 v0.8.7 或更高版本。再加一条自定义端点:provider: anthropic,baseURL 填 https://api.router.one(主机根地址,客户端会自己拼上 /v1/messages),Key 用同一个变量,把 Claude ID 列在 default 里并设置 fetch: false。Router One 在 /v1/messages 上服务 Claude 系列与 DeepSeek V4 的 ID。Chat Completions 端点同样能用 Claude ID,所以这条端点是可选的。
为什么有 一轮 对话 发到了 /v1/responses,并返回 400?
检查 addParams。按 v0.8.8-rc4 源码,web_search: true 或 useResponsesApi: true 会把自定义端点切到 Responses API;在那里,Claude 系列 ID 会收到 HTTP 400 must be called via /v1/messages or /v1/chat/completions,Gemini 的 ID 同样不提供。删掉这两个键,端点就回到 Chat Completions,这个端点服务目录中的全部聊天模型。
LibreChat 的文件 检索能走 Router One 吗?
embeddings 部分不能。文件检索由 LibreChat 的 RAG 服务完成,它需要 embeddings 模型,而 Router One 没有 embeddings 端点。请给这个服务配置提供 embeddings 的供应商;使用检索结果的对话轮次仍然走 Router One。
本指南 对应哪个 LibreChat 版本?
LibreChat v0.8.7(2026 年 6 月 24 日发布)与 v0.8.8-rc4(2026 年 9 月 23 日),核对日期为 2026-09-29。自定义端点的 provider: anthropic 需要 v0.8.7 或更高版本。LibreChat 只在启动时读取 librechat.yaml,每次修改或升级后都要重启。
LibreChat 能通过 网关用 哪些 模型?
选用当前目录中同时支持 LibreChat 所用端点和所需功能的模型。精确 ID、当前单价与能力以 /models 及模型详情为准;不要仅按 GPT、Claude 等系列名判断兼容性。客户端能列出模型,只说明它从自身配置或 GET /v1/models 读到了这个 ID,仍需验证实际调用。
能列出 模型,但调用报 400 或 404,怎么办?
先记录实际请求路径和错误消息,再核对精确模型 ID。400 可能是参数、工具类型或模型与端点不匹配;404 可能是请求路径或资源不存在,不能直接判定模型下线。若错误提示 must be called via,按它指明的端点调整客户端 provider,或换用支持当前端点的模型。不要在所有工具里统一增删 /v1 或 /chat/completions。
中国 大陆能 直连吗?
能。网关在大陆可直连、无需 VPN,配置与全球环境完全一致。
报 401/402/403/429 怎么 排查?
先看客户端收到的响应:状态码、错误消息和 X-Request-ID 响应头。401(Key 缺失、不存在、已吊销或已过期)、402(钱包余额不足,或这把 Key 达到 maxSpend 上限)以及 Key 或账户自身限额触发的 429,都在调用任何模型之前被拒绝,不会出现在控制台 → 日志里;模型 ID 或端点写错导致的 400 / 404 也一样。401 查 Key 是否完整传入、在控制台 → API 密钥里是否仍有效;402 充值或调高这把 Key 的 maxSpend;403 请保留完整错误消息。429 请退避后重试;日志里能查到的 429 是网关重试之后上游仍返回的。保留 request_id,再按错误码速查页逐项排查。