package xiaozhi.modules.model.controller; import java.util.List; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import xiaozhi.common.page.PageData; 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.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.dto.VoiceDTO; import xiaozhi.modules.model.entity.ModelConfigEntity; import xiaozhi.modules.model.service.ModelConfigService; import xiaozhi.modules.model.service.ModelProviderService; import xiaozhi.modules.timbre.service.TimbreService; @AllArgsConstructor @RestController @RequestMapping("/models") @Tag(name = "模型配置") public class ModelController { private final ModelProviderService modelProviderService; private final TimbreService timbreService; private final ModelConfigService modelConfigService; private final ConfigService configService; private final AgentTemplateService agentTemplateService; @GetMapping("/names") @Operation(summary = "获取所有模型名称") @RequiresPermissions("sys:role:normal") public Result> getModelNames(@RequestParam String modelType, @RequestParam(required = false) String modelName) { List modelList = modelConfigService.getModelCodeList(modelType, modelName); 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") public Result> getModelProviderList(@PathVariable String modelType) { List modelProviderDTOS = modelProviderService.getListByModelType(modelType); return new Result>().ok(modelProviderDTOS); } @GetMapping("/list") @Operation(summary = "获取模型配置列表") @RequiresPermissions("sys:role:superAdmin") public Result> getModelConfigList( @RequestParam(required = true) String modelType, @RequestParam(required = false) String modelName, @RequestParam(required = true, defaultValue = "0") String page, @RequestParam(required = true, defaultValue = "10") String limit) { PageData pageList = modelConfigService.getPageList(modelType, modelName, page, limit); return new Result>().ok(pageList); } @PostMapping("/{modelType}/{provideCode}") @Operation(summary = "新增模型配置") @RequiresPermissions("sys:role:superAdmin") public Result addModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) { ModelConfigDTO modelConfigDTO = modelConfigService.add(modelType, provideCode, modelConfigBodyDTO); configService.getConfig(false); return new Result().ok(modelConfigDTO); } @PutMapping("/{modelType}/{provideCode}/{id}") @Operation(summary = "编辑模型配置") @RequiresPermissions("sys:role:superAdmin") public Result editModelConfig(@PathVariable String modelType, @PathVariable String provideCode, @PathVariable String id, @RequestBody ModelConfigBodyDTO modelConfigBodyDTO) { ModelConfigDTO modelConfigDTO = modelConfigService.edit(modelType, provideCode, id, modelConfigBodyDTO); configService.getConfig(false); return new Result().ok(modelConfigDTO); } @DeleteMapping("/{id}") @Operation(summary = "删除模型配置") @RequiresPermissions("sys:role:superAdmin") public Result deleteModelConfig(@PathVariable String id) { modelConfigService.delete(id); return new Result<>(); } @GetMapping("/{id}") @Operation(summary = "获取模型配置") @RequiresPermissions("sys:role:superAdmin") public Result getModelConfig(@PathVariable String id) { ModelConfigEntity item = modelConfigService.selectById(id); ModelConfigDTO modelConfigDTO = ConvertUtils.sourceToTarget(item, ModelConfigDTO.class); return new Result().ok(modelConfigDTO); } @PutMapping("/enable/{id}/{status}") @Operation(summary = "启用/关闭模型配置") @RequiresPermissions("sys:role:superAdmin") public Result enableModelConfig(@PathVariable String id, @PathVariable Integer status) { ModelConfigEntity entity = modelConfigService.selectById(id); if (entity == null) { return new Result().error("模型配置不存在"); } // 不能关闭默认模型 if (status == 0 && entity.getIsDefault() > 0) { return new Result().error("默认模型配置不允许关闭"); } // 不更新ConfigJson字段 entity.setConfigJson(null); entity.setIsEnabled(status); modelConfigService.updateById(entity); return new Result(); } @PutMapping("/default/{id}") @Operation(summary = "设置默认模型") @RequiresPermissions("sys:role:superAdmin") public Result setDefaultModel(@PathVariable String id) { ModelConfigEntity entity = modelConfigService.selectById(id); if (entity == null) { return new Result().error("模型配置不存在"); } // 将其他模型设置为非默认 modelConfigService.setDefaultModel(entity.getModelType(), 0); entity.setIsEnabled(1); entity.setIsDefault(1); // 不更新ConfigJson字段 entity.setConfigJson(null); modelConfigService.updateById(entity); // 更新模板表中对应的模型ID agentTemplateService.updateDefaultTemplateModelId(entity.getModelType(), entity.getId()); configService.getConfig(false); return new Result(); } @GetMapping("/{modelId}/voices") @Operation(summary = "获取模型音色") @RequiresPermissions("sys:role:normal") public Result> getVoiceList(@PathVariable String modelId, @RequestParam(required = false) String voiceName) { List voiceList = timbreService.getVoiceNames(modelId, voiceName); return new Result>().ok(voiceList); } }