开源免费ChatGPT-Java版SDK更新至1.0.10版,支持Tokens计算,快来一键接入。
Posted 程序员的黑洞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源免费ChatGPT-Java版SDK更新至1.0.10版,支持Tokens计算,快来一键接入。相关的知识,希望对你有一定的参考价值。
简介
ChatGPT Java版SDK开源地址:https://github.com/Grt1228/chatgpt-java ,目前收获将近1000个star。
有bug欢迎朋友们指出,互相学习,所有咨询全部免费。
最新版:1.0.10
<dependency>
<groupId>com.unfbx</groupId>
<artifactId>chatgpt-java</artifactId>
<version>1.0.10</version>
</dependency>
整合web示例,支持流式返回:
流式输出实现方式 | 小程序 | 安卓 | ios | H5 |
---|---|---|---|---|
SSE参考:OpenAISSEEventSourceListener | 不支持 | 支持 | 支持 | 支持 |
WebSocket参考:OpenAIWebSocketEventSourceListener | 支持 | 支持 | 支持 | 支持 |
更新日志
- 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:https://github.com/Grt1228/chatgpt-java/issues/79 ,Image SDK枚举值bug:https://github.com/Grt1228/chatgpt-java/issues/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官方接口
最新版支持tokens计算
tokens计算说明
openai 的tokens计算规则适合模型先关的,不同的模型计算方法是不一样的。大致的表格如下:
关于流式返回
流式返回的数据,返回行数-2=返回tokens
[DONE]这一行不参与tokens计算,没有content属性的不参与token计算。
所以tokens数量是4,[“Ser”,“end”,“ip”,“ity”],总返回行数6 - 无效行数2 = 4个tokens
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI建立sse连接...
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:"choices":["delta":"role":"assistant","index":0,"finish_reason":null]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:"choices":["delta":"content":"Ser","index":0,"finish_reason":null]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:"choices":["delta":"content":"end","index":0,"finish_reason":null]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:"choices":["delta":"content":"ip","index":0,"finish_reason":null]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:"choices":["delta":"content":"ity","index":0,"finish_reason":null]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:"choices":["delta":,"index":0,"finish_reason":"stop"]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:[DONE]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据结束了
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI关闭sse连接...
tokens计算使用示例
完整使用示例请参考:TikTokensTest
结合chat模型使用示例:
完整示例参考:OpenAiClientTest
public void chatTokensTest()
//聊天模型:gpt-3.5
List<Message> messages = new ArrayList<>(2);
messages.add(Message.builder().role(Message.Role.USER).content("关注微信公众号:程序员的黑洞。").build());
messages.add(Message.builder().role(Message.Role.USER).content("进入chatgpt-java交流群获取最新版本更新通知。").build());
ChatCompletion chatCompletion = ChatCompletion.builder().messages(messages).build();
ChatCompletionResponse chatCompletionResponse = v2.chatCompletion(chatCompletion);
//获取请求的tokens数量
long tokens = chatCompletion.tokens();
//这种方式也可以
// long tokens = TikTokensUtil.tokens(chatCompletion.getModel(),messages);
log.info("Message集合文本:【】", messages, tokens);
log.info("本地计算的请求的tokens数", tokens);
log.info("本地计算的返回的tokens数", TikTokensUtil.tokens(chatCompletion.getModel(),chatCompletionResponse.getChoices().get(0).getMessage().getContent()));
log.info("---------------------------------------------------");
log.info("Open AI 官方计算的总的tokens数", chatCompletionResponse.getUsage().getTotalTokens());
log.info("Open AI 官方计算的请求的tokens数", chatCompletionResponse.getUsage().getPromptTokens());
log.info("Open AI 官方计算的返回的tokens数", chatCompletionResponse.getUsage().getCompletionTokens());
单独使用示例:
public class TikTokensTest
String text;
List<Message> messages;
@Before
public void prepareData()
text = "关注微信公众号:程序员的黑洞。进入chatgpt-java交流群获取最新版本更新通知。";
messages = new ArrayList<>(2);
messages.add(Message.builder().role(Message.Role.USER).content("关注微信公众号:程序员的黑洞。").build());
messages.add(Message.builder().role(Message.Role.USER).content("进入chatgpt-java交流群获取最新版本更新通知。").build());
/**
* gpt-3.5和gpt4.0聊天模型接口计算推荐这种方法
*/
@Test
public void chatCompletionTokensTest()
ChatCompletion completion = ChatCompletion.builder().messages(messages).build();
long tokens = completion.tokens();
log.info("Message集合文本:【】", messages, tokens);
log.info("总tokens数", tokens);
/**
* Completion 接口计算推荐使用这种方法
*/
@Test
public void completionTokensTest()
Completion completion = Completion.builder().prompt(text).build();
long tokens = completion.tokens();
log.info("单句文本:【】", text);
log.info("总tokens数", tokens);
/**
* 通过模型模型名称计算
*/
@Test
public void byModelNameTest()
String modelName = ChatCompletion.Model.GPT_4.getName();
// String modelName = ChatCompletion.Model.GPT_3_5_TURBO.getName();
List<Integer> encode = TikTokensUtil.encode(modelName, text);
log.info(encode.toString());
long tokens = TikTokensUtil.tokens(modelName, text);
log.info("单句文本:【】", text);
log.info("总tokens数", tokens);
log.info("--------------------------------------------------------------");
tokens = TikTokensUtil.tokens(modelName, messages);
log.info("Message集合文本:【】", messages, tokens);
log.info("总tokens数", tokens);
/**
* 通过Encoding计算
*/
@Test
public void byEncodingTest()
EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();
Encoding enc = registry.getEncoding(EncodingType.P50K_BASE);
List<Integer> encode = TikTokensUtil.encode(enc, text);
log.info(encode.toString());
long tokens = TikTokensUtil.tokens(enc, text);
log.info("单句文本:【】", text);
log.info("总tokens数", tokens);
/**
* 通过EncodingType计算
*/
@Test
public void byEncodingTypeTest()
List<Integer> encode = TikTokensUtil.encode(EncodingType.CL100K_BASE, text);
log.info(encode.toString());
long tokens = TikTokensUtil.tokens(EncodingType.CL100K_BASE, text);
log.info("单句文本:【】", text);
log.info("总tokens数", tokens);
站在巨人的肩膀
感谢大佬:knuddelsgmbh 的jtokkit 的开源计算算法。
狂团KtAdmin框架正式免费开源发布,助力独立版SAAS系统快速开发!
系统介绍
狂团(kt8.cn)旗下[ KtAdmin ]是为独立版SAAS系统而生的快速开发框架!
KtAdmin 基于当前流行的ThinkPHP6.x+Vue3+Elementui++Vite 开发 , 是一款免费开源的多用户,多应用的独立版SAAS系统开发框架。
【注】[KtAdmin]遵循较为宽松的Apache2.0开源协议,考虑到SAAS业务的特殊性,V1.0.3版本开始,用户后台及登录页已移除关于ktadmin的版权,可放心使用。
KtAdmin无偿供大家使用,您的 star是我们前进的动力:gitee.com/kt8cn/ktadmin
主要特性
1.为独立版SAAS系统而生的快速开发框架,可大量节省SAAS系统开发周期,快速完成交付。
2.天然saas底层,支持无限账号,无需重复部署安装,高效管理多个用户,多个应用。
3.天然支持多应用,多插件,一个域名即可统一化管理多套系统,多个插件,同时支持共享一套账户余额套餐系统。
4.秉承“每个系统都是一个生态“的开放共赢理念,帮助每一套建立合作的独立系统构建自己的插件生态,共生共荣。
5.后端使用tp6原生底层,无改动,无额外学习成本,易开发,易上手,效率极高。
6.前端无限制,可按喜好使用VUE2,VUE3,JQ等。
7.自带用户管理,应用市场,阿里云oss,腾讯云cos,七牛云存储,阿里云短信,等诸多实用功能,开箱即用,无需重复开发。
8.KtAdmin搭载狂团成熟的在线更新解决方案,可统一化管理主系统及各种插件的在线安装,在线更新。
9.支持开发者生态,并为开发者提供成熟的主系统在线更新,插件在线安装,在线更新等基础设施服务,同时以狂团平台及数万精准源码用户为依托,为开发者提供精准的系统分发及流量支持。
系统下载 本仓库是面向技术开发者群体的开发版:gitee.com/kt8cn/ktadmin
如果您是非技术用户或者需要稳定的标准版,可直接下载https://www.kt8.cn/item/view1520.html
(我们面向非技术群体提供标准版安装包,直接上传到服务器,按安装教程安装即可,并免费提供在线一键更新系统
代理商功能
代理商OEM系统将以插件的形式免费对外提供,内含多项核心技术,敬请期待(已完成开发)!
安装教程
安装教程https://www.showdoc.com.cn/ktadmin/9320271198492681
.env
根目录会自带一个.example.env文件,你可以直接更名为.env文件并根据你的要求进行修改
使用说明
使用教程 https://www.yuque.com/sansen-au0wb/liuqcp/vepco2
开发教程
应用开发流程https://www.showdoc.com.cn/ktadmin/9324421497854622
软件架构
1.后端目录结构和thinkphp6常用结构一致
2.框架前端代码放在VUE目录下,user是用户后台项目(打包后上传至public/app/base目录下),admin是管理后台项目(打包后上传至public/app/base/admin目录下
以上是关于开源免费ChatGPT-Java版SDK更新至1.0.10版,支持Tokens计算,快来一键接入。的主要内容,如果未能解决你的问题,请参考以下文章
免费送书 | python版《Selenium WebDriver 3.0 自动化测试框架实战指南》