| | |
| | | |
| | | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| | | import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO; |
| | | import cn.iocoder.yudao.module.ai.enums.model.AiModelCapabilityEnum; |
| | | import cn.iocoder.yudao.module.ai.enums.model.AiModelTypeEnum; |
| | | import cn.iocoder.yudao.module.ai.service.model.AiModelService; |
| | | import jakarta.annotation.Resource; |
| | |
| | | |
| | | import java.util.Base64; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.MODEL_VISION_NOT_ENABLED; |
| | | |
| | | @Service |
| | | @Slf4j |
| | |
| | | |
| | | @Override |
| | | public String chatWithImage(String systemPrompt, String userMessage, String imageBase64, String mimeType) { |
| | | // 优先选择视觉模型(模型名含 vl),否则回退到默认对话模型 |
| | | List<AiModelDO> chatModels = modelService.getModelListByStatusAndType( |
| | | CommonStatusEnum.ENABLE.getStatus(), AiModelTypeEnum.CHAT.getType(), null); |
| | | AiModelDO visionModel = chatModels.stream() |
| | | .filter(m -> m.getModel() != null && m.getModel().contains("vl")) |
| | | // 图片识别必须走视觉能力的模型:文本模型不接受图片输入,回退过去只会报错 |
| | | AiModelDO visionModel = modelService.getModelListByStatusAndType( |
| | | CommonStatusEnum.ENABLE.getStatus(), AiModelTypeEnum.CHAT.getType(), null) |
| | | .stream() |
| | | .filter(m -> AiModelCapabilityEnum.VISION.getCapability().equals(m.getCapability())) |
| | | .findFirst() |
| | | .orElseGet(() -> modelService.getRequiredDefaultModel(AiModelTypeEnum.CHAT.getType())); |
| | | .orElseThrow(() -> exception(MODEL_VISION_NOT_ENABLED)); |
| | | |
| | | ChatModel chatModel = modelService.getChatModel(visionModel.getId()); |
| | | byte[] imageBytes = Base64.getDecoder().decode(imageBase64); |