睡觉和醒来
它几点睡、几点醒,不是到点就关:困意白天一点点攒、睡着以后慢慢消,生物钟在设定的入睡时间附近最想睡。今天累不累、闲不闲、聊没聊着,会让它早睡或晚睡。
两样东西决定什么时候困
这一套用的是睡眠研究里的「双过程模型」,公开的生理学模型:
- 困意:醒着的时候往上涨,越接近上限涨得越慢;做的事越累涨得越快。睡着以后慢慢消下去。涨和消的快慢取文献里常用的数(醒时约 18 小时、睡时约 4 小时一个时间常数)。
- 生物钟:以你设的入睡时间为中心。夜里最想睡,天亮以后迅速清醒;睡前两三个小时反而最清醒,想早睡也不容易;午后有一个小低谷。
困意加生物钟、再加上今天的状态,越过一道门槛,它就去睡了。
今天的状态包括:累(精力比困意能解释的还低)、闲(一晚上没事做)、正聊着(推迟)、压力大(推迟)、周末(整体往后挪)、每晚一点小浮动。
偏开多少
偏开多少由模型算,但不出这几道边:
- 最多比设定早睡三个小时,最多晚睡两个小时(周末再顺延四十五分钟);
- 一晚至少睡五个半小时,最多十个小时;
- 周一到周五早上有「闹钟」,按设定时间起;周末可以多睡一会儿;
- 下午很困又没事的时候,偶尔打个盹,最长四十分钟。
关掉「困了才睡」,就每晚按设定时间睡(1.11)。
睡着的时候
- 在 Discord 上显示离线;消息照样收下,醒来再看(2.22)。
- 有人连着找:私聊十分钟里三次、群里十分钟里被 @ 三次,会被吵醒;一口气连着发的几条(离这一串的第一条不到 20 秒)只算一次。被吵醒以后要过 25 到 75 秒才拿起手机,醒着待十五分钟,没人再找,过十到十五分钟接着睡。一晚最多被叫醒两次。
- 刚被吵醒的几句带着起床气:多大、什么样(按人格、暴躁、委屈、不耐烦、困倦),在设置里调。
- 被吵醒会让它心情和精力往下掉一点、压力上去一点(2.18)。
- 半夜被吵醒、不想再被吵,它可能自己开免打扰。
- 有人流露出明显的痛苦、可能有危险,一条就叫醒它,开着免打扰、这一晚已经被叫醒过两次也一样(2.24)。在骚扰它的人说这种话,不能越过一晚两次。
- 「重要的事可以叫醒」打开以后,一条冲着它来的消息急不急由模型判断,急的事睡着十分钟以后能叫醒它。
睡着时它会做梦,醒着发呆时会做白日梦;梦里的事不当成真发生过的事记。
对应的代码
- 双过程模型:
src/aeria/cognition/sleep_rhythm.py(醒时 18.2 小时、睡时 4.2 小时的时间常数;门槛按设定标定)。 - 今晚的计划、做梦:
src/aeria/cognition/life_engine.py;作息的设置:src/aeria/config.py的SleepConfig(earliest_minutes= 180、latest_minutes= 120、min_sleep_hours= 5.5、max_sleep_hours= 10、weekend_shift_minutes= 45、nap_max_minutes= 40、dm_wake_messages= 3、wake_latency_min_seconds= 25、wake_latency_max_seconds= 75、wake_duration_minutes= 15)。 - 被吵醒、免打扰、急事:
src/aeria/bot.py(_sleep_rhythm、_judge_urgency_while_busy),提示词prompts/zh-CN/judge_urgency.prompt;连着发的算一次:cognition/life_engine.py的WAKE_BURST_SECONDS= 20(_register_wake_attempt);一晚最多两次:同一个文件里夜里那一觉的interruption_count < 2;有人求助(SLEEP.SAFETY_WAKE)不受这个限制,在骚扰它的人除外。 - 测试:
tests/test_sleep_rhythm.py、tests/test_life_sleep_rhythm.py、tests/test_3_2_1_phase_l_sleep_wake.py。
没做到的
- 作息和日常活动都按运行时的时区算,默认北京时间,桌面版界面上改不了。网页后台「日常生活与白日梦」里那一格「时区」启动时会被它盖掉,改了不起作用。
- 它不会因为第二天有事就早睡:生物钟只认设定的时间和今天的状态,不看日程。