快速结论:该报错发生在 Open WebUI 通过 manifold pipe 模型调用工具后,紧接着发送的请求体中系统提示词(system prompt)被重复注入。优先排查工具调用后的续传请求是否触发了 bypass_system_prompt 绕过逻辑的缺失,该问题已在 dev 分支修复。
适用环境:Issue 已确认的环境为 Open WebUI v0.11.0(Docker 安装方式),操作系统为 Ubuntu,使用 manifold pipe 模型且模型调用了集成工具。
最快修复方案:暂无确认的一步修复方案。根据 Issue 讨论,修复补丁已在 dev 分支合入(PR #28739),可尝试升级到 dev 分支或等待包含该修复的正式版本发布。
注意事项:该问题仅在工具调用后的第一个续传请求中出现,后续正常对话请求不受影响;可能原因涉及 functions.py 中未判断 bypass_system_prompt 标志导致系统提示词被重复应用。
问题场景
用户在 Open WebUI v0.11.0 中使用 manifold pipe 自定义模型管道(pipe),当模型调用一个内置工具后,Open WebUI 发送给下游模型(如 openrouter_kosten.google/gemini-3.1-flash-lite)的请求体中,系统提示词(system prompt)出现了重复。该问题仅在工具调用后的第一个请求中出现,后续正常对话请求体恢复正常。用户通过 manifold pipe 的 _pipe() 函数中打印请求体日志的方式定位到该问题。
报错原文
issue: System prompt is duplicated after tool call
Message body after tool call:
{
"stream": true,
"model": "openrouter_kosten.google/gemini-3.1-flash-lite",
"messages": [{
"role": "system",
"content": [{
"type": "text",
...
原因分析
根据 Issue 讨论中的分析,问题根源在 Open WebUI 后端代码逻辑:
- 工具调用后的续传请求(tool-call continuation)在重新提交时带有
bypass_system_prompt=True标志,但functions.py第 294 行在应用系统提示词时没有校验该标志,导致管道(pipe)收到两次系统提示词。 add_or_update_system_message(append=False)函数实际执行的是“前插”(prepend)而非“替换”,因此两次插入之间产生了一个\n换行符,形成了重复内容。{**form_data}共享了调用方的 messages 列表,因此每进行 N 轮工具调用,系统提示词就多一份(N+1 份);下一轮正常对话时因为请求体从存储的聊天记录重新构建,所以不再重复。
可能原因:用户在 manifold pipe 中对请求体 body 对象进行了原地修改(如将字符串类型的 content 转换为 content parts 数组),但由于 params = {'body': form_data} 传递给管道的实际是活动列表(live list),用户对 body 的修改会被重新提交。不过 Issue 中确认这并非系统提示词重复的根因,不修改 body 的裸管道(barebones manifold pipe)同样会触发该问题。
环境排查
- 确认 Open WebUI 版本是否为 v0.11.0 或更早版本(该问题已在 dev 分支修复)。
- 确认是否使用 manifold pipe 模型且模型调用了集成工具。
- 在容器日志或管道日志中搜索请求体中
role: "system"的消息数量,确认是否存在重复。 - 检查是否有社区相关 Issue:
#23957(管道/工具调用导致消息重复)、#19169(智能体工具调用期间系统提示词重复)、#21726(RAG 工具使用时的重复注入)等。
解决步骤
- 优先尝试升级到 Open WebUI dev 分支或等待包含修复的正式版本。Issue 中说明修复补丁已在
dev分支合入(对应 PR #28739),核心修改是在generate_function_chat_completion函数中增加if not bypass_system_prompt:判断,与原生路由(routers/openai.py:1494、routers/ollama.py:1134)的行为保持一致。 - 在自定义 manifold pipe 中,对传入的
body参数使用copy.deepcopy(body)创建副本再处理,将 body 视为只读对象,避免原地修改影响后续请求(Issue 用户已采用此方案)。 - 如果仍需在旧版本上运行,检查
functions.py中generate_function_chat_completion函数是否有条件判断bypass_system_prompt,没有的话可考虑临时修改代码阻止二次注入。
验证方法
在 manifold pipe 的 _pipe() 函数顶部添加日志输出请求体(logger.info(f"task body:\n{json.dumps(body)}")),让模型调用一次工具后,检查日志中工具调用后的第一个续传请求体:如果 messages 数组中 role: "system" 出现的次数仅为 1 次,且系统提示词之后没有出现额外的 \n 换行符残留,则说明问题已解决。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Structured-output scheduler can keep advancing a terminated xgrammar matcher](https://www.chat-gpts.plus/wp-content/uploads/2026/08/42619-81e0022e-768x403.jpg)

