READMESource: main@00d69687
dsh-suggest-reply
帮我想想 —— 一个 DSH Web 插件:在侧边栏里,用你自己写的 system prompt 对「主对话最新一条 AI 回复」生成候选回复(JSON 风格列表),点结果直填主对话输入框。
基于 dsh-better-sidebar 的 ctx.betterSidebar.registerTab 注册一个侧边栏 tab(帮我想想)。
特性
- 三个输入框,prompt 完全由你掌控:
- 系统提示(必填) —— 设定 AI 的身份、任务与风格输出格式(插件原样透传,无内置模板);
- 主对话最新消息(必填) —— 自动读取当前会话最新一条已完成的 AI 回复(面板打开期间每 2s 轮询保持最新,手动编辑则暂停刷新不覆盖),也可手改;
- 导演要求(可选) —— 故事走向锚点,置于最新消息之前作为用户消息。
- 单次调用,无重试:每次点生成 = 一次 off-loop 补全;模型返回什么就解析什么,部分输出直接呈现(缺的风格你自己决定下一步),不自动补全。
- 动态结果行:从模型 JSON 中解析出
[{style, text}]动态渲染(无固定风格名单、无 checkbox);点击结果文本直填主对话输入框(composer 不可用时降级复制)。 - 采样参数 + 持久存储:可折叠的采样参数区(温度 / 输出上限 / 推理强度 / 停止序列)透传给模型 —— 即 harness LLM 服务支持的全部采样面;系统提示、采样参数与面板 textarea 高度自动持久化到 DSH 设置(
suggestreply命名空间 → settings.yaml),防抖自动保存(600ms),刷新不丢。settings 服务缺失时插件照常工作(只是不持久化)。 - 与主会话完全独立:不创建 / 不 fork / 不写任何会话日志,主会话零痕迹;每次生成都是一轮新的,不继承任何上下文。
- 流式调试(实时思考流):生成期间面板实时滚动 AI 的思考流(reasoning)与结果原文 —— 主对话同款体验,生成过程不再「一片空白」;完成后折叠区保留完整记录(含思考)。
- 调试信息:每次生成(成功或失败)后,面板底部折叠区展示本次调用的完整 system prompt、用户消息、思考流、模型原始输出与解析结果 —— 排查 prompt 问题零成本直查。
- 双语:界面文案 zh / en(跟随浏览器语言)。
前置依赖(必装)
dsh-better-sidebar 必须安装(未安装时本插件不激活,无任何 UI/行为),需 0.14.0+:
dsh plugin --profile web add dsh-better-sidebar@latest
安装
# 本地路径
dsh plugin --profile web add <本仓库路径>
# 或发布后
dsh plugin --profile web add dsh-suggest-reply
装完硬刷新浏览器(Cmd/Ctrl+Shift+R)即可看到侧边栏「+」菜单里的「帮我想想」tab(client 改动无需重启 DSH)。
安装到已运行的 profile(例如主 GUI 的 3080)
以主 profile(web,常跑在 3080 端口)为例:
# 0. 确认 better-sidebar 已装(本插件的硬前置,未装先执行上面的前置依赖步骤)
# 1. 装插件(自动追加到 profile 的 bundles + link 依赖)
dsh plugin --profile web add <本仓库路径>
# 2. 重启承载该 profile 的 dsh web 进程(host 半的路由只在启动时加载)
# PM2 管理的话:
pm2 restart dsh-web
# 非 PM2 则重启你原来的启动命令
# 3. 硬刷新浏览器(Cmd/Ctrl+Shift+R),侧边栏「+」菜单出现「帮我想想」
⚠️ 第 2 步会短暂断连正在使用该 profile 的 Web GUI(页面加载中断,服务起来后刷新即可;会话数据持久,不丢失)。若只想验证 client 半(tab 出现/面板渲染),client 改动硬刷新即可生效;但生成候选依赖 host 路由,host 半未重启前
/suggestreply/api会 404。
使用
- 在侧边栏「+」菜单打开「帮我想想」tab。
- 在系统提示框写你的 prompt:AI 身份 + 任务 + 风格输出格式(模型只会看到你写的东西,务必包含 JSON 输出格式要求,如
只输出 JSON {"candidates":[{"style":"风格名","text":"…"}]})。 - 主对话最新消息框已自动填入当前会话最新一条 AI 回复;如需手动调整直接改。
- (可选)在导演要求框填故事走向锚点,会放在最新消息之前作为用户消息。
- 点「生成候选回复」—— 一次调用,结果按模型输出顺序动态列出(风格标签 + 文本)。
- 点任意结果文本,直接填入主对话输入框,回车发送即可(composer 不可用时自动降级为复制)。
- 模型没出全/出错了?展开底部「调试信息」看原始输出,改你的 system prompt 后再试 —— 没有自动重试,一切由你控制。
工作原理
client (better-sidebar tab) host (/suggestreply/api)
┌──────────────────────────┐ POST latest ┌──────────────────────────────┐
│ SuggestPanel │ ───────────────▶ │ latest: readSurface(sessionId)│
│ 系统提示(必填,用户写) │ ◀─────────────── │ → 回扫最新 assistant/message │
│ 主对话最新消息(自动填充) │ { text } └──────────────────────────────┘
│ 导演要求(可选) │ POST candidates┌──────────────────────────────┐
│ 生成按钮 │ ──SSE 流式────▶ │ candidates (event-stream): │
│ 实时思考流/原文(生成中) │ { sessionId, │ reasoning/text delta 实时推送 │
│ 动态结果行(点击填入输入框) │ system, │ → 结束 result/error 事件 │
└──────────────────────────┘ directorHint,│ 解析(JSON→salvage) 去重(按风格)│
provider, │ { candidates, debug(含思考) } │
model } │ │
- 台词来源:最新消息框未被手动修改时,生成请求不携带该文本 —— host 每次现读会话日志,保证用的是最新一条(硬回退方案:编辑过则你的内容为硬输入)。
- 必填校验:system prompt 与最新消息均不得为空(host
bad-request/no-assistant-reply硬错误;面板按钮在任一为空时禁用)。 - 单次调用:无重试机制 —— 模型输出解析一次;解析失败或输出为空时返回明确错误(带调试现场),由你调整 prompt 后重试。
- 采样与持久化:温度 / 输出上限 / 推理强度 / 停止序列 = harness
GenerateOptions的全部采样面;payload 合法值优先、配置兜底(resolveSampling,非法值永不达模型)。配置经 DSH settings 服务读写(schemastery schema + revision 乐观锁,冲突 409),config.get/config.update两个 API 方法。 - 解析容错:剥 markdown 围栏 → 整体
JSON.parse;截断时退到正则 salvage 扫描,容忍结尾引号缺失;按风格去重(先到先得)。 - 模型渠道:用当前会话的模型(客户端
sessions.models解析,host 校验必填)。
开发
corepack pnpm install # pnpm 11.7.0(packageManager 固定)
corepack pnpm typecheck
corepack pnpm test # vitest 纯函数单测
corepack pnpm build # tsc 声明 + tsdown 双产物(lib/index.js + lib/client.js)
已知限制与后续
- 无内置 prompt 模板:系统提示完全由用户撰写 —— 插件只透传;之前内置模板提供的「身份不串」「风格互斥」等防护随之成为用户 prompt 的责任(调试模式兜底)。
- 采样面即 harness 面:只有温度 / 输出上限 / 推理强度 / 停止序列 4 个;top_p / penalty / seed 不在统一 LLM 服务里,不走旁路。
- 语言跟随:当前按浏览器语言切 zh/en;跟随 DSH 设置里
locale.preference(locale service)是后续项。 - 直填是替换语义:点结果会覆盖输入框当前草稿;composer 服务缺失的部署降级为剪贴板复制。
- 免 DSH 源码:全程只消费 DSH 公开服务(webServer / sessionQuery / llm / connection)+ better-sidebar 服务,零官方源码改动。
License
MIT
No comments yet. Be the first to write one.