背景 / 需求
希望 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 EndpointConfig 无 proxy 字段(有 extra: dict 可暂存,但非一等公民)。
建议改动
ConcurrentRequester.__init__ 增加 proxy: str | None = None(必要时 proxy_auth),存为 self._proxy。
- 在发请求处(
_send_single_request → make_requests)注入 if self._proxy: kwargs.setdefault("proxy", self._proxy),使 per-request 显式 proxy 优先。
LLMClientBase.__init__ 增加 proxy=None,构造 ConcurrentRequester(...) 时传 proxy=proxy。
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 能力即可)。
背景 / 需求
希望
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-148ConcurrentRequester.__init__无proxy参数。clients/base.py:130-136LLMClientBase创建ConcurrentRequester(...)时未透传 proxy(**kwargs也未传下去)。clients/pool.py:54-71EndpointConfig无proxy字段(有extra: dict可暂存,但非一等公民)。建议改动
ConcurrentRequester.__init__增加proxy: str | None = None(必要时proxy_auth),存为self._proxy。_send_single_request→make_requests)注入if self._proxy: kwargs.setdefault("proxy", self._proxy),使 per-request 显式 proxy 优先。LLMClientBase.__init__增加proxy=None,构造ConcurrentRequester(...)时传proxy=proxy。LLMClientPool:顶层proxy参数 +EndpointConfig.proxy字段,构建各 base client 时按endpoint.proxy or pool.proxy生效(endpoint 覆盖顶层默认)。期望用法
支持
socks5://及带认证的http://user:pass@host:port(沿用 aiohttp 能力即可)。