weifa860504-droid/dsh-greet-signoff ↗★ 0

dsh-greet-signoff

提供回复开场/收尾语自定义及上下文提示 适合需要统一回复格式并监控上下文 Token 占用的用户。

套件
dsh-greet-signoff
相容性
待驗證
版本
1.21.0
授權
MIT
最近更新
2026年9月20日

安裝

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:weifa860504-droid/dsh-greet-signoff

配置

行级可配项(开场、结束语各一套,共 19 项)

字段含义默认(开场 / 结束语)
text文案(写进回复正文,可含表情)👋 你好,我是 DeepSeek Harness 助手。 / ✅ 以上,随时叫我。
image / imageHeight自定义图片(≤300KB,PNG/JPEG/GIF/WebP)与高度空 / 22
fontSize字号 10–4014 / 14
fontWeight字重(400/500/600/700/800)600 / 600
color文字颜色(空=跟随主题)空 / 空
colorDark深色主题下的文字颜色(空=沿用 color)空 / 空
animation / animSpeed动效(30 种,含 4 种逐字)与倍速 1–4none / 1
shape / radius形状(10 种:pill/round/soft/rect/card/tag/underline/highlight/blockquote 等)与圆角 0–999none / 12
padY纵向内边距 0–245 / 5
fill / bgColor填充方式(none/faint/theme/solid)与背景色none / 空
bgColorDark / borderColorDark深色主题下的背景色 / 边框色(空=沿用浅色值)空 / 空
borderWidth / borderColor边框 0–6 与颜色0 / 空
shadow阴影(none/soft/medium/strong/glow)none / none
letterSpacing字距 −2…120 / 0
caps大小写(none/upper/lower)none / none
italic斜体false / false

允许值都有白名单,非法值会被自动回落到默认;未知字段会被丢弃。

全局可配项

字段含义默认
warnPercent黄色告警阈值(「占模型窗口」口径用)70
criticalPercent红色告警阈值(自动保证大于黄色)85
pricing计价口径:未命中输入 / 缓存命中输入 / 输出(元每百万)1 / 0.02 / 4
pool文案池:{ enabled, mode: "sequence" | "random", greeting: [], signOff: [] }关闭
scenes场景快照列表(每项是整份设置的快照,含文案、样式、阈值、池子)[]
bindings按工作区绑定(目录前缀 → 文案/样式覆盖)[]
matchMode固定行匹配方式:exact 逐字相同 / loose 宽松(忽略大小写、空白、全半角与首尾标点)/ fuzzy 近似容错loose
onlyAssistant只给助手的回复贴样式;false 时整段对话都贴true
legacyLines旧文案兼容表:[{ text, style: "greeting" | "signOff" }],最多 30 条,只影响页面渲染,不写进提示词[]

旧版本里的布尔字段 looseMatch 仍可读(false 等价于 matchMode: "exact")。

固定行是怎么被认出来的

设置页里写的那句开场语/收尾语会进提示段,模型照原样输出;页面上由浏览器半按文本比对给那一行贴样式类:

  • 三档匹配(设置 → 开场收尾 → 上下文提醒 → 匹配):
    • 逐字相同:只认归一化后完全相同的文本;
    • 宽松(默认):先去掉零宽字符、压缩空白,再做 Unicode NFKC(全角→半角)、把中文标点折叠成 ASCII(,→,、。→.)、去掉所有空白、削掉首尾的引号/括号/星号/井号与句读,并统一小写;
    • 近似容错:在宽松的基础上再算编辑距离,相似度 ≥ 86% 且长度差 ≤ 25% 才算命中(例如只差一个字、一个数字)。
  • 多行文案:文案里可以换行;如果宿主把换行渲染成两个段落,两段会依次比对、都贴上同一套样式。
  • 动态变量:{date} {year} {month} {day} {weekday} {daypart} {time} {model} {count} {elapsed} {tokens};宿主在写提示词时就解析成具体文字,页面渲染时按同一套规则解析(带 {daypart} 时页面会把所有时段都当作候选,正好跨过时段边界也不会掉样式)。
  • 只贴助手的回复(默认开):宿主给每个消息块打了 data-chat-flow-kind,用户消息、工具结果、思考面板一律跳过;认不出的宿主版本会退化成"整段都贴",不会整片失效。
  • 候选标签是 p / li / div / span / h1–h6 / code,因此模型偶尔把固定行写成 # 标题、**加粗** 或用反引号包起来也能命中;
  • 同一行同时命中外层与内层时只保留最外层;一条回复被工具调用拆成多个块时,按"文案身份"分配样式(命中开场文案=开场样式),只有两行文案其实是同一句时才退回按位置区分。

