Skip to content

[BUG][P1] 独立 ReAct 应将拦截器设置的 system message 传入模型请求 #270

Closed

Description

@Aias00

已确认问题

ModelRequest 提供独立的 systemMessage 字段。拦截器设置该字段后,ReAct 的 ChatRequest 构造仅使用 getMessages(),未合并 getSystemMessage()。系统指令在没有报错的情况下被丢弃。

代码:

ChatRequest chatRequest = new ChatRequest(request.getMessages(), request.getToolRegistry().definitions(),

最小复现场景与证据

使用记录请求的假 ChatClient,在 ModelInterceptor 中执行:

next.call(ModelRequest.builder(request)
    .systemMessage(ChatMessage.system("required-policy"))
    .build());

调用独立 ReAct 后,假客户端记录的 messages 中没有 SYSTEM 消息:system message sent=false。依赖该字段设置的运行指令不会生效。

交付与验收

  • 构造 ChatRequest 时保留有效 system message,明确与 messages 中已有 SYSTEM 消息的次序及替换/合并规则。
  • 多轮、retry、fallback、流式及非流式均遵循同一规则,不能每轮重复累加系统消息。
  • 未设置 system message 时保持原 messages;不得把普通输入、工具或检索文本自动提升为 SYSTEM。
  • 用记录请求的假客户端验证消息角色、内容、顺序和精确出现次数,而不只断言 Agent 最终返回成功。

关联

关联 #196、#136;此处是已存在 ModelRequest 字段未执行的具体缺陷,不是新增提示词框架。

验证基线与变更约束

审阅基线:Core b34835354b27f1f320ea8438edf2e9d170e69c84 / Extensions cb2635ab2fc338e8aade28a132a15f48b4e655fc。以下为离线 stub、独立 Java 探针或候选工件编译验证的结果,不代表真实模型、外部服务或生产环境验收。

修复保持独立 ReAct/Workflow 不依赖 Graph/Loop,不向 Core 引入供应商 SDK。优先修正现有契约的执行行为;确需改变公开 API、配置或定义格式时,说明较小替代方案、收益、消费者影响、目标版本与迁移方式。不得以跳过测试或删除能力换取通过。

Activity

  1. konlue commented on Oct 31, 2026

    @konlue
    Contributor

    您好,我想认领 #270。

    方案(单 PR,不加新协议):

    • invokeModel 构造 ChatRequest 时合成消息列表:systemMessage != null 时以它作为唯一 SYSTEM 消息注入头部,messages 中的既有 SYSTEM 消息被替换(两条 SYSTEM 在 Spring/LangChain4j adapter 会重复透传、Google ADK adapter 会拼接,行为不一致),其余非 SYSTEM 消息保序不变;systemMessage == null 时 messages 原样透传。
    • 合成只发生在 ChatRequest 构造的局部副本上,不回写 run 级 messages 列表——多轮循环每轮由拦截器链重新计算,零累积;流式/非流式共用同一构造点,修一处两路一致。
    • 影响面:Skills / Filesystem / SubAgent / TodoList 四个拦截器都用 systemMessage 字段注入系统提示(null 则新建、非 null 则 appendText 合并),当前在独立 ReAct 路径下全部丢失。

    测试(ScriptedClient 模式,全离线):issue repro(拦截器设 "required-policy" → 模型请求首条 SYSTEM 匹配)/ 既有 SYSTEM 被替换且 occurrence=1 / 无 systemMessage 时 messages 原样(用户自带的 SYSTEM 保留)/ 多轮工具调用每轮 SYSTEM 恰好 1 条 / 流式与非流式一致 / 非 SYSTEM 消息顺序保持。

  2. added 2 commits that reference this issue on Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions