$npx -y skills add shilong20/getbib --skill getbib用低幻觉工作流为一篇或多篇学术论文获取可靠的 BibTeX。当用户提供论文标题和可选作者信息,并希望得到:(1) 带理由的权威候选链接,(2) 通过浏览器实际获取而不是猜测生成的 BibTeX,(3) 类似 bib_link_candidates.md 这样的可审阅过程文档,或 (4) 多篇论文的批量 BibTeX 收集结果时,应使用此 skill。
| 1 | # Getbib |
| 2 | |
| 3 | ## 概述 |
| 4 | |
| 5 | 使用这个 skill,可以把论文标题转成一条可审阅的引用获取工作流: |
| 6 | |
| 7 | 1. 使用 agent 自带的 web search 工具为每篇论文找到最可靠的发表链接。如果用户配置了 `config.json`,也可以使用内置的 Grok 搜索脚本代替。 |
| 8 | 2. 使用由 Playwright 驱动的浏览器提取流程,从推荐链接或其站点内可推导的元数据路径中获取 BibTeX。 |
| 9 | 3. 将中间审阅文档和最终 BibTeX 文件都写入磁盘。 |
| 10 | |
| 11 | 当用户希望尽量降低文献引用幻觉风险,并愿意在信任最终 BibTeX 之前先检查中间文档时,优先使用这个 skill。 |
| 12 | |
| 13 | ## 工作流 |
| 14 | |
| 15 | ### 1. 收集输入 |
| 16 | |
| 17 | 支持以下输入形式: |
| 18 | |
| 19 | - 单篇论文: |
| 20 | - 仅 `title` |
| 21 | - `title + author` |
| 22 | - 批量论文: |
| 23 | - 在 prompt 中重复给出多个标题 |
| 24 | - 带 `title` 和可选 `author` 列的 `csv` / `tsv` |
| 25 | - 形如 `{title, author}` 数组的 `json` / `jsonl` |
| 26 | - 每行一个标题,或使用 `title<TAB>author` 格式的 `txt` |
| 27 | |
| 28 | 如果用户没有提供批量输入文件,就根据对话内容隐式构造输入,并用重复的 `--title` 和可选的 `--author` 调用脚本。 |
| 29 | |
| 30 | ### 2. 搜索链接 |
| 31 | |
| 32 | 默认使用 agent 自带的 web search 工具为每篇论文搜索最合适的发表链接。搜索时遵循来源路由章节中的优先级。 |
| 33 | |
| 34 | 如果项目根目录下存在 `config.json`(Grok 或其他 OpenAI 兼容搜索 API 配置),则改用内置的 `scripts/grok_search.py` 自动搜索,无需 agent 手动搜索。`config.json` 中的 `base_url` 支持填写任何 OpenAI 兼容端点(不限于 Grok)。 |
| 35 | |
| 36 | 两种搜索方式的结果都需要整理为链接 JSON 格式: |
| 37 | |
| 38 | ```json |
| 39 | [ |
| 40 | {"title": "Attention Is All You Need", "url": "https://dblp.org/rec/conf/nips/VaswaniSPUJGKP17.html"}, |
| 41 | {"title": "BERT", "url": "https://openreview.net/forum?id=..."} |
| 42 | ] |
| 43 | ``` |
| 44 | |
| 45 | ### 3. 运行编排脚本 |
| 46 | |
| 47 | 默认模式(agent 自行搜索链接后调用): |
| 48 | |
| 49 | `python3 scripts/getbib.py --title "Paper Title" --links-json links.json` |
| 50 | |
| 51 | Grok 模式(有 `config.json`): |
| 52 | |
| 53 | `python3 scripts/getbib.py --title "Paper Title" [--author "Author Name"]` |
| 54 | |
| 55 | 批量模式: |
| 56 | |
| 57 | `python3 scripts/getbib.py --input papers.csv [--links-json links.json]` |
| 58 | |
| 59 | 常用选项: |
| 60 | |
| 61 | - `--output-dir <dir>`:将所有输出写入指定目录 |
| 62 | - `--links-json <file>`:使用预先准备好的链接 JSON,跳过 Grok 搜索 |
| 63 | - `--mode links`:只生成可审阅的链接文档(仅在 Grok 模式下有意义) |
| 64 | - `--mode both`:同时生成链接文档和最终 BibTeX(默认) |
| 65 | - `--keep-cache`:保留中间 JSON 产物 |
| 66 | |
| 67 | ### 4. 交付输出 |
| 68 | |
| 69 | 默认会在输出目录中生成以下文件: |
| 70 | |
| 71 | - `bib_link_candidates.md`:推荐链接、选择理由以及返回的来源 URL |
| 72 | - `playwright_route.bib`:通过浏览器驱动提取流程获取的最终 BibTeX |
| 73 | - `.cache/grok_bib_links/*.json`:原始 Grok 检索结果 |
| 74 | - `.cache/playwright_results.json`:逐篇论文的提取结果 |
| 75 | - `summary.json`:本次运行摘要 |
| 76 | |
| 77 | ### 5. 审阅策略 |
| 78 | |
| 79 | 在向用户总结结果时,遵循以下信任规则: |
| 80 | |
| 81 | - 把中间链接文档视为第一层审阅界面。 |
| 82 | - 将 `playwright_route.bib` 视为比模型直接生成的 BibTeX 更高置信,因为它是从推荐来源页面或其站点内元数据路径中实际提取得到的。 |
| 83 | - 如果页面标题与站点提供的 BibTeX 标题不一致,要明确指出,尤其是 `OpenReview` 场景。 |
| 84 | - 如果搜索没有返回可用链接,或浏览器无法从推荐来源提取 BibTeX,应明确标记失败,而不是自行按标题猜测其他来源。 |
| 85 | |
| 86 | ## 来源路由 |
| 87 | |
| 88 | 脚本已经实现了以下来源优先策略: |
| 89 | |
| 90 | - `dblp` / `dblp.dagstuhl` -> `.bib` |
| 91 | - `OpenReview` -> API note 内容和 `_bibtex`,并修复标题不一致问题 |
| 92 | - `arXiv` -> 页面元数据 |
| 93 | - `NeurIPS` / `PMLR` -> 页面中的 BibTeX 入口 |
| 94 | - `AMS` -> 先从页面元数据提取 DOI,再获取 DOI 对应的 BibTeX |
| 95 | - `IEEE` 页面 -> 当页面未直接暴露 BibTeX 时,尝试使用页面中的 DOI 元数据 |
| 96 | - `GitHub` / 模型卡 / 发布公告页 -> `@misc` |
| 97 | |
| 98 | 只有在已知某个特定来源结果错误时,才应覆盖脚本默认行为。不要在搜索未提供链接时自行按标题猜测其他来源。 |
| 99 | |
| 100 | ## 资源 |
| 101 | |
| 102 | ### `scripts/getbib.py` |
| 103 | |
| 104 | 主入口脚本。单篇和批量模式都使用它。 |
| 105 | |
| 106 | ### `scripts/grok_search.py` |
| 107 | |
| 108 | 基于 Grok API(或任何 OpenAI 兼容的搜索端点)的联网搜索脚本。从项目根目录的 `config.json` 读取配置。 |
| 109 | |
| 110 | ### `scripts/playwright_fetch.mjs` |
| 111 | |
| 112 | 供 `scripts/getbib.py` 使用的浏览器驱动提取器。 |
| 113 | |
| 114 | ### `config.example.json` |
| 115 | |
| 116 | 搜索 API 配置模板。复制为 `config.json` 并填入 API key 即可使用。 |