[BUG] DOCXSearchTool crashes with ValidationError when initialized with a fixed docx

当 DOCXSearchTool 以固定文档方式初始化(例如 DOCXSearchTool(docx="document.docx") )后,Agent 执行工具时只传入 search_query ,会因子类化的 FixedDOCXSearchToolSchema 仍把 docx 标记为必填而触发

快速结论:当 DOCXSearchTool 以固定文档方式初始化(例如 DOCXSearchTool(docx="document.docx"))后,Agent 执行工具时只传入 search_query,会因子类化的 FixedDOCXSearchToolSchema 仍把 docx 标记为必填而触发 Pydantic ValidationError。优先检查 DOCXSearchTool 的 schema 继承关系是否与 CSV/PDF/JSON/Directory 等同类 RAG 工具一致。

适用环境:Issue 已确认:macOS Sonoma;Python 3.12;crewAI 1.15.20;crewAI Tools 1.15.20;Venv 虚拟环境。其他系统、CUDA、显卡、PyTorch 版本在 Issue 中未提及,无法确认。

最快修复方案:Issue 中给出的修复方向是调整 schema 继承:让 FixedDOCXSearchToolSchema 只保留 search_query 必填,让 DOCXSearchToolSchema 继承前者并补充 docx: str = Field(...)。该方案由提交者在本地通过 pytest、mypy、ruff 验证,并计划提交 PR,但是否已合并到正式版本需以对应 release 为准。

注意事项:该修复尚未在 Issue 中体现为已发布版本的一步式升级命令;如果所在环境使用的是包含该 bug 的 crewAI 版本,需关注后续版本是否已合入,或按上述 schema 结构自行修改。文档模式(固定 docx)与动态模式(每次传入 docx)下字段必填要求不同,修改时不要只把 docx 改成可选,否则会破坏动态模式的行为。

问题场景

用户在 CrewAI 中使用 DOCXSearchTool,并以固定文档方式初始化该工具,即把 docx 路径在构造时传入:tool = DOCXSearchTool(docx="document.docx")。此时工具内部会把 self.args_schema 设置为 FixedDOCXSearchToolSchema。之后 Agent 调用该工具时只携带 {"search_query": "..."},期望由固定的 docx 提供文件来源,但 Pydantic 校验失败,工具调用被中断。

报错原文

ValidationError: 1 validation error for FixedDOCXSearchToolSchema
docx: Field required [type=missing, input_value={'search_query': '...'}, input_type=dict]

原因分析

最可能的原因是 DOCXSearchTool 的 schema 继承关系被写反了。在 docx_search_tool.py 中,FixedDOCXSearchToolSchemadocx 字段用 Field(...) 标记为必填,而 DOCXSearchToolSchema 又继承自 FixedDOCXSearchToolSchema。这导致固定模式(构造时传入 docx)下,Agent 仍然需要每次调用都提供 docx

对比同类 RAG 工具可以确认这是 DOCXSearchTool 独有的反例:CSVSearchTool 的 FixedCSVSearchToolSchema 只要求 search_query,由 CSVSearchToolSchema 补充 csvPDFSearchToolJSONSearchToolDirectorySearchTool 也遵循同样模式。DOCXSearchTool 是唯一固定 schema 仍要求文件路径的工具,因此 Agent 只传 search_query 时必然报错。

环境排查

  • 确认 crewAI 版本:Issue 报告版本为 1.15.20。
  • 确认 crewAI Tools 版本:Issue 报告版本为 1.15.20。
  • 确认 Python 版本:Issue 报告版本为 3.12。
  • 确认虚拟环境:Issue 使用 Venv。
  • 确认操作系统:Issue 使用 macOS Sonoma。其他 OS 未验证。
  • 确认触发方式:是否以固定 docx 初始化,且 Agent 调用时只传入 search_query。
  • CUDA、PyTorch、显卡版本在 Issue 中未涉及,无需作为排查重点。

解决步骤

  1. 先按 Issue 的复现步骤确认问题:用固定文档初始化 DOCXSearchTool(docx="sample.docx"),再执行 tool.args_schema.model_validate({"search_query": "quarterly revenue"}),观察是否抛出同样的 ValidationError。
  2. 检查当前环境中 docx_search_tool.py 的 schema 定义,确认 FixedDOCXSearchToolSchema 是否错误地把 docx 标记为必填(Field(...))。
  3. 按 Issue 给出的修复方向调整 schema:FixedDOCXSearchToolSchema 只保留 search_query: str = Field(...) 作为必填字段;DOCXSearchToolSchema 继承 FixedDOCXSearchToolSchema,并补充 docx: str = Field(...) 以支持动态模式。
  4. 如果不想直接改源码,可关注 crewAI 后续版本是否已合入该修复;Issue 中提交者表示已准备 PR,但未说明具体合并版本,因此升级到包含修复的版本是长期方案。
  5. 修改后运行本地回归测试,Issue 提交者提到会在 test_docx_search_tool.py 加入专门单测,并保证 pytest、mypy、ruff 通过;可参照该方式验证。

验证方法

重新执行 tool.args_schema.model_validate({"search_query": "quarterly revenue"}),若不再抛出 docx: Field required,且只传 search_query 时字段校验通过,即可确认修复生效。再在 Agent 实际执行路径中调用一次 DOCXSearchTool,确认固定模式与动态模式(显式传入 docx)都能正常工作,且动态模式仍然要求提供 docx。

参考来源

crewAIInc/crewAI #7356

Linear OSS-147

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22832

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注