From fad28ee5ac0c9eb52b2dd1cfee911cefbceaeffc Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Sun, 12 Oct 2025 21:55:49 +0800 Subject: [PATCH] [feature](chat)Support delete all memory from the agent management. --- .../api/pojo/request/ChatMemoryDeleteReq.java | 19 +++++++++++++++++++ .../impl/ChatMemoryRepositoryImpl.java | 4 +--- .../chat/server/rest/MemoryController.java | 8 +++++--- .../chat/server/service/MemoryService.java | 3 ++- .../service/impl/MemoryServiceImpl.java | 13 +++++++++++-- .../chat/parser/llm/PromptHelper.java | 3 ++- .../translator/parser/SqlQueryParser.java | 3 ++- .../service/impl/DimensionServiceImpl.java | 8 +++----- .../service/impl/MetricServiceImpl.java | 6 ++---- .../server/utils/DataSetSchemaBuilder.java | 8 +++++--- 10 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryDeleteReq.java diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryDeleteReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryDeleteReq.java new file mode 100644 index 000000000..af9842f04 --- /dev/null +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryDeleteReq.java @@ -0,0 +1,19 @@ +package com.tencent.supersonic.chat.api.pojo.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ChatMemoryDeleteReq { + + private List ids; + + private Integer agentId; +} diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/repository/impl/ChatMemoryRepositoryImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/repository/impl/ChatMemoryRepositoryImpl.java index 837c69e06..9f5a15c0e 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/repository/impl/ChatMemoryRepositoryImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/repository/impl/ChatMemoryRepositoryImpl.java @@ -35,9 +35,7 @@ public class ChatMemoryRepositoryImpl implements ChatMemoryRepository { if (CollectionUtils.isEmpty(ids)) { return; } - for (Long id : ids) { - chatMemoryMapper.deleteById(id); - } + chatMemoryMapper.deleteByIds(ids); } @Override diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/MemoryController.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/MemoryController.java index fa8860da3..3f1461d9f 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/MemoryController.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/MemoryController.java @@ -4,12 +4,12 @@ import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult; import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryCreateReq; +import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryDeleteReq; import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryUpdateReq; import com.tencent.supersonic.chat.api.pojo.request.PageMemoryReq; import com.tencent.supersonic.chat.server.pojo.ChatMemory; import com.tencent.supersonic.chat.server.service.MemoryService; import com.tencent.supersonic.common.pojo.User; -import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -53,8 +53,10 @@ public class MemoryController { } @PostMapping("batchDelete") - public Boolean batchDelete(@RequestBody MetaBatchReq metaBatchReq) { - memoryService.batchDelete(metaBatchReq.getIds()); + public Boolean deleteMemory(@RequestBody ChatMemoryDeleteReq chatMemoryDeleteReq, + HttpServletRequest request, HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + memoryService.batchDelete(chatMemoryDeleteReq, user); return true; } } diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/MemoryService.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/MemoryService.java index 52d19adae..ea3b851bd 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/MemoryService.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/MemoryService.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.chat.server.service; import com.github.pagehelper.PageInfo; +import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryDeleteReq; import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryFilter; import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryUpdateReq; import com.tencent.supersonic.chat.api.pojo.request.PageMemoryReq; @@ -14,7 +15,7 @@ public interface MemoryService { void updateMemory(ChatMemoryUpdateReq chatMemoryUpdateReq, User user); - void batchDelete(List ids); + void batchDelete(ChatMemoryDeleteReq chatMemoryDeleteReq, User user); PageInfo pageMemories(PageMemoryReq pageMemoryReq); diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java index 5f0ee7cf5..241dde62d 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java @@ -6,6 +6,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult; import com.tencent.supersonic.chat.api.pojo.enums.MemoryStatus; +import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryDeleteReq; import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryFilter; import com.tencent.supersonic.chat.api.pojo.request.ChatMemoryUpdateReq; import com.tencent.supersonic.chat.api.pojo.request.PageMemoryReq; @@ -26,6 +27,7 @@ import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -108,14 +110,21 @@ public class MemoryServiceImpl implements MemoryService, CommandLineRunner { } @Override - public void batchDelete(List ids) { + public void batchDelete(ChatMemoryDeleteReq chatMemoryDeleteReq, User user) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().in(ChatMemoryDO::getId, ids); + if (!CollectionUtils.isEmpty(chatMemoryDeleteReq.getIds())) { + queryWrapper.lambda().in(ChatMemoryDO::getId, chatMemoryDeleteReq.getIds()); + } + if (chatMemoryDeleteReq.getAgentId() != null) { + queryWrapper.lambda().eq(ChatMemoryDO::getAgentId, chatMemoryDeleteReq.getAgentId()); + } List chatMemoryDOS = chatMemoryRepository.getMemories(queryWrapper); + List ids = new ArrayList<>(); chatMemoryDOS.forEach(chatMemoryDO -> { if (MemoryStatus.ENABLED.toString().equals(chatMemoryDO.getStatus().trim())) { disableMemory(chatMemoryDO); } + ids.add(chatMemoryDO.getId()); }); chatMemoryRepository.batchDelete(ids); } diff --git a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java index 3ce5f4b80..8513d650e 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java @@ -144,7 +144,8 @@ public class PromptHelper { dimensionStr.append(" ALIAS '").append(alias).append("'"); } if (Objects.nonNull(dimension.getExtInfo().get(DIMENSION_DATA_TYPE))) { - dimensionStr.append(" DATATYPE '").append(dimension.getExtInfo().get(DIMENSION_DATA_TYPE)).append("'"); + dimensionStr.append(" DATATYPE '") + .append(dimension.getExtInfo().get(DIMENSION_DATA_TYPE)).append("'"); } if (StringUtils.isNotEmpty(dimension.getTimeFormat())) { dimensionStr.append(" FORMAT '").append(dimension.getTimeFormat()).append("'"); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java index 675ff84f6..b6a7206ce 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java @@ -47,7 +47,8 @@ public class SqlQueryParser implements QueryParser { SqlQuery sqlQuery = queryStatement.getSqlQuery(); List queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql()); Set queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql()); - List> ontologyMetricsDimensionsAndBizName = Collections.synchronizedList(new ArrayList<>()); + List> ontologyMetricsDimensionsAndBizName = + Collections.synchronizedList(new ArrayList<>()); queryFields.removeAll(queryAliases); Ontology ontology = queryStatement.getOntology(); OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java index 7f97af235..14edb7b68 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java @@ -519,7 +519,7 @@ public class DimensionServiceImpl extends ServiceImpl dimensionDOS, EventType eventType) { - List dataItems = - dimensionDOS.stream().map(this::getDataItem) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + List dataItems = dimensionDOS.stream().map(this::getDataItem) + .filter(Objects::nonNull).collect(Collectors.toList()); return new DataEvent(this, dataItems, eventType); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java index 823849fb6..51f06c83b 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java @@ -682,10 +682,8 @@ public class MetricServiceImpl extends ServiceImpl } private DataEvent getDataEvent(List metricDOS, EventType eventType) { - List dataItems = - metricDOS.stream().map(this::getDataItem) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + List dataItems = metricDOS.stream().map(this::getDataItem) + .filter(Objects::nonNull).collect(Collectors.toList()); return new DataEvent(this, dataItems, eventType); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DataSetSchemaBuilder.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DataSetSchemaBuilder.java index 6bf4b975c..952996424 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DataSetSchemaBuilder.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/DataSetSchemaBuilder.java @@ -96,8 +96,9 @@ public class DataSetSchemaBuilder { Set dimensions = new HashSet<>(); Map> dataTypeMap = Maps.newHashMap(); for (ModelResp modelResp : resp.getModelResps()) { - dataTypeMap.put(modelResp.getId(), modelResp.getModelDetail().getFields().stream() - .collect(Collectors.toMap(Field::getFieldName, Field::getDataType, (k1, k2) -> k2))); + dataTypeMap.put(modelResp.getId(), + modelResp.getModelDetail().getFields().stream().collect(Collectors + .toMap(Field::getFieldName, Field::getDataType, (k1, k2) -> k2))); } for (DimSchemaResp dim : resp.getDimensions()) { @@ -119,7 +120,8 @@ public class DataSetSchemaBuilder { dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_TYPE, dim.getType()); // data type if (dim.getDataType() != null) { - dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE, dim.getDataType()); + dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE, + dim.getDataType()); } else { dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE, dataTypeMap.get(dim.getModelId()).get(dim.getBizName()));