开开心心对接完大模型接口,测试没问题准备下下班时,突然来了个异常:
bash
403: Forbidden - {"error":{"message":"This model is not available in your region.","code":403}}
那么恭喜你,又要打怪升级了。
大意是大模型厂商限制你所在的地区调用API。
知道问题解决问题,开干吧。
Spring Ai 支持流式和非流式调用,分别使用RestClient和WebClient调用。核心是给RestClient和WebClient配置代理。
WebClientCustomizer、RestClientCustomizer是Spring提供配置WebClietn和Rest Client的类。
代码:
java
@Slf4j
@Configuration
public class HttpClientConfig implements WebClientCustomizer, RestClientCustomizer {
/**
* 代理
*/
@Value("${http.proxy.scheme}")
private String proxyScheme;
@Value("${http.proxy.host}")
private String proxyHost;
@Value("${http.proxy.port}")
private Integer proxyPort;
@Override
public void customize(WebClient.Builder webClientBuilder) {
ProxySelector proxySelector = new ProxySelector() {
private final List<Proxy> proxyList = new ArrayList<>();
{
// 创建代理对象
proxyList.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)));
proxyList.add(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyHost, proxyPort)));
}
@Override
public List<Proxy> select(URI uri) {
// 对所有 URL 返回相同的代理
String host = uri.getHost();
String scheme = uri.getScheme();
log.info("select.proxy,host={}", host);
// 检查是否绕过代理
if ("localhost".equals(host) || "127.0.0.1".equals(host)) {
return List.of(Proxy.NO_PROXY);
}
// 可以在这里添加过滤逻辑
if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
return proxyList;
}
// 其他协议不使用代理
return List.of(Proxy.NO_PROXY);
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
// 连接失败处理
log.error("连接到代理失败,address:{},error:{}", sa, ioe.getMessage(), ioe);
}
};
java.net.http.HttpClient httpClient = java.net.http.HttpClient.newBuilder().proxy(proxySelector).build();
JdkClientHttpConnector connector = new JdkClientHttpConnector(httpClient);
webClientBuilder.clientConnector(connector);
}
@Override
public void customize(RestClient.Builder restClientBuilder) {
/*spring ai restClient 配置代理*/
HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(new HttpHost(proxyScheme, proxyHost, proxyPort));
HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(routePlanner).build();
restClientBuilder.requestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
}