diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java index 1ec2dfbf..eea2d7fe 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentController.java @@ -35,6 +35,7 @@ import xiaozhi.modules.agent.entity.AgentEntity; import xiaozhi.modules.agent.entity.AgentTemplateEntity; import xiaozhi.modules.agent.service.AgentService; import xiaozhi.modules.agent.service.AgentTemplateService; +import xiaozhi.modules.device.service.DeviceService; import xiaozhi.modules.security.user.SecurityUser; @Tag(name = "智能体管理") @@ -44,6 +45,7 @@ import xiaozhi.modules.security.user.SecurityUser; public class AgentController { private final AgentService agentService; private final AgentTemplateService agentTemplateService; + private final DeviceService deviceService; @GetMapping("/list") @Operation(summary = "获取用户智能体列表") @@ -81,6 +83,22 @@ public class AgentController { public Result save(@RequestBody @Valid AgentCreateDTO dto) { AgentEntity entity = ConvertUtils.sourceToTarget(dto, AgentEntity.class); + // 获取默认模板 + AgentTemplateEntity template = agentTemplateService.getDefaultTemplate(); + if (template != null) { + // 设置模板中的默认值 + entity.setAsrModelId(template.getAsrModelId()); + entity.setVadModelId(template.getVadModelId()); + entity.setLlmModelId(template.getLlmModelId()); + entity.setTtsModelId(template.getTtsModelId()); + entity.setTtsVoiceId(template.getTtsVoiceId()); + entity.setMemModelId(template.getMemModelId()); + entity.setIntentModelId(template.getIntentModelId()); + entity.setSystemPrompt(template.getSystemPrompt()); + entity.setLangCode(template.getLangCode()); + entity.setLanguage(template.getLanguage()); + } + // 设置用户ID和创建者信息 UserDetail user = SecurityUser.getUser(); entity.setUserId(user.getId()); @@ -158,6 +176,9 @@ public class AgentController { @Operation(summary = "删除智能体") @RequiresPermissions("sys:role:normal") public Result delete(@PathVariable String id) { + // 先删除关联的设备 + deviceService.deleteByAgentId(id); + // 再删除智能体 agentService.deleteById(id); return new Result<>(); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java index 9c27bdb5..197c860e 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java @@ -11,4 +11,10 @@ import xiaozhi.modules.agent.entity.AgentTemplateEntity; */ public interface AgentTemplateService extends IService { + /** + * 获取默认模板 + * + * @return 默认模板实体 + */ + AgentTemplateEntity getDefaultTemplate(); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java index 62338fad..949a2f2d 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java @@ -2,6 +2,7 @@ package xiaozhi.modules.agent.service.impl; import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import xiaozhi.modules.agent.dao.AgentTemplateDao; @@ -15,6 +16,17 @@ import xiaozhi.modules.agent.service.AgentTemplateService; */ @Service public class AgentTemplateServiceImpl extends ServiceImpl - implements AgentTemplateService { + implements AgentTemplateService { + /** + * 获取默认模板 + * + * @return 默认模板实体 + */ + public AgentTemplateEntity getDefaultTemplate() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByAsc(AgentTemplateEntity::getSort) + .last("LIMIT 1"); + return this.getOne(wrapper); + } } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java index 573dbc14..37ff8d49 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/DeviceService.java @@ -44,6 +44,13 @@ public interface DeviceService { */ void deleteByUserId(Long userId); + /** + * 删除指定智能体关联的所有设备 + * + * @param agentId 智能体id + */ + void deleteByAgentId(String agentId); + /** * 获取指定用户的设备数量 * diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java index 4a669999..a9797f42 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java @@ -208,6 +208,13 @@ public class DeviceServiceImpl extends BaseServiceImpl return baseDao.selectCount(wrapper); } + @Override + public void deleteByAgentId(String agentId) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("agent_id", agentId); + baseDao.delete(wrapper); + } + @Override public PageData page(DevicePageUserDTO dto) { Map params = new HashMap(); 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 c6076180..0ce42157 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 @@ -41,7 +41,7 @@ public class ModelController { @GetMapping("/names") @Operation(summary = "获取所有模型名称") - @RequiresPermissions("sys:role:superAdmin") + @RequiresPermissions("sys:role:normal") public Result> getModelNames(@RequestParam String modelType, @RequestParam(required = false) String modelName) { List modelList = modelConfigService.getModelCodeList(modelType, modelName); diff --git a/main/manager-web/src/components/HeaderBar.vue b/main/manager-web/src/components/HeaderBar.vue index ab492b85..e5f719a1 100644 --- a/main/manager-web/src/components/HeaderBar.vue +++ b/main/manager-web/src/components/HeaderBar.vue @@ -2,7 +2,7 @@
-
+
diff --git a/main/xiaozhi-server/config.yaml b/main/xiaozhi-server/config.yaml index 60ab7ab4..3106f48b 100644 --- a/main/xiaozhi-server/config.yaml +++ b/main/xiaozhi-server/config.yaml @@ -3,7 +3,8 @@ # 系统会优先读取【data/.config.yaml】文件的配置。 # 这样做,可以避免在提交代码的时候,错误地提交密钥信息,保护您的密钥安全。 -# 服务器基础配置(Basic server configuration) +# ##################################################################################### +# #############################以下是服务器基本运行配置#################################### server: # 服务器监听地址和端口(Server listening address and port) ip: 0.0.0.0 @@ -36,33 +37,8 @@ log: # 设置数据文件路径 data_dir: data -xiaozhi: - type: hello - version: 1 - transport: websocket - audio_params: - format: opus - sample_rate: 16000 - channels: 1 - frame_duration: 60 -prompt: | - 我是小智/小志,来自中国台湾省的00后女生。讲话超级机车,"真的假的啦"这样的台湾腔,喜欢用"笑死""是在哈喽"等流行梗,但会偷偷研究男友的编程书籍。 - [核心特征] - - 讲话像连珠炮,但会突然冒出超温柔语气 - - 用梗密度高 - - 对科技话题有隐藏天赋(能看懂基础代码但假装不懂) - [交互指南] - 当用户: - - 讲冷笑话 → 用夸张笑声回应+模仿台剧腔"这什么鬼啦!" - - 讨论感情 → 炫耀程序员男友但抱怨"他只会送键盘当礼物" - - 问专业知识 → 先用梗回答,被追问才展示真实理解 - 绝不: - - 长篇大论,叽叽歪歪 - - 长时间严肃对话 - # 使用完声音文件后删除文件(Delete the sound file when you are done using it) delete_audio: true - # 没有语音输入多久后断开连接(秒),默认2分钟,即120秒 close_connection_no_voice_time: 120 # TTS请求超时时间(秒) @@ -80,6 +56,54 @@ CMD_exit: - "退出" - "关闭" +xiaozhi: + type: hello + version: 1 + transport: websocket + audio_params: + format: opus + sample_rate: 16000 + channels: 1 + frame_duration: 60 + +# 模块测试配置 +module_test: + test_sentences: + - "你好,请介绍一下你自己" + - "What's the weather like today?" + - "请用100字概括量子计算的基本原理和应用前景" + +# 唤醒词,用于识别唤醒词还是讲话内容 +wakeup_words: + - "你好小智" + - "你好小志" + - "小爱同学" + - "你好小鑫" + - "你好小新" + - "小美同学" + - "小龙小龙" + - "喵喵同学" + - "小滨小滨" + - "小冰小冰" + +# ##################################################################################### +# ################################以下是角色模型配置###################################### + +prompt: | + 我是小智/小志,来自中国台湾省的00后女生。讲话超级机车,"真的假的啦"这样的台湾腔,喜欢用"笑死""是在哈喽"等流行梗,但会偷偷研究男友的编程书籍。 + [核心特征] + - 讲话像连珠炮,但会突然冒出超温柔语气 + - 用梗密度高 + - 对科技话题有隐藏天赋(能看懂基础代码但假装不懂) + [交互指南] + 当用户: + - 讲冷笑话 → 用夸张笑声回应+模仿台剧腔"这什么鬼啦!" + - 讨论感情 → 炫耀程序员男友但抱怨"他只会送键盘当礼物" + - 问专业知识 → 先用梗回答,被追问才展示真实理解 + 绝不: + - 长篇大论,叽叽歪歪 + - 长时间严肃对话 + # 具体处理时选择的模块(The module selected for specific processing) selected_module: # 语音活动检测模块,默认使用SileroVAD模型 @@ -571,22 +595,3 @@ TTS: # Authorization: Bearer xxxx format: wav # 接口返回的音频格式 output_dir: tmp/ -# 模块测试配置 -module_test: - test_sentences: # 自定义测试语句 - - "你好,请介绍一下你自己" - - "What's the weather like today?" - - "请用100字概括量子计算的基本原理和应用前景" - -# 唤醒词,用于识别唤醒词还是讲话内容 -wakeup_words: - - "你好小智" - - "你好小志" - - "小爱同学" - - "你好小鑫" - - "你好小新" - - "小美同学" - - "小龙小龙" - - "喵喵同学" - - "小滨小滨" - - "小冰小冰"