issue: System prompt is duplicated after tool call

该报错发生在 Open WebUI 通过 manifold pipe 模型调用工具后,紧接着发送的请求体中系统提示词(system prompt)被重复注入。优先排查工具调用后的续传请求是否触发了 bypass_system_prompt 绕过逻辑的缺失,该问题已在 dev 分支修复。

快速结论:该报错发生在 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 工具使用时的重复注入)等。

解决步骤

  1. 优先尝试升级到 Open WebUI dev 分支或等待包含修复的正式版本。Issue 中说明修复补丁已在 dev 分支合入(对应 PR #28739),核心修改是在 generate_function_chat_completion 函数中增加 if not bypass_system_prompt: 判断,与原生路由(routers/openai.py:1494routers/ollama.py:1134)的行为保持一致。
  2. 在自定义 manifold pipe 中,对传入的 body 参数使用 copy.deepcopy(body) 创建副本再处理,将 body 视为只读对象,避免原地修改影响后续请求(Issue 用户已采用此方案)。
  3. 如果仍需在旧版本上运行,检查 functions.pygenerate_function_chat_completion 函数是否有条件判断 bypass_system_prompt,没有的话可考虑临时修改代码阻止二次注入。

验证方法

在 manifold pipe 的 _pipe() 函数顶部添加日志输出请求体(logger.info(f"task body:\n{json.dumps(body)}")),让模型调用一次工具后,检查日志中工具调用后的第一个续传请求体:如果 messages 数组中 role: "system" 出现的次数仅为 1 次,且系统提示词之后没有出现额外的 \n 换行符残留,则说明问题已解决。

参考来源

open-webui/open-webui #28736

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19163

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注