From a897a755b668d153e776bd38718ca1f77259db7d Mon Sep 17 00:00:00 2001 From: RockYang Date: Sat, 6 May 2023 09:33:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9A=E6=9C=9F=E4=BF=9D=E5=AD=98=20?= =?UTF-8?q?API=20KEY=20=E7=9A=84=E6=9C=80=E5=90=8E=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 31 ++++++++++++++++++++----------- server/handler_chat.go | 7 ++++++- server/server.go | 2 ++ 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 11ccf6e1..803d8281 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,29 @@ -# Wechat-GPT +# Chat-Plus 智能助手 -基于 ChatGPT 的聊天应用 +基于 OpenAI API 实现的 ChatGPT Web 应用,一共分为两个版本: + +* 通用版:交互体验跟 ChatGPT 官方一致,聊天记录保存在客户端(浏览器) +* 角色版:内置了各种预训练好的角色,比如小红书写手,英语翻译大师,苏格拉底,孔子,乔布斯,周报助手等。轻松满足你的各种聊天和应用需求。 +聊天记录保存在云端(可以配置是否保存聊天记录) +每个版本都有 PC 版和移动版,PC 版本的体验要略优于移动版。 + +**本项目基于 MIT 协议,免费开放全部源代码,可以作为个人学习使用或者商用。如需商用建议联系作者登记,仅做统计使用,优秀项目我们将在项目首页为您展示。** + +## 项目功能介绍 ## TODOLIST - -* [x] 使用 level DB 保存用户聊天记录 -* [x] 用户聊天鉴权,设置口令模式 +* [x] 使用 level DB 保存用户,角色和聊天记录数据 +* [x] 引入用户角色,添加用户聊天鉴权,设置口令模式 * [x] 定期清理不在线的会话 sessionID 和聊天上下文记录 -* [x] 给 Token 设置调用次数 * [x] OpenAI API 负载均衡,限制每个 API Key 每分钟之内调用次数不超过 15次,防止被封 * [x] 角色设定,预设一些角色,比如程序员,客服,作家,老师,艺术家... -* [x] markdown 语法解析和代码高亮 +* [x] 实现 markdown 语法解析和代码高亮,支持复制回复内容功能 * [ ] 用户配置界面,配置用户的使用习惯,可以让用户配置自己的 API KEY,调用自己的 API Key,将不记 Token 的使用次数 +* [ ] **新增管理后台功能,实现用户,角色的动态管理** * [ ] 嵌入 AI 绘画功能,支持根据描述词生成图片 -* [x] 点卡用完之后,提示加入知识星球 -* [ ] 增加 Buffer 层,将相同的问题答案缓存起来,相同问题直接返回答案。 -* [ ] 界面改版,支持创建会话功能,支持发语音 -* [x] 允许修改角色训练数据 +* [ ] 接入自己训练的开源大语言模型 +* [ ] 接入 Google 语音 API,支持语音聊天 + +## 参与贡献 + diff --git a/server/handler_chat.go b/server/handler_chat.go index f50aadfb..98ed1b97 100644 --- a/server/handler_chat.go +++ b/server/handler_chat.go @@ -332,7 +332,12 @@ func (s *Server) getApiKey(failedKey string) string { rand.NewSource(time.Now().UnixNano()) if len(keys) > 0 { key := keys[rand.Intn(len(keys))] - key.LastUsed = time.Now().Unix() + // 更新选中 Key 的最后使用时间 + for i, item := range s.Config.Chat.ApiKeys { + if item.Value == key.Value { + s.Config.Chat.ApiKeys[i].LastUsed = time.Now().Unix() + } + } return key.Value } return "" diff --git a/server/server.go b/server/server.go index 61530884..9a31b73b 100644 --- a/server/server.go +++ b/server/server.go @@ -143,6 +143,8 @@ func (s *Server) Run(webRoot embed.FS, path string, debug bool) { delete(s.ChatContexts, key) } } + // 保存配置文档 + _ = utils.SaveConfig(s.Config, s.ConfigPath) time.Sleep(time.Second * 5) // 每隔 5 秒钟清理一次 } }()