mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-11-11 11:43:43 +08:00
Compare commits
73 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f820b9dc1 | ||
|
|
4a99be2f15 | ||
|
|
27c816cf3b | ||
|
|
0d81776212 | ||
|
|
cccab31c0f | ||
|
|
4ddf3bf2bf | ||
|
|
3d37a3d367 | ||
|
|
73d8236697 | ||
|
|
114d0088dc | ||
|
|
43b6665370 | ||
|
|
5fb9f84182 | ||
|
|
e35c34ad9a | ||
|
|
1a4d798f8b | ||
|
|
afb91a7023 | ||
|
|
dc4c1f7877 | ||
|
|
bbc8fe2b40 | ||
|
|
57c932f07c | ||
|
|
8b3b0139b0 | ||
|
|
31828a3336 | ||
|
|
9a797bb4a5 | ||
|
|
b0c9ffc5a6 | ||
|
|
f527cc5b98 | ||
|
|
debe8dc209 | ||
|
|
142cd553a3 | ||
|
|
1232c3cd9c | ||
|
|
3ac04a3938 | ||
|
|
b7abc42209 | ||
|
|
a48179ce0e | ||
|
|
e589f25a05 | ||
|
|
cc1a3ce343 | ||
|
|
7bb76d581c | ||
|
|
0d733c0be0 | ||
|
|
8b40ac5b5c | ||
|
|
24479814e9 | ||
|
|
99df028237 | ||
|
|
b354b88876 | ||
|
|
5e0be4d10e | ||
|
|
468b48151f | ||
|
|
fa5c036041 | ||
|
|
0fdc588167 | ||
|
|
bd4b0c4d65 | ||
|
|
9d28e62142 | ||
|
|
61b2dbc9f1 | ||
|
|
be3245666e | ||
|
|
dacdd6fe74 | ||
|
|
6807f7e88a | ||
|
|
087f5ab2d1 | ||
|
|
47c5a0387b | ||
|
|
f9da18ad52 | ||
|
|
5c9025ca22 | ||
|
|
d02cb573fd | ||
|
|
caa538a1d0 | ||
|
|
b584b4bfb6 | ||
|
|
336a7d5b56 | ||
|
|
a0f464830f | ||
|
|
96ead65774 | ||
|
|
7ad41927aa | ||
|
|
8a9f386d8f | ||
|
|
9a1368ef17 | ||
|
|
31b02b97d3 | ||
|
|
42da38c5c3 | ||
|
|
0a01b55713 | ||
|
|
3b292c2a12 | ||
|
|
db0ba0d9a0 | ||
|
|
3a23ff6b42 | ||
|
|
1e9c5adb0a | ||
|
|
abab76ccc6 | ||
|
|
6efd92806f | ||
|
|
cfe333e89f | ||
|
|
5230f90540 | ||
|
|
803db4e895 | ||
|
|
7cee9f2ebb | ||
|
|
8be9a21efd |
2
.github/ISSUE_TEMPLATE/1.bug.yml
vendored
2
.github/ISSUE_TEMPLATE/1.bug.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
name: Bug 报告 🐛
|
name: Bug 报告 🐛
|
||||||
description: 为 chatgpt-plus 提交错误报告
|
description: 为 geekai 提交错误报告
|
||||||
labels: ['Bug']
|
labels: ['Bug']
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/2.feature.yml
vendored
2
.github/ISSUE_TEMPLATE/2.feature.yml
vendored
@@ -1,5 +1,5 @@
|
|||||||
name: 功能优化 🚀
|
name: 功能优化 🚀
|
||||||
description: 为 chatgpt-plus 提交优化建议
|
description: 为 geekai 提交优化建议
|
||||||
labels: ['feature']
|
labels: ['feature']
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
|
|||||||
43
CHANGELOG.md
43
CHANGELOG.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
41
README.md
41
README.md
@@ -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。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
另外,如果您目前还没有 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。
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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 = "极客学长"
|
||||||
|
|||||||
@@ -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" ||
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"` // 兼容百度文心一言
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 默认反向提示词
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"` // 启用高清修复
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
module chatplus
|
module geekai
|
||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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,请联系管理员!")
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
45
api/main.go
45
api/main.go
@@ -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/")
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"chatplus/core/types"
|
"geekai/core/types"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"chatplus/core/types"
|
"geekai/core/types"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user