应用管理
本文档详细介绍了应用管理模块的功能,包括已完成的核心功能、API 接口说明以及相关代码实现。旨在帮助开发者理解并有效利用应用管理功能。
目录
应用管理概述
在我们的系统中,一个应用(Application)就是一个智能体(Agent)。应用管理模块负责创建、更新、删除和查询应用,以及管理应用相关的模型和知识库。
已完成的核心功能
- 数据库设计:提供结构化的数据支持,确保片段数据的高效存储与管理。
- 用户登录:确保数据访问和操作的安全性,防止未经授权的访问。
- 知识库管理:支持知识库的创建、更新和删除,方便用户维护知识库内容。
- 文件拆分:将上传的文件拆分为多个片段,便于内容的精细化管理。
- 片段向量化:通过向量化技术,将片段内容转换为可计算的向量,便于进行相似度计算。
- 命中率测试:通过计算用户查询与片段的相似度,评估系统的匹配效果。
- 文档管理:实现对不同文档内容的管理,支持多文档的高效处理。
- 片段管理:实现对不同文档片段的管理,支持片段的增删改查操作。
- 问题管理:实现对不同文档片段的问题管理,支持问题的增删改查操作。
接下来,我们将详细介绍应用管理的 API 接口及其使用方法。
API 接口说明
验证应用数量
接口说明
验证当前用户的应用数量是否达到上限。
请求
- 方法:GET
- URL:
/api/valid/application/{number}
响应
{
"message": null,
"data": true,
"code": 200
}
说明
data
为true
表示未达到上限,可以继续创建应用。
创建应用
接口说明
创建一个新的应用。
请求
- 方法:POST
- URL:
/api/application
- 请求体:
{
"name": "ICS 111",
"desc": "",
"model_id": "",
"dialogue_number": 1,
"prologue": "您好,我是 XXX 小助手,您可以向我提出 XXX 使用问题。\n- XXX 主要功能有什么?\n- XXX 如何收费?\n- 需要转人工服务",
"dataset_id_list": [],
"dataset_setting": {
"top_n": 3,
"similarity": 0.6,
"max_paragraph_char_number": 5000,
"search_mode": "embedding",
"no_references_setting": {
"status": "ai_questioning",
"value": "{question}"
}
},
"model_setting": {
"prompt": "已知信息:{data}\n用户问题:{question}\n回答要求:\n - 请使用中文回答用户问题",
"system": "你是 xxx 小助手",
"no_references_prompt": "{question}"
},
"model_params_setting": {},
"problem_optimization": false,
"problem_optimization_prompt": "()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中",
"stt_model_id": "",
"tts_model_id": "",
"stt_model_enable": false,
"tts_model_enable": false,
"tts_type": "BROWSER",
"type": "SIMPLE"
}
响应
{
"message": null,
"data": {
"name": "ICS 111",
"id": "445547905684033536",
"type": "SIMPLE",
"stt_model_id": null,
"model_id": null,
"model_setting": {
"system": "你是 xxx 小助手",
"no_references_prompt": "{question}",
"prompt": "已知信息:{data}\n用户问题:{question}\n回答要求:\n - 请使用中文回答用户问题"
},
"tts_model_id": null,
"tts_type": "BROWSER",
"model_params_setting": {},
"problem_optimization": false,
"dataset_id_list": [],
"dialogue_number": 1,
"stt_model_enable": false,
"problem_optimization_prompt": "()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中",
"dataset_setting": {
"search_mode": "embedding",
"similarity": 0.6,
"top_n": 3,
"max_paragraph_char_number": 5000,
"no_references_setting": {
"value": "{question}",
"status": "ai_questioning"
}
},
"tts_model_enable": false,
"desc": "ICS 111",
"prologue": "您好,我是 XXX 小助手,您可以向我提出 XXX 使用问题。\n- XXX 主要功能有什么?\n- XXX 如何收费?\n- 需要转人工服务"
},
"code": 200
}
说明
- 请求体中的各字段需要根据实际情况填写,
dataset_id_list
和model_id
需要注意。 - 响应中会返回创建的应用的详细信息,包括应用 ID。
删除应用
接口说明
删除指定的应用。
请求
- 方法:DELETE
- URL:
/api/application/{applicationId}
示例
DELETE http://localhost:3000/api/application/445534102910513152
说明
{applicationId}
为要删除的应用 ID。
获取应用列表
接口说明
获取当前用户的所有应用列表。
请求
- 方法:GET
- URL:
/api/application
响应
{
"code": 200,
"message": "成功",
"data": [
{
"create_time": "2024-11-10T16:26:21.767",
"update_time": "2024-11-10T16:26:21.767",
"id": "445547905684033536",
"name": "ICS 141",
"desc": "ics 141 课程助手",
"prologue": "您好,我是 XXX 小助手,您可以向我提出 XXX 使用问题。\n- XXX 主要功能有什么?\n- XXX 如何收费?\n- 需要转人工服务",
"dialogue_number": 1,
"dataset_setting": {
"search_mode": "embedding",
"no_references_setting": {
"value": "{question}",
"status": "ai_questioning"
},
"top_n": 3,
"similarity": 0.6,
"max_paragraph_char_number": 5000
},
"model_setting": {
"prompt": "已知信息:{data}\n用户问题:{question}\n回答要求:\n - 请使用中文回答用户问题",
"system": "你是 xxx 小助手",
"no_references_prompt": "{question}"
},
"problem_optimization": false,
"model_id": null,
"user_id": "1",
"icon": "/ui/favicon.ico",
"type": "SIMPLE",
"work_flow": {},
"model_params_setting": "{}",
"stt_model_id": null,
"stt_model_enable": false,
"tts_model_id": null,
"tts_model_enable": false,
"tts_type": "BROWSER",
"problem_optimization_prompt": "()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中",
"tts_model_params_setting": "{}",
"clean_time": 180,
"multiple_rounds_dialogue": true
}
]
}
说明
- 返回当前用户的所有应用的列表信息。
获取应用详情
接口说明
获取指定应用的详细信息。
请求
- 方法:GET
- URL:
/api/application/{applicationId}
响应
{
"code": 200,
"message": "成功",
"data": {
"id": "7773b668-9f3d-11ef-8224-0242ac110005",
"create_time": "2024-11-10T16:26:21.767337",
"update_time": "2024-11-10T16:26:21.767352",
"name": "ICS 141",
"desc": "ics 141 课程助手",
"prologue": "您好,我是 XXX 小助手,您可以向我提出 XXX 使用问题。\n- XXX 主要功能有什么?\n- XXX 如何收费?\n- 需要转人工服务",
"dialogue_number": 1,
"dataset_setting": {
"search_mode": "embedding",
"no_references_setting": {
"value": "{question}",
"status": "ai_questioning"
},
"top_n": 3,
"similarity": 0.6,
"max_paragraph_char_number": 5000
},
"model_setting": {
"prompt": "已知信息:{data}\n用户问题:{question}\n回答要求:\n - 请使用中文回答用户问题",
"system": "你是 xxx 小助手",
"no_references_prompt": "{question}"
},
"model_params_setting": {},
"tts_model_params_setting": {},
"problem_optimization": false,
"icon": "/ui/favicon.ico",
"work_flow": {},
"type": "SIMPLE",
"problem_optimization_prompt": "()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中",
"tts_model_enable": false,
"stt_model_enable": false,
"tts_type": "BROWSER",
"clean_time": 180,
"user": "f0dd8f71-e4ee-11ee-8c84-a8a1595801ab",
"model": null,
"tts_model": null,
"stt_model": null,
"multiple_rounds_dialogue": true,
"dataset_id_list": []
}
}
说明
- 返回指定应用的详细信息,包括模型和知识库的配置等。
分页查询应用
接口说明
分页获取应用列表。
请求
- 方法:GET
- URL:
/api/application/{pageNo}/{pageSize}
示例
GET http://localhost:3000/api/application/1/20
响应
{
"message": null,
"data": {
"current": 1,
"total": 2,
"size": 20,
"records": [
{
"tenant_id": "0",
"code": null,
"icon": null,
"stt_model_id": null,
"remark": null,
"type": "SIMPLE",
"model_params_setting": {
"version": null
},
"tts_type": "BROWSER",
"updater": "",
"update_time": 1731386080926,
"problem_optimization_prompt": "()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中",
"model_setting": {
"prompt": "已知信息:{data}\n用户问题:{question}\n回答要求:\n - 请使用中文回答用户问题",
"no_references_prompt": "{question}",
"system": "你是 xxx 小助手"
},
"id": "445896762741698560",
"state": null,
"problem_optimization": false,
"dataset_setting": {
"max_paragraph_char_number": 5000,
"no_references_setting": {
"value": "{question}",
"status": "ai_questioning"
},
"similarity": 0.6,
"top_n": 3,
"search_mode": "embedding"
},
"prologue": "您好,我是 XXX 小助手,您可以向我提出 XXX 使用问题。\n- XXX 主要功能有什么?\n- XXX 如何收费?\n- 需要转人工服务",
"tts_model_params_setting": null,
"tts_model_id": null,
"creator": "",
"owner_name": null,
"tts_model_enable": false,
"create_time": 1731386080926,
"course_name": null,
"work_flow": null,
"model_id": "445909102044327936",
"dialogue_number": 1,
"deleted": 0,
"user_id": "1",
"stt_model_enable": false,
"name": "ICS 141",
"prompt": null,
"clean_time": null,
"desc": ""
}
]
},
"code": 200
}
说明
current
为当前页码,total
为总记录数,size
为每页大小,records
为应用列表。
获取应用的 Access Token
接口说明
获取指定应用的访问令牌(Access Token)。
请求
- 方法:GET
- URL:
/api/application/{applicationId}/access_token
示例
GET http://localhost:3000/api/application/445801809260630016/access_token
响应
{
"message": null,
"data": {
"tenant_id": "0",
"creator": "",
"is_active": true,
"create_time": 1731386080935,
"int_list": [],
"white_active": false,
"remark": null,
"application_id": "445896762741698560",
"updater": "",
"access_token": "7091794906473152",
"white_list": [],
"update_time": 1731386080935,
"deleted": 0,
"show_source": false,
"access_num": 100,
"long_list": []
},
"code": 200
}
说明
access_token
字段为应用的访问令牌。
获取应用统计信息
接口说明
获取应用的聊天记录统计信息。
请求
- 方法:GET
- URL:
/api/application/{applicationId}/statistics/chat_record_aggregate_trend
- 参数:
start_time
:开始日期,格式YYYY-MM-DD
end_time
:结束日期,格式YYYY-MM-DD
示例
GET /api/application/445896762741698560/statistics/chat_record_aggregate_trend?start_time=2024-11-04&end_time=2024-11-11
响应
{
"code": 200,
"message": "成功",
"data": [
{
"star_num": 0,
"trample_num": 0,
"tokens_num": 0,
"chat_record_count": 0,
"customer_num": 0,
"day": "2024-11-04",
"customer_added_count": 0
}
]
}
说明
- 返回指定日期范围内每天的统计数据。
获取应用关联的模型
接口说明
获取应用可用的模型列表。
请求
- 方法:GET
- URL:
/api/application/{applicationId}/model
- 可选参数:
model_type
:模型类型(如STT
、TTS
)
示例
GET /api/application/445896762741698560/model
响应
{
"message": null,
"data": [
{
"permission_type": "PRIVATE",
"model_name": "gpt-4o-mini",
"provider": "model_openai_provider",
"user_id": "1",
"meta": null,
"name": "gpt-4o-mini",
"model_type": "LLM",
"id": "442903767718461440",
"status": null,
"username": "admin"
}
],
"code": 200
}
说明
- 返回可用于该应用的模型列表,包含模型的详细信息。
获取应用关联的知识库
接口说明
获取应用可用的知识库列表。
请求
- 方法:GET
- URL:
/api/application/{applicationId}/list_dataset
响应
{
"code": 200,
"message": "成功",
"data": [
{
"create_time": "2024-09-14T19:08:45.273",
"update_time": "2024-09-14T19:08:45.273",
"id": "b57cc7aa-7289-11ef-bc3a-0242ac110005",
"name": "cs 146",
"desc": "cs 146",
"type": "0",
"meta": "{}",
"user_id": "f0dd8f71-e4ee-11ee-8c84-a8a1595801ab",
"embedding_mode_id": "42f63a3d-427e-11ef-b3ec-a8a1595801ab"
}
]
}
说明
- 返回可用于该应用的知识库列表。
更新应用信息
接口说明
更新指定的应用信息。
请求
- 方法:PUT
- URL:
/api/application/{applicationId}
- 请求体:
{
"tenant_id": "0",
"code": null,
"icon": null,
"remark": null,
"type": "SIMPLE",
"dataset_id_list": ["443309276048408576"],
"model_params_setting": {
"version": null
},
"tts_type": "BROWSER",
"updater": "",
"update_time": 1731395249335,
"problem_optimization_prompt": "()里面是用户问题,根据上下文回答揣测用户问题({question}) 要求: 输出一个补全问题,并且放在<data></data>标签中",
"model_setting": {
"prompt": "已知信息:{data}\n用户问题:{question}\n回答要求:\n - 请使用中文回答用户问题",
"no_references_prompt": "{question}",
"system": "你是 xxx 小助手"
},
"model": null,
"id": "445935217093427200",
"state": null,
"problem_optimization": false,
"dataset_setting": {
"max_paragraph_char_number": 5000,
"no_references_setting": {
"value": "{question}",
"status": "ai_questioning"
},
"similarity": 0.6,
"top_n": 3,
"search_mode": "embedding"
},
"prologue": "您好,我是 XXX 小助手,您可以向我提出 XXX 使用问题。\n- XXX 主要功能有什么?\n- XXX 如何收费?\n- 需要转人工服务",
"tts_model_params_setting": null,
"creator": "",
"owner_name": null,
"tts_model_enable": false,
"create_time": 1731395249335,
"course_name": null,
"work_flow": null,
"dialogue_number": 1,
"deleted": 0,
"user_id": "1",
"stt_model_enable": false,
"name": "ics 141",
"prompt": null,
"clean_time": null,
"desc": "",
"model_id": "445909102044327936"
}
说明
- 请求体中的
dataset_id_list
和model_id
需要根据实际情况填写。 - 该接口用于更新应用的各项配置。
代码实现
以下是应用管理模块的主要代码实现,包括控制器和服务层的代码。
ApiApplicationController.java
package com.litongjava.maxkb.controller;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.litongjava.annotation.Delete;
import com.litongjava.annotation.Get;
import com.litongjava.annotation.Post;
import com.litongjava.annotation.Put;
import com.litongjava.annotation.RequestPath;
import com.litongjava.db.TableInput;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.maxkb.service.MaxKbApplicationAccessTokenService;
import com.litongjava.maxkb.service.MaxKbApplicationService;
import com.litongjava.maxkb.vo.MaxKbApplicationVo;
import com.litongjava.model.result.ResultVo;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HttpRequest;
import com.litongjava.tio.utils.json.JsonUtils;
@RequestPath("/api/application")
public class ApiApplicationController {
@Post
public ResultVo create(MaxKbApplicationVo application) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbApplicationService.class).create(userId, application);
}
@Put("/{applicationId}")
public ResultVo update(Long applicationId, HttpRequest request) {
String bodyString = request.getBodyString();
MaxKbApplicationVo application = JsonUtils.parse(bodyString, MaxKbApplicationVo.class);
Long userId = TioRequestContext.getUserIdLong();
application.setId(applicationId);
return Aop.get(MaxKbApplicationService.class).update(userId, application);
}
@Delete("/{applicationId}")
public ResultVo delete(Long applicationId) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbApplicationService.class).delete(userId, applicationId);
}
@Get("/{applicationId}")
public ResultVo getById(Long applicationId) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbApplicationService.class).get(userId, applicationId);
}
@Get
public ResultVo list() {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbApplicationService.class).list(userId);
}
@Get("/{pageNo}/{pageSize}")
public ResultVo page(Integer pageNo, Integer pageSize, String name) {
TableInput tableInput = new TableInput();
tableInput.setPageNo(pageNo).setPageSize(pageSize);
tableInput.setSearchKey(name);
return Aop.get(MaxKbApplicationService.class).page(tableInput);
}
@Get("/{applicationId}/access_token")
public ResultVo getAccessToken(Long applicationId) {
return Aop.get(MaxKbApplicationAccessTokenService.class).getById(applicationId);
}
@Get("/{applicationId}/statistics/chat_record_aggregate_trend")
public ResultVo statisticsOfCharRecordAggreagteTrend(Long applicationId, String start_time, String end_time) {
LocalDate startDate = LocalDate.parse(start_time);
LocalDate endDate = LocalDate.parse(end_time);
List<Map<String, Object>> dataList = new ArrayList<>();
LocalDate currentDate = startDate;
while (!currentDate.isAfter(endDate)) {
Map<String, Object> dailyData = new HashMap<>();
dailyData.put("star_num", 0);
dailyData.put("trample_num", 0);
dailyData.put("tokens_num", 0);
dailyData.put("chat_record_count", 0);
dailyData.put("customer_num", 0);
dailyData.put("day", currentDate.toString());
dailyData.put("customer_added_count", 0);
dataList.add(dailyData);
currentDate = currentDate.plusDays(1);
}
return ResultVo.ok(dataList);
}
@Get("/{applicationId}/model")
public ResultVo listApplicaionModel(Long applicationId) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbApplicationService.class).listApplicaionModel(userId, applicationId);
}
@Get("/{applicationId}/model_params_form/{modelId}")
public ResultVo setModelId(Long applicationId, Long modelId) {
Long userIdLong = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbApplicationService.class).setModelId(userIdLong, applicationId, modelId);
}
@Get("/{applicationId}/list_dataset")
public ResultVo listApplicaionDataset(Long applicationId) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbApplicationService.class).listApplicaionDataset(userId, applicationId);
}
}
说明
ApiApplicationController
类包含了应用管理的所有 API 接口。- 使用了自定义的注解来定义请求路径和请求方法。
MaxKbApplicationService.java
package com.litongjava.maxkb.service;
import java.util.ArrayList;
import java.util.List;
import com.jfinal.kit.Kv;
import com.litongjava.db.TableInput;
import com.litongjava.db.TableResult;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.kit.PGJsonUtils;
import com.litongjava.maxkb.constant.TableNames;
import com.litongjava.maxkb.model.MaxKbApplication;
import com.litongjava.maxkb.model.MaxKbApplicationDatasetMapping;
import com.litongjava.maxkb.model.MaxKbModel;
import com.litongjava.maxkb.vo.MaxKbApplicationVo;
import com.litongjava.maxkb.vo.MaxKbDatasetSettingVo;
import com.litongjava.maxkb.vo.MaxKbModelParamsSetting;
import com.litongjava.maxkb.vo.MaxKbModelSetting;
import com.litongjava.model.page.Page;
import com.litongjava.model.result.ResultVo;
import com.litongjava.table.services.ApiTable;
import com.litongjava.tio.utils.snowflake.SnowflakeIdUtils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MaxKbApplicationService {
public ResultVo create(Long userId, MaxKbApplicationVo application) {
Long applicationId = SnowflakeIdUtils.id();
application.setId(applicationId);
Row row = Row.fromBean(application);
row.remove("dataset_id_list");
row.set("user_id", userId);
Db.save(MaxKbApplication.tableName, row);
Aop.get(MaxKbApplicationAccessTokenService.class).create(applicationId);
return ResultVo.ok(application);
}
public ResultVo update(Long userId, MaxKbApplicationVo application) {
List<Long> dataset_id_list = application.getDataset_id_list();
List<MaxKbApplicationDatasetMapping> saveRecords = new ArrayList<>();
if (dataset_id_list != null) {
for (Long datasetId : dataset_id_list) {
MaxKbApplicationDatasetMapping mapping = new MaxKbApplicationDatasetMapping();
mapping.setId(SnowflakeIdUtils.id()).setDatasetId(datasetId).setApplicationId(application.getId());
saveRecords.add(mapping);
}
}
Row row = Row.fromBean(application);
row.remove("dataset_id_list");
row.set("user_id", userId);
Db.tx(() -> {
if (saveRecords.size() > 0) {
Db.batchSave(saveRecords, 2000);
}
Db.update(MaxKbApplication.tableName, row);
return true;
});
return ResultVo.ok();
}
public ResultVo delete(Long userId, Long applicationId) {
boolean deleted = new MaxKbApplication().setId(applicationId).setUserId(userId).delete();
Aop.get(MaxKbApplicationAccessTokenService.class).delete(userId, applicationId);
return ResultVo.ok(deleted);
}
public ResultVo page(TableInput tableInput) {
Integer pageNo = tableInput.getPageNo();
Integer pageSize = tableInput.getPageSize();
log.info("page:{},{}", pageNo, pageSize);
tableInput.setFrom(TableNames.max_kb_application);
TableResult<Page<Row>> result = ApiTable.page(tableInput);
Page<Row> page = result.getData();
List<Row> records = page.getList();
List<Kv> kvs = new ArrayList<>();
for (Row row : records) {
PGJsonUtils.toBean(row, "model_setting", MaxKbModelSetting.class);
PGJsonUtils.toBean(row, "model_params_setting", MaxKbModelParamsSetting.class);
PGJsonUtils.toBean(row, "dataset_setting", MaxKbDatasetSettingVo.class);
kvs.add(row.toKv());
}
Kv kv = Kv.by("current", pageNo).set("size", pageSize).set("total", page.getTotalRow()).set("records", kvs);
return ResultVo.ok(kv);
}
public ResultVo list(Long userId) {
Row quereyRecord = new Row();
quereyRecord.set("user_id", userId);
List<Row> records = Db.find(TableNames.max_kb_application, quereyRecord);
List<Kv> kvs = new ArrayList<>();
for (Row row : records) {
PGJsonUtils.toBean(row, "model_params_setting", MaxKbModelParamsSetting.class);
PGJsonUtils.toBean(row, "model_setting", MaxKbModelSetting.class);
PGJsonUtils.toBean(row, "dataset_setting", MaxKbDatasetSettingVo.class);
Kv kv = row.toKv();
kvs.add(kv);
}
return ResultVo.ok(kvs);
}
public ResultVo get(Long userId, Long applicationId) {
Row quereyRecord = new MaxKbApplication().setId(applicationId).setUserId(userId).toRecord();
Row row = Db.findFirst(MaxKbApplication.tableName, quereyRecord);
PGJsonUtils.toBean(row, "model_params_setting", MaxKbModelParamsSetting.class);
PGJsonUtils.toBean(row, "model_setting", MaxKbModelSetting.class);
PGJsonUtils.toBean(row, "dataset_setting", MaxKbDatasetSettingVo.class);
Long modelId = row.getLong("model_id");
row.remove("model_id");
String sql = String.format("select dataset_id from %s where application_id=?", MaxKbApplicationDatasetMapping.tableName);
List<Long> dataset_id_list = Db.queryListLong(sql, applicationId);
row.set("dataset_id_list", dataset_id_list);
row.set("model", modelId);
Kv kv = row.toKv();
return ResultVo.ok(kv);
}
public ResultVo listApplicaionModel(Long userId, Long applicationId) {
Row queryRecord = Row.by("user_id", userId);
String columns = "id,name,provider,model_type,model_name,status,meta,permission_type,user_id";
List<Row> list = Db.find(MaxKbModel.tableName, columns, queryRecord);
List<Kv> kvs = new ArrayList<>();
MaxKbUserService maxKbUserService = Aop.get(MaxKbUserService.class);
for (Row row : list) {
Long user_id = row.getLong("user_id");
String username = maxKbUserService.queryUsername(user_id);
row.set("username", username);
kvs.add(row.toKv());
}
return ResultVo.ok(kvs);
}
public ResultVo setModelId(Long userIdLong, Long applicationId, Long modelId) {
Row updateRecord = Row.by("id", modelId).set("id", applicationId).set("user_id", userIdLong).set("model_id", modelId);
boolean update = Db.update(MaxKbApplication.tableName, "id,user_id", updateRecord);
return ResultVo.ok(update);
}
public ResultVo listApplicaionDataset(Long userId, Long applicationId) {
return Aop.get(MaxKbDatasetService.class).list(userId);
}
}
说明
MaxKbApplicationService
类包含了应用管理的业务逻辑。- 包含创建、更新、删除、查询等方法。
- 使用了事务管理和批量保存等技术。
结论
本文档详细介绍了应用管理模块的 API 接口和代码实现,旨在帮助开发者理解应用管理的功能和使用方法。通过上述接口,开发者可以方便地创建、更新、删除和查询应用,以及管理应用关联的模型和知识库。