Skip to content

Commit 5f820b9

Browse files
merge v4.0.6
2 parents 4a99be2 + 114d008 commit 5f820b9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+4845
-1136
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# 更新日志
22

3+
## v4.0.6
4+
5+
* Bug修复:修复PC端画廊页面的瀑布流组件样式错乱问题
6+
* 功能新增:给思维导图增加 ToolBar,实现思维导图的放大缩小和定位
7+
* Bug修复:修复思维导图不扣费的Bug
8+
* Bug修复:修复管理后台角色删除失败的Bug
9+
* Bug修复:兼容最新版秋叶SD懒人包的 SD API,新增 scheduler 参数
10+
* 功能优化:支持在管理后台配置 AI 绘图相关配置,包括 SD, MJ-PLUS, MJ-PROXY
11+
* Bug修复:修复注册用户提示注册人数达到上限的 Bug
12+
* 功能优化:将MJ,SD,Dall绘画页面的任务列表全改成瀑布流组件
13+
314
## v4.0.5
415

516
* 功能优化:已授权系统在后台显示授权信息
@@ -38,6 +49,7 @@
3849
* 功能新增:支持管理后台 Logo 修改
3950

4051
## 4.0.2
52+
4153
* 功能新增:支持前端菜单可以配置
4254
* 功能优化:在登录和注册界面标题显示软件版本号
4355
* 功能优化:MJ 绘画支持 --sref 和 --cref 图片一致性参数

api/core/types/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,6 @@ type SystemConfig struct {
175175

176176
EnableContext bool `json:"enable_context,omitempty"`
177177
ContextDeep int `json:"context_deep,omitempty"`
178+
179+
SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词
178180
}

api/core/types/task.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ type SdTaskParams struct {
5555
NegPrompt string `json:"neg_prompt"` // 反向提示词
5656
Steps int `json:"steps"` // 迭代步数,默认20
5757
Sampler string `json:"sampler"` // 采样器
58-
FaceFix bool `json:"face_fix"` // 面部修复
59-
CfgScale float32 `json:"cfg_scale"` //引导系数,默认 7
60-
Seed int64 `json:"seed"` // 随机数种子
58+
Scheduler string `json:"scheduler"`
59+
FaceFix bool `json:"face_fix"` // 面部修复
60+
CfgScale float32 `json:"cfg_scale"` //引导系数,默认 7
61+
Seed int64 `json:"seed"` // 随机数种子
6162
Height int `json:"height"`
6263
Width int `json:"width"`
6364
HdFix bool `json:"hd_fix"` // 启用高清修复

api/handler/admin/chat_model_handler.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"geekai/store/vo"
1616
"geekai/utils"
1717
"geekai/utils/resp"
18+
1819
"github.com/gin-gonic/gin"
1920
"gorm.io/gorm"
2021
)

api/handler/admin/chat_role_handler.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,18 +144,13 @@ func (h *ChatRoleHandler) Set(c *gin.Context) {
144144
}
145145

146146
func (h *ChatRoleHandler) Remove(c *gin.Context) {
147-
var data struct {
148-
Id uint
149-
}
150-
if err := c.ShouldBindJSON(&data); err != nil {
151-
resp.ERROR(c, types.InvalidArgs)
152-
return
153-
}
154-
if data.Id <= 0 {
147+
id := h.GetInt(c, "id", 0)
148+
149+
if id <= 0 {
155150
resp.ERROR(c, types.InvalidArgs)
156151
return
157152
}
158-
res := h.DB.Where("id = ?", data.Id).Delete(&model.ChatRole{})
153+
res := h.DB.Where("id", id).Delete(&model.ChatRole{})
159154
if res.Error != nil {
160155
resp.ERROR(c, "删除失败!")
161156
return

api/handler/chat_model_handler.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"geekai/store/vo"
1414
"geekai/utils"
1515
"geekai/utils/resp"
16+
1617
"github.com/gin-gonic/gin"
1718
"gorm.io/gorm"
1819
)
@@ -32,7 +33,7 @@ func (h *ChatModelHandler) List(c *gin.Context) {
3233
var res *gorm.DB
3334
// 如果用户没有登录,则加载所有开放模型
3435
if !h.IsLogin(c) {
35-
res = h.DB.Where("enabled = ?", true).Where("open =?", true).Order("sort_num ASC").Find(&items)
36+
res = h.DB.Where("enabled", true).Where("open", true).Order("sort_num ASC").Find(&items)
3637
} else {
3738
user, _ := h.GetLoginUser(c)
3839
var models []int
@@ -43,7 +44,7 @@ func (h *ChatModelHandler) List(c *gin.Context) {
4344
}
4445
// 查询用户有权限访问的模型以及所有开放的模型
4546
res = h.DB.Where("enabled = ?", true).Where(
46-
h.DB.Where("id IN ?", models).Or("open =?", true),
47+
h.DB.Where("id IN ?", models).Or("open", true),
4748
).Order("sort_num ASC").Find(&items)
4849
}
4950

api/handler/chatimpl/azure_handler.go

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ package chatimpl
99

1010
import (
1111
"bufio"
12+
"context"
13+
"encoding/json"
14+
"errors"
15+
"fmt"
1216
"geekai/core/types"
1317
"geekai/store/model"
1418
"geekai/store/vo"
1519
"geekai/utils"
16-
"context"
17-
"encoding/json"
18-
"fmt"
1920
"html/template"
2021
"io"
2122
"strings"
@@ -44,14 +45,9 @@ func (h *ChatHandler) sendAzureMessage(
4445
logger.Info("用户取消了请求:", prompt)
4546
return nil
4647
} else if strings.Contains(err.Error(), "no available key") {
47-
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
48-
return nil
49-
} else {
50-
logger.Error(err)
48+
return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
5149
}
5250

53-
utils.ReplyMessage(ws, ErrorMsg)
54-
utils.ReplyMessage(ws, ErrImg)
5551
return err
5652
} else {
5753
defer response.Body.Close()
@@ -73,10 +69,7 @@ func (h *ChatHandler) sendAzureMessage(
7369
var responseBody = types.ApiResponse{}
7470
err = json.Unmarshal([]byte(line[6:]), &responseBody)
7571
if err != nil { // 数据解析出错
76-
logger.Error(err, line)
77-
utils.ReplyMessage(ws, ErrorMsg)
78-
utils.ReplyMessage(ws, ErrImg)
79-
break
72+
return errors.New(line)
8073
}
8174

8275
if len(responseBody.Choices) == 0 {
@@ -203,11 +196,10 @@ func (h *ChatHandler) sendAzureMessage(
203196

204197
if strings.Contains(res.Error.Message, "maximum context length") {
205198
logger.Error(res.Error.Message)
206-
utils.ReplyMessage(ws, "当前会话上下文长度超出限制,已为您清空会话上下文!")
207199
h.App.ChatContexts.Delete(session.ChatId)
208200
return h.sendMessage(ctx, session, role, prompt, ws)
209201
} else {
210-
utils.ReplyMessage(ws, "请求 Azure API 失败:"+res.Error.Message)
202+
return fmt.Errorf("请求 Azure API 失败:%v", res.Error)
211203
}
212204
}
213205

api/handler/chatimpl/baidu_handler.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ package chatimpl
99

1010
import (
1111
"bufio"
12+
"context"
13+
"encoding/json"
14+
"errors"
15+
"fmt"
1216
"geekai/core/types"
1317
"geekai/store/model"
1418
"geekai/store/vo"
1519
"geekai/utils"
16-
"context"
17-
"encoding/json"
18-
"fmt"
1920
"html/template"
2021
"io"
2122
"net/http"
@@ -61,14 +62,8 @@ func (h *ChatHandler) sendBaiduMessage(
6162
logger.Info("用户取消了请求:", prompt)
6263
return nil
6364
} else if strings.Contains(err.Error(), "no available key") {
64-
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
65-
return nil
66-
} else {
67-
logger.Error(err)
65+
return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
6866
}
69-
70-
utils.ReplyMessage(ws, ErrorMsg)
71-
utils.ReplyMessage(ws, ErrImg)
7267
return err
7368
} else {
7469
defer response.Body.Close()

api/handler/chatimpl/chat_handler.go

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) {
173173
err = h.sendMessage(ctx, session, chatRole, utils.InterfaceToString(message.Content), client)
174174
if err != nil {
175175
logger.Error(err)
176-
utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd})
176+
utils.ReplyMessage(client, err.Error())
177177
} else {
178178
utils.ReplyChunkMessage(client, types.WsMessage{Type: types.WsEnd})
179179
logger.Infof("回答完毕: %v", message.Content)
@@ -195,8 +195,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
195195
var user model.User
196196
res := h.DB.Model(&model.User{}).First(&user, session.UserId)
197197
if res.Error != nil {
198-
utils.ReplyMessage(ws, "未授权用户,您正在进行非法操作!")
199-
return res.Error
198+
return errors.New("未授权用户,您正在进行非法操作!")
200199
}
201200
var userVo vo.User
202201
err := utils.CopyObject(user, &userVo)
@@ -206,28 +205,22 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
206205
}
207206

208207
if userVo.Status == false {
209-
utils.ReplyMessage(ws, "您的账号已经被禁用,如果疑问,请联系管理员!")
210-
utils.ReplyMessage(ws, ErrImg)
211-
return nil
208+
return errors.New("您的账号已经被禁用,如果疑问,请联系管理员!")
212209
}
213210

214211
if userVo.Power < session.Model.Power {
215-
utils.ReplyMessage(ws, fmt.Sprintf("您当前剩余算力(%d)已不足以支付当前模型的单次对话需要消耗的算力(%d)!", userVo.Power, session.Model.Power))
216-
utils.ReplyMessage(ws, ErrImg)
217-
return nil
212+
return fmt.Errorf("您当前剩余算力(%d)已不足以支付当前模型的单次对话需要消耗的算力(%d)!", userVo.Power, session.Model.Power)
218213
}
219214

220215
if userVo.ExpiredTime > 0 && userVo.ExpiredTime <= time.Now().Unix() {
221-
utils.ReplyMessage(ws, "您的账号已经过期,请联系管理员!")
222-
utils.ReplyMessage(ws, ErrImg)
223-
return nil
216+
return errors.New("您的账号已经过期,请联系管理员!")
224217
}
225218

226219
// 检查 prompt 长度是否超过了当前模型允许的最大上下文长度
227220
promptTokens, err := utils.CalcTokens(prompt, session.Model.Value)
228221
if promptTokens > session.Model.MaxContext {
229-
utils.ReplyMessage(ws, "对话内容超出了当前模型允许的最大上下文长度!")
230-
return nil
222+
223+
return errors.New("对话内容超出了当前模型允许的最大上下文长度!")
231224
}
232225

233226
var req = types.ApiRequest{
@@ -286,9 +279,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
286279
break
287280

288281
default:
289-
utils.ReplyMessage(ws, "不支持的平台:"+session.Model.Platform+",请联系管理员!")
290-
utils.ReplyMessage(ws, ErrImg)
291-
return nil
282+
return fmt.Errorf("不支持的平台:%s", session.Model.Platform)
292283
}
293284

294285
// 加载聊天上下文
@@ -402,10 +393,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
402393
case types.QWen:
403394
return h.sendQWenMessage(chatCtx, req, userVo, ctx, session, role, prompt, ws)
404395
}
405-
utils.ReplyChunkMessage(ws, types.WsMessage{
406-
Type: types.WsMiddle,
407-
Content: fmt.Sprintf("Not supported platform: %s", session.Model.Platform),
408-
})
396+
409397
return nil
410398
}
411399

api/handler/chatimpl/chatglm_handler.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ package chatimpl
99

1010
import (
1111
"bufio"
12+
"context"
13+
"encoding/json"
14+
"errors"
15+
"fmt"
1216
"geekai/core/types"
1317
"geekai/store/model"
1418
"geekai/store/vo"
1519
"geekai/utils"
16-
"context"
17-
"encoding/json"
18-
"fmt"
1920
"github.com/golang-jwt/jwt/v5"
2021
"html/template"
2122
"io"
@@ -45,14 +46,8 @@ func (h *ChatHandler) sendChatGLMMessage(
4546
logger.Info("用户取消了请求:", prompt)
4647
return nil
4748
} else if strings.Contains(err.Error(), "no available key") {
48-
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
49-
return nil
50-
} else {
51-
logger.Error(err)
49+
return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
5250
}
53-
54-
utils.ReplyMessage(ws, ErrorMsg)
55-
utils.ReplyMessage(ws, ErrImg)
5651
return err
5752
} else {
5853
defer response.Body.Close()

api/handler/chatimpl/openai_handler.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"bufio"
1212
"context"
1313
"encoding/json"
14+
"errors"
1415
"fmt"
1516
"geekai/core/types"
1617
"geekai/store/model"
@@ -76,10 +77,7 @@ func (h *ChatHandler) sendOpenAiMessage(
7677
var responseBody = types.ApiResponse{}
7778
err = json.Unmarshal([]byte(line[6:]), &responseBody)
7879
if err != nil { // 数据解析出错
79-
logger.Error(err, line)
80-
utils.ReplyMessage(ws, ErrorMsg)
81-
utils.ReplyMessage(ws, ErrImg)
82-
break
80+
return errors.New(line)
8381
}
8482
if len(responseBody.Choices) == 0 { // Fixed: 兼容 Azure API 第一个输出空行
8583
continue

api/handler/chatimpl/qwen_handler.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ package chatimpl
99

1010
import (
1111
"bufio"
12+
"context"
13+
"encoding/json"
14+
"fmt"
1215
"geekai/core/types"
1316
"geekai/store/model"
1417
"geekai/store/vo"
1518
"geekai/utils"
16-
"context"
17-
"encoding/json"
18-
"fmt"
19+
"github.com/syndtr/goleveldb/leveldb/errors"
1920
"html/template"
2021
"io"
2122
"strings"
@@ -59,14 +60,8 @@ func (h *ChatHandler) sendQWenMessage(
5960
logger.Info("用户取消了请求:", prompt)
6061
return nil
6162
} else if strings.Contains(err.Error(), "no available key") {
62-
utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
63-
return nil
64-
} else {
65-
logger.Error(err)
63+
return errors.New("抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!")
6664
}
67-
68-
utils.ReplyMessage(ws, ErrorMsg)
69-
utils.ReplyMessage(ws, ErrImg)
7065
return err
7166
} else {
7267
defer response.Body.Close()

api/handler/chatimpl/xunfei_handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (h *ChatHandler) sendXunFeiMessage(
8383
res = h.DB.Where("id", session.Model.KeyId).Where("enabled", true).Find(&apiKey)
8484
}
8585
// use the last unused key
86-
if res.Error != nil {
86+
if apiKey.Id == 0 {
8787
res = h.DB.Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(&apiKey)
8888
}
8989
if res.Error != nil {

api/handler/dalle_handler.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ func (h *DallJobHandler) preCheck(c *gin.Context) bool {
9292
resp.NotAuth(c)
9393
return false
9494
}
95-
96-
if user.Power < h.App.SysConfig.SdPower {
95+
if user.Power < h.App.SysConfig.DallPower {
9796
resp.ERROR(c, "当前用户剩余算力不足以完成本次绘画!")
9897
return false
9998
}

0 commit comments

Comments
 (0)