【开源】给ChatGLM写个,Java对接的SDK
作者:小傅哥 - 百度搜 小傅哥bugstack
博客:bugstack.cn
沉淀、分享、成长,让自己和他人都能有所收获!😄
大家好,我是技术UP主小傅哥。
清华大学计算机系的超大规模训练模型 ChatGLM-130B 使用效果非常牛,所以我也想把这样的Ai能力接入到自己的应用中或者做一些 IntelliJ IDEA Plugin 使用。但经过了一晚上的折腾,我决定给它写个对接的SDK开源出来!—— 🤔 智谱Ai不是已经有了一个SDK吗?为啥还要写呢?那你写多少了?

在很早之前就关注了智谱Ai(ChatGLM),也看到官网有一个Java对接的SDK方式。但从前几天开始正式对接发现,这SDK是8月份提交的,10个commit,而且已经2个月没有更新了。所以真的是不少Bug呀,呀,呀!如果不去修改它的SDK代码,就没法对接。如;ConfigV3类中,拆分ApiKey的操作;String[] arrStr = apiSecretKey.split(".");
但这里的.
是正则的关键字,所以根本没法拆分。一起动就报错 invalid apiSecretKey
这对于初次对接并且没有看源码的伙伴来说,是不小的炸雷。
不过,虽然 SDK 有点赶工,不好用。但不影响智谱Ai(ChatGLM)
是个好东西。他的官网中有API HTTP 接口对接描述。所以,小傅哥决定跟着按照它的文档写一个能简单对接,代码有干净整洁的 SDK 让大家使用。

那么,接下来小傅哥就介绍下,如何基于智谱Ai(ChatGLM)
的开发者文档,开发一个通用的SDK组件。也让后续有想法PR贡献源码的伙伴,一起参与进来。—— 别看东西不大,写到简历上,也是非常精彩的一笔!
本文不止有智谱Ai-SDK开发,还有如何在项目中运用SDK开发一个自己的OpenAi服务。文末有SDK链接和OpenAi应用工程。
一、对接鉴权
- 文档:https://open.bigmodel.cn/dev/api
- ApiKey:https://open.bigmodel.cn/usercenter/apikeys -
申请个人授权,创建ApiKey即可
智谱Ai的Api文档,与ChatGPT对接有一些差
如果大家对接过ChatGPT开发,直接获取一个ApiKey就可以使用了。但在对接智谱Ai的Api时,需要把获取的ApiKey按照.
号分割,并需要进行JWT-Token的创建。而这个Token才是实际传给接口的内容。

- 因为生成Token会比较耗时,所以这里会使用Guava框架进行本地缓存29分钟,有效期30分钟的Token,确保可以有效的刷新。
- 在工程中提供了 BearerTokenUtils Token 生成工具类,测试的时候可以使用。
二、接口处理
文档:https://open.bigmodel.cn/dev/api#chatglm_lite - 以Api文档的chatglm_lite模型举例对接
传输方式 | https |
---|---|
请求地址 | https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_lite/sse-invoke |
调用方式 | SSE |
字符编码 | UTF-8 |
接口请求头 | accept: text/event-stream |
接口请求格式 | JSON |
响应格式 | 标准 Event Stream |
接口请求类型 | POST |
开发语言 | 任意可发起 HTTP 请求的开发语言 |
在正式开发代码,要把接口的使用先简单测试运行出来。之后再去编写代码。为此这里小傅哥先根据官网的文档和鉴权使用方式,编写了 curl http 请求;
curl -X POST \-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsInNpZ25fdHlwZSI6IlNJR04ifQ.eyJhcGlfa2V5IjoiNGUwODdlNDEzNTMwNmVmNGE2NzZmMGNjZTNjZWU1NjAiLCJleHAiOjE2OTY5OTM5ODIzMTQsInRpbWVzdGFtcCI6MTY5Njk5MjE4MjMxNH0.9nxhRXTJcP4Q_YTQ8w5y0CZOBOu0epP1J56oDaYewQ8" \-H "Content-Type: application/json" \-H "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)" \-H "Accept: text/event-stream" \-d '{"top_p": 0.7,"sseFormat": "data","temperature": 0.9,"incremental": true,"request_id": "xfg-1696992276607","prompt": [{"role": "user","content": "写个java冒泡排序"}]}' \http://open.bigmodel.cn/api/paas/v3/model-api/chatglm_lite/sse-invoke

