# chatgpt-openai-java
**Repository Path**: cmee/openai-java
## Basic Information
- **Project Name**: chatgpt-openai-java
- **Description**: OpenAI API(Chatgpt3.5,Chatgpt4.0)的JAVA-SDK
Spring-SSE 和 上下文携带聊天记录的demo(流式传输)
openai-Image generation的java代码调用示例(ChatGpt/OpenAI api 图片生成,图片修改)
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2023-06-08
- **Last Updated**: 2023-06-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
ChatGPT Openai Java Demo
OpenAI ChatGPT 的SDK 和 spring-sse demo。觉得不错请右上角Star
本项目基于PlexPt-[chatgpt-java](https://github.com/PlexPt/chatgpt-java)
在此基础上,新增了spring-sse 和 上下文携带聊天记录的demo
详见[SseController](src/main/java/com/plexpt/chatgpt/controller/SseController.java)
新增了[openai-Image generation](https://platform.openai.com/docs/guides/images/introduction) 的java代码调用示例
图片生成和修改图片
详见[ImageTest](src/test/java/com/plexpt/chatgpt/ImageTest.java)
# 功能特性
| 功能 | 特性 |
| :---------: | :------: |
| GPT 3.5 | 支持 |
| GPT 4.0 | 支持 |
| GPT 4.0-32k | 支持 |
| 流式对话 | 支持 |
| 阻塞式对话 | 支持 |
| 前端 | 无 |
| 上下文 | 支持 |
| 计算Token | 即将支持 |
| 多KEY轮询 | 支持 |
| 代理 | 支持 |
| 反向代理 | 支持 |
| spring-sse | 支持(新增) |
| 图片生成 | 支持(新增) |
### 最简使用
也可以使用这个类进行测试 [ConsoleChatGPT](src/main/java/com/plexpt/chatgpt/ConsoleChatGPT.java)
```java
//国内需要代理
Proxy proxy = Proxys.http("127.0.0.1", 1081);
//socks5 代理
// Proxy proxy = Proxys.socks5("127.0.0.1", 1080);
ChatGPT chatGPT = ChatGPT.builder()
.apiKey("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")
.proxy(proxy)
.apiHost("https://api.openai.com/") //反向代理地址
.build()
.init();
String res = chatGPT.chat("写一段七言绝句诗,题目是:火锅!");
System.out.println(res);
```
### 进阶使用
```java
//国内需要代理 国外不需要
Proxy proxy = Proxys.http("127.0.0.1", 1080);
ChatGPT chatGPT = ChatGPT.builder()
.apiKey("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")
.proxy(proxy)
.timeout(900)
.apiHost("https://api.openai.com/") //反向代理地址
.build()
.init();
Message system = Message.ofSystem("你现在是一个诗人,专门写七言绝句");
Message message = Message.of("写一段七言绝句诗,题目是:火锅!");
ChatCompletion chatCompletion = ChatCompletion.builder()
.model(ChatCompletion.Model.GPT_3_5_TURBO.getName())
.messages(Arrays.asList(system, message))
.maxTokens(3000)
.temperature(0.9)
.build();
ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);
Message res = response.getChoices().get(0).getMessage();
System.out.println(res);
```
### 流式使用
```java
//国内需要代理 国外不需要
Proxy proxy = Proxys.http("127.0.0.1", 1080);
ChatGPTStream chatGPTStream = ChatGPTStream.builder()
.timeout(600)
.apiKey("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")
.proxy(proxy)
.apiHost("https://api.openai.com/")
.build()
.init();
ConsoleStreamListener listener = new ConsoleStreamListener();
Message message = Message.of("写一段七言绝句诗,题目是:火锅!");
ChatCompletion chatCompletion = ChatCompletion.builder()
.messages(Arrays.asList(message))
.build();
chatGPTStream.streamChatCompletion(chatCompletion, listener);
```
### 流式配合Spring SseEmitter使用
参考 [SseStreamListener](src/main/java/com/plexpt/chatgpt/listener/SseStreamListener.java)
```java
@GetMapping("/chat/sse")
@CrossOrigin
public SseEmitter sseEmitter(String prompt) {
//国内需要代理 国外不需要
Proxy proxy = Proxys.http("127.0.0.1", 1080);
ChatGPTStream chatGPTStream = ChatGPTStream.builder()
.timeout(600)
.apiKey("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")
.proxy(proxy)
.apiHost("https://api.openai.com/")
.build()
.init();
SseEmitter sseEmitter = new SseEmitter(-1L);
SseStreamListener listener = new SseStreamListener(sseEmitter);
Message message = Message.of(prompt);
listener.setOnComplate(msg -> {
//回答完成,可以做一些事情
});
chatGPTStream.streamChatCompletion(Arrays.asList(message), listener);
return sseEmitter;
}
```
## 多KEY自动轮询
只需替换chatGPT构造部分
```
chatGPT = ChatGPT.builder()
.apiKeyList(
// 从数据库或其他地方取出多个KEY
Arrays.asList("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",
"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",
"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",
"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",
))
.timeout(900)
.proxy(proxy)
.apiHost("https://api.openai.com/") //代理地址
.build()
.init();
```
## 上下文
参考 [ChatContextHolder.java](src/main/java/com/plexpt/chatgpt/util/ChatContextHolder.java)
# 常见问题
| 问 | 答 |
| :----------------------------------------------------------: | :----------------------------------------------------------: |
| KEY从哪来? | 手动注册生成:ai.com(需要海外手机号)、或者成品独享帐号:[购买](https://fk.fq.mk/?code=YT0xJmI9Mg%3D%3D) |
| 哪些地区不能用 | **以下国家IP不支持使用:中国(包含港澳台) 俄罗斯 乌克兰 阿富汗 白俄罗斯 委内瑞拉 伊朗 埃及!!** |
| 有封号风险吗 | 充值的没有。你免费白嫖不封你封谁。 |
| 我是尊贵的Plus会员,能用吗 | 能用,照封不误。PLUS调用API没啥区别 |
| GPT4.0 怎么用 | 申请 https://openai.com/waitlist/gpt-4-api |
| api.openai.com ping不通? | 禁ping,用curl测试连通性 |
| 显示超时? | IP不好,换个IP |
| 显示`Your access was terminated due to violation of our policies`... | 你号没了,下一个 |
| 显示`That model is currently overloaded with other requests. You can retry your request` | 模型过载,官方炸了,重试 |
| 如何充值? | 用国外信用卡,国内的不行 |
| 返回http 401 | API 密钥写错了/没写 |
| 返回http 429 | 请求超速了,或者官方超载了。充钱可解决 |
| 返回http 500 | 服务器炸了 |
| | |
---
### 注册教程
https://juejin.cn/post/7173447848292253704
https://mirror.xyz/boxchen.eth/9O9CSqyKDj4BKUIil7NC1Sa1LJM-3hsPqaeW_QjfFBc
#### [ChatGPT中文使用指南](https://github.com/PlexPt/awesome-chatgpt-prompts-zh)
#### 感谢 [PlexPt](https://github.com/PlexPt)