现象
在python3.8.17
版本中同时使用gevent
和openai 1.53.0
包时,openai包报错openai.APIConnectionError: Connection error.
报错信息:
Traceback (most recent call last):
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 990, in _request
response = self._client.send(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpx/_client.py", line 926, in send
response = self._send_handling_auth(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpx/_client.py", line 954, in _send_handling_auth
response = self._send_handling_redirects(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpx/_client.py", line 991, in _send_handling_redirects
response = self._send_single_request(request)
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpx/_client.py", line 1027, in _send_single_request
response = transport.handle_request(request)
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpx/_transports/default.py", line 236, in handle_request
resp = self._pool.handle_request(req)
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpcore/_sync/connection_pool.py", line 256, in handle_request
raise exc from None
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpcore/_sync/connection_pool.py", line 236, in handle_request
response = connection.handle_request(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpcore/_sync/connection.py", line 101, in handle_request
raise exc
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpcore/_sync/connection.py", line 78, in handle_request
stream = self._connect(request)
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpcore/_sync/connection.py", line 156, in _connect
stream = stream.start_tls(**kwargs)
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpcore/_backends/sync.py", line 170, in start_tls
raise exc
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/httpcore/_backends/sync.py", line 165, in start_tls
sock = ssl_context.wrap_socket(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/ssl.py", line 1004, in _create
super(SSLSocket, self).__init__(**kwargs)
TypeError: super(type, obj): obj must be an instance or subtype of type
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_utils/_utils.py", line 274, in wrapper
return func(*args, **kwargs)
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/resources/chat/completions.py", line 815, in create
return self._post(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 1277, in post
return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls))
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 954, in request
return self._request(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 1014, in _request
return self._retry_request(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 1092, in _retry_request
return self._request(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 1014, in _request
return self._retry_request(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 1092, in _retry_request
return self._request(
File "/opt/anaconda3/envs/test3.8/lib/python3.8/site-packages/openai/_base_client.py", line 1024, in _request
raise APIConnectionError(request=request) from err
openai.APIConnectionError: Connection error.
版本信息
python 3.8.17
httpx 0.27.2
opena 1.53.0
原因
这是一个 ssl.wrap_socket 被 gevent monkey patch 后出现的兼容性问题,常见于 Python 3.8 + gevent + httpx(OpenAI SDK 1.x 默认使用 httpx)组合下。
解决方法
解决方案一:确保最早 monkey.patch_all()
在项目最开始(入口脚本的最上方)调用 gevent 的 monkey patch,如下:
from gevent import monkey
monkey.patch_all()
# 之后再导入 openai 等其他库
import openai
放错位置会导致 socket/ssl 没被正确 patch,出现你这种 ssl 报错。