Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 50 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

**English**: [README_EN.md](README_EN.md)

[DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness) 插件:**论文伴读工作台** —— 文献库 + PDF 阅读器 + AI 伴读,回答自带页码、点页码跳回原文。当前版本 **v1.4.1**。
[DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness) 插件:**论文伴读工作台** —— 文献库 + PDF 阅读器 + AI 伴读,回答自带页码、点页码跳回原文。当前版本 **v1.5.0**。

> 💬 **QQ 交流群:1127244508** —— 安装/使用问题、功能建议、bug 反馈都欢迎来聊。

Expand All @@ -24,6 +24,8 @@
- 🤖 **教练式带读**:paper 会话自动用专用 preset——定分步阅读计划、逐节指导、出题批改,学习进度跨会话累积
- 🀄 **中文版**:原文 ↔ 纯中文原地切换(babeldoc 零预装,自动安装),译文 PDF 一键导出(纯中文 / 中英对照)
- 🗂️ **文献管理**:专题/论文改名、删除(删除前列文件清单、进回收站**可恢复**、非空专题批量清空一次确认)
- 🈯 **划词翻译(公式保留)**(v1.5.0):阅读器里选中正文 → 提问气泡上多一个 **「译」** 按钮 → 弹出**只显示译文**的气泡(**没有**「插入会话」「复制」按钮,也从不自动写剪贴板)。**选区含公式时**,用 MinerU 识别出的 LaTeX 替换 PDF 文本层里的乱码公式,并要求模型**原样保留**公式(`$…$` 里的内容不翻译、不改写)。**前提与代价**:① 需先配置翻译端点(与生成中文版用的是同一份配置;未配置时点「译」会直接弹设置表单,保存后自动重试);② **公式保留要求该论文用 MinerU 转录过**——没有产物时**降级为普通翻译**,公式在文本层里本就不读,气泡会**如实提示「译文可能不准」**(这是设计,不是缺陷)
- 🖥️ **中英分屏对照(两种模式,可切换)**(v1.5.0):顶栏新增 **「对照」** 与 **「分屏」** 两个按钮,随时切换、再点一次回原文,选择按文献记忆。**模式 A「对照」** 直接看 babeldoc 的 `-dual.pdf`(原文与译文并排画在同一张加宽页面上,自动适宽);**模式 B「分屏」** 左原文、右中文版,两列**同步滚动**(同页号 + 页内比例)。**前提与代价**:模式 A 需要 `-dual.pdf`、模式 B 需要 `-zh.pdf`,两者都要先用 babeldoc 生成(顶栏「中」一键触发,**首次约几分钟**,且需要翻译端点);**没有对应产物时按钮置灰并说明**;分屏需要面板宽度 ≥640px,太窄会提示而不切换
- ➕ **两个可选增强**(默认关,见「进阶」):MinerU 解析——扫描件可读、公式可点引用可检索;语义检索端点——大白话命中术语段落

安装后**不改动官方界面**:侧栏底部多一行「📚 论文伴读」开关,点击才进入伴读模式,再点即还原。
Expand Down Expand Up @@ -68,6 +70,7 @@ dsh plugin --profile web add @ggboy123/dsh-paper-reader@latest

```bash
dsh plugin --profile web add @ggboy123/dsh-paper-reader@latest # 永远装最新
# dsh plugin --profile web add @ggboy123/dsh-paper-reader@1.5.0 # 或钉住具体版本
grep '"version"' ~/.dsh/profiles/web/node_modules/@ggboy123/dsh-paper-reader/package.json # 查当前版本
# 重启 dsh web 生效;浏览器 Cmd+Shift+R 强刷,避免旧阅读器页面缓存
```
Expand All @@ -88,7 +91,7 @@ grep '"version"' ~/.dsh/profiles/web/node_modules/@ggboy123/dsh-paper-reader/pac
默认用本地 pdf.js 提取文本——**普通文本型 PDF 完全够用,什么都不用配**。两类场景需要 MinerU:

