Stable Diffusion WebUI 启动报错:AttributeError: MessageFactory 无 GetPrototype 属性
一、问题背景
在使用 Stable Diffusion WebUI 时,安装 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 升级到最新版,导致每次重启都触发升降级操作。
二、问题原因深度分析
通过日志分析和依赖回溯,发现问题由以下因素共同导致:
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 会认为可以安装最新版(如 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
- WebUI:v1.10.1
- 插件:sd-webui-roop(最新版)、sd-webui-controlnet v1.1.455
四、完整修复方案(可直接操作)
下面是经过验证的完整修复步骤。


