diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/common/module/PreRunningAbstractAgentModuleAbstract.java b/Partner-Core/src/main/java/work/slhaf/partner/module/common/module/PreRunningAbstractAgentModuleAbstract.java index a95f05a1..26012c74 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/common/module/PreRunningAbstractAgentModuleAbstract.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/common/module/PreRunningAbstractAgentModuleAbstract.java @@ -15,7 +15,7 @@ public abstract class PreRunningAbstractAgentModuleAbstract extends AbstractAgen data.setModuleName(moduleName()); Map map = getPromptDataMap(context); data.setAppendedPrompt(map); - context.setAppendedPrompt(data); + context.appendPrompt(data); } private synchronized void setActiveModule(PartnerRunningFlowContext context) { diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java index 443ec5a0..88115ed0 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/ActionDispatcher.java @@ -40,7 +40,7 @@ public class ActionDispatcher extends PostRunningAbstractAgentModuleAbstract { // 对于将触发的PLANNING // action,理想做法是将执行工具做成执行链的形式,模型的自对话流程、是否通知用户都做成与普通工具同等的通用可选能力,避免绑定固定流程 executor.execute(() -> { - String userId = context.getUserId(); + String userId = context.getSource(); val preparedActions = actionCapability.listActions(ExecutableAction.Status.PREPARE, userId); // 分类成PLANNING和IMMEDIATE两类 Set scheduledActions = new HashSet<>(); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java index ed157de1..1d30f0ab 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java @@ -58,8 +58,8 @@ public class ActionInterventor extends PreRunningAbstractAgentModuleAbstract imp // 首先通过recognizer进行快速意图识别,识别成功则步入评估阶段,评估成功则直接作用于目标行动链 // 进行快速意图识别时必须结合近期对话与进行中行动链情况 // 干预意图识别 - String uuid = context.getUuid(); - String userId = context.getUserId(); + String uuid = context.getInfo().getUuid(); + String userId = context.getSource(); RecognizerResult recognizerResult = interventionRecognizer .execute(assemblyHelper.buildRecognizerInput(userId, context.getInput())); // 此处的输入内容携带了所有 PhaserRecord if (!recognizerResult.isOk()) { @@ -141,7 +141,7 @@ public class ActionInterventor extends PreRunningAbstractAgentModuleAbstract imp @Override protected Map getPromptDataMap(PartnerRunningFlowContext context) { - return interventionPrompt.remove(context.getUuid()); + return interventionPrompt.remove(context.getInfo().getUuid()); } @Override diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java index 3643e12a..4fa0c40e 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java @@ -83,7 +83,7 @@ public class ActionPlanner extends PreRunningAbstractAgentModuleAbstract { if (extractorResult.getTendencies().isEmpty()) { return null; } - EvaluatorInput evaluatorInput = assemblyHelper.buildEvaluatorInput(extractorResult, context.getUserId()); + EvaluatorInput evaluatorInput = assemblyHelper.buildEvaluatorInput(extractorResult, context.getSource()); List evaluatorResults = actionEvaluator.execute(evaluatorInput); // 并发操作均为访问 putActionData(evaluatorResults, context); updateTendencyCache(evaluatorResults, context.getInput(), extractorResult); @@ -134,7 +134,7 @@ public class ActionPlanner extends PreRunningAbstractAgentModuleAbstract { if (uuids == null) { return; } - List pendingActions = actionCapability.popPendingAction(context.getUserId()); + List pendingActions = actionCapability.popPendingAction(context.getSource()); for (ExecutableAction executableAction : pendingActions) { if (uuids.contains(executableAction.getUuid())) { actionCapability.putAction(executableAction); @@ -144,9 +144,9 @@ public class ActionPlanner extends PreRunningAbstractAgentModuleAbstract { private void putActionData(List evaluatorResults, PartnerRunningFlowContext context) { for (EvaluatorResult evaluatorResult : evaluatorResults) { - ExecutableAction executableAction = assemblyHelper.buildActionData(evaluatorResult, context.getUserId()); + ExecutableAction executableAction = assemblyHelper.buildActionData(evaluatorResult, context.getSource()); if (evaluatorResult.isNeedConfirm()) { - actionCapability.putPendingActions(context.getUserId(), executableAction); + actionCapability.putPendingActions(context.getSource(), executableAction); } else { actionCapability.putAction(executableAction); } @@ -156,7 +156,7 @@ public class ActionPlanner extends PreRunningAbstractAgentModuleAbstract { @Override protected Map getPromptDataMap(PartnerRunningFlowContext context) { HashMap map = new HashMap<>(); - String userId = context.getUserId(); + String userId = context.getSource(); setupPendingActions(map, userId); setupPreparedActions(map, userId); return map; @@ -327,7 +327,7 @@ public class ActionPlanner extends PreRunningAbstractAgentModuleAbstract { private ConfirmerInput buildConfirmerInput(PartnerRunningFlowContext context) { ConfirmerInput confirmerInput = new ConfirmerInput(); confirmerInput.setInput(context.getInput()); - List pendingActions = actionCapability.listPendingAction(context.getUserId()); + List pendingActions = actionCapability.listPendingAction(context.getSource()); confirmerInput.setExecutableActionData(pendingActions); return confirmerInput; } diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java index 289177f7..8fa9ec98 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/core/CoreModel.java @@ -61,7 +61,7 @@ public class CoreModel extends AbstractAgentModule.Running baseMessages = getModel().getBaseMessages(); - List<@NotNull Message> chatMessages = getModel().getChatMessages(); + List baseMessages = getModel().getBaseMessages(); + List chatMessages = getModel().getChatMessages(); List temp = new ArrayList<>(baseMessages.subList(0, baseMessages.size() - 2)); temp.addAll(appendedMessages); temp.addAll(baseMessages.subList(baseMessages.size() - 2, baseMessages.size())); @@ -155,7 +155,7 @@ public class CoreModel extends AbstractAgentModule.Running chatMessages = getModel().getChatMessages(); + List chatMessages = getModel().getChatMessages(); chatMessages.removeIf(m -> { if (m.getRole().equals(ChatConstant.Character.ASSISTANT)) { return false; @@ -178,10 +178,10 @@ public class CoreModel extends AbstractAgentModule.Running selectAndEvaluateMemory(PartnerRunningFlowContext runningFlowContext, ExtractorResult extractorResult) { log.debug("[MemorySelector] 触发记忆回溯..."); //查找切片 - String userId = runningFlowContext.getUserId(); + String userId = runningFlowContext.getSource(); List memoryResultList = new ArrayList<>(); setMemoryResultList(memoryResultList, extractorResult.getMatches(), userId); //评估切片 @@ -70,7 +70,7 @@ public class MemorySelector extends PreRunningAbstractAgentModuleAbstract { } private void setModuleContextRecall(PartnerRunningFlowContext runningFlowContext) { - String userId = runningFlowContext.getUserId(); + String userId = runningFlowContext.getSource(); boolean recall = memoryCapability.hasActivatedSlices(userId); runningFlowContext.getModuleContext().getExtraContext().put("recall", recall); if (recall) { @@ -127,7 +127,7 @@ public class MemorySelector extends PreRunningAbstractAgentModuleAbstract { @Override protected Map getPromptDataMap(PartnerRunningFlowContext context) { HashMap map = new HashMap<>(); - String userId = context.getUserId(); + String userId = context.getSource(); String dialogMapStr = memoryCapability.getDialogMapStr(); if (!dialogMapStr.isEmpty()) { map.put("[记忆缓存] <你最近两日和所有聊天者的对话记忆印象>", dialogMapStr); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java index 31ff890f..da760e2b 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/selector/extractor/MemorySelectExtractor.java @@ -37,9 +37,9 @@ public class MemorySelectExtractor extends AbstractAgentModule.Sub chatMessages = new ArrayList<>(); - List metaMessages = cognationCapability.getSingleMetaMessageMap().get(context.getUserId()); + List metaMessages = cognationCapability.getSingleMetaMessageMap().get(context.getSource()); if (metaMessages == null) { - cognationCapability.getSingleMetaMessageMap().put(context.getUserId(), new ArrayList<>()); + cognationCapability.getSingleMetaMessageMap().put(context.getSource(), new ArrayList<>()); } else { for (MetaMessage metaMessage : metaMessages) { chatMessages.add(metaMessage.getUserMessage()); @@ -48,10 +48,10 @@ public class MemorySelectExtractor extends AbstractAgentModule.Sub activatedMemorySlices = memoryCapability.getActivatedSlices(context.getUserId()); + List activatedMemorySlices = memoryCapability.getActivatedSlices(context.getSource()); ExtractorInput extractorInput = ExtractorInput.builder() .text(context.getInput()) - .date(context.getDateTime().toLocalDate()) + .date(context.getInfo().getDateTime().toLocalDate()) .history(chatMessages) .topic_tree(memoryCapability.getTopicTree()) .activatedMemorySlices(activatedMemorySlices) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/updater/MemoryUpdater.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/updater/MemoryUpdater.java index 3be25d4a..c12406a2 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/updater/MemoryUpdater.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/memory/updater/MemoryUpdater.java @@ -86,7 +86,7 @@ public class MemoryUpdater extends PostRunningAbstractAgentModuleAbstract { @Override public void doExecute(PartnerRunningFlowContext context) { - if (context.isFinished()) { + if (context.getFinished()) { log.warn("[MemoryUpdater] 流程强制结束, 不触发记忆被动更新机制"); return; } diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java index 674fdb8f..64da3a78 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/selector/PerceiveSelector.java @@ -22,7 +22,7 @@ public class PerceiveSelector extends PreRunningAbstractAgentModuleAbstract { @Override protected Map getPromptDataMap(PartnerRunningFlowContext context) { HashMap map = new HashMap<>(); - User user = perceiveCapability.getUser(context.getUserId()); + User user = perceiveCapability.getUser(context.getSource()); map.put("[关系] <你与最新聊天用户的关系>", user.getRelation()); map.put("[态度] <你对于最新聊天用户的态度>", user.getAttitude().toString()); map.put("[印象] <你对于最新聊天用户的印象>", user.getImpressions().toString()); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java index b62b819e..92df4667 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/PerceiveUpdater.java @@ -47,7 +47,7 @@ public class PerceiveUpdater extends PostRunningAbstractAgentModuleAbstract { executor.execute(() -> { ReentrantLock userLock = new ReentrantLock(); User user = new User(); - user.setUuid(context.getUserId()); + user.setUuid(context.getSource()); List> tasks = new ArrayList<>(); tasks.add(() -> { runStaticExtractorAction(context, userLock, user); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java index 347fe2c4..44691d36 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/modules/perceive/updater/relation_extractor/RelationExtractor.java @@ -31,7 +31,7 @@ public class RelationExtractor extends AbstractAgentModule.Sub(cognationCapability.getChatMessages()); - String userId = context.getUserId(); + String userId = context.getSource(); RelationExtractInput input = getRelationInput(userId); RelationExtractResult relationExtractResult = getRelationResult(input); User user = getTempUser(context, relationExtractResult); @@ -41,7 +41,7 @@ public class RelationExtractor extends AbstractAgentModule.Sub execute(PartnerRunningFlowContext context) { StaticMemoryExtractInput input = StaticMemoryExtractInput.builder() - .userId(context.getUserId()) + .userId(context.getSource()) .messages(cognationCapability.getChatMessages()) - .existedStaticMap(perceiveCapability.getUser(context.getUserId()).getStaticMemory()) + .existedStaticMap(perceiveCapability.getUser(context.getSource()).getStaticMemory()) .build(); ChatResponse response = singleChat(JSONUtil.toJsonPrettyStr(input)); JSONObject jsonObject = JSONObject.parseObject(response.getMessage()); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java index a2223701..c3a40861 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/PartnerInteractionAdapter.java @@ -1,38 +1,42 @@ package work.slhaf.partner.runtime.interaction; +import org.jetbrains.annotations.NotNull; import work.slhaf.partner.api.agent.runtime.interaction.AgentInteractionAdapter; import work.slhaf.partner.runtime.interaction.data.PartnerInputData; import work.slhaf.partner.runtime.interaction.data.PartnerOutputData; import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowContext; +import java.time.ZonedDateTime; + public class PartnerInteractionAdapter extends AgentInteractionAdapter { + @NotNull @Override protected PartnerOutputData parseOutputData(PartnerRunningFlowContext outputContext) { PartnerOutputData outputData = new PartnerOutputData(); - outputData.setCode(outputContext.getOk()); + outputData.setCode(outputContext.getStatus().getOk() ? 1 : 0); outputData.setContent(getContent(outputContext)); - outputData.setUserInfo(outputContext.getUserInfo()); - outputData.setDateTime(outputContext.getDateTime()); + outputData.setUserInfo(outputContext.getTarget()); + outputData.setDateTime(ZonedDateTime.now().toLocalDateTime()); return outputData; } private String getContent(PartnerRunningFlowContext outputContext) { StringBuilder str = new StringBuilder(); - str.append(outputContext.getCoreResponse().getString("text")).append("\r\n") - .append("\r\n错误信息:\r\n") - .append(outputContext.getErrMsg().toString()); + str.append(outputContext.getCoreResponse().getString("text")); + if (!outputContext.getStatus().getOk()) { + str.append("\r\n").append("\r\n错误信息:\r\n").append(outputContext.getStatus().getErrors()); + } return str.toString(); } + @NotNull @Override protected PartnerRunningFlowContext parseInputData(PartnerInputData inputData) { - PartnerRunningFlowContext context = new PartnerRunningFlowContext(); - context.setUserNickname(inputData.getUserNickName()); - context.setUserInfo(inputData.getUserInfo()); - context.setDateTime(inputData.getDateTime()); - context.setSingle(inputData.isSingle()); - context.setPlatform(inputData.getPlatform()); - context.setInput(inputData.getContent()); - return context; + return new PartnerRunningFlowContext( + inputData.getUserInfo(), + inputData.getContent(), + inputData.getPlatform(), + inputData.getUserNickName() + ); } } diff --git a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.kt b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.kt index a154221c..5e5d8b56 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.kt +++ b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/PartnerRunningFlowContext.kt @@ -1,51 +1,33 @@ -package work.slhaf.partner.runtime.interaction.data.context; +package work.slhaf.partner.runtime.interaction.data.context -import com.alibaba.fastjson2.JSONObject; -import lombok.Data; -import lombok.EqualsAndHashCode; -import work.slhaf.partner.api.agent.runtime.interaction.flow.RunningFlowContext; -import work.slhaf.partner.module.common.entity.AppendPromptData; -import work.slhaf.partner.runtime.interaction.data.context.subcontext.CoreContext; -import work.slhaf.partner.runtime.interaction.data.context.subcontext.ModuleContext; +import com.alibaba.fastjson2.JSONObject +import work.slhaf.partner.api.agent.runtime.interaction.flow.RunningFlowContext +import work.slhaf.partner.module.common.entity.AppendPromptData +import work.slhaf.partner.runtime.interaction.data.context.subcontext.CoreContext +import work.slhaf.partner.runtime.interaction.data.context.subcontext.ModuleContext -import java.io.Serial; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; +class PartnerRunningFlowContext( + override val source: String, + override val input: String, + platform: String, + nickName: String +) : RunningFlowContext() { -@EqualsAndHashCode(callSuper = true) -@Data -public class PartnerRunningFlowContext extends RunningFlowContext { - - @Serial - private static final long serialVersionUID = 1L; - - protected String userId; - protected String userNickname; - protected String userInfo; - protected String platform; - protected LocalDateTime dateTime; - protected boolean single; - - protected String input; - - protected CoreContext coreContext = new CoreContext(); - protected ModuleContext moduleContext = new ModuleContext(); - protected JSONObject coreResponse = new JSONObject(); - - protected String uuid = UUID.randomUUID().toString(); - - public boolean isFinished() { - return moduleContext.isFinished(); + init { + putUserInfo("platform", platform) + putUserInfo("nickname", nickName) } - public void setFinished(boolean finished) { - moduleContext.setFinished(finished); - } + val moduleContext = ModuleContext() + val coreContext = CoreContext() + val coreResponse = JSONObject() - public void setAppendedPrompt(AppendPromptData appendedPrompt) { - List appendPromptList = moduleContext.getAppendedPrompt(); - appendPromptList.addFirst(appendedPrompt); - } + var finished: Boolean + get() = moduleContext.isFinished + set(value) { + moduleContext.isFinished = value + } + + fun appendPrompt(appendPromptData: AppendPromptData) = moduleContext.appendPromptData(appendPromptData) } diff --git a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/subcontext/ModuleContext.java b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/subcontext/ModuleContext.java index afc91398..7c7c7384 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/subcontext/ModuleContext.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/runtime/interaction/data/context/subcontext/ModuleContext.java @@ -20,4 +20,8 @@ public class ModuleContext extends PersistableObject { private List appendedPrompt = new ArrayList<>(); private JSONObject extraContext = new JSONObject(); private boolean finished = false; + + public void appendPromptData(AppendPromptData appendPromptData) { + this.appendedPrompt.addFirst(appendPromptData); + } } diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentRuntime.kt b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentRuntime.kt index 16db55e9..42576d25 100644 --- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentRuntime.kt +++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/AgentRuntime.kt @@ -51,10 +51,9 @@ object AgentRuntime { for (modules in runningModules.values) { executeOrder(modules, runningFlowContext) } - runningFlowContext.ok = 1 } catch (e: Exception) { - runningFlowContext.ok = 0 - runningFlowContext.errMsg.add(e.localizedMessage) + runningFlowContext.status.ok = false + runningFlowContext.status.errMsg.add(e.localizedMessage) } return runningFlowContext diff --git a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/RunningFlowContext.kt b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/RunningFlowContext.kt index 02eecd78..a2160337 100644 --- a/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/RunningFlowContext.kt +++ b/Partner-Framework/src/main/java/work/slhaf/partner/api/agent/runtime/interaction/flow/RunningFlowContext.kt @@ -1,18 +1,63 @@ -package work.slhaf.partner.api.agent.runtime.interaction.flow; +package work.slhaf.partner.api.agent.runtime.interaction.flow -import lombok.Data; -import lombok.EqualsAndHashCode; -import work.slhaf.partner.api.common.entity.PersistableObject; - -import java.util.ArrayList; -import java.util.List; +import com.alibaba.fastjson2.JSONObject +import java.time.LocalDateTime +import java.time.ZonedDateTime +import java.util.* /** * 流程上下文 */ -@EqualsAndHashCode(callSuper = true) -@Data -public abstract class RunningFlowContext extends PersistableObject { - protected int ok; - protected List errMsg = new ArrayList<>(); +abstract class RunningFlowContext { + /** + * 消息来源: 由谁发出 + */ + abstract val source: String + + /** + * 消息内容 + */ + abstract val input: String + + /** + * 消息回应对象,默认与 source 一致 + */ + var target = source + + private val _additionalUserInfo = mutableMapOf() + val additionalUserInfo: Map + get() = _additionalUserInfo + + val status = Status() + val info = Info() + + fun putUserInfo(key: String, value: String) { + _additionalUserInfo[key] = value + } + + fun putUserInfo(key: String, value: Any) { + _additionalUserInfo[key] = try { + JSONObject.toJSONString(value) + } catch (e: Exception) { + value.toString() + } + } + + class Info { + val uuid = UUID.randomUUID().toString() + val dateTime: LocalDateTime = ZonedDateTime.now().toLocalDateTime() + } + + class Status { + /** + * 本次 runningFlow 是否正常执行 + */ + val ok: Boolean + get() = errors.isEmpty() + + /** + * 本次执行时收集到的异常信息 + */ + var errors = mutableListOf() + } }