From 29c7b2a92029c8bf18b4203e7c8d0607abe7a51c Mon Sep 17 00:00:00 2001 From: JianYu Zheng <2375294554@qq.com> Date: Wed, 23 Jul 2025 15:59:22 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E6=99=BA=E8=83=BD=E4=BD=93=E9=85=8D=E7=BD=AE=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20--AgentServiceImpl.java=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E4=BD=93=E9=85=8D=E7=BD=AE=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0`=E5=A4=A7=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=92=8C=E6=84=8F=E5=9B=BE=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E7=AC=A6=E5=90=88=E5=8C=B9=E9=85=8D`?= =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/service/impl/AgentServiceImpl.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index 36aa1192..f07b7c14 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -41,6 +41,7 @@ import xiaozhi.modules.agent.service.AgentTemplateService; import xiaozhi.modules.agent.vo.AgentInfoVO; import xiaozhi.modules.device.service.DeviceService; import xiaozhi.modules.model.dto.ModelProviderDTO; +import xiaozhi.modules.model.entity.ModelConfigEntity; import xiaozhi.modules.model.service.ModelConfigService; import xiaozhi.modules.model.service.ModelProviderService; import xiaozhi.modules.security.user.SecurityUser; @@ -324,9 +325,31 @@ public class AgentServiceImpl extends BaseServiceImpl imp // 删除音频数据 agentChatHistoryService.deleteByAgentId(existingEntity.getId(), true, false); } + + boolean b = validateLLMIntentParams(dto.getLlmModelId(), dto.getIntentModelId()); + if(!b){ + throw new RenException("LLM大模型和Intent意图识别,选择参数不匹配"); + } this.updateById(existingEntity); } + /** + * 验证大语言模型和意图识别的参数是否符合匹配 + * @param llmModelId 大语言模型id + * @param intentModelId 意图识别id + * @return T 匹配 : F 不匹配 + */ + private boolean validateLLMIntentParams(String llmModelId,String intentModelId){ + ModelConfigEntity llmModelData = modelConfigService.selectById(llmModelId); + String type = llmModelData.getConfigJson().get("type").toString(); + // 如果查询大语言模型是openai或者ollama,意图识别选参数都可以 + if("openai".equals(type) || "ollama".equals(type)){ + return true; + } + // 除了openai和ollama的类型,不可以选择id为Intent_nointent(无意图识别)的意图识别 + return !"Intent_nointent".equals(intentModelId); + } + @Override @Transactional(rollbackFor = Exception.class) public String createAgent(AgentCreateDTO dto) { From be7146fa891811451e81d5114a49ed1b5014f124 Mon Sep 17 00:00:00 2001 From: JianYu Zheng <2375294554@qq.com> Date: Thu, 24 Jul 2025 11:50:15 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E8=8E=B7=E5=8F=96llm=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A8=A1=E5=9E=8B=E4=BF=A1=E6=81=AF=20--LlmM?= =?UTF-8?q?odelBasicInfoDTO.java=20=E6=96=B0=E7=9A=84llm=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A8=A1=E5=9E=8B=E4=BF=A1=E6=81=AF=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=AF=B9=E8=B1=A1=20--ModelConfigService.java=20--Mod?= =?UTF-8?q?elConfigServiceImpl.java=20--ModelController.java=20=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=EF=BC=8C=E5=AE=9E=E7=8E=B0=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E6=8E=A5=E5=8F=A3=E3=80=82=E4=B8=80=E4=B8=AA=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=8E=B7=E5=8F=96LLM=E6=A8=A1=E5=9E=8B=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=EF=BC=9A=E4=BF=A1=E6=81=AF=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=8C=85=E6=8B=ACid=EF=BC=8C=E5=90=8D=E7=A7=B0=EF=BC=8Ctype?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/controller/ModelController.java | 14 +++++++---- .../model/dto/LlmModelBasicInfoDTO.java | 13 ++++++++++ .../model/service/ModelConfigService.java | 3 +++ .../service/impl/ModelConfigServiceImpl.java | 24 +++++++++++++++---- 4 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/model/dto/LlmModelBasicInfoDTO.java diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java index 8baff29d..32a5c0cc 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/controller/ModelController.java @@ -21,11 +21,7 @@ import xiaozhi.common.utils.ConvertUtils; import xiaozhi.common.utils.Result; import xiaozhi.modules.agent.service.AgentTemplateService; import xiaozhi.modules.config.service.ConfigService; -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.dto.VoiceDTO; +import xiaozhi.modules.model.dto.*; import xiaozhi.modules.model.entity.ModelConfigEntity; import xiaozhi.modules.model.service.ModelConfigService; import xiaozhi.modules.model.service.ModelProviderService; @@ -52,6 +48,14 @@ public class ModelController { return new Result>().ok(modelList); } + @GetMapping("/llm/names") + @Operation(summary = "获取LLM模型信息") + @RequiresPermissions("sys:role:normal") + public Result> getLlmModelCodeList(@RequestParam(required = false) String modelName) { + List llmModelCodeList = modelConfigService.getLlmModelCodeList(modelName); + return new Result>().ok(llmModelCodeList); + } + @GetMapping("/{modelType}/provideTypes") @Operation(summary = "获取模型供应器列表") @RequiresPermissions("sys:role:superAdmin") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/dto/LlmModelBasicInfoDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/LlmModelBasicInfoDTO.java new file mode 100644 index 00000000..3995ceb8 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/dto/LlmModelBasicInfoDTO.java @@ -0,0 +1,13 @@ +package xiaozhi.modules.model.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * LLM的模型的基础展示数据 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class LlmModelBasicInfoDTO extends ModelBasicInfoDTO{ + private String type; +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java index 9d15ac6d..634101e3 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/ModelConfigService.java @@ -4,6 +4,7 @@ import java.util.List; import xiaozhi.common.page.PageData; import xiaozhi.common.service.BaseService; +import xiaozhi.modules.model.dto.LlmModelBasicInfoDTO; import xiaozhi.modules.model.dto.ModelBasicInfoDTO; import xiaozhi.modules.model.dto.ModelConfigBodyDTO; import xiaozhi.modules.model.dto.ModelConfigDTO; @@ -13,6 +14,8 @@ public interface ModelConfigService extends BaseService { List getModelCodeList(String modelType, String modelName); + List getLlmModelCodeList(String modelName); + PageData getPageList(String modelType, String modelName, String page, String limit); ModelConfigDTO add(String modelType, String provideCode, ModelConfigBodyDTO modelConfigBodyDTO); diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java index 1f006d93..046b440e 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java @@ -23,10 +23,7 @@ import xiaozhi.common.utils.ConvertUtils; import xiaozhi.modules.agent.dao.AgentDao; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.model.dao.ModelConfigDao; -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.dto.*; import xiaozhi.modules.model.entity.ModelConfigEntity; import xiaozhi.modules.model.service.ModelConfigService; import xiaozhi.modules.model.service.ModelProviderService; @@ -51,6 +48,25 @@ public class ModelConfigServiceImpl extends BaseServiceImpl getLlmModelCodeList(String modelName) { + List entities = modelConfigDao.selectList( + new QueryWrapper() + .eq("model_type", "llm") + .eq("is_enabled", 1) + .like(StringUtils.isNotBlank(modelName), "model_name", "%" + modelName + "%") + .select("id", "model_name","config_json")); + // 处理获取到的内容 + return entities.stream().map(item -> { + LlmModelBasicInfoDTO dto = new LlmModelBasicInfoDTO(); + dto.setId(item.getId()); + dto.setModelName(item.getModelName()); + String type = item.getConfigJson().get("type").toString(); + dto.setType(type); + return dto; + }).toList(); + } + @Override public PageData getPageList(String modelType, String modelName, String page, String limit) { From 8d11b47241e523321408f8f83b06e0dba5a405b9 Mon Sep 17 00:00:00 2001 From: JianYu Zheng <2375294554@qq.com> Date: Thu, 24 Jul 2025 16:17:27 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=96=B0?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=A4=A7=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E6=A8=A1=E5=9E=8B=E5=92=8C=E6=84=8F=E5=9B=BE=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=85=B3=E7=B3=BB=E7=9A=84=E9=80=89=E6=8B=A9=E5=88=A4?= =?UTF-8?q?=E6=96=AD=20--model.js=20=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=96=B9=E6=B3=95=20--roleConfig.vue=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=99=BA=E8=83=BD=E4=BD=93=E9=85=8D=E7=BD=AE,?= =?UTF-8?q?=E5=BD=93=E9=80=89=E6=8B=A9=E7=9A=84LLM=E4=B8=8D=E6=98=AFopenai?= =?UTF-8?q?=E3=80=81ollama=E7=B1=BB=E5=9E=8B=E6=97=B6,=E6=84=8F=E5=9B=BE?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=B8=8D=E8=83=BD=E9=80=89=E6=8B=A9=E2=80=9C?= =?UTF-8?q?=E6=97=A0=E6=84=8F=E5=9B=BE=E8=AF=86=E5=88=AB=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/manager-web/src/apis/module/model.js | 16 ++++++ main/manager-web/src/views/roleConfig.vue | 64 ++++++++++++++++++----- 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/main/manager-web/src/apis/module/model.js b/main/manager-web/src/apis/module/model.js index 7db2b288..d103ee79 100644 --- a/main/manager-web/src/apis/module/model.js +++ b/main/manager-web/src/apis/module/model.js @@ -106,6 +106,22 @@ export default { }); }).send(); }, + // 获取LLM模型名称列表 + getLlmModelCodeList(modelName, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/models/llm/names`) + .method('GET') + .data({ modelName }) + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail(() => { + RequestService.reAjaxFun(() => { + this.getLlmModelCodeList(modelName, callback); + }); + }).send(); + }, // 获取模型音色列表 getModelVoices(modelId, voiceName, callback) { const queryParams = new URLSearchParams({ diff --git a/main/manager-web/src/views/roleConfig.vue b/main/manager-web/src/views/roleConfig.vue index ccd96e1b..ff9ac6d2 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -89,7 +89,7 @@
-
@@ -130,7 +130,6 @@
- @@ -173,8 +172,9 @@ export default { { label: '视觉大模型(VLLM)', key: 'vllmModelId', type: 'VLLM' }, { label: '意图识别(Intent)', key: 'intentModelId', type: 'Intent' }, { label: '记忆(Memory)', key: 'memModelId', type: 'Memory' }, - { label: '语音合成(TTS)', key: 'ttsModelId', type: 'TTS' }, + { label: '语音合成(TTS)', key: 'ttsModelId', type: 'TTS' } ], + llmModeTypeMap: new Map(), modelOptions: {}, templates: [], loadingTemplate: false, @@ -364,16 +364,36 @@ export default { }, fetchModelOptions() { this.models.forEach(model => { - Api.model.getModelNames(model.type, '', ({ data }) => { - if (data.code === 0) { - this.$set(this.modelOptions, model.type, data.data.map(item => ({ - value: item.id, - label: item.modelName - }))); - } else { - this.$message.error(data.msg || '获取模型列表失败'); - } - }); + if (model.type != "LLM") { + Api.model.getModelNames(model.type, '', ({ data }) => { + if (data.code === 0) { + this.$set(this.modelOptions, model.type, data.data.map(item => ({ + value: item.id, + label: item.modelName, + isHidden: false + }))); + } else { + this.$message.error(data.msg || '获取模型列表失败'); + } + }); + } else { + Api.model.getLlmModelCodeList('', ({ data }) => { + if (data.code === 0) { + let LLMdata = [] + data.data.forEach(item => { + LLMdata.push({ + value: item.id, + label: item.modelName, + isHidden: false + }) + this.llmModeTypeMap.set(item.id, item.type) + }) + this.$set(this.modelOptions, model.type, LLMdata); + } else { + this.$message.error(data.msg || '获取LLM模型列表失败'); + } + }); + } }); }, fetchVoiceOptions(modelId) { @@ -410,6 +430,24 @@ export default { if (type === 'Memory' && value !== 'Memory_nomem' && (this.form.chatHistoryConf === 0 || this.form.chatHistoryConf === null)) { this.form.chatHistoryConf = 2; } + if (type === 'LLM') { + let llmType = this.llmModeTypeMap.get(value) + let memory + for (let item of this.modelOptions['Intent']) { + if(item.value == "Intent_nointent" ) { + memory = item + break + } + } + if (llmType == "openai" || llmType == "ollama") { + memory.isHidden = false + }else{ + memory.isHidden = true + } + if(this.form.model.intentModelId == "Intent_nointent"){ + this.form.model.intentModelId = ''; + } + } }, fetchAllFunctions() { return new Promise((resolve, reject) => { From fdbe5fa556c90cacbef158dfc66413bce1e00b3d Mon Sep 17 00:00:00 2001 From: JianYu Zheng <2375294554@qq.com> Date: Thu, 24 Jul 2025 17:01:43 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=A8=A1=E5=9E=8B=E9=85=8D=E7=BD=AE=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=20--ModelConfigServiceImpl.java=20=E4=BF=AE=E6=94=B9=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=EF=BC=8CjsonConfig=20=E9=87=8C=E5=8C=85=E6=8B=ACllm,?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=B8=80=E4=B8=8Bllm=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=97=B6=E5=9C=A8LLM=E6=A8=A1=E5=9E=8B=E9=87=8C,=E5=B9=B6?= =?UTF-8?q?=E4=B8=94=E8=BF=99=E4=B8=AA=E6=A8=A1=E5=9E=8B=E7=9A=84=E4=BE=9B?= =?UTF-8?q?=E5=BA=94=E5=99=A8=E7=B1=BB=E5=9E=8B=E5=8F=AA=E8=83=BD=E6=98=AF?= =?UTF-8?q?openai=E5=92=8Collama=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/service/impl/ModelConfigServiceImpl.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java index 046b440e..0e85eba9 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -110,6 +111,19 @@ public class ModelConfigServiceImpl extends BaseServiceImpl() + .eq(ModelConfigEntity::getId, llm)); + if(modelConfigEntity == null){ + throw new RenException("设置的LLM不存在"); + } + String type = modelConfigEntity.getConfigJson().get("type").toString(); + // 如果查询大语言模型是openai或者ollama,意图识别选参数都可以 + if(!"openai".equals(type) && !"ollama".equals(type)){ + throw new RenException("设置的LLM不是openai和ollama"); + } + } // 再更新供应器提供的模型 ModelConfigEntity modelConfigEntity = ConvertUtils.sourceToTarget(modelConfigBodyDTO, ModelConfigEntity.class); From 3939c81044c0b43a4d11f174e61d55e895f2455f Mon Sep 17 00:00:00 2001 From: JianYu Zheng <2375294554@qq.com> Date: Thu, 24 Jul 2025 17:13:05 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=9A=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=A8=A1=E5=9E=8B=E7=9A=84=E9=AA=8C=E8=AF=81=20--Mode?= =?UTF-8?q?lConfigServiceImpl.java=20=E5=88=A0=E9=99=A4=E8=A7=86=E8=A7=89?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=97=B6=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E4=BA=86,=E5=B0=B1=E4=B8=8D=E8=83=BD=E5=88=A0?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/model/service/impl/ModelConfigServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java index 0e85eba9..c0931277 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java @@ -167,6 +167,8 @@ public class ModelConfigServiceImpl extends BaseServiceImpl Date: Fri, 25 Jul 2025 21:47:21 +0800 Subject: [PATCH 6/6] =?UTF-8?q?update:=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/service/impl/AgentServiceImpl.java | 13 ++-- .../service/impl/ModelConfigServiceImpl.java | 20 +++--- main/manager-web/src/views/roleConfig.vue | 62 ++++++++++++++----- 3 files changed, 66 insertions(+), 29 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index f07b7c14..96a4d014 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -327,7 +327,7 @@ public class AgentServiceImpl extends BaseServiceImpl imp } boolean b = validateLLMIntentParams(dto.getLlmModelId(), dto.getIntentModelId()); - if(!b){ + if (!b) { throw new RenException("LLM大模型和Intent意图识别,选择参数不匹配"); } this.updateById(existingEntity); @@ -335,19 +335,20 @@ public class AgentServiceImpl extends BaseServiceImpl imp /** * 验证大语言模型和意图识别的参数是否符合匹配 - * @param llmModelId 大语言模型id + * + * @param llmModelId 大语言模型id * @param intentModelId 意图识别id * @return T 匹配 : F 不匹配 */ - private boolean validateLLMIntentParams(String llmModelId,String intentModelId){ + private boolean validateLLMIntentParams(String llmModelId, String intentModelId) { ModelConfigEntity llmModelData = modelConfigService.selectById(llmModelId); String type = llmModelData.getConfigJson().get("type").toString(); // 如果查询大语言模型是openai或者ollama,意图识别选参数都可以 - if("openai".equals(type) || "ollama".equals(type)){ + if ("openai".equals(type) || "ollama".equals(type)) { return true; } - // 除了openai和ollama的类型,不可以选择id为Intent_nointent(无意图识别)的意图识别 - return !"Intent_nointent".equals(intentModelId); + // 除了openai和ollama的类型,不可以选择id为Intent_function_call(函数调用)的意图识别 + return !"Intent_function_call".equals(intentModelId); } @Override diff --git a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java index c0931277..c156b408 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/model/service/impl/ModelConfigServiceImpl.java @@ -5,10 +5,10 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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; @@ -24,7 +24,11 @@ import xiaozhi.common.utils.ConvertUtils; import xiaozhi.modules.agent.dao.AgentDao; import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.model.dao.ModelConfigDao; -import xiaozhi.modules.model.dto.*; +import xiaozhi.modules.model.dto.LlmModelBasicInfoDTO; +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.service.ModelConfigService; import xiaozhi.modules.model.service.ModelProviderService; @@ -49,6 +53,7 @@ public class ModelConfigServiceImpl extends BaseServiceImpl getLlmModelCodeList(String modelName) { List entities = modelConfigDao.selectList( @@ -56,7 +61,7 @@ public class ModelConfigServiceImpl extends BaseServiceImpl { LlmModelBasicInfoDTO dto = new LlmModelBasicInfoDTO(); @@ -68,7 +73,6 @@ public class ModelConfigServiceImpl extends BaseServiceImpl getPageList(String modelType, String modelName, String page, String limit) { Map params = new HashMap(); @@ -111,16 +115,18 @@ public class ModelConfigServiceImpl extends BaseServiceImpl() .eq(ModelConfigEntity::getId, llm)); - if(modelConfigEntity == null){ + String selectModelType = (modelConfigEntity == null || modelConfigEntity.getModelType() == null) ? null + : modelConfigEntity.getModelType().toUpperCase(); + if (modelConfigEntity == null || !"LLM".equals(selectModelType)) { throw new RenException("设置的LLM不存在"); } String type = modelConfigEntity.getConfigJson().get("type").toString(); // 如果查询大语言模型是openai或者ollama,意图识别选参数都可以 - if(!"openai".equals(type) && !"ollama".equals(type)){ + if (!"openai".equals(type) && !"ollama".equals(type)) { throw new RenException("设置的LLM不是openai和ollama"); } } diff --git a/main/manager-web/src/views/roleConfig.vue b/main/manager-web/src/views/roleConfig.vue index ff9ac6d2..bbba01bd 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -356,6 +356,9 @@ export default { }); // 备份原始,以备取消时恢复 this.originalFunctions = JSON.parse(JSON.stringify(this.currentFunctions)); + + // 确保意图识别选项的可见性正确 + this.updateIntentOptionsVisibility(); }); } else { this.$message.error(data.msg || '获取配置失败'); @@ -372,6 +375,11 @@ export default { label: item.modelName, isHidden: false }))); + + // 如果是意图识别选项,需要根据当前LLM类型更新可见性 + if (model.type === 'Intent') { + this.updateIntentOptionsVisibility(); + } } else { this.$message.error(data.msg || '获取模型列表失败'); } @@ -431,22 +439,8 @@ export default { this.form.chatHistoryConf = 2; } if (type === 'LLM') { - let llmType = this.llmModeTypeMap.get(value) - let memory - for (let item of this.modelOptions['Intent']) { - if(item.value == "Intent_nointent" ) { - memory = item - break - } - } - if (llmType == "openai" || llmType == "ollama") { - memory.isHidden = false - }else{ - memory.isHidden = true - } - if(this.form.model.intentModelId == "Intent_nointent"){ - this.form.model.intentModelId = ''; - } + // 当LLM类型改变时,更新意图识别选项的可见性 + this.updateIntentOptionsVisibility(); } }, fetchAllFunctions() { @@ -488,6 +482,42 @@ export default { } this.showFunctionDialog = false; }, + updateIntentOptionsVisibility() { + // 根据当前选择的LLM类型更新意图识别选项的可见性 + const currentLlmId = this.form.model.llmModelId; + if (!currentLlmId || !this.modelOptions['Intent']) return; + + const llmType = this.llmModeTypeMap.get(currentLlmId); + if (!llmType) return; + + this.modelOptions['Intent'].forEach(item => { + if (item.value === "Intent_function_call") { + // 如果llmType是openai或ollama,允许选择function_call + // 否则隐藏function_call选项 + if (llmType === "openai" || llmType === "ollama") { + item.isHidden = false; + } else { + item.isHidden = true; + } + } else { + // 其他意图识别选项始终可见 + item.isHidden = false; + } + }); + + // 如果当前选择的意图识别是function_call,但LLM类型不支持,则设置为可选的第一项 + if (this.form.model.intentModelId === "Intent_function_call" && + llmType !== "openai" && llmType !== "ollama") { + // 找到第一个可见的选项 + const firstVisibleOption = this.modelOptions['Intent'].find(item => !item.isHidden); + if (firstVisibleOption) { + this.form.model.intentModelId = firstVisibleOption.value; + } else { + // 如果没有可见选项,设置为Intent_nointent + this.form.model.intentModelId = 'Intent_nointent'; + } + } + }, updateChatHistoryConf() { if (this.form.model.memModelId === 'Memory_nomem') { this.form.chatHistoryConf = 0;