feat(cyrene,config,loop): 护栏/压缩/身份知识三条落地(P0-5/P0-10/P0-11)+ 身份注入收窄到主人会话
- P0-5 护栏不再是空壳:挂 WithSensitiveInfo(阻断) + 长度上限(输入 262144 / 输出 65536 字符,依据=
组装完成的请求体量级与「不误伤正常对话」) + 关键词**仅在配置时**挂;正常对话有用例证明放行
- P0-11 上下文压缩默认启用:CONTEXT_MAX_TOKENS 默认 32768(=loop.DefaultMaxContextTokens,两常量由测试锁死),
0/负 = 关闭(行为退回接线前);长对话真压缩且摘要消息进请求首位、最近一轮保留
- P0-10 身份说明书(owner.yaml identityFile)注入人格上下文,并且**收窄为仅主人会话**:
· 新增最小钩子 loop.Options.PersonaKnowledgeFor(env):**按该轮会话环境**解析(不看提示词、不看会话 id),
块只进每轮视图、**不进 messages**(不进 checkpoint、不进记忆提取面)
· 开关 OWNER_IDENTITY_INJECTION:owner_only(默认) / always(仅自测) / off;非法值与读不动 → WARN + 回退默认(不静默)
· **顺手关掉第二条同型泄漏**:channelbridge 群聊参与度判定器的 PersonaPrompt 此前带身份正文 ⇒ 现改为纯人格指令
· 回归:缺文件/目录/未配置逐字节等于旧输出;静态指令与角色池 Instructions() 全不含正文;
文件里点名的陌生账号仍 IsOwner==false(身份知识绝不参与权限判定)
- 复核:build/vet 绿 + cmd/config/loop 包测试绿;四类断言(主人含 / **群聊与陌生人不含** / always·off 两档 /
回归不变)+ 4 条变异反证(含把判定改成恒真 → 提示词里真的出现身份说明书)均已还原
- 未做(登记):knowledge 块启动时读一次(改文件需重启);`.env.example` 的 OWNER_IDENTITY_INJECTION 行随后补;
`internal/user/owner.go` 注释与 design/01 §2.2、design/11 §0 待同步
This commit is contained in:
1 parent
19f296a2ab
commit
da3a386daf
18 files changed
+1758
-81
No files matched your search
@@ -164,9 +164,23 @@ func formatMemoryBlock(results []memory.Result, marker string) string {
|
||||
// 声明紧接其后(就在它所描述的对话之前),而发言人
|
||||
// 边界说明被插入对话本身。没有发言人标签的对话
|
||||
// 完全不渲染归属,因此每条单角色路径都保持多角色支持
|
||||
// 之前的提示词。
|
||||
// 之前的提示词。唯一的头部新增是「人格知识」块(本批 P0-10
|
||||
// 收窄,见下),它排在最前 —— 即紧接该轮 agent 的指令消息之后,
|
||||
// 与它过去作为指令尾段时的相对位置一致。
|
||||
//
|
||||
// 「人格知识」(主人身份说明书)**按会话**注入(Options.PersonaKnowledgeFor):
|
||||
// 解析器拿该轮的 SessionEnv 决定返回什么,群聊 / 陌生人会话返回空串即
|
||||
// 完全不出现(design/11 §0 红线:不入主会话上下文、不泄露主人敏感信息)。
|
||||
// 为什么不能像过去那样静态拼进 system 指令:指令在装配期定死,静态注入
|
||||
// 会让它进入该角色的每一个会话(含群聊与陌生人私聊)并随请求发给模型
|
||||
// 供应商。未接线该解析器时逐字节等于接线前。
|
||||
func (l *Loop) assembleContext(ctx context.Context, messages []model.Message, round int) []model.Message {
|
||||
var leading []model.Message
|
||||
if l.personaKnowledgeFor != nil {
|
||||
if block := l.personaKnowledgeFor(sessionEnvFrom(ctx)); block != "" {
|
||||
leading = append(leading, model.TextMessage(model.RoleSystem, block))
|
||||
}
|
||||
}
|
||||
// 每轮「当前时间」,使模型自然知道墙上时钟(而非首轮
|
||||
// 快照)。以已配置的时区为条件,使测试与无时区的运行
|
||||
// 保持其精确的前导消息数。它位于工作记忆 /
|
||||
|
||||
Reference in new issue
Block a user