看看4.4k🔥stars的chatGPT API仓库到底做对了啥
前段时间比较火🔥的Open AI公司的Chat GPT项目,相信大家都可能早已从以下渠道接触过:
- 官网注册账号使用;
- 公众号、微信机器人等各种机器人
在ChatGPT发布的将近一个月里,虽然官方并没有提供公共的API给大家使用,但社区早已有了大佬们的Idea🌟,比如非官方API仓库、微信机器人🤖️、qq机器人🤖️、Chrome扩展、Vscode扩展等等
今天就给大家介绍一下用Nodejs实现的ChatGPT API: chatgpt-api
仓库作者:Travis Fischer
注:本文介绍的是比较早的v2.0.1版本,主要是通过cookie认证的方式,去调用接口;
而lastest版本已经采用的是puppeteer来绕过和自动化登录流程
仓库地址: github.com/transitive-…
首先来看一看该仓库的描述:
“一个非官方的Nodejs实现的ChatGPT API”
因为官方没有公共的API,v2.0.1版本采用的只能是Cookie认证的方式,基于此,我们来看一看运行流程是怎么养的:
官方使用例子🌰:
整体运行流程🌠:
给大家分别解释一下:
- 第一步:使用入口类ChatGPTAPI创建实例,初始化了Token、请求的url地址、userAgent、超时时间等参数,如图:
- 第二步:根据传入的Token调用构造Auth请求,获取返回的AccessToken并保存到缓存里面;
- 实际步骤就是:
- 从缓存中获取token
- 调用Auth接口
- 保存token
- 代码如图(标注上了注释):
- 第三步:依赖上一步得到的AccessToken,直接调用sendMessage方法去和AI对话
- 具体步骤就是:
- 获取token
- 调用和AI对话的接口
-
代码如图(标注上了注释):
值得关注的几个地方:
-
大家都知道ChatGPT是有会话功能的,能够维持上下文,那是如何实现的呢?
其实在发送消息的请求中用了两个id来维持
-
conversationId代表的是此次会话的id
-
parentMessageId代表的是此次会话上一条消息的id
通过这两个参数,就能在请求里维持上下文信息。
- 发送消息的接口采用了SSE
SSE 是 Server-Sent Events 的简称, 是一种服务器端到客户端(浏览器)的单项消息推送。对应的浏览器端实现 Event Source 接口被制定为HTML5 的一部分。
该仓库中使用了Fetch实现了从Response流不断获取消息数据,如图
以下为streamAsyncIterable方法读取流的方式:
- 仓库目录结构
- docs/media:存放了项目的一些说明文档和图片等媒介资源
- src:
可以看到,其实src目录一开始也比较混乱,入口js、不同API模块、types文件、工具函数都放在一起
- 其他的就是一些基本的项目配置文件了,按需引入即可
- 自定义错误类
export class ChatGPTError extends Error {
statusCode?: number
statusText?: string
response?: Response
originalError?: Error
}
// instantiation
const error = new types.ChatGPTError('ChatGPT invalid email')
error.statusCode = 401
throw error
- token缓存: 用到了可以设置缓存过期时间的NPM库:expiry-map,大家可以了解一下。
🌊总结:
- 可以看出该仓库的作者Travis Fischer是比较有行动力的, 在ChatGPT发布后的几天就发布了这个Nodejs实现的API库,idea转化成实际的东西能力比较强,仓库的成功一方面也抓住热点,付出了行动,值得自己学习;
- 阅读源码的过程更像是一个个零散知识点的不断补充,完善,汇聚成体系的过程,需要多思考,多总结。
我也将💪持续阅读好的代码库,思考学习好的代码,把自己的成长分享出来。