refactor: refactor chat model, replace mode value with mode id. refactored system config module, add seperate configration for every chat model

This commit is contained in:
RockYang
2023-09-04 16:32:20 +08:00
parent 59ed8c9660
commit f7a427d2c0
28 changed files with 714 additions and 276 deletions

View File

@@ -2,84 +2,84 @@
<div class="system-config" v-loading="loading">
<div class="container">
<el-divider content-position="center">基本设置</el-divider>
<el-form :model="system" label-width="120px" label-position="left" ref="systemFormRef" :rules="rules">
<el-form :model="system" label-width="150px" label-position="right" ref="systemFormRef" :rules="rules">
<el-form-item label="网站标题" prop="title">
<el-input v-model="system['title']"/>
</el-form-item>
<el-form-item label="控制台标题" prop="admin_title">
<el-input v-model="system['admin_title']"/>
</el-form-item>
<el-form-item label="赠送对话次数" prop="init_calls">
<el-form-item label="注册赠送对话次数" prop="user_init_calls">
<el-input v-model.number="system['user_init_calls']" placeholder="新用户注册赠送对话次数"/>
</el-form-item>
<el-form-item label="赠送绘图次数" prop="init_calls">
<el-form-item label="注册赠送绘图次数" prop="init_img_calls">
<el-input v-model.number="system['init_img_calls']" placeholder="新用户注册赠送绘图次数"/>
</el-form-item>
<el-form-item label="开放注册服务" prop="enabled_register">
<el-switch v-model="system['enabled_register']"/>
</el-form-item>
<el-form-item label="短信验证服务" prop="enabled_msg_service">
<el-switch v-model="system['enabled_msg_service']"/>
</el-form-item>
<el-form-item label="开放用户注册" prop="enabled_register">
<el-switch v-model="system['enabled_register']"/>
</el-form-item>
<el-alert type="info" show-icon :closable="false">
<p>在这里维护前端聊天页面可用的 GPT 模型列表</p>
</el-alert>
<el-form-item label="GPT 模型" prop="models">
<div class="models">
<el-tag
v-for="item in system.models"
:key="item"
@close="removeModel(item)"
round
closable
>
{{ item }}
</el-tag>
<el-button type="success" :icon="Plus" @click="addModel" size="small" circle/>
</div>
<el-form-item label="开放AI绘画" prop="enabled_draw">
<el-switch v-model="system['enabled_draw']"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="save('system')">保存</el-button>
</el-form-item>
</el-form>
<el-divider content-position="center">聊天设</el-divider>
<el-alert type="info" show-icon :closable="false">
<p>以下配置为新用户注册默认初始化的聊天参数用户登录后还可以自己修改参数</p>
</el-alert>
<el-form :model="chat" label-position="left" label-width="120px">
<el-form-item label="OpenAI API 地址">
<el-input v-model="chat['api_url']" placeholder="gpt-3/gpt-3.5-turbo/gpt-4"/>
</el-form-item>
<el-form-item label="默认模型">
<el-select v-model="chat['model']" placeholder="默认会话模型">
<el-option
v-for="item in system.models"
:key="item"
:label="item.toUpperCase()"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="模型温度">
<el-input v-model.number="chat['temperature']" placeholder="0-1之间的小数"/>
</el-form-item>
<el-form-item label="Max Tokens">
<el-input v-model.number="chat['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">模型通用配</el-divider>
<el-form :model="chat" label-position="right" label-width="150px" ref="chatFormRef" :rules="rules">
<el-form-item label="开启聊天上下文">
<el-switch v-model="chat['enable_context']"/>
</el-form-item>
<el-form-item label="保存聊天记录">
<el-switch v-model="chat['enable_history']"/>
</el-form-item>
<el-alert type="info" show-icon :closable="false">
<p>会话上下文深度在老会话中继续会话默认加载多少条聊天记录作为上下文如果设置为 0
则不加载聊天记录仅仅使用当前角色的上下文该配置参数最好设置为 2 的整数倍</p>
</el-alert>
<el-form-item label="会话上下文深度">
<el-input-number v-model="chat['context_deep']" :min="0" :max="10"/>
<div class="tip" style="margin-top: 10px;">会话上下文深度在老会话中继续会话默认加载多少条聊天记录作为上下文如果设置为
0
则不加载聊天记录仅仅使用当前角色的上下文该配置参数最好设置为 2 的整数倍
</div>
</el-form-item>
<el-divider content-position="center">OpenAI</el-divider>
<el-form-item label="API 地址" prop="open_ai.api_url">
<el-input v-model="chat['open_ai']['api_url']" placeholder="支持变量,{model} => 模型名称"/>
</el-form-item>
<el-form-item label="模型创意度">
<el-slider v-model="chat['open_ai']['temperature']" :max="2" :step="0.1"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['open_ai']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">Azure</el-divider>
<el-form-item label="API 地址" prop="azure.api_url">
<el-input v-model="chat['azure']['api_url']" placeholder="支持变量,{model} => 模型名称"/>
</el-form-item>
<el-form-item label="模型创意度">
<el-slider v-model="chat['azure']['temperature']" :max="2" :step="0.1"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['azure']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">ChatGLM</el-divider>
<el-form-item label="API 地址" prop="chat_gml.api_url">
<el-input v-model="chat['chat_gml']['api_url']" placeholder="支持变量,{model} => 模型名称"/>
</el-form-item>
<el-form-item label="模型创意度">
<el-slider v-model="chat['chat_gml']['temperature']" :max="2" :step="0.1"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['chat_gml']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-form-item style="text-align: right">
@@ -93,34 +93,44 @@
<script setup>
import {onMounted, reactive, ref} from "vue";
import {httpGet, httpPost} from "@/utils/http";
import {ElMessage, ElMessageBox} from "element-plus";
import {Plus} from "@element-plus/icons-vue";
import {removeArrayItem} from "@/utils/libs";
import {ElMessage} from "element-plus";
const system = ref({models: []})
const chat = ref({})
const chat = ref({
open_ai: {api_url: "", temperature: 1, max_tokens: 1024},
azure: {api_url: "", temperature: 1, max_tokens: 1024},
chat_gml: {api_url: "", temperature: 1, max_tokens: 1024},
context_deep: 0,
enable_context: true,
enable_history: true,
})
const loading = ref(true)
const systemFormRef = ref(null)
const models = ref([])
const chatFormRef = ref(null)
onMounted(() => {
// 加载系统配置
httpGet('/api/admin/config/get?key=system').then(res => {
system.value = res.data
system.value['models'].forEach(model => {
models.value.push({
name: model,
edit: false
})
})
}).catch(e => {
ElMessage.error("加载系统配置失败: " + e.message)
})
// 加载聊天配置
httpGet('/api/admin/config/get?key=chat').then(res => {
chat.value = res.data
// chat.value = res.data
if (res.data.open_ai) {
chat.value.open_ai = res.data.open_ai
}
if (res.data.azure) {
chat.value.azure = res.data.azure
}
if (res.data.chat_gml) {
chat.value.chat_gml = res.data.chat_gml
}
chat.value.context_deep = res.data.context_deep
chat.value.enable_context = res.data.enable_context
chat.value.enable_history = res.data.enable_history
loading.value = false
}).catch(e => {
ElMessage.error("加载聊天配置失败: " + e.message)
@@ -131,42 +141,37 @@ onMounted(() => {
const rules = reactive({
title: [{required: true, message: '请输入网站标题', trigger: 'blur',}],
admin_title: [{required: true, message: '请输入控制台标题', trigger: 'blur',}],
init_calls: [{required: true, message: '必须填入大于0的数组', trigger: 'blur',}],
models: [{required: true, message: '至少保留一个 GPT 模型', trigger: 'blur',}],
user_init_calls: [{required: true, message: '请输入赠送对话次数', trigger: 'blur'}],
user_img_calls: [{required: true, message: '请输入赠送绘图次数', trigger: 'blur'}],
open_ai: {api_url: [{required: true, message: '请输入 API URL', trigger: 'blur'}]},
azure: {api_url: [{required: true, message: '请输入 API URL', trigger: 'blur'}]},
chat_gml: {api_url: [{required: true, message: '请输入 API URL', trigger: 'blur'}]},
})
const save = function (key) {
systemFormRef.value.validate((valid) => {
if (valid) {
const data = key === 'system' ? system.value : chat.value
httpPost('/api/admin/config/update', {key: key, config: data}).then(() => {
ElMessage.success("操作成功!")
}).catch(e => {
ElMessage.error("操作失败:" + e.message)
})
}
})
}
const removeModel = function (model) {
system.value.models = removeArrayItem(system.value.models, model, (v1, v2) => {
return v1 === v2
})
}
// 增加 GPT 模型
const addModel = function () {
ElMessageBox.prompt('请输入 GPT 模型名称', '新增模型', {
confirmButtonText: '保存',
cancelButtonText: '取消',
inputPattern:
/[\w+]/,
inputErrorMessage: '请输入模型名称',
}).then(({value}) => {
system.value.models.push(value)
})
if (key === 'system') {
systemFormRef.value.validate((valid) => {
if (valid) {
httpPost('/api/admin/config/update', {key: key, config: system.value}).then(() => {
ElMessage.success("操作成功!")
}).catch(e => {
ElMessage.error("操作失败:" + e.message)
})
}
})
} else if (key === 'chat') {
chatFormRef.value.validate((valid) => {
if (valid) {
httpPost('/api/admin/config/update', {key: key, config: chat.value}).then(() => {
ElMessage.success("操作成功!")
}).catch(e => {
ElMessage.error("操作失败:" + e.message)
})
}
})
}
}
</script>
<style lang="stylus" scoped>
@@ -180,23 +185,16 @@ const addModel = function () {
.el-form {
.el-form-item__content {
.models {
.el-tag {
margin-right 10px;
.el-input {
max-width 100px;
}
}
.el-button--small {
font-size 16px;
}
}
.tip-text {
padding-left 10px;
}
.tip {
color #c1c1c1
font-size 12px;
line-height 1.5;
}
}
}