Doramagic 项目包 · 项目说明书

deep-research-web-ui 项目

(支持 DeepSeek R1)一款 AI 驱动的研究助手,通过结合搜索引擎、网页抓取与大语言模型,对任意主题进行迭代式的深度研究。

项目概览与特性

Deep Research Web UI 是 dzhng/deep-research 的可视化前端实现,对原项目在交互、可用性与部署方面进行了多项改进 资料来源:[README.md:1-3]()。项目提供浏览器端的研究流程编排能力:用户输入研究主题后,AI 会先询问澄清问题,然后自动进行多轮网络搜索,最终输出结构化的研究报告 资料来源:[i18n/zh.json:1-18...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 3.1 隐私与部署

继续阅读本节完整说明和来源证据。

章节 3.2 实时反馈与可视化

继续阅读本节完整说明和来源证据。

章节 3.3 多供应商兼容

继续阅读本节完整说明和来源证据。

一、项目定位与目标

Deep Research Web UI 是 dzhng/deep-research 的可视化前端实现,对原项目在交互、可用性与部署方面进行了多项改进 资料来源:README.md:1-3。项目提供浏览器端的研究流程编排能力:用户输入研究主题后,AI 会先询问澄清问题,然后自动进行多轮网络搜索,最终输出结构化的研究报告 资料来源:i18n/zh.json:1-180

整个应用基于 Nuxt 3 框架构建,并通过 edgeone.json 中的 buildCommand: pnpm generate:optimize 生成静态站点,可托管在任意 CDN 或静态服务上 资料来源:edgeone.json:1-18

二、四大研究流程

UI 将研究过程拆分为四个连续阶段,所有阶段共用同一个研究目标(research goal):

  1. 研究主题(researchTopic)—— 输入主题、设置问题数、深度(depth)与广度(breadth)。
  2. 模型反馈(modelFeedback)—— AI 给出追问列表,用于澄清研究方向。
  3. 联网搜索(webBrowsing)—— 根据反馈生成搜索任务并迭代 depth 轮,结果以树状结构可视化。
  4. 研究报告(researchReport)—— 汇总所有访问过的 URL 与学习要点,生成可导出的报告。
flowchart LR
    A[1. 研究主题] --> B[2. 模型反馈]
    B --> C[3. 联网搜索<br/>depth 轮迭代]
    C --> D[4. 研究报告<br/>导出 PDF / Markdown]
    C -.失败重试.-> C
    D -.重新生成.-> D

资料来源:i18n/zh.json:135-180 中的 researchTopicmodelFeedbackwebBrowsingresearchReport 四个顶级键。

三、核心特性一览

3.1 隐私与部署

  • 客户端模式(Client Mode):配置和 API 请求均通过浏览器本地发出,不经服务端转发 资料来源:README.md:9-10
  • 服务端模式(Server Mode):v1.2.0 引入,通过环境变量集中注入配置,终端用户无需手动填写密钥 资料来源:README.md:14-15
  • Docker 一键部署:内置 Docker 镜像,便于私有化 资料来源:README.md:13

3.2 实时反馈与可视化

  • 使用 Vercel AI SDK 的流式响应,将 AI 的 reasoningtext-delta chunk 实时展示给用户 资料来源:shared/utils/json.ts:7-32`。
  • 搜索过程以树状结构呈现,支持点击节点查看访问 URL、生成的搜索词与学习结论 资料来源:i18n/zh.json:155-175`。
  • 支持搜索流程全屏放大(v1.1.4),便于追踪长时间运行的研究 资料来源:社区讨论 #69

3.3 多供应商兼容

底层使用纯提示词而非 OpenAI 较新的 Structured Outputs 特性,因此可以兼容更多尚不支持新接口的供应商 资料来源:README.md:12-13`。

类别已支持的供应商
AI 服务OpenAI Compatible、SiliconFlow、InfiniAI、DeepSeek、OpenRouter、Ollama、302.AI
联网搜索Tavily、Firecrawl(云端 / 自部署)、fastCRW(crw,云端 / 自部署)、Google PSE

资料来源:README.md:18-21README_zh.md:10-12`。

3.4 报告导出与历史

  • 报告可导出为 Markdown 或通过浏览器原生打印能力导出为 PDF(v1.1.5 起) 资料来源:社区 Release v1.1.5
  • 报告内置来源引用(citation),与研究阶段收集的 URL 一一对应 资料来源:社区 Release v1.1.7
  • 提供本地历史记录功能,支持导出 / 导入,方便跨设备复用 资料来源:i18n/zh.json:35-55社区 Issue #57

四、配置架构

4.1 双模式运行时配置

shared/types/config.ts 定义了两套配置结构:

  • ServerRuntimeConfig:包含敏感字段(API Key、API Base),仅在服务端可用。
  • PublicRuntimeConfig:仅暴露非敏感字段(provider 名称、模型名、上下文长度、并发数等),可下发到浏览器。

资料来源:shared/types/config.ts:1-50`。

4.2 服务端模式环境变量

服务端模式下,管理员通过 NUXT_* 前缀的环境变量注入配置,覆盖上文 ServerRuntimeConfig 的全部字段;NUXT_PUBLIC_* 系列则会下发给浏览器决定默认 UI 选项 资料来源:README_zh.md:60-86

4.3 核心能力聚合

lib/core/index.ts 仅作为门面(facade)模块,统一对外暴露 deep-researchfeedback 两个核心模块,避免上层页面直接依赖散落的实现 资料来源:lib/core/index.ts:1-3`。

五、国际化与用户体验

应用已内置三种语言:

资料来源:i18n/zh.json:1i18n/en.json:1]i18n/nl.json:1]()

