答应过的事
它说出口的「晚点告诉你」「明天陪你去」会被记下来;到了时间,它会想起这件事,自己决定要不要去兑现。记的是答应了什么、约好几点,不是聊天原话。
什么算答应
写回复的模型写这一稿时,顺手交代一件事:这一稿里,它有没有亲口答应对方、以后要去做什么。有的话写一句话说清是什么事,约了时间就写上约好的当地时间,没说时间就空着。
- 对方自己的计划、客套话、它此刻的心情,都不算答应。
- 一稿最多记三条。
- 稿子最后没发出去,就不记。
记在哪、谁看得到
- 记在它的人生时间线上,和对方这个人挂钩(2.15)。
- 在哪儿答应的,就只在哪儿想得起来:在群里答应的,只在那个服务器里;私聊里答应的,只在和他的私聊里。
- 网页后台「人物画像」里点开他,「关系时间线」里有这一条;「生活连续性」页的时间线里也有。每一条写着答应了什么、约好几点,后面是「还欠着」「做到了」或「没做到」。
到了时间
- 约了时间的,到点算到期;没约时间的,说出口一天以后算到期。
- 到期以后,它下一次「想起谁」的时候,这件事会变成一个念头。和闲着想起他相比,这个念头更具体,分量也更重。
- 念头有了,要不要真的去找他、什么时候找,照样过主动找人那几关:睡着、手上有事、刚找过他,都会先等等(2.19、2.20)。
- 去找他的时候,要说的就是答应过的那件事。
- 在哪儿答应的,就在哪儿兑现:私聊里答应的,不会拿到群里去说。
聊着聊着做到了
和他聊天的时候,还欠着他的事会摆在它面前:最多五条,先到期的排在前面,带着约好的时间、是不是已经过了时间。
- 正好聊到、到了时间,就该兑现。
- 这一稿里做到了哪一条,写回复的模型会交代,那一条就记成「做到了」。
- 没做到的,不能说成做到了。
- 他问的是别的事(比如它在干什么),它就照实回答,不拿这件事来接话。
一直没做到
约好的时间过了三天还没做到,记成「没做到」。从那以后,聊天时这件事不再摆在它面前,也不会再变成念头。
对应的代码
- 账本:
src/aeria/cognition/commitments.py(DUE_WITHOUT_TIME= 24 小时、MISSED_AFTER= 3 天、MAX_PER_REPLY= 3、PROMPT_LIMIT= 5;状态OPEN/KEPT/MISSED)。纯函数,不读时钟、不碰存储。 - 记账、销账:
src/aeria/bot.py的_note_commitments(只记发出去了的稿子);记成没做到:_commitment_milestone_tick(十分钟一次);到期变成念头:_owed_and_milestones和src/aeria/cognition/impulse_sense.py的ImpulseTrigger.COMMITMENT_DUE。 - 提示词:
prompts/zh-CN/replyer_system.prompt(输出里的commitments、kept_commitments,输入里的verified_commitments)、prompts/zh-CN/planner_system.prompt。 - 后台怎么印:
webui_frontend/src/lib/timeline.ts的commitmentNote。 - 测试:
tests/test_commitments_milestones.py、tests/test_commitment_ledger.py(「承诺按范围隔开_私聊里答应的在群里看不到」「到期的承诺变成念头_话题就是那件事_过期三天记成没做到」)。
没做到的
- 有没有答应,全靠写回复的模型交代:它漏了,就没有这一条;它把客套话当了真,到时候会想起一件对方没当回事的事。
- 约好的时间按运行时的时区算,默认北京时间,桌面版界面上改不了(2.16)。
- 记成「没做到」以后,这件事就不再提醒它了;要不要回头跟对方说一句,没有专门的安排。