本样例采用第三方SDK对接:chatgpt-java,在此感谢作者:PlexPt。
当前最新版本 4.3.0 。
maven
<dependency>
<groupId>com.github.plexpt</groupId>
<artifactId>chatgpt</artifactId>
<version>4.3.0</version>
</dependency>
gradle
implementation group: 'com.github.plexpt', name: 'chatgpt', version: '4.3.0'
直接在项目中引入依赖。
yml配置
server:
port: 9000
servlet:
context-path: /api
# chatgpt 配置
chatgpt:
# 代理配置
proxy:
# 开启:true false
enable: true
# 代理方式:http socks5
type: socks5
# 代理主机地址
host: 127.0.0.1
# 代理端口
port: 10808
# OpenAI key 可配置多个key
apiKeys:
- sk-axjXpCP4mvQexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOrlRi1
- sk-axjXpCP4mvQexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOrlRi2
# OpenAI 请求地址
apiHost: https://api.openai/
chatgpt 配置映射类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@Component
@ConfigurationProperties(prefix = "chatgpt")
public class ChatGPTProp {
// 代理配置
private ProxyConfig proxy;
// apiKey
private List<String> apiKeys;
// apiHost
private String apiHost;
@Data
static class ProxyConfig {
private boolean enable;
private String type;
private String host;
private int port;
}
}
ChatGPTConfig 配置类
import com.plexpt.chatgpt.ChatGPT;
import com.plexpt.chatgpt.ChatGPTStream;
import com.plexpt.chatgpt.util.Proxys;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.net.Proxy;
@Slf4j
@Component
public class ChatGPTConfig {
@Autowired
private ChatGPTProp chatGPTProp;
private Proxy proxy;
@PostConstruct
private void initProxy() {
ChatGPTProp.ProxyConfig pdata = chatGPTProp.getProxy();
if (!pdata.isEnable()) {
proxy = null;
}
log.info("开启代理,代理类型:{},代理服务器:{},代理端口:{}。", pdata.getType(), pdata.getHost(), pdata.getPort());
if ("http".equals(pdata.getType())) {
proxy = Proxys.http(pdata.getHost(), pdata.getPort());
} else {
proxy = Proxys.socks5(pdata.getHost(), pdata.getPort());
}
}
@Bean
public ChatGPT chatGPT() {
// 初始化 ChatGPT 对象
return ChatGPT.builder()
.apiKeyList(chatGPTProp.getApiKeys())
.timeout(900)
.proxy(proxy)
.apiHost(chatGPTProp.getApiHost())
.build()
.init();
}
@Bean
public ChatGPTStream chatGPTStream() {
// 初始化 ChatGPTStream 对象
return ChatGPTStream.builder()
.timeout(600)
.apiKeyList(chatGPTProp.getApiKeys())
.proxy(proxy)
.apiHost(chatGPTProp.getApiHost())
.build()
.init();
}
}
Controller 类
import com.plexpt.chatgpt.ChatGPT;
import com.plexpt.chatgpt.ChatGPTStream;
import com.plexpt.chatgpt.entity.chat.Message;
import com.plexpt.chatgpt.listener.SseStreamListener;
import com.sm.chatgptdemo.model.Question;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.util.List;
@Slf4j
@Controller
@RequestMapping("/chat")
public class ChatController {
@Autowired
private ChatGPT chatGPT;
@Autowired
private ChatGPTStream chatGPTStream;
/**
* 普通文本会话
*
* @param question 问题
*/
@ResponseBody
@PostMapping("/text")
public String text(@RequestBody Question question) {
String answer = chatGPT.chat(question.getContent());
return answer;
}
/**
* SSE 会话
*
* @param question 问题
*/
@CrossOrigin
@PostMapping("/sse")
public SseEmitter sseEmitter(@RequestBody Question question) {
// 封装消息体
Message message = Message.of(question.getContent());
// 创建SseEmitter
SseEmitter sseEmitter = new SseEmitter(-1L);
// 创建监听器
SseStreamListener listener = new SseStreamListener(sseEmitter);
// 监听回答完成
listener.setOnComplate(msg -> {
// 回答完成,可以做一些事情
log.info("回答完成:{}", msg);
// 完成后关闭会话
sseEmitter.complete();
});
// 发起SSE会话请求
chatGPTStream.streamChatCompletion(List.of(message), listener);
// 流式响应
return sseEmitter;
}
}
Question 请求参数类
@Data
public class Question {
private String content;
}
Nginx 代理
敲黑板划重点:若要部署到线上,使用nginx配置域名代理,在nginx中需加如下配置:
server {
# HTTP默认端口
listen 80;
# 域名
server_ample;
location /api/ {
# ************ 重点配置 ************ #
# SSE 连接时的超时时间
proxy_read_timeout 86400s;
# 取消缓冲
proxy_buffering off;
# 关闭代理缓存
proxy_cache off;
# ************ 重点配置 ************ #
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass localhost:9000/api/;
}
}
前提你需要一个可用的ChatGPT账号(账号需自行去购买)
登录 ChatGPT官网
创建 key
本文发布于:2025-01-31 11:42:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1738296026574643.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |