- 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 待同步
24 lines
1.5 KiB
Go
24 lines
1.5 KiB
Go
package config
|
||
|
||
// DefaultContextMaxTokens 是 CONTEXT_MAX_TOKENS 的默认值(32Ki token),与
|
||
// loop.DefaultMaxContextTokens 取同一个数:项目早已把「上下文溢出压缩预算」
|
||
// 定为 32K,默认值直接复用它,而不是另起一个数。两处的一致性由
|
||
// cmd/cyrene/wire_context_test.go 锁定。
|
||
const DefaultContextMaxTokens = 32768
|
||
|
||
// ContextConfig 承载运行时循环的上下文预算(design/04 §1.3 上下文溢出压缩)。
|
||
// 它与 MCP / Capacity 一样是运行时调优量,由组合根消费。
|
||
type ContextConfig struct {
|
||
// MaxTokens 是触发溢出压缩的上下文预算,单位是循环离线估算的 token 数
|
||
// (CONTEXT_MAX_TOKENS)。**0 或负值 = 关闭压缩**,行为与本条接线前完全
|
||
// 一致;未配置时用 DefaultContextMaxTokens(即默认启用)。
|
||
//
|
||
// 取值依据:默认模型(.env.example 的 gpt-4o)上下文窗口为 128K token,
|
||
// 32K 只有它的四分之一 —— 既给系统提示词 / 工具 schema / 本轮输出留出
|
||
// 充足余量(不会把窗口塞到上游静默截断或报错),又比日常对话的实际体量
|
||
// 大一个量级(正常聊天几乎不触发压缩,宁可不压也不频繁压)。真触发时
|
||
// compactor 仍保留 50% 预算的近期尾部(含尾部工具结果)并只把更早的轮次
|
||
// 摘要成一条前导消息,因此不会打断正在进行的对话(design/04 §1.3)。
|
||
MaxTokens int `env:"CONTEXT_MAX_TOKENS" default:"32768"`
|
||
}
|