- Notifications
You must be signed in to change notification settings - Fork816
ChatGPT Java SDK支持流式输出、Gpt插件、联网。支持OpenAI官方所有接口。ChatGPT的Java客户端。OpenAI GPT-3.5-Turb GPT-4 Api Client for Java
License
Grt1228/chatgpt-java
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
it’s an “unofficial" or "community-maintained” library.这是一个非官方的社区维护的库。有bug欢迎朋友们指出,互相学习。
原创发布转载注明出处!
星火大模型Java SDK:https://github.com/Grt1228/SparkDesk-Java
To English Doc ->English Doc
| 一起探讨chatgpt-java,SDK问题咨询 项目产品开发交流 | 群失效关注公众号恢复:chatgpt-java |
|---|---|
![]() | ![]() |
ChatGPT的Java客户端OpenAI官方Api的Java SDK,可以快速接入项目使用。支持OpenAI官方全部接口,同时支持Tokens计算。参考文档:Tokens_README.md。
| Assistant | Dall-e-3 | FineTuneJob | TTS | ChatCompletionWithPicture |
|---|---|---|---|---|
| 自定义知识库、AI助理 | AI生成图片 | 微调job | 文本转语音 | 附加图片的ChatCompletion |
| TikToken | Chat | Completions | Images | Speech To Text | 余额查询 |
|---|---|---|---|---|---|
| Token计算 | GPT-3.5、4.0对话模型 | GPT-3.0对话 | 图片模型 | 语音转文字,语音翻译 | 余额查询 |
| Embeddings | Files | Moderations | Fine-tune | Models |
|---|---|---|---|---|
| 嵌入 | 自定义训练模型 | 文本审核,敏感词鉴别 | 微调 | 模型检索相关 |
支持流式输出:
| 流式输出实现方式 | 小程序 | 安卓 | ios | H5 |
|---|---|---|---|---|
| SSE参考:OpenAISSEEventSourceListener | 不支持 | 支持 | 支持 | 支持 |
| WebSocket参考:OpenAIWebSocketEventSourceListener | 支持 | 支持 | 支持 | 支持 |
基于本SDK开发的Demo项目,整合Spring Boot 实现CahtGPT对话模式,思路可以参考:https://github.com/Grt1228/chatgpt-steam-output
- 支持附加图片的ChatCompletion、指定返回数据格式、Tool Call、Dall-e-3生成图片、FineTuneJob、文本转语音TTS。
- 支持GPT插件模式 参考实现PluginTest
- 支持当key异常(失效、过期、封禁)时,自定义动态处理key 参考实现DynamicKeyOpenAiAuthInterceptor
- 支持当key异常时的告警处理(钉钉、飞书、email、企业微信等等需要自定义开发)参考实现DynamicKeyOpenAiAuthInterceptor
- 支持多种Tokens计算方式
- 支持自定义OkhttpClient
- 支持自定义多Apikey
- 支持自定义ApiKey的获取策略
- 支持余额查询
- 支持个人账户信息查询
- 支持GPT3、GPT3.5、GPT4.0、GPT3.5—0614、GPT4.0—0614...
- 支持全部OpenAI的Api
- 1.1.6 ChatCompletion接口支持logprobs参数设置,Assistant相关接口支持流式输出
- 1.1.5 Bug Fix
- 1.1.3 支持Assistant、Run、Thread、Message Api。测试案例OpenAiClientTest
- 1.1.2-beta0 支持附加图片的ChatCompletion、指定返回数据格式、Tool Call、Dall-e-3生成图片、FineTuneJob、文本转语音TTS。官方文档示例:chatgpt-java.unfbx.com 。测试案例OpenAiClientTest
- 1.1.1-beta0 function call改成GPT插件模式调用更加简单的调用方式.参考实现PluginTest
- 1.0.15 moderations接口更新,代码优化,序列化修复。
- 1.0.14 升级支持最新版Gpt-3.5—0614、Gpt-4.0—0614等模型, 支持function-calling完整使用案例参考:OpenAiClientFunctionTest
- 1.0.13 支持当key异常(失效、过期、封禁)时,自定义动态处理key,参考实现DynamicKeyOpenAiAuthInterceptor ,支持key异常时的告警处理(钉钉、飞书、email、企业微信等等需要自定义开发)
- 1.0.12 tokens计算优化、删除模型接口修改、语音接口更新支持官方最新参数
- 1.0.11 增加新的余额查询接口参考:OpenAiClientTest 和OpenAiStreamClientTest ,修复tokens计算慢的问题,
- 1.0.10 支持tokens计算:TikTokensTest ,更多详细的资料参考文档:Tokens_README.md
- 1.0.9 支持自定义key使用策略参考:OpenAiClientTest 和OpenAiStreamClientTest ,弃用ChatGPTClient,优化Moderation接口
- 1.0.8 修改OpenAiClient和OpenAiStreamClient的自定义相关实现,超时设置,代理设置,自定义拦截器设置改为通过自定义OkHttpClient实现,将OkHttpClient交由用户自定义控制更加合理,可以实现更多的参数自定义。支持多Api Keys配置。
- 1.0.7 修复反序列化报错Bug:#79 ,Image SDK枚举值bug:#76 ,感谢两位朋友指出:@CCc3120 、@seven-cm
- 1.0.6 支持余额查询参考:OpenAiClientTest 和OpenAiStreamClientTest creditGrants方法,支持最新GPT-4模型,参考:ChatCompletion.Model构建消息体传入模型即可。感谢群友提供的余额接口地址以及@PlexPt 提供的模型参数
- 1.0.5 支持自定义Api Host,使用Builder构建。参考下面的快速开始部分代码。
- 1.0.4 官方最新的ChatGPT Stream模式下的Api返回值改动。
- 1.0.3 支持最新的GPT-3.5-Turbo模型和Whisper-1模型,支持语音功能转文字,语音翻译。OpenAiClient和OpenAiStreamClient支持Builder构造,支持代理。
- 1.0.2 支持Stream流式输出,参考:OpenAiStreamClient
- 1.0.1 支持自定义超时时间,自定义OkHttpClient拦截器,参考:OpenAiClient构造函数
- 1.0.0 支持所有的OpenAI官方接口
本项目支持默认输出和流式输出。完整SDK测试案例参考:
| SDK测试案例 | Tokens计算测试案例 | 完整Function-Call调用案例 |
|---|---|---|
| OpenAiClientTest 和OpenAiStreamClientTest | Tokens计算参考:TikTokensTest | OpenAiClientFunctionTest |
<dependency> <groupId>com.unfbx</groupId> <artifactId>chatgpt-java</artifactId> <version>1.0.14-beta1</version></dependency>更多SDK示例参考:OpenAiStreamClientTest
public class Test { public static void main(String[] args) { OpenAiStreamClient client = OpenAiStreamClient.builder() .apiKey(Arrays.asList("sk-********","sk-********")) //自定义key的获取策略:默认KeyRandomStrategy //.keyStrategy(new KeyRandomStrategy()) .keyStrategy(new FirstKeyStrategy()) //自己做了代理就传代理地址,没有可不不传// .apiHost("https://自己代理的服务器地址/") .build(); //聊天模型:gpt-3.5 ConsoleEventSourceListener eventSourceListener = new ConsoleEventSourceListener(); Message message = Message.builder().role(Message.Role.USER).content("你好啊我的伙伴!").build(); ChatCompletion chatCompletion = ChatCompletion.builder().messages(Arrays.asList(message)).build(); client.streamChatCompletion(chatCompletion, eventSourceListener); CountDownLatch countDownLatch = new CountDownLatch(1); try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } }}public class Test { public static void main(String[] args) { //国内访问需要做代理,国外服务器不需要 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7890)); HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger()); //!!!!千万别再生产或者测试环境打开BODY级别日志!!!! //!!!生产或者测试环境建议设置为这三种级别:NONE,BASIC,HEADERS,!!! httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); OkHttpClient okHttpClient = new OkHttpClient .Builder() .proxy(proxy)//自定义代理 .addInterceptor(httpLoggingInterceptor)//自定义日志 .connectTimeout(30, TimeUnit.SECONDS)//自定义超时时间 .writeTimeout(30, TimeUnit.SECONDS)//自定义超时时间 .readTimeout(30, TimeUnit.SECONDS)//自定义超时时间 .build(); OpenAiStreamClient client = OpenAiStreamClient.builder() .apiKey(Arrays.asList("sk-********","sk-********")) //自定义key的获取策略:默认KeyRandomStrategy //.keyStrategy(new KeyRandomStrategy()) .keyStrategy(new FirstKeyStrategy()) .okHttpClient(okHttpClient) //自己做了代理就传代理地址,没有可不不传// .apiHost("https://自己代理的服务器地址/") .build(); }}输出日志(text是持续输出的):
23:03:59.158 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI建立sse连接...23:03:59.160 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\n", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.172 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\n", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.251 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u5fc3", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.313 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u60c5", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.380 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u8212", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.439 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u7545", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.532 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\uff0c", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.579 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u5fc3", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.641 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u65f7", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.673 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u795e", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.751 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u6021", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.782 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:{"id": "cmpl-6pIHnOOJiiUEVMesXwxzzcSQFoZHj", "object": "text_completion", "created": 1677683039, "choices": [{"text": "\u3002", "index": 0, "logprobs": null, "finish_reason": null}], "model": "text-davinci-003"}23:03:59.815 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据:[DONE]23:03:59.815 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI返回数据结束了23:03:59.815 [省略无效信息] INFO com.unfbx.chatgpt.sse.ConsoleEventSourceListener - OpenAI关闭sse连接...更多SDK示例参考:OpenAiClientTest
public class Test { public static void main(String[] args) { OpenAiClient openAiClient = OpenAiClient.builder() .apiKey(Arrays.asList("sk-********","sk-********")) //自定义key的获取策略:默认KeyRandomStrategy //.keyStrategy(new KeyRandomStrategy()) .keyStrategy(new FirstKeyStrategy()) //自己做了代理就传代理地址,没有可不不传// .apiHost("https://自己代理的服务器地址/") .build(); //聊天模型:gpt-3.5 Message message = Message.builder().role(Message.Role.USER).content("你好啊我的伙伴!").build(); ChatCompletion chatCompletion = ChatCompletion.builder().messages(Arrays.asList(message)).build(); ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion); chatCompletionResponse.getChoices().forEach(e -> { System.out.println(e.getMessage()); }); }}public class Test { public static void main(String[] args) { //国内访问需要做代理,国外服务器不需要 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7890)); HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger()); //!!!!千万别再生产或者测试环境打开BODY级别日志!!!! //!!!生产或者测试环境建议设置为这三种级别:NONE,BASIC,HEADERS,!!! httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); OkHttpClient okHttpClient = new OkHttpClient .Builder() .proxy(proxy)//自定义代理 .addInterceptor(httpLoggingInterceptor)//自定义日志输出 .addInterceptor(new OpenAiResponseInterceptor())//自定义返回值拦截 .connectTimeout(10, TimeUnit.SECONDS)//自定义超时时间 .writeTimeout(30, TimeUnit.SECONDS)//自定义超时时间 .readTimeout(30, TimeUnit.SECONDS)//自定义超时时间 .build(); //构建客户端 OpenAiClient openAiClient = OpenAiClient.builder() .apiKey(Arrays.asList("sk-********","sk-********")) //自定义key的获取策略:默认KeyRandomStrategy //.keyStrategy(new KeyRandomStrategy()) .keyStrategy(new FirstKeyStrategy()) .okHttpClient(okHttpClient) //自己做了代理就传代理地址,没有可不不传// .apiHost("https://自己代理的服务器地址/") .build(); //聊天模型:gpt-3.5 Message message = Message.builder().role(Message.Role.USER).content("你好啊我的伙伴!").build(); ChatCompletion chatCompletion = ChatCompletion.builder().messages(Arrays.asList(message)).build(); ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion); chatCompletionResponse.getChoices().forEach(e -> { System.out.println(e.getMessage()); }); }}下载源码打包
| Q | A |
|---|---|
| 如何实现连续对话? | issues:#8 |
| 如何实现流式输出? | 升级1.0.2版本,参考源码:OpenAiStreamClientTest |
| 如何整合SpringBoot实现流式输出的Api接口? | 参考另外一个项目:chatgpt-steam-output |
| 最新版GPT-3.5-TURBO是否支持? | 升级1.0.3 已经支持ChatCompletion, 参考测试案例:OpenAiStreamClientTest 和OpenAiStreamClientTest |
| 最新版语言转文字和语言翻译是否支持? | 升级1.0.3 已经支持whisper参考测试案例:OpenAiStreamClientTest 和OpenAiStreamClientTest |
国内访问可以看下这个解决方案:noobnooc/noobnooc#9
基于本SDK开发案例收集:chatgpt-java SDK案例征集
站在巨人的肩膀:
- OpenAi:https://openai.com/
- knuddelsgmbh 的jtokkit 的开源计算算法。
如果项目对你有帮助,可以选择请我喝杯奶茶
开源协议:LICENSE
About
ChatGPT Java SDK支持流式输出、Gpt插件、联网。支持OpenAI官方所有接口。ChatGPT的Java客户端。OpenAI GPT-3.5-Turb GPT-4 Api Client for Java
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors5
Uh oh!
There was an error while loading.Please reload this page.



