opt:Optimize the algorithm to check whether Midjourney images can continue to variation

This commit is contained in:
RockYang 2023-08-17 14:20:16 +08:00
parent 07049c9afb
commit 329e3eee21
11 changed files with 31 additions and 30 deletions

View File

@ -30,7 +30,7 @@ type AppServer struct {
// 保存 Websocket 会话 UserId, 每个 UserId 只能连接一次
// 防止第三方直接连接 socket 调用 OpenAI API
ChatSession *types.LMap[string, types.ChatSession] //map[sessionId]UserId
ChatSession *types.LMap[string, *types.ChatSession] //map[sessionId]UserId
ChatClients *types.LMap[string, *types.WsClient] // map[sessionId]Websocket 连接集合
ReqCancelFunc *types.LMap[string, context.CancelFunc] // HttpClient 请求取消 handle function
Functions map[string]function.Function
@ -45,7 +45,7 @@ func NewServer(appConfig *types.AppConfig, functions map[string]function.Functio
Config: appConfig,
Engine: gin.Default(),
ChatContexts: types.NewLMap[string, []interface{}](),
ChatSession: types.NewLMap[string, types.ChatSession](),
ChatSession: types.NewLMap[string, *types.ChatSession](),
ChatClients: types.NewLMap[string, *types.WsClient](),
ReqCancelFunc: types.NewLMap[string, context.CancelFunc](),
MjTaskClients: types.NewLMap[string, *types.WsClient](),
@ -151,7 +151,7 @@ func corsMiddleware() gin.HandlerFunc {
c.Header("Access-Control-Allow-Origin", origin)
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
//允许跨域设置可以返回其他子段,可以自定义字段
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, Content-Type")
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, Content-Type, Chat-Token")
// 允许浏览器(客户端)可以解析的头部 (重要)
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
//设置缓存时间

View File

@ -9,7 +9,7 @@ type MKey interface {
string | int
}
type MValue interface {
*WsClient | ChatSession | context.CancelFunc | []interface{} | MjTask
*WsClient | *ChatSession | context.CancelFunc | []interface{} | MjTask
}
type LMap[K MKey, T MValue] struct {
lock sync.RWMutex

View File

@ -49,9 +49,6 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) {
logger.Error(err)
return
}
// 设置读写超时时间
//_ = ws.SetWriteDeadline(time.Now().Add(300 * time.Second))
//_ = ws.SetReadDeadline(time.Now().Add(300 * time.Second))
sessionId := c.Query("session_id")
roleId := h.GetInt(c, "role_id", 0)
@ -59,14 +56,14 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) {
chatModel := c.Query("model")
session := h.App.ChatSession.Get(sessionId)
if session.SessionId == "" {
if session == nil {
user, err := utils.GetLoginUser(c, h.db)
if err != nil {
logger.Info("用户未登录")
c.Abort()
return
}
session = types.ChatSession{
session = &types.ChatSession{
SessionId: sessionId,
ClientIP: c.ClientIP(),
Username: user.Username,
@ -137,7 +134,7 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) {
}
// 将消息发送给 ChatGPT 并获取结果,通过 WebSocket 推送到客户端
func (h *ChatHandler) sendMessage(ctx context.Context, session types.ChatSession, role model.ChatRole, prompt string, ws *types.WsClient) error {
func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSession, role model.ChatRole, prompt string, ws *types.WsClient) error {
promptCreatedAt := time.Now() // 记录提问时间
var user model.User

View File

@ -67,7 +67,7 @@ func (h *MidJourneyHandler) Notify(c *gin.Context) {
return
}
logger.Infof("收到 MidJourney 回调请求:%+v", data)
logger.Debugf("收到 MidJourney 回调请求:%+v", data)
// the job is saved
var job model.MidJourneyJob

View File

@ -157,7 +157,6 @@ func (h *UserHandler) Login(c *gin.Context) {
user.LastLoginAt = time.Now().Unix()
h.db.Model(&user).Updates(user)
sessionId := utils.RandString(42)
err := utils.SetLoginUser(c, user)
if err != nil {
resp.ERROR(c, "保存会话失败")
@ -165,9 +164,6 @@ func (h *UserHandler) Login(c *gin.Context) {
return
}
// 记录登录信息在服务端
h.App.ChatSession.Put(sessionId, types.ChatSession{ClientIP: c.ClientIP(), UserId: user.Id, Username: data.Username, SessionId: sessionId})
h.db.Create(&model.UserLoginLog{
UserId: user.Id,
Username: user.Username,
@ -175,7 +171,7 @@ func (h *UserHandler) Login(c *gin.Context) {
LoginAddress: utils.Ip2Region(h.searcher, c.ClientIP()),
})
resp.SUCCESS(c, sessionId)
resp.SUCCESS(c)
}
// Logout 注 销

View File

@ -6,7 +6,7 @@ services:
container_name: chatgpt-plus-go
restart: always
environment:
- DEBUG=false
- LOG_LEVEL=info
- CONFIG_FILE=config.toml
ports:
- "5678:5678"

View File

@ -7,7 +7,7 @@
<div class="chat-item">
<div class="content">
<div class="text" v-html="data.content"></div>
<div class="text" v-html="data.html"></div>
<div class="images" v-if="data.image?.url !== ''">
<el-image :src="data.image?.url"
:zoom-rate="1.0"
@ -30,7 +30,7 @@
</div>
</div>
<div class="opt" v-if="!data['reference_id'] &&data.image?.hash !== ''">
<div class="opt" v-if="data.showOpt &&data.image?.hash !== ''">
<div class="opt-line">
<ul>
<li><a @click="upscale(1)">U1</a></li>
@ -86,6 +86,8 @@ if (data.value["image"]?.width > 0) {
height.value = 350 * data.value["image"]?.height / data.value["image"]?.width
localStorage.setItem(cacheKey, height.value)
}
data.value["showOpt"] = data.value["content"]?.indexOf("- Image #") === -1;
// console.log(data.value)
watch(() => props.content, (newVal) => {
data.value = newVal;

View File

@ -1,19 +1,26 @@
/* eslint-disable no-constant-condition */
import {randString} from "@/utils/libs";
/**
* storage handler
*/
const SessionUserKey = 'SESSION_ID';
const SessionIDKey = 'SESSION_ID';
export function getSessionId() {
return sessionStorage.getItem(SessionUserKey)
let sessionId = sessionStorage.getItem(SessionIDKey)
if (!sessionId) {
sessionId = randString(42)
setSessionId(sessionId)
}
return sessionId
}
export function removeLoginUser() {
sessionStorage.removeItem(SessionUserKey)
sessionStorage.removeItem(SessionIDKey)
}
export function setSessionId(sessionId) {
sessionStorage.setItem(SessionUserKey, sessionId)
sessionStorage.setItem(SessionIDKey, sessionId)
}

View File

@ -1,4 +1,5 @@
import axios from 'axios'
import {getSessionId} from "@/store/session";
axios.defaults.timeout = 10000
axios.defaults.baseURL = process.env.VUE_APP_API_HOST
@ -9,7 +10,7 @@ axios.defaults.headers.post['Content-Type'] = 'application/json'
axios.interceptors.request.use(
config => {
// set token
// config.headers['ChatGPT-TOKEN'] = getSessionId();
config.headers['Chat-Token'] = getSessionId();
return config
}, error => {
return Promise.reject(error)

View File

@ -534,7 +534,7 @@ const connect = function (chat_id, role_id) {
} else { //
loadChatHistory(chat_id);
}
});
_socket.addEventListener('message', event => {
@ -554,7 +554,7 @@ const connect = function (chat_id, role_id) {
disableInput(true)
const content = data.content;
const md = require('markdown-it')({breaks: true});
content.content = md.render(content.content)
content.html = md.render(content.content)
let key = content.key
// fixed bug: Upscale Variation
if (content.status === "Finished") {
@ -773,7 +773,7 @@ const loadChatHistory = function (chatId) {
continue;
} else if (data[i].type === "mj") {
data[i].content = JSON.parse(data[i].content)
data[i].content.content = md.render(data[i].content?.content)
data[i].content.html = md.render(data[i].content?.content)
chatData.value.push(data[i]);
continue;
}

View File

@ -52,7 +52,6 @@ import {onMounted, ref} from "vue";
import {Lock, UserFilled} from "@element-plus/icons-vue";
import {httpPost} from "@/utils/http";
import {ElMessage} from "element-plus";
import {setSessionId} from "@/store/session";
import {useRouter} from "vue-router";
import FooterBar from "@/components/FooterBar.vue";
import {isMobile} from "@/utils/libs";
@ -78,8 +77,7 @@ const login = function () {
return ElMessage.error('请输入密码');
}
httpPost('/api/user/login', {username: username.value.trim(), password: password.value.trim()}).then((res) => {
setSessionId(res.data)
httpPost('/api/user/login', {username: username.value.trim(), password: password.value.trim()}).then(() => {
if (isMobile()) {
router.push('/mobile')
} else {