模型若把固定行整段改写(换词、多字少字),那就不再是"同一行",不会贴样式——这是有意的:宁可不动,也不能把正文里的普通句子误判成固定行。

进度条外观偏好(存浏览器本地,不进配置文件)

项说明
粗细进度条高度(px)
配色33 套,分 6 组:经典与自然、柔和粉彩、缤纷高饱和、冷色科技、浓郁对比、灰阶。每套由三个锚点色组成(安全色 / 黄阈值色 / 红阈值色),整条色带按两个阈值连续插值。默认只列常用 6 套,末尾「▾ 显示全部(33 套)」展开
小车31 款车型表情,或上传自定义图片(可翻转、可调大小与朝向)
时间显示默认开:⏱ 已聊 42 分 · 实测 ~1.8k tok/分,每 5 秒重算(页面在后台时不重算);拿不到读数时会标「上次读数 X 前」,不会让你以为进度条坏了
口径默认「按你的预算线」:100% = 你设的「必须换会话」线。切「占模型窗口」即回到旧口径(那个 24% 看着安全、其实早该换会话)
预算模式四档:日常 7.5 万/11 万、大任务 15 万/20 万、省着聊 5 万/7.5 万、自定义(用手填的两个数)。优先级:本会话临时档 > 全局默认档 > 内置默认
黄线 / 红线(自定义档)选「自定义」时生效的两个分界 token 数,默认 7.5 万 / 11 万。到黄线变黄 + 标题加 ⚠️;到红线整条变红 + 呼吸 + 红底大字横幅 🚨 该开新会话了 + 标题加 🚨
窗口窄时六格读数按 6 → 3 → 2 列自动回落;「紧凑 / 纯文字」形态把时间并进同一行文字

预算模式(=「大任务模式」)怎么用:小任务用「日常」,一次大改造/长调研切到「大任务」抬线,免得日常线一直报红、提醒变成噪音。三个入口:

  1. 进度条行里的 🎯 小胶囊(主入口):点一下按 日常 → 大任务 → 省着聊 → 跟随默认 轮转。 它改的是本会话临时档(存 gs.signoff.mode.,只存在你浏览器里),不动设置页里的默认档;开新会话即失效。
  2. 到线横幅上的按钮:红线横幅里多了「切大任务」(一键抬到 15 万/20 万)和「跟随默认预算」(清掉临时档),正好在"要不要开新会话"这个决策点上。
  3. 设置页「进度条外观 → 预算模式」:改的是全局默认档,一条命令管所有会话。

为什么默认不按"模型窗口"显示:分母用模型窗口(本机 100 万 tok)时,一条已经 24.9 万 tok、早该换会话的 会话在界面上只有 24%,看着很安全 —— 它回答的是"离塞满模型窗口还有多远",不是"离你该换会话还有多远"。 预算口径把 100% 定义成你自己的红线,超了就写"超 N 倍",并且配大横幅 + 标签页标题前缀, 不用读数字就知道该开新会话了。

