Compare commits

..

73 Commits

Author SHA1 Message Date
RockYang
5f820b9dc1 merge v4.0.6 2024-06-03 14:22:08 +08:00
RockYang
4a99be2f15 remove license code 2024-05-21 16:20:29 +08:00
RockYang
27c816cf3b merge conflicts for v4.0.5 2024-05-21 11:30:40 +08:00
RockYang
0d81776212 update docker image name 2024-05-21 11:21:27 +08:00
RockYang
cccab31c0f rename project name to geekai 2024-05-20 15:14:02 +08:00
RockYang
4ddf3bf2bf fixed bugs for send message captcha component 2024-05-17 08:41:09 +08:00
RockYang
3d37a3d367 update readme 2024-05-14 18:23:12 +08:00
RockYang
73d8236697 update change log 2024-05-14 18:20:52 +08:00
RockYang
114d0088dc update version 2024-05-14 18:03:58 +08:00
RockYang
43b6665370 refactor: use waterflow component in mj, sd and dall image drawing page 2024-05-13 19:04:00 +08:00
RockYang
5fb9f84182 fixed sd page waterfall component 2024-05-11 18:27:35 +08:00
RockYang
e35c34ad9a enable to update AI Drawing configuarations in admin console page 2024-05-11 17:27:14 +08:00
RockYang
1a4d798f8b fix: markmap do not cost power in front page 2024-05-11 07:08:14 +08:00
RockYang
afb91a7023 optimize chat handler error handle code 2024-05-10 18:26:19 +08:00
RockYang
dc4c1f7877 fix bug: remove chat role failed 2024-05-10 17:38:55 +08:00
RockYang
bbc8fe2b40 fixed bug for dalle3 task not decrease power 2024-05-10 11:18:37 +08:00
RockYang
57c932f07c add toolbar for markmap component 2024-05-10 06:38:34 +08:00
RockYang
8b3b0139b0 use proxy for downloading discord images 2024-05-09 18:48:53 +08:00
RockYang
31828a3336 add stable diffusion default negtive prompt system config 2024-05-07 16:49:54 +08:00
RockYang
9a797bb4a5 add stable diffusion default negtive prompt system config 2024-05-07 16:21:31 +08:00
RockYang
b0c9ffc5a6 handle the exception for web front page 2024-05-06 17:39:58 +08:00
RockYang
f527cc5b98 fixed conflicts 2024-05-06 14:44:09 +08:00
RockYang
debe8dc209 chore: change module name to geekai, add copyright in source code 2024-05-06 14:41:27 +08:00
RockYang
142cd553a3 fix bug for waterflow component 2024-05-05 10:52:29 +08:00
RockYang
1232c3cd9c fix bug for license synchronize 2024-05-04 21:30:29 +08:00
RockYang
3ac04a3938 opt: optimize mobile images page styles 2024-05-03 08:14:33 +08:00
RockYang
b7abc42209 fix: fix bug for dalle power refund 2024-05-01 08:48:32 +08:00
RockYang
a48179ce0e chore: update docker image name 2024-05-01 07:59:20 +08:00
RockYang
e589f25a05 opt: styles and view micro optimization 2024-05-01 07:40:56 +08:00
RockYang
cc1a3ce343 opt: close unused websocket connections 2024-04-30 22:54:39 +08:00
RockYang
7bb76d581c chore: replace docker image url with AliYun 2024-04-30 19:08:33 +08:00
RockYang
0d733c0be0 feat: change theme for mobile site is ready 2024-04-30 18:57:15 +08:00
RockYang
8b40ac5b5c feat: mobile page refactor is finished 2024-04-29 19:22:00 +08:00
RockYang
24479814e9 opt: add chat config for mobile chat session 2024-04-29 09:39:23 +08:00
RockYang
99df028237 feat: add index page for mobile 2024-04-28 19:09:26 +08:00
RockYang
b354b88876 theme change is ready 2024-04-27 13:13:28 +08:00
RockYang
5e0be4d10e feat: admin console dark theme 2024-04-26 18:10:17 +08:00
RockYang
468b48151f opt: optimize index and login page UI 2024-04-26 16:07:02 +08:00
RockYang
fa5c036041 synchronize license every 10 secs 2024-04-26 14:35:01 +08:00
RockYang
0fdc588167 change index page background 2024-04-25 18:54:33 +08:00
RockYang
bd4b0c4d65 show license info in admin active page, optimize markdown generate prompt 2024-04-24 19:00:28 +08:00
RockYang
9d28e62142 fixed bug for markmap 2024-04-23 20:47:06 +08:00
RockYang
61b2dbc9f1 optimize styles and release v4.0.4 2024-04-23 18:46:32 +08:00
RockYang
be3245666e feat: hide more navigator items 2024-04-22 16:27:53 +08:00
RockYang
dacdd6fe74 feat: support markmap svg export and download as png image 2024-04-22 14:20:51 +08:00
RockYang
6807f7e88a allow users to select a chatApp to chat in chat app list page 2024-04-22 11:18:55 +08:00
RockYang
087f5ab2d1 optimize index page UI 2024-04-22 10:43:33 +08:00
RockYang
47c5a0387b optimize code for remove timeout and failed image drawing job 2024-04-21 21:44:28 +08:00
RockYang
f9da18ad52 image wall page add dalle 2024-04-21 20:42:42 +08:00
RockYang
5c9025ca22 dalle image page is ready 2024-04-21 20:23:47 +08:00
RockYang
d02cb573fd DO NOT refresh finished jobs when job is running 2024-04-20 21:30:55 +08:00
RockYang
caa538a1d0 fixed markdown generating styles 2024-04-19 18:22:45 +08:00
RockYang
b584b4bfb6 support send email use TLS 2024-04-19 12:04:59 +08:00
RockYang
336a7d5b56 fixed bug for QWen response blank quotes 2024-04-19 10:30:02 +08:00
RockYang
a0f464830f fixed bug for chat handler doRequest method 2024-04-16 23:49:56 +08:00
RockYang
96ead65774 fixed bug for websocket close tip message 2024-04-15 18:15:15 +08:00
RockYang
7ad41927aa feat: markmap function is ready 2024-04-15 17:23:59 +08:00
RockYang
8a9f386d8f opt: close the old connection for mj and sd clients 2024-04-15 09:34:20 +08:00
RockYang
9a1368ef17 markmap enable to select ai model 2024-04-15 06:16:53 +08:00
RockYang
31b02b97d3 fixed chat page styles 2024-04-12 21:57:41 +08:00
RockYang
42da38c5c3 feat: markmap page view is ready 2024-04-12 18:49:24 +08:00
RockYang
0a01b55713 feat: allow chat model bind a fixed api key 2024-04-12 17:09:22 +08:00
RockYang
3b292c2a12 chore: update build.sh 2024-04-11 21:26:33 +08:00
RockYang
db0ba0d9a0 feat: use custom mode for mj upscale and variation operarions 2024-04-11 17:32:34 +08:00
RockYang
3a23ff6b42 feat: add index page 2024-04-10 18:23:55 +08:00
RockYang
1e9c5adb0a feat: support for freeGPT35 API 2024-04-10 14:49:07 +08:00
RockYang
abab76ccc6 feat: support gpt-4-turbo-2014-04-09 vision function 2024-04-10 11:47:10 +08:00
RockYang
6efd92806f fixed bug for gpt-4-turbo-2024-0409 model function calls 2024-04-10 10:23:45 +08:00
RockYang
cfe333e89f fix bug: remove timeout task ONLY for unfinished(progress < 100) 2024-04-10 06:25:54 +08:00
RockYang
5230f90540 fix bug for remove api 404 errorc 2024-04-06 20:36:52 +08:00
RockYang
803db4e895 feat: show bind model on chat role list page 2024-04-05 21:21:28 +08:00
RockYang
7cee9f2ebb feat: support uploading role icon 2024-04-05 17:41:23 +08:00
RockYang
8be9a21efd feat: allow bind a chat model for chat role 2024-04-05 12:51:18 +08:00
203 changed files with 9856 additions and 2619 deletions

View File

@@ -1,5 +1,5 @@
name: Bug 报告 🐛 name: Bug 报告 🐛
description: chatgpt-plus 提交错误报告 description: geekai 提交错误报告
labels: ['Bug'] labels: ['Bug']
body: body:
- type: checkboxes - type: checkboxes

View File

@@ -1,5 +1,5 @@
name: 功能优化 🚀 name: 功能优化 🚀
description: chatgpt-plus 提交优化建议 description: geekai 提交优化建议
labels: ['feature'] labels: ['feature']
body: body:
- type: checkboxes - type: checkboxes

View File

