Commit a18ae889 authored by pengxin's avatar pengxin

Merge remote-tracking branch 'origin/master'

parents d30228f6 d009c5f7
......@@ -38,6 +38,16 @@ public class KnowledgeConfig {
*/
private String searchDocs;
/**
* 直接更新知识库文档
*/
private String updateDocsById;
/**
* 直接删除知识库文档片段
*/
private String deleteDocsById;
/**
* 上传文件到知识库,并/或进行向量化
*/
......
package com.yice.webadmin.app.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "llm-model")
public class LlmModelConfig {
/**
* 大模型管理接口地址
*/
private String llmModelInterface;
/**
* 模型停止
*/
private String stop;
/**
* 重新模型部署
*/
private String reload;
/**
* 模型启动
*/
private String start;
/**
* 列出当前已加载模型
*/
private String listRunningModels;
}
package com.yice.webadmin.app.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "other")
public class OtherConfig {
/**
* 其他通用接口地址
*/
private String otherInterface;
/**
* 获取GPU信息
*/
private String getGpuInfo;
}
......@@ -11,8 +11,10 @@ import com.yice.common.core.util.MyModelUtil;
import com.yice.common.core.util.MyPageUtil;
import com.yice.common.log.annotation.OperationLog;
import com.yice.common.log.model.constant.SysOperationLogType;
import com.yice.webadmin.app.constant.DatasetConstant;
import com.yice.webadmin.app.data.DatasetData;
import com.yice.webadmin.app.dto.DatasetDataDto;
import com.yice.webadmin.app.dto.DatasetDataSummaryDto;
import com.yice.webadmin.app.service.DatasetDataService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
......@@ -54,6 +56,30 @@ public class DatasetDataController {
return ResponseResult.success();
}
/**
* 统计总个数
* @param versionId 版本标识
* @return
*/
@GetMapping("/summaryCount")
public ResponseResult<DatasetDataSummaryDto> summaryCount(@RequestParam Long versionId) {
if (MyCommonUtil.existBlankArgument(versionId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_ID_EXIST);
}
DatasetDataSummaryDto summaryDto = new DatasetDataSummaryDto();
DatasetData datasetDataFilter = new DatasetData();
datasetDataFilter.setVersionId(versionId);
Long allMarkCount = datasetDataService.count(datasetDataFilter);
summaryDto.setAllMarkCount(allMarkCount);
datasetDataFilter.setMarkStatus(DatasetConstant.STATUS_UNPUBLISHED);
Long unMarkCount = datasetDataService.count(datasetDataFilter);
summaryDto.setUnMarkCount(unMarkCount);
summaryDto.setMarkCount(allMarkCount - unMarkCount);
return ResponseResult.success(summaryDto);
}
/**
* 删除数据集版本数据。
*
......
package com.yice.webadmin.app.controller;
import com.yice.common.log.annotation.OperationLog;
import com.yice.common.log.model.constant.SysOperationLogType;
import com.github.pagehelper.page.PageMethod;
import com.yice.webadmin.app.vo.*;
import com.yice.webadmin.app.dto.*;
import com.yice.webadmin.app.model.*;
import com.yice.webadmin.app.service.*;
import com.yice.common.core.object.*;
import com.yice.common.core.util.*;
import com.yice.common.core.constant.*;
import com.yice.common.core.annotation.MyRequestBody;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
/**
* 知识图谱管理操作控制器类。
*
* @author linking
* @date 2023-04-13
*/
@Api(tags = "知识图谱管理管理接口")
@Slf4j
@RestController
@RequestMapping("/admin/app/kGManage")
public class KGManageController {
@Autowired
private KGManageService kGManageService;
/**
* 新增知识图谱管理数据。
*
* @param kGManageDto 新增对象。
* @return 应答结果对象,包含新增对象主键Id。
*/
@ApiOperationSupport(ignoreParameters = {"kGManageDto.kgId"})
@OperationLog(type = SysOperationLogType.ADD)
@PostMapping("/add")
public ResponseResult<Long> add(@MyRequestBody KGManageDto kGManageDto) {
String errorMessage = MyCommonUtil.getModelValidationError(kGManageDto, false);
if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
KGManage kGManage = MyModelUtil.copyTo(kGManageDto, KGManage.class);
kGManage = kGManageService.saveNew(kGManage);
return ResponseResult.success(kGManage.getKgId());
}
/**
* 更新知识图谱管理数据。
*
* @param kGManageDto 更新对象。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/update")
public ResponseResult<Void> update(@MyRequestBody KGManageDto kGManageDto) {
String errorMessage = MyCommonUtil.getModelValidationError(kGManageDto, true);
if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
KGManage kGManage = MyModelUtil.copyTo(kGManageDto, KGManage.class);
KGManage originalKGManage = kGManageService.getById(kGManage.getKgId());
if (originalKGManage == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [数据] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!kGManageService.update(kGManage, originalKGManage)) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
}
return ResponseResult.success();
}
/**
* 删除知识图谱管理数据。
*
* @param kgId 删除对象主键Id。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.DELETE)
@PostMapping("/delete")
public ResponseResult<Void> delete(@MyRequestBody Long kgId) {
if (MyCommonUtil.existBlankArgument(kgId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
return this.doDelete(kgId);
}
/**
* 列出符合过滤条件的知识图谱管理列表。
*
* @param kGManageDtoFilter 过滤对象。
* @param orderParam 排序参数。
* @param pageParam 分页参数。
* @return 应答结果对象,包含查询结果集。
*/
@PostMapping("/list")
public ResponseResult<MyPageData<KGManageVo>> list(
@MyRequestBody KGManageDto kGManageDtoFilter,
@MyRequestBody MyOrderParam orderParam,
@MyRequestBody MyPageParam pageParam) {
if (pageParam != null) {
PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize());
}
KGManage kGManageFilter = MyModelUtil.copyTo(kGManageDtoFilter, KGManage.class);
String orderBy = MyOrderParam.buildOrderBy(orderParam, KGManage.class);
List<KGManage> kGManageList = kGManageService.getKGManageListWithRelation(kGManageFilter, orderBy);
return ResponseResult.success(MyPageUtil.makeResponseData(kGManageList, KGManage.INSTANCE));
}
/**
* 查看指定知识图谱管理对象详情。
*
* @param kgId 指定对象主键Id。
* @return 应答结果对象,包含对象详情。
*/
@GetMapping("/view")
public ResponseResult<KGManageVo> view(@RequestParam Long kgId) {
KGManage kGManage = kGManageService.getByIdWithRelation(kgId, MyRelationParam.full());
if (kGManage == null) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
}
KGManageVo kGManageVo = KGManage.INSTANCE.fromModel(kGManage);
return ResponseResult.success(kGManageVo);
}
private ResponseResult<Void> doDelete(Long kgId) {
String errorMessage;
// 验证关联Id的数据合法性
KGManage originalKGManage = kGManageService.getById(kgId);
if (originalKGManage == null) {
// NOTE: 修改下面方括号中的话述
errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
if (!kGManageService.remove(kgId)) {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return ResponseResult.success();
}
}
......@@ -68,16 +68,14 @@ public class KnowledgeManageController {
if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
KnowledgeManage knowledgeManage = MyModelUtil.copyTo(knowledgeManageDto, KnowledgeManage.class);
knowledgeManage.setKnowledgeCode(PinyinUtil.getPinyin(knowledgeManage.getKnowledgeName()).replace(" ","_"));
String requestBody = "{\n" + " \"knowledge_base_name\": \"" + knowledgeManage.getKnowledgeCode() + "\",\n" + " \"vector_store_type\": \"faiss\",\n" + " \"embed_model\": \"m3e-base\"\n" + "}";
String requestBody = "{\n" + " \"knowledge_base_name\": \"" + knowledgeManageDto.getKnowledgeName() + "\",\n" + " \"vector_store_type\": \"faiss\",\n" + " \"embed_model\": \"m3e-base\"\n" + "}";
try {
String result = proxyPythonService.predictPost(knowledgeConfig.getKnowledgeInterface() + knowledgeConfig.getCreate(), requestBody);
JSONObject jo = JSON.parseObject(result);
Integer code = jo.getIntValue("code");
String msg = jo.getString("msg");
String data = jo.getString("data");
if (code != null && code == 200) {
KnowledgeManage knowledgeManage = MyModelUtil.copyTo(knowledgeManageDto, KnowledgeManage.class);
KnowledgeManage reKnowledgeManage = knowledgeManageService.saveNew(knowledgeManage);
return ResponseResult.success(reKnowledgeManage);
} else {
......@@ -228,7 +226,6 @@ public class KnowledgeManageController {
}
return ResponseResult.success(originalKnowledgeManage);
}
/**
* 删除知识库管理数据。
*
......@@ -279,6 +276,46 @@ public class KnowledgeManageController {
return ResponseResult.success(data);
}
/**
* 直接更新知识库文档。
*
* @param requestBody 请求对象。
* @return 应答结果对象。
*/
@PostMapping("/updateDocsById")
public ResponseResult<String> updateDocsById(@RequestBody String requestBody) {
if (MyCommonUtil.existBlankArgument(requestBody)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
String data = null;
try {
data = this.proxyPythonService.predictPost(this.knowledgeConfig.getKnowledgeInterface() + knowledgeConfig.getUpdateDocsById(), requestBody);
} catch (IOException e) {
throw new RuntimeException(e);
}
return ResponseResult.success(data);
}
/**
* 直接删除知识库文档片段。
*
* @param requestBody 请求对象。
* @return 应答结果对象。
*/
@PostMapping("/deleteDocsById")
public ResponseResult<String> deleteDocsById(@RequestBody String requestBody) {
if (MyCommonUtil.existBlankArgument(requestBody)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
String data = null;
try {
data = this.proxyPythonService.predictPost(this.knowledgeConfig.getKnowledgeInterface() + knowledgeConfig.getDeleteDocsById(), requestBody);
} catch (IOException e) {
throw new RuntimeException(e);
}
return ResponseResult.success(data);
}
/**
* 删除知识库指定文件。
*
......@@ -354,7 +391,7 @@ public class KnowledgeManageController {
String msg = jo.getString("msg");
String data = jo.getString("data");
if (code != null && code == 200) {
return ResponseResult.create(ErrorCodeEnum.NO_ERROR, msg, data);
return ResponseResult.success(data);
} else {
return ResponseResult.create(ErrorCodeEnum.SERVER_INTERNAL_ERROR, msg, data);
}
......@@ -425,7 +462,7 @@ public class KnowledgeManageController {
if (code != null && code == 200) {
for (KnowledgeManage knowledgeManage : knowledgeManageList) {
for (Object jsonObject : jsonArray) {
if (knowledgeManage.getKnowledgeCode().equals(String.valueOf(jsonObject))) {
if (knowledgeManage.getKnowledgeName().equals(String.valueOf(jsonObject))) {
reKnowledgeManageList.add(knowledgeManage);
}
}
......@@ -456,7 +493,7 @@ public class KnowledgeManageController {
if (code != null && code == 200) {
for (KnowledgeManage knowledgeManage : knowledgeManageList) {
for (Object jsonObject : jsonArray) {
if (knowledgeManage.getKnowledgeCode().equals(String.valueOf(jsonObject))) {
if (knowledgeManage.getKnowledgeName().equals(String.valueOf(jsonObject))) {
reKnowledgeManageList.add(knowledgeManage);
}
}
......@@ -529,6 +566,6 @@ public class KnowledgeManageController {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
return this.doDeleteByName(originalKnowledgeManage.getKnowledgeCode());
return this.doDeleteByName(originalKnowledgeManage.getKnowledgeName());
}
}
package com.yice.webadmin.app.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.page.PageMethod;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.yice.common.core.annotation.MyRequestBody;
......@@ -10,16 +12,28 @@ import com.yice.common.core.util.MyModelUtil;
import com.yice.common.core.util.MyPageUtil;
import com.yice.common.log.annotation.OperationLog;
import com.yice.common.log.model.constant.SysOperationLogType;
import com.yice.webadmin.app.config.LlmModelConfig;
import com.yice.webadmin.app.config.OtherConfig;
import com.yice.webadmin.app.config.PythonConfig;
import com.yice.webadmin.app.dto.ModelDeployDto;
import com.yice.webadmin.app.model.ModelDeploy;
import com.yice.webadmin.app.model.ModelManage;
import com.yice.webadmin.app.model.ModelVersion;
import com.yice.webadmin.app.service.ModelDeployService;
import com.yice.webadmin.app.service.ModelManageService;
import com.yice.webadmin.app.service.ModelVersionService;
import com.yice.webadmin.app.service.ProxyPythonService;
import com.yice.webadmin.app.vo.ModelDeployVo;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.jws.WebParam;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 模型部署操作控制器类。
......@@ -35,6 +49,18 @@ public class ModelDeployController {
@Autowired
private ModelDeployService modelDeployService;
@Autowired
private ProxyPythonService proxyPythonService;
@Autowired
private OtherConfig otherConfig;
@Autowired
private LlmModelConfig llmModelConfig;
@Autowired
private PythonConfig pythonConfig;
@Autowired
private ModelVersionService modelVersionService;
@Autowired
private ModelManageService modelManageService;
/**
* 新增模型部署数据。
......@@ -56,10 +82,74 @@ public class ModelDeployController {
if (!callResult.isSuccess()) {
return ResponseResult.errorFrom(callResult);
}
modelDeploy = modelDeployService.saveNew(modelDeploy);
List<ModelDeploy> modelDeployList = this.modelDeployService.getModelDeployList(modelDeploy, "");
for (ModelDeploy modelDeploy1 : modelDeployList) {
if (modelDeploy1.getVersionId() == modelDeploy.getVersionId()) {
return ResponseResult.error(ErrorCodeEnum.DUPLICATED_UNIQUE_KEY, "同一个模型只能部署一次!");
}
}
ModelVersion modelVersion = this.modelVersionService.getById(modelDeploy.getVersionId());
ModelManage modelManage = modelManageService.getById(modelVersion.getModelId());
modelDeploy.setDeployStatus(3);
modelDeploy.setModelId(modelVersion.getModelId());
modelDeploy.setVersionName(modelVersion.getVersionName());
modelDeploy.setModelVersion(modelVersion.getModelVersion());
modelDeploy.setModelName(modelManage.getModelName());
modelDeployService.saveNew(modelDeploy);
return ResponseResult.success(modelDeploy.getDeployId());
}
/**
* 部署指定LLM模型。
*
* @return 应答结果对象,包含查询结果集。
*/
@PostMapping("/deploy")
public ResponseResult<String> deploy(@MyRequestBody ModelDeployDto modelDeployDto, @MyRequestBody String type) {
ModelDeploy modelDeploy = modelDeployService.getById(modelDeployDto.getDeployId());
modelDeploy.setDeployStatus(0);
modelDeployService.updateById(modelDeploy);
ResponseResult<String> responseResult = this.doReloadOrStart(modelDeploy, type);
if (responseResult.isSuccess()) {
modelDeploy.setDeployStatus(1);
modelDeployService.updateById(modelDeploy);
return ResponseResult.success(responseResult.getData());
}
modelDeploy.setDeployStatus(-1);
modelDeployService.updateById(modelDeploy);
return responseResult;
}
private ResponseResult<String> doReloadOrStart(ModelDeploy modelDeploy, String type) {
String gps_ids = JSON.parseArray(modelDeploy.getResourceInfo()).stream()
.map(obj -> ((JSONObject) obj).getString("gpu_id"))
.collect(Collectors.joining(","));
ModelVersion modelVersion = this.modelVersionService.getById(modelDeploy.getVersionId());
String requestBody = "{\n" +
" \"new_model_name\": \"" + modelDeploy.getVersionName() + "\",\n" +
" \"new_model_path\": \"" + modelVersion.getModelUrl() + "\",\n" +
" \"startup_param\": {\n" +
" \"gpu_ids\": \"" + gps_ids + "\"\n" +
" },\n" +
" \"controller_address\": \"" + pythonConfig.getControllerAddress() + "\"\n" +
"}";
try {
String apiName = type.equals("start") ? llmModelConfig.getStart() : llmModelConfig.getReload();
String result = proxyPythonService.predictPost(llmModelConfig.getLlmModelInterface() + apiName, requestBody);
JSONObject jo = JSON.parseObject(result);
Integer code = jo.getIntValue("code");
String msg = jo.getString("msg");
String data = jo.getString("data");
if (code != null && code == 200) {
return ResponseResult.success(data);
} else {
return ResponseResult.create(ErrorCodeEnum.SERVER_INTERNAL_ERROR, msg, data);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 更新模型部署数据。
*
......@@ -106,6 +196,35 @@ public class ModelDeployController {
return this.doDelete(deployId);
}
/**
* 列出所有可用模型部署列表。
*
* @return 应答结果对象,包含查询结果集。
*/
@PostMapping("/canUseList")
public ResponseResult<MyPageData<ModelDeployVo>> canUseList() {
ModelDeploy modelDeployFilter = new ModelDeploy();
modelDeployFilter.setDeployStatus(1);
List<ModelDeploy> modelDeployList =
modelDeployService.getModelDeployListWithRelation(modelDeployFilter, "deploy_id");
ResponseResult<String> responseResult = this.listRunningModels();
String data = responseResult.getData();
String[] modelNames = stringToArray(data);
List<ModelDeploy> modelDeploys = new ArrayList<ModelDeploy>();
for (ModelDeploy modelDeploy : modelDeployList) {
boolean isEx = false;
for (int i = 0; i < modelNames.length; i++) {
if (modelDeploy.getVersionName().equals(modelNames[i])) {
isEx = true;
}
}
if (isEx) {
modelDeploy.setDeployStatus(1);
modelDeploys.add(modelDeploy);
}
}
return ResponseResult.success(MyPageUtil.makeResponseData(modelDeploys, ModelDeploy.INSTANCE));
}
/**
* 列出符合过滤条件的模型部署列表。
*
......@@ -126,9 +245,124 @@ public class ModelDeployController {
String orderBy = MyOrderParam.buildOrderBy(orderParam, ModelDeploy.class);
List<ModelDeploy> modelDeployList =
modelDeployService.getModelDeployListWithRelation(modelDeployFilter, orderBy);
ResponseResult<String> responseResult = this.listRunningModels();
if (!responseResult.isSuccess()) {
modelDeployList.forEach(modelDeploy -> {
modelDeploy.setDeployStatus(2);
});
return ResponseResult.success(MyPageUtil.makeResponseData(modelDeployList, ModelDeploy.INSTANCE));
}
String data = responseResult.getData();
System.out.println(data);
String[] modelNames = stringToArray(data);
for (ModelDeploy modelDeploy : modelDeployList) {
boolean isEx = false;
for (int i = 0; i < modelNames.length; i++) {
if (modelDeploy.getVersionName().equals(modelNames[i])) {
isEx = true;
}
}
if (!isEx) {
if (modelDeploy.getDeployStatus() != 3)
modelDeploy.setDeployStatus(2);
} else {
modelDeploy.setDeployStatus(1);
}
}
return ResponseResult.success(MyPageUtil.makeResponseData(modelDeployList, ModelDeploy.INSTANCE));
}
private String[] stringToArray(String strArray) {
strArray = strArray.replaceAll("\\[|\\]|\"", "");
return strArray.split(",\\s*"); // 正则表达式也考虑了逗号后的空格
}
private ResponseResult<String> listRunningModels() {
String requestBody = "{\n" +
" \"controller_address\": \"" + pythonConfig.getControllerAddress() + "\",\n" +
" \"placeholder\": \"string\"\n" +
"}";
try {
String result = proxyPythonService.predictPost(llmModelConfig.getLlmModelInterface() + llmModelConfig.getListRunningModels(), requestBody);
JSONObject jo = JSON.parseObject(result);
Integer code = jo.getIntValue("code");
String msg = jo.getString("msg");
String data = jo.getString("data");
if (code != null && code == 200) {
return ResponseResult.success(data);
} else {
return ResponseResult.create(ErrorCodeEnum.SERVER_INTERNAL_ERROR, msg, data);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 获取GPU信息。
*
* @return 应答结果对象,包含查询结果集。
*/
@PostMapping("/getGpuInfo")
public ResponseResult<String> getGpuInfo() {
try {
String result = proxyPythonService.predictPost(otherConfig.getOtherInterface() + otherConfig.getGetGpuInfo(), "");
JSONObject jo = JSON.parseObject(result);
Integer code = jo.getIntValue("code");
String msg = jo.getString("msg");
String data = jo.getString("data");
if (code != null && code == 200) {
return ResponseResult.success(data);
} else {
return ResponseResult.create(ErrorCodeEnum.SERVER_INTERNAL_ERROR, msg, data);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 停止指定LLM模型。
*
* @return 应答结果对象,包含查询结果集。
*/
@PostMapping("/stop")
public ResponseResult<String> stop(@MyRequestBody ModelDeployDto modelDeployDto) {
ModelDeploy modelDeploy = modelDeployService.getById(modelDeployDto.getDeployId());
ResponseResult<String> responseResult = this.doStop(modelDeploy);
if (responseResult.isSuccess()) {
modelDeploy.setDeployStatus(3);
modelDeployService.updateById(modelDeploy);
return ResponseResult.success(responseResult.getData());
}
return responseResult;
}
private ResponseResult<String> doStop(ModelDeploy modelDeploy) {
String errorMessage = MyCommonUtil.getModelValidationError(modelDeploy, true);
if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
String requestBody = "{\n" +
" \"model_name\": \"" + modelDeploy.getVersionName() + "\",\n" +
" \"controller_address\": \"" + pythonConfig.getControllerAddress() + "\"\n" +
"}";
try {
String result = proxyPythonService.predictPost(llmModelConfig.getLlmModelInterface() + llmModelConfig.getStop(), requestBody);
JSONObject jo = JSON.parseObject(result);
Integer code = jo.getIntValue("code");
String msg = jo.getString("msg");
String data = jo.getString("data");
if (code != null && code == 200) {
return ResponseResult.success(data);
} else {
return ResponseResult.create(ErrorCodeEnum.SERVER_INTERNAL_ERROR, msg, data);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 查看指定模型部署对象详情。
*
......@@ -158,6 +392,7 @@ public class ModelDeployController {
errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
this.doStop(originalModelDeploy);
return ResponseResult.success();
}
}
package com.yice.webadmin.app.dao;
import com.yice.common.core.base.dao.BaseDaoMapper;
import com.yice.webadmin.app.model.KGManage;
import org.apache.ibatis.annotations.Param;
import java.util.*;
/**
* 知识图谱管理数据操作访问接口。
*
* @author linking
* @date 2023-04-13
*/
public interface KGManageMapper extends BaseDaoMapper<KGManage> {
/**
* 批量插入对象列表。
*
* @param kGManageList 新增对象列表。
*/
void insertList(List<KGManage> kGManageList);
/**
* 获取过滤后的对象列表。
*
* @param kGManageFilter 主表过滤对象。
* @param orderBy 排序字符串,order by从句的参数。
* @return 对象列表。
*/
List<KGManage> getKGManageList(
@Param("kGManageFilter") KGManage kGManageFilter, @Param("orderBy") String orderBy);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yice.webadmin.app.dao.KGManageMapper">
<resultMap id="BaseResultMap" type="com.yice.webadmin.app.model.KGManage">
<id column="kg_id" jdbcType="BIGINT" property="kgId"/>
<result column="create_user_id" jdbcType="BIGINT" property="createUserId"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="update_user_id" jdbcType="BIGINT" property="updateUserId"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
<result column="kg_name" jdbcType="VARCHAR" property="kgName"/>
<result column="kg_describe" jdbcType="VARCHAR" property="kgDescribe"/>
<result column="kg_url" jdbcType="VARCHAR" property="kgUrl"/>
<result column="kg_user_name" jdbcType="VARCHAR" property="kgUserName"/>
<result column="kg_password" jdbcType="VARCHAR" property="kgPassword"/>
<result column="kg_bower_url" jdbcType="VARCHAR" property="kgBowerUrl"/>
<result column="kg_type" jdbcType="VARCHAR" property="kgType"/>
</resultMap>
<insert id="insertList">
INSERT INTO lmp_kg_manage
(kg_id,
create_user_id,
create_time,
update_user_id,
update_time,
kg_name,
kg_describe,
kg_url,
kg_user_name,
kg_password,
kg_bower_url,
kg_type)
VALUES
<foreach collection="list" index="index" item="item" separator="," >
(#{item.kgId},
#{item.createUserId},
#{item.createTime},
#{item.updateUserId},
#{item.updateTime},
#{item.kgName},
#{item.kgDescribe},
#{item.kgUrl},
#{item.kgUserName},
#{item.kgPassword},
#{item.kgBowerUrl},
#{item.kgType})
</foreach>
</insert>
<!-- 如果有逻辑删除字段过滤,请写到这里 -->
<sql id="filterRef">
<!-- 这里必须加上全包名,否则当filterRef被其他Mapper.xml包含引用的时候,就会调用Mapper.xml中的该SQL片段 -->
<include refid="com.yice.webadmin.app.dao.KGManageMapper.inputFilterRef"/>
</sql>
<!-- 这里仅包含调用接口输入的主表过滤条件 -->
<sql id="inputFilterRef">
<if test="kGManageFilter != null">
<if test="kGManageFilter.kgName != null and kGManageFilter.kgName != ''">
AND lmp_kg_manage.kg_name = #{kGManageFilter.kgName}
</if>
</if>
</sql>
<select id="getKGManageList" resultMap="BaseResultMap" parameterType="com.yice.webadmin.app.model.KGManage">
SELECT * FROM lmp_kg_manage
<where>
<include refid="filterRef"/>
</where>
<if test="orderBy != null and orderBy != ''">
ORDER BY ${orderBy}
</if>
</select>
</mapper>
......@@ -10,6 +10,7 @@
<result column="knowledge_name" jdbcType="VARCHAR" property="knowledgeName"/>
<result column="knowledge_code" jdbcType="VARCHAR" property="knowledgeCode"/>
<result column="knowledge_describe" jdbcType="VARCHAR" property="knowledgeDescribe"/>
<result column="knowledge_format" jdbcType="VARCHAR" property="knowledgeFormat"/>
</resultMap>
<insert id="insertList">
......@@ -21,7 +22,8 @@
update_time,
knowledge_name,
knowledge_code,
knowledge_describe)
knowledge_describe,
knowledge_format)
VALUES
<foreach collection="list" index="index" item="item" separator=",">
(#{item.knowledgeId},
......@@ -31,7 +33,8 @@
#{item.updateTime},
#{item.knowledgeName},
#{item.knowledgeCode},
#{item.knowledgeDescribe})
#{item.knowledgeDescribe},
#{item.knowledgeFormat})
</foreach>
</insert>
......
......@@ -4,6 +4,7 @@
<resultMap id="BaseResultMap" type="com.yice.webadmin.app.model.ModelDeploy">
<id column="deploy_id" jdbcType="BIGINT" property="deployId"/>
<result column="model_id" jdbcType="BIGINT" property="modelId"/>
<result column="model_name" jdbcType="VARCHAR" property="modelName"/>
<result column="version_id" jdbcType="BIGINT" property="versionId"/>
<result column="version_name" jdbcType="VARCHAR" property="versionName"/>
<result column="deploy_status" jdbcType="TINYINT" property="deployStatus"/>
......@@ -15,12 +16,15 @@
<result column="service_id" jdbcType="BIGINT" property="serviceId"/>
<result column="service_name" jdbcType="VARCHAR" property="serviceName"/>
<result column="service_version" jdbcType="TINYINT" property="serviceVersion"/>
<result column="resource_info" jdbcType="VARCHAR" property="resourceInfo"/>
<result column="service_remark" jdbcType="VARCHAR" property="serviceRemark"/>
</resultMap>
<insert id="insertList">
INSERT INTO lmp_model_deploy
(deploy_id,
model_id,
model_name,
version_id,
version_name,
deploy_status,
......@@ -31,11 +35,14 @@
model_version,
service_id,
service_name,
service_version)
service_version,
resource_info,
service_remark)
VALUES
<foreach collection="list" index="index" item="item" separator=",">
(#{item.deployId},
#{item.modelId},
#{item.modelName},
#{item.versionId},
#{item.versionName},
#{item.deployStatus},
......@@ -46,7 +53,9 @@
#{item.modelVersion},
#{item.serviceId},
#{item.serviceName},
#{item.serviceVersion})
#{item.serviceVersion},
#{item.resourceInfo},
#{item.serviceRemark})
</foreach>
</insert>
......
......@@ -12,7 +12,7 @@ import java.util.Date;
* @author linking
* @date 2023-04-13
*/
@ApiModel("DatasetMongoDto视图对象")
@ApiModel("DatasetDataDto视图对象")
@Data
public class DatasetDataDto {
......
package com.yice.webadmin.app.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* DatasetDataSummaryDto视图对象。
*
* @author linking
* @date 2023-04-13
*/
@ApiModel("DatasetDataSummaryDto视图对象")
@Data
public class DatasetDataSummaryDto {
/**
* 全部标记数
*/
@ApiModelProperty(value = "全部标记数")
private Long allMarkCount;
/**
* 未标记数
*/
@ApiModelProperty(value = "未标记数")
private Long unMarkCount;
/**
* 已标记数
*/
@ApiModelProperty(value = "已标记数")
private Long markCount;
}
package com.yice.webadmin.app.dto;
import com.yice.common.core.validator.UpdateGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.*;
/**
* KGManageDto对象。
*
* @author linking
* @date 2023-04-13
*/
@ApiModel("KGManageDto对象")
@Data
public class KGManageDto {
/**
* 知识图谱ID。
*/
@ApiModelProperty(value = "知识图谱ID", required = true)
@NotNull(message = "数据验证失败,知识图谱ID不能为空!", groups = {UpdateGroup.class})
private Long kgId;
/**
* 知识图谱名称。
*/
@ApiModelProperty(value = "知识图谱名称")
@NotNull(message = "数据验证失败,知识图谱名称不能为空!", groups = {UpdateGroup.class})
private String kgName;
/**
* 知识图谱描述。
*/
@ApiModelProperty(value = "知识图谱描述")
private String kgDescribe;
/**
* 知识图谱地址。
*/
@ApiModelProperty(value = "知识图谱地址")
private String kgUrl;
/**
* 知识图谱用户名。
*/
@ApiModelProperty(value = "知识图谱用户名")
private String kgUserName;
/**
* 知识图谱密码。
*/
@ApiModelProperty(value = "知识图谱密码")
private String kgPassword;
/**
* 知识图谱浏览地址。
*/
@ApiModelProperty(value = "知识图谱浏览地址")
private String kgBowerUrl;
/**
* 知识图谱类型。
*/
@ApiModelProperty(value = "知识图谱类型")
private String kgType;
}
......@@ -49,4 +49,10 @@ public class KnowledgeManageDto {
*/
@ApiModelProperty(value = "LIKE模糊搜索字符串")
private String searchString;
/**
* 知识格式。
*/
@ApiModelProperty(value = "知识格式")
private String knowledgeFormat;
}
......@@ -30,6 +30,12 @@ public class ModelDeployDto {
@ApiModelProperty(value = "模型ID")
private Long modelId;
/**
* 模型名称。
*/
@ApiModelProperty(value = "模型名称")
private String modelName;
/**
* 版本ID。
*/
......@@ -71,4 +77,22 @@ public class ModelDeployDto {
*/
@ApiModelProperty(value = "服务版本")
private Integer serviceVersion;
/**
* 资源信息。
*/
@ApiModelProperty(value = "资源信息")
private String resourceInfo;
/**
* 服务描述。
*/
@ApiModelProperty(value = "服务描述")
private String serviceRemark;
/**
* 资源id。
*/
@ApiModelProperty(value = "资源id")
private String gpuIds;
}
package com.yice.webadmin.app.model;
import com.baomidou.mybatisplus.annotation.*;
import com.yice.common.core.base.model.BaseModel;
import com.yice.common.core.base.mapper.BaseModelMapper;
import com.yice.webadmin.app.vo.KGManageVo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;
/**
* KGManage实体对象。
*
* @author linking
* @date 2023-04-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "lmp_kg_manage")
public class KGManage extends BaseModel {
/**
* 知识图谱ID。
*/
@TableId(value = "kg_id")
private Long kgId;
/**
* 知识图谱名称。
*/
private String kgName;
/**
* 知识图谱描述。
*/
private String kgDescribe;
/**
* 知识图谱地址。
*/
private String kgUrl;
/**
* 知识图谱用户名。
*/
private String kgUserName;
/**
* 知识图谱密码。
*/
private String kgPassword;
/**
* 知识图谱浏览地址。
*/
private String kgBowerUrl;
/**
* 知识图谱类型。
*/
private String kgType;
@Mapper
public interface KGManageModelMapper extends BaseModelMapper<KGManageVo, KGManage> {
}
public static final KGManageModelMapper INSTANCE = Mappers.getMapper(KGManageModelMapper.class);
}
......@@ -48,6 +48,11 @@ public class KnowledgeManage extends BaseModel {
*/
private String knowledgeDescribe;
/**
* 知识格式。
*/
private String knowledgeFormat;
/**
* knowledge_name LIKE搜索字符串。
*/
......
......@@ -32,6 +32,10 @@ public class ModelDeploy extends BaseModel {
*/
private Long modelId;
/**
* 模型名称。
*/
private String modelName;
/**
* 版本ID。
*/
......@@ -67,6 +71,16 @@ public class ModelDeploy extends BaseModel {
*/
private Integer serviceVersion;
/**
* 资源信息。
*/
private String resourceInfo;
/**
* 服务描述。
*/
private String serviceRemark;
@Mapper
public interface ModelDeployModelMapper extends BaseModelMapper<ModelDeployVo, ModelDeploy> {
}
......
package com.yice.webadmin.app.service;
import com.yice.webadmin.app.model.*;
import com.yice.common.core.base.service.IBaseService;
import java.util.*;
/**
* 知识图谱管理数据操作服务接口。
*
* @author linking
* @date 2023-04-13
*/
public interface KGManageService extends IBaseService<KGManage, Long> {
/**
* 保存新增对象。
*
* @param kGManage 新增对象。
* @return 返回新增对象。
*/
KGManage saveNew(KGManage kGManage);
/**
* 利用数据库的insertList语法,批量插入对象列表。
*
* @param kGManageList 新增对象列表。
*/
void saveNewBatch(List<KGManage> kGManageList);
/**
* 更新数据对象。
*
* @param kGManage 更新的对象。
* @param originalKGManage 原有数据对象。
* @return 成功返回true,否则false。
*/
boolean update(KGManage kGManage, KGManage originalKGManage);
/**
* 删除指定数据。
*
* @param kgId 主键Id。
* @return 成功返回true,否则false。
*/
boolean remove(Long kgId);
/**
* 获取单表查询结果。由于没有关联数据查询,因此在仅仅获取单表数据的场景下,效率更高。
* 如果需要同时获取关联数据,请移步(getKGManageListWithRelation)方法。
*
* @param filter 过滤对象。
* @param orderBy 排序参数。
* @return 查询结果集。
*/
List<KGManage> getKGManageList(KGManage filter, String orderBy);
/**
* 获取主表的查询结果,以及主表关联的字典数据和一对一从表数据,以及一对一从表的字典数据。
* 该查询会涉及到一对一从表的关联过滤,或一对多从表的嵌套关联过滤,因此性能不如单表过滤。
* 如果仅仅需要获取主表数据,请移步(getKGManageList),以便获取更好的查询性能。
*
* @param filter 主表过滤对象。
* @param orderBy 排序参数。
* @return 查询结果集。
*/
List<KGManage> getKGManageListWithRelation(KGManage filter, String orderBy);
}
package com.yice.webadmin.app.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.yice.webadmin.app.service.*;
import com.yice.webadmin.app.dao.*;
import com.yice.webadmin.app.model.*;
import com.yice.common.core.base.dao.BaseDaoMapper;
import com.yice.common.core.object.MyRelationParam;
import com.yice.common.core.base.service.BaseService;
import com.yice.common.core.util.MyModelUtil;
import com.yice.common.sequence.wrapper.IdGeneratorWrapper;
import com.github.pagehelper.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 知识图谱管理数据操作服务类。
*
* @author linking
* @date 2023-04-13
*/
@Slf4j
@Service("kGManageService")
public class KGManageServiceImpl extends BaseService<KGManage, Long> implements KGManageService {
@Autowired
private KGManageMapper kGManageMapper;
@Autowired
private IdGeneratorWrapper idGenerator;
/**
* 返回当前Service的主表Mapper对象。
*
* @return 主表Mapper对象。
*/
@Override
protected BaseDaoMapper<KGManage> mapper() {
return kGManageMapper;
}
/**
* 保存新增对象。
*
* @param kGManage 新增对象。
* @return 返回新增对象。
*/
@Transactional(rollbackFor = Exception.class)
@Override
public KGManage saveNew(KGManage kGManage) {
kGManageMapper.insert(this.buildDefaultValue(kGManage));
return kGManage;
}
/**
* 利用数据库的insertList语法,批量插入对象列表。
*
* @param kGManageList 新增对象列表。
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void saveNewBatch(List<KGManage> kGManageList) {
if (CollUtil.isNotEmpty(kGManageList)) {
kGManageList.forEach(this::buildDefaultValue);
kGManageMapper.insertList(kGManageList);
}
}
/**
* 更新数据对象。
*
* @param kGManage 更新的对象。
* @param originalKGManage 原有数据对象。
* @return 成功返回true,否则false。
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean update(KGManage kGManage, KGManage originalKGManage) {
MyModelUtil.fillCommonsForUpdate(kGManage, originalKGManage);
// 这里重点提示,在执行主表数据更新之前,如果有哪些字段不支持修改操作,请用原有数据对象字段替换当前数据字段。
UpdateWrapper<KGManage> uw = this.createUpdateQueryForNullValue(kGManage, kGManage.getKgId());
return kGManageMapper.update(kGManage, uw) == 1;
}
/**
* 删除指定数据。
*
* @param kgId 主键Id。
* @return 成功返回true,否则false。
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean remove(Long kgId) {
return kGManageMapper.deleteById(kgId) == 1;
}
/**
* 获取单表查询结果。由于没有关联数据查询,因此在仅仅获取单表数据的场景下,效率更高。
* 如果需要同时获取关联数据,请移步(getKGManageListWithRelation)方法。
*
* @param filter 过滤对象。
* @param orderBy 排序参数。
* @return 查询结果集。
*/
@Override
public List<KGManage> getKGManageList(KGManage filter, String orderBy) {
return kGManageMapper.getKGManageList(filter, orderBy);
}
/**
* 获取主表的查询结果,以及主表关联的字典数据和一对一从表数据,以及一对一从表的字典数据。
* 该查询会涉及到一对一从表的关联过滤,或一对多从表的嵌套关联过滤,因此性能不如单表过滤。
* 如果仅仅需要获取主表数据,请移步(getKGManageList),以便获取更好的查询性能。
*
* @param filter 主表过滤对象。
* @param orderBy 排序参数。
* @return 查询结果集。
*/
@Override
public List<KGManage> getKGManageListWithRelation(KGManage filter, String orderBy) {
List<KGManage> resultList = kGManageMapper.getKGManageList(filter, orderBy);
// 在缺省生成的代码中,如果查询结果resultList不是Page对象,说明没有分页,那么就很可能是数据导出接口调用了当前方法。
// 为了避免一次性的大量数据关联,规避因此而造成的系统运行性能冲击,这里手动进行了分批次读取,开发者可按需修改该值。
int batchSize = resultList instanceof Page ? 0 : 1000;
this.buildRelationForDataList(resultList, MyRelationParam.normal(), batchSize);
return resultList;
}
private KGManage buildDefaultValue(KGManage kGManage) {
if (kGManage.getKgId() == null) {
kGManage.setKgId(idGenerator.nextLongId());
}
MyModelUtil.fillCommonsForInsert(kGManage);
return kGManage;
}
}
package com.yice.webadmin.app.util;
/*import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Config;*/
public class Neo4jUtil {
public void test() {
// 配置 Neo4j 驱动程序
/* Config config = Config.builder().
.withCredentials(AuthTokens.basic("username", "password")) // 替换为你的用户名和密码
.build();
// 获取 Neo4j 驱动实例
Driver driver = Driver.builder()
.withConfig(config)
.build();
// 打开与 Neo4j 的连接
try (GraphDatabase graphDatabase = driver.session()) {
// 在此处执行你的数据库操作
// 例如,查询节点或关系
// 关闭会话
graphDatabase.shutdown();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭驱动程序
driver.close();
}*/
}
}
package com.yice.webadmin.app.vo;
import com.yice.common.core.base.vo.BaseVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* KGManageVO视图对象。
*
* @author linking
* @date 2023-04-13
*/
@ApiModel("KGManageVO视图对象")
@Data
@EqualsAndHashCode(callSuper = true)
public class KGManageVo extends BaseVo {
/**
* 知识图谱ID。
*/
@ApiModelProperty(value = "知识图谱ID")
private Long kgId;
/**
* 知识图谱名称。
*/
@ApiModelProperty(value = "知识图谱名称")
private String kgName;
/**
* 知识图谱描述。
*/
@ApiModelProperty(value = "知识图谱描述")
private String kgDescribe;
/**
* 知识图谱地址。
*/
@ApiModelProperty(value = "知识图谱地址")
private String kgUrl;
/**
* 知识图谱用户名。
*/
@ApiModelProperty(value = "知识图谱用户名")
private String kgUserName;
/**
* 知识图谱密码。
*/
@ApiModelProperty(value = "知识图谱密码")
private String kgPassword;
/**
* 知识图谱浏览地址。
*/
@ApiModelProperty(value = "知识图谱浏览地址")
private String kgBowerUrl;
/**
* 知识图谱类型。
*/
@ApiModelProperty(value = "知识图谱类型")
private String kgType;
}
......@@ -48,4 +48,10 @@ public class KnowledgeManageVo extends BaseVo {
*/
@ApiModelProperty(value = "创建人名称")
private Map<String, Object> createUserIdDictMap;
/**
* 知识格式。
*/
@ApiModelProperty(value = "知识格式")
private String knowledgeFormat;
}
......@@ -28,7 +28,11 @@ public class ModelDeployVo extends BaseVo {
*/
@ApiModelProperty(value = "模型ID")
private Long modelId;
/**
* 模型名称。
*/
@ApiModelProperty(value = "模型名称")
private String modelName;
/**
* 版本ID。
*/
......@@ -70,4 +74,15 @@ public class ModelDeployVo extends BaseVo {
*/
@ApiModelProperty(value = "服务版本")
private Integer serviceVersion;
/**
* 资源信息。
*/
@ApiModelProperty(value = "资源信息")
private String resourceInfo;
/**
* 服务描述。
*/
@ApiModelProperty(value = "服务描述")
private String serviceRemark;
}
......@@ -78,10 +78,25 @@ python:
#python websocket 服务地址
pythonWebsocketUri: ws://192.168.0.36:7860/queue/join
#输出控制地址
controllerAddress: http://192.168.0.36:20001
controllerAddress: http://127.0.0.1:20001
#对话基础路径
chatAddress: http://192.168.0.36:7861/
chatAddress: http://192.168.0.36:8000/
llm-model:
#模型管理基础路径
llmModelInterface: http://192.168.0.36:7861/llm_model/
#模型停止
stop: stop
#模型模型部署
reload: reload
#模型部署
start: start
#列出当前已加载模型
listRunningModels: list_running_models
other:
#其他管理接口
otherInterface: http://192.168.0.36:7861/other/
#获取gpu信息
getGpuInfo: get_gpu_info
knowledge:
#知识库通用接口地址
knowledgeInterface: http://192.168.0.36:7861/knowledge_base/
......@@ -95,6 +110,10 @@ knowledge:
listFiles: list_files
#搜索知识库
searchDocs: search_docs
#直接更新知识库文档
updateDocsById: update_docs_by_id
#直接删除知识库文档片段
deleteDocsById: delete_docs_by_id
#上传文件到知识库,bing/或进行向量化
uploadDocs: upload_docs
#删除知识库内指定文件
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment