dsh-course-assistant
把课程文件(PPTX、PDF、DOCX、Markdown)解析成目录、带原文引证的分章要点、B 站网课推荐与考纲覆盖检查,并可导出 Anki 卡片和 JSON。
安装
dsh plugin --profile web add dsh-course-assistant
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
课程助手 · 课程文件 → 目录 · 知识点 · B 站网课 · 学习报告
DeepSeek Harness 插件(bundle)。把课程文件拖进面板,自动识别章节目录,逐章生成知识点/重点/难点,
检索 B 站配套网课,最后输出一份 Markdown 学习报告(可导出 PDF),报告末尾固定附 B 站网课列表。
- 完整页面:左侧栏「课程助手」图标(
main槽位,keycourse-assistant) - 常驻入口:输入框下方 dock 的一行「🎓 课程助手 · 打开面板 →」(
conversation.composer.dock) - 给 Agent 的 Tool:
course_assistant(analyze/status/library)
界面
区域 · 内容
拖拽区 · 拖入或点击选择,支持 .pptx .pdf .docx .md .txt,一次最多 12 个(单文件 ≤60MB)
选项 · 「检索 B 站网课」可关闭(关掉后不产生任何站外请求);「报告模式:Normal / MAX」切换报告能力
进度 · 解析 → 识别目录 → 逐章总结(边出边显示)/ 并行检索 → 生成总结 → 报告
标签页 · 知识点(每章要点、⭐重点、⚠️难点、关键词)· 目录 · B 站网课 · 报告(渲染 + 下载 MD/PDF/复制)
报告格式
严格按需求给定的结构:
# 《课程名》学习报告 > 生成时间 / 来源文件 / 章节数 / 总结模型 ## 一、课程目录 ## 二、各章知识点 ### 第 N 章 … - 要点 / - ⭐ 重点 / - ⚠️ 难点 / - 关键词 ## 三、课程总结 (≤300 字) ## 附录:B 站相关网课推荐 ### A. 系列课程推荐 序号 | 标题 | UP 主 | 播放量 | 时长/集数 | 链接 ### B. 分章节视频推荐 章节 | 标题 | UP 主 | 播放量 | 时长 | 链接
附录不会为空:检索被风控或没有相关结果时,该行退化为
https://search.bilibili.com/all?keyword=<URL编码关键词> 搜索入口。
1.15.0 新增:标题与目录整修(诊断 → 修复)
目录偏差不是模型的问题,是分章前的本地结构识别。六个真实课件里五个能复现:
课程名变成「幻灯片 1」、章名是 cat / fruit ptrfrui / class B : public A 这种碎片、
67 页课件被切成固定 5 页一章、表格行被当成章节。这一版按诊断报告(docs/title-outline-plan.md)修:
环节 · 改动
标题卫生(core/titles.js) · 去「幻灯片 N:」前缀与「(投入 12% 时间)」注解;titleScore 否决纯数字(8.0)、代码行、邮箱/URL、以标点开头的截断句、带逗号的长句;页面标题按「占位符 > 最大字号 > 正文前 8 行」打分择优,重复面包屑(课程导读)自动降权
分章边界 · 无节/无编号的课件改为按页标题变化切(当前章 ≥1200 字才开新章、<500 字并回上一章,越界退回定长切块);§ 编号 与章节编号仍然优先;PDF 文本里的「文件名 ↔ 第 N 章」表格行不再当章节;Markdown/docx 的正文不再套用 PDF 的表格启发式
课程名 · 新增候选链:文件名 → PDF 书签 → 首个合格页标题 → 章节标题;拒绝「幻灯片 N」「前言」「目录」与「第 N 章 …」(多章文件里那是章节名)
模型标题 · 章节摘要提示词 v6 顺带返回 title(零额外调用);只覆盖启发式章名,作者编号(第 N 章)、PowerPoint 节、§ 编号 一律不动;模型给出重名时用该章关键词消歧。可用 chapterTitles: 'rules' 关掉
报告呈现 · 目录子标题过质量分(pu、10.1× 不再出现)、去重、每章最多 4 条,空时用关键词兜底;标题自带编号时不再重复加「第 N 章」;报告头加一行「目录自检」
实测(同一批文件):
文件 · 之前 · 之后
L10_C08_多态与虚函数.pdf · 课程名「幻灯片 1」,章名 第 1 部分 / fruit ptrfrui / class B : public A · 课程名 L10_C08_多态与虚函数,7 章:第 8 章多态与虚函数 / 正确理解虚函数 / …
L12_C10_异常与断言.pdf · 9 章碎片(异常、cat、QUE 对象析) · 7 章,首章 第 10 章异常与断言;有模型时章名改由摘要调用给出
实验1-高质量编程基础.pptx · 13 章固定 5 页块,课程导读 撞名 3 次 · 14 章按标题变化:课程实训案例引导 / 减少符号依赖 / 测试防护网:正交分解法 / git常用命令 …
关上800美元…pptx · 10 章(§ 01 制度背景…) · 逐字不变(作者编号受保护,单测守门)
计算机系统基础 复习&自学大纲.pdf · 11 章乱序、第 2 章/第 8 章 各出现两次 · 10 章按原顺序,无重复
C++程序设计课程复习讲义.docx · 课程名「前言与使用说明」 · 课程名取文件名
配置新增 chapterTitles(auto 默认 / rules 只用本地规则)。
1.14.0 新增:Normal / MAX 两档报告能力(复习资料版)
面板上多了 「报告模式:Normal | MAX」 两档(配置项 reportLevel):
· Normal · MAX
报告形态 · 每章 3-6 条要点 + 重点/难点/关键词 · 复习资料:模块 → 知识点(K)→ 实例(E)→ 习题(Q)+ 参考答案
每章读到的原文 · 3600 字 · 8000 字
每章输出预算 · ~2600 token · 8192 token
额外调用 · — · 全课程复习框架(主题/学习目标/总结),共 +1 次
耗时 · 基准 · 约 2-3 倍
MAX 就是上一版的「复习资料版」,现在改成正式的档位选择;reportLevel 默认 normal,
老的 reportStyle: 'brief' | 'review' 仍可作为请求参数兼容(review = max)。
报告的章节结构:
结构 · 内容
复习框架(报告开头) · 已读取的文件与可读范围 / 课程主题与学习目标 / 章节目录与课件页范围 / 章间依赖 / 建议复习顺序 / 待确认与资料缺口
每章 · 本章概览 → 模块与知识点(K1.1 编号)→ 课件实例(E1.1)→ 自测题(Q1.1)→ 参考答案 → 本章小结
知识点 · 定义/结论、通俗解释、关键条件、掌握要求(记忆/理解/应用)、公式与用法、知识联系、常见误区
来源 · 每个知识点与实例都带〔原文 / 整理 / 补充 / 待确认〕标签 + 「文件名—第 X 页」;页码越界会被标成「不在本章范围,待确认」
实例 · 背景 → 对应知识点 → 要说明什么 → 分析步骤 → 结论 → 可迁移方法 → 易错点
习题 · 先题目后答案(便于自测);课件没给答案时写「课件未给答案」;模型自己求解的标「参考解答,非课件原答案」
实现要点:
core/review.js:复习资料的 JSON 契约与解析(parseReview),把 K 点折算成旧版要点,
使证据核对、覆盖率审计、关键词与 B 站检索照旧工作;reviewStats 出「N 个知识点 / M 个实例 / K 道习题」。
1.13.1 起来源按需求写成「文件名—第 X 页」,单份课件才有页码。
core/summarize.js:summarizeChapterReview(maxTokens 8192,重试只加不减)+summarizeCourseReview
(课程主题/目标/总结一次调用)。
- 页码不是猜的:单文件时给模型的是带
【第 N 页】标记的原文,解析时按本章页范围校验;
多文件(页码会串)时提示词明确禁止写页码。
- 拿不到复习结构(模型回包被截断/不可解析)时,该章自动退回普通要点摘要并在报告里注明,不会消失。
core/json-repair.js抽出共享的 JSON 修复(截断回包救回已写好的部分)。
成本:MAX 每章输出约为 Normal 的 3-5 倍,maxTokens 固定 8192、原文窗口 8000 字;用 MAX thinking 模型时
推理 token 也吃这份预算,章节多时整体耗时明显上升。reportLevel 默认仍是 normal。
1.12.0 新增:页级 OCR 分诊(只读读不出来的那几页)
以前 OCR 是整份开关:ocr: true 重读全文,默认一页不读。现在解析后先给每页文本层打分
(字数 / 可疑字符率 / 成词率),只把「没有文字 / 只有几个字 / 字形乱码」的页交给 OCR:
- 实测
L12_C10_异常与断言.pdf(67 页 C++ 讲义):只读 26 页、约 7 秒,25 页换成 OCR 文本,
正文 5 502 → 8 214 字,成词率 0.80,空页 0%。
- 多数页没有文本层时判定为扫描件,自动整份重读(以前只会报「疑似扫描版」然后给空报告)。
ocrMaxPages之外的页不再静默漏掉,报告里会写「还有 N 页超出 OCR 上限」。- 每页择优:OCR 结果和文本层各自打分,可读的页不会被 OCR 覆盖,只有空页/乱码页才替换;
页面标题与 (p.12) 回链都用真实页号。
同时修掉三个静默 bug(都是"报成功、其实没干活"):
问题 · 影响 · 修法
prepareDocs 引用了不存在的 options · 1.11.1 起幻灯片图片 OCR 从未真正执行,只在警告里留一行「图片 OCR 失败」 · python 路径从 OCR 配置一路传到引擎;识别逻辑抽成 readImageTexts()
store.readOcr() 只认 {pages} 负载 · 图片 OCR 缓存从未命中,每次重跑都重新识别 · 返回完整负载,页面/图片两种缓存都能读
只有图片的页被整页丢弃 · L12 实际 67 页,之前只解析出 54 页(13 页纯图片幻灯片从未进过报告),之后的页码还全部错位 · 有图即内容,保留该页且不压缩页号;pptx 按 p:sldIdLst 真实顺序编号
配置新增 ocrMode(auto/all/off)与 ocrPick(first/best);ocrPick: best 会用第二个
引擎复读低分页再取高分(耗时翻倍,默认关)。两个引擎都支持按页读取(ocr.ps1 -Pages、
rapidocr.py --pages),RapidOCR 还会逐页报置信度。
1.6.0 – 1.11.1 新增(此前没写进 README 的部分)
版本 · 新增
1.6.0 · 概念 DAG(成环/跨章反向边直接拒绝)+ 确定性调度(失败分类 + 重试阶梯 + AUTH 不再逐章重试)+ 报告思维导图 + 离线 HTML 看板 + 同参数任务去重
1.6.1 · 历史面板(最近 100 条,点开即渲染)
1.7.0 · 幻灯片内嵌图片 OCR:a:blip → rels → ppt/media,按图片 sha 缓存;小图标/分隔线自动跳过
1.8.0 · 分节保底选段(每小节至少留一段)+ 覆盖率审计(报告头写「要点覆盖 7/9 节,未覆盖:…」)
1.9.0 · 概念必须有原文依据(命中不了直接丢弃)+ coverage: thorough 逐节摘要
1.10.0 · 关键词四源融合:模型 / 标题 / 本章 TF-IDF / 英文缩写(IEEE754、x86-64 不会被长度规则丢掉)
1.11.0 · OCR 预处理(短边放大、深色图才反色)+ 文本后处理(拆词合并、偏旁合并、全角转半角)+ CER 基准 4 张图:平均 9.9% → 1.1%
1.11.1 · RapidOCR 图片通道跑通(与 Windows OCR 在基准图上 CER 持平)
同一时期还有:要点带页码回链、BM25 课件问答(ask)、考纲覆盖对照(coverage)、
B 站分 P 精确到集、Anki CSV 与 course.json 导出、报告保留 90 天 + 删除接口。
1.2.0 新增:读不准时的处理
质量闸门(解析后立即算,纯本地)——四项指标:每页
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:17,最后更新 2026-10-31