READMESource: main@7a89091b
dsh-course-notes · 实时视频课程知识笔记
一个纯 DSH 宿主插件:把 dsh-video-coursemap 检测到的每个新视频课程,生成独立 Word 知识笔记,并自动投递到一个新的 DSH 会话对话框里;同时把知识要点写进 dsh-memory-evolve 的项目长期记忆。
- 不修改 dsh-video-coursemap / dsh-memory-evolve 的任何代码;
- 不新建客户端界面;
- 投递不触发模型回合(会话里直接出现摘要 + Word 文件卡,不额外消耗 token)。
工作方式
浏览器 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)写一条课程笔记
安装
要求: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)。
然后 完全退出并重启 DeepSeek Harness(宿主插件不热加载)。重启后插件自动开始轮询;首次启动默认补投当前已有的视频。
从 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 装/卸别的插件)都会把这份副本当多余包删掉——本插件 2026-11 就踩过,安装脚本已改成同时写依赖与 bundles。
工具
| 工具 | 说明 |
|---|---|
| course_notes_status | 查看启用状态、输出目录、coursemap 状态、学科/视频数、已投递/待投递/失败、最近投递的会话与文档 |
| course_notes_deliver | 立即投递某个已在 coursemap 状态里的视频;缺省取最近处理的视频;force=true 可重复投递 |
重启后验收:
course_notes_status
course_notes_deliver { "title": "<某个已有视频标题>", "force": true }
期望:侧边栏「课程知识地图」分组下出现「📚 <视频标题>」会话,对话里是摘要文字 + Word 文件卡,点击可打开/下载。
配置
全部可缺省。需要覆盖时在 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 | 单个视频自动重试上限 |
状态与产物
- 台账:/delivered.json(按 学科+标题 去重;记录 sessionId 与 docx)
- 日志:/course-notes.log(每次投递/失败一行)
- 单视频 Word:<输出目录>/<学科>/<视频标题>.docx
- 学科学习手册:<输出目录>/<学科>/学习手册.docx(由 coursemap 维护)
排障
| 现象 | 排查 |
|---|---|
| 工具没出现 | 是否完全重启 DSH;node_modules 下是否有 dsh-course-notes;profile bundles 是否登记 |
| status 显示「coursemap 状态:未找到」 | coursemap 是否启用、输出目录是否与 coursemapOutputDir 一致 |
| 会话出现但只有文字没有文件 | 见日志里的「生成单视频 Word 失败」;确认 python / python-docx 可用 |
| 会话没有出现在项目分组 | 日志里的「挂接工作区失败」;不影响会话本身 |
| 视频没被新会话 | 看日志「投递失败」;或 coursemap 判定为非课程(纯音乐/直播/新闻等会静默忽略) |
第三方代码
scripts/md2docx.py来自 dsh-video-coursemap(MIT),文件头保留了原始来源说明;本插件只改了调用方式。
限制
- 检测能力继承 coursemap:仅前台浏览器/视频客户端窗口,后台播放检测不到;
- 新会话初始只有一条归档消息 + Word 卡,不会自动跑模型;用户可以继续在该会话里提问;
- 若 coursemap 未来修改 Markdown 结构,章节抽取失败会降级用学科学习手册 Word;
- 插件升级:重新执行 node scripts/install.mjs 并重启 DSH。
No comments yet. Be the first to write one.