- **扫描版 PDF**(老论文、书章、扫描讲义):没有文本层,pdf.js 读不了,MinerU(OCR)能读
- **公式**:PDF 里公式是图形乱码,选不中也搜不到。**公式引用**——MinerU 把公式识别成 LaTeX 后,点 PDF 上的公式即引用进对话提问;`QK^T` 这类公式检索也能命中;顶栏「∑ 公式」面板按页浏览全文公式
- **公式引用**:PDF 里公式是图形乱码,选不中也搜不到。MinerU 把公式识别成 LaTeX 后,**点 PDF 上的公式会把该公式的 LaTeX 带进提问气泡**(发送即随问题引用进对话);`QK^T` 这类公式检索也能命中;顶栏「∑ 公式」面板按页浏览全文公式

**需要自己准备(二选一)**,在 **设置 → 论文伴读 → 「MinerU 解析后端」** 里配置:

Expand Down Expand Up @@ -120,6 +123,50 @@ grep '"version"' ~/.dsh/profiles/web/node_modules/@ggboy123/dsh-paper-reader/pac
- 改名后:转录缓存/译文/学习档案全部跟随搬家;历史伴读会话**本体保留**但不再挂在新名字下(会话 id 编码旧名);纯大小写改名在 macOS/Windows 可用
- 手工放进 `data/` 的怪名字文件(如 `.hidden.pdf`)也能正常删除/改名,不会成为孤儿

## 划词翻译与中英分屏对照(v1.5.0)

### 划词翻译(公式保留)

**怎么用**:在阅读器里**选中一段正文** → 弹出「选中即问」气泡(行为与以前完全一致)→ 点气泡里的 **「译」** → 弹出**译文气泡**,里面**只有译文**(外加一行诚实提示)。想重翻就重新选一次;点气泡外或按 Esc 关掉。

译文气泡里**没有**「插入会话」「复制」按钮(按你的要求),也**从不**自动写剪贴板。提问链路一点没动:重新选一次字就回到原来的提问气泡。

**公式是怎么处理的**(这是本功能的核心):

- PDF 文本层里的公式**不可读**:`$F_{\theta}$` 常常只剩一个 `F`(下标整字丢失)、`\sum` 变成 `X`、分式被拉平成一行、括号对甚至变成控制字符。把这串东西直接发给模型,译文里的公式必然错。
- 所以:**选区里的公式先用 MinerU 的 LaTeX 把那一段乱码替换掉**,再明确要求模型**原样保留** `$…$` 里的内容(不翻译、不改写、不省略、不增删符号)。译文回来后还会**逐个公式核对**是否原样保留,缺了就在气泡里如实告诉你。
- 两类公式都覆盖:**独立成行的公式**(用 MinerU `equation` 块的 bbox 精确定位)与**正文里穿插的行内公式**(如 `π(a|s)`、`Q(s,a)`、`x_t`)。行内公式在 MinerU 产物里**没有自己的 bbox**(它嵌在正文块里),插件靠「选区文本 ↔ MinerU 块文本」的模糊对齐把它还原出来。

**前提与代价(务必先读)**:

| # | 前提 | 没有它会怎样 |
| --- | --- | --- |
| 1 | **需要先配置翻译端点**(设置 → 论文伴读,或阅读器右上角 ⚙;与生成中文版共用同一份配置) | 点「译」会**自动弹出端点设置表单**;填好保存后**自动重试这次翻译**(不会白点一次)。端点三项不齐时服务端直接拒绝,前端据此弹表单 |
| 2 | **公式保留需要该论文用 MinerU 转录过**(存在 `<文献>.mineru.json`) | **降级为普通翻译**:正文照常翻,但公式在文本层里本就不读,气泡会如实提示「该论文未用 MinerU 转录:原文里的公式在文本层不可读,译文可能不准」。**这是设计,不是缺陷** |
| 3 | 有 MinerU 产物、但某一段公式没对上 | 只还原能对上的部分,气泡提示「部分公式未能还原,译文可能不准」 |
| 4 | 选区太短(不足 4 个有效字符,例如只选中孤零零的 `F`) | 不做还原(不足以判别),气泡提示「选区太短,公式未还原」 |