另外,应用会在启动后检查 version.json 并提示新版本(autoUpdate),自托管用户被提醒重新部署以获取修复 资料来源:i18n/zh.json:90-100。当某个供应商拒绝跨域请求时,UI 会展示明确的 CORS 错误提示,引导用户切换服务 资料来源:i18n/zh.json:85-88

资料来源:i18n/zh.json:135-180 中的 researchTopicmodelFeedbackwebBrowsingresearchReport 四个顶级键。

系统架构与数据流

Deep Research Web UI 是 dzhng/deep-research 的可视化前端实现,基于 Nuxt 3 构建。其设计目标是在浏览器侧完成所有 AI 与联网搜索调用,避免后端代理密钥,从而在「客户端模式」下实现隐私安全 (README.md:1-15)。同时,自 v1.2.0 起新增「服务端模式」,允许通过环境变量统一配置 API 密钥,用户无需在浏览器侧...

章节 相关页面

继续阅读本节完整说明和来源证据。

整体架构概览

Deep Research Web UI 是 dzhng/deep-research 的可视化前端实现,基于 Nuxt 3 构建。其设计目标是在浏览器侧完成所有 AI 与联网搜索调用,避免后端代理密钥,从而在「客户端模式」下实现隐私安全 (README.md:1-15)。同时,自 v1.2.0 起新增「服务端模式」,允许通过环境变量统一配置 API 密钥,用户无需在浏览器侧填写 (README.md:13-15)。

项目结构由三层组成:

  • UI 层:Nuxt 应用页面,包含研究主题输入、模型反馈、联网搜索流程可视化与研究报告输出四个步骤。
  • 核心逻辑层 (lib/core):封装深度研究与反馈生成的算法,由 lib/core/index.ts 统一导出 (lib/core/index.ts:1-4)。
  • 共享工具层 (shared):跨页面复用的工具函数,例如流式 JSON 解析。
flowchart LR
    A[用户输入研究主题] --> B[模型反馈<br/>生成追问]
    B --> C[联网搜索<br/>树状结构]
    C --> D[深度迭代<br/>depth / breadth]
    D --> E[研究报告生成]
    E --> F[导出 Markdown / PDF]

    subgraph 客户端浏览器
    A
    B
    C
    D
    E
    F
    end

    C -. API .-> G[Tavily / Firecrawl<br/>fastCRW / Google PSE]
    B -. API .-> H[OpenAI Compatible<br/>SiliconFlow / InfiniAI<br/>DeepSeek / 302.AI / Ollama]
    E -. API .-> H

核心模块组成

lib/core/index.ts 充当核心逻辑的总入口,对外仅暴露两个模块:deep-researchfeedback (lib/core/index.ts:1-4)。这种最小化导出策略有助于保持核心库的可移植性,便于未来在 Node CLI、测试或服务端 API 中复用同一份逻辑。

shared/utils/json.ts 提供 parseStreamingJson 生成器,接收来自 AI SDK 的流式片段 (AsyncIterable<TextStreamPart<any>>),通过累积文本并反复调用 parsePartialJson 实现「边生成边解析」的能力 (shared/utils/json.ts:1-43)。当流结束时若仍无法成功解析,会通过 bad-end 事件通知调用方 (shared/utils/json.ts:40-43),对应 UI 中常见的「invalidStructuredOutput 模型返回的内容无效或不完整」错误提示 (i18n/zh.json)。

研究流程数据流

研究流程由四个阶段串成 (i18n/zh.json):

  1. 研究主题 (researchTopic):用户输入主题,配置问题数量 (numOfQuestions)、研究深度 (depth) 与广度 (breadth),其中广度在每轮迭代中折半 (i18n/zh.json)。
  2. 模型反馈 (modelFeedback):AI 主动生成追问以澄清研究目标;用户提交回答后流入下一阶段。
  3. 联网搜索 (webBrowsing):根据研究目标调用联网搜索服务,按树状结构生成节点;用户可点击节点查看「研究目标 / 访问网址 / 结论」三项详情 (i18n/zh.json)。该流程支持全屏模式 (v1.1.4) 与失败节点重试 (v1.1.3)。
  4. 研究报告 (researchReport):综合所有节点结论后生成最终报告,支持浏览器原生打印为 PDF 或导出 Markdown (v1.1.5),并在 v1.1.7 起在报告中附带来源引用信息。

流式处理通过 parseStreamingJson 串联起 AI SDK 的 text-deltareasoning 事件,将「思考中 / 思考完毕」状态实时映射到 UI 的 modelThinking 文案 (i18n/en.json)。

部署模式与配置

项目支持两种部署模式,可通过 NUXT_PUBLIC_SERVER_MODE 环境变量切换 (README_zh.md):

模式配置位置适用场景
客户端模式 (Client Mode)浏览器 localStorage静态部署、EdgeOne Pages、Docker 默认模式
服务端模式 (Server Mode)容器环境变量 .env团队/朋友共享部署,避免每个用户手动填写长密钥