「已聊多久 / 实测速率 / 到线约还有」是怎么来的(v1.20.0,都要真实数字,不做摆设):

  • 已聊多久 = 活跃时长:按会话 id 记账(存 gs.signoff.active.),每 5 秒心跳累加,两次间隔超过 5 分钟算断档、不累加 —— 合上电脑/去开会的时间不会被算进"已聊"。恢复一个旧会话从 0 起算;只有刚新建(创建时间距今 <30 分钟)的会话才用"创建到现在"当种子。
  • 实测速率:由宿主半从 session_projcache 的上下文时间线算 —— 45 分钟窗口内首末两点的 prompt 差 ÷ 时间差 (跨度不足 20 秒或没有增长时为 null);窗口内点不够就退回"最后两条"并标注来源。所以刚打开页面就有数, 不用先在这个标签页里盯出一串采样;浏览器半只在拿不到时有采样兜底。
  • 每轮涨量 / 到线约还有:按 turn 分组的"轮末 prompt 差"(跳过负值;DSH 会裁剪工具结果,所以末轮净增 ≤0 时取"轮内峰值 − 上一轮末"兜底)。 token 占用只在每轮请求结束后更新,所以这两格本质是"一轮跳一次"。
  • 不做外推:不预测"还能聊多少分钟"这类会被猜偏的数字;只报确实发生过的速率与按轮次的粗口径估算。

这些偏好存在浏览器 localStorage(键 gs.signoff.ui),按浏览器生效,不进全局配置。

花费与上下文(v1.20.0,全部读本机文件,不联网)

  • 进度条那行的 ≈¥0.42:本条会话累计花了多少钱。金额按计价口径算 (默认未命中输入 ¥1/M、缓存命中输入 ¥0.02/M、输出 ¥4/M,可在配置里改),数据来自本机上下文投影与 $DSH_HOME/dsh-usage/usage-ledger.json(两个时段桶都累加,并与台账自带金额对账)。 顺带记住这条:输出价是缓存读的 200 倍 —— 少让我啰嗦,比省那点上下文更省钱。
  • 「▸ 上下文构成」:点开列出系统提示词 / 工具定义 / 记忆注入 / 助手历史 / 工具结果各占多少 token 与占比; 按 token 降序、最多 12 条,超出并成「其它」,另有"最占地方的单个片段"top 6。前几名就是能砍的地方。 每一行有自己的颜色,红底横幅里也分得清。
  • 设置页「花费与上下文」:今天 / 近 7 天 / 最贵几条会话的台账,外加几个开关(显示花费、明细默认展开、 档位建议、到线系统通知)和「显示诊断分区」。
  • 档位建议:到线时按客观计数说一句"该抬线 / 该降档",按钮就在旁边 —— 只提示,不自动改档。
  • 到线系统通知:页面在后台也能收到;需在设置页打开,并向浏览器授权(拿不到权限会如实说明)。
  • 交接包:横幅上的「总结要点」要求把摘要落盘成工作区根目录的 HANDOFF.md(已有同名文件会先备份 .bak), 宿主半的提示段会在新会话开场时提示先读它 —— 换会话时上下文才真的带得过去。
  • 宿主半是旧版时:以上整段显示成"读不到",进度条本体照常工作,不会因为缺数据出问题。

接口与权限

webServer 注册的是同源接口:浏览器端用页面自身的登录态访问,因此你不需要手填 token。


### 进度条外观偏好(存浏览器本地,不进配置文件)

| 项 | 说明 |
| --- | --- |
| 粗细 | 进度条高度(px) |
| 配色 | **33 套**,分 6 组:经典与自然、柔和粉彩、缤纷高饱和、冷色科技、浓郁对比、灰阶。每套由三个锚点色组成(安全色 / 黄阈值色 / 红阈值色),整条色带按两个阈值连续插值。默认只列常用 6 套,末尾「▾ 显示全部(33 套)」展开 |
| 小车 | 31 款车型表情,或上传自定义图片(可翻转、可调大小与朝向) |
| 时间显示 | 默认开:`⏱ 已聊 42 分 · 实测 ~1.8k tok/分`,每 5 秒重算(页面在后台时不重算);拿不到读数时会标「上次读数 X 前」,不会让你以为进度条坏了 |
| 口径 | **默认「按你的预算线」**:100% = 你设的「必须换会话」线。切「占模型窗口」即回到旧口径(那个 24% 看着安全、其实早该换会话) |
| 预算模式 | **四档**:`日常` 7.5 万/11 万、`大任务` 15 万/20 万、`省着聊` 5 万/7.5 万、`自定义`(用手填的两个数)。优先级:**本会话临时档 > 全局默认档 > 内置默认** |
| 黄线 / 红线(自定义档) | 选「自定义」时生效的两个分界 token 数,默认 **7.5 万 / 11 万**。到黄线变黄 + 标题加 `⚠️`;到红线整条变红 + 呼吸 + 红底大字横幅 `🚨 该开新会话了` + 标题加 `🚨` |
| 窗口窄时 | 六格读数按 6 → 3 → 2 列自动回落;「紧凑 / 纯文字」形态把时间并进同一行文字 |

