mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-28 21:13:51 +08:00
feat: Solve the problem of #2198 custom model ID
This commit is contained in:
@@ -16,6 +16,9 @@ public class ModelConfigBodyDTO {
|
|||||||
// @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)")
|
// @Schema(description = "模型类型(Memory/ASR/VAD/LLM/TTS)")
|
||||||
// private String modelType;
|
// private String modelType;
|
||||||
//
|
//
|
||||||
|
@Schema(description = "模型ID,未填写将自动生成")
|
||||||
|
private String id;
|
||||||
|
|
||||||
@Schema(description = "模型编码(如AliLLM、DoubaoTTS)")
|
@Schema(description = "模型编码(如AliLLM、DoubaoTTS)")
|
||||||
private String modelCode;
|
private String modelCode;
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import lombok.Data;
|
|||||||
@Schema(description = "模型配置表")
|
@Schema(description = "模型配置表")
|
||||||
public class ModelConfigEntity {
|
public class ModelConfigEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.ASSIGN_UUID)
|
|
||||||
@Schema(description = "主键")
|
@Schema(description = "主键")
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
|
|||||||
+23
-24
@@ -1,23 +1,16 @@
|
|||||||
package xiaozhi.modules.model.service.impl;
|
package xiaozhi.modules.model.service.impl;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
import xiaozhi.common.constant.Constant;
|
import xiaozhi.common.constant.Constant;
|
||||||
import xiaozhi.common.exception.ErrorCode;
|
import xiaozhi.common.exception.ErrorCode;
|
||||||
import xiaozhi.common.exception.RenException;
|
import xiaozhi.common.exception.RenException;
|
||||||
@@ -30,15 +23,17 @@ import xiaozhi.common.utils.SensitiveDataUtils;
|
|||||||
import xiaozhi.modules.agent.dao.AgentDao;
|
import xiaozhi.modules.agent.dao.AgentDao;
|
||||||
import xiaozhi.modules.agent.entity.AgentEntity;
|
import xiaozhi.modules.agent.entity.AgentEntity;
|
||||||
import xiaozhi.modules.model.dao.ModelConfigDao;
|
import xiaozhi.modules.model.dao.ModelConfigDao;
|
||||||
import xiaozhi.modules.model.dto.LlmModelBasicInfoDTO;
|
import xiaozhi.modules.model.dto.*;
|
||||||
import xiaozhi.modules.model.dto.ModelBasicInfoDTO;
|
|
||||||
import xiaozhi.modules.model.dto.ModelConfigBodyDTO;
|
|
||||||
import xiaozhi.modules.model.dto.ModelConfigDTO;
|
|
||||||
import xiaozhi.modules.model.dto.ModelProviderDTO;
|
|
||||||
import xiaozhi.modules.model.entity.ModelConfigEntity;
|
import xiaozhi.modules.model.entity.ModelConfigEntity;
|
||||||
import xiaozhi.modules.model.service.ModelConfigService;
|
import xiaozhi.modules.model.service.ModelConfigService;
|
||||||
import xiaozhi.modules.model.service.ModelProviderService;
|
import xiaozhi.modules.model.service.ModelProviderService;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class ModelConfigServiceImpl extends BaseServiceImpl<ModelConfigDao, ModelConfigEntity>
|
public class ModelConfigServiceImpl extends BaseServiceImpl<ModelConfigDao, ModelConfigEntity>
|
||||||
@@ -230,7 +225,7 @@ public class ModelConfigServiceImpl extends BaseServiceImpl<ModelConfigDao, Mode
|
|||||||
* 验证编辑参数
|
* 验证编辑参数
|
||||||
*/
|
*/
|
||||||
private void validateEditParameters(String modelType, String provideCode, String id,
|
private void validateEditParameters(String modelType, String provideCode, String id,
|
||||||
ModelConfigBodyDTO modelConfigBodyDTO) {
|
ModelConfigBodyDTO modelConfigBodyDTO) {
|
||||||
if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
|
if (StringUtils.isBlank(modelType) || StringUtils.isBlank(provideCode)) {
|
||||||
throw new RenException(ErrorCode.MODEL_TYPE_PROVIDE_CODE_NOT_NULL);
|
throw new RenException(ErrorCode.MODEL_TYPE_PROVIDE_CODE_NOT_NULL);
|
||||||
}
|
}
|
||||||
@@ -252,6 +247,10 @@ public class ModelConfigServiceImpl extends BaseServiceImpl<ModelConfigDao, Mode
|
|||||||
if (modelConfigBodyDTO == null) {
|
if (modelConfigBodyDTO == null) {
|
||||||
throw new RenException(ErrorCode.PARAMS_GET_ERROR);
|
throw new RenException(ErrorCode.PARAMS_GET_ERROR);
|
||||||
}
|
}
|
||||||
|
if (StringUtils.isBlank(modelConfigBodyDTO.getId())) {
|
||||||
|
// 参照 MP @TableId AutoUUID 策略使用 com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator(UUID.replace("-","")) 进行分配默认模型ID
|
||||||
|
modelConfigBodyDTO.setId(DefaultIdentifierGenerator.getInstance().nextUUID(ModelConfigEntity.class));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -327,9 +326,9 @@ public class ModelConfigServiceImpl extends BaseServiceImpl<ModelConfigDao, Mode
|
|||||||
* 准备更新实体,处理敏感数据
|
* 准备更新实体,处理敏感数据
|
||||||
*/
|
*/
|
||||||
private ModelConfigEntity prepareUpdateEntity(ModelConfigBodyDTO modelConfigBodyDTO,
|
private ModelConfigEntity prepareUpdateEntity(ModelConfigBodyDTO modelConfigBodyDTO,
|
||||||
ModelConfigEntity originalEntity,
|
ModelConfigEntity originalEntity,
|
||||||
String modelType,
|
String modelType,
|
||||||
String id) {
|
String id) {
|
||||||
// 1. 复制原始实体,保留所有原始数据(包括敏感信息)
|
// 1. 复制原始实体,保留所有原始数据(包括敏感信息)
|
||||||
ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(originalEntity, ModelConfigEntity.class);
|
ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(originalEntity, ModelConfigEntity.class);
|
||||||
modelConfigEntity.setId(id);
|
modelConfigEntity.setId(id);
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
knife4j:
|
|
||||||
production: false
|
|
||||||
enable: true
|
|
||||||
basic:
|
|
||||||
enable: false
|
|
||||||
username: renren
|
|
||||||
password: 2ZABCDEUgF
|
|
||||||
setting:
|
|
||||||
enableFooter: false
|
|
||||||
spring:
|
|
||||||
datasource:
|
|
||||||
druid:
|
|
||||||
#MySQL
|
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
|
||||||
url: jdbc:mysql://127.0.0.1:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
|
|
||||||
username: root
|
|
||||||
password: 123456
|
|
||||||
initial-size: 10
|
|
||||||
max-active: 100
|
|
||||||
min-idle: 10
|
|
||||||
max-wait: 6000
|
|
||||||
pool-prepared-statements: true
|
|
||||||
max-pool-prepared-statement-per-connection-size: 20
|
|
||||||
time-between-eviction-runs-millis: 60000
|
|
||||||
min-evictable-idle-time-millis: 300000
|
|
||||||
test-while-idle: true
|
|
||||||
test-on-borrow: false
|
|
||||||
test-on-return: false
|
|
||||||
stat-view-servlet:
|
|
||||||
enabled: false
|
|
||||||
filter:
|
|
||||||
stat:
|
|
||||||
log-slow-sql: true
|
|
||||||
slow-sql-millis: 1000
|
|
||||||
merge-sql: false
|
|
||||||
wall:
|
|
||||||
config:
|
|
||||||
multi-statement-allow: true
|
|
||||||
data:
|
|
||||||
redis:
|
|
||||||
host: 127.0.0.1 # Redis服务器地址
|
|
||||||
port: 6379 # Redis服务器连接端口
|
|
||||||
password: # Redis服务器连接密码(默认为空)
|
|
||||||
database: 0 # Redis数据库索引(默认为0)
|
|
||||||
timeout: 10000ms # 连接超时时间(毫秒)
|
|
||||||
lettuce:
|
|
||||||
pool:
|
|
||||||
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
|
|
||||||
max-idle: 8 # 连接池中的最大空闲连接
|
|
||||||
min-idle: 0 # 连接池中的最小空闲连接
|
|
||||||
shutdown-timeout: 100ms # 客户端优雅关闭的等待时间
|
|
||||||
Generated
-12117
File diff suppressed because it is too large
Load Diff
@@ -47,6 +47,7 @@ export default {
|
|||||||
addModel(params, callback) {
|
addModel(params, callback) {
|
||||||
const { modelType, provideCode, formData } = params;
|
const { modelType, provideCode, formData } = params;
|
||||||
const postData = {
|
const postData = {
|
||||||
|
id: formData.id,
|
||||||
modelCode: formData.modelCode,
|
modelCode: formData.modelCode,
|
||||||
modelName: formData.modelName,
|
modelName: formData.modelName,
|
||||||
isDefault: formData.isDefault ? 1 : 0,
|
isDefault: formData.isDefault ? 1 : 0,
|
||||||
|
|||||||
@@ -28,6 +28,10 @@
|
|||||||
<div style="height: 2px; background: #e9e9e9; margin-bottom: 22px;"></div>
|
<div style="height: 2px; background: #e9e9e9; margin-bottom: 22px;"></div>
|
||||||
<el-form :model="formData" label-width="100px" label-position="left" class="custom-form">
|
<el-form :model="formData" label-width="100px" label-position="left" class="custom-form">
|
||||||
<div style="display: flex; gap: 20px; margin-bottom: 0;">
|
<div style="display: flex; gap: 20px; margin-bottom: 0;">
|
||||||
|
<el-form-item :label="$t('modelConfigDialog.modelId')" prop="id" style="flex: 1;">
|
||||||
|
<el-input v-model="formData.id" :placeholder="$t('modelConfigDialog.enterModelId')"
|
||||||
|
class="custom-input-bg"></el-input>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item :label="$t('modelConfigDialog.modelName')" prop="modelName" style="flex: 1;">
|
<el-form-item :label="$t('modelConfigDialog.modelName')" prop="modelName" style="flex: 1;">
|
||||||
<el-input v-model="formData.modelName" :placeholder="$t('modelConfigDialog.enterModelName')"
|
<el-input v-model="formData.modelName" :placeholder="$t('modelConfigDialog.enterModelName')"
|
||||||
class="custom-input-bg"></el-input>
|
class="custom-input-bg"></el-input>
|
||||||
@@ -107,6 +111,7 @@ export default {
|
|||||||
providerFields: [],
|
providerFields: [],
|
||||||
currentProvider: null,
|
currentProvider: null,
|
||||||
formData: {
|
formData: {
|
||||||
|
id: '',
|
||||||
modelName: '',
|
modelName: '',
|
||||||
modelCode: '',
|
modelCode: '',
|
||||||
supplier: '',
|
supplier: '',
|
||||||
@@ -202,6 +207,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const submitData = {
|
const submitData = {
|
||||||
|
id: this.formData.id || '',
|
||||||
modelName: this.formData.modelName || '',
|
modelName: this.formData.modelName || '',
|
||||||
modelCode: this.formData.modelCode || '',
|
modelCode: this.formData.modelCode || '',
|
||||||
supplier: this.formData.supplier,
|
supplier: this.formData.supplier,
|
||||||
@@ -230,6 +236,7 @@ export default {
|
|||||||
resetForm() {
|
resetForm() {
|
||||||
this.saving = false;
|
this.saving = false;
|
||||||
this.formData = {
|
this.formData = {
|
||||||
|
id: '',
|
||||||
modelName: '',
|
modelName: '',
|
||||||
modelCode: '',
|
modelCode: '',
|
||||||
supplier: '',
|
supplier: '',
|
||||||
|
|||||||
@@ -841,6 +841,8 @@ export default {
|
|||||||
'modelConfigDialog.modelInfo': 'Model Information',
|
'modelConfigDialog.modelInfo': 'Model Information',
|
||||||
'modelConfigDialog.enable': 'Enable',
|
'modelConfigDialog.enable': 'Enable',
|
||||||
'modelConfigDialog.setDefault': 'Set as Default',
|
'modelConfigDialog.setDefault': 'Set as Default',
|
||||||
|
'modelConfigDialog.modelId': 'Model ID',
|
||||||
|
'modelConfigDialog.enterModelId': 'If not filled in, it will be generated automatically',
|
||||||
'modelConfigDialog.modelName': 'Model Name',
|
'modelConfigDialog.modelName': 'Model Name',
|
||||||
'modelConfigDialog.enterModelName': 'Please enter model name',
|
'modelConfigDialog.enterModelName': 'Please enter model name',
|
||||||
'modelConfigDialog.modelCode': 'Model Code',
|
'modelConfigDialog.modelCode': 'Model Code',
|
||||||
|
|||||||
@@ -841,6 +841,8 @@ export default {
|
|||||||
'modelConfigDialog.modelInfo': '模型信息',
|
'modelConfigDialog.modelInfo': '模型信息',
|
||||||
'modelConfigDialog.enable': '是否启用',
|
'modelConfigDialog.enable': '是否启用',
|
||||||
'modelConfigDialog.setDefault': '设为默认',
|
'modelConfigDialog.setDefault': '设为默认',
|
||||||
|
'modelConfigDialog.modelId': '模型ID',
|
||||||
|
'modelConfigDialog.enterModelId': '未填写将自动生成模型ID',
|
||||||
'modelConfigDialog.modelName': '模型名称',
|
'modelConfigDialog.modelName': '模型名称',
|
||||||
'modelConfigDialog.enterModelName': '请输入模型名称',
|
'modelConfigDialog.enterModelName': '请输入模型名称',
|
||||||
'modelConfigDialog.modelCode': '模型编码',
|
'modelConfigDialog.modelCode': '模型编码',
|
||||||
|
|||||||
@@ -841,6 +841,8 @@ export default {
|
|||||||
'modelConfigDialog.modelInfo': '模型信息',
|
'modelConfigDialog.modelInfo': '模型信息',
|
||||||
'modelConfigDialog.enable': '是否啟用',
|
'modelConfigDialog.enable': '是否啟用',
|
||||||
'modelConfigDialog.setDefault': '設為默認',
|
'modelConfigDialog.setDefault': '設為默認',
|
||||||
|
'modelConfigDialog.modelId': '模型ID',
|
||||||
|
'modelConfigDialog.enterModelId': '未填冩將自動生成模型ID',
|
||||||
'modelConfigDialog.modelName': '模型名稱',
|
'modelConfigDialog.modelName': '模型名稱',
|
||||||
'modelConfigDialog.enterModelName': '請輸入模型名稱',
|
'modelConfigDialog.enterModelName': '請輸入模型名稱',
|
||||||
'modelConfigDialog.modelCode': '模型編碼',
|
'modelConfigDialog.modelCode': '模型編碼',
|
||||||
|
|||||||
Reference in New Issue
Block a user