Stable Diffusion WebUI 启动报错: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 方法,导致兼容性崩溃
问题原因分析
通过日志分析和依赖回溯,发现问题由以下几个因素共同导致:
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 的内置依赖要求
它没有设置上限,于是 pip 会认为可以安装最新版(如 6.33.4),导致 Protobuf 被自动升级到不兼容版本。
3. ControlNet 等插件依赖 Protobuf 3.x 的旧 API
Protobuf 4.x+ 对 Python API 做了大量不兼容修改,其中就包括 MessageFactory.GetPrototype() 被移除。
完整修复方案
下面是经过验证的完整修复步骤。
步骤 1:修改 3 个关键文件,统一锁定 protobuf==3.20.2
这个版本是'黄金兼容版本':
- 满足 onnx==1.14.0 的最低要求(>=3.20.2)
- 属于 3.x 系列,保留旧 API
- 不会触发编译问题
需要修改的文件如下:
1)stable-diffusion-webui/requirements.txt
添加或修改:
protobuf==3.20.2