@@ -1,4 +1,41 @@
# 更新日志 # 更新日志
## v4.0.6
* Bug修复修复PC端画廊页面的瀑布流组件样式错乱问题
* 功能新增:给思维导图增加 ToolBar实现思维导图的放大缩小和定位
* Bug修复修复思维导图不扣费的Bug
* Bug修复修复管理后台角色删除失败的Bug
* Bug修复兼容最新版秋叶SD懒人包的 SD API新增 scheduler 参数
* 功能优化:支持在管理后台配置 AI 绘图相关配置,包括 SD, MJ-PLUS, MJ-PROXY
* Bug修复修复注册用户提示注册人数达到上限的 Bug
* 功能优化将MJ,SD,Dall绘画页面的任务列表全改成瀑布流组件
## v4.0.5
* 功能优化:已授权系统在后台显示授权信息
* 功能优化:使用思维链提示词生成思维导图,确保生成的思维导图不会出现格式错误
* 功能优化:优化首页登录注册页面的 UI
* BUG修复修复License验证的逻辑漏洞
* Bug修复后台添加用户的时候密码规则限制跟前台注册保持一致
* 功能新增:管理后台支持切换主题,支持 light 和 dark 两种主题
* 功能新增:移动端新增 DALL-E 绘画功能
* 功能新增:新增移动端首页功能,移动端支持 light 和 dark 两种主题
* 功能新增:移动支持免登录预览功能
* Bug修复解决在同一个浏览器开启多个对话时候对话内容会相互乱串的问题
* Bug修复修复部分中转 API 模型会出现第一输出的字符被淹没的Bug
## v4.0.4
* Bug修复修复统一千问第二句不回复的问题
* 功能优化MJ 和 SD 任务正在执行时不更新已完成任务列表,加快页面渲染速度
* 功能新增Dalle AI 绘画功能实现
* Bug修复修复思维导图格式乱码问题
* 功能优化:支持使用 TLS 邮件协议,解决国内服务器无法使用 25 号端口发送邮件的问题
* 功能新增:支持从应用列表直接和某个应用对话
* 功能优化优化算力日志的页面和首页的UI
* 功能新增:支持思维导图导出 PNG 图片下载
## v4.0.3 ## v4.0.3
* 功能新增:允许为角色应用绑定模型,如指定某个角色只能使用某个模型 * 功能新增:允许为角色应用绑定模型,如指定某个角色只能使用某个模型
@@ -11,15 +48,15 @@
* 功能新增:支持为模型绑定 API KEY比如为 GPT3.5 模型绑定免费的 API KEY 给用户免费使用来引流不至于消耗你的收费 KEY。 * 功能新增:支持为模型绑定 API KEY比如为 GPT3.5 模型绑定免费的 API KEY 给用户免费使用来引流不至于消耗你的收费 KEY。
* 功能新增:支持管理后台 Logo 修改 * 功能新增:支持管理后台 Logo 修改
## v4.0.2 ## 4.0.2
* 功能新增:支持前端菜单可以配置 * 功能新增:支持前端菜单可以配置
* 功能优化:在登录和注册界面标题显示软件版本号 * 功能优化:在登录和注册界面标题显示软件版本号
* 功能优化MJ 绘画支持 --sref 和 --cref 图片一致性参数 * 功能优化MJ 绘画支持 --sref 和 --cref 图片一致性参数
* 功能优化:使用 leveldb 解决 SD 绘图进度图片预览问题 * 功能优化:使用 leveldb 解决 SD 绘图进度图片预览问题
* Bug修复解决因为图片上传使用相对路径而导致融图失败的问题 * Bug修复解决因为图片上传使用相对路径而导致融图失败的问题
* 功能新增:手机端支持 Stable-Diffusion 绘画 * 功能新增:手机端支持 Stable-Diffusion 绘画
* Bug修复修复管理后台 API KEY 删除失败的问题 * 功能新增:管理后台登录页面增加行为验证码,防止爆破
## v4.0.1 ## v4.0.1

View File

