You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WandB代理方案与OpenAI API不兼容引发ProxySchemeUnknown错误求助

问题:WSL Ubuntu中代理配置无法同时兼容WandB与OpenAI API

环境信息

  • WandB版本:0.15.3
  • Langchain版本:0.0.172
  • 操作系统:WSL Ubuntu 22.04.1 LTS
  • Python版本:3.11.0

问题现象

使用以下代理配置时,OpenAI API和pip可正常工作:

export http_proxy="192.168.10.166:11111"
export https_proxy="192.168.10.166:11111"
export ALL_PROXY="192.168.10.166:11111"
export no_proxy="localhost,127.0.0.1,::1,192.168.*.*,10.0.*.*"

但为代理地址添加http://协议头(如export HTTPS_PROXY="http://192.168.10.166:11111/")后,OpenAI API和pip无法正常工作;而不添加协议头时,运行含WandbCallbackHandler的代码(如下)会触发ProxySchemeUnknown错误,命令行执行wandb命令也会出现相同错误。

测试代码:

from langchain.callbacks import WandbCallbackHandler, StdOutCallbackHandler
from datetime import datetime

session_group = datetime.now().strftime("%m.%d.%Y_%H.%M.%S")
wandb_callback = WandbCallbackHandler(
    job_type="inference",
    project="langchain_callback_demo",
    group=f"minimal_{session_group}",
    name="llm",
    tags=["test"],
)
callbacks = [StdOutCallbackHandler(), wandb_callback]

错误详情

运行代码时的错误:

File ~/miniconda3/envs/lang/lib/python3.11/site-packages/urllib3/poolmanager.py:481, in ProxyManager.__init__(self, proxy_url, num_pools, headers, proxy_headers, proxy_ssl_context, use_forwarding_for_https, **connection_pool_kw)
    478 proxy = parse_url(proxy_url)
    480 if proxy.scheme not in ("http", "https"):
--> 481     raise ProxySchemeUnknown(proxy.scheme)
    483 if not proxy.port:
    484     port = port_by_scheme.get(proxy.scheme, 80)
ProxySchemeUnknown: Proxy URL had no scheme, should start with http:// or https://

命令行执行wandb命令的错误:

Traceback (most recent call last):
  File "/home/ocean/miniconda3/envs/lang/bin/wandb", line 5, in <module>
    from wandb.cli.cli import cli
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/wandb/__init__.py", line 200, in <module>
    _sentry.setup()
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/wandb/analytics/sentry.py", line 40, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/wandb/analytics/sentry.py", line 76, in setup
    client = sentry_sdk.Client(
             ^^^^^^^^^^^^^^^^^^
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/sentry_sdk/client.py", line 143, in __init__
    self._init_impl()
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/sentry_sdk/client.py", line 211, in _init_impl
    self.transport = make_transport(self.options)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/sentry_sdk/transport.py", line 534, in make_transport
    return transport_cls(options)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/sentry_sdk/transport.py", line 154, in __init__
    self._pool = self._make_pool(
                 ^^^^^^^^^^^^^^^^
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/sentry_sdk/transport.py", line 444, in _make_pool
    return urllib3.ProxyManager(proxy, **opts)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/urllib3/poolmanager.py", line 481, in __init__
    raise ProxySchemeUnknown(proxy.scheme)
urllib3.exceptions.ProxySchemeUnknown: Proxy URL had no scheme, should start with http:// or https://
Exception ignored in atexit callback: <bound method Sentry.end_session of <wandb.analytics.sentry.Sentry object at 0x7ff642be4a10>>
Traceback (most recent call last):
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/wandb/analytics/sentry.py", line 40, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ocean/miniconda3/envs/lang/lib/python3.11/site-packages/wandb/analytics/sentry.py", line 163, in end_session
    assert self.hub is not None
AssertionError:

解决方案

方案一:统一代理变量的协议头配置

部分工具(如pip、OpenAI SDK)支持不带协议头的代理地址,但WandB依赖的urllib3严格要求代理地址带协议头。可以通过同时设置大小写的代理变量来兼容:

# 带协议头的变量供WandB使用
export HTTP_PROXY="http://192.168.10.166:11111"
export HTTPS_PROXY="http://192.168.10.166:11111"
export ALL_PROXY="http://192.168.10.166:11111"
# 不带协议头的变量供OpenAI和pip使用
export http_proxy="192.168.10.166:11111"
export https_proxy="192.168.10.166:11111"
export all_proxy="192.168.10.166:11111"
export no_proxy="localhost,127.0.0.1,::1,192.168.*.*,10.0.*.*"

注:大部分工具会优先读取大写的代理变量,若读取不到才会用小写;部分旧工具仅支持小写变量,因此同时设置可覆盖所有场景。

方案二:代码层面单独配置WandB代理

如果不想修改系统环境变量,可以在代码中单独为WandB设置带协议头的代理,不影响其他工具的配置:

import os
# 先为WandB单独设置带协议头的代理
os.environ['HTTP_PROXY'] = 'http://192.168.10.166:11111'
os.environ['HTTPS_PROXY'] = 'http://192.168.10.166:11111'

# 再导入并初始化WandbCallbackHandler
from langchain.callbacks import WandbCallbackHandler, StdOutCallbackHandler
from datetime import datetime

session_group = datetime.now().strftime("%m.%d.%Y_%H.%M.%S")
wandb_callback = WandbCallbackHandler(
    job_type="inference",
    project="langchain_callback_demo",
    group=f"minimal_{session_group}",
    name="llm",
    tags=["test"],
)
callbacks = [StdOutCallbackHandler(), wandb_callback]

方案三:修改urllib3的代理解析逻辑(不推荐)

可以通过猴子补丁的方式修改urllib3的parse_url方法,自动为不带协议头的代理地址添加http://:

from urllib3.util import parse_url

original_parse_url = parse_url

def patched_parse_url(url):
    if url and '://' not in url:
        # 假设代理是http协议,若实际是https则替换成https://
        url = f'http://{url}'
    return original_parse_url(url)

# 应用补丁
import urllib3.util
urllib3.util.parse_url = patched_parse_url

# 之后再导入并使用WandB相关代码

注:该方法属于hack手段,可能会引发其他未知问题,仅在紧急情况下使用。


内容的提问来源于stack exchange,提问作者ocean11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:07:44