最近用java写ChatGpt接口,在本地调试的时候会用到代理,但是上线之后不用代理。使用springboot做一个配置类,当配置文件中配置了代理的相关属性,那就将代理bean注入到容器,并设置到ChatGpt的OkClient的Proxy属性中
相关代码
package com.qaai.admin.chatgpt.infra.config;
import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import java.net.InetSocketAddress;
import java.net.Proxy;
/**
* @author maqingbo
* @date 2023/3/18 12:02
* @email [email protected]
*/
@Data
@Component
@ConfigurationProperties(prefix = "openai.proxy")
public class ProxyConfig {
private String proxyHost;
private Integer proxyPort;
private Proxy.Type type;
@Bean
@ConditionalOnProperty(name = {
"openai.enable-proxy","openai.enableProxy"} ,havingValue = "true")
public Proxy proxy() {
Assert.notNull(proxyHost,"配置文件中未找到opai.proxy.proxy-host相关配置,请配置opai.proxy.proxy-port,或者设置enable-proxy为false来取消使用代理");
Assert.notNull(proxyPort,"配置文件中未找到opai.proxy.proxy-port相关配置,请配置opai.proxy.proxy-port,或者设置enable-proxy为false来取消使用代理");
Assert.notNull(type,"配置文件中未找到opai.proxy.type相关配置,请配置opai.proxy.proxy-port,或者设置enable-proxy为false来取消使用代理");
return new Proxy(type, new InetSocketAddress(proxyHost, proxyPort));
}
}
ChatGpt
package com.qaai.admin.chatgpt.infra.config;
import com.qaai.admin.chatgpt.infra.ChatGPT;
import lombok.Data;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import java.net.Proxy;
/**
* @author maqingbo
* @date 2023/3/18 13:02
* @email [email protected]
*/
@Data
@Component
@ConfigurationProperties(prefix = "openai")
public class ChatGptConfig {
/**
* your openai key
*/
private String key;
/**
* Chat completion API URL
* <p>
* see: <a href=https://platform.openai.com/docs/api-reference/chat/create>https://platform.openai.com/docs/api-reference/chat/create</a>
*/
private String url;
private boolean enableProxy;
@Bean
public ChatGPT chatGPT(@Autowired(required = false) @Nullable Proxy proxy){
ChatGPT chatGPT = new ChatGPT();
chatGPT.setApiUrl(url);
chatGPT.setApiKey(key);
if (proxy!=null){
OkHttpClient okHttpClient = new OkHttpClient.Builder().
proxy(proxy)
.build();
chatGPT.setClient(okHttpClient);
}
return chatGPT;
}
}
配置文件
openai:
key: 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
url: https://api.openai.com/v1/chat/completions
enableProxy: false
proxy:
proxy-host: 127.0.0.1
proxy-port: 7890
type: http
解释一下
当配置文件配置了openai.enableProxy或者openai.enable-proxy,并且他们的值为true时 (对应ProxyConfig的 @ConditionalOnProperty(name = {"openai.enable-proxy","openai.enableProxy"} ,havingValue = "true")
)那么就自动配置Proxy这个Bean并放入容器,
当配置文件配置了openai.enableProxy或者openai.enable-proxy,并且他们的值为false时,表示此时ChatGPT 这个Bean不需要代理便可以发送请求到OpenAI(取决于你的服务器在哪里)