描述
方案更新(2026-08-11)
本 Issue 最初提出的是独立 Gate:由模型输出 send / wait / skip,并自行指定 wait_minutes。在 fork 的实际使用和进一步验证中,这套方案暴露出几个问题:
- 模型容易受到 JSON 示例数字的锚定,反复给出相同等待时长;
- 离散的“开口渴望度”档位会把一大段时间压成相同判断,削弱原随机调度的意义;
- 让模型决定等待多久,与调度器的职责重复;
gate_settings、粘人度、每日次数限制和独立提示词使配置面板明显膨胀。
因此,希望将方案调整为“时间由统计分布决定,模型只负责开口前的一次心念”。
1. 私聊使用截断 Weibull 调度
仅修改私聊。群聊继续使用原有的沉默倒计时和均匀随机调度。
私聊仍保留最短、最长间隔配置,但不再在区间内使用均匀分布,而是从有限截断 Weibull 分布中采样:
- 所有结果严格位于最短和最长时间之间;
- 目标均值由
min + mean_position_ratio × (max - min) 自动计算,上下限变化时均值跟随变化;
weibull_shape 控制时间集中或分散的程度;
- 参数无法构成有效分布时,本轮回退到区间中点并记录警告,不自动覆盖用户配置。
当前 fork 中:
mean_position_ratio 默认 0.375,界面范围 0.20~0.575;
weibull_shape 默认 1.7,界面范围 1.5~2.0;
- 两项均在界面标为特殊配置,通常只需要调整原有的最短和最长时间。
采样器使用纯 Python 数值积分、二分求解和结果缓存,不增加第三方依赖。
2. 到点后运行内置心念
私聊调度到点后,先让一个 LLM 根据当前会话人格、最近上下文和未回复次数形成内部心念,只返回固定 JSON:
{
"decision": "speak | silent",
"reason": "简短理由",
"topic": "想说的话题",
"anchor": "触发念头的最近对话或背景",
"angle": "自然切入角度"
}
心念只负责两件事:
- 判断此刻是否存在明确的不适合开口信号;
- 为最终主动消息选择具体话题、锚点和切入角度。
它不再输出等待分钟数,也不再接收粘人度或离散时间档位。仅仅“没有特别好的话题”或无证据地猜测“对方可能在忙”,不应成为沉默理由。
选择 speak 时,话头始终注入最终生成器;最终消息仍由当前会话主模型和完整人格生成。
可以单独选择低成本的 thought_model。还可以填写精炼的 thought_persona_prompt,仅供心念模型使用;留空时自动沿用当前会话实际使用的完整人格 system prompt。
3. 每轮只有一次克制机会
如果第一次心念选择 silent:
- 以原沉默周期起点计算已经过去的时间
E;
- 从条件分布
T | T > E 中重新采样;
- 新时间必须严格晚于当前时间,但不得超过原最大时间;
- 原周期起点和最大期限保持不变。
第二个时间点会重新读取最新上下文并选择最新话头,但不能再次推迟。即使模型再次返回 silent,也继续生成主动消息;如果已经到达最大时间,则立即发送。
这样仍保留“开口前想一下”的感觉,但不会形成无限等待或固定延长 45 分钟的循环。
4. 失败与并发保护
- 心念调用失败、超时或 JSON 无效时,直接放行原主动生成流程;
- 心念期间出现用户新消息时,丢弃本次结果,由用户消息重新开启完整周期;
- 手动立即触发绕过心念;
- 免打扰、未回复上限和生成期间插话保护保持原有优先级;
- 最大时间只约束正常可发送周期,不越过免打扰和未回复上限;
- 心念话头、决定和克制理由只写入 INFO 日志,不进入状态页。
5. 配置与兼容性
保留原有私聊配置:
- 最短、最长间隔;
- 免打扰时段;
- 最大未回复次数;
- 上下文、TTS 和分段回复设置。
新增配置仅为:
mean_position_ratio
weibull_shape
thought_model
thought_persona_prompt
不再新增独立的 gate_settings 配置区,也不保留:
wait_minutes
stickiness
- 时间渴望度档位
- 每日 Gate 调用次数
- 独立 Gate 状态页或任务类型
成本方面,每个私聊周期会增加一次心念调用;如果首次选择沉默,稍后最多再调用一次。可以通过专用低成本模型和精炼人格提示词控制 token 与调用成本。
使用场景
- 让私聊主动消息的出现时间既有随机性,又不会像均匀分布那样显得机械;
- 在真正开口前结合最新对话想一下“现在说什么、从哪里接”,而不是只按固定间隔发送;
- 允许一次有明确理由的克制,同时保证机器人最终仍会在原时间窗内开口;
- 避免让模型自行决定等待时长,减少数字锚定、反复延期和配置膨胀。
你希望该功能主要服务于哪个消息平台?
其他平台
其他平台名称(如选择“其他平台”请填写)
全平台。功能与适配器无关,但仅作用于私聊调度流程。
当前主要部署方式(可选)
uv 一键部署
补充说明(可选)
- 当前方案已在插件
v1.2.4.fork1 中完成实现和本地验证;
- 标准库测试共 36 项通过,覆盖分布边界、目标均值、CDF 反演、条件重抽、首次开口、首次克制、第二次克制、模型失败、用户中途回复、重启恢复、手动触发和群聊回归;
compileall、增量静态检查和代码质量检查已通过;
- 群聊调度、免打扰、未回复上限、任务恢复、TTS、分段回复和会话级配置均保留;
- 如果维护者认可这个方向,我愿意整理为 PR 提交。
你愿意提交 PR 吗?
Code of Conduct
描述
1. 私聊使用截断 Weibull 调度
仅修改私聊。群聊继续使用原有的沉默倒计时和均匀随机调度。
私聊仍保留最短、最长间隔配置,但不再在区间内使用均匀分布,而是从有限截断 Weibull 分布中采样:
min + mean_position_ratio × (max - min)自动计算,上下限变化时均值跟随变化;weibull_shape控制时间集中或分散的程度;当前 fork 中:
mean_position_ratio默认0.375,界面范围0.20~0.575;weibull_shape默认1.7,界面范围1.5~2.0;采样器使用纯 Python 数值积分、二分求解和结果缓存,不增加第三方依赖。
2. 到点后运行内置心念
私聊调度到点后,先让一个 LLM 根据当前会话人格、最近上下文和未回复次数形成内部心念,只返回固定 JSON:
{ "decision": "speak | silent", "reason": "简短理由", "topic": "想说的话题", "anchor": "触发念头的最近对话或背景", "angle": "自然切入角度" }心念只负责两件事:
它不再输出等待分钟数,也不再接收粘人度或离散时间档位。仅仅“没有特别好的话题”或无证据地猜测“对方可能在忙”,不应成为沉默理由。
选择
speak时,话头始终注入最终生成器;最终消息仍由当前会话主模型和完整人格生成。可以单独选择低成本的
thought_model。还可以填写精炼的thought_persona_prompt,仅供心念模型使用;留空时自动沿用当前会话实际使用的完整人格 system prompt。3. 每轮只有一次克制机会
如果第一次心念选择
silent:E;T | T > E中重新采样;第二个时间点会重新读取最新上下文并选择最新话头,但不能再次推迟。即使模型再次返回
silent,也继续生成主动消息;如果已经到达最大时间,则立即发送。这样仍保留“开口前想一下”的感觉,但不会形成无限等待或固定延长 45 分钟的循环。
4. 失败与并发保护
5. 配置与兼容性
保留原有私聊配置:
新增配置仅为:
mean_position_ratioweibull_shapethought_modelthought_persona_prompt不再新增独立的
gate_settings配置区,也不保留:wait_minutesstickiness成本方面,每个私聊周期会增加一次心念调用;如果首次选择沉默,稍后最多再调用一次。可以通过专用低成本模型和精炼人格提示词控制 token 与调用成本。
使用场景
你希望该功能主要服务于哪个消息平台?
其他平台
其他平台名称(如选择“其他平台”请填写)
全平台。功能与适配器无关,但仅作用于私聊调度流程。
当前主要部署方式(可选)
uv 一键部署
补充说明(可选)
v1.2.4.fork1中完成实现和本地验证;compileall、增量静态检查和代码质量检查已通过;你愿意提交 PR 吗?
Code of Conduct