package cn.iocoder.yudao.module.ai.service.model; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelPageReqVO; import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReqVO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; import cn.iocoder.yudao.module.ai.dal.mysql.model.AiModelMapper; import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum; import cn.iocoder.yudao.module.ai.framework.ai.core.model.AiModelFactory; import jakarta.annotation.Resource; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.milvus.MilvusVectorStore; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.*; @Service @Validated public class AiModelServiceImpl implements AiModelService { @Resource private AiApiKeyService apiKeyService; @Resource private AiModelMapper modelMapper; @Resource private AiModelFactory modelFactory; @Override public Long createModel(AiModelSaveReqVO createReqVO) { AiPlatformEnum.validatePlatform(createReqVO.getPlatform()); apiKeyService.validateApiKey(createReqVO.getKeyId()); AiModelDO model = BeanUtils.toBean(createReqVO, AiModelDO.class); modelMapper.insert(model); return model.getId(); } @Override public void updateModel(AiModelSaveReqVO updateReqVO) { validateModelExists(updateReqVO.getId()); AiPlatformEnum.validatePlatform(updateReqVO.getPlatform()); apiKeyService.validateApiKey(updateReqVO.getKeyId()); modelMapper.updateById(BeanUtils.toBean(updateReqVO, AiModelDO.class)); } @Override public void deleteModel(Long id) { validateModelExists(id); modelMapper.deleteById(id); } @Override public AiModelDO getModel(Long id) { return modelMapper.selectById(id); } @Override public AiModelDO getRequiredDefaultModel(Integer type) { AiModelDO model = modelMapper.selectFirstByStatus(type, CommonStatusEnum.ENABLE.getStatus()); if (model == null) throw exception(MODEL_DISABLE); return model; } @Override public PageResult getModelPage(AiModelPageReqVO pageReqVO) { return modelMapper.selectPage(pageReqVO); } @Override public AiModelDO validateModel(Long id) { AiModelDO model = validateModelExists(id); if (CommonStatusEnum.isDisable(model.getStatus())) throw exception(MODEL_DISABLE); return model; } @Override public List getModelListByStatusAndType(Integer status, Integer type, String platform) { return modelMapper.selectListByStatusAndType(status, type, platform); } private AiModelDO validateModelExists(Long id) { AiModelDO model = modelMapper.selectById(id); if (model == null) throw exception(MODEL_NOT_EXISTS); return model; } // ========== 与 Spring AI ι›†ζˆ ========== @Override public ChatModel getChatModel(Long id) { AiModelDO model = validateModel(id); AiApiKeyDO apiKey = apiKeyService.validateApiKey(model.getKeyId()); AiPlatformEnum platform = AiPlatformEnum.validatePlatform(apiKey.getPlatform()); return modelFactory.getOrCreateChatModel(platform, apiKey.getApiKey(), apiKey.getUrl(), model.getModel()); } @Override public VectorStore getOrCreateVectorStore(Long id, Map> metadataFields) { AiModelDO model = validateModel(id); AiApiKeyDO apiKey = apiKeyService.validateApiKey(model.getKeyId()); AiPlatformEnum platform = AiPlatformEnum.validatePlatform(apiKey.getPlatform()); EmbeddingModel embeddingModel = modelFactory.getOrCreateEmbeddingModel( platform, apiKey.getApiKey(), apiKey.getUrl(), model.getModel()); return modelFactory.getOrCreateVectorStore(MilvusVectorStore.class, embeddingModel, metadataFields); } }