前言¶
在 DSH 里做课程类知识沉淀,常见的做法是:先用一个插件把视频的简介、字幕、弹幕抓下来生成 Markdown,再手动把内容整理成 Word,手动建一个新会话,手动把文件拖进去,还得自己记哪个视频漏了。这条链每一步都是人工搬运。
下面介绍的插件 dsh-course-notes 就是把这段搬运接上自动化:监视 dsh-video-coursemap 的检测结果,发现新视频就生成独立 Word,并自动投递到一个新的 DSH 会话,同时写一条项目长期记忆。插件由 sony6490 维护,分类为「工作流」。
它是纯宿主插件,不发检测请求、不抓数据,也不修改 dsh-video-coursemap 与 dsh-memory-evolve 的任何代码,不新建客户端界面。
这是什么¶
一句话定位:读取 dsh-video-coursemap 的检测结果,为每个新视频生成独立 Word 知识笔记并自动投递到一个新的 DSH 会话(摘要 + Word 文件卡),同时写入 dsh-memory-evolve 的项目记忆。
它不负责检测视频,也不负责抓字幕;检测与抓取全部由上游 dsh-video-coursemap 完成。本插件只做「监视 → 转换 → 起会话 → 投递 → 记记忆」这一段。
核心功能¶
工作链路如下:
浏览器 B 站视频(前台窗口)
│ dsh-video-coursemap 每 15s 观察前台窗口
▼
学科分类 + 抓取简介/字幕/弹幕/热评 → 学科 Markdown → 学习手册.docx
│ 落盘:<输出目录>/.state/state.json、.state/manuals/<学科>.md
▼
dsh-course-notes
├─ 监视 state.json,发现台账里没有的 (学科, 视频)
├─ 从学科 Markdown 抽出该视频章节 → scripts/md2docx.py → <学科>/<视频标题>.docx
├─ ctx.agents.create 新建标准会话(默认 Agent 预设 + 默认模型 + cwd=输出目录)
├─ attachments.saveFile(docx) → session.append 用户消息(摘要 + Word 文件块)
├─ sessionTitle.rename(会话标题「📚 视频标题」)
├─ workspaceRegistry 挂到「课程知识地图」项目分组
└─ memory 工具(dsh-memory-evolve,target=project)写一条课程笔记
几个直接和成本、可控性相关的点:
- 投递不触发模型回合,会话里直接出现摘要文字 + Word 文件卡,不额外消耗 token。
- 台账按「学科 + 标题」去重,已投递的视频不会重复生成和投递。
- 单个视频出错会自动重试,上限为 maxAttempts(默认 3)。
- coursemap 判定为非课程的内容(纯音乐、直播、新闻等)会被静默忽略,不建会话也不报错。
安装与启用¶
前置条件:DSH Desktop 已初始化 desktop profile,且已安装 dsh-video-coursemap 与 dsh-memory-evolve。
从代码目录安装:
cd path/to/dsh-course-notes
node scripts/install.mjs --dry-run # 预览
node scripts/install.mjs # 安装 / 更新
安装脚本做两件事:把插件复制到 C:/Users/<你>/.dsh/profiles/desktop/node_modules/dsh-course-notes(覆盖旧副本);幂等登记到 profile package.json 的 dsh.profile.bundles(首次会备份 package.json)。
从 GitHub 安装:
dsh plugin --profile desktop add github:sony6490/dsh-course-notes
dsh plugin add 只负责把包放进 profile。装完要确认 profile 的 package.json 里两处都在:
dependencies:"dsh-course-notes": "github:sony6490/dsh-course-notes"dsh.profile.bundles:数组里有一项"dsh-course-notes"
缺 dependencies 时,之后任何一次 pnpm install(例如用 dshmarket 装/卸别的插件)都会把这份副本当多余包删掉。README 提到本插件 2026-11 就踩过这个问题,安装脚本已改成同时写依赖与 bundles。
装完要完全退出并重启 DeepSeek Harness,宿主插件不热加载。重启后插件自动开始轮询,首次启动默认补投当前已有的视频。
典型用法:装完的验收¶
重启后在 DSH 里执行:
course_notes_status
course_notes_deliver { "title": "<某个已有视频标题>", "force": true }
期望结果:侧边栏「课程知识地图」分组下出现「📚 <视频标题>」会话,对话里是摘要文字 + Word 文件卡,点击可以打开或下载。
两个工具的分工:
course_notes_status:查看启用状态、输出目录、coursemap 状态、学科/视频数、已投递/待投递/失败、最近投递的会话与文档。course_notes_deliver:立即投递某个已在 coursemap 状态里的视频;缺省取最近处理的视频,force: true可重复投递。
配置¶
全部配置项可缺省。需要覆盖时在 profile 的 cordis.patch.yml 里按 id 覆盖:
- id: dsh-course-notes
config:
coursemapOutputDir: 'C:/Users/你的用户名/课程知识地图'
writeMemory: true
backfill: false
常用键与默认值:
| 键 | 默认 | 说明 |
|---|---|---|
| enabled | true | 总开关 |
| watchIntervalMs | 15000 | 扫描间隔(毫秒) |
| initialDelayMs | 20000 | 重启后首次扫描延迟 |
| coursemapOutputDir | C:/Users/<你>/课程知识地图 | 必须与 coursemap 的 outputDir 一致 |
| sessionCwd | null → 输出目录 | 新会话工作目录(决定项目记忆归属与左侧分组) |
| writeMemory | true | 是否写 dsh-memory-evolve 项目记忆 |
| backfill | true | 首次启动是否补投历史视频 |
| maxPerTick | 2 | 每轮最多投递数 |
| provider / model | null | 覆盖新会话模型;缺省跟 DSH 默认模型 |
| sessionTitlePrefix | 📚 | 会话标题前缀 |
| stateDir | C:/Users/<你>/.dsh/course-notes | 台账、日志、临时 Markdown |
| md2docxScript | <插件>/scripts/md2docx.py | Word 转换脚本 |
| python | null → 自动探测 | Python 解释器(需 python-docx) |
| maxAttempts | 3 | 单个视频自动重试上限 |
coursemapOutputDir 是容易出错的一项:这个值必须与 coursemap 的 outputDir 保持一致,否则 course_notes_status 会显示「coursemap 状态:未找到」。
状态与产物¶
安装完后的落盘位置:
- 台账:
<stateDir>/delivered.json,按学科+标题去重,记录 sessionId 与 docx。 - 日志:
<stateDir>/course-notes.log,每次投递/失败一行。 - 单视频 Word:
<输出目录>/<学科>/<视频标题>.docx。 - 学科学习手册:
<输出目录>/<学科>/学习手册.docx,由 coursemap 维护,不是本插件生成的。
排障可以先看日志:工具没出现,看是否完全重启 DSH、node_modules 下是否有 dsh-course-notes、profile bundles 是否登记;会话只有文字没有文件,看日志里的「生成单视频 Word 失败」,确认 python / python-docx 是否可用;会话没出现在项目分组,看日志里的「挂接工作区失败」,这不影响会话本身。
适用场景与注意¶
适合已经在用 dsh-video-coursemap 做视频学习沉淀、希望每个视频都有一份可下载 Word、并且能在独立会话里继续追问的人。它把「新视频 → Word → 新会话 → 项目记忆」这段手工流程串起来,代价是依赖上游两个插件的输出目录与 Markdown 结构约定。
插件以当前 DSH 进程的权限运行:它会读取 coursemap 的 state.json、写输出目录、创建会话、挂接工作区分组、写项目记忆。安装前建议先读一遍仓库源码,重点看 scripts/install.mjs 的写盘与 package.json 改写行为,以及 scripts/md2docx.py 在做什么。许可证是 MIT,其中 md2docx.py 来自 dsh-video-coursemap(MIT),文件头保留了原始来源说明,本插件只改了调用方式。
实际使用上的限制:检测能力继承 coursemap,只覆盖前台浏览器/视频客户端窗口,后台播放检测不到;新会话初始只有一条归档消息 + Word 卡,不会自动跑模型,用户可以在该会话里继续提问;若 coursemap 未来修改 Markdown 结构,章节抽取失败会降级使用学科学习手册 Word;插件升级需要重新执行 node scripts/install.mjs 并重启 DSH。
生态背景:DSH 的理念是「一切皆插件」,本插件通过社区目录分发。目录页是独立站点,与 DeepSeek / 幻方无官方从属关系,不是官方应用商店。当前目录页星标为 0,README 与源码是主要信息来源。
结尾¶
它的价值不在检测或抓取能力——那部分交给了 dsh-video-coursemap——而是把课程知识从 Markdown 到 Word、到会话、到项目记忆这件事的手工步骤接成了自动流程,并保证投递不额外消耗 token。代价是强依赖上游的状态文件格式与输出目录约定,装之前值得先确认这两者已经稳定。
目录页:https://www.skillhub.cn/plugins/sony6490/dsh-course-notes
仓库:https://github.com/sony6490/dsh-course-notes