## 现象 环境变量 `NO_PROXY`/`no_proxy` 中包含 IPv6 CIDR(例如 Tailscale 默认网段 `fd7a:115c:a1e0::/48`)时,凡是直接创建 `httpx.AsyncClient` 的命令都会在建立客户端时失败。例如 `bili auth login`: ```console $ NO_PROXY=fd7a:115c:a1e0::/48 no_proxy=fd7a:115c:a1e0::/48 bili auth login {"ok": false, "error": {"code": "internal_error", "message": "InvalidURL: Invalid port: '115c:a1e0::'", "hint": "这是 bili-cli 的 bug,请把完整输出提交到 issue。"}} ``` 去掉这一项后同一命令正常(扫码登录成功)。 ## 环境 - bili-agent 1.3.0(`uv tool install bili-agent`) - httpx 0.28.1,Python 3.13,Ubuntu 24.04 x86_64 - 该 `NO_PROXY` 由 Tailscale 与本地代理共存配置写入系统环境,Agent 子进程会继承 ## 原因 根因在 httpx:`get_environment_proxies()` 把 IPv6 CIDR 拼成 `all://[fd7a:115c:a1e0::/48]`,`/48` 落在方括号内,URL 解析时把后半段当成端口。不依赖 bili-cli 的最小复现: ```console $ NO_PROXY=fd7a:115c:a1e0::/48 python -c "import httpx; httpx.Client()" httpx.InvalidURL: Invalid port: '115c:a1e0::' ``` 上游已有报告 encode/httpx#3221,修复 PR encode/httpx#3741 尚未合并、未发布。 ## 影响范围 走 `bilibili_api`(curl-cffi)的命令不受影响,例如 `bili search video` 和 `bili auth status` 正常。直接使用 httpx 的路径会失败,包括: - `commands/auth.py` 的扫码登录 - `runtime.web_client()`,以及使用它的私信、互动、截帧、ASR 等功能 - `commands/video.py` 中的两处 `httpx.AsyncClient` - `asr/engines.py` ## 建议 在 httpx 发布修复前,可考虑在 bili-cli 侧规避,例如: 1. 集中创建 httpx 客户端;遇到 `InvalidURL` 时,过滤掉 `NO_PROXY` 中 httpx 无法解析的 IPv6 CIDR 后重试,或改为自行构造 `mounts`。 2. 至少把这一错误识别为环境配置问题,提示检查 `NO_PROXY` 中的 IPv6 CIDR,而不是提示"bili-cli 的 bug"。 临时规避方法:调用时从 `NO_PROXY`/`no_proxy` 中去掉 IPv6 CIDR 项。
Activity