【开源免费】ChatGPT-Java版SDK重磅更新收获2.3k,支持插件模式、实现ChatGpt联网操作。
everybody 七夕来了还单着么?
一、简介
ChatGPT Java版SDK开源地址:https://github.com/Grt1228/chatgpt-java,目前收获将近2200+个star🌟。
最新版:1.1.1-beta0
<dependency><groupId>com.unfbx</groupId><artifactId>chatgpt-java</artifactId><version>1.1.1-beta0</version>
</dependency>
二、特性支持
- 支持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
三、插件机制
本文重点介绍插件机制,原有功能使用可以参考官方文档
https://chatgpt-java.unfbx.com/
3.1、插件原理
ChatGpt在早些时候推出function call功能,这个在我看来其实就是插件的本质,通过自定义function实现插件的功能,SDK在1.0.14+版本的时候已经支持了原生的function call调用。但是function call调用逻辑比较复杂难懂,很多小伙伴反应不太会使用。于是我基于function call做了下定制封装实现Plugin功能。(可能存在不合理的地方欢迎指正)
3.2、使用步骤
想看示例的朋友可以直接看:PluginTest
3.2.1、简介——插件抽象类
插件抽象类,定义了插件的必须参数:插件名称,方法,描述,参数,必须参数,插件的请求值R,插件的返回值T。
需要重点关注R和T两个泛型。
插件抽象类还包含两个重要的抽象方法: func和content方法。这两个方法需要自己实现。
方法 | 功能 |
---|---|
public abstract T func(R args); | 接受一个插件参数,返回插件返回值。后面有示例演示。 |
public abstract String content(T t); | 构建给gpt的参数信息 |
@Data
@AllArgsConstructor
public abstract class PluginAbstract<R extends PluginParam, T> {private Class<?> R;private String name;private String function;private String description;private List<Arg> args;private List<String> required;private Parameters parameters;public PluginAbstract(Class<?> r) {R = r;}public void setRequired(List<String> required) {if (CollectionUtil.isEmpty(required)) {this.required = this.getArgs().stream().filter(e -> e.isRequired()).map(Arg::getName).collect(Collectors.toList());return;}this.required = required;}private void setRequired() {if (CollectionUtil.isEmpty(required)) {this.required = this.getArgs().stream().filter(e -> e.isRequired()).map(Arg::getName).collect(Collectors.toList());}}private void setParameters() {JSONObject properties = new JSONObject();args.forEach(e -> {JSONObject param = new JSONObject();param.putOpt("type", e.getType());param.putOpt("enum", e.getEnumDictValue());param.putOpt("description", e.getDescription());properties.putOpt(e.getName(), param);});this.parameters = Parameters.builder().type("object").properties(properties).required(this.getRequired()).build();}public void setArgs(List<Arg> args) {this.args = args;setRequired();setParameters();}@Datapublic static class Arg {private String name;private String type;private String description;@JsonIgnoreprivate boolean enumDict;@JsonProperty("enum")private List<String> enumDictValue;@JsonIgnoreprivate boolean required;}public abstract T func(R args);public abstract String content(T t);
}
3.2.2、创建插件
创建自定义插件继承PluginAbstract抽象类。
WeatherReq,WeatherResp在这省略 。完整测试源码请看:https://github.com/Grt1228/chatgpt-java test包目录。
举例实现天气查询插件。
public class WeatherPlugin extends PluginAbstract<WeatherReq, WeatherResp> {public WeatherPlugin(Class<?> r) {super(r);}@Overridepublic WeatherResp func(WeatherReq args) {//模拟天气查询,真实使用场景需要调用第三方接口查询真实天气WeatherResp weatherResp = new WeatherResp();weatherResp.setTemp("25到28摄氏度");weatherResp.setLevel(3);return weatherResp;}@Overridepublic String content(WeatherResp weatherResp) {//构建chatgpt需要的content参数return "当前天气温度:" + weatherResp.getTemp() + ",风力等级:" + weatherResp.getLevel();}
}
3.2.3、使用插件
插件使用同样支持阻塞输出和流式输出两种方式,可以自己根据实际场景使用。
创建OpenAi客户端
客户端的创建和原来保持一致
/*** 描述: 插件测试类** @author https:www.unfbx.com* 2023-08-18*/
@Slf4j
public class PluginTest {private OpenAiClient openAiClient;private OpenAiStreamClient openAiStreamClient;@Beforepublic void before() {HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());//!!!!千万别再生产或者测试环境打开BODY级别日志!!!!//!!!生产或者测试环境建议设置为这三种级别:NONE,BASIC,HEADERS,!!!httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).addInterceptor(new OpenAiResponseInterceptor()).connectTimeout(10, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();openAiClient = OpenAiClient.builder().okHttpClient(okHttpClient).apiKey(Arrays.asList("sk-********************************")).apiHost("https://dgr.life/").build();openAiStreamClient = OpenAiStreamClient.builder()//支持多key传入,请求时候随机选择.apiKey(Arrays.asList("sk-********************************")).apiHost("https://dgr.life/").build();}
}
流式输出
@Testpublic void streamPlugin() {WeatherPlugin plugin = new WeatherPlugin(WeatherReq.class);plugin.setName("知心天气");plugin.setFunction("getLocationWeather");plugin.setDescription("提供一个地址,方法将会获取该地址的天气的实时温度信息。");PluginAbstract.Arg arg = new PluginAbstract.Arg();arg.setName("location");arg.setDescription("地名");arg.setType("string");arg.setRequired(true);plugin.setArgs(Collections.singletonList(arg));// Message message1 = Message.builder().role(Message.Role.USER).content("秦始皇统一了哪六国。").build();Message message2 = Message.builder().role(Message.Role.USER).content("获取上海市的天气现在多少度,然后再给出3个推荐的户外运动。").build();List<Message> messages = new ArrayList<>();
// messages.add(message1);messages.add(message2);//默认模型:GPT_3_5_TURBO_16K_0613//有四个重载方法,都可以使用openAiStreamClient.streamChatCompletionWithPlugin(messages, new ConsoleEventSourceListener(), plugin);CountDownLatch countDownLatch = new CountDownLatch(1);try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}}
阻塞输出
@Testpublic void plugin() {WeatherPlugin plugin = new WeatherPlugin(WeatherReq.class);plugin.setName("知心天气");plugin.setFunction("getLocationWeather");plugin.setDescription("提供一个地址,方法将会获取该地址的天气的实时温度信息。");PluginAbstract.Arg arg = new PluginAbstract.Arg();arg.setName("location");arg.setDescription("地名");arg.setType("string");arg.setRequired(true);plugin.setArgs(Collections.singletonList(arg));// Message message1 = Message.builder().role(Message.Role.USER).content("秦始皇统一了哪六国。").build();Message message2 = Message.builder().role(Message.Role.USER).content("获取上海市的天气现在多少度,然后再给出3个推荐的户外运动。").build();List<Message> messages = new ArrayList<>();
// messages.add(message1);messages.add(message2);//默认模型:GPT_3_5_TURBO_16K_0613//有四个重载方法,都可以使用ChatCompletionResponse response = openAiClient.chatCompletionWithPlugin(messages, plugin);log.info("自定义的方法返回值:{}", response.getChoices().get(0).getMessage().getContent());}
四、完结
上面已经完整介绍了整个插件的使用过程,方案不一定是最合理的,也是beat版本,欢迎交流。
如果觉的文章对你有帮助帮忙点个赞。
完整测试源码请看:https://github.com/Grt1228/chatgpt-java
记得帮忙点个star 🌟🌟🌟哦
首发微信号:程序员的黑洞
相关文章:
【开源免费】ChatGPT-Java版SDK重磅更新收获2.3k,支持插件模式、实现ChatGpt联网操作。
everybody 七夕来了还单着么? 一、简介 ChatGPT Java版SDK开源地址:https://github.com/Grt1228/chatgpt-java,目前收获将近2200个star🌟。 最新版:1.1.1-beta0 <dependency><groupId>com.unfbx</g…...
情报与GPT技术大幅降低鱼叉攻击成本
邮件鱼叉攻击(spear phishing attack)是一种高度定制化的网络诈骗手段,攻击者通常假装是受害人所熟知的公司或组织发送电子邮件,以骗取受害人的个人信息或企业机密。 以往邮件鱼叉攻击需要花费较多的时间去采集情报、深入了解受…...
Swift 周报 第三十五期
文章目录 前言新闻和社区五天市值蒸发 2000 亿美元,苹果公司怎么了?在你的 App 中帮助顾客解决账单问题需要声明原因的 API 列表现已推出 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十五…...
uni-app + SpringBoot +stomp 支持websocket 打包app
文章目录 一、概述:二、配置:1. 后端配置2. uni-app(app端)3. 使用 一、概述: websocket 协议是在http 协议的基础上的升级,通过一次http 请求建立长连接,转而变为TCP 的全双工通信;而http 协议是一问一答…...
LeetCode--HOT100题(35)
目录 题目描述:23. 合并 K 个升序链表(困难)题目接口解题思路1代码解题思路2代码 PS: 题目描述:23. 合并 K 个升序链表(困难) 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合…...
idea插件grep console最佳实践
首发博客地址 https://blog.zysicyj.top/ 参考博客:https://blog.csdn.net/ayunnuo/article/details/123997304 效果 配置 具体颜色 日志级别前景色背景色Error#FF0000#370000Warn#FFC033#1A0037Info#00FFF3无Debug#808080无 本文由 mdnice 多平台发布...
Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程)
Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程) 在前一篇文章中,我们介绍了SystemUI怎么使用IDE进行编辑和调试。这是分析SystemUI的最基础,希望读者能尽量掌握。 本篇文章,将会介绍SystemUI的大概…...
【C#】通用类型转换
【C#】通用类型转换 自动类型转换(隐式类型转换)强制类型转换(显式类型转换)通过函数进行转换(通过方法进行类型转换)使用 as 操作符转换通用类型转换方法实现 数据类型转换就是将数据(变量、数…...
传统DNS、负载均衡服务发现框架与专业服务发现框架(Eurek、nacos)分析
1、DNS 服务器 DNS 服务器可以在一定程度上用作服务发现的机制,以下是其冲动服务发现的一些利弊 优势 广泛性: DNS是互联网的标准协议之一,已经广泛地被支持和使用。因此,使用DNS作为服务发现的机制可以借助现有的网络基础设施…...
js中数组常用操作函数
js数组经常会用到,当涉及到 JavaScript 数组的函数,有许多常用的函数可用于对数组进行操作和转换。以下是一些常见的数组函数的讲解 splice() splice() 函数用于修改数组,可以删除、插入或替换数组中的元素。 var fruits [apple, banana,…...
Windows、Mac、Linux端口占用解决
Windows、Mac、Linux端口占用解决 简介 在使用计算机网络时,经常会遇到端口被占用的问题。当一个应用程序尝试使用已经被其他程序占用的端口时,会导致端口冲突,使应用程序无法正常运行。本文将介绍在Windows、Mac和Linux操作系统上解决端口…...
企业文件透明加密软件——「天锐绿盾」数据防泄密管理软件系统
PC访问地址: 首页 一、文档透明加密软件 文档透明加密功能:在不影响单位内部员工对电脑任何正常操作的前提下,文档在复制、新建、修改时被系统强制自动加密。文档只能在单位内部电脑上正常使用,在外部电脑上使用是乱码或无法打…...
Postman接口自动化测试实例
一.实例背景 在实际业务中,经常会出现让用户输入用户密码进行验证的场景。而为了安全,一般都会先请求后台服务器获取一个随机数做为盐值,然后将盐值和用户输入的密码通过前端的加密算法生成加密后串传给后台服务器,后台服务器接到…...
软件团队降本增效-构建人员评价体系
在软件团队中,最大成本往往来自于人力。这是因为软件开发是一项高度技术密集和智力密集的工作,需要研发人员具备较高的专业知识和技能。研发人员的工作状态和主动性对产出和质量具有极大的影响。如果研发人员缺乏积极性和投入度,可能会导致项…...
Python实现SSA智能麻雀搜索算法优化随机森林分类模型(RandomForestClassifier算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出&a…...
web JS高德地图标点、点聚合、自定义图标、自定义窗体信息、换肤等功能实现和高复用性组件封装教程
文章目录 前言一、点聚合是什么?二、开发前准备三、API示例1.引入高德地图2.创建地图实例3.添加标点4.删除标点5.删除所有标点(覆盖物)6.聚合点7.自定义聚合点样式8.清除聚合9.打开窗体信息 四、实战开发需求要求效果图如下:封装思…...
AlpacaFarm: A Simulation Framework for Methods that Learn from Human Feedback
本文是LLM系列文章,针对《》的翻译。 AlpacaFarm:从人类反馈中学习方法的模拟框架 摘要1 引言2 背景与问题描述3 构造AlpacaFarm4 验证AlpacaFarm模拟器5 AlpacaFarm的基准参考方法6 相关工作7 不足和未来方向 摘要 像ChatGPT这样的大型语言模型由于能够很好地遵循…...
【Linux】Linux工具篇(yum、vim、gcc/g++、gdb、Makefile、git)
🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛹Linux 🛸C 📕 学习格言:博观而约取ÿ…...
自己实现 SpringMVC 底层机制 系列之-实现任务阶段 5- 完成 Spring 容器对象的自动装配 -@Autowried
😀前言 自己实现 SpringMVC 底层机制 系列之-实现任务阶段 5- 完成 Spring 容器对象的自动装配 -Autowried 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家&…...
linux的http服务
Web通信基本概念 基于B/S(Browser/Server)架构的网页服务 服务端提供网页 浏览器下载并显示网页 Hyper Text Markup Lanuage,超文本标记语言 Hyper Text Transfer Protocol,超文本传输协议 虚拟机A:构建基本的Web服务 [root…...
Restful架构简单了解
Restful Rest全称representational status transfer 表述性状态转移。 原则 资源与URI URI既可以看成是资源的地址,也可以看成是资源的名称。如果某些信息没有使用URI来表示,那它就不能算是一个资源, 只能算是资源的一些信息而已。URI的设计…...
conda常用命令
使用conda可以在电脑上创建很多套相互隔离的Python环境,命令如下: 创建环境 创建一个名为deeplearning的环境,python版本为3.7 conda create --name deeplearning python3.7查看版本 conda --version切换环境 切换到deeplearning环境 c…...
Linux:shell脚本:基础使用(6)《正则表达式-awk工具》
简介 awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 1)awk命令会逐行读取文件的内容进行处理 2)a…...
国际阿里云腾讯云:阿里云服务器怎么打包
近年来,跟着云计算的发展,越来越多的人开始运用云服务器来保管自己的运用和网站。其间,阿里云服务器是国内最大的云计算服务供给商之一,能够供给高效安稳的服务器服务。可是,阿里云服务器的打包办法相较于其他云服务器…...
FPGA中锁存器(latch)、触发器(flip-flop)以及寄存器(register)详解
文章目录 1 定义1.1 锁存器(latch)1.2 触发器(flip-flop)1.3 寄存器(register) 2 比较2.1 锁存器(Latch)危害即产生原因2.2 寄存器和锁存器的区别2.3 锁存器和触发器的区别 3 结构3.…...
【正点原子STM32连载】第十八章 通用定时器PWM输出实验 摘自【正点原子】APM32F407最小系统板使用指南
1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第十…...
分类预测 | MATLAB实现BWO-TCN-Attention数据分类预测
分类预测 | MATLAB实现BWO-TCN-Attention数据分类预测 目录 分类预测 | MATLAB实现BWO-TCN-Attention数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.BWO-TCN-Attention数据分类预测程序; 2.无Attention适用于MATLAB 2022b版及以上版本…...
6.链路追踪-Zipkin
链路追踪(Distributed Tracing)是一种用于监视分布式应用程序的技术,通过收集和展示分布式系统中不同组件之间的调用和交互情况,帮助开发人员和运维团队理解系统中的请求流程、性能瓶颈和异常情况。 1.Zipkin Zipkin 是一个开源的…...
基于ACF,AMDF算法的语音编码matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................... plotFlag …...
python 基础篇 day 1 初识变量和数据类型
文章目录 变量变量作用——用于存储和表示数据。变量命名规则命名法大驼峰小驼峰下划体n j i a x 通常作为临时变量使用 建议 变量种类全局变量(Global Variables)局部变量(Local Variables)静态变量(Static Variables…...
自己做的网站如何赚钱吗/公众号推广接单平台
微软于周二(3/2)重新释出MS10-015修补程序。由于先前使用者安装该程序时,若电脑中含有Alureon rootkit就会出现更新错误,因而微软也提醒使用者先行杀毒,并避免安装后可能造成的蓝屏画面。 MS10-015是微软在今年2月用来…...
阿里云做网站多少钱/seo怎么优化简述
2019独角兽企业重金招聘Python工程师标准>>> 概述 微服务架构是一种非常流行的新概念,即便可供以借鉴的经验比较少,当然不能阻挡它成为热门话题与研究对象。 令人惊讶地是,其实微服务的概念早在五十多年前就已经被提出,…...
网站免费申请/正规seo需要多少钱
Python 自动化测试面试题目汇总 1、super 是干嘛用的?在 Python2 和 Python3 使用,有什么区别?为什么要使用 super?请举例说明。 答: super 用于继承父类的方法、属性。super 是新式类中才有的,所以 Pyt…...
临沂做网站设计的公司/重庆森林百度网盘
转自:爱数据学习社数据是企业最具价值的资产之一,而数据质量则直接影响数据的产出和数据价值的高低。因此,数据质量的管理对于企业决策、战略水平和业绩提升至关重要。今天我们就来聊一聊企业如何评估和提升数据质量。一、数据质量是什么国际…...
雄安微网站开发/企业推广策略
一. kali安装ssh服务 1.修改源 1 rootDGG:~# vi /etc/apt/sources.list2 deb http://http.kali.org/kali kali-rolling main non-free contrib 2.更新一下源 apt-get update 3.下载ssh服务包 apt-get install ssh 4.打开ssh服务 1 service ssh start 打开ssh服务 2 service …...
wordpress安装主题后不够/seo首页网站
一 创建私有仓库 # 1、拉取私有仓库镜像 docker pull registry # 2、启动私有仓库容器 docker run -id --nameregistry -p 5000:5000 registry # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓…...