随时间变化的上下文要逐轮注入

**凡是「值会随时间变」的上下文(当前日期、时间、星期),都不能挂在会话级系统提示上,必须逐轮注入。**

原因在会话的生命周期:agent 的 chat session 是长驻的(按会话缓存,只有 /reset、/cd 之类才重建),会话级系统提示只在建立那一刻算一次。跨过午夜后,写在里面的日期就是过期的——而「今天/昨天/上周」这类相对表述恰恰要靠它。

判据与做法:

  • 判断上下文该放哪一层,看它变不变:不变的身份、规则、记忆可以放会话级;会变的时钟必须每轮重算。
  • 优先用「每轮触发、只影响本轮」的钩子(如 before_agent_start 返回覆盖后的 systemPrompt),而不是往用户消息里拼前缀——前者不写进会话历史、不污染可见消息、也不额外占上下文。
  • 显式指定时区(如 Asia/Shanghai),不要依赖进程环境变量:由 launchd / 容器启动的进程 TZ 不可靠,换机器还会错。
  • 粒度给到「日期 + 时分 + 星期」:光有日期不足以支撑「今晚 12 点前」「明天上午」这类相对表述。
  • 单次赋值即可,无需链式处理——钩子拿到的 event.systemPrompt 已经是链路当前值。

更一般的形态:把「会变的输入」与「建立时机」解耦。任何在初始化时算一次、却被长期复用的状态(日期、版本号、健康表、权限快照),都会在跨过某个边界后静默失效。

相关