Skip to content

希望 LLMClient / ConcurrentRequester 支持显式传入 HTTP/SOCKS 代理(proxy),用于让请求经正向代理转发(例如目标 base_url 仅 VPN 可达,需经一台常驻 VPN 的网关代理出去),且能**按 client / 按 endpoint 粒度**配置,而不是只能依赖进程级环境变量。 #11

Description

@KenyonY

背景 / 需求

希望 LLMClient / ConcurrentRequester 支持显式传入 HTTP/SOCKS 代理(proxy),用于让请求经正向代理转发(例如目标 base_url 仅 VPN 可达,需经一台常驻 VPN 的网关代理出去),且能按 client / 按 endpoint 粒度配置,而不是只能依赖进程级环境变量。

当前底层 aiohttp.ClientSession 用了 trust_env=True,所以全局 HTTP_PROXY/HTTPS_PROXY/NO_PROXY 已生效;但无法在代码里按某个 client 单独指定代理。

现状(源码定位,基于 0.11.0)

  • async_api/core.py:269 真正发请求处:session.request(method, url, **kwargs) —— aiohttp 原生支持 proxy= / proxy_auth=,可经 **kwargs 注入。
  • async_api/core.py:132-148 ConcurrentRequester.__init__proxy 参数。
  • clients/base.py:130-136 LLMClientBase 创建 ConcurrentRequester(...) 时未透传 proxy(**kwargs 也未传下去)。
  • clients/pool.py:54-71 EndpointConfigproxy 字段(有 extra: dict 可暂存,但非一等公民)。

建议改动

  1. ConcurrentRequester.__init__ 增加 proxy: str | None = None(必要时 proxy_auth),存为 self._proxy
  2. 在发请求处(_send_single_requestmake_requests)注入 if self._proxy: kwargs.setdefault("proxy", self._proxy),使 per-request 显式 proxy 优先。
  3. LLMClientBase.__init__ 增加 proxy=None,构造 ConcurrentRequester(...) 时传 proxy=proxy
  4. LLMClientPool:顶层 proxy 参数 + EndpointConfig.proxy 字段,构建各 base client 时按 endpoint.proxy or pool.proxy 生效(endpoint 覆盖顶层默认)。

期望用法

# 单 endpoint
client = LLMClient(base_url="https://api.example.com/v1", api_key="...", proxy="http://gateway:8080")

# 多 endpoint,按 endpoint 区分是否走代理
client = LLMClient(endpoints=[
    {"base_url": "http://local-vllm:8000/v1"},                          # 直连
    {"base_url": "https://vpn-only/v1", "proxy": "http://gateway:8080"},# 经网关
])

支持 socks5:// 及带认证的 http://user:pass@host:port(沿用 aiohttp 能力即可)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions