前言¶
在 DSH 里跑 Python,多数人靠聊天框里的代码块:改一个变量要重发一遍,输出散在多条消息里,图表没法回看。也有人用外部 JupyterLab,但上下文和工作区割开了。dsh-notebook-v2 走的是第三条路:把一个常驻内核的 notebook 面板塞进右栏,用 CodeMirror 6 编辑、SSE 流式输出、nb_* 工具驱动,目标是「在 DSH 里也有 VS Code Notebook 的手感」。
这是什么¶
这是 LearnItHard 维护的客户端类插件,定位是 DeepSeek Harness 的自研 Jupyter 前端。仓库在 GitHub,MIT 许可,要求 Node ≥ 20,适配 DSH Desktop 0.2.1-rc.x。它解决的是三件事:常驻内核、.ipynb 读写无损、以及把 AI 改写直接做进单元格里。目前社区目录里的星标只有 1 颗,属于起步阶段的小项目,功能面却铺得比较完整。
核心功能¶
先说清楚能力边界。它能做:常驻内核(变量跨格保留),流式输出(print 逐行往外冒,一万行只产生一个输出块),多标签同时开多个 notebook,.ipynb 的语义等价读写。
单元格分四种类型,每格左侧下拉切换:
代码:走 ipykernel,需要 Python 环境。Markdown:默认渲染,点一下进编辑,支持表格、公式、代码块、引用。Shell:独立子进程,cmd/bash/pwsh自动选,不需要 Python 内核。写成.ipynb后是带%%bash魔法行的标准 code 格,在 JupyterLab 和 VS Code 里仍然合法。Raw:原样保留。
输出渲染支持 text/html(沙箱 iframe 加高度回传)、图片、application/json 折叠树、text/latex(KaTeX)、markdown。超长输出只渲染「头 300 + 尾 100 + 展开按钮」,避免界面被刷屏。
大纲面板(≡ 大纲)列出 markdown 标题(按级别缩进,代码块里的 # 不算标题)加每格首行,点击跳转。宽度可拖、松手记住,双击分隔条复位 200px。markdown 格子如果首个非空行是标题(ATX 的 #…######,或 setext 的 === / ---),左侧出现 ▾,可以整节折叠,对齐 VS Code Notebook 的行为。折叠状态只活在当前面板里,切走会话或关掉标签就恢复展开,不落盘。
AI 侧有两个入口:
1、AI 补全 开关(默认关,会消耗 token)。停止输入约 0.5s 后,光标处出现灰色续写建议,Tab 接受、Esc 丢弃,一打字就作废。超时或失败静默处理。
2、AI 内联改写,快捷键 Mod-K。给一条指令,模型逐 token 流式返回,然后以行级 diff(+N −M)展示,Mod-↵ 接受、接受并运行、重试、Esc 拒绝。后端走宿主的 ctx.llm.stream(),provider/model 从 config.ai 读,留空就自动解析。
读写无损这一点值得单独说:读进来再写回是语义等价的,attachments、metadata.widgets、历史插件写入的 metadata.dsh,以及不认识的字段全部原样保留。所以拿它编辑已有 notebook,不会把你之前的附件和元数据吃掉。
明确不做的(v1 非目标):ipywidgets 交互、调试器、远程 / SLURM 内核、多人协作、Monaco 级类型检查。
安装与启用¶
官方给出的安装方式是脚本安装,没有用到包管理器:
git clone https://github.com/LearnItHard/dsh-notebook-v2.git
cd dsh-notebook-v2
node scripts/install.mjs
这一步把插件写进 profile。重启 DeepSeek Harness 或重载窗口后,右栏「+」里会出现 Notebook (v2)。
常用变体:
node scripts/install.mjs --profile <profile目录> # 装进别的 profile,默认 ~/.dsh/profiles/desktop
node scripts/install.mjs --dry-run # 先看它会改什么,不落盘
node scripts/uninstall.mjs # 卸载
脚本是幂等的,写之前会自动备份 profile 的 package.json。内核需要 ipykernel;没装 Python 也能用 Shell 格,走 bash / pwsh 子进程。
装完想快速验证,打开 docs/demo/demo.ipynb,点 ▶ 运行全部 就能看到上面这些效果。
典型用法¶
启动后先确认内核选对了。工具栏第 3 行的内核下拉是会话级的,切换会重启内核。没手动选时,插件按这个顺序自动挑:
config.python(cordis.patch.yml里填了就用它)python-env插件在本会话或父会话里选过的解释器- 扫本机 conda 环境,挑第一个真装了
ipykernel的 - 最后回落到
PATH上的python
下拉里没有你的环境,或者报 No module named 'ipykernel',就在那个环境里执行 pip install ipykernel,再回工具栏选中它。
想确认内核最终选了谁:
curl http://127.0.0.1:<port>/nb2/diagnostics
返回候选内核列表、各自是否装了 ipykernel、以及最终选中谁。
运行类操作都在编辑态快捷键里:Shift-Enter 运行并下移,Ctrl(-Alt)-Enter 运行,Alt-Enter 运行并插格,Mod-S 保存,Mod-F 查找。容器态下 Enter 进格、↑↓ 选格、Delete 删格、Esc 退出编辑。
适用场景与注意事项¶
适合需要在 DSH 里同时做探索、画图、审查模型输出的人,尤其是已经把 .ipynb 当工作草稿在维护的团队。Shell 格的存在让它在没有 Python 环境的机器上也能用,做纯命令行的快速验证。
三点需要留意:
1、并发冲突。@beihaizb/dsh-notebook 是第三方插件,本项目不依赖它,但两者的 nb_* 工具名完全相同,同时启用会重复注册同名工具。只能二选一。可以并存安装,只是不能同时启用。项目提供的脚本只改加载列表,不碰另一个插件的文件和数据:
node scripts/retire-old-plugin.mjs # 把旧插件从加载列表里去掉
node scripts/retire-old-plugin.mjs --rollback # 再装回加载列表
2、权限与信任。插件以当前 DSH 进程的权限运行,脚本会写 profile、改 package.json 加载列表。安装前建议先 --dry-run 看改动范围,并通读仓库代码与 MIT 许可证,确认接受再装。本项目是小团队维护的起步阶段项目,星标只有 1,遇到问题优先看仓库里的 AGENTS.md 和 docs/ 下的排障文档。
3、范围取舍。没有调试器和远程内核,如果你的工作流重度依赖 interactive widget 或 SLURM 批量调度,这个插件覆盖不了,仍然需要外部 JupyterLab。
小结¶
dsh-notebook-v2 的价值在于把「编辑、运行、看输出、让 AI 改代码」这几件事收进 DSH 右栏一个面板里,常驻内核和无损读写让它能直接接管现有的 .ipynb 草稿,而不只是聊天里的代码块。功能上它是自研实现,落地细节(SSE 流式、CodeMirror 6、nb_* 工具)都有对应文档可查。
插件目录页:https://www.skillhub.cn/plugins/LearnItHard/dsh-notebook-v2
仓库:https://github.com/LearnItHard/dsh-notebook-v2
协议文档:docs/api-nb2.md(端点契约)、docs/protocol-ndjson.md(sidecar 协议)