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
2)stable-diffusion-webui/requirements_versions.txt
添加或修改:
protobuf==3.20.2
3)extensions/sd-webui-roop/requirements.txt
在末尾添加:
protobuf==3.20.2
修改后完整内容如下:
insightface==0.7.3 onnx==1.14.0 onnxruntime==1.15.0 opencv-python==4.7.0.72 ifnude cython protobuf==3.20.2
步骤 2:保持 webui-user.bat 网络配置正确
以下是推荐的稳定配置示例:
@echo off
set HTTP_PROXY=http://127.0.0.1:7897
set HTTPS_PROXY=http://127.0.0.1:7897
set NO_PROXY=127.0.0.1,localhost
set HF_ENDPOINT=https://hf-mirror.com
set PYTHON=.venv\Scripts\python.exe
set GIT=
set VENV_DIR=.venv
set COMMANDLINE_ARGS=--xformers --gradio-queue --disable-nan-check
call webui.bat
重点:
- 必须设置
NO_PROXY,否则容易出现解析报错 HF_ENDPOINT可加速模型下载
步骤 3:重新启动 WebUI
不需要手动 pip install,WebUI 会自动处理依赖。
启动成功的标志:
- 无 GetPrototype 报错
- 无 onnx 编译错误
- 所有插件正常加载
- 可以正常生成图片
经验总结
1. Protobuf 3.20.2 是 WebUI 的最佳兼容版本
它同时满足 onnx>=1.13.0 的最低要求、ControlNet/roop 的旧 API 要求,且不会触发编译失败。
2. 必须同时修改 3 个文件
否则会被插件的 requirements.txt 覆盖,导致版本再次被升级。
3. 不要随意升级 Protobuf
Protobuf 4.x+ 对 WebUI 生态几乎完全不兼容。
4. 网络配置非常关键
错误的代理设置会导致依赖安装失败,从而触发各种奇怪的报错。


