内容
align="center">
<h1 align="center">深入探索</h1>
>
> _深入探索 — 掌握你的研究 — 本地代理,引用答案。 属于 **[Own Your Stack](https://github.com/askalf)** — 拥有你的人工智能基础设施,而不是租用它。_
<p align="center"><strong>你的机器。你的LLM订阅。你的搜索后端。你的引用报告。</strong>一个本地研究代理问题,它计划子搜索网络,在真正的浏览器页面,通过评论循环迭代,直到答案不再有空白,并为你编写引用Markdown报告。除了的搜索和选择的URL外,什么离开你的笔记本电脑。每个LLM调用都通过 <a href="https://github.com/askalf/dario">dario</a>(或任何Anthropic兼容端点)路由,因此深入查询会消耗的30到60个费到你已经支付aude Max订阅中不是托管工具在其上其利润的Anthropic API定价。</p align="center"><零托管依赖。MIT许可。独立的,非官方的,第三方 — 参见 <a href="DISCLAIMER.md">DISCLAIMER.md</a>.</em></p>
<p align="center">
<a href="https://www.npmjs.com/package/@askalf/deep"><img src="https://img.shields.io/npm/v/@askalf/deepdive?color=blue" alt="npm 版本"></a>
<a href="https://scorecard.dev/viewer/?uri=github.com/askalf/deepdive"><img src="https://img.shields.iof-scorecard/github.com/askalf/deepdive?label=OpenSSF%card&color=blue="OpenSSF Scorecard"></a>
<a href="https://github.com/askalf/deepdive/actionsci.yml"><imghttps://github.com//deepdive/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<a href="https://github.com/askalf/deepdive/blob/master/LICENSE src="https://.io/npm/l/@askepdive" alt="许可证"></a>
</p>
---
## 你所拥有的
每个托管研究工具 — Perplexity、OpenAI Deep Research、Gemini Deep Research — 都解决了一个现实问题:一个问题 → 计划 → 搜索 → 读取 → 引用答案。它们还悄悄地从你手中夺走了四个决定:
**你的数据。** 问题、计划器发明的子查询、代理选择的每个URL — 所有这些都发送到供应商的服务器。通常还会发送到他们的分析管道。有发送到他们的广告。使用deepdive,不存在这些问题。计划器在你的Node进程中运行。搜索会命中你指向的后端(默认情况下是DuckDuckGo,不需要密钥;如果需要,可以使用SearXNG、Brave、Tavily或Exa)。从你的机器中,唯一的外联连接是:你选择的LLM端点、你选择的搜索端点和计划器决定的特定URL。没有遥测、没有分析、没有数据保留。可以检查:`lsof -i` 在运行期间。
**你的模型。** 托管工具为你选择 — Perplexity路由到他们自己的混合模型,OpenAI使用GPT-5,Gemini使用2.5 Pro。deepdive运行你的端点公开模型。默认情况下是aude-sonnet-4-6`,以获得良好的质量/成本平衡到 `claude-opus-4-8用于需要大量推理的问题;将 `--base-url`LiteLLM或v实例,并运行本地两种情况都使用同一个命令行标志。
**你的搜索后端。** 托管工具使用他们自己的搜索索引,不会告诉你它的确切形状dive在Duck HTML(默认,无)、自托管的SearXNG、Brave Searchavily或之间切换,只需一个添加一个新的适配器30行TypeScript代码。
**你的深度。** 托管工具限制代理将挖掘多深,因为无边界的研究会消耗他们的单位经济效益。deepdive的 `--deep标志通过评论LLM保持迭代 — 审查草稿 → 命名空白 → 搜索它们 → 重新合成 — 直到评论者说答案完整或达到 `--` 轮。你决定上限在哪里。
## 你停止支付的费用
大多数阅读这篇文章的人已经为Claude Max支付费用($100-200/月)。托管研究工具要求另外订阅 $20/月 — 在你已经拥有的订阅之上 — 以便一些供应商的服务器可以运行LLM调用,而你的Max计划本来可以免费覆盖这些调用。
以下是单个深入查询的成本:一个问题,需要评论循环才能完成,大约50k-200k个token,跨越计划器 + 合成 + 审查 + 重新合成:
| 运行方式 | 单查询成本 | 10次查询的月成本 | 数据是否本地? --- | --- | --- | --- |
| 按令牌计费的API(`claude-opus-4-8`) | **约$2-$8** | **约$20-$80** | 你的基础设施调用 |
| 按令牌计费的API(`claude-sonnet-4-6`) | **约$0.30-$1.20** | **约$3-$12** | 你的基础设施,你的| Perplexity Pro | 深度上限,固定层级 | **$20/月** | ❌ Perplexity + 上游 |
| OpenAI Deep Research(ChatGPT Plus) | 使用上限,固定层级 | **$20/月** | ❌ OpenAI + 上游 |
| Gemini Deep Research(AI Advanced) | 使用上限,固定层级 | **$20/月** | ❌ Google + 上游 |
| **deepd dario + Claude Max** | **$0 每查询** | **$0** (包含在Max中) | **✅ 你的机器** |
成本套利的论点是:深入研究工作负载 * 确切* 是Claude Max定价的形状 — 每个问题50k-200k个token,持续且突发性。通过已经购买的第二种订阅运行它,并在LLM调用之上叠加LLM调用,是为你已经购买的东西支付两次费用。dario解锁订阅;deepdive是使用它的工具来完成这项工作负载。
---
## 每夜报告卡
每天UTC时间04:23,五个固定的研究问题 — 每个在实时测试部署代理时发现的故障轴对应一个问题 — 通过生产deepdive运行器运行。每次运行的源信任混合、引用验证支持、置信度和成本都会记录在账本中,并自动发布到此存储库的 [`canary-data` 分支](https://github.com/askalf/deepdive/tree/canary-data) 和 **[sprayberrylabs.com/deepdive-canary](sprayberrylabsepdive-canary图表中 —失败的夜晚。如果无法失败的收据是新闻稿;如果这些新闻了,那个页面会公开显示。
---
##秒
```bash
# 1. 启动(你的本地LL — https://githubaskalf/dario)。
dario proxy # http://localhost:3456, 路由到Claude Max、OpenAI等。
# 2. 安装deepdive。
npm install -g @askalf/deepdive
npx playwright install chromium # 仅首次运行,约300 MB
# 3. 提问。
deepdive "claude的速率限制器如何工作" --deep --verbose --out=report.md
```
`--deep` 打开评论循环(默认情况下额外2轮)。 `--verbose` 将每个计划/搜索/获取/审查步骤流式传输到stderr,以便您可以观察代理的思考过程。 `--out` 将引用的Markdown写入文件,除了stdout。
---
## 输出示例
实际的deepdive运行会生成类似这样的文件(摘录):
```markdown
# claude的速率限制器如何工作
Claude的速率限制器使用两层滚动窗口:一个 **5小时桶**
和一个 **7天桶** ,两者都按OAuth会话范围限定 [1][2]。请求
先计入短期桶;当该窗口耗尽时,`representative-claim`响应头
从 `five_hour` 切换到 `seven_day` ,An开始对更长的桶进行计费
—— 仍然是订阅计费,而不是API超额 [3]。
耗尽两个桶会触发 `overage` 状态,此时如果帐户已启用,适用每令牌
额外使用费;否则请求会得到429 [3][4]。`anthropic-ratelimit-unified-*` 响应
头在请求-响应时公开当前利用率,以便
客户端可以智能地平衡池 [5]。
...
## 来源
1. [Anthropic速率限制头文件文档](https://docs.anthropic.com/...) — 2026-04-22获取
2. [Claude Code /usage命令参考](https://code.claude.com/...) — 2026-04-22获取
3. [讨论 #32 — 7天声明解释器](https://github.com/...) — 2026-04-22获取
4. [Anthropic超额计费文档](https://docs.anthropic.com/...) — 2026-04-22获取
5. [dario池模式实现笔记](https://github.com/...) — 2026-04-22获取
```
引用已编号并。末尾的来源表记录了每个来源URL和获取时间戳,因此您可以验证模型提出的任何声明。
---
## 秘籍
该工具的五种具体用法。复制,替换查询,运行。
### 最新基准测试结果
```sh
deepdive "SWE-bench排行榜的最新结果是什么"=swebench.md
```
单次运行,令牌成本约为$0.05-$0.15当前顶部系统,引用结果行和提交日期 — 无需评论循环,因为“排行榜上有什么”是一个事实查询,而不是需要争论的事情。
### X的技术工作原理
```sh
deepdive "claude的提示缓存实际上如何工作" --deep --verbose --aching.md
```
评论循环迭代,直到报告涵语义、计费影响和已知陷 `--verbose` 打印每轮的评论判决,以便您查看缺少的内容。典型成本 $0.50-$2,取决于需要才能满足评论者 小规模$stack的最佳实践
```sh
deepdive "2026年单节点侧项目运行postgres的最佳实践" --deep=3 --search=brave --out=
```
三轮评论限定报告。 `--searchve` 将默认的DDG适配器替换为Brave,它倾向于在快速发展的生态系统问题上返回更新鲜的结果。在默认搜索不断出现2024年前博客帖子的情况下非常有用。
### 比较A与B的当前数据
```sh
deepdive "perplexity vs you-com vs gem research — 当前限制、定价和" --deep --strict-cites --out=compare.md
```
`--strict-cites` 如果任何声明的词汇召回验证失败,则返回非零退出代码。对于脚本化比较报告很有用,因为您希望得到一个硬故障,而不是一个自信地引用了错误信息的 hallucinations。
### 将项目网络研究混合
```sh
deepdive "我们的追溯计费政策是否与欧盟消费者法兼容" --include=/billing,./POLICY.md --deep --out=billing.md
```
`--include` 将混合到源池获得最低的引用ID和在提示的位置。输出同时引用 `file://` 路,因此内部监管机构的网站可以并排出现在同一个源表中。
---
## `--deep循环
单次模式(无 `--deep` 标志)是其他本地“研究CLI”工具:计划 → → 获取 → 合 完成。足够用于简单的事实查询。不太适合“解释X实际上如何工作”。
`-- 添加了一个评论者:
```
计划 ──▶ 搜索 ──▶ 获取 ──▶ 合─▶ 评论 ─ │
◀───── "这里缺少什么,试试4, q5" ──┘
▼
搜索 ──▶ 获取▶ 合成 ──▶ 评论 ──▶ ...
```
评论者阅读自己的草稿,标记“草稿中没有来源429头格式”提出最多三个后续查询。循环重新运行,从迄今为止收集的每个来源重新合成,并再次传递给评论者。当评论者说完整时 — 或当达到 `--deep=N轮时 — 。
裸 `--deep` = 2 额外轮。 `--deep= = 最多5轮。 `--deep=0` 是明确的单在TTY中,每的草稿都会在写入时流式传输 — 轮0放在问题的H1下;由 `---`符和 `##N(deep)` 头部分隔,以便您可以阅读代理的迭代过程。最终轮是评论者声明 `done` 的轮,或您设置的天花板。 `--out` 文件仅获取最终的Markdown答案;流式中间草稿在终端中可见,但不会持久化为什么这是重点。** 评论循环是托管工具限制的轴经济效益迫使它们提供固定深度 — 如果允许运行循环,一些用户会这样做,他们的利润率会崩溃。在您自己的订阅中,唯一的天花板是您在命令行上设置的天花板。
---
## 引用验证
每次合成后,deepdive检查答案中的每个 `[N]` 来源N的提取文本相匹配。这是一个廉价的、确定性的、词汇检查 — 无需第二个LLM调用 — 捕获引用答案工具的主要故障模式:模型编写一个自信的句子,其中 `[3]`,但来源3实际上不包含该声明。
对于每个带有引用的句子,验证器将声明标记为(小写,停止词删除,数字保留),并针对每个引用的来源标记进行召回评分。诸如 `"X发生在2024年[1][3]"` 之类的多引用句子仅在 **每个** 引用的来源都清除阈值时才受支持;如果句子中嵌入了的 `[3]`会标记。
问题时,deep会在答案末尾打印一个小的 `## 引用健康` 页脚,并通过 `--verbose` 在 `--verbose` 中显示受影响的句子。干净的运行保持干净:无页脚,无噪音。在脚本中使用 `--strict-cites` 以非零退出代码失败运行。
在 `--deep` 模式下,验证器在每轮中运行一次,而不仅仅是在最后:当中间轮次生成的句子具有弱引用时,这些句子被转发到评论者,作为下一轮搜索的首要差距来填充。在评论者和验证者之间形成闭环 — 而不是“找到更多来源,希望它们有帮助”,下一轮明确搜索具有权威支持的确切句子的缺失。
这不是什么:语义裁判。词汇召回率用高精度标记幻觉数字和日期,但重述但真实的得分低于阈值,主题对齐但不正确的句子可能得分高于阈值。将报告性检查指南,而不是正确性证明。要调整严格性,请将 `--cite-min-recall` 提高到默认值 `0.4` 之上;要完全禁用,请传递 `--no-verify-cites`。
---
## 来源权威
引用验证回答 *"答案是否与引用的来源相符?"* 。来源权威回答正交问题 *"该来源本身是否值得信赖?* — 一个自信的、完全引用的答案,完全建立在内容农场垃圾邮件上,在前者上得分干净,在此处得分低。 v0.26.0中发布,它是第二个来源信任轴,单独报告,因此两个信号不会被误认为是对方。
评分是确定性的 — 无LLM,无额外网络调用 — 仅按来源的域进行索引,分为四个层级(`primary`、`reputable`、`unknown`、`low`)。它优先考虑高精度增强(官方文档、主要来源、 `.gov`/`.edu`、标准机构),将无法识别的内容视为`unknown`而不是惩罚利基但合法的来源,并将低信任列表保留为一个小的、精选的已知内容农场黑名单 — 精确度优于召回率。
`--source-authority=<prefer|strict|off>` (env `DEEPDIVE_SOURCE_AUTHORITY`,默认为 `prefer`)控制该分数在对候选项排序到轮次的有限获取槽时如何使用:
- **`prefer`** (默认)— 按权威性降序稳定排序。不会删除任何内容;仅更改顺序,搜索顺序在层级内保留,因此权威来源优先于搜索排名靠前的来源。
- **`strict`** — 另外,删除 `low` 级别的候选项(已知内容农场),除非本轮所有候选项都是 `low` 级别的,在这种情况下它们将被保留。这一最低保留门槛意味着一个小众或近期的话题,如果只出现农场,仍然会得到来源而不是一无所有。
- **`off`** — 身份。搜索顺序保持不变。
相同的设置也会影响搜索本身:当跨多个后端(`--search=multi:…`)进行扩展时,会在执行结果上限之前按权限重新排序合并的候选项池,因此来自后端的排名靠前的来源仍会在保留阶段幸存,而不是被排名靠前的农场截断(`strict` 会直接删除农场,具有相同的最低保留门槛)。单后端搜索不受影响 — 那里只有后端自己的排名,所有内容都存在。
无论模式如何,运行都会报告在保留的来源中聚合的信任读取 — `high` (无低信任来源且至少一半为主要/可靠)、 `low` (至少一半农场),或 `mixed` (两者之间的所有内容)。 `--json` 将其作为 `sourceTrust` 携带( `{ label, counts: { primary, reputable, unknown, low, total } }` ),每个来源行都带有authority` 层级,HTML导出(`deepdive export --format=)在元行上显示相同的信任徽章,如果有需要标记的内容。
衡量,而不是承诺:基准测试将其关闭与偏好板提交到 [`bench/results/`](bench/results/)。在 [v0.27.0](https://github.com/askalf/dario/releases/tag/v0.27.0) 中,启用 `prefer` 将主要/可靠的保留来源份额从 **23% 提高到 44%** ,在黄金问题中聚合 — 运营问题完全填充了100%主要/可靠来源,在近期问题上,已知内容农场保留的来源被完全推。信息性,从不槛:`unknown`原因保持中立,利基话题合法地缺乏主要来源。
## 新鲜度和置信度
两个帮助您快速阅读报告的信号。
**发布时间。** 当 deepdive 获取一个页面时,它会尝试从渲染的 HTML 中恢复页面的发布时间 — `datePublished` 的 JSON-LD、`<meta property="article:published_time">` 等等,或者一个 `<time datetime>` 元素。当它找到一个时,源行显示它(`fetched 2026-05-07 · published 2024-03-15`),HTML 导出显示它,JSON 携带它作为 `publishedAt`,**并且** 合成器看到它 - 因此当来源不同意时,它可以优先选择更新的来源并标记来自旧页面的声明。没有公开日期的页面(许多 SPA) simply 不会获得注释; nothing breaks.
**新鲜度过滤器。** 传递 `--since` (或 `DEEPDIVE_SINCE` )以直接丢弃过时的来源 — 绝对日期( `--since=2024` , `--since=2024-06-15` )或表示“多久以前”的持续时间( `--since=30d` , `--since=2w` )。如果检测到的发布时间早于截止日期,则获取的页面将被跳过(在 `--verbose` 中为 `stale` );没有检测到的日期的页面将被保留,因此不会因缺少元数据而受到惩罚。对于快速发展的主题非常有用,因为 2019 年的博客文章可能比没有答案还要糟糕。
```bash
deepdive "2026 年部署 node 应用的最佳方式" --since=365d --deep
```
**近重复去除。** 相同的文章在不同主机上发布(新闻报道、镜像、AMP 副本)可以在 URL 级别去除重复,但会浪费一个源槽并用重复的文本填充合成上下文。deepdive 删除了提取的内容与已保留的内容 ≥ 90% 相似(单词 5-gram Jaccard)的已获取来源 - `--verbose` 中的 `near-duplicate` 。默认的 0.9 只在真正的副本上触发;两个不同主题的文章通常得分低于 0.3。可以调整 `--dedupe-threshold=<0..1>` 或使用 `--no-dedupe` 关闭( `DEEPDIVE_NO_DEDUPE=1` )。您故意添加的来源( `--include` , `continue` )永远不会被删除 - 它们作为重复数据删除的锚点,因此不能重新添加您已经拥有的副本。
**置信度。** 每次运行后,deepdive 都会在成本行旁边打印一行覆盖率读数:
```
confidence · high · 11 sources · 18/18 citations supported
```
它是对运行结果的确定性启发式 - 保留的来源,以及答案的引用中有多少通过了词汇验证器 - 而不是声称答案是 *correct* 。 `low` 标志着值得重新检查的事情:来源基础薄弱,答案引用了验证器无法检查的内容,或者引用未能提供支持。相同的评估在 `--json` 中作为 `confidence` 。禁止 stderr 行使用 `--no-cost` 。
**TL;DR.** 传递 `--tldr` (或 `DEEPDIVE_TLDR=1` )以使合成器在完整答案之前提供一段简要的、仍然引用的摘要 - 在您想要先查看结果而将详细信息放在下面时非常有用。默认情况下关闭;未设置时输出在字节上与以前相同。
---
## PDF 和本地文件
v0.7 中关闭了两个长期存在的空白:真正的研究问题经常会遇到 PDF(学术论文、RFC、标准文档),而最有用的来源通常已经在您的笔记本电脑上(项目笔记、内部文档、导出的聊天记录)。deepdive 现在可以读取两者。
**PDF** 通过 URL 扩展名或 `Content-Type` 进行检测,并通过单独的提取器路由,而不是无头浏览器的 DOM(Chromium 的 PDF 查看器不公开有用的文本)。页面上限默认为 50( `--pdf-max-pages=<n>` );大型论文会被截断,而不是炸毁合成上下文。
PDF 提取使用 [`pdfjs-dist`](https://github.com/mozilla/pdfjs-dist) - Mozilla 的参考 PDF.js 库。从 v0.21 开始,它作为 **可选依赖** 交付,因此默认的 `npm install -g @askalf/deepdive` 可以开箱即用读取 PDF - 学术适配器(arxiv、pubmed、semanticscholar、openalex)不断公开 PDF,并且静默跳过它们会破坏这些适配器的查询。为保持降级优雅,它 *可选* (纯 JS,无构建步骤),安装时 `--omit=optional` 仍然可以正常运行,PDF 会被跳过,并带有明确的 `pdf-no-extractor` 事件,提取器会在第一次看到 PDF 时动态导入 - 非 PDF 运行的成本为零。
一个诚实的警告: `pdfjs-dist` 6.x 声明 `engines: node >=22.13` ,并且 npm 静默跳过无法通过引擎检查的可选依赖。在 Node 20–22.12(Node 20 已过期)上不会发生自动安装;deepdive 仍然可以正常运行, `deepdive doctor` 在 `pdf` 类别下会告诉您。要将提取器添加到跳过它的安装中:
```bash
npm install -g pdfjs-dist
```
**本地文件** 通过 `--include=<path>[,<path>]` 引入。每个路径可以是文件或目录(仅限一层,支持的扩展名)。文件成为保留来源列表中预获取的来源 - 它们获得最低的 `[N]` 引用 ID,因此对合成器来说最为突出。支持的类型: `.pdf` 、 `.md` 、 `.txt` 、 `.html` 。
```bash
# 将项目笔记与网络研究混合:
deepdive "我们的延迟计费政策是什么?" \
--include=~/notes/billing,./CONTRIBUTING.md \
--search=brave --deep
```
这是托管研究工具无法做到的 - 您的笔记不会离开您的机器,结果引用它们为 `file:///abs/path` URL,用户可以点击打开。
---
## MCP 服务器 — 给您的代理一个显示其工作的研究人员
`deepdive mcp` 在 stdio 上运行一个 MCP(模型上下文协议)服务器,公开一个工具: `deepdive_research` 。任何 MCP 客户端 - Claude Code、MCP 感知 IDE、其他代理工具 - 都可以将研究工具交给其模型,每个答案都带有信任信号:源信任混合(主要/知名/未知/低)、有多少引用通过词汇验证、置信度等级和确切的 LLM 成本。
Claude Code 注册:
```
claude mcp add deepdive -- npx -y @askalf/deepdive mcp
```
或在 `mcpServers` 配置块中:
```
{
"mcpServers": {
"deepdive": {
"command": "npx",
"args": ["-y", "@askalf/deepdive", "mcp"],
"env": {
"DEEPDIVE_API_KEY": "...",
"DEEPDIVE_BASE_URL": "http://localhost:3456",
"DEEPDIVE_SEARCH": "multi:duckduckgo,wikipedia"
}
}
}
}
```
配置与 CLI 完全一致: `env` 块提供默认值(端点、密钥、搜索后端),而每个调用的工具参数覆盖 - `search` 、 `allow_domains` / `deny_domains` 、 `since` 、 `deep` 、 `max_cost_usd` 、 `max_sources` 、 `source_authority` 、 `max_runtime` 。调用是无状态的(无会话),每个运行都有一个时钟上限(默认为 10 分钟)。研究运行需要一到几分钟 - 请相应地配置客户端的工具超时。进度行输出到 stderr,因此显示服务器 stderr 的客户端会显示运行进度;stdout 保持干净的协议通道。
失败的运行以诚实的工具输出返回,而不是协议错误 - 与 CLI 在退出代码 3 上打印的诊断相同(搜索了什么,域过滤器丢弃了什么,哪个备用方案被跳过以及原因),因此调用模型可以决定扩大过滤器或重新措辞,而不是猜测。
---
## 远程浏览器(CDP)
默认情况下,deepdive 通过 Playwright 启动本地无头 Chromium,这意味着第一次安装需要浏览器二进制文件( `npx playwright install` )。要跳过此步骤并附加到现有的浏览器,请将 deepdive 指向 CDP 端点:
```bash
deepdive "..." --browser-cdp-endpoint=http://browser-host:9222
# 或:export DEEPDIVE_BROWSER_CDP_ENDPOINT=http://browser-host:9222
```
然后,deepdive 通过 Chrome DevTools 协议连接,在该浏览器的隔离上下文中运行每个获取操作,并且永远不会下载或启动 Chromium 本身。远程浏览器拥有自己的标志和隐身配置文件;deepdive 只设置每个运行的上下文(用户代理、视口、本地化)。这适用于容器和共享浏览器服务,其中一个加固的 Chromium 为多个调用者提供服务。请注意,页面是从 *远程浏览器的* 网络出口获取的,而不是调用者的。 `deepdive doctor` 报告连接(和远程 Chrome 版本)而不是本地启动,当设置了端点时。
---
## 成本遥测
每次运行都在 stderr 上打印一行摘要:
```
cost · ~$0.0085 · 412 in / 234 out · 4 LLM calls · claude-sonnet-4-6
(≈ at API list price; $0 on Claude Max via dario)
```
令牌计数直接来自 Anthropic API 响应。美元金额根据一个小型内置价格表计算,该表涵盖了 Claude 模型的标题 - 请参见 `src/pricing.ts` 以获取当前值;在依赖它进行计费决策之前,请与 [docs.anthropic.com/en/docs/about-claude/pricing](https://docs.anthropic.com/en/docs/about-claude/pricing) 进行验证。未知模型渲染为 `$?` ;令牌始终显示。
提示仅在 `--base-url` 与 dario 的默认端口( `http://localhost:3456` )匹配时出现 - 指向不同的端点会自动抑制它。自我托管或不熟悉的模型可以通过 `DEEPDIVE_PRICE_INPUT_PER_MTOK` 和 `DEEPDIVE_PRICE_OUTPUT_PER_MTOK` (每百万个令牌)插入自己的定价。禁止该行使用 `--no-cost` 或 `DEEPDIVE_NO_COST=1` 。相同的数字也出现在 `--json` 输出中,作为 `cost` 和 `usage.{llm,estimatedCostUsd}` ,用于将它们输送到您自己的仪表板中。
**每阶段模型覆盖** *(v0.10.0)* 。管道有三个 LLM 阶段: **计划** (将问题分解为子查询)、 **合成** (编写引用的答案)和 **批评** (仅在 `--deep` 模式下 - 审查草稿并提出后续查询)。它们具有非常不同的成本/质量权衡:规划在结构上很简单;批评在结构上很简单;合成是质量最重要的地方。独立覆盖每个阶段:
```bash
deepdive "python 3.13 GIL 有了什么变化?" --deep \
--model=claude-sonnet-4-6 \
--plan-model=claude-haiku-4-5 \
--critic-model=claude-haiku-4-5
# → cost · ~$0.034 · 12.1k in / 4.2k out · 7 LLM calls · multi-model
# · ~$0.003 · 800 in / 200 out · 1 LLM call · claude-haiku-4-5
# · ~$0.030 · 10.7k in / 3.85k out · 3 LLM calls · claude-sonnet-4-6
# · ~$0.001 · 600 in / 150 out · 3 LLM calls · claude-haiku-4-5
```
环境变量也是如此: `DEEPDIVE_PLAN_MODEL` 、 `DEEPDIVE_SYNTH_MODEL` 、 `DEEPDIVE_CRITIC_MODEL` 。任何未设置的阶段都会回落到 `--model` / `DEEPDIVE_MODEL` 。如果使用了多个模型,则成本遥测会细分为每个模型;如果只使用一个模型,则与 v0.9 的输出相同。
**硬性预算上限** *(v0.11.0)* 。 `--max-cost=$X.YY` (或 `DEEPDIVE_MAX_COST` )设置了一个美元上限。在每次 LLM 调用完成后,代理会重新汇总所有模型的支出,并在下一个调用之前中止,如果运行总支出已经超过上限。CLI 以代码 **2** 退出(与代码 1 区分,代码 1 表示真正的错误),因此包装脚本可以根据它进行分支。
```bash
deepdive "..." --deep --max-cost=$0.50
# ...
# deepdive: budget cap exceeded: spent $0.534 of $0.500
# $ echo $?
# 2
```
检查在每个调用完成后触发 *后* ,因此长合成调用可能会在中止前稍微超出预算 - 预测每种线控格式的令牌成本是不可能的。当运行使用任何未定价的模型(内置表中没有条目和 `DEEPDIVE_PRICE_*_PER_MTOK` 覆盖),中止消息警告说强制执行仅针对定价的子集。
---
## OpenAI 兼容端点
deepdive 的线路格式默认为 Anthropic Messages - 这是 dario 原生支持的格式,并且是每个 Claude 提供商公开的格式。但是,使用内置的请求/响应适配器,相同的管道可以针对任何 OpenAI Chat Completions 端点工作。自动从 `--base-url` 检测:
| URL 模式 | 检测为 |
|---|---|
| `api.openai.com/...` | `openai` |
| `localhost:11434` (Ollama 默认) | `openai` |
| `localhost:8000` (vLLM 约定) | `openai` |
| 其他 | `anthropic` |
使用 `--api-format=anthropic|openai` 或 `DEEPDIVE_API_FORMAT` 覆盖。适配器转换请求形状、标头(OpenAI 的 Bearer,Anthropic 的 `x-api-key` + `anthropic-version` )、流式 SSE 事件格式( `choices[].delta.content` ↔ `content_block_delta` )和 `usage` 字段( `prompt_tokens` / `completion_tokens` ↔ `input_tokens` / `output_tokens` )。
```bash
# 在本地模型上运行,使用 Ollama 提供:
deepdive "解释 X 如何工作" --base-url=http://localhost:11434 --model=llama3.1
# 直接在 OpenAI 上运行(自动检测):
OPENAI_API_KEY=sk-... deepdive "..." \
--base-url=https://api.openai.com --api-key=$OPENAI_API_KEY --model=gpt-4o
```
OpenAI 形状端点的成本遥测仍然有效 - 您需要通过 `DEEPDIVE_PRICE_INPUT_PER_MTOK` / `DEEPDIVE_PRICE_OUTPUT_PER_MTOK` 自行插入定价,因为内置价格表仅涵盖 Claude 模型。
---
## 域名允许/拒绝列表
当规划器选择 URL 时,您有时希望强制固定到权威来源或丢弃嘈杂的来源。两个标志,主机名后缀匹配:
```bash
# 删除低信号源:
deepdive "X 和 Y 之间的区别是什么?" \
--deny-domain=pinterest.com,quora.com,reddit.com
# 固定到权威源以回答敏感问题:
deepdive "Anthropic 的 TOS 对 Y 说了什么?" \
--allow-domain=anthropic.com,docs.anthropic.com
```
模式完全匹配 OR 作为严格的子域( `github.com` 匹配 `github.com` 和 `api.github.com` ,但不匹配 `githubcompany.com` )。过滤的 URL 作为 `fetch.skipped` 事件出现,原因在 `--verbose` 中为 `domain-deny` 或 `domain-not-allowed` 。两个标志可以组合:URL 必须通过允许列表 AND 不能与拒绝列表匹配。环境变量等效项: `DEEPDIVE_ALLOW_DOMAIN` 、 `DEEPDIVE_DENY_DOMAIN` 。
---
## 常见标志
运行 `deepdive --help` 获取完整列表。您会经常使用的:
| 标志 | 默认值 | 为什么 |
|---|---|---|
| `--deep[=<n>]` | 关闭(裸 = 2) | 打开批评循环。这是主要功能。 |
| `--tldr` | 关闭 | 用一段简要的 TL;DR 在完整细节之前引导答案。 |
| `--model=<name>` | `claude-sonnet-4-6` | 尝试在需要推理的问题上使用 `claude-opus-4-8` 。 |
| `--search=<adapter>` | `duckduckgo` | `searxng` 用于隐私, `brave` 用于质量, `tavily` 或 `exa` 用于研究调优的结果。 |
| `--max-sources=<n>` | 每轮 `12` | 上限。深模式在各轮中累积,限制每轮。 |
| `--concurrency=<n>` | `4` | 并行获取。在快速连接上增加。 |
| `--strict-cites` | 关闭 | 如果答案中的任何引用未能通过词汇验证,则退出非零。 |
| `--cite-min-recall=<0..1>` | `0.4` | 引用支持阈值。越低越宽容。 |
| `--no-verify-cites` | 关闭 | 完全跳过引用验证过程。 |
| `--source-authority=<prefer\|strict\|off>` | `prefer` | 将权威/主要来源排入有限的获取槽; `strict` 还丢弃已知的农场内容(有最低保留底线); `off` 留下搜索顺序不变。环境变量: `DEEPDIVE_SOURCE_AUTHORITY` 。 |
| `--no-cost` | 关闭 | 抑制 stderr 上的运行成本摘要。 |
| `--include=<paths>` | — | 用作来源的本地文件/目录的逗号分隔列表( `.pdf` 、 `.md` 、 `.txt` 、 `.html` )。 |
| `--pdf-max-pages=<n>` | `50` | 每 PDF 页数上限。较大的 PDF 被截断。 |
| `--allow-domain=<list>` | — | 逗号分隔的主机名后缀列表 - 仅保留匹配的 URL。 |
| `--deny-domain=<list>` | — | 逗号分隔的主机名后缀列表 - 删除匹配的 URL。 |
| `--api-format=<anthropic\|openai>` | 自动 | 线路格式为 LLM 端点。自动从 `--base-url` 检测。 |
| `--no-sessions` | 关闭 | 不要将此运行保留到 `~/.deepdive/sessions/` 。 |
| `--json` | 降级 | 发出 `{question, plan, rounds, sources, answer, verification, sourceTrust, cost, usage}` 以进行管道传输。 |
| `--out=<path>` | — | 保存到文件。 |
| `--verbose` 、 `-v` | — | 将计划/搜索/获取/批评/验证事件流式传输到 stderr。 |
每个标志都镜像一个 `DEEPDIVE_*` 环境变量。CLI 标志优先于环境变量。
---
## 配置文件和配置文件
如果您一直传递相同的标志,请保留它们。 `~/.deepdive/config.json` (使用 `DEEPDIVE_CONFIG` 覆盖路径)是一个 JSON 对象,包含友好的命名默认值,一个可选的 `profiles` 映射和一个可选的 `defaultProfile` :
```json
{
"baseUrl": "http://localhost:3456",
"model": "claude-sonnet-4-6",
"search": "auto",
"braveKey": "...",
"denyDomain": ["pinterest.com", "quora.com"],
"defaultProfile": "deep",
"profiles": {
"deep": { "deep": 3, "maxSources": 16 },
"audit": { "model": "claude-opus-4-8", "deep": 4, "strictCites": true, "search": "brave" }
}
}
```
友好键映射到标志( `model` 、 `search` 、 `deep` 、 `concurrency` 、 `maxSources` 、 `tldr` 、 `strictCites` 等;通过 `"cache": false` / `"verifyCites": false` 禁用默认开启的功能)。运行 `deepdive` ,这些会自动应用。
**配置文件** 是您使用 `--profile=<name>` 选择的命名绑定:
```bash
deepdive "..." --profile=deep # 内置:3 次批评轮回
deepdive "..." --profile=audit # 您的配置文件
```
内置: `deep` (3 轮)、 `thorough` (4 轮 + 20 个来源 + 严格引用)、 `fast` (高并发性,单次通过)、 `cheap` (计划/批评使用 haiku,合成使用 sonnet)、 `strict` (如果引用较弱,则失败)。配置文件与内置名称冲突时会覆盖内置名称。
**优先级**,从低到高:内置默认值 → 配置文件基线 → 所选配置文件 → 环境变量 → CLI 标志。因此,配置文件会设置一个基准,您仍然可以通过环境变量或标志覆盖它;配置文件永远不会无声地胜过您键入的内容。
## Shell 补全
```bash
# bash — 添加到 ~/.bashrc
source <(deepdive completion bash)
# zsh — 添加到 ~/.zshrc
source <(deepdive completion zsh)
# fish
deepdive completion fish > ~/.config/fish/completions/deepdive.fish
```
完成子命令( `export` 、 `diff` 、 `sessions` 等)和常见标志。
## 搜索适配器
每个后端一个适配器。默认(DuckDuckGo)不需要密钥。
| 适配器 | 标志 | 需要 | 备注 |
|---|---|---|---|
| DuckDuckGo HTML | `--search=duckduckgo` (默认) | 无 | 爬取 `html.duckduckgo.com`。足够满足大多数问题。速率限制突发 - deepdive 空间请求间隔 1 秒(`DEEPDIVE_DDG_DELAY_MS` 调整,`0` 禁用)并将检测到的节流报告为速率限制错误,而不是静默空轮。 |
| SearXNG | `--search=searxng` | `DEEPDIVE_SEARXNG_URL` | 自托管元搜索引擎。最佳隐私。 |
| Brave Search | `--search=brave` | `DEEPDIVE_BRAVE_KEY` | 付费,高质量。 |
| Tavily | `--search=tavily` | `DEEPDIVE_TAVILY_KEY` | 研究调优。返回预提取内容;deepdive 重新获取以确保一致性。 |
| Exa | `--search=exa` | `DEEPDIVE_EXA_KEY` | 神经搜索调优用于长查询,意图丰富 - 适合规划器和批评者循环生成的子查询。仅高亮;deepdive 重新获取页面以获取完整内容。 |
| 自动 | `--search=auto` | `DEEPDIVE_BRAVE_KEY` (可选) | DDG 主要,Brave 备用 DDG 失败或空结果时。降级为仅 DDG,当没有 Brave 密钥时。 |
| 维基百科 | `--search=wikipedia` | 无 | 百科全书优先。最佳定义性/事实性子查询。语言通过 `DEEPDIVE_WIKIPEDIA_LANG` (默认 `en`)。零结果自然语言查询通过与 Stack Exchange 相同的关键词梯度自动重试。 |
| 新闻 | `--search=news` | 无 | 通过 Bing 新闻 RSS 源获取最近的新闻文章。最佳时效性问题;与 `--since` 搭配使用。结果链接解包到发布商 URL,每个摘要前缀为文章日期。 |
| arXiv | `--search=arxiv` | 无 | 通过 arXiv API 进行研究论文/预印本搜索。保留的来源是摘要页面;PDF 路径处理链接的 PDF。 |
| GitHub | `--search=github` | `DEEPDIVE_GITHUB_TOKEN` (可选) | 仓库搜索 - “什么项目做 X”。无密钥 60 req/hr;令牌提高限制。 |
| Hacker News | `--search=hackernews` | 无 | Algolia 托管的 HN 搜索。社区讨论,发布线程,主要来源。摘要显示积分/评论。 |
| Stack Exchange | `--search=stackexchange` | 无 | 问答搜索(默认 `stackoverflow`;`DEEPDIVE_STACKEXCHANGE_SITE` 用于 serverfault/superuser/等)。无密钥(限速)。SE API 是字面匹配,因此零结果自然语言查询通过关键词梯度自动重试(4 → 2 → 1 个主要内容令牌)。 |
| PubMed | `--search=pubmed` | 无 | 通过 NCBI E-utilities 获取生物医学文献。保留的来源是摘要页面;摘要显示作者/期刊/日期。 |
| Semantic Scholar | `--search=semanticscholar` (`s2`) | `DEEPDIVE_S2_KEY` (推荐) | 学术论文搜索。无密钥有效但限速严重(频繁 429);免费 API 密钥使其可靠。摘要显示引用/年/作者。 |
| OpenAlex | `--search=openalex` | 无 | ~250M 学术作品,涵盖所有学科。无密钥;设置 `DEEPDIVE_OPENALEX_MAILTO` 加入更快的“礼貌池”。来源是首页/DOI。 |
| 多重 | `--search=multi:<a>,<b>[,...]` | 根据部件需要 | 扇出:并发查询每个列出的适配器,交叉编织结果,URL 去重。限速后端不会使轮次失效 - 如果所有适配器都失败,则会抛出异常。 |
扇出是适配器舰队的组成方式:一个通用网络引擎加上一个或两个领域引擎,为规划器提供一个单一后端无法返回的源池。
当一轮收集 **零** 个源(后端限速,所有获取被阻止)时,deepdive 在合成 LLM 调用之前停止并退出,错误代码为 `3`,并带有说明原因的消息 - 它永远不会花费令牌生成无引用的“无法回答”。
恢复后端 **默认启用** (`wikipedia` - 无密钥,从不与主要后端共享故障模式):当一轮主要搜索产生零候选时,该轮的查询通过备用后端重新运行一次,并在标准错误中打印通知,以便不会将降级运行误认为正常运行。通过 `--search-fallback=wikipedia,arxiv` 调整(环境变量 `DEEPDIVE_SEARCH_FALLBACK`,配置文件键 `searchFallback`);通过 `--search-fallback=none` 禁用此功能。当 `--since` 设置时,默认备用变为 `news,wikipedia`:过滤时间较近的运行会丢失大部分百科全书页面,因此新闻适配器首先出现,以保持恢复的来源为最新和时效。
两个更多保证用于无人值守的使用:在 `multi:` 扇出中,失败的子适配器被报告(`search.degraded` 事件,通过 `--verbose` 显示)而不是静默减少源池,并且限速的适配器将被基准测试以供以后使用,而不是被重新询问。并且 `--max-runtime=10m` (环境变量 `DEEPDIVE_MAX_RUNTIME`;需要单位)对整个运行时间设置了一个时钟截止点 - 如果任何阶段卡住,运行将干净地中止而不是永远挂起。
```bash
deepdive "2026 年 Transformer 替代方案是否可行" \
--search=multi:duckduckgo,arxiv,semanticscholar --deep
```
添加新适配器大约需要 30 行代码:在 `src/search/*.ts` 中实现 `SearchAdapter`,在 `src/search.ts` 中注册。全合同和复制粘贴脚手架位于 [docs/search-adapter.md](docs/search-adapter.md)。
要预览后端返回的内容(无 LLM,无获取),请使用 `search` 子命令:
```bash
deepdive search "rust async runtime" --search=hackernews
deepdive search "nginx 502" --search=stackexchange --json
```
---
## `deepdive doctor`
一个命令,聚合健康报告。粘贴输出时报告问题。
```bash
$ deepdive doctor
deepdive doctor — v0.31.0
# 环境
OK Node v22.21.1
--- 平台 win32 x64
--- deepdive v0.31.0
# 缓存
--- 目录 ~/.deepdive/cache
OK 可写 是
--- 条目 42 个文件 · 18.3 MB
--- 最旧 3 小时前
# llm
--- 基地址 http://localhost:3456
--- 模型 claude-sonnet-4-6
OK 可达 200 in 142ms
OK 探针 max_tokens=1 · in=3 out=1
# 搜索
--- 适配器 duckduckgo
OK 探针 4 个结果 in 380ms
# 浏览器
OK playwright 模块已加载
OK chromium 启动 + 关闭 in 244ms
摘要:13 个检查 · 8 ok · 0 警告 · 0 失败
```
如果有问题,退出代码为 1,否则为 0。 `--json` 用于结构化输出。
---
## 缓存
每次成功的获取都会进入 `~/.deepdive/cache/<sha256>.json`,有效期为 1 小时。重新运行相同的问题 - 或重新运行重叠 URL 的后续运行 - 永远不会重新打开 Chromium 以获取它已经拥有的源。问题细化期间的迭代是免费的。
通过 `--no-cache` 或 `DEEPDIVE_NO_CACHE=1` 禁用。通过 `DEEPDIVE_CACHE_DIR` 更改目录。通过 `--cache-ttl-ms` 或 `DEEPDIVE_CACHE_TTL_MS` 更改 TTL。
---
## 会话
每次成功的运行都保存到 `~/.deepdive/sessions/<id>.json` - 完整的计划、轮次跟踪、保留的源(及其提取的内容)、答案、验证报告和成本估算。每次运行后,deepdive 在标准错误中打印会话 ID:
```
会话 2026-05-07_134509_5959f102 (deepdive resume 2026-05-07_134509_5959f102)
```
四个子命令对已保存的会话进行操作:
```bash
deepdive sessions ls [<filter>] # 最新优先;可选问题过滤器;--tag=<t> 按标签过滤
deepdive sessions tag <id> client-x,audit # 追溯标记会话(标签也可以在运行时设置:--tag)
deepdive sessions untag <id> audit # 删除标签
deepdive stats # 总计:成本、来源、轮次、按模型分类的明细、日期范围
deepdive stats --tag=client-x # 相同,限定为一个标签 - 例如每个客户端的研究支出
deepdive sessions rm <id> [<id>...] # 删除一个或多个会话
deepdive sessions prune --older-than=30d # 删除旧会话(和/或 --keep=N;--dry-run 预览)
deepdive show <id> # 重新打印原始 Markdown 答案
deepdive resume <id> [<new-question>] # 重新合成现有源库(廉价)
deepdive continue <id> [<refined-question>] # 完整运行,以保存的源库为种子(添加新页面)
deepdive export <id> --format=html # 渲染可共享的、自成体系的 HTML 报告
deepdive diff <id-a> <id-b> # 两个运行之间答案 + 源的变化
```
`resume` 是廉价的迭代路径:它重新运行合成器(一个 LLM 调用)针对现有的源库,可选地使用新的问题或细化。无需重新搜索,无需重新获取,无需批评循环。这关闭了页面缓存打开的迭代循环 - 缓存停止重新获取页面,但 `resume` 停止重新运行整个管道。细化“X 对 Y 说什么”变成“X 在 2024 年后对 Y 说什么”只需一次合成而不是整个深层运行。
`continue` (v0.12.0)是深化路径:它运行 **完整** 的代理循环 - 计划、搜索、获取 - 将父会话的源库作为种子。父会话中已有的 URL 将被新搜索结果的 URL 去重,因此你永远不会重新获取已经付费的内容。新运行将作为一个新会话保存,其 `parentId` 设置为父会话的 ID,并继承父会话的标签。
ID 以时间戳前缀(`YYYY-MM-DD_HHMMSS_<8-hex>`),因此它们按时间顺序排列,您可以传递一个唯一的 前缀 而不是输入完整的 ID(`deepdive resume 2026-05-07_134509`)。
**标签** 组织语料库。您可以像创建会话时一样标记运行(`deepdive "..." --tag=client-x,audit`,或 `DEEPDIVE_TAGS` / 配置文件 `tags` 默认),或之后使用 `sessions tag`。标签规范为小写字母,在列表中显示为 `#client-x`,并限定 `sessions ls --tag=<t>` 和 `stats --tag=<t>` - 因此“client X 本月花费多少研究费用?”是一个命令。 `--tag` **过滤器** 仅来自显式标志;配置文件默认标签标记新运行,但从不静默隐藏会话列表。
`prune` 保持您的本地语料库不会无限增长。 `--older-than` 接受一个持续时间(`30d`、`12h`、`90m`、`2w` 或纯整数 = 天数); `--keep=N` 始终保留最新的 N 个,无论年龄如何;同时传递两者,只有当会话超过保留的最新的 **和** 旧于截止日期时,才会删除会话。 `--dry-run` 打印确切的删除内容而不会删除任何内容。 如果没有标志,`prune` 拒绝运行 - 默认情况下它永远不会删除您的历史记录。
通过 `--no-sessions` 或 `DEEPDIVE_NO_SESSIONS=1` 禁用。通过 `DEEPDIVE_SESSIONS_DIR` 更改目录。
---
## 导出可共享的报告
终端 Markdown 对您来说很好;这不是您交给同事的内容。 `deepdive export` 将任何已保存的会话转换为一个精致的 **单文件、自成体系的 HTML 文档** - 内联 CSS,无脚本,无远程资产,支持浅色/深色主题,打印友好。它在任何浏览器中打开,干净地发送电子邮件,并作为工件提交。内联 `[N]` 引用变成上标链接,跳转到源列表。
```bash
deepdive export 2026-05-07_134509 --out=report.html # 从 .html 推断格式
deepdive export 2026-05-07 --format=html > report.html # 或输出到 stdout
deepdive export 2026-05-07 --format=md # 重新渲染原始引用 Markdown
```
Markdown→HTML 渲染是手工制作的(`src/markdown.ts`),因此导出 **没有运行时依赖** - 与工具的其他部分一样保证审计一小时内完成。 HTML 从保存的会话生成,因此您可以导出几周前运行的内容而无需重新花费令牌。
长报告自动生成 **目录** (当答案有 3+ 个章节标题时),每个标题都有一个稳定的锚点 ID - 因此您可以将同事直接链接到 `report.html#pricing-changes`。
要渲染 **和** 在一个步骤中打开它,`deepdive open <id>` 将 HTML 写入临时文件(或 `--out=<path>`),并启动您的默认浏览器 - 文件路径始终打印,因此它在无头盒上也适用。
---
## 两个运行之间的差异
这是托管工具在结构上无法提供的内容:您的过去研究是 **您** 的本地语料库,因此您可以完全离线地询问“自上次以来有什么变化?”。 `deepdive diff` 比较两个已保存的会话,并显示答案 - 以及背后的源 - 之间的变化。
```bash
deepdive diff 2026-05-07 2026-06-01
```
```
diff 2026-05-07_120000_aaaaaaaa → 2026-06-01_120000_bbbbbbbb
25d apart · 2026-05-07 → 2026-06-01
元数据
模型 claude-sonnet-4-6 → claude-opus-4-8
来源 2
来源 +1 / -1 / 1 shared
+ https://newsource.com/z
- https://example.com/y
答案 +1 / -1 行(3 不变)
…
- 5 小时桶在滚动窗口中重置 [2]
+ 5 小时桶在固定 UTC 界限重置 [2]
```
源集的增量(添加/删除/共享)基于规范化的 URL,答案差异是确定性行差异,折叠不变上下文。添加 `--narrate` 获取一次 LLM 总结实际发生的变化 - 新声明、丢弃的声明、反转 - 5 小时桶在固定 UTC 边界重置 [2]
```
源集增量(添加/删除/共享)基于规范化 URL,答案差异是确定性行差异。添加 `--json` 以导出结构化差异(和叙述)以便管道传输。
**或者在一个命令中做整个循环。** `deepdive rerun <id>` 重新运行已保存会话的问题 **全新** - 新搜索,新获取,**不** 以父会话的源作为种子(那是 `continue`),因此两次运行是独立的快照 - 将结果保存为一个新会话,链接到父会话,其标签继承父会话,然后自动打印差异:
```bash
deepdive rerun 2026-05-07 --narrate # 每月跟踪快速变化的话题
```
`rerun` 与 `continue`:`continue` **扩展** 一个语料库(保留父语料库,增加页面 - 答案质量复合)。`rerun` **重新测量**(新的语料库 - 现在 web 说什么?)。使用 `continue` 来深入,使用 `rerun` 来跟踪时间变化。
---
## 库模式
```ts
import {
runAgent,
resolveSearchAdapter,
resolveConfig,
createCache,
} from "@askalf/deepdive";
const config = resolveConfig({ deepRounds: 2 }, process.env);
const search = await resolveSearchAdapter(config.searchAdapter, process.env);
const cache = config.cache.enabled
? createCache({ dir: config.cache.dir, ttlMs: config.cache.ttlMs })
: undefined;
const result = await runAgent("how does claude's rate limiter work", {
llm: config.llm,
search,
browser: config.browser,
resultsPerQuery: config.resultsPerQuery,
maxSources: config.maxSources,
maxWordsPerSource: config.maxWordsPerSource,
deepRounds: config.deepRounds,
concurrency: config.concurrency,
cache,
onEvent: (e) => console.error(e),
});
console.log(result.markdown);
console.log(`rounds: ${result.usage.rounds} · sources: ${result.usage.kept} · cache hits: ${result.usage.cacheHits}`);
```
所有事件类型、轮次跟踪结构和浏览器工厂注入点均导出用于编程使用。参见 `src/index.ts`。
---
## 信任与透明度
| 信号 | 状态 |
|---|---|
| **运行时依赖** | 一个必需的 - `playwright` - 以及一个 *可选* 的 PDF 提取依赖项(安装会跳过它;参见 PDF 部分)。没有托管服务,没有遥测。 |
| **凭证** | API 密钥存在于环境变量或 CLI 标志中;deepdive 永远不会保留它们。缓存文件仅存储获取的页面内容,而不是身份验证信息。 |
| **网络范围** | LLM 端点(您选择)、搜索后端(您选择)和实际 URL 地址,deepdive 挑选的页面来读取。没有其他出站流量。通过运行期间的 `lsof -i` 进行验证。 |
| **遥测** | 无。零分析、跟踪或数据收集。有意为之,而非仅是宣称。 |
| **许可证** | MIT |
参见 [DISCLAIMER.md](DISCLAIMER.md) 以获取完整的 AS IS / 无关联 / 用户责任条款。
---
## 贡献
欢迎提交 PR。代码风格符合 [dario](https://github.com/askalf/dario) - 小规模 TypeScript,纯决策函数,`node --test` 断言任何具有逻辑的代码。 在提交之前运行 `npm run build && npm test`。
---
## 许可证
MIT - 参见 [LICENSE](LICENSE) 和 [DISCLAIMER.md](DISCLAIMER.md)。
---
## 拥有您的堆栈
是 **[拥有您的堆栈](https://github.com/askalf)** 的一部分 - 拥有您的 AI 基础设施而不是租用它。 一个订阅。您的盒子。您的条款。
- **[dario](https://github.com/askalf/dario)** - 拥有您的路由
- **[hybrid](https://github.com/askalf/hybrid)** - 拥有您的推理
- **[deepdive](https://github.com/askalf/deepdive)** - 拥有您的研究 _(您在这里)_
- **[hands](https://github.com/askalf/hands)** - 拥有您的计算机使用权
- **[browser-bridge](https://github.com/askalf/browser-bridge)** - 拥有您的浏览器
- **[redstamp](https://github.com/askalf/redstamp)** - 拥有您的代理安全
- **[truecopy](https://github.com/askalf/truecopy)** - 拥有您的代理技能
- **[strongroom](https://github.com/askalf/strongroom)** - 拥有您的代理秘密
- **[cordon](https://github.com/askalf/cordon)** - 拥有您的提示
- **[fieldpass](https://github.com/askalf/fieldpass)** - 拥有您的代理浏览器
- **[amnesia](https://github.com/askalf/amnesia)** - 拥有您的搜索
- **[askalf](https://askalf.org)** - 拥有您的运营:Sprayberry Labs 运行的 AI 运营
---
Part of **[Own Your Stack](https://github.com/askalf)** - own your AI infrastructure instead of renting it. Built by Thomas Sprayberry.
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器