diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/ApplicationController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/ApplicationController.java index 12408a6ac..398eea376 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/ApplicationController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/ApplicationController.java @@ -1,33 +1,33 @@ package cn.iocoder.yudao.module.llm.controller.admin.application; -import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import javax.validation.constraints.*; -import javax.validation.*; -import javax.servlet.http.*; -import java.util.*; -import java.io.IOException; - +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; - -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; - -import cn.iocoder.yudao.module.llm.controller.admin.application.vo.*; +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; +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.dal.dataobject.application.ApplicationDO; import cn.iocoder.yudao.module.llm.service.application.ApplicationService; +import cn.iocoder.yudao.module.llm.service.conversation.ConversationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 大模型应用") @RestController @@ -38,6 +38,9 @@ public class ApplicationController { @Resource private ApplicationService applicationService; + @Resource + private ConversationService conversationService; + @PostMapping("/create") @Operation(summary = "创建大模型应用") // @PreAuthorize("@ss.hasPermission('llm:application:create')") @@ -99,4 +102,19 @@ public class ApplicationController { ExcelUtils.write(response, "大模型应用.xls", "数据", ApplicationRespVO.class, list); } + + @PermitAll + @PostMapping("/api/{apiKey}/chat") + @Operation(summary = "api对话接口") + public CommonResult apiChat(@PathVariable("apiKey") String apiKey,@RequestBody ChatReqVO chatReqVO){ + ApplicationDO applicationDO = applicationService.getByApiKey(apiKey); + chatReqVO.setApplicationId(applicationDO.getId()); + chatReqVO.setModelId(applicationDO.getModelServiceId()); + chatReqVO.setModelType(chatReqVO.getModelType()); + ChatRespVO chat = conversationService.chat(chatReqVO); + return success(chat); + } + + + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationRespVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationRespVO.java index 78fb16439..015309ff8 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationRespVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationRespVO.java @@ -60,7 +60,9 @@ public class ApplicationRespVO { @Schema(description = "应用API地址", example = "https://www.iocoder.cn") @ExcelProperty("应用API地址") - private String appUrl; + private String apiUrl; + + private String apiKey; @Schema(description = "应用图标") @ExcelProperty("应用图标") diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationSaveReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationSaveReqVO.java index 3263a17df..9c9ff5a5a 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationSaveReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/application/vo/ApplicationSaveReqVO.java @@ -43,7 +43,9 @@ public class ApplicationSaveReqVO { private Long modelServiceId; @Schema(description = "应用API地址", example = "https://www.iocoder.cn") - private String appUrl; + private String apiUrl; + + private String apiKey; @Schema(description = "应用图标") private String appLogo; diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/application/ApplicationDO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/application/ApplicationDO.java index 1854718e3..d1ebf615c 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/application/ApplicationDO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/application/ApplicationDO.java @@ -69,7 +69,9 @@ public class ApplicationDO extends BaseDO { /** * 应用API地址 */ - private String appUrl; + private String apiUrl; + + private String apiKey; /** * 应用图标 */ diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java index 0f2416b92..334b601e6 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java @@ -74,4 +74,6 @@ public class LLMBackendProperties { private String finetuningDetail; private String finetuningFileList; + + private String applicationApi; } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationService.java index d2b05ff57..b6f3c4d82 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationService.java @@ -56,4 +56,5 @@ public interface ApplicationService { List getList(); + ApplicationDO getByApiKey(String apiKey); } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationServiceImpl.java index afb7412b4..6e26f1e38 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/application/ApplicationServiceImpl.java @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.llm.dal.dataobject.label.LabelDO; import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplates.PromptTemplatesDO; import cn.iocoder.yudao.module.llm.dal.mysql.application.ApplicationMapper; import cn.iocoder.yudao.module.llm.dal.mysql.label.LabelMapper; +import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties; import cn.iocoder.yudao.module.llm.service.label.LabelService; import cn.iocoder.yudao.module.llm.service.prompttemplates.PromptTemplatesService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -24,6 +25,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -43,6 +45,7 @@ public class ApplicationServiceImpl implements ApplicationService { @Resource private AdminUserApi adminUserApi; + @Resource private LabelMapper labelMapper; @@ -50,11 +53,16 @@ public class ApplicationServiceImpl implements ApplicationService { @Lazy private PromptTemplatesService promptTemplatesService; + @Resource + private LLMBackendProperties llmBackendProperties; @Override public Long createApplication(ApplicationSaveReqVO createReqVO) { // 插入 ApplicationDO application = BeanUtils.toBean(createReqVO, ApplicationDO.class); + String apikey = getApikey(); + application.setApiKey(apikey); + application.setApiUrl(String.format(llmBackendProperties.getApplicationApi(), apikey)); applicationMapper.insert(application); //prompt使用量+1 @@ -68,6 +76,24 @@ public class ApplicationServiceImpl implements ApplicationService { return application.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 = applicationMapper.selectCount(new LambdaQueryWrapper() + .eq(ApplicationDO::getApiKey, sb.toString())); + if (count > 0) { + getApikey(); + } + return sb.toString(); + } + @Override public void updateApplication(ApplicationSaveReqVO updateReqVO) { // 校验存在 @@ -164,4 +190,11 @@ public class ApplicationServiceImpl implements ApplicationService { return applicationMapper.selectList(); } + @Override + public ApplicationDO getByApiKey(String apiKey) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ApplicationDO::getApiKey,apiKey); + return applicationMapper.selectOne(queryWrapper); + } + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java index b27c901cf..eccc4beaf 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.llm.service.prompttemplatesbackup.PromptTemplates import cn.iocoder.yudao.module.system.api.dict.DictDataApi; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -51,6 +52,8 @@ public class PromptTemplatesServiceImpl implements PromptTemplatesService { private LabelService labelService; @Resource private PromptTemplatesBackupService promptTemplatesBackupService; + + @Lazy @Resource private ApplicationService applicationService; diff --git a/yudao-server/src/main/resources/application-dev.yaml b/yudao-server/src/main/resources/application-dev.yaml index 337de1830..44c5064d5 100644 --- a/yudao-server/src/main/resources/application-dev.yaml +++ b/yudao-server/src/main/resources/application-dev.yaml @@ -252,6 +252,9 @@ llm: # 模型对话 POST model_completions: http://api.xhllm.xinnuojinzhi.com/model/v1/chat/completions + + application_api: http://localhost:48100/admin-app/llm/application/api/{apiKey}/chat + --- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### iot: emq: diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 2a322a337..ba913e041 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -295,6 +295,9 @@ llm: # 模型对话 POST model_completions: http://api.xhllm.xinnuojinzhi.com/model/v1/chat/completions + + application_api: http://localhost:48100/admin-app/llm/application/api/{apiKey}/chat + --- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### iot: emq: @@ -314,4 +317,4 @@ iot: clearSession: true #mybatis-plus: # configuration: -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl