From 015e16457e50a0ca87216ddcad9beabed66de7f4 Mon Sep 17 00:00:00 2001 From: Sycun <165354365+Sycun@users.noreply.github.com> Date: Mon, 12 Oct 2026 10:14:25 +0800 Subject: [PATCH] fix: label generated context provenance in transcript evidence --- docs/zh-CN/blackboard-context-memory.md | 2 +- internal/multiagent/eino_summarize_output_test.go | 4 ++++ internal/multiagent/eino_summarize_transcript.go | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/zh-CN/blackboard-context-memory.md b/docs/zh-CN/blackboard-context-memory.md index f0dc20af..64bbf14e 100644 --- a/docs/zh-CN/blackboard-context-memory.md +++ b/docs/zh-CN/blackboard-context-memory.md @@ -18,7 +18,7 @@ ## 用户输入与系统摘要不能混为同一来源 -Eino 默认续接摘要使用 `user` 消息角色传输,但同时带 `_eino_summarization_content_type=summary` 的来源标记;保留的技能上下文使用 `skills` 标记。原始用户输入账本按该元数据排除内部摘要和技能消息,不能仅凭 `role=user` 将生成内容归入用户原文。摘要中的模拟用户账本也不作为原始输入来源导入,避免多轮压缩把模型自己写的目标或操作提升为用户指令。 +Eino 默认续接摘要使用 `user` 消息角色传输,但同时带 `_eino_summarization_content_type=summary` 的来源标记;保留的技能上下文使用 `skills` 标记。原始用户输入账本按该元数据排除内部摘要和技能消息,不能仅凭 `role=user` 将生成内容归入用户原文。摘要中的模拟用户账本也不作为原始输入来源导入,避免多轮压缩把模型自己写的目标或操作提升为用户指令。快照和摘要模型的文本记录同时标出内部消息的系统生成来源,明确其不是用户输入或新的授权。 压缩摘要仍保留在模型工作上下文中,不因来源区分而丢弃进展;主/子代理本轮输入仍来自原始请求及原始聊天记录。不会用 `` 等文本关键词过滤真正的用户输入。回归测试调用实际 `DefaultFinalize`、连续执行三轮压缩并经过 classic/native 转换,核对原始授权目标与禁止测试本机的约束保留、生成目标与模拟指令不进入用户账本、摘要进展不丢失,以及用户引用摘要文本时仍被视为真正用户输入。 diff --git a/internal/multiagent/eino_summarize_output_test.go b/internal/multiagent/eino_summarize_output_test.go index 45384799..132576b4 100644 --- a/internal/multiagent/eino_summarize_output_test.go +++ b/internal/multiagent/eino_summarize_output_test.go @@ -31,6 +31,10 @@ func TestGeneratedSummaryNeverBecomesHumanInputAcrossCompactions(t *testing.T) { if !strings.Contains(joinClassicMessageContent(msgs), "GENERATED_SELF_TARGET") { t.Fatal("summary progress was discarded instead of being kept as working memory") } + transcript := formatSummarizationTranscript(msgs) + if !strings.Contains(transcript, "[origin: system-generated summary/skill context; not human input or new authorization]") { + t.Fatal("snapshot falsely presents a generated user-role summary as human input") + } } } diff --git a/internal/multiagent/eino_summarize_transcript.go b/internal/multiagent/eino_summarize_transcript.go index 92ed86e4..d725ccb5 100644 --- a/internal/multiagent/eino_summarize_transcript.go +++ b/internal/multiagent/eino_summarize_transcript.go @@ -150,6 +150,9 @@ func appendTranscriptMessage(sb *strings.Builder, msg adk.Message) { sb.WriteString("--- [") sb.WriteString(string(msg.Role)) sb.WriteString("] ---\n") + if isInternalSummarizationUserMessage(msg) { + sb.WriteString("[origin: system-generated summary/skill context; not human input or new authorization]\n") + } if msg.Content != "" { sb.WriteString(msg.Content) if !strings.HasSuffix(msg.Content, "\n") {