fix: label generated context provenance in transcript evidence

This commit is contained in:
Sycun committed 2026-10-12 10:14:25 +08:00
1 parent 60d76be064
commit 015e16457e
3 files changed
+8 -1

No files matched your search

+1 -1
View File
@@ -18,7 +18,7 @@
## 用户输入与系统摘要不能混为同一来源
Eino 默认续接摘要使用 `user` 消息角色传输,但同时带 `_eino_summarization_content_type=summary` 的来源标记;保留的技能上下文使用 `skills` 标记。原始用户输入账本按该元数据排除内部摘要和技能消息,不能仅凭 `role=user` 将生成内容归入用户原文。摘要中的模拟用户账本也不作为原始输入来源导入,避免多轮压缩把模型自己写的目标或操作提升为用户指令。
Eino 默认续接摘要使用 `user` 消息角色传输,但同时带 `_eino_summarization_content_type=summary` 的来源标记;保留的技能上下文使用 `skills` 标记。原始用户输入账本按该元数据排除内部摘要和技能消息,不能仅凭 `role=user` 将生成内容归入用户原文。摘要中的模拟用户账本也不作为原始输入来源导入,避免多轮压缩把模型自己写的目标或操作提升为用户指令。快照和摘要模型的文本记录同时标出内部消息的系统生成来源,明确其不是用户输入或新的授权。
压缩摘要仍保留在模型工作上下文中,不因来源区分而丢弃进展;主/子代理本轮输入仍来自原始请求及原始聊天记录。不会用 `<summary>` 等文本关键词过滤真正的用户输入。回归测试调用实际 `DefaultFinalize`、连续执行三轮压缩并经过 classic/native 转换,核对原始授权目标与禁止测试本机的约束保留、生成目标与模拟指令不进入用户账本、摘要进展不丢失,以及用户引用摘要文本时仍被视为真正用户输入。
@@ -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")
}
}
}
@@ -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") {