- 注意:Authorization: Bearer 后面传的是 JWT Token 不是一个直接从官网复制的 ApiKey -
你可以使用工程中 BearerTokenUtils 创建
- 之后可以直接运行这段脚本(也可以导入到ApiPost工具中),执行后就能获得到运行效果了。—— 速度非常快!
三、组件开发
在🤔考虑到抽象和设计原则下,小傅哥这里采用了会话模型结构进行工程框架设计。把程序的调用抽象为一次会话,而会话的创建则交给工厂🏭。通过工厂屏蔽使用细节,在使用上简化调用,尽可能让外部最少知道原则。这样的设计实现方式,既可以满足调用方开心的使用,也可以让SDK贡献者见代码如见文档,容易理解和上手。
1. 工程结构

- 工程非常注重会话的设计和使用,因为框架的根基搭建好以后,扩展各项功能就会有迹可循。
大部分代码就是因为早期没有考虑好框架,最后功能来了被填充的很乱。
2. 会话流程

- 会话流程以工厂创建 Session 为入口点进行使用,其他的操作都在组件内自己处理好。
3. 代码举例
@Override
public OpenAiSession openSession() {// 1. 日志配置HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();httpLoggingInterceptor.setLevel(configuration.getLevel());// 2. 开启 Http 客户端OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).addInterceptor(new OpenAiHTTPInterceptor(configuration)).connectTimeout(configuration.getConnectTimeout(), TimeUnit.SECONDS).writeTimeout(configuration.getWriteTimeout(), TimeUnit.SECONDS).readTimeout(configuration.getReadTimeout(), TimeUnit.SECONDS).build();configuration.setOkHttpClient(okHttpClient);// 3. 创建 API 服务IOpenAiApi openAiApi = new Retrofit.Builder().baseUrl(configuration.getApiHost()).client(okHttpClient).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(JacksonConverterFactory.create()).build().create(IOpenAiApi.class);configuration.setOpenAiApi(openAiApi);return new DefaultOpenAiSession(configuration);
}
- 这是一段 DefaultOpenAiSessionFactory 创建工厂开启会话的服务对象。使用方只需要在自己的工程中,创建出一个工厂对象就可以对接使用了。下文有代码示例
- 其他更多的代码,直接看小傅哥开发好的 chatglm-sdk-java
四、组件使用
1. 组件配置
- 申请ApiKey:https://open.bigmodel.cn/usercenter/apikeys - 注册申请开通,即可获得 ApiKey
- 运行环境:JDK 1.8+
- maven pom -
暂时测试阶段,未推送到Maven中央仓库,需要下载代码本地 install 后使用
<dependency><groupId>cn.bugstack</groupId><artifactId>chatglm-sdk-java</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
- 源码(Github):https://github.com/fuzhengwei/chatglm-sdk-java
- 源码(Gitee):https://gitee.com/fustack/chatglm-sdk-java
- 源码(Gitcode):https://gitcode.net/KnowledgePlanet/road-map/chatglm-sdk-java
2. 单元测试
@Slf4j
public class ApiTest {private OpenAiSession openAiSession;@Beforepublic void test_OpenAiSessionFactory() {// 1. 配置文件Configuration configuration = new Configuration();configuration.setApiHost("https://open.bigmodel.cn/");configuration.setApiSecretKey("4e087e4135306ef4a676f0cce3cee560.sgP2*****");// 2. 会话工厂OpenAiSessionFactory factory = new DefaultOpenAiSessionFactory(configuration);// 3. 开启会话this.openAiSession = factory.openSession();}/*** 流式对话*/@Testpublic void test_completions() throws JsonProcessingException, InterruptedException {// 入参;模型、请求信息ChatCompletionRequest request = new ChatCompletionRequest();request.setModel(Model.CHATGLM_LITE); // chatGLM_6b_SSE、chatglm_lite、chatglm_lite_32k、chatglm_std、chatglm_prorequest.setPrompt(new ArrayList<ChatCompletionRequest.Prompt>() {private static final long serialVersionUID = -7988151926241837899L;{add(ChatCompletionRequest.Prompt.builder().role(Role.user.getCode()).content("写个java冒泡排序").build());}});// 请求openAiSession.completions(request, new EventSourceListener() {@Overridepublic void onEvent(EventSource eventSource, @Nullable String id, @Nullable String type, String data) {ChatCompletionResponse response = JSON.parseObject(data, ChatCompletionResponse.class);log.info("测试结果 onEvent:{}", response.getData());// type 消息类型,add 增量,finish 结束,error 错误,interrupted 中断if (EventType.finish.getCode().equals(type)) {ChatCompletionResponse.Meta meta = JSON.parseObject(response.getMeta(), ChatCompletionResponse.Meta.class);log.info("[输出结束] Tokens {}", JSON.toJSONString(meta));}}@Overridepublic void onClosed(EventSource eventSource) {log.info("对话完成");}});// 等待new CountDownLatch(1).await();}}
- 这是一个单元测试类,也是最常使用的流式对话模式。
五、应用接入
1. SpringBoot 配置类
@Configuration
@EnableConfigurationProperties(ChatGLMSDKConfigProperties.class)
public class ChatGLMSDKConfig {@Bean@ConditionalOnProperty(value = "wxpay.config.enabled", havingValue = "true", matchIfMissing = false)public OpenAiSession openAiSession(ChatGLMSDKConfigProperties properties) {// 1. 配置文件cn.bugstack.chatglm.session.Configuration configuration = new cn.bugstack.chatglm.session.Configuration();configuration.setApiHost(properties.getApiHost());configuration.setApiSecretKey(properties.getApiSecretKey());// 2. 会话工厂OpenAiSessionFactory factory = new DefaultOpenAiSessionFactory(configuration);// 3. 开启会话return factory.openSession();}}@Data
@ConfigurationProperties(prefix = "chatglm.sdk.config", ignoreInvalidFields = true)
public class ChatGLMSDKConfigProperties {/** 状态;open = 开启、close 关闭 */private boolean enable;/** 转发地址 */private String apiHost;/** 可以申请 sk-*** */private String apiSecretKey;}
@Autowired(required = false)
private OpenAiSession openAiSession;
- 注意:如果你在服务中配置了关闭启动 ChatGLM SDK 那么注入 openAiSession 为 null
2. yml 配置
# ChatGLM SDK Config
chatglm:sdk:config:# 状态;true = 开启、false 关闭enabled: false# 官网地址 api-host: https://open.bigmodel.cn/# 官网申请 https://open.bigmodel.cn/usercenter/apikeysapi-key: 4e087e4135306ef4a676f0cce3cee560.sgP2DUs*****
- 你可以在配置文件中,通过 enabled 参数,启动和关闭 ChatGLM SDK
六、应用开发
基于本文开发的 ChatGLM SDK 就可以对接到 OpenAi 开发一个自己的应用了。https://bugstack.cn/md/project/chatgpt/chatgpt.html

相关文章:

【开源】给ChatGLM写个,Java对接的SDK
作者:小傅哥 - 百度搜 小傅哥bugstack 博客:bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 大家好,我是技术UP主小傅哥。 清华大学计算机系的超大规模训练模型 ChatGLM-130B 使用效果非常牛&…...

基于Pytest+Allure+Excel的接口自动化测试框架
1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发的…...

20.2 FMC驱动SDRAM的时序初始化实现及内存测试
继续上一篇的话题,写到SDRAM通过CubeMx配置后,在工程代码编写时直接引用的是我事先写好的时序初始化、内存测试文件,而未对其进行详细的解释,所以本篇文章就来娓娓道来。不多说,开始吧 SDRAM的初始化流程简述 SDRAM初…...

联想电脑一键重装系统Win10操作方法
很多用户都会利用重装系统的方法,来解决系统崩溃、病毒感染等问题。但是,很多新手用户不知道联想电脑Win10系统重装的详细方法步骤,下面小编给大家详细介绍关于联想电脑Win10系统重装的操作方法,帮助大家轻松快速地完成系统的重装…...

Mysql数据库 1.概述
Mysql内容概述 1. Mysql概述 数据库相关概念: 名称 全称 简称 数据库 存储数据的仓库,数据是有组织的进行存储 …...
Qt编程,文件操作、UDP通信
目录 1、文件类 QFile 2、 UPD/TCP网络编程 1、##UDP客户端 2、##UDP服务器端 1、文件类 QFile QFile file(filename); file.exists() file.setFileName(filename1); file.fileName() file.bytesAvailable() file.size() file.copy("2.txt") file1.errorString(…...

Docker 的数据管理和Dockerfile镜像的创建
目录 Docker 的数据管理 管理 Docker 容器中数据的方式 端口映射 容器互联(使用centos镜像) Docker 镜像的创建 Dockerfile 操作常用的指令 编写 Dockerfile 时格式 Dockerfile 案例 Docker 的数据管理 管理 Docker 容器中数据的方式 管理 Doc…...
[python] 利用 Pydoc 快速生成整个 Python 项目的文档
如何写注释 class MyClass:"""This is a simple example class.Attributes:param1 (int): The first parameter.param2 (str): The second parameter."""def __init__(self, param1, param2):"""The constructor for MyClass.:p…...
Maven 配置指南
目录 一、配置本地存储库 二、配置并行Artifact 解析 三、安全和部署设置 四、将镜像用于存储库 五、Profiles 六、可选配置 七、Settings 八、安全性 九、工具链 Maven配置发生在3个级别: 项目-大多数静态配置发生在pom.xml中安装-这是为Maven安装添加的…...
第十八章 类和对象——多态
一、多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 - 编译阶段确定函数地址 动…...

京东数据平台:2023年服饰行业销售数据分析
最近看到有些消费机构分析,不少知名的运动品牌都把“主战场”放到了冲锋衣,那么羽绒服市场就比较危险了。但其实羽绒服市场也有机会点可寻。 先来说冲锋衣。的确,从今年的销售数据以及增长情况,冲锋衣的确会是今年冬天的大热门品…...

Nginx proxy_set_header参数设置
一、不设置 proxy_set_header Host 不设置 proxy_set_header Host 时,浏览器直接访问 nginx,获取到的 Host 是 proxy_pass 后面的值,即 $proxy_host 的值,参考Module ngx_http_proxy_module 1 2 3 4 5 6 7 8 # cat ngx_header.c…...

如何用 ChatGPT 的 Advanced Data Analysis 帮你采集数据?
(注:本文为小报童精选文章,已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 想采集网页数据却不会写 Python 爬虫?不会就不会吧,ChatGPT 会就可以了 😂 问题描述 朋友最近遇到了一点儿…...
Linux运行环境搭建系列-Flink安装
Flink安装 ## 下载 https://archive.apache.org/dist/flink/flink-1.16.2 ## 解压 tar -zxvf flink-1.16.2-bin-scala_2.12.tgz && rm -rf flink-1.16.2-bin-scala_2.12.tgz ## 启动 cd flink-1.16.2/bin ## 修改/etc/hosts文件,把第一行的127.0.0.1改成自…...
求最大bit数(java)
题目描述 求一个int类型数字对应的二进制数字中1的最大连续数 例如3的二进制为00000011,最大连续2个1 数据范围:数据组数:11t15,11n1500000进阶: 时间复杂度: O(logn),空间复杂度: O(1) 输入: 200 输出 2 说明 200的二进制表示是11001000&am…...

【Java 进阶篇】JavaScript 与 HTML 的结合方式
JavaScript是一种广泛应用于Web开发中的脚本语言,它与HTML(Hypertext Markup Language)结合使用,使开发人员能够创建交互式和动态的网页。在这篇博客中,我们将深入探讨JavaScript与HTML的结合方式,包括如何…...

华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 磁盘目录分析神器 ncdu
华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 磁盘目录分析神器 ncdu 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器…...

Linux大老都是怎么记住这么多命令的?
今天给大家带来的是面试/实际工作中经常用到的Linux相关操作命令: 一. vi/vim编辑器 ---->文本编辑器 作用:创建文件,编辑文件,查看文件 格式:vi/vim 文件的名字 解析:如果该文件不存在,vi就会创建该…...

LoRa技术未来发展前景:物联网和边缘计算的引领者
随着物联网和边缘计算的快速发展,低功耗广域网(LoRa)技术在连接远距离设备、实现长距离通信和满足低功耗需求方面崭露头角。本文将分析LoRa技术在未来的发展前景,尤其是在物联网和边缘计算领域的潜在影响。 LoRa技术的核心优势 1…...
出现 PowerShell终端执行conda activate无效 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在cmd命令行中执行conda activate 可以成功,但是回pycharm的PowerShell终端执行该命令,一直无效 具体过程如下: PS E:\pythonProject\SteganoGAN-master> conda activate py37 PS E:\pythonProject\SteganoGAN-mas…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...

生信服务器 | 做生信为什么推荐使用Linux服务器?
原文链接:生信服务器 | 做生信为什么推荐使用Linux服务器? 一、 做生信为什么推荐使用服务器? 大家好,我是小杜。在做生信分析的同学,或是将接触学习生信分析的同学,<font style"color:rgb(53, 1…...

汇编语言学习(三)——DoxBox中debug的使用
目录 一、安装DoxBox,并下载汇编工具(MASM文件) 二、debug是什么 三、debug中的命令 一、安装DoxBox,并下载汇编工具(MASM文件) 链接: https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…...
SE(Secure Element)加密芯片与MCU协同工作的典型流程
以下是SE(Secure Element)加密芯片与MCU协同工作的典型流程,综合安全认证、数据保护及防篡改机制: 一、基础认证流程(参数保护方案) 密钥预置 SE芯片与MCU分别预置相同的3DES密钥(Key1、Key2…...

分布式光纤声振传感技术原理与瑞利散射机制解析
分布式光纤传感技术(Distributed Fiber Optic Sensing,简称DFOS)作为近年来迅速发展的新型感知手段,已广泛应用于边界安防、油气管道监测、结构健康诊断、地震探测等领域。其子类技术——分布式光纤声振传感(Distribut…...