**预算模式(=「大任务模式」)怎么用**:小任务用「日常」,一次大改造/长调研切到「大任务」抬线,免得日常线一直报红、提醒变成噪音。三个入口:

1. **进度条行里的 `🎯` 小胶囊**(主入口):点一下按 `日常 → 大任务 → 省着聊 → 跟随默认` 轮转。
   它改的是**本会话临时档**(存 `gs.signoff.mode.`,只存在你浏览器里),不动设置页里的默认档;开新会话即失效。
2. **到线横幅上的按钮**:红线横幅里多了「切大任务」(一键抬到 15 万/20 万)和「跟随默认预算」(清掉临时档),正好在"要不要开新会话"这个决策点上。
3. **设置页**「进度条外观 → 预算模式」:改的是**全局默认档**,一条命令管所有会话。

**为什么默认不按"模型窗口"显示**:分母用模型窗口(本机 100 万 tok)时,一条已经 24.9 万 tok、早该换会话的
会话在界面上只有 24%,看着很安全 —— 它回答的是"离塞满模型窗口还有多远",不是"离你该换会话还有多远"。
预算口径把 100% 定义成**你自己的红线**,超了就写"超 N 倍",并且配大横幅 + 标签页标题前缀,
**不用读数字就知道该开新会话了**。

**「已聊多久 / 实测速率 / 到线约还有」是怎么来的**(v1.20.0,都要真实数字,不做摆设):

- **已聊多久 = 活跃时长**:按会话 id 记账(存 `gs.signoff.active.`),每 5 秒心跳累加,**两次间隔超过 5 分钟算断档、不累加** ——
  合上电脑/去开会的时间不会被算进"已聊"。恢复一个旧会话从 0 起算;只有刚新建(创建时间距今 <30 分钟)的会话才用"创建到现在"当种子。
- **实测速率**:由**宿主半**从 `session_projcache` 的上下文时间线算 —— 45 分钟窗口内首末两点的 prompt 差 ÷ 时间差
  (跨度不足 20 秒或没有增长时为 `null`);窗口内点不够就退回"最后两条"并标注来源。所以**刚打开页面就有数**,
  不用先在这个标签页里盯出一串采样;浏览器半只在拿不到时有采样兜底。
- **每轮涨量 / 到线约还有**:按 turn 分组的"轮末 prompt 差"(跳过负值;DSH 会裁剪工具结果,所以末轮净增 ≤0 时取"轮内峰值 − 上一轮末"兜底)。
  token 占用只在每轮请求结束后更新,所以这两格本质是"**一轮跳一次**"。
- **不做外推**:不预测"还能聊多少分钟"这类会被猜偏的数字;只报确实发生过的速率与按轮次的粗口径估算。

这些偏好存在浏览器 `localStorage`(键 `gs.signoff.ui`),按浏览器生效,不进全局配置。

# 读配置真值(loopback 本机访问免 token;从别处访问需带页面的 Authorization)
curl http://127.0.0.1:3080/api/greet-signoff

# 写整份配置(JSON,字段同上)
curl -X POST -H "Content-Type: application/json" \
     --data @greet-signoff.json http://127.0.0.1:3080/api/greet-signoff