GPT Terminal 项目专栏
项目专栏合集
耗时一下午,我实现了 GPT Terminal,真正拥有了专属于我的 GPT 终端!
如何用 GPT 在 5 分钟内 ”调教“ 出一个专属于你的 ”小黑子“?
如何丝滑实现 GPT 打字机流式回复?Server-Sent Events!
我是如何让我的 GPT Terminal “长记性” 的?还是老配方!
一个合格的类 GPT 应用需要具备什么?一文带你打通 GPT 产品功能!
开发一个 ChatGPT 真的只是当 “接口侠” 吗?GPT Terminal 细节分享!
项目地址:https://github.com/ltyzzzxxx/gpt-web-terminal
欢迎大家Star、提出PR,共同维护,打造真正意义上的 GPT 终端!
项目介绍
GPT Terminal 是一个让你在终端上与 GPT 进行自由对话的平台。
在这里,你可以更加轻易地实现更多定制化的功能,拥有专属于你的 GPT 终端!
项目快速启动文档参考:https://github.com/ltyzzzxxx/gpt-web-terminal/blob/master/README.md
项目概览图
项目核心功能介绍
- 支持命令行终端与 GPT 进行对话,我们程序员就是要用极客范儿的方式与 GPT 交流!
- 基于 GPT 的中英文翻译助手,地道翻译的最佳选择!
- 基于 GPT 的命令行翻译助手,当你忘记 linux 命令时,就用它!
- 基本的终端命令,如查看历史命令、帮助手册、清屏等
- 终端用户登录与注册
项目技术栈
前端
前端 |
---|
Vue 3 |
Vite2 |
Ant Design Vue 3 组件库 |
Pinia 2 状态管理 |
TypeScript 类型控制 |
Eslint 代码规范控制 |
Prettier 美化代码 |
axios 网络请求 |
dayjs 时间处理 |
lodash 工具库 |
getopts 命令参数解析 |
后端
后端 |
---|
Node.js |
Express、express-session |
MySQL |
Sequelize(ORM 框架) |
Redis |
项目开发过程
需求分析
在日常生活中,我经常需要用到两个翻译软件,一个是 GPT 翻译,另一个是 Google 翻译。它们二者有各自的使用场合。
- GPT 翻译:我用英文给他人发消息或发邮件时,需要润色一下语句,此时我便选择 GPT翻译更加地道(中译英)
- Goole 翻译:我在阅读英文文献/文档时,只需了解大意即可,机器翻译更加快速,效率更高(英译中)
我在开发的时候,经常忘记一些 linux 终端命令,每次我都需要去 Google 或询问 GPT,比较麻烦。于是我便想着能否定制一个 GPT 角色,当我输入命令的意思时,它直接将其翻译为命令。
于是,我从我自身的需求出发,我想要将它设计为一个可定制化的、专注于提供 GPT 服务的终端,这与咱们接触的普通终端不同。因此,我在这个项目中移除了终端的文件系统以及其它的命令,保留了帮助手册、历史命令、清屏等基本功能以及用户登录、注册功能(用户模块这里需要进行扩展,是后续的开发计划,留到后文与大家分享)。
核心流程
确定好需求之后,就开始进行开发啦。项目的核心就是将 引入 GPT 服务、设置GPT命令。前端核心流程如下:
- 提供GPT 命令
- 接受用户输入的 GPT 命令
- 解析 GPT 命令
- 调用后端集成的 GPT 接口
- 返回 GPT 输出内容。
我将 GPT 提供的服务放于后端。其实也可以放到前端,但是我出于方便之后扩展更多 GPT 定制角色功能的考虑,集成到了后端,这样也更加清晰、更符合前后端分离的开发规范。
GPT 后端服务的开发主要采用了 openai SDK包,只需要通过 npm install
方式即可将包导入到我们的项目中。其最主要的方法便是 createChatCompletion
(位于项目 server/thirdpart/gptApi.js
文件中)。其接受的参数便是我们发送的信息,返回的结果即 GPT 生成的内容。使用起来非常简单,不过大家在体验的过程中,需要配置好网络,才可访问到接口。
但是讲到这里,还是没有提到前文所说的可定制化的功能。这个看似比较神秘,但实际上很简单啦。createChatCompletion接受的参数是一个消息数组。当你未提供上下文时,它就是一个简单的 角色 + 内容的对象数组。示例如下。
1 |
|
但是当你提供了你的需求上下文时,GPT 的输出便会取决于你的需求。示例如下:
1 |
|
如果大家想更方便与可视化地体验这个过程,可以去 OpenAI 官方网站探索:https://platform.openai.com/playground
这便是项目的核心流程啦,项目的细节大家可以自行克隆研究一下。
踩坑过程
接下来,我为大家分享一下项目的踩坑过程:
获取
OpenAI Key
。我是OpenAI
老用户,但我登上官网发现,正是因为老用户,我的免费18美元的额度早早地过期了。于是我想着绑定自己的信用卡,花钱解决,但是可能由于检测到 IP 异常,导致绑定失败。于是我又想着再注册一个账号,还是失败了,之前手机号已经注册过,虚拟手机号被检测到也行不通。于是,我想了一下似乎只需要用到OpenAI Key
,那直接某宝买一个得了,果然行得通!在这里,我就不给大家分享了,自行探索。检索信息、探索自学能力才是程序员真正的强项。耗时两个小时,终于解决啦!(在此期间,我还找了一个 GPT 模板仓库,用Vercel
快速部署了一个 GPT 聊天网站,试验成功后才放心开始下一步)网络踩坑。由于我对
Node.js
不是很熟,所以写的代码让我自己很不放心。果然在测试的时候便出问题了,一直没有响应。一开始我以为是我代码有问题,并没有调用到OpenAI
接口。但是经过一番 Debug 后,发现是请求超时。于是我又再次更新网络,耗时一个小时,终于解决啦!不熟悉
Node.js
踩坑。由于前端实在太菜,只会写简单的Vue/React
,不清楚引入模块的原理,我在后端中尝试用import
关键字引入模块,但其实应该用require
关键字引入模块。两者区别在于:require
是CommonJS
规范中定义的关键字,使用require
时一般需要将所需的模块路径以字符串的形式作为参数传递给require
函数。而import
则是ES6 (ECMAScript 2015)
中定义的关键字,使用import
时则需要用{}
将所需的模块名称包裹起来。好在在上一个踩坑过程中,搭了一个 GPT 网站,我直接用它帮我查找问题,于是很快速地解决啦!艺术字踩坑。我想要在前端页面中展示出来
Banner
艺术字样式,但是自己手动打一个实在费劲,于是我就去 https://www.npmjs.com/ 网站中查找有没有我需要的轮子。还真找到了 -figlet
。但是安装实测之后,发现其一直报错。求助 GPT 之后,我发现似乎是因为其只能在后端环境中使用,不能在浏览器中展示。我又使用了几个轮子后,发现还是同样的问题(也可能是我太菜了,打开方式不对)。于是我只能自己手写一个!但即便是手写,还是出现了问题。我发现交给v-html
渲染之后,字符串中的多个空格变为了一个。于是,我便用正则表达式的方式将空格替换为 。踩坑两个小时,这一问题终于得到了解决!顺便推荐一下我使用艺术字转换工具:https://patorjk.com/software/taag
到此为止,项目就已经搭建完成了。
项目后续更新计划
最后,我再给大家分享一下我的后续更新计划,让 GPT Terminal
实现真正的可定制化:
上线部署
GPT Terminal
支持用户在终端界面自定义角色,并持久化
支持用户在线设置自己的
OpenAI Key
,并与账户相绑定支持 GPT 回复内容显示为
Markdown
格式支持 GPT 角色市场,大家共享自己定制的 GPT 角色,分享快乐!
此外,还需要做一些前端 UI 展示的优化。后续如果更新了更多的功能,我会将今天的分享以及后续的实现思路,写成一个项目笔记/文档,分享给大家!