随时间变化的上下文要逐轮注入
原因在会话的生命周期:agent 的 chat session 是长驻的(按会话缓存,只有 /reset、/cd 之类才重建),会话级系统提示只在建立那一刻算一次。跨过午夜后,写在里面的日期就是过期的——而「今天/昨天/上周」这类相对表述恰恰要靠它。
判据与做法:
- 判断上下文该放哪一层,看它变不变:不变的身份、规则、记忆可以放会话级;会变的时钟必须每轮重算。
- 优先用「每轮触发、只影响本轮」的钩子(如
before_agent_start返回覆盖后的 systemPrompt),而不是往用户消息里拼前缀——前者不写进会话历史、不污染可见消息、也不额外占上下文。 - 显式指定时区(如
Asia/Shanghai),不要依赖进程环境变量:由 launchd / 容器启动的进程 TZ 不可靠,换机器还会错。 - 粒度给到「日期 + 时分 + 星期」:光有日期不足以支撑「今晚 12 点前」「明天上午」这类相对表述。
- 单次赋值即可,无需链式处理——钩子拿到的
event.systemPrompt已经是链路当前值。
更一般的形态:把「会变的输入」与「建立时机」解耦。任何在初始化时算一次、却被长期复用的状态(日期、版本号、健康表、权限快照),都会在跨过某个边界后静默失效。