🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话自动命名 sumingwang233/dsh-auto-title

DeepSeek Harness
sumingwang2336 天前有提交已提供中文文档扫描:含敏感能力

首轮对话后按项目与任务自动生成可区分的会话标题

29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add sumingwang233/dsh-auto-title
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 6 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 13 处,展示前 13 条)
  • 发起网络请求
    lib/client.js:147
    void fetch('/dsh-auto-title/log', {
  • 发起网络请求
    lib/client.js:201
    const response = await fetch(path, {
  • 发起网络请求
    lib/client.js:210
    const getJson = async (path) => settle(await fetch(path, { headers: { accept: 'application/json' } }))
  • 写入剪贴板
    lib/client.js:555
    await navigator.clipboard.writeText(text)
  • 读取本地文件
    lib/log.js:51
    if (!existsSync(file)) return []
  • 读取本地文件
    lib/log.js:54
    text = readFileSync(file, 'utf8')
  • 写入本地文件
    lib/log.js:98
    appendFileSync(file, `${JSON.stringify(entry)}\n`, 'utf8')
  • 写入本地文件
    lib/log.js:101
    writeFileSync(file, `${kept}\n`, 'utf8')
  • 写入本地文件
    lib/log.js:150
    writeFileSync(file, '', 'utf8')
  • 读取本地文件
    lib/settings.js:72
    const text = await readFile(settingsPath(), 'utf8')
  • 写入本地文件
    lib/settings.js:89
    await writeFile(settingsPath(), `${JSON.stringify(merged, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/settings.js:98
    await writeFile(settingsPath(), '{}\n', 'utf8')
  • 读取本地文件
    lib/settings.js:108
    const info = await stat(settingsPath())
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 自动生成会话标题:用首条提示词加首条助手回复给会话命名,不再把提示词截断后塞进任务栏。

README

由 DeepSeek 最新模型翻译生成
dsh-auto-title 给 DeepSeek Harness 的会话自动起名:不再把你第一句话截断几个字塞进任务栏,而是等第一条助手回复结束后,用「项目|具体任务」的格式取一个真正能区分会话的标题。 (示意,非真实运行记录)改前(内置行为,截断首条提问) → 改后(本插件生成)帮我看看这个 pnpm 报错… → pnpm|lockfile 供应链校验报错排查再写一版 → 写作|把笔记改成一页纸说明那个 bug 修了吗 → debug|会话标题事件没触发 为什么需要它 内置的 session-title-llm 行在首条人类消息上就定型标题,内容基本等于把提问截断,于是 20 个会话里有 15 个长得一样,列表没法扫读。本插件换成在首轮对话结束后命名:它能同时看到「你要什么」和「最后做成了什么」,从而给出可分类的名字。 手动重命名(会话行的「…」菜单) 自动命名只管首轮。想给任意一条已有会话重新起名时,点会话行右侧的「…
展开完整文档(README 剩余 1 节)
dsh-auto-title

给 DeepSeek Harness 的会话自动起名:不再把你第一句话截断几个字塞进任务栏,而是等第一条助手回复结束后,用「项目|具体任务」的格式取一个真正能区分会话的标题。

(示意,非真实运行记录)改前(内置行为,截断首条提问) → 改后(本插件生成)帮我看看这个 pnpm 报错… → pnpm|lockfile 供应链校验报错排查再写一版 → 写作|把笔记改成一页纸说明那个 bug 修了吗 → debug|会话标题事件没触发

为什么需要它

内置的 session-title-llm 行在首条人类消息上就定型标题,内容基本等于把提问截断,于是 20 个会话里有 15 个长得一样,列表没法扫读。本插件换成在首轮对话结束后命名:它能同时看到「你要什么」和「最后做成了什么」,从而给出可分类的名字。

手动重命名(会话行的「…」菜单)

自动命名只管首轮。想给任意一条已有会话重新起名时,点会话行右侧的「…」菜单,里面会多出一行 AI 重命名(排在原生「重命名」之后):

1. 点它 → 读取该会话的首条人类提问与最近一次带文本的助手回复,走一次辅助模型调用,弹出对话框并预填建议标题;
2. 标题可编辑,回车或点「应用」提交,Esc / 「取消」放弃;
3. 提交走的是原生用户重命名(sessionTitle.rename,source.kind === 'user'),所以这个标题会被钉住,之后任何自动命名都不会覆盖它。

实现上分两半:客户端 bundle 注册菜单行与 shell.overlay 对话框,宿主注册两个同源 HTTP 路由(POST /dsh-auto-title/title 生成建议、POST /dsh-auto-title/apply 提交),因为菜单行拿不到宿主服务。会话未打开时会被自动 resume 后再改名。

失败会以本地化文案显示在对话框里:没有人类提问(422 empty-session)、会话从未跑过模型且没配 provider/model(409 no-route)、模型没给出可用标题(502 model-empty)。

标题怎么来的

1. 会话提交人类消息后(默认只在第一条),标题服务调用本插件;节奏由 automatic 决定。
2. 插件先等这轮对话的助手回复(带文本的 assistant/message,或 turn/end 的完成/超长原因;失败或超时则以空字符串继续),最多等 waitForReplyMs。
3. 把「人类请求 + 助手回复」一起交给一次辅助模型调用(不占用会话正文的上下文预算,也不会打断当前生成)。
4. 结果做规范化:去掉引号/空白、折叠换行、去句末标点、按 maxTitleLength 截断。
5. 以 { title, messageSeqs: [触发消息 seq], model } 交回标题服务;服务负责持久化并把新标题推给界面。

任一步失败(模型报错、超时、输出为空)都会抛出带 code 的错误,标题服务保持上一个标题不变——不会把会话改成空名字。

安装

dsh plugin add https://github.com/sumingwang233/dsh-auto-title

或在桌面端 设置 → 插件市场 → 添加插件,把同一个地址填进去。装完重启 DSH 桌面端(或重连该 profile)使新 bundle 生效。

本地开发时也可以直接从工作副本装:dsh plugin add <本目录绝对路径>。

本插件与内置的 session-title-llm 争用同一个槽位,所以它的 cordis.patch.yml 会先禁用内置行再插入自己——安装时你不需要改任何基础 bundle。

它会关掉内置的标题 provider

ctx.sessionTitle 只接受一个 provider(第二个注册会抛错)。内置的 session-title-llm 行在基础 bundle 里,所以本包的 cordis.patch.yml 先把它禁用,再插入自己:

- id: session-title-llm
disabled: true

- insert:
- id: auto-title
name: 'dsh-auto-title'

因此:

- 停用本插件 = 内置标题行为自动恢复,不需要改基础 bundle;
- 若你的 profile 里还有别的会话标题插件,两者会争抢同一个槽位,本插件会安静地不注册(日志 warn),不导致启动失败。

在桌面端使用

重启桌面端后,插件在两个地方出现:

1. 设置侧栏 →「dsh-auto-title」(设置页)

它是设置导航里的一级条目(和「内置插件」「邮件」并列),不在「插件」页里——桌面端这一版没有「插件」页。页面里可以改 enabled、provider、model、language、maxTitleLength、waitForReplyMs、timeoutMs,改完点保存立即生效(下一次命名就用新配置)。页面下方是最近事件日志:每次自动命名、每次手动 AI 重命名、每个失败原因都会记一行,可刷新、清空、一键复制——排查问题或提 issue 时直接贴这段。

日志同时镜像到 <插件目录>/log.jsonl(与 settings.json 同目录),即使设置页打不开也能用 cat 看到;也可以直接请求 GET /dsh-auto-title/log?limit=100。

2. 会话列表每一行的「…」菜单 →「AI 重命名」

点开后会先跑一次辅助模型,把「首条提问 + 最近几条对话」压成候选标题,在弹窗里给你改,确认后才写入。失败时弹窗直接显示原因(没有可用路由、没有人类提问、模型返回空、超时、HTTP 错误码)。

日志里常见的失败原因:

| 日志 | 含义 |
| this session has not called a model yet | 会话还没有模型路由,去卡片里填 provider / model |
| HTTP 500 + WebRoute | 客户端与主机版本不匹配(本仓库已修;旧 bundle 会这样) |
| 模型在输出上限(N tokens)内没有写出标题 | 推理占满了预算:加大 maxOutputTokens,或换一个非推理模型 |
| no provider / provider disabled | 卡片里关掉了自动命名,或 provider/model 只填了一个 |

配置

运行时配置(推荐,设置卡片写的就是它):<插件目录>/settings.json(本机即 ~/.dsh/profiles/desktop/node_modules/dsh-auto-title/settings.json;可用环境变量 DSH_AUTO_TITLE_SETTINGS 改到别处)。优先级最高,保存后下一次命名立即生效,无需重启。卡片上的「恢复默认」会把它清空,回到下面的加载期配置。

加载期配置(可选,用于在配置档里固化默认值):在配置档目录的 cordis.patch.yml 里(apply 在最后、能覆盖 bundle 层)追加覆盖行:

- id: auto-title
config:
language: zh
maxTitleLength: 20
waitForReplyMs: 90000

| 字段 | 默认 | 说明 |
| enabled | true | false = 只加载不注册(等价于停用,但保留包) |
| automatic | 'first-prompt' | 命名节奏:first-prompt = 只在首轮;all-prompts = 每条新消息都重命名(每条多一次小请求) |
| provider / model | '' | 留空 = 用会话自己的路由;填了就必须两个一起填 |
| language | 'auto' | auto / zh / en,决定提示词要求的标题语言 |
| maxTitleLength | 24 | 标题最大字符数(含中英文,按字符计) |
| maxInputChars | 6000 | 请求 + 回复拼进提示词时的总字符上限,超出按比例截断 |
| maxOutputTokens | 512 | 辅助调用输出上限。推理模型会先把预算花在推理上,给小了会「有推理、没标题」,所以留了余量(上限 8192) |
| waitForReplyMs | 120000 | 等首条助手回复的预算;到点就用「只有请求」命名 |
| timeoutMs | 30000 | 辅助模型调用自身的超时 |
| stopWords | [] | 标题里要去掉的词(大小写不敏感) |

配错类型会在加载时抛 TypeError(例如 maxTitleLength: "24"),行会以错误状态出现而不是静默忽略。取值范围:maxTitleLength 1–80,maxInputChars 1–20000,maxOutputTokens 1–8192,两个毫秒字段 1–600000。

验证

git clone https://github.com/sumingwang233/dsh-auto-title && cd dsh-auto-title
npm test # 49 个用例:core 规则 + host 装配/事件等待/流解析/命名节奏 + 手动改名路由 + 设置存储与配置/日志路由 + 客户端 bundle

真机验证(需要重启后):

1. 设置侧栏出现「dsh-auto-title」,页面能打开,provider/model 能保存;
2. 会话列表某行「…」→「AI 重命名」,弹窗出现候选标题,应用后列表标题变化;
3. 若弹窗报错,同一张卡片下方日志里能看到这次请求的失败原因与细节。

已知边界

- 默认只在首轮命名一次:automatic: 'first-prompt' 下后续大改需求不会自动改名(可手动重命名)。想让它跟着对话演进改名,设 automatic: 'all-prompts'——代价是每条新消息多一次小请求。
- 多一次模型调用:每条命中的消息多一次小请求(约几百 token 输入、≤512 token 输出)。不想付这个成本就把 enabled: false 或用便宜模型(provider/model)。
- 回复超过 waitForReplyMs 才出现时,会退化成「只看请求」命名——仍然是完整主题词,不是原始截断。
- 标题服务对同一个会话可能有并发/重试调用,本插件是纯函数式的(不做去重、不写存储),重复调用只会产生更新的标题。

卸载

桌面端 设置 → 插件市场 → 找到 dsh-auto-title → 卸载,或用 plugin_manager 工具 action: "remove_bundle"、target: "dsh-auto-title"。

从 dsh.profile.bundles 移除后,被禁用的 session-title-llm 重新生效,行为回到原生。

许可

MIT
预览分享卡片长什么样 ↓sumingwang233/dsh-auto-title
分享 · DeepSeek Harness Hub
sumingwang233/dsh-auto-title

首轮对话后按项目与任务自动生成可区分的会话标题

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部