解决Kotak Neo API(V2)与Uvicorn兼容的websockets包版本冲突问题
解决Kotak Neo API(V2)与Uvicorn兼容的websockets包版本冲突问题
问题根源分析
先把冲突的核心点理清楚:
- 你用的Kotak Neo API V2强制依赖了
websockets==8.1这个旧版本 - 而**Uvicorn(不管是0.30还是0.37版本)**在Python3.13环境下,需要依赖
websockets包中的websockets.legacy模块——但这个模块是在websockets>=10.0版本才重构出来的,8.1里完全没有这个结构,所以直接触发了ModuleNotFoundError
亲测有效的解决方案
方案一:绕过Kotak Neo API的依赖锁,手动指定兼容版本
这个方案的核心是:不让Kotak Neo API自动安装它要求的旧版websockets,而是手动装一个两边都能兼容的版本。
- 修改你的
requirements.txt,给Kotak Neo API加上--no-deps参数,跳过它的依赖自动安装:
# requirements.txt neo_api_client @ git+https://github.com/Kotak-Neo/Kotak-neo-api-v2.git#egg=neo_api_client --no-deps websockets>=10.0,<12.0 # 这个区间的版本既支持Uvicorn的legacy模块要求,又能兼容Kotak Neo的旧websockets用法 fastapi uvicorn==0.37.0
- 本地先测试:创建虚拟环境安装依赖,跑一下你的应用,确认Kotak Neo的websocket功能能正常工作,同时Uvicorn能正常启动。如果碰到小问题,可以微调websockets的版本,比如试试
10.4这个稳定版。
方案二:强制Uvicorn使用不依赖websockets.legacy的协议实现
如果方案一的版本兼容还是有问题,可以让Uvicorn换一种WebSocket协议实现,绕开对websockets.legacy的依赖:
- 命令行启动方式:修改你的Render启动命令为:
uvicorn main:app --ws uvicorn.protocols.websockets.wsproto_impl.WebSocketProtocol
- 代码内配置方式:如果是用代码直接启动Uvicorn,可以这样写:
from fastapi import FastAPI import uvicorn app = FastAPI() # 你的路由和业务代码... if __name__ == "__main__": uvicorn.run( "main:app", host="0.0.0.0", port=8000, ws="uvicorn.protocols.websockets.wsproto_impl.WebSocketProtocol" )
这个协议实现基于wsproto包,Uvicorn默认已经包含了这个依赖,不需要额外安装。
方案三:降级Python版本(最稳妥的兜底方案)
Python3.13是比较新的版本,旧版的websockets==8.1对它的兼容性本来就不好,同时Uvicorn在3.13下对websockets的要求更严格。你可以试试把Render上的Python版本降级到3.11.x(这个版本是目前生态兼容性最好的LTS版本之一):
- 在Render的项目设置里,找到Python版本选项,改成3.11.x
- 还原你的
requirements.txt到原来的样子,或者只保留必要依赖,重新部署测试
这个方案大概率能解决问题,因为在Python3.11环境下,Uvicorn0.30/0.37和websockets8.1的兼容性会好很多。
调试小建议
- 先在本地完全复现Render的环境:用相同的Python版本创建虚拟环境,安装相同的依赖包,先在本地跑通再部署到Render,能省很多试错时间
- 如果有精力,可以看看Kotak Neo API的源码,看看它具体用了websockets的哪些API——如果只是基础的连接、收发消息,那高版本的websockets基本都能兼容
你可以先试试方案一,不行再换方案二或三,应该就能解决这个冲突问题了~