**已知限制(如实声明,不粉饰)**:

- **未对真实 LLM 端点打过任何请求**:开发期验证全程使用假上游(避免花钱、避免用你的 key)。「模型是否真的原样保留公式」目前靠**提示词字节契约**+**回包逐公式核对**两道可判定断言保证,没有真实服务商 key 的端到端实测。
- MinerU 偶尔会把**一个公式拆成两个 `$…$`**(首个片段以 `=` 结尾)。这种形态下可能只还原出半截公式(如 `action $\hat{a}_t\sim\pi_\theta(\cdot\ |$`),`$` 配对计数拦不住;本机语料里未出现,留待后续。
- 选区里含**字面** `$`(正文里真印了一个美元符号)时,极端形态下可能产生一句「有 N 个公式未原样保留」的**误报提示**(已记录,不影响译文本身)。
- 中文版 / 对照视图下**不做**公式替换(bbox 只对原文页成立),所以「译」按钮只在原文视图出现。

### 中英分屏对照(两种模式)

顶栏新增两个按钮,随时切换、**再点一次回原文**;每篇文献上次用的视图会被记住(跟着文献走,改名也不丢):

| 按钮 | 模式 | 看的是哪个文件 | 前提 |
| --- | --- | --- | --- |
| **对照** | A:单页内对照 | babeldoc 的 `-dual.pdf`(原文与译文并排画在同一张加宽页上,页宽约 2 倍) | 需要 `-dual.pdf` |
| **分屏** | B:左右并排 | 左:原文 `<文献>.pdf`;右:`<文献>-zh.pdf` | 需要 `-zh.pdf` |

- **两个产物都要先用 babeldoc 生成**:顶栏点「中」一键触发(**首次要装引擎 + 翻译,约几分钟**,需要翻译端点)。没有对应产物时按钮**置灰并写明原因**,不会点了没反应。
- **同步滚动**:滚任意一列,另一列自动跟到「同一页号 + 同一页内比例」;谁在滚谁主导,不会两列互相拉锯。翻页模式(`▣`)下两列同步同页。**中文版与原文页数不一致时按比例映射**,并在状态栏给出一次性提示。
- **分屏宽度**:需要面板宽度 ≥640px;太窄时点「分屏」只提示「请把阅读器拉宽」,**不会**切进去;分屏期间把面板缩到 640px 以下会自动退回原文。
- **与既有能力的关系**:分屏时左列就是普通原文视图——**公式热区照常可点**(右列不参与命中,也不会被画上热区);公式面板照常可用;「中」按钮在分屏期间置灰(避免与分屏语义打架)。切到中文 / 对照视图时热区仍按既有规则关闭(bbox 只对原文页成立)。

## 参与开发

```bash
Expand Down Expand Up @@ -154,6 +201,7 @@ src/
study.ts 纯函数:学习档案(计划 + 检验成绩)读写
translate.ts 纯函数:babeldoc 调用(中文/中英对照 PDF 生成)
babeldoc-install.ts 纯函数:无 Python 环境时自动安装 babeldoc(uv → 托管 Python → venv)
translate-selection.ts 纯函数:划词翻译(公式保留 —— 行内公式与 MinerU 块文本对齐还原、请求体与提示词契约、逐公式保全校验、内存 LRU 缓存)
rerank.ts 纯函数:search_paper 语义重排(TypeSafe/Jev,无凭据时退回关键词排序)
preset.ts 纯函数:自带 agent preset 安装到 $DSH_HOME/.agent-presets/
presets/paper-reader/ 「论文伴读」agent preset(persona 完整提示词 + compaction)
Expand Down
Loading
Loading