Files
deerflow-code/offline-backend-20260512
董宏凯 2ab3ab8444 fix: 写作管线整批接收对话检索结果,不再自己检索
- 相关性过滤新增位置通道:收割器给每条材料标记来源消息位置,课题
  请求之后的检索结果整批入池(与语言/词面无关)——线上中文课题 +
  英文检索结果被纯词面匹配误杀 31/35 条,报告只带着 4 条残料在写
- 课题切换保护保留:新请求之前的旧课题检索仍按词面强过滤,不凑
  门槛、不入报告;对话里找不到课题消息时退化为原词面过滤
- 删除死代码 HarvestPlusSearchMaterialProvider(retrieve=True 的
  自检索补充分支,早已被显式忽略):写作管线只负责写文件,检索
  全部由对话完成成为结构保证
- 测试:锚点规则(澄清回答不充当新课题)、中文课题+英文资料整批
  保留、课题切换旧检索过滤等场景,25 个用例入库(此前该测试文件
  一直被 tests/* 忽略规则挡在版本库外)
2026-08-30 16:20:55 +08:00
..

DeerFlow 离线后端部署补充

本目录提供与 start_backend.sh 配套的 wheelhouse。启动脚本会在容器启动时检查可选运行时依赖,并在缺包时仅从本地 wheelhouse 安装。

文件

  • offline-runtime-requirements.txt:固定版本的完整依赖闭包。
  • prepare_wheelhouse.sh:联网机器下载 Linux/Python 3.12 wheel,并验证传递依赖完整性。
  • start_backend.sh:Docker 启动脚本,包含 croniter、hindsight-client、aiomysql 兼容组和 Redis 客户端的缺包补装逻辑。
  • wheelhouse/:26 个 wheel 和 SHA256SUMS,需要随发布目录一起复制。

联网机器准备

默认目标是后端镜像使用的 CPython 3.12、Linux x86_64:

cd offline-backend-20260512
bash prepare_wheelhouse.sh

直接依赖为:

  • croniter==6.2.2
  • hindsight-client==0.6.2
  • redis==5.2.1
  • aiomysql==0.3.2
  • SQLAlchemy==2.0.51

上述依赖在 Python 3.12/Linux x86_64 下的 21 个传递依赖(包括 PyMySQL==1.2.0 和 greenlet==3.2.5)也已锁定在 offline-runtime-requirements.txt。

国内镜像示例:

PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple bash prepare_wheelhouse.sh

ARM64 镜像需要改目标平台:

TARGET_PLATFORM=manylinux2014_aarch64 bash prepare_wheelhouse.sh

离线机器启动

保持原脚本要求的发布目录结构,包括 Docker 镜像 tar、.env、config.yaml、extensions_config.json、skill_evolution.json、skills/、wheelhouse/、backend/uv.lock 和 backend/。

可先校验 wheel:

cd offline-backend-20260512/wheelhouse
sha256sum -c SHA256SUMS
cd ..

然后启动:

bash start_backend.sh
docker logs -f deerflow-backend

脚本会先尝试导入依赖,仅在缺少模块或 SQLAlchemy 的 aiomysql ping(reconnect) 适配接口不兼容时从 /app/wheelhouse 安装。aiomysql 补装默认开启,并在一次命令中安装兼容组 aiomysql==0.3.2 PyMySQL==1.2.0 SQLAlchemy==2.0.51,避免旧版 SQLAlchemy 启动时出现 ping() missing 1 required positional argument: reconnect。可通过 AIOMYSQL_INSTALL_DEPS=0 禁用,或通过 AIOMYSQL_PIP_PACKAGES 覆盖整个兼容组。

MySQL 连接 URL 使用 aiomysql 驱动时应写为 mysql+aiomysql://user:password@host:3306/database?charset=utf8mb4。

Redis 说明

redis==5.2.1 只是 Python 客户端,不包含 Redis 服务端。config.yaml 中 concurrency.redis.enabled: false 时无需部署 Redis;启用后必须另行准备 Redis 服务或离线 Redis Docker 镜像。

如果 Redis 运行在另一个容器,redis://127.0.0.1:6379/0 指向后端容器自身,不能直接使用。应将两个容器加入同一个 Docker network,并将 URL 改为类似 redis://redis:6379/0,同时为不同环境配置不同的 namespace。