代理方案不受支持 | AI生成和翻译
错误信息表明,在您的 gitmessageai.py 脚本中,openai 客户端使用的 httpx 库正尝试配置一个代理,其 URL 为 socks://127.0.0.1:7891/,但该代理方案 socks 不被支持或识别,导致了 ValueError: Unknown scheme for proxy URL。这表明某个来自您的环境或代码的代理配置正在生效,并且它使用了一个不受支持的 SOCKS 代理方案。
让我们来分析代理可能来自哪里以及如何修复它。
代理配置来自何处?
代理配置 (socks://127.0.0.1:7891/) 很可能来自以下某个地方:
- 环境变量
httpx库会自动检查环境变量中的代理设置,例如HTTP_PROXY、HTTPS_PROXY、ALL_PROXY或它们的小写形式 (http_proxy,https_proxy,all_proxy)。- 像
socks://127.0.0.1:7891/这样的值表明一个 SOCKS 代理(常用于 Shadowsocks 或 VPN 等工具)被设置在了这些变量之一中。 - 要检查这些变量是否已设置,请在您的终端中运行:
env | grep -i proxy查找类似
HTTP_PROXY=socks://127.0.0.1:7891或HTTPS_PROXY=socks://127.0.0.1:7891的变量。
- 系统级代理设置
- 如果您使用的是 Linux 系统,代理设置可能是在全局配置的(例如,在
/etc/environment、/etc/profile或您的 shell 配置文件如~/.bashrc、~/.zshrc或~/.profile中)。 - 检查这些文件中是否有如下行:
export HTTP_PROXY="socks://127.0.0.1:7891" export HTTPS_PROXY="socks://127.0.0.1:7891" - 您可以使用以下命令查看这些文件:
cat ~/.bashrc | grep -i proxy cat ~/.zshrc | grep -i proxy cat /etc/environment | grep -i proxy
- 如果您使用的是 Linux 系统,代理设置可能是在全局配置的(例如,在
- 代理工具中的代理配置
- 地址
127.0.0.1:7891通常被代理或 VPN 工具使用,如 Shadowsocks、V2Ray 或 Clash,这些工具通常默认在 7890 或 7891 等端口上使用 SOCKS5 代理。 - 如果您安装或配置了此类工具,它可能自动设置了环境变量或系统代理设置。
- 地址
- 代码中显式设置的代理
- 虽然可能性较小,但您的
gitmessageai.py脚本或其使用的某个库可能显式地配置了代理。由于错误发生在httpx中,请检查您的脚本是否向OpenAI客户端或httpx客户端传递了代理。 - 在您的脚本中搜索诸如
proxy、proxies或httpx.Client等术语:grep -r -i proxy /home/lzwjava/bin/gitmessageai.py
- 虽然可能性较小,但您的
- Python 库配置
- 一些 Python 库(例如
requests或httpx)可能会从配置文件或之前的设置中继承代理配置。然而,httpx主要依赖于环境变量或显式代码。
- 一些 Python 库(例如
为什么 socks:// 会导致问题?
httpx库(被openai使用)本身不支持socks方案(SOCKS4/SOCKS5 代理),除非安装了额外的依赖项如httpx-socks。- 发生错误
Unknown scheme for proxy URL是因为httpx期望的代理方案是http://或https://,而不是socks://。
如何修复此问题
您有两个选择:如果不需要代理,则移除或绕过代理;如果打算使用该代理,则支持 SOCKS 代理。
选项 1:移除或绕过代理
如果您不需要为 DeepSeek API 使用代理,可以禁用或绕过代理配置。
- 取消设置环境变量
- 如果代理是在环境变量中设置的,请为当前会话取消设置它们:
unset HTTP_PROXY unset HTTPS_PROXY unset ALL_PROXY unset http_proxy unset https_proxy unset all_proxy - 要永久生效,请从
~/.bashrc、~/.zshrc、/etc/environment或其他 shell 配置文件中移除相应的export行。
- 如果代理是在环境变量中设置的,请为当前会话取消设置它们:
- 在不使用代理的情况下运行脚本
- 临时在没有代理设置的情况下运行您的脚本:
HTTP_PROXY= HTTPS_PROXY= ALL_PROXY= python3 /home/lzwjava/bin/gitmessageai.py - 如果这样能正常工作,那么问题就出在代理上。
- 临时在没有代理设置的情况下运行您的脚本:
- 在代码中绕过代理
- 修改您的
gitmessageai.py脚本,在OpenAI客户端中显式禁用代理:from openai import OpenAI import httpx def call_deepseek_api(prompt): api_key = os.getenv("DEEPSEEK_API_KEY") if not api_key: raise ValueError("DEEPSEEK_API_KEY environment variable is not set") client = OpenAI( api_key=api_key, base_url="https://api.deepseek.com", http_client=httpx.Client(proxies=None) # 禁用代理 ) # 您的 API 调用逻辑在这里 response = client.chat.completions.create( model="deepseek", # 替换为正确的模型 messages=[{"role": "user", "content": prompt}] ) return response.choices[0].message.content - 设置
proxies=None可确保httpx忽略任何环境代理设置。
- 修改您的
选项 2:支持 SOCKS 代理
如果您需要使用 SOCKS 代理(例如,为了通过 VPN 或代理服务器访问 DeepSeek API),则必须为 httpx 添加 SOCKS 支持。
- 安装
httpx-socks- 安装
httpx-socks包以启用 SOCKS4/SOCKS5 代理支持:pip install httpx-socks - 这将扩展
httpx以处理socks://和socks5://方案。
- 安装
- 更新您的代码
- 修改您的脚本以显式使用 SOCKS 代理:
from openai import OpenAI import httpx from httpx_socks import SyncProxyTransport def call_deepseek_api(prompt): api_key = os.getenv("DEEPSEEK_API_KEY") if not api_key: raise ValueError("DEEPSEEK_API_KEY environment variable is not set") # 配置 SOCKS5 代理 proxy_transport = SyncProxyTransport.from_url("socks5://127.0.0.1:7891") client = OpenAI( api_key=api_key, base_url="https://api.deepseek.com", http_client=httpx.Client(transport=proxy_transport) ) # 您的 API 调用逻辑在这里 response = client.chat.completions.create( model="deepseek", # 替换为正确的模型 messages=[{"role": "user", "content": prompt}] ) return response.choices[0].message.content - 如果您的代理使用 SOCKS4,请将
socks5://替换为socks4://。
- 修改您的脚本以显式使用 SOCKS 代理:
- 验证代理服务器
- 确保
127.0.0.1:7891上的代理服务器正在运行。如果您正在使用像 Clash 或 Shadowsocks 这样的工具,请检查其状态:netstat -tuln | grep 7891 - 如果没有进程在监听 7891 端口,请启动您的代理工具或在代理 URL 中更正端口。
- 确保
额外的调试步骤
- 检查代理工具配置
- 如果您正在使用像 Clash 或 Shadowsocks 这样的代理工具,请验证其配置文件(例如
~/.config/clash/config.yaml),确认它设置为对 SOCKS5 使用127.0.0.1:7891。 - 确保该工具正在运行且可访问。
- 如果您正在使用像 Clash 或 Shadowsocks 这样的代理工具,请验证其配置文件(例如
- 测试代理连接性
- 使用像
curl这样的工具测试代理(需要curl支持 SOCKS):curl --socks5 127.0.0.1:7891 https://api.deepseek.com - 如果此操作失败,则代理服务器要么已关闭,要么配置错误。
- 使用像
- 记录代理使用情况
- 在您的脚本中添加日志记录以确认正在使用哪个代理:
import logging logging.basicConfig(level=logging.DEBUG)
- 在您的脚本中添加日志记录以确认正在使用哪个代理:
推荐的修复方法
如果您不需要代理,最简单的修复方法是取消设置环境变量并运行:
HTTP_PROXY= HTTPS_PROXY= ALL_PROXY= python3 /home/lzwjava/bin/gitmessageai.py
如果您需要代理,请安装 httpx-socks 并按照上述方法更新您的代码以使用 SyncProxyTransport。