开源免费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示例,支持流式返回:

开发思路可以参考:https://github.com/Grt1228/chatgpt-steam-output

流式输出实现方式小程序安卓iosH5
SSE参考:OpenAISSEEventSourceListener不支持支持支持支持
WebSocket参考:OpenAIWebSocketEventSourceListener支持支持支持支持

更新日志

  • 1.0.10 支持tokens计算:TikTokensTest ,更多详细的资料参考文档:Tokens_README.md
  • 1.0.9 支持自定义key使用策略参考:OpenAiClientTestOpenAiStreamClientTest ,弃用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 支持余额查询参考:OpenAiClientTestOpenAiStreamClientTest 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);
    


站在巨人的肩膀

感谢大佬:knuddelsgmbhjtokkit 的开源计算算法。

狂团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计算,快来一键接入。的主要内容,如果未能解决你的问题,请参考以下文章

虹软的人脸识别sdk有一年的试用期,一年之后用不了了怎么办

虹软的人脸识别是免费期限是一年的吗?

虹软开放的人脸识别SDK是不是真的永久免费?

免费送书 | python版《Selenium WebDriver 3.0 自动化测试框架实战指南》

是否有适用于 Android 和 iOS 的 OCR 开源库或 sdk(免费)? [关闭]

C#开源类库推荐:拼多多开放平台SDK,开源免费,支持.NET Core!