四个知识库应用,同一个问题:把聊天模型调用改走 Router One 之后,到底变了什么?应用内部几乎没变。RAGFlow 仍用 DeepDoc 解析文档、基于切分好的知识库作答,MaxKB 仍用来搭知识库助手和智能体工作流,FastGPT 仍运行知识库工作流,并通过内置的 AI Proxy 连接模型,AnythingLLM 仍在桌面版或容器里基于你上传的文档聊天。解析、切分、Embedding、Rerank、向量库、检索和 Agent 都留在应用里。变的是底下那次聊天请求:一把 sk- Key,/models 里的精确模型 ID,以及每次模型调用在控制台 → 日志里的一条 Trace,含模型、tokens、费用、延迟、状态和 request_id。回答时,到达网关的只有拼好的提示词,检索到的切片已经在里面;解析、提问阶段的附加选项和后台功能会把切片文本、问题或聊天记录作为单独的请求发出(见下文「会花钱的隐藏模型调用」)。四个应用都可以自部署;Router One 在中国大陆可以直连,部署在国内服务器上也不需要配 VPN。
一句话结论。RAGFlow:一个 OpenAI-API-Compatible 提供商实例,「基础 URL」填 https://api.router.one/v1,每个目录 ID 一行模型记录,「最大 Token 数」填模型的上下文窗口。MaxKB:OpenAI 供应商,目录 ID 填在「基础模型」里,不是「模型名称」里。FastGPT:在 AI Proxy 里建一个 OpenAI 协议渠道,再加一条「模型配置」,模型ID 就是精确的目录 ID。AnythingLLM:Generic OpenAI provider,Base URL 带上 /v1,上下文窗口要自己填。四个应用里,Embedding 模型都留在别的供应商或本地模型上。下文内容于 2026-09-23 按 RAGFlow v0.27.2、MaxKB v2.10.6-lts、FastGPT V4.17.0 和 AnythingLLM v1.16.1 核对。
对照表
| 工具 | 运行位置 | 带 /v1 的地址填在哪 | 实际协议 | 模型 ID 怎么填 | 留在工具侧的部分 |
|---|---|---|---|---|---|
| RAGFlow | x86 主机上的 Docker Compose(4 核以上、16 GB 内存、50 GB 磁盘);Web 界面在 80 端口 | 「用户设置」→「模型提供商」→ OpenAI-API-Compatible 实例:「基础 URL」 | Chat Completions,经官方 openai Python SDK 发出 | 「模型列表」(来自 GET /v1/models,所有 ID 都标成 Chat),或「添加自定义模型」手填 | DeepDoc 解析与切分;Embedding、Rerank、ASR、TTS 默认模型;文档引擎(默认 Elasticsearch,也可通过 DOC_ENGINE 换成其他引擎);聊天助手、搜索、Agent 画布 |
| MaxKB | Docker(1panel/maxkb);Web 界面在 http://your_server_ip:8080 | 「模型」→ OpenAI →「添加模型」:API URL(文档里也叫「API 域名」) | Chat Completions;ID 含 codex 时改走 Responses | 「基础模型」是可输入的下拉框,手填 ID;「模型名称」只是标签 | 知识库及其向量模型;基于 PostgreSQL + pgvector 的检索;工具;工作流执行 |
| FastGPT | 用官方 Docker Compose 模板自部署;从 V4.17.0 起 AI Proxy 是必需服务 | 管理员 →「模型提供商」→「模型渠道」→「新增渠道」:代理地址,协议类型选 OpenAI | Chat Completions;Anthropic 类型的渠道会改发 /messages | 「模型配置」→「新增模型」:手填模型ID,再在渠道的「模型」里选中 | 知识库,其索引和重排模型放在另一个渠道;工作流节点;AI Proxy 的「调用日志」;FastGPT 积分 |
| AnythingLLM | 桌面版(macOS、Windows、Linux)或 Docker;http://localhost:3001 | Settings → AI Providers → LLM → Generic OpenAI:Base URL,或 .env 里的 GENERIC_OPEN_AI_BASE_PATH | Chat Completions,经官方 openai Node SDK 发出 | Selected Model:从 /models 加载的下拉框,请求失败时变成文本框 | embedder(内置 all-MiniLM-L6-v2)、LanceDB、本地运行的 reranker、@agent 技能、工作区 |
四个应用发的都是 POST /v1/chat/completions,这个端点服务目录里的所有聊天模型(GPT、Claude、Gemini、Grok 和 DeepSeek 系列),所以 anthropic/claude-sonnet-5 连同前缀在四个应用里都能用,也没有一个会把 ID 里的斜杠拆掉。有一个例外:MaxKB v2.10.6-lts 自带的 langchain-openai 1.3.2 会把 ID 中含 codex 的模型(例如 codex-auto-review)改发到 POST /v1/responses,所以在 MaxKB 里用这类 ID 前,先确认模型详情页列出了 /v1/responses。有两种配置会失败:一是被 RAGFlow「模型列表」标成 Chat、发到 Chat Completions 的生图模型 ID,这个端点不提供生图 ID;二是在用 Anthropic 协议类型建的 FastGPT 渠道上配 GPT、Gemini 或 Grok 的 ID:这类渠道发到 /v1/messages,而网关只为它列出的 Claude 系列和 DeepSeek ID 提供这个端点,所以会收到消息里写着 must be called via 的 HTTP 400。除了 MaxKB 的 codex 规则,和低代码搭建工具横评里的 n8n 不同,本文这几种配置都不会发 /v1/responses。最后一列是边界:里面没有一项跑在网关上。
RAGFlow:一个 OpenAI-API-Compatible 实例,每个模型一行
从 v0.27.0 起,RAGFlow 的模型设置改为按提供商实例管理。打开「用户设置」→「模型提供商」,在「可选模型」里选 OpenAI-API-Compatible,填写新实例卡片:
# RAGFlow v0.27.2 → 用户设置 → 模型提供商 → OpenAI-API-Compatible
实例名称(Instance name): router-one # 除了 "default" 都可以
基础 URL(Base URL): https://api.router.one/v1
API Key: sk-your-router-one-key
# 模型 → 模型列表(List models),或点 + → 添加自定义模型
模型名称(Model name): <exact-model-id-from-/models>
模型类型(Model type): Chat # 支持图片输入时才加选 VLM
最大 Token 数(Max tokens): <context-window-from-the-model-page>
Tool call: 仅当模型详情页列出工具调用时打开
# 保存 → 设置默认模型 → LLM:选这个模型
v0.27.0 至 v0.27.2 会补上缺失的 /v1,更早的版本不会,所以无论哪个版本都填带 /v1 的形式,也不要把完整的 /chat/completions 路径贴进去。「模型列表」会把整份目录预先加成 Chat 类型,生图模型 ID 也不例外;用不到的行要移除。「最大 Token 数」是 RAGFlow 自己给历史消息和检索切片留的上下文预算,不是生成上限:它不会出现在请求里,填 0 时回退为 8192。
最常见的第一个报错。 保存时报 Fail to access model(OpenAI-API-Compatible/…).No valid response received,这是 RAGFlow 对测试对话的笼统结论。网关的真实答复在 docker logs -f docker-ragflow-cpu-1 里包含 async base giving up 的那一行:401 AUTH_INVALID_API_KEY 是 Key 的问题,404 not_found 是路径的问题,被标成 Chat 的生图模型 ID 报错,则说明它不是聊天模型。指南:RAGFlow 接入 Router One。
MaxKB:OpenAI 供应商,ID 填在「基础模型」里
MaxKB 的模型表单有两个名称,只有一个会到达网关。「模型名称」是显示标签;「基础模型」才是作为 model 发出的值。「基础模型」是带预设选项的可输入下拉框,不是从 Router One 拉取的列表,所以要手动输入完整的目录 ID,并确认为新选项。
# MaxKB v2.10.6-lts → 模型 → OpenAI → 添加模型
模型名称(Model name): Router One chat # 只是显示标签
模型类型(Model type): 大语言模型(LLM)
基础模型(Base model): <exact-model-id-from-/models> # 手动输入,原样发送
API URL: https://api.router.one/v1 # 文档里也叫「API 域名」
API Key: sk-your-router-one-key
即使 ID 以 anthropic/ 或 google/ 开头,也选 OpenAI 供应商:它选的是兼容协议,不是模型系列。API URL 后面不要再加 /chat/completions。
最常见的第一个报错。 保存时 MaxKB 会用一句问候真实调用模型做验证,OpenAI 大语言模型的参数表单默认带 temperature 0.7 和最大输出 8192 tokens,这是 MaxKB 自己的默认值。400 里点名 temperature 或输出 token 参数,是模型拒绝了这个参数:到「高级设置」或「模型参数设置」里调整或删掉它,换 Key 或改 base URL 都没用。指南:MaxKB 接入 Router One。
FastGPT:AI Proxy 里的一个 OpenAI 协议渠道
从 V4.17.0 起,FastGPT 必须部署内置的 AI Proxy,模型走它的渠道(单个模型的自定义请求地址仍可用,但已标记即将弃用),旧的 OPENAI_BASE_URL 和 CHAT_API_KEY 变量已不再生效。AIPROXY_API_ENDPOINT 让 FastGPT 指向 AI Proxy,而不是 Router One;Router One 的 Key 只填进渠道表单:
# FastGPT V4.17.0 → 管理员 → 模型提供商 → 模型渠道 → 新增渠道
协议类型(Protocol Type): OpenAI
代理地址(Base url): https://api.router.one/v1 # 英文文档叫 Proxy URL
API 密钥(API key): sk-your-router-one-key
模型(Model): <exact-model-id-from-/models>
模型映射(Model Mapping): 留空(两边 ID 一致时)
# 模型配置 → 新增模型 → 模型ID:同一个精确 ID
# 保存 → 模型测试 → 批量测试 N 个模型
渠道的「模型」下拉框只列「模型配置」里已有的模型,所以先在那里登记目录 ID;它的模型ID 就是 FastGPT 请求体里 model 字段的值。代理地址要保留 /v1:相反的口径属于 one-api 和 new-api,它们的 OpenAI 渠道类型会自己拼完整的 /v1/chat/completions(见 API 中转站)。只有模型详情页列出工具调用时,才在模型配置里打开「支持工具调用」:打开后工具调用节点发送原生 tools,关闭时改为在提示词里描述工具;V4.17.0 的问题分类和内容提取节点无论开关与否都只发普通提示词。
最常见的第一个报错。 渠道测试通过,应用里调用却报 400 或 404:模型启用时的拼写和目录 ID 不一致,或者「模型映射」指向了已下架的 ID。先看 AI Proxy「调用日志」里的请求地址和这次调用返回的错误消息:模型 ID 或端点不对导致的 400 / 404 在调用任何模型之前就被拒绝,控制台 → 日志里没有记录。指南:FastGPT 接入 Router One。
AnythingLLM:Generic OpenAI provider,上下文窗口自己填
AnythingLLM 桌面版只有设置表单;Docker 镜像还会在启动时从挂载到 /app/server/.env 的文件里读取同样这几个键。
# AnythingLLM v1.16.1 → Settings → AI Providers → LLM → Generic OpenAI
#(Docker:右侧是对应的 .env 键)
Base URL: https://api.router.one/v1 # GENERIC_OPEN_AI_BASE_PATH
API Key: sk-your-router-one-key # GENERIC_OPEN_AI_API_KEY
Selected Model: <exact-model-id-from-/models> # GENERIC_OPEN_AI_MODEL_PREF
Model context window: <context-window-from-the-model-page> # GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT
Max Tokens: 1024 # GENERIC_OPEN_AI_MAX_TOKENS
# 仅 .env:LLM_PROVIDER='generic-openai'
AnythingLLM 从不向网关读取上下文窗口:表单里这一栏必填;Docker 的 .env 没写 GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT 时,它按 4096 tokens 分配预算。Max Tokens 是每次请求携带的 max_tokens(默认 1024;AnythingLLM v1.17.0 起填 0 则不发送),回答经常说到一半就停,就把它调大。工作区可以在 Workspace Settings → Chat Settings 里换模型,但不能换 Key:所有工作区都记在系统级的那一把 Key 上。
最常见的第一个报错。 404 not_found,消息里说 base URL 需要以 /v1 结尾。表单占位符显示的是不带路径的主机名,而你填什么它就用什么。指南:AnythingLLM 接入 Router One。
Embedding 和 Rerank 留在别的供应商或本地模型上
在这几个应用里,Router One 只能填聊天模型这一格:没有 /v1/embeddings,也没有 rerank 端点,所以会出现模型测试通过、第一份文档却卡在 Embedding 这一步的情况。每个应用都把这些模型单独设置:
- RAGFlow 除了 LLM 还要求一个默认 Embedding 模型,而从 v0.22.0 起它的镜像里一个都没有:可以用 Compose 文件里可选的 TEI 服务(
docker/.env里的tei-cpu或tei-gpuprofile)、Ollama 或 Xinference 上的模型(例如 bge-m3),或另一家供应商。在 Router One 实例里,不要给任何模型选 Embedding 或 Rerank 类型,这两种类型会请求/v1/embeddings和/v1/rerank。 - MaxKB 由每个知识库单独选择向量模型。OpenAI 供应商表单里有「向量模型」类型,但 Router One 并没有实现这个端点。
- FastGPT 至少要有一个语言模型和一个索引模型才能给知识库建索引。Router One 渠道里只放语言模型;索引、重排、语音合成、语音识别模型来自另一家供应商的渠道。
- AnythingLLM 默认保留内置 embedder(all-MiniLM-L6-v2,在 CPU 上运行、不调用外部 API),除非你在 Settings → AI Providers → Embedder 里另选供应商。它的模型卡只标注了英文,中文或其他非英文资料换一个 embedder 检索效果可能更好;Generic OpenAI 这个 embedder 选项和
EMBEDDING_BASE_PATH都不能指向 Router One。向量存进内置的 LanceDB,v1.16.1 源码里唯一的 reranker 在应用内部运行。
建库之前先定好 Embedding 模型。RAGFlow 知识库一旦有了文本块,更换 Embedding 模型时会抽样重新编码做兼容性校验,新旧向量的平均 cosine 相似度 ≥ 0.9 才允许切换,否则必须先删除全部文本块。AnythingLLM 换 embedder 则意味着所有上传内容都要重新嵌入。
会花钱的隐藏模型调用
知识库应用发出的聊天请求,远多于用户提出的问题。下面每一项都是同一把 Key 上的真实请求,在控制台 → 日志里各占一行,只要模型作答就会计费:
- 保存和测试按钮。 RAGFlow 点「保存」和每一行的验证按钮时,都会流式发一句测试用的
Hi;「验证全部模型」会逐个测试列表里的模型。MaxKB 保存模型时会用一句问候调用它。FastGPT 的「模型测试」对每个模型真实发一次请求。 - 解析与导入。 RAGFlow 每打开「自动关键词提取」「自动问题提取」「自动元数据」中的一项,就会对每个切片调用一次默认 LLM:2,000 个切片、开了两项,就是大约 4,000 次请求;知识编译默认允许单个任务最多 20 个并发 LLM 调用。MaxKB 的「生成问题」对每个分段发一次请求,可以针对一份文档或整个知识库,用的是在对话框里选的模型。FastGPT 的「问答对提取」模式对每个排队的切片向知识库的「文本理解模型」发一次请求,「自动生成补充索引」用的也是这个模型。
- 每一次提问。 RAGFlow 聊天助手里,「多轮对话优化」(从第二个问题开始)、「关键词分析」和「跨语言搜索」每开一项,每轮就多一次请求;「思考」选 Low 以上的档位(Medium、High 或 Ultra)时会跑 Agentic 检索循环,每次回答还可能多出好几次请求。MaxKB 的「问题优化」每轮多一次,根据最近三轮对话改写问题。FastGPT 的「问题优化」给每次使用它的知识库搜索多加一次,「猜你想问」在回答之后再发一次,写出三个追问;设置了「对话标题模型」时,每个新对话还多一次。
- Agent 与重试。 带工具的 RAGFlow Agent 组件,工具循环最多发「最大反思轮数」+1 次模型调用,达到上限时再补一次收尾调用(画布上新建的 Agent 默认 1,源码在未设置时回退为 5);失败的调用按组件自己的「最大重试轮数」重试(新建组件默认 3)。「问题分类」(Categorize)组件同样调用模型,聊天助手和解析任务则对限流和服务端错误最多重试
LLM_MAX_RETRIES次(默认 5)。FastGPT 的工具调用、问题分类、内容提取节点各算一次请求,AI Proxy 还会重试失败的请求(官方模板里是RETRY_TIMES: 3)。MaxKB 的 AI 对话节点会在最终回答之外增加调用。AnythingLLM 的每一步 @agent 都是一次请求,它的文档摘要每个分段发一次,超过第三段时会先问你是否继续。 - 后台任务。 AnythingLLM 打开 Enable Personalization 之后,Automatic Memories(此后默认开启)默认每三小时运行一次。对每个有五条以上新对话、且已空闲 20 分钟的用户与工作区,先跑一次 Observer,Observer 提出候选记忆时再跑一次 Reflector;每一次都是最多三轮的 Agent 运行,用的是工作区聊天模型(没有则用 Agent 模型,再没有则用系统 LLM)。Scheduled Jobs 按 cron 计划运行 Agent 提示词,这时没有人在旁边看着,而且工具调用会被自动批准,文档摘要超过第三段时也不会停下来询问。
这些开关都不是消费上限。真正的上限是 Key 上的 maxSpend:触及之后,这把 Key 上需要钱包付费的请求由网关返回 HTTP 402(见错误码),从钱包扣的钱不会超过这个上限,你的其他 Key 也照常可用。在控制台 → API 密钥里给每套部署单独建一把 Key;应用能按连接保存 Key 的地方还可以再拆细:RAGFlow 再建一个 OpenAI-API-Compatible 实例、配另一把 Key,就能把解析和聊天的花费分开;MaxKB 每条模型记录都有自己的 API Key,所以「生成问题」可以用第二把 Key 的另一条记录来跑。FastGPT 里决定走哪个渠道的是模型 ID 而不是应用,所以第二个配另一把 Key 的 Router One 渠道,只能把它所服务的那些模型 ID 的花费分开,例如知识库的文本理解模型(同一个 ID 不要同时放进两个渠道,否则 AI Proxy 会在两者之间负载均衡)。AnythingLLM 的 Key 放在所有工作区共用的系统设置里,只能按实例拆分。批量解析也最容易撞上限流:网关返回的 429 如果带 RATE_LIMIT_EXCEEDED 或 TOKEN_QUOTA_EXCEEDED,那是速率限制,不是消费上限;这些限制从平台默认值起步,可发邮件到 support@router.one 申请提高。
在控制台 → 日志里核对
应用自己的计数不是账单。RAGFlow 在数据块不带 usage 时会在本地估算流式 tokens,MaxKB 在响应不带 usage 时改用自己的 token 估算(它的流式调用不会请求 usage),FastGPT 用积分给你的用户在内部计量,AnythingLLM 在应用内自行计算 token 指标,除非设置 GENERIC_OPEN_AI_REPORT_USAGE=true 要求在流中返回 usage。控制台 → 日志才是逐请求的费用,所以在那里核账(见成本追踪):导入一份小文档、问一个问题,只打开打算长期保留的选项;在日志里按这段时间窗和精确的模型 ID 过滤;再把这些行和保存测试、每个解析选项对每个切片的请求、提问阶段的附加请求以及最终回答一一对上。报障时保留失败那一行的 request_id。
少了某一行,先别断定请求没到网关。尚待定价的记录可能暂时不展示;应用的服务端日志(FastGPT 看 AI Proxy 的「调用日志」)会显示它实际收到的状态;FastGPT 里同一个模型 ID 如果配在两个渠道里,这次调用可能被另一个渠道接走了。被应用中途断开的流式请求会记为 HTTP 499 client_cancelled;从 1.16.0 起,在 AnythingLLM 里停止回答会真正终止推理,而不是让它在后台继续跑。路径、Key 和 DNS 的排查见连接排查。
怎么选
四个应用通过同一个端点到达同一份模型目录,所以看的是模型调用周围的东西。
- 难点在文档解析,选 RAGFlow:DeepDoc、按知识库设置的解析选项和知识编译模板,代价是一套需要 16 GB 内存的 Docker 服务。
- 想用一个容器同时提供知识库助手和智能体工作流,模型表单也短(一个标签、一个基础模型、一个 API URL 和一把 Key),选 MaxKB。
- 应用是带问题分类、内容提取和工具调用节点的工作流,还希望所有模型供应商前面都有 AI Proxy 的渠道和调用日志,选 FastGPT。
- 个人或小团队想在桌面或单个容器里做文档问答,embedder 和向量库都内置,英文资料场景下唯一要接的模型服务就是聊天模型,选 AnythingLLM。
- 知识库只是更大的应用搭建平台里的一部分,选 Dify:见 Dify 接入 Router One 和 Dify、Flowise、Langflow、n8n 横评。
全部接入指南在 /integrations;Copilot for Obsidian 的配置见 Copilot for Obsidian 接入指南。
常见问题
RAGFlow、MaxKB、FastGPT、AnythingLLM 该选哪个? 四个应用通过同一个端点到达同一份模型目录,所以看的是模型调用周围的东西。难点在文档解析选 RAGFlow;想用一个容器提供知识库助手和智能体工作流、模型表单也短,选 MaxKB;应用是工作流、又希望所有模型供应商前面都有 AI Proxy 的渠道,选 FastGPT;想在桌面或单个容器里做文档问答、embedder 和向量库都内置,选 AnythingLLM。
RAGFlow、MaxKB、FastGPT、AnythingLLM 能用 Router One 做 Embedding 或 Rerank 吗? 不能。Router One 在 /v1/chat/completions 上提供聊天模型,没有 embeddings 和 rerank 端点。这些模型要放在别的供应商或本地模型上,例如 RAGFlow 可选的 TEI 服务、Ollama 上的模型或 AnythingLLM 的内置 embedder,只把 LLM 这个位置指向网关。
这些知识库应用里的 base URL 要不要带 /v1?
四个都要带:https://api.router.one/v1。它们都会在你填的地址后面拼 /chat/completions。RAGFlow v0.27.0 至 v0.27.2 会补上缺失的 /v1,更早的版本不会;FastGPT 的渠道也要带 /v1,尽管 one-api 和 new-api 的 OpenAI 渠道类型不带 /v1。不要贴完整的 /chat/completions 地址。
Claude 或 Gemini 模型要换别的供应商类型吗? 不用。RAGFlow 的 OpenAI-API-Compatible、MaxKB 的 OpenAI 供应商、FastGPT 的 OpenAI 协议类型和 AnythingLLM 的 Generic OpenAI 发的都是 Chat Completions,这个端点服务目录里的所有聊天模型。填带前缀的精确 ID,例如 anthropic/claude-sonnet-5;FastGPT 的 Router One 渠道不要用 Anthropic 协议类型。
没人聊天,知识库应用为什么还在消耗 tokens? 解析和后台任务同样会调用聊天模型:RAGFlow 的「自动关键词提取」「自动问题提取」「自动元数据」每个切片各一次,MaxKB 的「生成问题」每个分段一次,FastGPT 的「问答对提取」每个排队切片一次,AnythingLLM 的 Automatic Memories 和 Scheduled Jobs 定时运行。保存和测试按钮也会发真实请求,每一次都是控制台 → 日志里的一行。
怎样给一个知识库应用设消费上限? 为这套部署单独创建一把 Router One Key,并给它设置 maxSpend。触及上限后,网关只对这把 Key 上需要钱包付费的请求返回 HTTP 402,失控的解析任务就停在那里,从钱包扣的钱不会超过这个上限,你的其他 Key 也照常可用。在 RAGFlow 里,再建一个提供商实例、配第二把 Key,就能把解析和聊天的花费分开。
模型测试通过了,导入文档却失败,为什么? 测试只证明了聊天模型可用。建索引需要 Embedding 模型,而 Router One 不提供这个端点,所以检查 RAGFlow 的默认 Embedding 模型、MaxKB 知识库的向量模型、FastGPT 知识库的索引模型,或 AnythingLLM 的 Settings → AI Providers → Embedder,是否指向了别的供应商或本地模型。