四个知识库应用,同一个问题:把聊天模型调用改走 Router One 之后,到底变了什么?应用内部几乎没变。RAGFlow 仍用 DeepDoc 解析文档、基于切分好的知识库作答,MaxKB 仍用来搭知识库助手和智能体工作流,FastGPT 仍运行知识库工作流,并通过内置的 AI Proxy 连接模型,AnythingLLM 仍在桌面版或容器里基于你上传的文档聊天。解析、切分、Embedding、Rerank、向量库、检索和 Agent 都留在应用里。变的是底下那次聊天请求:一把 sk- Key,/models 里的精确模型 ID,以及每次模型调用在 Dashboard → Logs 里的一条 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。有两种配置会以消息里写着 must be called via 的 HTTP 400 告终:一是被 RAGFlow「模型列表」标成 Chat、发到 Chat Completions 的生图模型 ID;二是在用 Anthropic 协议类型建的 FastGPT 渠道上配 GPT、Gemini 或 Grok 的 ID,这类渠道发到 /v1/messages,而网关只为它列出的 Claude 系列和 DeepSeek ID 提供这个端点。除了 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 及以后会补上缺失的 /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 是路径的问题,400 must be called via 则是被标成 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「调用日志」里的请求地址,再到 Dashboard → Logs 看错误消息和 request_id。指南: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),回答经常说到一半就停,就把它调大。工作区可以在 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 上的真实请求,在 Dashboard → Logs 里各占一行,只要模型作答就会计费:
- 保存和测试按钮。 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:触及之后网关返回 HTTP 402(见错误码),花费不会超过这个上限,你的其他 Key 也照常可用。在 Dashboard → API Keys 里给每套部署单独建一把 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 申请提高。
在 Dashboard → Logs 里核对
应用自己的计数不是账单。RAGFlow 在数据块不带 usage 时会在本地估算流式 tokens,MaxKB 在响应不带 usage 时改用自己的 token 估算(它的流式调用不会请求 usage),FastGPT 用积分给你的用户在内部计量,AnythingLLM 在应用内自行计算 token 指标,除非设置 GENERIC_OPEN_AI_REPORT_USAGE=true 要求在流中返回 usage。Dashboard → Logs 才是逐请求的费用,所以在那里核账(见成本追踪):导入一份小文档、问一个问题,只打开打算长期保留的选项;在 Logs 里按这段时间窗和精确的模型 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。
常见问题
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 及以后会补上缺失的 /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 定时运行。保存和测试按钮也会发真实请求,每一次都是 Dashboard → Logs 里的一行。
怎样给一个知识库应用设消费上限? 为这套部署单独创建一把 Router One Key,并给它设置 maxSpend。触及上限后,网关只对这把 Key 返回 HTTP 402,失控的解析任务就停在那里,花费不会超过这个上限,你的其他 Key 也照常可用。在 RAGFlow 里,再建一个提供商实例、配第二把 Key,就能把解析和聊天的花费分开。
模型测试通过了,导入文档却失败,为什么? 测试只证明了聊天模型可用。建索引需要 Embedding 模型,而 Router One 不提供这个端点,所以检查 RAGFlow 的默认 Embedding 模型、MaxKB 知识库的向量模型、FastGPT 知识库的索引模型,或 AnythingLLM 的 Settings → AI Providers → Embedder,是否指向了别的供应商或本地模型。