Stable Diffusion WebUI 启动报错:AttributeError: 'MessageFactory' object has no attribute 'GetPrototype'
一、问题背景
最近在使用 Stable Diffusion WebUI(v1.10.1)时,安装了 sd-webui-roop 插件后,启动时出现了一个非常典型的 Protobuf 版本冲突错误:
AttributeError: 'MessageFactory' object has no attribute 'GetPrototype'
这个错误通常意味着:
- Protobuf 被自动升级到了 4.x / 5.x / 6.x 系列版本
- 而 ControlNet、roop 等插件依赖的是 Protobuf 3.x 的旧 API
- 新版本 Protobuf 移除了 GetPrototype 方法,导致兼容性崩溃
这个问题非常常见,尤其是在近期,很多插件的依赖约束不严格,会让 pip 自动把 Protobuf 升级到最新版。而且几乎每次重新启动都会出现 Protobuf 的升降级安装操作,严重拖慢启动时间。
二、问题原因深度分析
通过日志分析和依赖回溯,我发现问题由以下几个因素共同导致:
1. sd-webui-roop 的 requirements.txt 没有限制 Protobuf 版本
原始内容如下:
insightface==0.7.3 onnx==1.14.0 onnxruntime==1.15.0 opencv-python==4.7.0.72 ifnude cython
注意:这里没有任何关于 protobuf 的版本约束。
2. onnx==1.14.0 的内置依赖要求 protobuf>=3.20.2
但它没有设置上限,于是 pip 会认为:
protobuf >= 3.20.2 → 可以安装最新版(如 6.33.4)
于是 Protobuf 被自动升级到不兼容版本。
3. ControlNet 等插件依赖 Protobuf 3.x 的旧 API
Protobuf 4.x+ 对 Python API 做了大量不兼容修改,其中就包括:
MessageFactory.GetPrototype() → 被移除
于是出现启动报错。
三、环境信息(可复现)
为了让大家能够复刻修复过程,我把环境也公开出来:
- Windows 11 专业版
- Python 3.11.13
- 虚拟环境:.venv
- CMake 4.2.1
- pip 25.3
- WebUI:v1.10.1
- 插件:sd-webui-roop(最新版)、sd-webui-controlnet v1.1.455
四、完整修复方案(可直接操作)
下面是经过验证的完整修复步骤。
步骤 1:修改 3 个关键文件,统一锁定 protobuf==3.20.2
这个版本是'黄金兼容版本':
- 满足 onnx==1.14.0 的最低要求(>=3.20.2)
- 属于 3.x 系列,保留旧 API
- 不会触发编译问题
需要修改的文件如下:


