This commit is contained in:
ire 2025-01-10 18:08:05 +08:00
parent 02382dd2b1
commit 50448d6a9d
14 changed files with 130 additions and 18 deletions

View File

@ -91,10 +91,17 @@ public interface ErrorCodeConstants {
ErrorCode PROMPT_TEMPLATES_APPLICATIONS_BACKUP_NOT_EXISTS = new ErrorCode(10036, "模板信息不存在");
ErrorCode PROMPT_TEMPLATES_TAGS_BACKUP_NOT_EXISTS = new ErrorCode(10037, "模板信息不存在");
ErrorCode DATA_PROCESS_TASK_NAME_NOT_EXISTS = new ErrorCode(10038, "数据处理任务名称已存在");
ErrorCode FINE_TUNING_TASK_NAME_NOT_EXISTS = new ErrorCode(10039, "模型调优任务名称已存在");
ErrorCode LEARNING_RESOURCES_NAME_NOT_EXISTS = new ErrorCode(10041, "学习资源标题名称已存在");
ErrorCode KNOWLEDGE_BASE_NAME_NOT_EXISTS = new ErrorCode(10042, "知识库名称已存在");
ErrorCode LEARNING_RESOURCES_NAME_NOT_EXISTS = new ErrorCode(10040, "学习资源标题名称已存在");
ErrorCode KNOWLEDGE_BASE_NAME_NOT_EXISTS = new ErrorCode(10040, "知识库名称已存在");
ErrorCode APPLICATION_NAME_NOT_EXISTS = new ErrorCode(10041, "应用中心名称已存在");
ErrorCode MODEL_SERVIC_ENAME_NOT_EXISTS = new ErrorCode(10043, "模型名称已存在");

View File

@ -112,8 +112,8 @@ public class ApplicationController {
public CommonResult<ChatRespVO> apiChat(@PathVariable("apiKey") String apiKey,@RequestBody ChatApiReqVO chatReqVO){
ApplicationDO applicationDO = applicationService.getByApiKey(apiKey);
chatReqVO.setApplicationId(applicationDO.getId());
chatReqVO.setModelId(applicationDO.getModelServiceId());
chatReqVO.setModelType(chatReqVO.getModelType());
chatReqVO.setModelId(applicationDO.getAppModel());
chatReqVO.setModelType(applicationDO.getAppModelType());
ChatReqVO bean = BeanUtils.toBean(chatReqVO, ChatReqVO.class);
ChatRespVO chat = conversationService.chat(bean);

View File

@ -1,5 +1,12 @@
package cn.iocoder.yudao.module.llm.controller.admin.modelservice;
import cn.iocoder.yudao.module.llm.controller.admin.conversation.vo.ChatApiReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.conversation.vo.ChatReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.conversation.vo.ChatRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.finetuningtask.vo.FineTuningTaskRespVO;
import cn.iocoder.yudao.module.llm.dal.dataobject.application.ApplicationDO;
import cn.iocoder.yudao.module.llm.service.conversation.ConversationService;
import cn.iocoder.yudao.module.llm.service.finetuningtask.FineTuningTaskService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -8,6 +15,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.annotation.security.PermitAll;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
@ -37,6 +45,10 @@ public class ModelServiceController {
@Resource
private ModelServiceService modelServiceService;
@Resource
private FineTuningTaskService fineTuningTaskService;
@Resource
private ConversationService conversationService;
@PostMapping("/create")
@Operation(summary = "创建模型服务")
@ -117,4 +129,18 @@ public class ModelServiceController {
BeanUtils.toBean(list, ModelServiceRespVO.class));
}
@PermitAll
@PostMapping("/api/{apiKey}/chat")
@Operation(summary = "api对话接口")
public CommonResult<ChatRespVO> apiChat(@PathVariable("apiKey") String apiKey, @RequestBody ChatApiReqVO chatReqVO){
ModelServiceDO byApiKey = modelServiceService.getByApiKey(apiKey);
Long fineTuningTaskId = byApiKey.getFineTuningTask();
FineTuningTaskRespVO fineTuningTask = fineTuningTaskService.getFineTuningTask(fineTuningTaskId);
chatReqVO.setModelId(fineTuningTask.getBaseModelId());
chatReqVO.setModelType(0);
ChatReqVO bean = BeanUtils.toBean(chatReqVO, ChatReqVO.class);
ChatRespVO chat = conversationService.chat(bean);
return success(chat);
}
}

View File

@ -37,4 +37,10 @@ public class ModelServicePageReqVO extends PageParam {
@Schema(description = "模型服务状态使用字典llm_model_status", example = "1")
private Integer status;
@Schema(description = "apiKey", example = "123")
private String apiKey;
@Schema(description = "apiUrl", example = "www.sdada.com")
private String apiUrl;
}

View File

@ -60,4 +60,9 @@ public class ModelServiceRespVO {
*/
private Long jobId;
@Schema(description = "apiKey", example = "123")
private String apiKey;
@Schema(description = "apiUrl", example = "www.sdada.com")
private String apiUrl;
}

View File

@ -33,4 +33,11 @@ public class ModelServiceSaveReqVO {
private Integer status;
private Long jobId;
@Schema(description = "apiKey", example = "123")
private String apiKey;
@Schema(description = "apiUrl", example = "www.sdada.com")
private String apiUrl;
}

View File

@ -62,4 +62,8 @@ public class ModelServiceDO extends BaseDO {
*/
private Long jobId;
private String apiKey;
private String apiUrl;
}

View File

@ -27,4 +27,5 @@ public interface ApplicationMapper extends BaseMapperX<ApplicationDO> {
.orderByDesc(ApplicationDO::getId));
}
}

View File

@ -83,4 +83,6 @@ public class LLMBackendProperties {
private String modelUndeploy;
private String modelServiceApi;
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.llm.service.application;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.llm.controller.admin.application.vo.ApplicationPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.application.vo.ApplicationRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.application.vo.ApplicationSaveReqVO;
@ -29,7 +30,7 @@ import java.util.Random;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.APPLICATION_NOT_EXISTS;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.*;
/**
* 大模型应用 Service 实现类
@ -58,6 +59,14 @@ public class ApplicationServiceImpl implements ApplicationService {
@Override
public Long createApplication(ApplicationSaveReqVO createReqVO) {
String appName = createReqVO.getAppName();
LambdaQueryWrapper<ApplicationDO> queryWrapper = new LambdaQueryWrapperX<>();
queryWrapper.eq(ApplicationDO::getAppName,appName);
List<ApplicationDO> applicationDOS = applicationMapper.selectList(queryWrapper);
if(applicationDOS.size() > 0){
throw exception(APPLICATION_NAME_NOT_EXISTS);
}
// 插入
ApplicationDO application = BeanUtils.toBean(createReqVO, ApplicationDO.class);
String apikey = getApikey();

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.llm.service.modelservice;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.llm.controller.admin.modelservice.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.application.ApplicationDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
@ -63,4 +64,6 @@ public interface ModelServiceService {
void unactive(ModelServiceSaveReqVO updateReqVO);
PageResult<ModelServiceRespVO> getModelServicePage1(ModelServicePageReqVO pageReqVO);
ModelServiceDO getByApiKey(String apiKey);
}

View File

@ -1,29 +1,30 @@
package cn.iocoder.yudao.module.llm.service.modelservice;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.llm.controller.admin.modelservice.vo.ModelServicePageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelservice.vo.ModelServiceRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelservice.vo.ModelServiceSaveReqVO;
import cn.iocoder.yudao.module.llm.dal.dataobject.finetuningtask.FineTuningTaskDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
import cn.iocoder.yudao.module.llm.dal.mysql.finetuningtask.FineTuningTaskMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.modelservice.ModelServiceMapper;
import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties;
import cn.iocoder.yudao.module.llm.service.async.AsyncModelServiceService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.stream.Collectors;
import cn.iocoder.yudao.module.llm.controller.admin.modelservice.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.llm.dal.mysql.modelservice.ModelServiceMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.MODEL_SERVICE_NOT_EXISTS;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.MODEL_SERVIC_ENAME_NOT_EXISTS;
/**
* 模型服务 Service 实现类
@ -39,20 +40,50 @@ public class ModelServiceServiceImpl implements ModelServiceService {
@Resource
private AsyncModelServiceService asyncModelServiceService;
@Resource
private FineTuningTaskMapper fineTuningTaskMapper;
@Resource
private LLMBackendProperties llmBackendProperties;
@Override
public Long createModelService(ModelServiceSaveReqVO createReqVO) {
// 插入
validateModelServiceNameExists(createReqVO);
ModelServiceDO modelService = BeanUtils.toBean(createReqVO, ModelServiceDO.class);
// 插入
String apikey = getApikey();
modelService.setApiKey(apikey);
String replace = llmBackendProperties.getApplicationApi().replace("apiKey", apikey);
modelService.setApiUrl(replace);
modelServiceMapper.insert(modelService);
asyncModelServiceService.createModelService(modelService);
// 返回
return modelService.getId();
}
public String getApikey() {
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 30; i++) {
// 生成一个随机的大小写字母
char c = (char) (random.nextBoolean() ? // 随机选择大小写
'A' + random.nextInt(26) : // 生成大写字母
'a' + random.nextInt(26)); // 生成小写字母
sb.append(c);
}
Long count = modelServiceMapper.selectCount(new LambdaQueryWrapper<ModelServiceDO>()
.eq(ModelServiceDO::getApiKey, sb.toString()));
if (count > 0) {
getApikey();
}
return sb.toString();
}
@Override
public void updateModelService(ModelServiceSaveReqVO updateReqVO) {
// 校验存在
@ -146,4 +177,11 @@ public class ModelServiceServiceImpl implements ModelServiceService {
return respVo;
}
@Override
public ModelServiceDO getByApiKey(String apiKey) {
LambdaQueryWrapper<ModelServiceDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ModelServiceDO::getApiKey,apiKey);
return modelServiceMapper.selectOne(queryWrapper);
}
}

View File

@ -261,6 +261,8 @@ llm:
application_api: http://localhost:48100/admin-app/llm/application/api/apiKey/chat
model_service_api : http://localhost:48100/admin-app/llm/model-service/api/apiKey/chat
--- #################### iot相关配置 TODO 芋艿:再瞅瞅 ####################
iot:
emq:

View File

@ -303,6 +303,8 @@ llm:
application_api: http://localhost:48080/admin-app/llm/application/api/apiKey/chat
model_service_api : http://localhost:48080/admin-app/llm/model-service/api/apiKey/chat
--- #################### iot相关配置 TODO 芋艿:再瞅瞅 ####################
iot:
emq: