dsh-ai-session-title
Identified★ 1AI-generated session titles for DeepSeek Harness: one-click generate inside the session rename dialog.
AI 会话标题
为 DeepSeek Harness(DSH)的会话重命名对话框加一个 AI 生成按钮:读取真实对话内容(以及你已经输入的草稿),让当前会话所用的模型写一个短标题,填进输入框——你确认后按「重命名」,不满意就继续改。
English | 中文
要求:dsh ≥ 0.2.1-rc.3、Node ≥ 20。
效果

- 打开任意会话自带的「重命名会话」对话框(侧栏
···→ 重命名会话)。 - 输入框内右侧、同一条边框里多一个星标按钮——不是新弹窗,就是原生那个框。
- 点一下:读取该会话的对话记录,连同你已输入的草稿一起作为参考,生成标题并填回输入框。
- 底部仍然是原生的「取消 / 重命名」;生成不会自己改名,必须你点确认。
安装
从 npm 安装(推荐)
dsh plugin --profile <你的 profile> add dsh-ai-session-title
然后重启 dsh web 并刷新页面。
自带
dsh的桌面版请在 App 内 设置 → 插件 里安装,不要用命令行——App 运行期间不会让 CLI 改写它自己的 profile。
从本仓库安装
plugin_manager install_bundle target = <本目录的绝对路径>
或者让 agent 用 plugin_manager 工具装。装完刷新 Web 界面。
从插件市场安装
市场读取的是 awesome-dsh-plugin 这份目录,而不是本仓库。目录收录之后,在 插件 → 发现 里搜索安装即可。
工作原理
一个包,两半:
| 半边 | 文件 | 作用 |
|---|---|---|
| Host | index.js | 注册全局命令 /ai-title。读会话事件日志、按下一次请求要用的路由(session.requestHeader().config,取不到时回退到最新一条助手消息)选模型,用 ctx.llm 以 purpose: 'session-title' 流式生成一条,清洗后返回。命令名后面的文本视为用户的草稿标题。 |
| Client | client.js | 监听原生对话框的会话名输入框,就地装饰一个星标按钮;点击后调用 ctx.remote.commands.execute(sessionId, '/ai-title <草稿>', []),把返回的标题用原生 input 事件写回该输入框。 |
两个实现细节值得说明:
- 为什么装饰 DOM 而不是注册插槽:原生对话框把目标会话存在组件内部 state 里,通过
shell.overlay渲染,内部没有暴露任何插槽,所以插件拿不到插入点,只能就地装饰它;会话 id 则通过输入框预填的标题在 Workspace Service 的会话列表里反查。 - 为什么走命令:客户端到 host 的 RPC 接口是构建期生成的,第三方 bundle 无法新增方法,命令是唯一稳定的调用通道。代价是每次生成会在会话流里留下一条
command/run+command/done记录——这也是生成过程中唯一的可见反馈。
配置项(可选)
在 profile 的 cordis.patch.yml 里给 ai-session-title 这一行加 config:
- id: ai-session-title
name: dsh-ai-session-title
config:
maxOutputTokens: 1024
| 键 | 含义 |
|---|---|
provider / model | 强制指定路由。要么都配、要么都不配;默认按下一次请求的路由,取不到再用最新一条助手消息的路由。 |
timeoutMs | 生成超时,默认 60000。 |
maxTitleChars | 标题字符上限,默认 30。 |
maxOutputTokens | 单次调用的输出预算,默认 1024。思考型模型如果先思考、把预算耗光才轮到你看到的标题,会报 max-tokens,把它调大即可。 |
兼容性
engines.dsh 声明为 ^0.2.1-rc.3。DSH 只按 engines.dsh 判断兼容性(没有该字段时才回退到 @deepseek-ai/dsh-* 的 peer 范围),插件市场的卡片上也会显示这个要求。
这个插件在运行时不导入任何 @deepseek-ai/* 包:host 半边只用 ctx.commands / ctx.llm,client 半边只用 ctx.remote 和 DOM API。好处是任何 profile 都不需要额外装依赖就能加载;代价是如果上游改了这些服务的签名或重命名对话框的结构,就需要跟着发新版本。
开发
npm test # host 半边的冒烟测试,不需要 harness、也不需要模型
client 半边没有构建步骤:client.js 按原样被加载。改完刷新 Web 界面即可(profile 里是 link: 安装,不用重装)。
目录结构
cordis.patch.yml 把行 id `ai-session-title` 插入为本包
index.js host 半边(命令 + 生成)
client.js client 半边(就地装饰 + 远程调用)
test/host.smoke.mjs host 半边冒烟测试(npm test)
locale/*.json 插件展示信息(标题 / 描述)
icon.svg 插件图标
screenshots.json 市场卡片用的截图声明
docs/screenshot.png 截图
常见问题
按钮没出现? 确认插件已启用、刷新过页面,且 dsh 版本满足 ^0.2.1-rc.3。
报「模型没有返回可用的标题」? 多数是思考型模型把输出预算全用在推理上,调大 maxOutputTokens。
报「无法确定要命名的会话」? 说明输入框里的标题在会话列表里匹配不到(例如同名的会话刚被改名)。先在侧栏打开该会话再试一次。
License
MIT,见 LICENSE。
Comments
Loading…