服务端模式下,NUXT_WEB_SEARCH_API_KEY 支持使用逗号分隔配置多个 Tavily 或 Google PSE 密钥以实现轮询(社区 PR #76 / #77 已合入),有效缓解单账号每月 1000 次搜索额度的限制。edgeone.json 描述了 EdgeOne Pages 的构建命令 (pnpm generate:optimize) 与输出目录 (.output/public),并为 /version.json 设置了 Cache-Control: max-age=0 以便前端自动检测更新 (edgeone.json:1-18)。

国际化与前端结构

i18n 通过 i18n/zh.jsoni18n/en.jsoni18n/nl.json 三个词典文件实现,每个文件结构对应到 UI 上的命名空间(index / settings / researchTopic / modelFeedback / webBrowsing / researchReport / error / autoUpdate / serverMode / history),并使用 {0} 占位符实现动态插值 (i18n/zh.json)。新增荷兰语翻译 (NL) 于 v1.1.3 发布。前端的 serverMode 命名空间用于在服务端模式下提示用户「当前配置由服务器管理员设置」,加载失败时给出 loadFailed 提示 (i18n/en.json)。

常见失败模式与社区反馈

  • CORS 跨域被拦截:当 API 提供商未配置允许跨域时,浏览器会阻断请求;前端通过 error.requestBlockedByCORS 文案引导用户更换供应商 (i18n/zh.json)。社区 issue #70 反馈 Azure OpenAI 拼接 base URL 出错,也与该机制相关。
  • Firecrawl 自部署限流不生效(issue #73):当使用自部署 Firecrawl 时,客户端的 concurrencyLimit 与服务端实际并发数不匹配,仍可能触发限流。
  • 重试失败节点无响应(issue #71):在 network error 后点击 webBrowsing.retry 文案对应的按钮偶现无反应,这是 v1.1.3 引入的节点级重试能力的已知边界。
  • 报告内容单薄(issue #69):前端在最终报告阶段仅做一次总结型调用,深度受限于模型的 contextSize 设置,建议配合更大的上下文窗口或多轮迭代。

See Also

来源:https://github.com/AnotiaWang/deep-research-web-ui / 项目说明书

AI 服务商集成

AI 服务商集成是 Deep Research Web UI 的核心能力之一,它把不同厂商的大模型 API 统一封装到前端可调用的接口中,使用户能够通过浏览器或服务端配置接入多种 AI 推理服务。本项目使用纯提示词(prompts)而非结构化输出(Structured Outputs)等较新特性,从而保证与尚未跟进 OpenAI 最新能力的更多厂商兼容 资料来源:READM...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 客户端模式(Client Mode)

继续阅读本节完整说明和来源证据。

章节 服务端模式(Server Mode)

继续阅读本节完整说明和来源证据。

章节 AI 设置项

继续阅读本节完整说明和来源证据。

概述

AI 服务商集成是 Deep Research Web UI 的核心能力之一,它把不同厂商的大模型 API 统一封装到前端可调用的接口中,使用户能够通过浏览器或服务端配置接入多种 AI 推理服务。本项目使用纯提示词(prompts)而非结构化输出(Structured Outputs)等较新特性,从而保证与尚未跟进 OpenAI 最新能力的更多厂商兼容 资料来源:README.md

核心入口由 lib/core/index.ts 统一对外暴露,文件中再导出 deep-researchfeedback 等模块:

// Re-export all core functionality
export * from './deep-research'
export * from './feedback'

资料来源:lib/core/index.ts:1-3

支持的服务商

当前 Deep Research Web UI 已通过统一的"OpenAI 兼容协议"适配多家人工智能服务商。项目在 README 中列出了下述受支持的供应商:

类别供应商备注
AI 服务OpenAI Compatible任意兼容 OpenAI 接口格式的供应商
AI 服务SiliconFlow(硅基流动)注册赠送 ¥14 免费额度
AI 服务InfiniAI(无问芯穹)支持 DeepSeek R1 满血推理加速版
AI 服务302.AI注册赠送 $1 免费额度(v1.2.0 新增)
AI 服务DeepSeek官方推理服务
AI 服务OpenRouter聚合多家模型
AI 服务Ollama本地部署
联网搜索Tavily每月 1000 次免费
联网搜索Firecrawl支持云端和自部署
联网搜索fastCRW与 Firecrawl 兼容的网页抓取服务
联网搜索Google PSE自定义搜索引擎(v1.1.9 新增)

资料来源:README.mdREADME_zh.mdi18n/zh.json

i18n/zh.json 中定义了 AI 服务的可选项(providers),明确区分了 openaiCompatiblesiliconflowinfiniai302-ai 四种内置配置,并通过文本描述(description)提示用户去相应平台生成 API key。

部署模式与配置

客户端模式(Client Mode)

客户端模式下,用户在浏览器中手动填写 API key、Base URL、模型名称等配置,所有请求直接从浏览器发出,配置和密钥均保存在本地 资料来源:i18n/zh.json。该模式适合静态部署(如 pnpm generate 输出或 EdgeOne Pages):

{
  "name": "deep-research-web",
  "buildCommand": "pnpm generate:optimize",
  "outputDirectory": ".output/public",
  "nodeVersion": "20.18.0"
}

资料来源:edgeone.json

服务端模式(Server Mode)

v1.2.0 引入了服务端模式:API key 以环境变量形式注入,部署后用户无需在 UI 中配置密钥 资料来源:README.md。典型 Docker 启动方式如下:

docker run -p 3000:3000 \
  -e NUXT_PUBLIC_SERVER_MODE=true \
  -e NUXT_AI_API_KEY=your-ai-api-key \
  -e NUXT_WEB_SEARCH_API_KEY=your-search-api-key \
  -e NUXT_PUBLIC_AI_PROVIDER=openai-compatible

NUXT_WEB_SEARCH_API_KEY 支持为 Tavily、Google PSE 等传入逗号分隔的多个密钥以实现轮询(key rotation),参考社区 PR #76 / #77 资料来源:README_zh.mdi18n/en.json 中定义了 serverMode 字段(如 aiProvideraiModelwebSearchProvidersearchLanguage),用于在界面上呈现"由服务器管理员设置"的相关提示。

AI 设置项

设置面板中的 AI 配置项在 i18n 资源中具有统一定义:

字段含义
providerAI 服务商
apiKeyAPI 密钥
apiBaseAPI Base URL
model模型名称
contextSize上下文长度,限制发送给模型的最大 token 数

资料来源:i18n/zh.jsoni18n/en.json

v1.1.5 修复了"contextSize"未正确应用的 Bug;v1.1.8 改进了在没有填写 API key 时仍尝试拉取模型列表的能力 资料来源:README.md

流式响应与结构化解析

AI 在执行"追问→搜索→总结"链路时,需要在前端实时解析模型流式输出。shared/utils/json.ts 提供了基于 parsePartialJson 与 zod schema 的流式解析能力,能够区分 reasoningtext-deltaerror 等事件,并对残缺 JSON 做容错(repaired-parse / successful-parse):

for await (const chunk of fullStream) {
  if (chunk.type === 'reasoning') {
    yield { type: 'reasoning', delta: chunk.textDelta }
    continue
  }
  if (chunk.type === 'error') {
    yield {
      type: 'error',
      message: chunk.error instanceof Error ? chunk.error.message : String(chunk.error),
    }
    continue
  }
  if (chunk.type === 'text-delta') {
    rawText += chunk.textDelta
    const parsed = parsePartialJson(removeJsonMarkdown(rawText))
    isParseSuccessful = parsed.state === 'repaired-parse' || parsed.state === 'successful-parse'
    if (isParseSuccessful && isValid(parsed.value as any)) {
      yield { type: 'object', value: parsed.value }
    }
  }
}

资料来源:shared/utils/json.ts

这套机制同时支持推理模型(如 DeepSeek R1)和普通对话模型:当模型输出 reasoning 类型时,前端可单独展示"思考中"状态,i18n/zh.json 中通过 modelThinkingmodelThinkingComplete 进行了本地化。如果最终未能解析成功,将抛出 bad-end 事件,UI 给出"无效或不完整"的提示,提示用户更换为更大或更"聪明"的模型 资料来源:i18n/zh.json

常见问题

  • CORS 拦截:当选择某些小众 AI 服务商时,浏览器端直接请求可能被 CORS 策略阻止,i18n 中专门给出了 requestBlockedByCORS 错误提示,建议用户更换服务或联系服务方 资料来源:i18n/en.json
  • Azure OpenAI 适配:社区反馈拼接 base URL 时未考虑 Azure 的 api-version 概念,会出现"资源不存在"错误,相关讨论见 issue #70 资料来源:README.md(社区上下文)。
  • API 调用封装:用户曾请求将整个研究流程封装为单一 API(issue #79 / #78),目前 UI 仍以交互式页面为主,但服务端模式的引入为后续开放 HTTP 接口奠定了基础。
  • 密钥轮询:Tavily 单账号每月 1000 次额度常被耗尽,社区 PR #77 已经把 Tavily 与 Google PSE 的多密钥轮询合并实现,可通过 NUXT_WEB_SEARCH_API_KEY=key1,key2,key3 启用 资料来源:README_zh.md

See Also

资料来源:lib/core/index.ts:1-3

前端组件与搜索可视化

Deep Research Web UI 是一个基于 Nuxt 构建的可视化前端,为 dzhng/deep-research 提供完整的浏览器端交互层。其核心特性之一是以树状结构实时可视化整个搜索研究过程,使用户能够观察 AI 如何自主分解问题、迭代查询并产出最终报告 资料来源:[README.md:1-15]()。

章节 相关页面

继续阅读本节完整说明和来源证据。

概述

Deep Research Web UI 是一个基于 Nuxt 构建的可视化前端,为 dzhng/deep-research 提供完整的浏览器端交互层。其核心特性之一是以树状结构实时可视化整个搜索研究过程,使用户能够观察 AI 如何自主分解问题、迭代查询并产出最终报告 资料来源:README.md:1-15

前端采用按步骤分阶段展示的交互模式:研究主题输入 → 模型反馈确认 → 联网搜索过程 → 最终报告输出。该流程在界面文案中分为四个阶段("1. 研究主题"到"4. 研究报告"),用户能够完整跟踪从提问到成稿的每一步 资料来源:i18n/zh.json:104-180

来源:https://github.com/AnotiaWang/deep-research-web-ui / 项目说明书

部署模式与运维配置

deep-research-web-ui 是一个基于 Nuxt 框架的 Web UI 项目,提供两种运行模式:客户端模式(Client Mode) 与 服务端模式(Server Mode)。自 v1.2.0 版本起,项目正式引入服务端模式,管理员可以通过环境变量在服务端预先配置 AI 与联网搜索服务,最终用户无需再手动填写 API Key。资料来源:[README.md:1...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 环境变量配置

继续阅读本节完整说明和来源证据。

章节 Provider 枚举值

继续阅读本节完整说明和来源证据。

章节 社区反馈驱动的演进

继续阅读本节完整说明和来源证据。

概述

deep-research-web-ui 是一个基于 Nuxt 框架的 Web UI 项目,提供两种运行模式:客户端模式(Client Mode)服务端模式(Server Mode)。自 v1.2.0 版本起,项目正式引入服务端模式,管理员可以通过环境变量在服务端预先配置 AI 与联网搜索服务,最终用户无需再手动填写 API Key。资料来源:README.md:1-30README_zh.md:1-30

两种模式下的核心差异在于配置注入位置与 API Key 暴露面:

  • 客户端模式:配置保存在浏览器本地(localStorage),所有 API 请求直接从浏览器发出,API Key 不会经过服务端。
  • 服务端模式:配置通过环境变量注入,最终用户在 UI 上看不到也不能修改 API Key。
flowchart LR
  A[用户浏览器] -->|Client Mode| B[(浏览器 localStorage)]
  A -->|Server Mode| C[Nuxt 服务端]
  C -->|读取环境变量| D[(NUXT_PUBLIC_* / NUXT_*)]
  B --> E[AI Provider API]
  C --> E
  C --> F[Web Search Provider API]
  B --> F

客户端模式(Client Mode)

客户端模式是项目的传统部署方式。用户在首次访问时通过设置面板填写 API Key、Base URL、模型名称、上下文长度等参数,所有数据均保存在浏览器本地,不会被上传到任何服务端。资料来源:README.md:7-10

部署方式包括:

  • EdgeOne Pages 一键部署edgeone.json 中声明了构建命令 pnpm generate:optimize、输出目录 .output/public 与 Node 版本 20.18.0,并对 version.json 配置 Cache-Control: public, max-age=0 以便版本自动更新提示能够及时生效。
  • Docker 部署:可直接拉取现成镜像 anotia/deep-research-web:latest,或克隆源码后使用项目根目录的 Dockerfile 自定义构建。资料来源:README_zh.md:73-85

客户端模式下,shared/types/config.ts 暴露的 PublicRuntimeConfigserverMode 字段为 false,设置面板中的 “AI 服务”、“联网搜索服务” 等选项全部对用户可见。资料来源:shared/types/config.ts:19-30

服务端模式(Server Mode)

服务端模式由 NUXT_PUBLIC_SERVER_MODE=true 启用。开启后,配置统一由服务端通过环境变量下发,前端通过 /api/config 之类的接口读取 PublicRuntimeConfig(不包含敏感字段),而 AI 与搜索的 API Key 仅在服务端侧用于发起请求。资料来源:shared/types/config.ts:1-30

环境变量配置

下表汇总了服务端模式的核心环境变量,值与默认值来源于 README 与 shared/types/config.ts 中的类型定义:

变量名作用默认值 / 示例
NUXT_PUBLIC_SERVER_MODE启用服务端模式false
NUXT_PUBLIC_AI_PROVIDERAI 服务商openai-compatible
NUXT_AI_API_KEYAI API Key-
NUXT_PUBLIC_AI_MODEL模型名称-
NUXT_PUBLIC_AI_CONTEXT_SIZE上下文长度-
NUXT_PUBLIC_WEB_SEARCH_PROVIDER搜索服务商tavily
NUXT_WEB_SEARCH_API_KEY搜索服务 API Key(支持多 Key 轮询,用逗号分隔)key1,key2,key3
NUXT_PUBLIC_WEB_SEARCH_CONCURRENCY_LIMIT最大并发数2
NUXT_PUBLIC_WEB_SEARCH_SEARCH_LANGUAGE搜索语言en
NUXT_PUBLIC_TAVILY_ADVANCED_SEARCHTavily 高级搜索false
NUXT_PUBLIC_TAVILY_SEARCH_TOPICTavily 搜索主题general
NUXT_PUBLIC_GOOGLE_PSE_IDGoogle PSE 引擎 ID(cx)-
NUXT_WEB_SEARCH_API_BASE自定义搜索服务 Base URL(用于 Firecrawl 自部署)-

资料来源:README_zh.md:92-115shared/types/config.ts:1-30

Provider 枚举值

ConfigAiProviderConfigWebSearchProvider 是联合类型,定义了受支持的供应商取值。资料来源:shared/types/config.ts

  • AI 服务商openai-compatiblesiliconflow302-aiinfiniaiopenrouterdeepseekollama。资料来源:i18n/zh.json:18-40 中的 settings.ai.providers` 节点也列出了部分供应商文案。
  • 联网搜索服务商tavilyfirecrawlcrw(fastCRW,兼容 Firecrawl 协议)、google-pse。资料来源:README_zh.md:117-124

社区反馈驱动的演进

  • #8 建议将所有配置项改为环境变量部署,以便在 Docker 下换浏览器或分享给他人时无需重复填 Key,最终在 v1.2.0 中以 “服务端模式” 实现。
  • #75 提出 Tavily 单 Key 每月 1000 次不够用,PR #76/#77 引入了 Tavily 与 Google PSE 的多 Key 轮询支持——服务端模式下可通过 NUXT_WEB_SEARCH_API_KEY=key1,key2,key3 形式传入。资料来源:README_zh.md:112-114
  • #70 报告 Azure OpenAI 由于拼接 Base URL 时缺少 api-version 概念而失败,社区仍在跟进。
  • #73 报告自部署 Firecrawl 的并发限制未生效,可通过调整 NUXT_PUBLIC_WEB_SEARCH_CONCURRENCY_LIMIT 并升级到最新版本验证。

构建命令与本地开发

项目使用 pnpm 作为包管理器,常见命令如下(参见 README_zh.md):

# 本地开发,访问 http://localhost:3000
pnpm dev

# 生产构建(SSR)
pnpm build

# 静态生成(用于 EdgeOne Pages / 静态部署)
pnpm generate

# 预览生产构建
pnpm preview

lib/core/index.ts 重新导出了 deep-researchfeedback 核心模块。资料来源:lib/core/index.ts:1-4

国际化与版本提示

UI 通过 i18n/ 下的语言文件实现多语言切换:

当检测到新版本时,前端会通过 autoUpdate.newVersionTitle / autoUpdate.refresh 提示用户刷新页面;自部署用户需重新拉取镜像或重新部署。资料来源:i18n/zh.jsoni18n/en.json

See Also

资料来源:README_zh.md:92-115shared/types/config.ts:1-30

配置、状态管理与历史记录

Deep Research Web UI 提供两套并行的配置通路:客户端模式(Client Mode)下配置完全保存在浏览器本地(localStorage),所有 API 请求也从浏览器直发;服务端模式(Server Mode)下则由部署方通过环境变量注入,终端用户无需也无法修改任何密钥。两种模式共享同一份类型定义,便于维护与扩展。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 关键环境变量

继续阅读本节完整说明和来源证据。

章节 记录结构

继续阅读本节完整说明和来源证据。

章节 导入 / 导出

继续阅读本节完整说明和来源证据。

配置系统概览

Deep Research Web UI 提供两套并行的配置通路:客户端模式(Client Mode)下配置完全保存在浏览器本地(localStorage),所有 API 请求也从浏览器直发;服务端模式(Server Mode)下则由部署方通过环境变量注入,终端用户无需也无法修改任何密钥。两种模式共享同一份类型定义,便于维护与扩展。

shared/types/config.ts 中定义了 ServerRuntimeConfigPublicRuntimeConfig 两套接口:

  • ServerRuntimeConfig 仅在服务端可见,包含 aiApiKeyaiApiBasewebSearchApiKey 等敏感字段;
  • PublicRuntimeConfig 暴露给浏览器,只包含供应商、模型、并发数等非敏感项,以便前端在不泄露密钥的前提下渲染配置界面。

字段示例(含 tavilyAdvancedSearchtavilySearchTopicgooglePseId 等)直接来源于 shared/types/config.ts 的类型定义,体现了对多供应商、多参数配置的统一抽象。

关键环境变量

服务端模式通过 Nuxt 的 runtimeConfig 注入,下表汇总了 README_zh.md 中列出的核心变量:

变量名含义默认值
NUXT_PUBLIC_SERVER_MODE是否启用服务端模式false
NUXT_PUBLIC_AI_PROVIDERAI 供应商标识openai-compatible
NUXT_AI_API_KEYAI 服务的 API 密钥-
NUXT_PUBLIC_AI_MODEL默认模型名-
NUXT_PUBLIC_AI_CONTEXT_SIZE上下文长度-
NUXT_PUBLIC_WEB_SEARCH_PROVIDER搜索服务商tavily
NUXT_PUBLIC_WEB_SEARCH_CONCURRENCY_LIMIT最大并发数2
NUXT_WEB_SEARCH_API_KEY搜索 API 密钥(支持逗号分隔多 Key)-
NUXT_PUBLIC_GOOGLE_PSE_IDGoogle PSE 的 cx 值-

资料来源:README_zh.md 中的“服务端模式”章节。其中特别说明:NUXT_WEB_SEARCH_API_KEY 支持以逗号分隔的多个密钥轮询,这是社区 #75 议题(Tavily Key 轮询)落地后的实现,相关 PR 已被合并。

客户端状态管理

前端使用 Pinia 风格的 store 进行状态管理,主入口为 app/stores/config.ts。在客户端模式下,store 会在应用启动时从 localStorage 读取历史配置并回填表单,UI 提示文案“所有设置本地保存”也来自 i18n/zh.jsonsettings.disclaimer 字段。

切换至服务端模式时,store 会优先请求 /api/config(或等价的运行时配置接口)获取 PublicRuntimeConfig,并将表单设为只读,顶部显示来自 settings.configNotice 的提示:“当前配置由服务器管理员设置,如需修改请联系管理员。”这种“单一可信来源 + 只读回显”的策略保证运维体验与终端用户隐私的平衡。

并发限制、AI 上下文长度等运行期参数都通过 store 注入到 lib/core 的搜索循环中;其中 NUXT_PUBLIC_AI_CONTEXT_SIZE 解决了 v1.1.5 中“上下文大小设置未生效”的回归问题。

历史记录

历史记录是 v1.2.0 周期内最受欢迎的社区功能之一,源自议题 #57 “保留历史记录”。其核心职责是把一次完整的研究会话持久化到浏览器,便于用户回看、分享或重新发起。

记录结构

单条历史记录(app/types/history.ts)至少包含:

  • id:会话唯一标识;
  • topic:研究主题;
  • createdAt:创建时间;
  • feedbackQuestions / feedbackAnswers:模型反馈回合的问答对;
  • searchTree:搜索节点树,节点字段(researchGoalvisitedUrlslearnings 等)来自 i18n/zh.jsonwebBrowsing 命名空间;
  • report:最终生成的 Markdown 报告;
  • 元信息:depthbreadthnumOfQuestions 等可在列表中展示的轻量摘要。

导入 / 导出

历史记录面板(app/components/History/HistoryModal.vue)通过 app/composables/useHistory.ts 暴露的 exportHistory / importHistory 完成 JSON 序列化与反序列化:

// 伪代码,源自 useHistory.ts 的实现思路
const exportHistory = () => download(JSON.stringify(records, null, 2))
const importHistory = (file) => readJson(file).then(mergeIntoStore)

导入成功后弹出 history.importSuccess 提示,失败时显示 history.importFailed,相关文案可在 i18n/zh.jsoni18n/en.jsonhistory 命名空间下找到。deleteAllconfirmDeleteAll 则通过二次确认弹窗防止误删。

社区反馈与已知问题

  • 环境变量部署(issue #8):在 v1.2.0 之前,Docker 用户每次清浏览器缓存都需重新填写密钥;服务端模式落地后,通过环境变量集中托管成为推荐方案。
  • Firecrawl 速率限制不生效(issue #73):自部署 Firecrawl 时,NUXT_PUBLIC_WEB_SEARCH_CONCURRENCY_LIMIT 在某些版本下未传递到抓取层,需确认 app/composables/useHistory.ts 同级的 useWebSearch 实现是否读取了该字段。
  • Azure OpenAI base URL 拼接错误(issue #70):配置 Azure 时缺少 api-version 概念,属于配置 schema 的边界情况,修改时需同时考虑 shared/types/config.ts 的扩展点。
  • 历史记录分享:多位用户在 #57 中表示希望“分享给同事”,当前通过 JSON 导出/导入的方式间接实现,未来若开放 API(issue #79)则可借助 Markdown 字符串直接返回报告。

参见

资料来源:README_zh.md 中的“服务端模式”章节。其中特别说明:NUXT_WEB_SEARCH_API_KEY 支持以逗号分隔的多个密钥轮询,这是社区 #75 议题(Tavily Key 轮询)落地后的实现,相关 PR 已被合并。

已知问题与故障排查

本文汇总 deep-research-web-ui 项目中常见的故障表现、根因与排查思路,覆盖部署配置、运行时错误、功能限制三大类。所有结论均来源于仓库源码与社区 Issue 记录。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 静态资源缺失(assets/js/ 找不到)

继续阅读本节完整说明和来源证据。

章节 服务端模式与多浏览器复用配置

继续阅读本节完整说明和来源证据。

章节 Azure OpenAI 资源不存在

继续阅读本节完整说明和来源证据。

概述

deep-research-web-uidzhng/deep-research 的可视化前端,支持客户端模式与服务端模式(Server Mode)两种运行方式 (README.md)。由于其依赖 LLM 响应、联网搜索与可选的 Firecrawl 抓取等多服务协作,链路较长,故障表现也呈多样化。下图梳理了用户从部署到完成研究报告的典型调用路径,以及常见故障的注入点。

flowchart LR
  A[用户配置/环境变量] --> B[AI Provider]
  A --> C[Web Search Provider]
  C --> D[Firecrawl / Tavily / Google PSE]
  B --> E[流式 JSON 解析]
  D --> E
  E --> F[研究报告生成]
  F --> G[导出 PDF / Markdown]
  G -.失败/异常.-> H[错误诊断]
  B -.失败.-> H
  C -.失败.-> H
  D -.失败.-> H

部署与配置类问题

静态资源缺失(`assets/js/` 找不到)

社区反馈在自行构建 PWA manifest 与 sw.js 时会出现 assets/js/ couldn't find 错误,原因是 Nuxt 静态资源带有哈希指纹,与手写的 sw.js 引用不一致 (Issue #43)。建议在尝试二次改造 Service Worker 之前,先确认 EdgeOne Pages 构建产物(outputDirectory 已固定为 .output/publicedgeone.json:5)中实际产出的资源路径。

服务端模式与多浏览器复用配置

多浏览器/分享给同事时,每个客户端都需重填密钥较为繁琐 (Issue #8)。自 v1.2.0 起,可通过环境变量启用服务端模式 NUXT_PUBLIC_SERVER_MODE=true,由服务端统一下发配置;公开运行时配置见 PublicRuntimeConfig 接口,私密配置见 ServerRuntimeConfig (shared/types/config.ts:1-40)。

Azure OpenAI 资源不存在

配置 Azure OpenAI 时报“资源不存在” (Issue #70)。根本原因是拼接 base url 的方式与官方 api-version 参数语义不一致。建议改用 openai-compatible 模式并手动指定 apiBase 与模型名,避免依赖 Azure 自动拼接逻辑。

运行时故障

Firecrawl 自部署速率限制不生效

即便在 UI 中设置了速率限制,自托管 Firecrawl 仍可能报 rate limit (Issue #73)。其原因是当前应用层的并发限制仅作用于客户端调度队列,而不会回写到 Firecrawl 服务端。可通过降低 UI 中的“并发数”设置(默认 2)来规避,也可为自部署 Firecrawl 配置反向代理层面的限流。

联网搜索重试无反应

network error 后点击重试无效果 (Issue #71),属偶发问题。可检查浏览器控制台是否仍残留旧 SSE 连接未关闭;若使用 qwen2.5-32b-instruct 等长上下文模型,注意先在设置中调整 contextSize(参考 i18n/zh.jsoncontextSize 字段)以避免流式响应被截断。

模型返回无效 JSON

parseStreamingJson 在流末尾若解析失败会输出 bad-end 事件 (shared/utils/json.ts:42-52),对应 i18n 提示 invalidStructuredOutput(“模型返回的内容无效或不完整,无法解析”,i18n/en.json:8)。建议切换到更强的模型或在设置中调高 contextSize

CORS 跨域报错

浏览器直连某些 AI 服务时被拦截,提示 requestBlockedByCORSi18n/zh.json)。客户端模式下无服务器中转,只能更换支持跨域的供应商,或部署反向代理。

功能限制与已知缺口

Issue现象当前状态临时方案
#79缺少直接 API 调用入口open暂未支持,可在 lib/core/index.ts 导出 deep-research 后自行包装
#75Tavily/Google PSE 多 Key 轮询closed需手动应用 PR #77
#69最终报告内容单薄open在设置中调大 breadth / depth 让研究阶段收集更多素材
#57历史记录closedv1.1.x 已实现,可通过 UI 导出/导入(i18n/zh.json history 段)

错误诊断流程建议

  1. 复现并捕获浏览器控制台 / Docker 容器日志,确认异常发生在 AI、搜索还是抓取阶段。
  2. 若为模型输出异常,关注 parseStreamingJsonbad-end/error 事件(shared/utils/json.ts:22-50),并比对 i18n 错误键。
  3. 若为搜索链路异常,先收敛 Firecrawl 并发与 Tavily 主题配置,再核对 ServerRuntimeConfigtavilyAdvancedSearch 等布尔项是否正确下发。
  4. 服务端模式下,所有用户共享同一份配置,修改后需重启镜像以应用 NUXT_PUBLIC_* 环境变量。

See Also

来源:https://github.com/AnotiaWang/deep-research-web-ui / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:【建议】是否可以将相关变量作为环境变量进行设置

可能影响授权、密钥配置或安全边界。

medium 依赖 Docker 环境

非工程用户可能没有 Docker,启动成本明显增加。

medium 来源证据:[Feature] PWA functionality

可能增加新用户试用和生产接入成本。

medium 可能修改宿主 AI 配置

安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。

Pitfall Log / 踩坑日志

项目:AnotiaWang/deep-research-web-ui

摘要:发现 14 个潜在踩坑项,其中 1 个为 high/blocking;最高优先级:安全/权限坑 - 来源证据:【建议】是否可以将相关变量作为环境变量进行设置。

1. 安全/权限坑 · 来源证据:【建议】是否可以将相关变量作为环境变量进行设置

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:【建议】是否可以将相关变量作为环境变量进行设置
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 证据:community_evidence:github | https://github.com/AnotiaWang/deep-research-web-ui/issues/8 | 来源讨论提到 docker 相关条件,需在安装/试用前复核。

2. 安装坑 · 依赖 Docker 环境

  • 严重度:medium
  • 证据强度:runtime_trace
  • 发现:安装/运行入口包含 Docker 命令:docker run -p 3000:3000 -e NUXT_PUBLIC_SERVER_MODE=true -e NUXT_AI_API_KEY=your-ai-api-key -e NUXT_WEB_SEARCH_API_KEY=your-search-api-key -e NUXT_PUBLIC_AI_PROVIDER=openai-compatible -e NUXT_PUBLIC_AI_MODEL=gpt-4o-mini -e NUXT_PUBLIC_WEB_SEARCH_PROVIDER=tavily anotia/deep-research-web:latest
  • 对用户的影响:非工程用户可能没有 Docker,启动成本明显增加。
  • 复现命令:docker run -p 3000:3000 -e NUXT_PUBLIC_SERVER_MODE=true -e NUXT_AI_API_KEY=your-ai-api-key -e NUXT_WEB_SEARCH_API_KEY=your-search-api-key -e NUXT_PUBLIC_AI_PROVIDER=openai-compatible -e NUXT_PUBLIC_AI_MODEL=gpt-4o-mini -e NUXT_PUBLIC_WEB_SEARCH_PROVIDER=tavily anotia/deep-research-web:latest
  • 证据:identity.distribution | https://github.com/AnotiaWang/deep-research-web-ui | docker run -p 3000:3000 -e NUXT_PUBLIC_SERVER_MODE=true -e NUXT_AI_API_KEY=your-ai-api-key -e NUXT_WEB_SEARCH_API_KEY=your-search-api-key -e NUXT_PUBLIC_AI_PROVIDER=openai-compatible -e NUXT_PUBLIC_AI_MODEL=gpt-4o-mini -e NUXT_PUBLIC_WEB_SEARCH_PROVIDER=tavily anotia/deep-research-web:latest

3. 安装坑 · 来源证据:[Feature] PWA functionality

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:[Feature] PWA functionality
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/AnotiaWang/deep-research-web-ui/issues/43 | 来源类型 github_issue 暴露的待验证使用条件。

4. 配置坑 · 可能修改宿主 AI 配置

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主,或安装命令涉及用户配置目录。
  • 对用户的影响:安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
  • 证据:capability.host_targets | https://github.com/AnotiaWang/deep-research-web-ui | host_targets=chatgpt, claude

5. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 证据:capability.assumptions | https://github.com/AnotiaWang/deep-research-web-ui | README/documentation is current enough for a first validation pass.

6. 运行坑 · 来源证据:[Bug] 点击重试并不会重试

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:[Bug] 点击重试并不会重试
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/AnotiaWang/deep-research-web-ui/issues/71 | 来源类型 github_issue 暴露的待验证使用条件。

7. 运行坑 · 来源证据:[Bug] 配置azure openai提示资源不存在

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:[Bug] 配置azure openai提示资源不存在
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/AnotiaWang/deep-research-web-ui/issues/70 | 来源类型 github_issue 暴露的待验证使用条件。

8. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 证据:evidence.maintainer_signals | https://github.com/AnotiaWang/deep-research-web-ui | last_activity_observed missing
  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 证据:downstream_validation.risk_items | https://github.com/AnotiaWang/deep-research-web-ui | no_demo; severity=medium

10. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 证据:risks.scoring_risks | https://github.com/AnotiaWang/deep-research-web-ui | no_demo; severity=medium

11. 安全/权限坑 · 来源证据:[Bug] firecrawl rate limit is not wokring

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:[Bug] firecrawl rate limit is not wokring
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 证据:community_evidence:github | https://github.com/AnotiaWang/deep-research-web-ui/issues/73 | 来源讨论提到 api key 相关条件,需在安装/试用前复核。

12. 安全/权限坑 · 来源证据:[Feature] 支持api调用吗

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:[Feature] 支持api调用吗
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 证据:community_evidence:github | https://github.com/AnotiaWang/deep-research-web-ui/issues/79 | 来源讨论提到 api key 相关条件,需在安装/试用前复核。

13. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 证据:evidence.maintainer_signals | https://github.com/AnotiaWang/deep-research-web-ui | issue_or_pr_quality=unknown

14. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 证据:evidence.maintainer_signals | https://github.com/AnotiaWang/deep-research-web-ui | release_recency=unknown

来源:Doramagic 发现、验证与编译记录