Files

Web App 站点模板(templates/web-app-template)

DeerFlow「Web App 产物模式」的站点脚手架:智能体在沙箱里 scaffold 本模板到 outputs/<site>/,改 site.json、写 src/pages/*.tsx、放数据到 public/, 再由 scripts/build_site.py build 用预置依赖执行 vite build 产出 dist/, 经平台签名静态托管在「站点预览」工作台(前端路由 #/sites/{threadId}/{siteName})打开。

目录约定

  • site.json — 站点清单:title / description / nav[](页面导航顺序)/ map(可选底图:tilesUrl XYZ 模板或 pmtiles 单文件;都留空 = 无底图纯 GeoJSON 模式,离线可用)
  • src/pages/**/*.tsx — 每个文件即一个页面,文件名(去扩展名)即路由(overview.tsx → /#/overview),自动注册
  • src/components/ — 内置组件:AppShell(导航壳)、FlowCanvas(@xyflow/react 交互流程图)、 GeoMap(MapLibre 地图)、ChartPanel(ECharts)、MermaidBlock(Mermaid 静态图)
  • public/ — GeoJSON / 数据文件,页面内 fetch("./data.geojson") 相对加载
  • scripts/build_site.py — 构建 CLI(check / scaffold / build / status,输出单行 JSON)

依赖预置与开启步骤(关键:默认完全关闭,离线环境不跑 npm install)

node_modules/ 已 gitignore,永远不要提交,也永远不要在沙箱里安装:

  • 开发机:make webapp-template(即在本目录 pnpm install && pnpm build)一次性生成;
  • 离线发版:deerflow-offline-deployment 仓库的构建脚本需在有网的 CI 上执行 pnpm install --frozen-lockfile(或 npm ci),把整个 node_modules/ 随镜像预置到 /app/backend/templates/web-app-template/node_modules。 构建脚本会用 symlink(Linux)/ junction(Windows mklink /J,免管理员)把预置依赖 链进各站点目录,多站点共享、零拷贝。

开启功能 = config.yaml 里同时放开两处注释(缺一不可):

  1. sandbox.mounts 里的模板挂载条目(沙箱技能经 /mnt/web-app-template 探测;
  2. 文件末尾的 web_app: 段,enabled: true(开平台 API 与前端入口)。

build_site.py check 在宿主侧会读取 config.yaml 的 web_app.enabled(可用 env DEERFLOW_WEBAPP_ENABLED / DEERFLOW_WEBAPP_CONFIG 覆盖);沙箱内读不到配置文件, "挂载即视为开"——所以挂载条目就是沙箱侧的开关。改挂载后需重启网关(provider 单例 启动时读取;uvicorn --reload 模式改任一 app/ 下文件即可触发热重启)。

未开启或依赖未预置时整条链路优雅降级:capability 探测返回不可用,技能第 0 步 回退单页 HTML 产出,前端入口按钮不渲染,现有功能零影响。

构建链路速查

python scripts/build_site.py check                    # 能力探测(模板/依赖/node)
python scripts/build_site.py scaffold outputs/my-site # 脚手架(排除 node_modules/dist/scripts)
python scripts/build_site.py build   outputs/my-site  # 链接预置依赖 + vite build → dist/
python scripts/build_site.py status  outputs/my-site  # dist 状态 + 最近构建结果

环境变量:DEERFLOW_WEBAPP_TEMPLATE(模板目录)、DEERFLOW_WEBAPP_NODE(node 路径)、 DEERFLOW_WEBAPP_TIMEOUT(构建超时秒数,默认 180)。

模板自身的构建约束

  • vite.config.ts 固定 base: "./"(嵌套托管路径下资源自适应)与 target: "es2018" (兼容 chrome100 老内核,与主前端基线一致);不要改这两个配置。
  • 样式是纯 CSS + design tokens(src/styles.css),不引入 Tailwind(oklch 在老内核失效)。
  • HashRouter:静态托管无需服务端 SPA fallback。
  • 不新增 npm 依赖;只用已内置库(react / react-router-dom / @xyflow/react / maplibre-gl / echarts / mermaid / pmtiles)。