“Humans should remain in control.” — World Health Organization
一个面向飞书用户的私密自助 Skill。它在工作日 17:50 回顾用户本人当天发送的消息,生成带置信度的文本情绪假设、一句暖心话和一个低负担行动,写入仅本人使用的多维表格,并把当天摘要图片贴到启动自动化的 Agent 对话。首次建表时开箱即用:把过去约一个季度的消息按工作日逐日盘点、沉淀进 Base,让仪表盘一开始就有历史趋势可看。
它处于 Beta,提供自我觉察辅助,不提供心理诊断、治疗、测评或危机预测。用户自评拥有最终解释权。
- 只读取当前用户本人发送的消息,只在同一用户的 Agent 对话中交付结果。
- 非工作日静默跳过;调休工作日按官方日历执行。
- 消息原文只存在于运行时,不写入 Base、图片、日志或仓库。
- 输出主情绪、强度、置信度与六维文本状态;证据不足时拒绝判断。
- Base 仪表盘包含趋势、分布和六维雷达图。当天 PNG 保持轻量,不重复雷达。
- 用户可以校准“准确/部分准确/不准确”,选择支持偏好,或随时暂停。
每天的 PNG 卡片与简短回顾只出现在创建自动化的 Agent 对话中。Skill 不会通过飞书私聊、群消息或机器人发送图片、文字、链接或提醒;飞书 CLI 只承担消息读取与用户私有 Base 的读写。
定时运行必须由宿主绑定回这条对话,并提供 present_files。缺少其中任一能力时,Skill 会停止卡片交付并标记 conversation_delivery_unavailable,不会把结果改投飞书。完整约束见对话投递。
当天卡片使用已校验汇总字段渲染,长文本会换行、省略并裁切在卡片内。上图来自仓库内的虚构样例,不含真实消息、人员、聊天或私有配置。
新建的 Base 是空的,只有连续多天运行才积累出趋势。为让仪表盘开箱即用,初始化通过后立即回填过去约一个季度(默认 90 天)的工作日记录:跳过周末与节假日,对每个工作日复用与每日流程完全相同的读取、去标识化、schema 校验和按日期幂等 upsert。回填不是一条新的分析路径,只是把“分析一天”按官方日历倒着补齐历史工作日。
回填串行推进并对 Base 写入限流做退避,通过 --limit 分批;last_completed_date 让被限额或中断打断后可从下一天续跑。季度窗口可能跨年,因此工作日日历支持多年配置(workday_calendar.years),窗口内任一年份缺日历时会标记为不完整并要求先补齐,不猜测工作日状态。回填期不逐日出图、不逐日进行对话交付,历史日不追溯触发危机干预;完成后再进入常规每日流程。完整流程见 季度盘点。
公开资料尚未证明任何现成模型能从中文工作聊天稳定识别一个人的真实情绪。工作套话、讽刺、转发、领域差异和个人表达习惯都会造成偏差。默认方案使用当前 Agent 的结构化语言模型生成假设,再由严格 schema 和证据门校验;模型名不写死。
硬门槛包括:至少 3 条本人消息、至少 100 个有效字符、可证明的覆盖范围和不低于 0.55 的置信度。未通过时输出“无法判断/混合”,六维状态全部留空;当天没有本人消息时默认不打扰。
可选中文情感分类器只能提供辅助信号。详细依据见 模型选择。
依赖:Python 3.9+、已完成用户身份授权的 lark-cli、能把定时任务绑定回当前对话且提供 present_files 的 Agent 运行环境,以及可用的 SVG 转 PNG 工具。
git clone https://github.com/TongyiDai/emotion-tide.git
mkdir -p ~/.codex/skills
cp -R emotion-tide/skill/emotion-tide ~/.codex/skills/emotion-tide
cp emotion-tide/skill/emotion-tide/config.example.json ~/.config/emotion-tide/config.json
chmod 600 ~/.config/emotion-tide/config.json首次启用时不要填写或复用任何现成 Base token。Agent 先生成 installation_id、取得文本处理同意,并把配置 profile 的实时 open_id 同时绑定为 owner 与历史身份字段;该字段只做归属校验,不再接收飞书消息。随后运行初始化检查并创建全新的 Base:
export EMOTION_TIDE_CONFIG="$HOME/.config/emotion-tide/config.json"
python3 ~/.codex/skills/emotion-tide/scripts/doctor.py --live --allow-unprovisioned首次对话可直接说:
请帮我安装“情绪潮汐”:这是我的首次使用,请在我当前验证通过的飞书用户身份下新建一套只属于我的 Base、数据表和含六维雷达图的仪表盘;不要复用维护者、仓库示例、其他用户或同名 Base 的任何 token;回读 owner 和权限后,只在本对话支持定时回贴和
present_files时创建工作日 17:50 自动化。只分析我本人当天发送的消息,非工作日静默跳过;先告诉我消息会在哪里处理,并等我同意后再启用;不要向飞书私聊发送任何结果。
每个安装实例都执行 unprovisioned → 创建当前用户 Base → 回读 owner/权限 → ready → 季度盘点回填。创建响应会先写入本机私有检查点;若恰在这一刻中断,只能在一小时内恢复同一安装实例派生出的唯一候选,并再次通过 owner、表结构与分享边界回读。它不会按普通标题接管旧 Base,也不会因此新建第二套。只有 owner、历史身份绑定字段与当前登录用户一致,且宿主能回贴到本对话时才启用自动化。配置中的 Base token、表 ID、身份字段和飞书 profile 属于私密信息,禁止提交到 Git。年度工作日表应引用当地政府或其他权威来源;年份缺失时任务会关闭执行。
旧版配置不会因填有 Base token 就被自动视为可用。缺少显式状态、安装 ID 或 owner 时,doctor 会失败并要求按首次初始化或受控迁移处理;完整检查还会使用配置指定的 profile 实时读取 Base。
Base 保存日期、汇总标签、证据计数、六维文本信号和用户自愿反馈,不保存消息原文。仪表盘尽量丰富地展示(约 13 个组件):置顶「最近总结」文本块与方法说明;四张指标卡(记录天数、平均置信度、平均情绪强度、平均帮助程度);趋势区(强度×置信度组合图、情绪强度趋势、文字表达活跃度);分布区(主情绪、覆盖质量、用户校准);六维状态轮廓雷达;可选的辅助情绪词云。所有图表只消费已写入的汇总字段,不新增 Base 字段、不含消息原文。
这是与实际字段和组件结构一致的公开预览:记录、趋势、六维状态轮廓和用户校准都在同一张 Base 内;数值、日期和情绪标签全部虚构,因此它展示结构,不公开任何人的状态。
顶部「最近总结」每天更新:单独的图表价值有限,因此顶部放一个每日改写的文本块。每天写入当天记录后,Skill 读回最近约 14 个工作日的已校验汇总字段(不碰消息原文),用确定性聚合器 summarize_window.py 得到窗口计数、均值、分布与上/下半段强度趋势,再由结构化模型写一小段克制叙事,经 validate_summary.py 校验(固定 schema、长度门、禁诊断词、强制附「文本信号,非心理测评」),最后用 +dashboard-block-update 幂等改写顶部文本块。窗口证据不足时叙事会明说“样本不足、暂不概括趋势”。块集与 data_config 模板见 仪表盘块集。
六维雷达使用舒适度、精力、平静度、掌控感、连接感、清晰度六个字段。它表达文字中的相对信号,不能当作人格或心理测量。字段契约见 输出 schema。
为什么不看表情回应:早期版本把「本人主动添加的表情」当作低权重互动线索。连续两周真实运行后移除了它——采集必须遍历当天全部可见消息,在真实环境中频繁遇到服务端错误、分页极慢和页数上限;而即便采集成功,能明确归类的有效信号常常只有个位数,方向判断几乎全靠文本支撑。信号弱、代价高、还会拖垮主链路,因此整体去掉。判断只基于本人文本。
本项目永久禁止团队情绪监控、员工画像、HR/管理者判断、绩效、招聘、晋升、纪律、保险、医疗和教育决策。欧盟委员会的 AI Act 指引将工作场所和教育机构中的情绪识别列为禁止用途,医疗或安全例外另论;项目在所有地区都采用同样窄的自助边界。
首次启用必须取得文本处理同意。云端 Agent 可能把去标识后的消息发送给当前模型提供方;要求完全本地处理时,应配置 local_only 和本地模型。权限状态无法可靠读取时,部署者必须让用户在飞书界面确认,不能宣称“仅本人可见”。
详细规则见 安全与支持 和 Security Policy。
产品目标很窄:帮助用户注意、命名、修正自己的感受,并把下一步缩小。研究更支持情绪语言脚手架和主动自我描述;单纯反复监测的帮助有限。因此每次只给一个具体、可拒绝的小行动,并邀请用户校准。若最近 10 次里至少 3 次帮助评分不高,或连续反馈“不准确”,Skill 会建议降频、关闭推断或暂停。
参考:情绪语言脚手架研究、移动即时干预随机试验。这些研究支持设计方向,不证明本项目已有临床效果。
python3 -m unittest discover -s tests -v
python3 skill/emotion-tide/scripts/validate_analysis.py examples/analysis.sample.json
python3 skill/emotion-tide/scripts/render_dashboard.py --output /tmp/emotion-tide.svg < examples/analysis.sample.json
python3 skill/emotion-tide/scripts/backfill_plan.py --config examples/config.backfill.sample.json --as-of 2026-02-20 --limit 5
python3 skill/emotion-tide/scripts/summarize_window.py --window-days 14 < examples/base-window.sample.json \
| python3 -c "import sys;print(sys.stdin.read())"
python3 skill/emotion-tide/scripts/validate_summary.py --emit markdown < examples/recap.sample.json示例数据完全虚构。测试覆盖:工作日/调休日门禁、多年日历解析、零消息语义、弱证据拒答、多余字段拒绝、季度盘点的排序/幂等去重/分批/日历完整性、最近总结的窗口聚合(去标识、趋势方向、按日期去重)与叙事校验(长度门、禁诊断词、Markdown 组装),以及 SVG 裁切和仪表盘雷达契约。
连续两周每工作日真实自动运行后沉淀的坑与修法,已脱敏:CLI 能力探测为何不能只看退出码、语义词表为何必须按真实返回值校准、私有配置被同步流程重置、全量拉取的降级策略、幂等为何不能信接口命名、交付与清理的先后顺序、弱信号该在什么时候砍掉。见 运行手记。
优先欢迎:更强的隐私验证、跨地区权威工作日日历适配、可解释的拒答评估、用户可控的本地模型路径。不会接受监控他人、危机预测或人员决策能力。
MIT License。

