merge and resolve conflicts

This commit is contained in:
RockYang
2025-10-27 16:21:46 +08:00
parent a9f11d79a9
commit 499f5c915f
10 changed files with 86 additions and 202 deletions

View File

@@ -1,5 +1,11 @@
# 更新日志 # 更新日志
## v4.1.9
- 功能优化:优化系统配置,移除已废弃的配置项
- 功能优化GPT-O1 模型支持流式输出
- 功能优化:优化代码引用快样式,支持主题切换
## v4.1.8 ## v4.1.8
- 功能优化:**UI 全新改版,支持主题切换**。 :rocket: :rocket: :rocket: - 功能优化:**UI 全新改版,支持主题切换**。 :rocket: :rocket: :rocket:

View File

@@ -160,7 +160,6 @@ type SystemConfig struct {
SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词 SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词
MjMode string `json:"mj_mode"` // midjourney 默认的API模式relax, fast, turbo MjMode string `json:"mj_mode"` // midjourney 默认的API模式relax, fast, turbo
IndexBgURL string `json:"index_bg_url"` // 前端首页背景图片
IndexNavs []int `json:"index_navs"` // 首页显示的导航菜单 IndexNavs []int `json:"index_navs"` // 首页显示的导航菜单
Copyright string `json:"copyright"` // 版权信息 Copyright string `json:"copyright"` // 版权信息
MarkMapText string `json:"mark_map_text"` // 思维导入的默认文本 MarkMapText string `json:"mark_map_text"` // 思维导入的默认文本

View File

@@ -101,8 +101,8 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
} }
// 兼容 GPT-O1 模型 // 兼容 GPT-O1 模型
if strings.HasPrefix(session.Model.Value, "o1-") { if strings.HasPrefix(session.Model.Value, "o1-") {
utils.SendChunkMsg(ws, "AI 正在思考...\n") utils.SendChunkMsg(ws, "> AI 正在思考...\n")
req.Stream = false req.Stream = session.Stream
session.Start = time.Now().Unix() session.Start = time.Now().Unix()
} else { } else {
req.MaxTokens = session.Model.MaxTokens req.MaxTokens = session.Model.MaxTokens

View File

@@ -63,7 +63,7 @@ func (h *ChatHandler) sendOpenAiMessage(
start := time.Now() start := time.Now()
var apiKey = model.ApiKey{} var apiKey = model.ApiKey{}
response, err := h.doRequest(ctx, req, session, &apiKey) response, err := h.doRequest(ctx, req, session, &apiKey)
logger.Info("HTTP请求完成耗时", time.Now().Sub(start)) logger.Info("HTTP请求完成耗时", time.Since(start))
if err != nil { if err != nil {
if strings.Contains(err.Error(), "context canceled") { if strings.Contains(err.Error(), "context canceled") {
return fmt.Errorf("用户取消了请求:%s", prompt) return fmt.Errorf("用户取消了请求:%s", prompt)
@@ -89,6 +89,12 @@ func (h *ChatHandler) sendOpenAiMessage(
var function model.Function var function model.Function
var toolCall = false var toolCall = false
var arguments = make([]string, 0) var arguments = make([]string, 0)
if strings.HasPrefix(req.Model, "o1-") {
content := fmt.Sprintf("AI 思考结束,耗时:%d 秒。\n\n", time.Now().Unix()-session.Start)
utils.SendChunkMsg(ws, content)
}
scanner := bufio.NewScanner(response.Body) scanner := bufio.NewScanner(response.Body)
for scanner.Scan() { for scanner.Scan() {
line := scanner.Text() line := scanner.Text()
@@ -150,10 +156,10 @@ func (h *ChatHandler) sendOpenAiMessage(
// output stopped // output stopped
if responseBody.Choices[0].FinishReason != "" { if responseBody.Choices[0].FinishReason != "" {
break // 输出完成或者输出中断了 break // 输出完成或者输出中断了
} else { } else { // 正常输出结果
content := responseBody.Choices[0].Delta.Content content := responseBody.Choices[0].Delta.Content
contents = append(contents, utils.InterfaceToString(content)) contents = append(contents, utils.InterfaceToString(content))
utils.SendChunkMsg(ws, responseBody.Choices[0].Delta.Content) utils.SendChunkMsg(ws, content)
} }
} // end for } // end for

View File

@@ -6,6 +6,6 @@ VUE_APP_ADMIN_USER=admin
VUE_APP_ADMIN_PASS=admin123 VUE_APP_ADMIN_PASS=admin123
VUE_APP_KEY_PREFIX=GeekAI_DEV_ VUE_APP_KEY_PREFIX=GeekAI_DEV_
VUE_APP_TITLE="Geek-AI 创作系统" VUE_APP_TITLE="Geek-AI 创作系统"
VUE_APP_VERSION=v4.1.8 VUE_APP_VERSION=v4.1.9
VUE_APP_DOCS_URL=https://docs.geekai.me VUE_APP_DOCS_URL=https://docs.geekai.me
VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai

View File

@@ -2,6 +2,6 @@ VUE_APP_API_HOST=
VUE_APP_WS_HOST= VUE_APP_WS_HOST=
VUE_APP_KEY_PREFIX=GeekAI_ VUE_APP_KEY_PREFIX=GeekAI_
VUE_APP_TITLE="Geek-AI 创作系统" VUE_APP_TITLE="Geek-AI 创作系统"
VUE_APP_VERSION=v4.1.8 VUE_APP_VERSION=v4.1.9
VUE_APP_DOCS_URL=https://docs.geekai.me VUE_APP_DOCS_URL=https://docs.geekai.me
VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai

View File

@@ -85,4 +85,8 @@
--van-tabbar-background: #141a36; --van-tabbar-background: #141a36;
--van-nav-bar-background: #1B244A; --van-nav-bar-background: #1B244A;
--van-dropdown-menu-background: #141a36; --van-dropdown-menu-background: #141a36;
//
--quote-bg-color: #1F243F;
--quote-text-color: #fff;
} }

View File

@@ -48,6 +48,10 @@
// code // code
--code-bg-color: #ececec; --code-bg-color: #ececec;
--code-text-color: var(--el-color-primary); --code-text-color: var(--el-color-primary);
//
--quote-bg-color: #e0dfff;
--quote-text-color: #333;
} }

View File

@@ -6,7 +6,7 @@
</div> </div>
<div class="chat-item"> <div class="chat-item">
<div class="content" v-html="md.render(processContent(data.content))"></div> <div class="content-wrapper" v-html="md.render(processContent(data.content))"></div>
<div class="bar" v-if="data.created_at"> <div class="bar" v-if="data.created_at">
<span class="bar-item" <span class="bar-item"
><el-icon><Clock /></el-icon> {{ dateFormat(data.created_at) }}</span ><el-icon><Clock /></el-icon> {{ dateFormat(data.created_at) }}</span
@@ -172,47 +172,9 @@ const reGenerate = (prompt) => {
--font-family: Menlo,"微软雅黑","Roboto Mono","Courier New",Courier,monospace,"Inter",sans-serif; --font-family: Menlo,"微软雅黑","Roboto Mono","Courier New",Courier,monospace,"Inter",sans-serif;
font-family: var(--font-family); font-family: var(--font-family);
.chat-line-reply-list { .chat-line {
justify-content: center;
background-color: var(--chat-list-bg);
color:var(--theme-text-color-primary);
width 100%
padding-bottom: 1.5rem;
padding-top: 1.5rem;
border-bottom: 0.5px solid var(--el-border-color);
.chat-line-inner {
display flex;
width 100%;
max-width 900px;
padding-left 10px;
.chat-icon {
margin-right 20px;
img {
width: 36px;
height: 36px;
border-radius: 50%;
padding: 1px;
}
}
.chat-item { .chat-item {
width 100% .content-wrapper {
position: relative;
padding: 0;
overflow: hidden;
.content {
min-height 20px;
word-break break-word;
padding: 0
color:var(--theme-text-color-primary);
font-size: var(--content-font-size);
border-radius: 5px;
overflow auto;
img { img {
max-width: 600px; max-width: 600px;
border-radius: 10px; border-radius: 10px;
@@ -224,11 +186,6 @@ const reGenerate = (prompt) => {
code { code {
color:var(--theme-text-color-primary); color:var(--theme-text-color-primary);
font-weight 600 font-weight 600
// color:#fff
// background-color var(--el-color-primary-light-3)
// background-color: var(--el-color-primary);
// padding 3px 5px;
// border-radius 5px;
} }
} }
@@ -305,13 +262,58 @@ const reGenerate = (prompt) => {
blockquote { blockquote {
margin 0 margin 0
background-color: #ebfffe; background-color: var(--quote-bg-color);
padding: 0.8rem 1.5rem; padding: 0.8rem 1.5rem;
border-left: 0.5rem solid; color: var(--quote-text-color);
border-color: #026863; border-left: 0.4rem solid #6b50e1; /* 紫色边框 */
color: #2c3e50; font-size: 1.1rem;
line-height: 1.6;
} }
} }
}
}
.chat-line-reply-list {
justify-content: center;
background-color: var(--chat-list-bg);
color:var(--theme-text-color-primary);
width 100%
padding-bottom: 1.5rem;
padding-top: 1.5rem;
border-bottom: 0.5px solid var(--el-border-color);
.chat-line-inner {
display flex;
width 100%;
max-width 900px;
padding-left 10px;
.chat-icon {
margin-right 20px;
img {
width: 36px;
height: 36px;
border-radius: 50%;
padding: 1px;
}
}
.chat-item {
width 100%
position: relative;
padding: 0;
overflow: hidden;
.content-wrapper {
min-height 20px;
word-break break-word;
padding: 0
color:var(--theme-text-color-primary);
font-size: var(--content-font-size);
border-radius: 5px;
overflow auto;
}
.bar { .bar {
@@ -388,106 +390,7 @@ const reGenerate = (prompt) => {
overflow auto; overflow auto;
// background-color #F5F5F5 // background-color #F5F5F5
background-color :var(--chat-content-bg); background-color :var(--chat-content-bg);
border-radius: 0 10px 10px 10px; border-radius: 0 10px 10px 10px;
img {
max-width: 600px;
border-radius: 10px;
}
p {
line-height 1.5
code {
color:var(--code-text-color);
font-weight bold
font-family: var(--font-family);
background-color: var(--code-bg-color);
border-radius: 4px;
padding: .2rem .4rem;
}
}
p:last-child {
margin-bottom: 0
}
p:first-child {
margin-top 0
}
.code-container {
position relative
display flex
.hljs {
border-radius 10px
width 100%
}
.copy-code-btn {
position: absolute;
right 10px
top 10px
cursor pointer
font-size 12px
color #c1c1c1
&:hover {
color #20a0ff
}
}
}
.lang-name {
position absolute;
right 10px
bottom 20px
padding 2px 6px 4px 6px
background-color #444444
border-radius 10px
color #00e0e0
}
// 设置表格边框
table {
width 100%
margin-bottom 1rem
color #212529
border-collapse collapse;
border 1px solid #dee2e6;
background-color:var(--chat-content-bg);
color:var(--theme-text-color-primary);
thead {
th {
border 1px solid #dee2e6
vertical-align: bottom
border-bottom: 2px solid #dee2e6
padding 10px
}
}
td {
border 1px solid #dee2e6
padding 10px
}
}
// 代码快
blockquote {
margin 0
background-color: #ebfffe;
padding: 0.8rem 1.5rem;
border-left: 0.5rem solid;
border-color: #026863;
color: #2c3e50;
}
} }
} }

View File

@@ -27,32 +27,6 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item>
<template #label>
<div class="label-title">
首页背景图
<el-tooltip effect="dark" content="网站首页背景图片" raw-content placement="right">
<el-icon>
<InfoFilled />
</el-icon>
</el-tooltip>
</div>
</template>
<div class="d-flex justify-between w-100">
<el-input v-model="system['index_bg_url']" placeholder="网站首页背景图片">
<template #append>
<el-upload :auto-upload="true" :show-file-list="false" @click="beforeUpload('index_bg_url')" :http-request="uploadImg">
<el-icon class="uploader-icon">
<UploadFilled />
</el-icon>
</el-upload>
</template>
</el-input>
<el-button class="ml-1" type="primary" @click="system.index_bg_url = 'https://api.dujin.org/bing/1920.php'">使用动态背景</el-button>
<el-button class="ml-1" @click="system.index_bg_url = 'color'">使用纯色背景</el-button>
</div>
</el-form-item>
<el-form-item> <el-form-item>
<template #label> <template #label>
<div class="label-title"> <div class="label-title">
@@ -229,27 +203,15 @@
</template> </template>
<el-input v-model.number="system['mj_power']" placeholder="" /> <el-input v-model.number="system['mj_power']" placeholder="" />
</el-form-item> </el-form-item>
<el-form-item>
<template #label>
<div class="label-title">
MJ操作算力
<el-tooltip effect="dark" content="放大,变换,重绘操作一次消耗的算力" raw-content placement="right">
<el-icon>
<InfoFilled />
</el-icon>
</el-tooltip>
</div>
</template>
<el-input v-model.number="system['mj_action_power']" placeholder="" />
</el-form-item>
<el-form-item label="Stable-Diffusion算力" prop="sd_power"> <el-form-item label="Stable-Diffusion算力" prop="sd_power">
<el-input v-model.number="system['sd_power']" placeholder="使用Stable-Diffusion画一张图消耗算力" /> <el-input v-model.number="system['sd_power']" placeholder="使用Stable-Diffusion画一张图消耗算力" />
</el-form-item> </el-form-item>
<el-form-item label="DALL-E-3算力" prop="dall_power"> <el-form-item>
<template #label> <template #label>
<div class="label-title"> <div class="label-title">
MJ操作算力 DALL-E-3算力
<el-tooltip effect="dark" content="主要用户函数调用 DALL-E-3 进行绘画" raw-content placement="right"> <el-tooltip effect="dark" content="使用DALL-E-3画一张图消耗算力" raw-content placement="right">
<el-icon> <el-icon>
<InfoFilled /> <InfoFilled />
</el-icon> </el-icon>