xfgil/dsh-onebot-companion ↗★ 0
dsh-onebot-companion
One DSH plugin that gives a dsh-onebot-qq channel its manners back: outbound silence guard, per-turn behaviour rules, inbound coalescing plus outbound burst delivery, and a persona layer with mood, proactive talk and style learning. 适合需要优化QQ通道机器人回复礼仪、控制发言节奏和人设的用户。
설치
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:xfgil/dsh-onebot-companion配置
配置写在 profile 的 bundle 配置段里(宿主会把它透传给 apply(ctx, config))。
本插件刻意不导出 Config schema —— 沿用实测结论:profile 侧解析不到宿主的
schemastery,导出非 schema 对象会让 loader 投影 config 时报错。
dsh-onebot-companion:
enabled: true
packageName: dsh-onebot-qq # 要挂的 QQ 通道插件
profileDir: '' # 留空则多路自动探测
pollMs: 3000 # 补挂扫描周期;目标包被升级换目录后靠它自愈
stateFile: '' # 留空用 $DSH_HOME/onebot-companion/state.json
guard:
enabled: true
stripAside: true # 是否连「整行一对括号」的旁白一起剥
logHits: true
prompt:
enabled: true
rules: {} # 按 id 单独开关,如 { quarrel: false };缺省全开
firstStepOnly: true # 仅第一步注入(推荐);关掉会撑大上下文
sourceName: onebot-prompt
rhythm:
enabled: true
inbound:
enabled: true
quietMs: 8000 # 私聊安静窗口
groupQuietMs: 3000 # 群聊安静窗口
maxWaitMs: 30000 # 攒批硬上限
mentionPierces: true # 被 @ 立刻穿透
burst:
enabled: true
maxChars: 36 # 每条消息字数预算
maxChunks: 4 # 一次回复最多几条(尾巴折叠进最后一条)
delayMs: 300 # 分条基础停顿
perCharMs: 45 # 按上一条字数折算的打字时间
typing: true
persona:
enabled: true
mediaDir: '' # 情绪/风格状态目录;留空从 bridge 配置取
moodEnabled: true
styleEnabled: true
proactiveEnabled: true
moodDriftMinutes: 20
energyDecayPerHour: 7
nightRecoveryPerHour: 14
nightStartHour: 0
nightEndHour: 8
affinityDecayPerHour: 0.8
affinityGraceHours: 6
warmthBaseline: 30
warmthRegressPerHour: 10
warmthJitter: 8
proactiveChance: 0.45
proactiveMinMinutes: 25
proactiveMaxMinutes: 150
proactiveIdleMinutes: 20
proactiveMaxPerDay: 6
proactiveQuietStart: 1
proactiveQuietEnd: 8
# 「主动只对我,我才是管理员」——allowAllUsers: true 时陌生人也能私聊,
# 不设白名单她就会去主动搭话陌生人。写纯 QQ 号或完整 chatId 都认。
proactiveOnlyChats: []
voice:
enabled: true
program: python # 装了 edge-tts 的解释器(可写绝对路径)
voice: zh-CN-XiaoxiaoNeural # 音色,见上表
rate: -5% # 语速(edge-tts 语法)
pitch: -10Hz # 音调
maxChars: 120 # 每次最多念多少字
timeoutMs: 45000
retries: 3 # 偶发失败重试次数(含首次)
retryDelayMs: 800 # 重试退避基数
mediaDir: '' # 语音文件目录;留空用 config.mediaDir
packageName/profileDir会自动下发到五个模块段,不需要在每个段里重复写。
状态文件放在哪
| 文件 | 内容 | 位置 |
|---|---|---|
state.json | 本插件运行态(挂了哪些闸、扫了几次、命中多少) | $DSH_HOME/onebot-companion/ |
mood-state.json | 情绪四变量(每 chat 一条) | config.persona.mediaDir |
style-state.json | 风格画像(每 chat 一条) | config.persona.mediaDir |
media_*.mp3 | qq_say 合成的语音 | config.voice.mediaDir |
情绪与风格刻意不放在 state.json 里:mediaDir 是那批历史数据本来的家,
换插件/重写插件都能继承,亲密度和风格画像攒了几天的东西不该因为换插件清零。