VS Code Remote WSL 中 GitHub Copilot 代理设置问题
问题表现
如果您遇到以下情况之一:
- 对话没有输出
- 显示 fetch failed
- 模型名称不显示
问题分析
查看 copilot chat 的 output 显示,如果显示 proxies 相关问题,可以确定是 WSL 中运行的 vscode 调用了宿主机的 proxy 设置的问题。
这个选项似乎是默认开启的,会在 vscode 远程连接 wsl 开发中继承宿主机的 proxy 本地设置。问题就出在这里,如果你使用的是宿主机本机运行的代理程序,那么 proxy 的 ip 就会设置为 127.0.0.1,但是在 wsl 中想要访问宿主机的代理端口,ip 并不是 127.0.0.1(这会访问到 wsl 自己),而是需要通过如下方式查询宿主机 ip,然后访问到宿主机上的代理端口:
hostip=$(ip route show |grep -i default |awk'{ print $3}')
echo $hostip
我的输出:
172.25.48.1
因此 wsl 中要通过 172.25.48.1 ip 来访问宿主机上的端口。
网络通信逻辑说明:
- WSL 2 / VS Code Remote Windows Host (宿主机) Listens on Port X
- Returns 172.25.48.1
- Default Proxy: 127.0.0.1 -> Connection Refused (Self)
- Correct Proxy: 172.25.48.1:Port X -> Traffic Forwarded
- Query:
ip route show | awk '{ print $3}' - Proxy AppHost IP: 172.25.48.1
问题解决
- 如果可以通过网络直连,直接关闭
http: Use Local Proxy Configuration. - 如果依然需要设置代理,完成 1 后,修改如下设置:
你可能见过这个方案:github - Copilot is not working is WSL remote connection? - Stack Overflow
这个方案确实可以成功,但是带来的副作用是 copilot 无法修改 WSL 中的文件,agent 模式将称为摆设,因为你设置 copilot 完全工作在宿主机上(即设置的
"GitHub.copilot": [ "ui" ])
WSL 和宿主机网络互访
上面已经说明了如何在 WSL 命令行中访问宿主机程序,那么我们可以将之应用到代理设置上,以下脚本解决了一个问题——在 wsl 命令行中如何利用宿主机代理软件?
#!/bin/sh
hostip=$(ip route show |grep -i default |awk'{ print $3}')
wslip=$(hostname -I |awk'{print $1}')
port=7890
PROXY_HTTP="http://${hostip}:${port}"
PROXY_SOCKS5="socks5://${hostip}:"
(){
http_proxy=
HTTP_PROXY=
https_proxy=
HTTPS_proxy=
ALL_PROXY=
all_proxy=
git config --global http.https://github.com.proxy
git config --global https.https://github.com.proxy
}
(){
http_proxy
HTTP_PROXY
https_proxy
HTTPS_PROXY
ALL_PROXY
all_proxy
git config --global -- http.https://github.com.proxy
git config --global -- https.https://github.com.proxy
}
(){
resp=$(curl -I -s --connect-timeout 5 -m 5 -w -o /dev/null www.google.com)
[ = ];
}
[ = ];
set_proxy
[ = ];
unset_proxy
[ = ];
test_setting