@@ -1,6 +1,7 @@
# ChatGPT-Plus # GeekAI
### 本项目已经正式更名为 GeekAI请大家及时更新代码克隆地址。
**ChatGPT-PLUS** 基于 AI 大语言模型 API 实现的 AI 助手全套开源解决方案,自带运营管理后台,开箱即用。集成了 OpenAI, Azure, **GeekAI** 基于 AI 大语言模型 API 实现的 AI 助手全套开源解决方案,自带运营管理后台,开箱即用。集成了 OpenAI, Azure,
ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了 MidJourney 和 Stable Diffusion AI绘画功能。 ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了 MidJourney 和 Stable Diffusion AI绘画功能。
主要特性: 主要特性:
@@ -16,7 +17,7 @@ ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了
- 集成插件 API 功能,可结合大语言模型的 function 功能开发各种强大的插件,已内置实现了微博热搜,今日头条,今日早报和 AI - 集成插件 API 功能,可结合大语言模型的 function 功能开发各种强大的插件,已内置实现了微博热搜,今日头条,今日早报和 AI
绘画函数插件。 绘画函数插件。
### 🚀 更多功能请查看 [Geek-AI](https://github.com/yangjian102621/geek-ai) ### 🚀 更多功能请查看 [GeekAI-PLUS](https://github.com/yangjian102621/geekai-plus)
- [x] 更友好的 UI 界面 - [x] 更友好的 UI 界面
- [x] 支持 Dall-E 文生图功能 - [x] 支持 Dall-E 文生图功能
@@ -81,29 +82,7 @@ ChatGLM,讯飞星火,文心一言等多个平台的大语言模型。集成了
## 快速部署 ## 快速部署
**演示站不提供任何充值点卡售卖或者VIP充值服务。** 如果您体验过后觉得还不错的话,可以花两分钟用下面的一键部署脚本自己部署一套 请参考文档 [**GeekAI 快速部署**](https://ai.r9it.com/docs/install/)
```shell
bash -c "$(curl -fsSL https://img.r9it.com/tmp/install-v4.0.4-36d397add2.sh)"
```
最新版本的一键部署脚本请参考 [**ChatGPT-Plus 文档**](https://ai.r9it.com/docs/install/)。
目前仅支持 Ubuntu 和 Centos 系统。 部署成功之后可以访问下面地址
* 前端访问地址http://localhost:8080/chat 使用移动设备访问会自动跳转到移动端页面。
* 后台管理地址http://localhost:8080/admin
* 移动端地址http://localhost:8080/mobile
* 初始后台管理账号admin/admin123
* 初始前端体验账号18575670125/12345678
服务启动成功之后不能立刻使用,需要先登录管理后台 -> API-KEY 去添加一个 OpenAI 或者文心一言,科大讯飞等至少一个平台的 API
KEY。
![](https://ai.r9it.com/docs/images/env/admin_api_keys.png)
另外,如果您目前还没有 OpenAI 的 API KEY的推荐您去 https://api.chat-plus.net 购买,**无需魔法,高速稳定,且价格还远低于 OpenAI
官方**。
## 使用须知 ## 使用须知
@@ -112,12 +91,12 @@ KEY。
## 项目地址 ## 项目地址
* Github 地址https://github.com/yangjian102621/chatgpt-plus * Github 地址https://github.com/yangjian102621/geekai
* 码云地址https://gitee.com/blackfox/chatgpt-plus * 码云地址https://gitee.com/blackfox/geekai
## 客户端下载 ## 客户端下载
目前已经支持 Win/Linux/Mac/Android 客户端下载地址为https://github.com/yangjian102621/chatgpt-plus/releases/tag/v3.1.2 目前已经支持 Win/Linux/Mac/Android 客户端下载地址为https://github.com/yangjian102621/geekai/releases/tag/v3.1.2
## TODOLIST ## TODOLIST
@@ -129,7 +108,7 @@ KEY。
最新的部署视频教程:[https://www.bilibili.com/video/BV1Cc411t7CX/](https://www.bilibili.com/video/BV1Cc411t7CX/) 最新的部署视频教程:[https://www.bilibili.com/video/BV1Cc411t7CX/](https://www.bilibili.com/video/BV1Cc411t7CX/)
详细的部署和开发文档请参考 [**ChatGPT-Plus 文档**](https://ai.r9it.com/docs/)。 详细的部署和开发文档请参考 [**GeekAI 文档**](https://ai.r9it.com/docs/)。
加微信进入微信讨论群可获取 **一键部署脚本添加好友时请注明来自Github!!!)。** 加微信进入微信讨论群可获取 **一键部署脚本添加好友时请注明来自Github!!!)。**
@@ -157,4 +136,4 @@ KEY。
![打赏](docs/imgs/donate.png) ![打赏](docs/imgs/donate.png)
![Star History Chart](https://api.star-history.com/svg?repos=yangjian102621/chatgpt-plus&type=Date) ![Star History Chart](https://api.star-history.com/svg?repos=yangjian102621/geekai&type=Date)

View File

@@ -1,5 +1,5 @@
SHELL=/usr/bin/env bash SHELL=/usr/bin/env bash
NAME := chatgpt-plus NAME := geekai
all: amd64 arm64 all: amd64 arm64
amd64: amd64:

View File

@@ -108,7 +108,8 @@ WeChatBot = false
ApiURL = "https://api.xunhupay.com" ApiURL = "https://api.xunhupay.com"
NotifyURL = "https://ai.r9it.com/api/payment/hupipay/notify" NotifyURL = "https://ai.r9it.com/api/payment/hupipay/notify"
[SmtpConfig] # 注意阿里云服务器禁用了25号端口所以如果需要使用邮件功能,请别用阿里云服务器 [SmtpConfig] # 注意阿里云服务器禁用了25号端口请使用 465 端口,并开启 TLS 连接
UseTls = false
Host = "smtp.163.com" Host = "smtp.163.com"
Port = 25 Port = 25
AppName = "极客学长" AppName = "极客学长"

View File

@@ -1,11 +1,18 @@
package core package core
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bytes" "bytes"
"chatplus/core/types" "geekai/core/types"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"context" "context"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -200,10 +207,13 @@ func authorizeMiddleware(s *AppServer, client *redis.Client) gin.HandlerFunc {
func needLogin(c *gin.Context) bool { func needLogin(c *gin.Context) bool {
if c.Request.URL.Path == "/api/user/login" || if c.Request.URL.Path == "/api/user/login" ||
c.Request.URL.Path == "/api/user/logout" ||
c.Request.URL.Path == "/api/user/resetPass" || c.Request.URL.Path == "/api/user/resetPass" ||
c.Request.URL.Path == "/api/admin/login" || c.Request.URL.Path == "/api/admin/login" ||
c.Request.URL.Path == "/api/admin/logout" ||
c.Request.URL.Path == "/api/admin/login/captcha" || c.Request.URL.Path == "/api/admin/login/captcha" ||
c.Request.URL.Path == "/api/user/register" || c.Request.URL.Path == "/api/user/register" ||
c.Request.URL.Path == "/api/user/session" ||
c.Request.URL.Path == "/api/chat/history" || c.Request.URL.Path == "/api/chat/history" ||
c.Request.URL.Path == "/api/chat/detail" || c.Request.URL.Path == "/api/chat/detail" ||
c.Request.URL.Path == "/api/chat/list" || c.Request.URL.Path == "/api/chat/list" ||

View File

@@ -1,10 +1,17 @@
package core package core
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bytes" "bytes"
"chatplus/core/types" "geekai/core/types"
logger2 "chatplus/logger" logger2 "geekai/logger"
"chatplus/utils" "geekai/utils"
"os" "os"
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ApiRequest API 请求实体 // ApiRequest API 请求实体
type ApiRequest struct { type ApiRequest struct {
Model string `json:"model,omitempty"` // 兼容百度文心一言 Model string `json:"model,omitempty"` // 兼容百度文心一言

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"errors" "errors"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"fmt" "fmt"
) )
@@ -119,11 +126,11 @@ type RedisConfig struct {
const LicenseKey = "Geek-AI-License" const LicenseKey = "Geek-AI-License"
type License struct { type License struct {
Key string // 许可证书密钥 Key string `json:"key"` // 许可证书密钥
MachineId string // 机器码 MachineId string `json:"machine_id"` // 机器码
UserNum int // 用户数量 UserNum int `json:"user_num"` // 用户数量
ExpiredAt int64 // 过期时间 ExpiredAt int64 `json:"expired_at"` // 过期时间
IsActive bool // 是否激活 IsActive bool `json:"is_active"` // 是否激活
} }
func (c RedisConfig) Url() string { func (c RedisConfig) Url() string {
@@ -168,4 +175,6 @@ type SystemConfig struct {
EnableContext bool `json:"enable_context,omitempty"` EnableContext bool `json:"enable_context,omitempty"`
ContextDeep int `json:"context_deep,omitempty"` ContextDeep int `json:"context_deep,omitempty"`
SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词
} }

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
type ToolCall struct { type ToolCall struct {
Type string `json:"type"` Type string `json:"type"`
Function struct { Function struct {

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"context" "context"
"sync" "sync"

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
type OrderStatus int type OrderStatus int
const ( const (

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
type OSSConfig struct { type OSSConfig struct {
Active string Active string
Local LocalStorageConfig Local LocalStorageConfig

View File

@@ -1,11 +1,17 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
const LoginUserID = "LOGIN_USER_ID" const LoginUserID = "LOGIN_USER_ID"
const LoginUserCache = "LOGIN_USER_CACHE" const LoginUserCache = "LOGIN_USER_CACHE"
const UserAuthHeader = "Authorization" const UserAuthHeader = "Authorization"
const AdminAuthHeader = "Admin-Authorization" const AdminAuthHeader = "Admin-Authorization"
const ChatTokenHeader = "Chat-Token"
// Session configs struct // Session configs struct
type Session struct { type Session struct {

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
type SMSConfig struct { type SMSConfig struct {
Active string Active string
Ali SmsConfigAli Ali SmsConfigAli

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// TaskType 任务类别 // TaskType 任务类别
type TaskType string type TaskType string
@@ -48,9 +55,10 @@ type SdTaskParams struct {
NegPrompt string `json:"neg_prompt"` // 反向提示词 NegPrompt string `json:"neg_prompt"` // 反向提示词
Steps int `json:"steps"` // 迭代步数默认20 Steps int `json:"steps"` // 迭代步数默认20
Sampler string `json:"sampler"` // 采样器 Sampler string `json:"sampler"` // 采样器
FaceFix bool `json:"face_fix"` // 面部修复 Scheduler string `json:"scheduler"`
CfgScale float32 `json:"cfg_scale"` //引导系数,默认 7 FaceFix bool `json:"face_fix"` // 面部修复
Seed int64 `json:"seed"` // 随机数种子 CfgScale float32 `json:"cfg_scale"` //引导系数,默认 7
Seed int64 `json:"seed"` // 随机数种子
Height int `json:"height"` Height int `json:"height"`
Width int `json:"width"` Width int `json:"width"`
HdFix bool `json:"hd_fix"` // 启用高清修复 HdFix bool `json:"hd_fix"` // 启用高清修复

View File

@@ -1,5 +1,12 @@
package types package types
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// BizVo 业务返回 VO // BizVo 业务返回 VO
type BizVo struct { type BizVo struct {
Code BizCode `json:"code"` Code BizCode `json:"code"`

View File

@@ -1,4 +1,4 @@
module chatplus module geekai
go 1.19 go 1.19

View File

@@ -1,14 +1,21 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
logger2 "chatplus/logger" logger2 "geekai/logger"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"context" "context"
"fmt" "fmt"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,9 +1,16 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/handler" "geekai/handler"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/mojocn/base64Captcha" "github.com/mojocn/base64Captcha"
) )

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,13 +1,21 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -137,18 +144,13 @@ func (h *ChatRoleHandler) Set(c *gin.Context) {
} }
func (h *ChatRoleHandler) Remove(c *gin.Context) { func (h *ChatRoleHandler) Remove(c *gin.Context) {
var data struct { id := h.GetInt(c, "id", 0)
Id uint
} if id <= 0 {
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs) resp.ERROR(c, types.InvalidArgs)
return return
} }
if data.Id <= 0 { res := h.DB.Where("id", id).Delete(&model.ChatRole{})
resp.ERROR(c, types.InvalidArgs)
return
}
res := h.DB.Where("id = ?", data.Id).Delete(&model.ChatRole{})
if res.Error != nil { if res.Error != nil {
resp.ERROR(c, "删除失败!") resp.ERROR(c, "删除失败!")
return return

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store" "geekai/store"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,11 +1,18 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"

View File

@@ -1,13 +1,20 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/handler" "geekai/handler"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,11 +1,18 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/handler" "geekai/handler"
"chatplus/service/oss" "geekai/service/oss"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"

View File

@@ -1,14 +1,21 @@
package admin package admin
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core"
"chatplus/core/types"
"chatplus/handler"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"chatplus/utils/resp"
"fmt" "fmt"
"geekai/core"
"geekai/core/types"
"geekai/handler"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"geekai/utils/resp"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -75,6 +82,7 @@ func (h *UserHandler) Save(c *gin.Context) {
resp.ERROR(c, types.InvalidArgs) resp.ERROR(c, types.InvalidArgs)
return return
} }
var user = model.User{} var user = model.User{}
var res *gorm.DB var res *gorm.DB
var userVo vo.User var userVo vo.User

View File

@@ -1,11 +1,18 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
logger2 "chatplus/logger" logger2 "geekai/logger"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils" "geekai/utils"
"errors" "errors"
"fmt" "fmt"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,9 +1,16 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types" "geekai/core/types"
"chatplus/service" "geekai/service"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )

View File

@@ -1,11 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -25,7 +33,7 @@ func (h *ChatModelHandler) List(c *gin.Context) {
var res *gorm.DB var res *gorm.DB
// 如果用户没有登录,则加载所有开放模型 // 如果用户没有登录,则加载所有开放模型
if !h.IsLogin(c) { if !h.IsLogin(c) {
res = h.DB.Where("enabled = ?", true).Where("open =?", true).Order("sort_num ASC").Find(&items) res = h.DB.Where("enabled", true).Where("open", true).Order("sort_num ASC").Find(&items)
} else { } else {
user, _ := h.GetLoginUser(c) user, _ := h.GetLoginUser(c)
var models []int var models []int
@@ -36,7 +44,7 @@ func (h *ChatModelHandler) List(c *gin.Context) {
} }
// 查询用户有权限访问的模型以及所有开放的模型 // 查询用户有权限访问的模型以及所有开放的模型
res = h.DB.Where("enabled = ?", true).Where( res = h.DB.Where("enabled = ?", true).Where(
h.DB.Where("id IN ?", models).Or("open =?", true), h.DB.Where("id IN ?", models).Or("open", true),
).Order("sort_num ASC").Find(&items) ).Order("sort_num ASC").Find(&items)
} }

View File

@@ -1,12 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,14 +1,22 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bufio" "bufio"
"chatplus/core/types"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"html/template" "html/template"
"io" "io"
"strings" "strings"
@@ -37,14 +45,9 @@ func (h *ChatHandler) sendAzureMessage(
logger.Info("用户取消了请求:", prompt) logger.Info("用户取消了请求:", prompt)
return nil return nil
} else if strings.Contains(err.Error(), "no available key") { } else if strings.Contains(err.Error(), "no available key") {
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员") return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员")
return nil
} else {
logger.Error(err)
} }
utils.ReplyMessage(ws, ErrorMsg)
utils.ReplyMessage(ws, ErrImg)
return err return err
} else { } else {
defer response.Body.Close() defer response.Body.Close()
@@ -66,10 +69,7 @@ func (h *ChatHandler) sendAzureMessage(
var responseBody = types.ApiResponse{} var responseBody = types.ApiResponse{}
err = json.Unmarshal([]byte(line[6:]), &responseBody) err = json.Unmarshal([]byte(line[6:]), &responseBody)
if err != nil { // 数据解析出错 if err != nil { // 数据解析出错
logger.Error(err, line) return errors.New(line)
utils.ReplyMessage(ws, ErrorMsg)
utils.ReplyMessage(ws, ErrImg)
break
} }
if len(responseBody.Choices) == 0 { if len(responseBody.Choices) == 0 {
@@ -196,11 +196,10 @@ func (h *ChatHandler) sendAzureMessage(
if strings.Contains(res.Error.Message, "maximum context length") { if strings.Contains(res.Error.Message, "maximum context length") {
logger.Error(res.Error.Message) logger.Error(res.Error.Message)
utils.ReplyMessage(ws, "当前会话上下文长度超出限制,已为您清空会话上下文!")
h.App.ChatContexts.Delete(session.ChatId) h.App.ChatContexts.Delete(session.ChatId)
return h.sendMessage(ctx, session, role, prompt, ws) return h.sendMessage(ctx, session, role, prompt, ws)
} else { } else {
utils.ReplyMessage(ws, "请求 Azure API 失败:"+res.Error.Message) return fmt.Errorf("请求 Azure API 失败:%v", res.Error)
} }
} }

View File

@@ -1,14 +1,22 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bufio" "bufio"
"chatplus/core/types"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"html/template" "html/template"
"io" "io"
"net/http" "net/http"
@@ -54,14 +62,8 @@ func (h *ChatHandler) sendBaiduMessage(
logger.Info("用户取消了请求:", prompt) logger.Info("用户取消了请求:", prompt)
return nil return nil
} else if strings.Contains(err.Error(), "no available key") { } else if strings.Contains(err.Error(), "no available key") {
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员") return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员")
return nil
} else {
logger.Error(err)
} }
utils.ReplyMessage(ws, ErrorMsg)
utils.ReplyMessage(ws, ErrImg)
return err return err
} else { } else {
defer response.Body.Close() defer response.Body.Close()

View File

@@ -1,20 +1,27 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bytes" "bytes"
"chatplus/core"
"chatplus/core/types"
"chatplus/handler"
logger2 "chatplus/logger"
"chatplus/service/oss"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"chatplus/utils/resp"
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"geekai/core"
"geekai/core/types"
"geekai/handler"
logger2 "geekai/logger"
"geekai/service/oss"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"geekai/utils/resp"
"net/http" "net/http"
"net/url" "net/url"
"regexp" "regexp"
@@ -134,8 +141,10 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) {
for { for {
_, msg, err := client.Receive() _, msg, err := client.Receive()
if err != nil { if err != nil {
logger.Debugf("close connection: %s", client.Conn.RemoteAddr())
client.Close() client.Close()
h.App.ChatClients.Delete(sessionId) h.App.ChatClients.Delete(sessionId)
h.App.ChatSession.Delete(sessionId)
cancelFunc := h.App.ReqCancelFunc.Get(sessionId) cancelFunc := h.App.ReqCancelFunc.Get(sessionId)
if cancelFunc != nil { if cancelFunc != nil {
cancelFunc() cancelFunc()
@@ -164,7 +173,7 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) {
err = h.sendMessage(ctx, session, chatRole, utils.InterfaceToString(message.Content), client) err = h.sendMessage(ctx, session, chatRole, utils.InterfaceToString(message.Content), client)
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) utils.ReplyMessage(client, err.Error())
} else { } else {
utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd})
logger.Infof("回答完毕: %v", message.Content) logger.Infof("回答完毕: %v", message.Content)
@@ -186,8 +195,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
var user model.User var user model.User
res := h.DB.Model(&model.User{}).First(&user, session.UserId) res := h.DB.Model(&model.User{}).First(&user, session.UserId)
if res.Error != nil { if res.Error != nil {
utils.ReplyMessage(ws, "未授权用户,您正在进行非法操作!") return errors.New("未授权用户,您正在进行非法操作!")
return res.Error
} }
var userVo vo.User var userVo vo.User
err := utils.CopyObject(user, &userVo) err := utils.CopyObject(user, &userVo)
@@ -197,28 +205,22 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
} }
if userVo.Status == false { if userVo.Status == false {
utils.ReplyMessage(ws, "您的账号已经被禁用,如果疑问,请联系管理员!") return errors.New("您的账号已经被禁用,如果疑问,请联系管理员!")
utils.ReplyMessage(ws, ErrImg)
return nil
} }
if userVo.Power < session.Model.Power { if userVo.Power < session.Model.Power {
utils.ReplyMessage(ws, fmt.Sprintf("您当前剩余算力(%d已不足以支付当前模型的单次对话需要消耗的算力%d", userVo.Power, session.Model.Power)) return fmt.Errorf("您当前剩余算力(%d已不足以支付当前模型的单次对话需要消耗的算力%d", userVo.Power, session.Model.Power)
utils.ReplyMessage(ws, ErrImg)
return nil
} }
if userVo.ExpiredTime > 0 && userVo.ExpiredTime <= time.Now().Unix() { if userVo.ExpiredTime > 0 && userVo.ExpiredTime <= time.Now().Unix() {
utils.ReplyMessage(ws, "您的账号已经过期,请联系管理员!") return errors.New("您的账号已经过期,请联系管理员!")
utils.ReplyMessage(ws, ErrImg)
return nil
} }
// 检查 prompt 长度是否超过了当前模型允许的最大上下文长度 // 检查 prompt 长度是否超过了当前模型允许的最大上下文长度
promptTokens, err := utils.CalcTokens(prompt, session.Model.Value) promptTokens, err := utils.CalcTokens(prompt, session.Model.Value)
if promptTokens > session.Model.MaxContext { if promptTokens > session.Model.MaxContext {
utils.ReplyMessage(ws, "对话内容超出了当前模型允许的最大上下文长度!")
return nil return errors.New("对话内容超出了当前模型允许的最大上下文长度!")
} }
var req = types.ApiRequest{ var req = types.ApiRequest{
@@ -277,9 +279,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
break break
default: default:
utils.ReplyMessage(ws, "不支持的平台:"+session.Model.Platform+",请联系管理员!") return fmt.Errorf("不支持的平台:%s", session.Model.Platform)
utils.ReplyMessage(ws, ErrImg)
return nil
} }
// 加载聊天上下文 // 加载聊天上下文
@@ -393,10 +393,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
case types.QWen: case types.QWen:
return h.sendQWenMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws) return h.sendQWenMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws)
} }
utils.ReplyChunkMessage(ws, types.WsMessage{
Type: types.WsMiddle,
Content: fmt.Sprintf("Not supported platform: %s", session.Model.Platform),
})
return nil return nil
} }
@@ -469,11 +466,11 @@ func (h *ChatHandler) StopGenerate(c *gin.Context) {
func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, session *types.ChatSession, apiKey *model.ApiKey) (*http.Response, error) { func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, session *types.ChatSession, apiKey *model.ApiKey) (*http.Response, error) {
// if the chat model bind a KEY, use it directly // if the chat model bind a KEY, use it directly
if session.Model.KeyId > 0 { if session.Model.KeyId > 0 {
h.DB.Debug().Where("id", session.Model.KeyId).Find(apiKey) h.DB.Debug().Where("id", session.Model.KeyId).Where("enabled", true).Find(apiKey)
} }
// use the last unused key // use the last unused key
if apiKey.Id == 0 { if apiKey.Id == 0 {
h.DB.Debug().Where("platform = ?", session.Model.Platform).Where("type = ?", "chat").Where("enabled = ?", true).Order("last_used_at ASC").First(apiKey) h.DB.Debug().Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(apiKey)
} }
if apiKey.Id == 0 { if apiKey.Id == 0 {
return nil, errors.New("no available key, please import key") return nil, errors.New("no available key, please import key")

View File

@@ -1,11 +1,18 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types" "geekai/core/types"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
@@ -187,12 +194,20 @@ func (h *ChatHandler) Detail(c *gin.Context) {
return return
} }
// 填充角色名称
var role model.ChatRole
res = h.DB.Where("id", chatItem.RoleId).First(&role)
if res.Error != nil {
resp.ERROR(c, "Role not found")
return
}
var chatItemVo vo.ChatItem var chatItemVo vo.ChatItem
err := utils.CopyObject(chatItem, &chatItemVo) err := utils.CopyObject(chatItem, &chatItemVo)
if err != nil { if err != nil {
resp.ERROR(c, err.Error()) resp.ERROR(c, err.Error())
return return
} }
chatItemVo.RoleName = role.Name
resp.SUCCESS(c, chatItemVo) resp.SUCCESS(c, chatItemVo)
} }

View File

@@ -1,14 +1,22 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bufio" "bufio"
"chatplus/core/types"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"
"html/template" "html/template"
"io" "io"
@@ -38,14 +46,8 @@ func (h *ChatHandler) sendChatGLMMessage(
logger.Info("用户取消了请求:", prompt) logger.Info("用户取消了请求:", prompt)
return nil return nil
} else if strings.Contains(err.Error(), "no available key") { } else if strings.Contains(err.Error(), "no available key") {
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员") return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员")
return nil
} else {
logger.Error(err)
} }
utils.ReplyMessage(ws, ErrorMsg)
utils.ReplyMessage(ws, ErrImg)
return err return err
} else { } else {
defer response.Body.Close() defer response.Body.Close()

View File

@@ -1,14 +1,22 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bufio" "bufio"
"chatplus/core/types"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"html/template" "html/template"
"io" "io"
"strings" "strings"
@@ -68,12 +76,13 @@ func (h *ChatHandler) sendOpenAiMessage(
var responseBody = types.ApiResponse{} var responseBody = types.ApiResponse{}
err = json.Unmarshal([]byte(line[6:]), &responseBody) err = json.Unmarshal([]byte(line[6:]), &responseBody)
if err != nil || len(responseBody.Choices) == 0 { // 数据解析出错 if err != nil { // 数据解析出错
logger.Error(err, line) return errors.New(line)
utils.ReplyMessage(ws, ErrorMsg)
utils.ReplyMessage(ws, ErrImg)
break
} }
if len(responseBody.Choices) == 0 { // Fixed: 兼容 Azure API 第一个输出空行
continue
}
if responseBody.Choices[0].FinishReason == "stop" && len(contents) == 0 { if responseBody.Choices[0].FinishReason == "stop" && len(contents) == 0 {
utils.ReplyMessage(ws, "抱歉😔😔😔AI助手由于未知原因已经停止输出内容。") utils.ReplyMessage(ws, "抱歉😔😔😔AI助手由于未知原因已经停止输出内容。")
break break
@@ -115,11 +124,8 @@ func (h *ChatHandler) sendOpenAiMessage(
break break
} }
// 初始化 role // output stopped
if responseBody.Choices[0].Delta.Role != "" && message.Role == "" { if responseBody.Choices[0].FinishReason != "" {
message.Role = responseBody.Choices[0].Delta.Role
continue
} else if responseBody.Choices[0].FinishReason != "" {
break // 输出完成或者输出中断了 break // 输出完成或者输出中断了
} else { } else {
content := responseBody.Choices[0].Delta.Content content := responseBody.Choices[0].Delta.Content

View File

@@ -1,14 +1,22 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bufio" "bufio"
"chatplus/core/types"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"geekai/core/types"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"github.com/syndtr/goleveldb/leveldb/errors"
"html/template" "html/template"
"io" "io"
"strings" "strings"
@@ -52,14 +60,8 @@ func (h *ChatHandler) sendQWenMessage(
logger.Info("用户取消了请求:", prompt) logger.Info("用户取消了请求:", prompt)
return nil return nil
} else if strings.Contains(err.Error(), "no available key") { } else if strings.Contains(err.Error(), "no available key") {
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员") return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员")
return nil
} else {
logger.Error(err)
} }
utils.ReplyMessage(ws, ErrorMsg)
utils.ReplyMessage(ws, ErrImg)
return err return err
} else { } else {
defer response.Body.Close() defer response.Body.Close()

View File

@@ -1,16 +1,23 @@
package chatimpl package chatimpl
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"context" "context"
"crypto/hmac" "crypto/hmac"
"crypto/sha256" "crypto/sha256"
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"fmt" "fmt"
"geekai/core/types"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"gorm.io/gorm" "gorm.io/gorm"
"html/template" "html/template"
@@ -73,11 +80,11 @@ func (h *ChatHandler) sendXunFeiMessage(
var res *gorm.DB var res *gorm.DB
// use the bind key // use the bind key
if session.Model.KeyId > 0 { if session.Model.KeyId > 0 {
res = h.DB.Where("id", session.Model.KeyId).Find(&apiKey) res = h.DB.Where("id", session.Model.KeyId).Where("enabled", true).Find(&apiKey)
} }
// use the last unused key // use the last unused key
if res.Error != nil { if apiKey.Id == 0 {
res = h.DB.Where("platform = ?", session.Model.Platform).Where("type = ?", "chat").Where("enabled = ?", true).Order("last_used_at ASC").First(&apiKey) res = h.DB.Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(&apiKey)
} }
if res.Error != nil { if res.Error != nil {
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员") utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY请联系管理员")

View File

@@ -1,10 +1,17 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,14 +1,21 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/service/dalle" "geekai/service/dalle"
"chatplus/service/oss" "geekai/service/oss"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"net/http" "net/http"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@@ -85,7 +92,6 @@ func (h *DallJobHandler) preCheck(c *gin.Context) bool {
resp.NotAuth(c) resp.NotAuth(c)
return false return false
} }
if user.Power < h.App.SysConfig.DallPower { if user.Power < h.App.SysConfig.DallPower {
resp.ERROR(c, "当前用户剩余算力不足以完成本次绘画!") resp.ERROR(c, "当前用户剩余算力不足以完成本次绘画!")
return false return false

View File

@@ -1,13 +1,20 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/service/dalle" "geekai/service/dalle"
"chatplus/service/oss" "geekai/service/oss"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"errors" "errors"
"fmt" "fmt"
"strings" "strings"
@@ -181,6 +188,11 @@ func (h *FunctionHandler) Dall3(c *gin.Context) {
return return
} }
if user.Power < h.App.SysConfig.DallPower {
resp.ERROR(c, "创建 DALL-E 绘图任务失败,算力不足")
return
}
// create dall task // create dall task
prompt := utils.InterfaceToString(params["prompt"]) prompt := utils.InterfaceToString(params["prompt"])
job := model.DallJob{ job := model.DallJob{

View File

@@ -1,12 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
"strings" "strings"

View File

@@ -1,15 +1,22 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bufio" "bufio"
"bytes" "bytes"
"chatplus/core"
"chatplus/core/types"
"chatplus/store/model"
"chatplus/utils"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"geekai/core"
"geekai/core/types"
"geekai/store/model"
"geekai/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"gorm.io/gorm" "gorm.io/gorm"
@@ -141,7 +148,6 @@ func (h *MarkMapHandler) sendMessage(client *types.WsClient, prompt string, mode
contentType := response.Header.Get("Content-Type") contentType := response.Header.Get("Content-Type")
if strings.Contains(contentType, "text/event-stream") { if strings.Contains(contentType, "text/event-stream") {
// 循环读取 Chunk 消息 // 循环读取 Chunk 消息
var message = types.Message{}
scanner := bufio.NewScanner(response.Body) scanner := bufio.NewScanner(response.Body)
var isNew = true var isNew = true
for scanner.Scan() { for scanner.Scan() {
@@ -152,26 +158,26 @@ func (h *MarkMapHandler) sendMessage(client *types.WsClient, prompt string, mode
var responseBody = types.ApiResponse{} var responseBody = types.ApiResponse{}
err = json.Unmarshal([]byte(line[6:]), &responseBody) err = json.Unmarshal([]byte(line[6:]), &responseBody)
if err != nil || len(responseBody.Choices) == 0 { // 数据解析出错 if err != nil { // 数据解析出错
return fmt.Errorf("error with decode data: %v", err) return fmt.Errorf("error with decode data: %v", line)
} }
// 初始化 role if len(responseBody.Choices) == 0 { // Fixed: 兼容 Azure API 第一个输出空行
if responseBody.Choices[0].Delta.Role != "" && message.Role == "" {
message.Role = responseBody.Choices[0].Delta.Role
continue continue
} else if responseBody.Choices[0].FinishReason != "" {
break // 输出完成或者输出中断了
} else {
if isNew {
utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsStart})
isNew = false
}
utils.ReplyChunkMessage(client, types.WsMessage{
Type: types.WsMiddle,
Content: utils.InterfaceToString(responseBody.Choices[0].Delta.Content),
})
} }
if responseBody.Choices[0].FinishReason == "stop" {
break
}
if isNew {
utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsStart})
isNew = false
}
utils.ReplyChunkMessage(client, types.WsMessage{
Type: types.WsMiddle,
Content: utils.InterfaceToString(responseBody.Choices[0].Delta.Content),
})
} // end for } // end for
utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd}) utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd})
@@ -225,11 +231,13 @@ func (h *MarkMapHandler) doRequest(req types.ApiRequest, chatModel model.ChatMod
// if the chat model bind a KEY, use it directly // if the chat model bind a KEY, use it directly
var res *gorm.DB var res *gorm.DB
if chatModel.KeyId > 0 { if chatModel.KeyId > 0 {
res = h.DB.Where("id", chatModel.KeyId).Find(apiKey) res = h.DB.Where("id", chatModel.KeyId).Where("enabled", true).Find(apiKey)
} }
// use the last unused key // use the last unused key
if apiKey.Id == 0 { if apiKey.Id == 0 {
res = h.DB.Where("platform = ?", types.OpenAI).Where("type = ?", "chat").Where("enabled = ?", true).Order("last_used_at ASC").First(apiKey) res = h.DB.Where("platform", types.OpenAI).
Where("type", "chat").
Where("enabled", true).Order("last_used_at ASC").First(apiKey)
} }
if res.Error != nil { if res.Error != nil {
return nil, errors.New("no available key, please import key") return nil, errors.New("no available key, please import key")

View File

@@ -1,11 +1,18 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,15 +1,22 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/service" "geekai/service"
"chatplus/service/mj" "geekai/service/mj"
"chatplus/service/oss" "geekai/service/oss"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"net/http" "net/http"

View File

@@ -1,12 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,13 +1,20 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/service" "geekai/service"
"chatplus/service/payment" "geekai/service/payment"
"chatplus/store/model" "geekai/store/model"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"embed" "embed"
"encoding/base64" "encoding/base64"
"fmt" "fmt"

View File

@@ -1,12 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,11 +1,18 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,12 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,16 +1,23 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/service" "geekai/service"
"chatplus/service/oss" "geekai/service/oss"
"chatplus/service/sd" "geekai/service/sd"
"chatplus/store" "geekai/store"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"fmt" "fmt"
"net/http" "net/http"
"time" "time"

View File

@@ -1,12 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/core/types" "geekai/core/types"
"chatplus/service" "geekai/service"
"chatplus/service/sms" "geekai/service/sms"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"strings" "strings"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"

View File

@@ -1,8 +1,8 @@
package handler package handler
import ( import (
"chatplus/service" "geekai/service"
"chatplus/service/payment" "geekai/service/payment"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,12 +1,19 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core" "geekai/core"
"chatplus/service/oss" "geekai/service/oss"
"chatplus/store/model" "geekai/store/model"
"chatplus/store/vo" "geekai/store/vo"
"chatplus/utils" "geekai/utils"
"chatplus/utils/resp" "geekai/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"

View File

@@ -1,13 +1,20 @@
package handler package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core"
"chatplus/core/types"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"chatplus/utils/resp"
"fmt" "fmt"
"geekai/core"
"geekai/core/types"
"geekai/store/model"
"geekai/store/vo"
"geekai/utils"
"geekai/utils/resp"
"strings" "strings"
"time" "time"
@@ -30,7 +37,11 @@ func NewUserHandler(
db *gorm.DB, db *gorm.DB,
searcher *xdb.Searcher, searcher *xdb.Searcher,
client *redis.Client) *UserHandler { client *redis.Client) *UserHandler {
return &UserHandler{BaseHandler: BaseHandler{DB: db, App: app}, searcher: searcher, redis: client} return &UserHandler{
BaseHandler: BaseHandler{DB: db, App: app},
searcher: searcher,
redis: client,
}
} }
// Register user register // Register user register
@@ -55,7 +66,7 @@ func (h *UserHandler) Register(c *gin.Context) {
// 检查验证码 // 检查验证码
var key string var key string
if data.RegWay == "email" || data.RegWay == "mobile" || data.Code != "" { if data.RegWay == "email" || data.RegWay == "mobile" {
key = CodeStorePrefix + data.Username key = CodeStorePrefix + data.Username
code, err := h.redis.Get(c, key).Result() code, err := h.redis.Get(c, key).Result()
if err != nil || code != data.Code { if err != nil || code != data.Code {
@@ -216,18 +227,10 @@ func (h *UserHandler) Login(c *gin.Context) {
// Logout 注 销 // Logout 注 销
func (h *UserHandler) Logout(c *gin.Context) { func (h *UserHandler) Logout(c *gin.Context) {
sessionId := c.GetHeader(types.ChatTokenHeader)
key := h.GetUserKey(c) key := h.GetUserKey(c)
if _, err := h.redis.Del(c, key).Result(); err != nil { if _, err := h.redis.Del(c, key).Result(); err != nil {
logger.Error("error with delete session: ", err) logger.Error("error with delete session: ", err)
} }
// 删除 websocket 会话列表
h.App.ChatSession.Delete(sessionId)
// 关闭 socket 连接
client := h.App.ChatClients.Get(sessionId)
if client != nil {
client.Close()
}
resp.SUCCESS(c) resp.SUCCESS(c)
} }

View File

@@ -1,5 +1,12 @@
package logger package logger
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"go.uber.org/zap" "go.uber.org/zap"
"go.uber.org/zap/zapcore" "go.uber.org/zap/zapcore"

View File

@@ -1,23 +1,30 @@
package main package main
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core"
"chatplus/core/types"
"chatplus/handler"
"chatplus/handler/admin"
"chatplus/handler/chatimpl"
logger2 "chatplus/logger"
"chatplus/service"
"chatplus/service/dalle"
"chatplus/service/mj"
"chatplus/service/oss"
"chatplus/service/payment"
"chatplus/service/sd"
"chatplus/service/sms"
"chatplus/service/wx"
"chatplus/store"
"context" "context"
"embed" "embed"
"geekai/core"
"geekai/core/types"
"geekai/handler"
"geekai/handler/admin"
"geekai/handler/chatimpl"
logger2 "geekai/logger"
"geekai/service"
"geekai/service/dalle"
"geekai/service/mj"
"geekai/service/oss"
"geekai/service/payment"
"geekai/service/sd"
"geekai/service/sms"
"geekai/service/wx"
"geekai/store"
"io" "io"
"log" "log"
"os" "os"
@@ -178,7 +185,8 @@ func main() {
// MidJourney service pool // MidJourney service pool
fx.Provide(mj.NewServicePool), fx.Provide(mj.NewServicePool),
fx.Invoke(func(pool *mj.ServicePool) { fx.Invoke(func(pool *mj.ServicePool, config *types.AppConfig) {
pool.InitServices(config.MjPlusConfigs, config.MjProxyConfigs)
if pool.HasAvailableService() { if pool.HasAvailableService() {
pool.DownloadImages() pool.DownloadImages()
pool.CheckTaskNotify() pool.CheckTaskNotify()
@@ -188,7 +196,8 @@ func main() {
// Stable Diffusion 机器人 // Stable Diffusion 机器人
fx.Provide(sd.NewServicePool), fx.Provide(sd.NewServicePool),
fx.Invoke(func(pool *sd.ServicePool) { fx.Invoke(func(pool *sd.ServicePool, config *types.AppConfig) {
pool.InitServices(config.SdConfigs)
if pool.HasAvailableService() { if pool.HasAvailableService() {
pool.CheckTaskNotify() pool.CheckTaskNotify()
pool.CheckTaskStatus() pool.CheckTaskStatus()
@@ -321,7 +330,7 @@ func main() {
group.POST("save", h.Save) group.POST("save", h.Save)
group.POST("sort", h.Sort) group.POST("sort", h.Sort)
group.POST("set", h.Set) group.POST("set", h.Set)
group.POST("remove", h.Remove) group.GET("remove", h.Remove)
}), }),
fx.Invoke(func(s *core.AppServer, h *admin.RewardHandler) { fx.Invoke(func(s *core.AppServer, h *admin.RewardHandler) {
group := s.Engine.Group("/api/admin/reward/") group := s.Engine.Group("/api/admin/reward/")

View File

@@ -1,9 +1,16 @@
package service package service
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"errors" "errors"
"fmt" "fmt"
"geekai/core/types"
"github.com/imroc/req/v3" "github.com/imroc/req/v3"
"time" "time"
) )

View File

@@ -1,16 +1,23 @@
package dalle package dalle
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
logger2 "chatplus/logger"
"chatplus/service"
"chatplus/service/oss"
"chatplus/service/sd"
"chatplus/store"
"chatplus/store/model"
"chatplus/utils"
"errors" "errors"
"fmt" "fmt"
"geekai/core/types"
logger2 "geekai/logger"
"geekai/service"
"geekai/service/oss"
"geekai/service/sd"
"geekai/store"
"geekai/store/model"
"geekai/utils"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"
"time" "time"
@@ -254,7 +261,7 @@ func (s *Service) downloadImage(jobId uint, userId int, orgURL string) (string,
if res.Error != nil { if res.Error != nil {
return "", err return "", err
} }
s.notifyQueue.RPush(sd.NotifyMessage{UserId: userId, JobId: int(jobId), Message: sd.Failed}) s.notifyQueue.RPush(sd.NotifyMessage{UserId: userId, JobId: int(jobId), Message: sd.Finished})
return imgURL, nil return imgURL, nil
} }
@@ -263,7 +270,7 @@ func (s *Service) CheckTaskStatus() {
go func() { go func() {
logger.Info("Running Stable-Diffusion task status checking ...") logger.Info("Running Stable-Diffusion task status checking ...")
for { for {
var jobs []model.SdJob var jobs []model.DallJob
res := s.db.Where("progress < ?", 100).Find(&jobs) res := s.db.Where("progress < ?", 100).Find(&jobs)
if res.Error != nil { if res.Error != nil {
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
@@ -287,7 +294,7 @@ func (s *Service) CheckTaskStatus() {
Balance: user.Power + job.Power, Balance: user.Power + job.Power,
Mark: types.PowerAdd, Mark: types.PowerAdd,
Model: "dall-e-3", Model: "dall-e-3",
Remark: fmt.Sprintf("任务失败退回算力。任务ID%s", job.TaskId), Remark: fmt.Sprintf("任务失败退回算力。任务ID%d", job.Id),
CreatedAt: time.Now(), CreatedAt: time.Now(),
}) })
} }

View File

@@ -1,6 +1,13 @@
package mj package mj
import "chatplus/core/types" // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import "geekai/core/types"
type Client interface { type Client interface {
Imagine(task types.MjTask) (ImageRes, error) Imagine(task types.MjTask) (ImageRes, error)

View File

@@ -1,11 +1,18 @@
package mj package mj
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/utils"
"encoding/base64" "encoding/base64"
"errors" "errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"github.com/imroc/req/v3" "github.com/imroc/req/v3"
"io" "io"
"time" "time"

View File

@@ -1,14 +1,22 @@
package mj package mj
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
logger2 "chatplus/logger"
"chatplus/service/oss"
"chatplus/service/sd"
"chatplus/store"
"chatplus/store/model"
"fmt" "fmt"
"geekai/core/types"
logger2 "geekai/logger"
"geekai/service/oss"
"geekai/service/sd"
"geekai/store"
"geekai/store/model"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"
"strings"
"time" "time"
"gorm.io/gorm" "gorm.io/gorm"
@@ -26,38 +34,10 @@ type ServicePool struct {
var logger = logger2.GetLogger() var logger = logger2.GetLogger()
func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig) *ServicePool { func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager) *ServicePool {
services := make([]*Service, 0) services := make([]*Service, 0)
taskQueue := store.NewRedisQueue("MidJourney_Task_Queue", redisCli) taskQueue := store.NewRedisQueue("MidJourney_Task_Queue", redisCli)
notifyQueue := store.NewRedisQueue("MidJourney_Notify_Queue", redisCli) notifyQueue := store.NewRedisQueue("MidJourney_Notify_Queue", redisCli)
for k, config := range appConfig.MjPlusConfigs {
if config.Enabled == false {
continue
}
cli := NewPlusClient(config)
name := fmt.Sprintf("mj-plus-service-%d", k)
plusService := NewService(name, taskQueue, notifyQueue, db, cli)
go func() {
plusService.Run()
}()
services = append(services, plusService)
}
for k, config := range appConfig.MjProxyConfigs {
if config.Enabled == false {
continue
}
cli := NewProxyClient(config)
name := fmt.Sprintf("mj-proxy-service-%d", k)
proxyService := NewService(name, taskQueue, notifyQueue, db, cli)
go func() {
proxyService.Run()
}()
services = append(services, proxyService)
}
return &ServicePool{ return &ServicePool{
taskQueue: taskQueue, taskQueue: taskQueue,
notifyQueue: notifyQueue, notifyQueue: notifyQueue,
@@ -68,6 +48,42 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa
} }
} }
func (p *ServicePool) InitServices(plusConfigs []types.MjPlusConfig, proxyConfigs []types.MjProxyConfig) {
// stop old service
for _, s := range p.services {
s.Stop()
}
p.services = make([]*Service, 0)
for k, config := range plusConfigs {
if config.Enabled == false {
continue
}
cli := NewPlusClient(config)
name := fmt.Sprintf("mj-plus-service-%d", k)
plusService := NewService(name, p.taskQueue, p.notifyQueue, p.db, cli)
go func() {
plusService.Run()
}()
p.services = append(p.services, plusService)
}
// for mid-journey proxy
for k, config := range proxyConfigs {
if config.Enabled == false {
continue
}
cli := NewProxyClient(config)
name := fmt.Sprintf("mj-proxy-service-%d", k)
proxyService := NewService(name, p.taskQueue, p.notifyQueue, p.db, cli)
go func() {
proxyService.Run()
}()
p.services = append(p.services, proxyService)
}
}
func (p *ServicePool) CheckTaskNotify() { func (p *ServicePool) CheckTaskNotify() {
go func() { go func() {
for { for {
@@ -104,17 +120,23 @@ func (p *ServicePool) DownloadImages() {
} }
logger.Infof("try to download image: %s", v.OrgURL) logger.Infof("try to download image: %s", v.OrgURL)
var imgURL string mjService := p.getService(v.ChannelId)
var err error if mjService == nil {
if servicePlus := p.getService(v.ChannelId); servicePlus != nil { logger.Errorf("Invalid task: %+v", v)
task, _ := servicePlus.Client.QueryTask(v.TaskId) continue
if len(task.Buttons) > 0 {
v.Hash = GetImageHash(task.Buttons[0].CustomId)
}
imgURL, err = p.uploaderManager.GetUploadHandler().PutImg(v.OrgURL, false)
} else {
imgURL, err = p.uploaderManager.GetUploadHandler().PutImg(v.OrgURL, true)
} }
task, _ := mjService.Client.QueryTask(v.TaskId)
if len(task.Buttons) > 0 {
v.Hash = GetImageHash(task.Buttons[0].CustomId)
}
// 如果是返回的是 discord 图片地址,则使用代理下载
proxy := false
if strings.HasPrefix(v.OrgURL, "https://cdn.discordapp.com") {
proxy = true
}
imgURL, err := p.uploaderManager.GetUploadHandler().PutImg(v.OrgURL, proxy)
if err != nil { if err != nil {
logger.Errorf("error with download image %s, %v", v.OrgURL, err) logger.Errorf("error with download image %s, %v", v.OrgURL, err)
continue continue

View File

@@ -1,11 +1,18 @@
package mj package mj
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/utils"
"encoding/base64" "encoding/base64"
"errors" "errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"github.com/imroc/req/v3" "github.com/imroc/req/v3"
"io" "io"
) )

View File

@@ -1,13 +1,20 @@
package mj package mj
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/service"
"chatplus/service/sd"
"chatplus/store"
"chatplus/store/model"
"chatplus/utils"
"fmt" "fmt"
"geekai/core/types"
"geekai/service"
"geekai/service/sd"
"geekai/store"
"geekai/store/model"
"geekai/utils"
"strings" "strings"
"time" "time"
@@ -21,6 +28,7 @@ type Service struct {
taskQueue *store.RedisQueue taskQueue *store.RedisQueue
notifyQueue *store.RedisQueue notifyQueue *store.RedisQueue
db *gorm.DB db *gorm.DB
running bool
} }
func NewService(name string, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, cli Client) *Service { func NewService(name string, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, cli Client) *Service {
@@ -30,12 +38,13 @@ func NewService(name string, taskQueue *store.RedisQueue, notifyQueue *store.Red
taskQueue: taskQueue, taskQueue: taskQueue,
notifyQueue: notifyQueue, notifyQueue: notifyQueue,
Client: cli, Client: cli,
running: true,
} }
} }
func (s *Service) Run() { func (s *Service) Run() {
logger.Infof("Starting MidJourney job consumer for %s", s.Name) logger.Infof("Starting MidJourney job consumer for %s", s.Name)
for { for s.running {
var task types.MjTask var task types.MjTask
err := s.taskQueue.LPop(&task) err := s.taskQueue.LPop(&task)
if err != nil { if err != nil {
@@ -118,6 +127,10 @@ func (s *Service) Run() {
} }
} }
func (s *Service) Stop() {
s.running = false
}
type CBReq struct { type CBReq struct {
Id string `json:"id"` Id string `json:"id"`
Action string `json:"action"` Action string `json:"action"`

View File

@@ -1,11 +1,18 @@
package oss package oss
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bytes" "bytes"
"chatplus/core/types"
"chatplus/utils"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"net/url" "net/url"
"path/filepath" "path/filepath"
"strings" "strings"

View File

@@ -1,10 +1,17 @@
package oss package oss
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/utils"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"net/url" "net/url"
"os" "os"

View File

@@ -1,11 +1,18 @@
package oss package oss
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/utils"
"context" "context"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"net/url" "net/url"
"path/filepath" "path/filepath"
"strings" "strings"

View File

@@ -1,12 +1,19 @@
package oss package oss
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bytes" "bytes"
"chatplus/core/types"
"chatplus/utils"
"context" "context"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"net/url" "net/url"
"path/filepath" "path/filepath"
"strings" "strings"

View File

@@ -1,5 +1,12 @@
package oss package oss
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import "github.com/gin-gonic/gin" import "github.com/gin-gonic/gin"
const Local = "LOCAL" const Local = "LOCAL"

View File

@@ -1,7 +1,14 @@
package oss package oss
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types" "geekai/core/types"
"strings" "strings"
) )

View File

@@ -1,9 +1,16 @@
package payment package payment
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
logger2 "chatplus/logger"
"fmt" "fmt"
"geekai/core/types"
logger2 "geekai/logger"
"github.com/smartwalle/alipay/v3" "github.com/smartwalle/alipay/v3"
"log" "log"
"net/url" "net/url"

View File

@@ -1,12 +1,19 @@
package payment package payment
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/utils"
"crypto/md5" "crypto/md5"
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"io" "io"
"net/http" "net/http"
"net/url" "net/url"

View File

@@ -1,12 +1,19 @@
package payment package payment
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/utils"
"crypto/md5" "crypto/md5"
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"io" "io"
"net/http" "net/http"
"net/url" "net/url"

View File

@@ -1,11 +1,18 @@
package sd package sd
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/service/oss"
"chatplus/store"
"chatplus/store/model"
"fmt" "fmt"
"geekai/core/types"
"geekai/service/oss"
"geekai/store"
"geekai/store/model"
"time" "time"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"
@@ -18,28 +25,14 @@ type ServicePool struct {
notifyQueue *store.RedisQueue notifyQueue *store.RedisQueue
db *gorm.DB db *gorm.DB
Clients *types.LMap[uint, *types.WsClient] // UserId => Client Clients *types.LMap[uint, *types.WsClient] // UserId => Client
uploader *oss.UploaderManager
levelDB *store.LevelDB
} }
func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig, levelDB *store.LevelDB) *ServicePool { func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, levelDB *store.LevelDB) *ServicePool {
services := make([]*Service, 0) services := make([]*Service, 0)
taskQueue := store.NewRedisQueue("StableDiffusion_Task_Queue", redisCli) taskQueue := store.NewRedisQueue("StableDiffusion_Task_Queue", redisCli)
notifyQueue := store.NewRedisQueue("StableDiffusion_Queue", redisCli) notifyQueue := store.NewRedisQueue("StableDiffusion_Queue", redisCli)
// create mj client and service
for _, config := range appConfig.SdConfigs {
if config.Enabled == false {
continue
}
// create sd service
name := fmt.Sprintf("StableDifffusion Service-%s", config.Model)
service := NewService(name, config, taskQueue, notifyQueue, db, manager, levelDB)
// run sd service
go func() {
service.Run()
}()
services = append(services, service)
}
return &ServicePool{ return &ServicePool{
taskQueue: taskQueue, taskQueue: taskQueue,
@@ -47,6 +40,32 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa
services: services, services: services,
db: db, db: db,
Clients: types.NewLMap[uint, *types.WsClient](), Clients: types.NewLMap[uint, *types.WsClient](),
uploader: manager,
levelDB: levelDB,
}
}
func (p *ServicePool) InitServices(configs []types.StableDiffusionConfig) {
// stop old service
for _, s := range p.services {
s.Stop()
}
p.services = make([]*Service, 0)
for k, config := range configs {
if config.Enabled == false {
continue
}
// create sd service
name := fmt.Sprintf(" sd-service-%d", k)
service := NewService(name, config, p.taskQueue, p.notifyQueue, p.db, p.uploader, p.levelDB)
// run sd service
go func() {
service.Run()
}()
p.services = append(p.services, service)
} }
} }

View File

@@ -1,13 +1,20 @@
package sd package sd
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/service"
"chatplus/service/oss"
"chatplus/store"
"chatplus/store/model"
"chatplus/utils"
"fmt" "fmt"
"geekai/core/types"
"geekai/service"
"geekai/service/oss"
"geekai/store"
"geekai/store/model"
"geekai/utils"
"strings" "strings"
"time" "time"
@@ -26,6 +33,7 @@ type Service struct {
uploadManager *oss.UploaderManager uploadManager *oss.UploaderManager
name string // service name name string // service name
leveldb *store.LevelDB leveldb *store.LevelDB
running bool // 运行状态
} }
func NewService(name string, config types.StableDiffusionConfig, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, manager *oss.UploaderManager, levelDB *store.LevelDB) *Service { func NewService(name string, config types.StableDiffusionConfig, taskQueue *store.RedisQueue, notifyQueue *store.RedisQueue, db *gorm.DB, manager *oss.UploaderManager, levelDB *store.LevelDB) *Service {
@@ -39,11 +47,13 @@ func NewService(name string, config types.StableDiffusionConfig, taskQueue *stor
db: db, db: db,
leveldb: levelDB, leveldb: levelDB,
uploadManager: manager, uploadManager: manager,
running: true,
} }
} }
func (s *Service) Run() { func (s *Service) Run() {
for { logger.Infof("Starting Stable-Diffusion job consumer for %s", s.name)
for s.running {
var task types.SdTask var task types.SdTask
err := s.taskQueue.LPop(&task) err := s.taskQueue.LPop(&task)
if err != nil { if err != nil {
@@ -87,6 +97,10 @@ func (s *Service) Run() {
} }
} }
func (s *Service) Stop() {
s.running = false
}
// Txt2ImgReq 文生图请求实体 // Txt2ImgReq 文生图请求实体
type Txt2ImgReq struct { type Txt2ImgReq struct {
Prompt string `json:"prompt"` Prompt string `json:"prompt"`
@@ -97,6 +111,7 @@ type Txt2ImgReq struct {
Width int `json:"width"` Width int `json:"width"`
Height int `json:"height"` Height int `json:"height"`
SamplerName string `json:"sampler_name"` SamplerName string `json:"sampler_name"`
Scheduler string `json:"scheduler"`
EnableHr bool `json:"enable_hr,omitempty"` EnableHr bool `json:"enable_hr,omitempty"`
HrScale int `json:"hr_scale,omitempty"` HrScale int `json:"hr_scale,omitempty"`
HrUpscaler string `json:"hr_upscaler,omitempty"` HrUpscaler string `json:"hr_upscaler,omitempty"`
@@ -130,6 +145,7 @@ func (s *Service) Txt2Img(task types.SdTask) error {
Width: task.Params.Width, Width: task.Params.Width,
Height: task.Params.Height, Height: task.Params.Height,
SamplerName: task.Params.Sampler, SamplerName: task.Params.Sampler,
Scheduler: task.Params.Scheduler,
ForceTaskId: task.Params.TaskId, ForceTaskId: task.Params.TaskId,
} }
if task.Params.Seed > 0 { if task.Params.Seed > 0 {

View File

@@ -1,6 +1,13 @@
package sd package sd
import logger2 "chatplus/logger" // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import logger2 "geekai/logger"
var logger = logger2.GetLogger() var logger = logger2.GetLogger()

View File

@@ -1,8 +1,15 @@
package sms package sms
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"fmt" "fmt"
"geekai/core/types"
"github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
) )

View File

@@ -1,9 +1,16 @@
package sms package sms
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"chatplus/utils"
"fmt" "fmt"
"geekai/core/types"
"geekai/utils"
"io" "io"
"net/http" "net/http"
"net/url" "net/url"

View File

@@ -1,5 +1,12 @@
package sms package sms
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
const Ali = "ALI" const Ali = "ALI"
const Bao = "BAO" const Bao = "BAO"

View File

@@ -1,8 +1,15 @@
package sms package sms
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types" "geekai/core/types"
logger2 "chatplus/logger" logger2 "geekai/logger"
"strings" "strings"
) )

View File

@@ -1,10 +1,17 @@
package service package service
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"bytes" "bytes"
"chatplus/core/types"
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"geekai/core/types"
"mime" "mime"
"net/smtp" "net/smtp"
"net/textproto" "net/textproto"

View File

@@ -1,5 +1,12 @@
package service package service
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"fmt" "fmt"
"sync" "sync"

View File

@@ -1,8 +1,15 @@
package wx package wx
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
logger2 "chatplus/logger" logger2 "geekai/logger"
"chatplus/store/model" "geekai/store/model"
"github.com/eatmoreapple/openwechat" "github.com/eatmoreapple/openwechat"
"github.com/skip2/go-qrcode" "github.com/skip2/go-qrcode"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,5 +1,12 @@
package wx package wx
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"encoding/xml" "encoding/xml"
"net/url" "net/url"

View File

@@ -1,12 +1,19 @@
package service package service
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
logger2 "chatplus/logger"
"chatplus/store/model"
"chatplus/utils"
"context" "context"
"fmt" "fmt"
"geekai/core/types"
logger2 "geekai/logger"
"geekai/store/model"
"geekai/utils"
"github.com/xxl-job/xxl-job-executor-go" "github.com/xxl-job/xxl-job-executor-go"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"

View File

@@ -1,5 +1,12 @@
package store package store
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"encoding/json" "encoding/json"

View File

@@ -1,7 +1,7 @@
package model package model
import ( import (
"chatplus/core/types" "geekai/core/types"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,7 +1,7 @@
package model package model
import ( import (
"chatplus/core/types" "geekai/core/types"
"time" "time"
) )

View File

@@ -1,7 +1,14 @@
package store package store
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types" "geekai/core/types"
"gorm.io/driver/mysql" "gorm.io/driver/mysql"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/logger" "gorm.io/gorm/logger"

View File

@@ -1,8 +1,15 @@
package store package store
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// * Copyright 2023 The Geek-AI Authors. All rights reserved.
// * Use of this source code is governed by a Apache-2.0 license
// * that can be found in the LICENSE file.
// * @Author yangjian102621@163.com
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"chatplus/core/types"
"context" "context"
"geekai/core/types"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"
) )

Some files were not shown because too many files have changed in this diff Show More