fix some errors in new checker

这组报错并非 Dify 运行时故障,而是在 Dify 的 API 仓库中运行新增类型检查器(pyrefly.toml 对应配置)时,测试夹具与生产响应边界上的类型不匹配被批量报出。优先区分“测试中故意传入的非法值”与“真实的类型不匹配”,再决定抑制还是修代码。

快速结论:这组报错并非 Dify 运行时故障,而是在 Dify 的 API 仓库中运行新增类型检查器(pyrefly.toml 对应配置)时,测试夹具与生产响应边界上的类型不匹配被批量报出。优先区分“测试中故意传入的非法值”与“真实的类型不匹配”,再决定抑制还是修代码。

适用环境:Issue 已确认的线索是 Dify 的 API 侧 Python 代码,检查配置位于 /home/runner/work/dify/dify/api/tests/unit_tests/pyrefly.toml,出现 grpc.experimental.gevent 缺少类型桩(type stubs)的提示。Issue 中未给出具体操作系统、Python、CUDA、显卡、依赖版本。

最快修复方案:暂无确认的一步修复方案。Issue 讨论倾向的做法是:对故意构造非法输入的测试使用窄范围、带说明的 # pyrefly: ignore[bad-argument-type] 抑制;对普通夹具补全并正确标注字段;对生产响应边界的类型转换单独排查。

注意事项:该 Issue 的检查输出缺少文件与行号,讨论明确指出目前无法对 Literal[False] 不可下标、协程条件、类属性、抽象方法调用等报错给出统一修法。把 None 改成 {} 来“过检查”会改变原本有意测试的覆盖范围,不建议照做。

问题场景

在 Dify 仓库中运行新增的类型检查器时,检查器会分析 api/tests/unit_tests 下的单元测试以及 api/controllers、api/services、api/core 等模块,并一次性输出大量错误与警告。这些报错主要集中在两类位置:一是调用 model_construct 构造测试数据时缺少字段或字段类型不符;二是响应对象(如 EndpointListResponse)收到与其声明字段类型不一致的服务层结果。

报错原文

Error: Argument `None` is not assignable to parameter `metadata` with type `dict[str, Any]` in function `core.rag.models.document.Document.model_construct`
Warning: Cannot find type stubs for module `grpc.experimental.gevent`
  Hint: install the `types-grpcio` package
Error: Argument `list[EndpointEntityWithInstance]` is not assignable to parameter `endpoints` with type `Iterable[EndpointListItemResponse | Mapping[str, Any]]` in function `EndpointListResponse.__init__`
 INFO Checking project configured at `/home/runner/work/dify/dify/api/tests/unit_tests/pyrefly.toml`
Error: `Literal[False]` is not subscriptable
Error: Missing argument `created_at` in function `services.knowledge_fs.product_dto.KnowledgeFSSourceResponse.model_construct`
Error: Argument `str` is not assignable to parameter `status` with type `Literal['active', 'disabled', 'error', 'syncing']` in function `services.knowledge_fs.product_dto.KnowledgeFSSourceResponse.model_construct`
Error: Missing argument `category` in function `services.knowledge_fs.retrieval_contracts.KnowledgeFSPublicFailureResponse.model_construct`
Error: Missing argument `checkpoint` in function `services.knowledge_fs.product_dto.KnowledgeFSSourceWorkflowResponse.model_construct`

原因分析

可能原因之一是新的类型检查器比原有检查更严格地校验了 model_construct 的入参:测试夹具在构造对象时省略了必填字段,或传入了与字面量类型不匹配的字符串。另一类报错出现在响应构造函数上,服务层返回的实体列表被直接传给声明为 Iterable[EndpointListItemResponse | Mapping[str, Any]] 的字段,中间缺少显式转换。此外,Literal[False] 不可下标的报错以及 grpc.experimental.gevent 缺少类型桩,属于检查器兼容性和依赖补充问题,与业务逻辑无关。

环境排查

  • 确认所用类型检查器及其版本,Issue 中未给出,需向报错提交者补充。
  • 确认检查配置 api/tests/unit_tests/pyrefly.toml 的检查范围是否覆盖了预期之外的文件。
  • 确认 grpc.experimental.gevent 相关警告是否可通过安装 types-grpcio 消除。
  • 确认报错是否带有文件与行号;当前输出缺少位置信息,会影响定位。
  • 区分测试目录与生产代码目录的报错,分别处理。

解决步骤

  1. 先获取带文件与行号的完整检查输出,以及检查器的确切版本,按位置归类每一条报错。
  2. 对测试中故意传入非法值的用例,例如精确断言 Document(metadata=None) 被辅助函数处理的测试,使用窄范围的 # pyrefly: ignore[bad-argument-type] 抑制,并在注释中说明为何保留该非法输入。可参考分页校验测试中已有的同类写法。
  3. 对普通测试夹具中 model_construct 缺字段、status 与字面量不匹配等报错,通过共享的构造函数或工厂补全字段并标注正确类型;仅对确实需要不完整或非法对象的测试保留显式例外。
  4. 对 EndpointListResponse 相关报错,检查 api/controllers/console/workspace/endpoint.py 中服务层结果到响应项的转换,显式完成实体到 EndpointListItemResponse 的映射,而不是当作测试噪音忽略。
  5. 对 grpc.experimental.gevent 警告,可优先尝试安装 types-grpcio 包补充类型桩。
  6. 对 Literal[False] 不可下标、协程条件、类属性、抽象方法调用等报错,在拿到带位置输出前不要统一修改;先确认是否为检查器兼容性问题。

验证方法

重新运行类型检查,确认原先报出的错误已被逐条消除或按说明被窄范围抑制,且没有因抑制丢失有意测试的非法输入覆盖;同时确认 model_construct 相关报错不再出现,响应构造处的类型转换通过检查。若仍有 Literal[False] 等无位置报错,说明未完成定位,需继续收集完整输出。

参考来源

langgenius/dify #45616

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34555

发表回复

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