refactor(context): migrate running flow context to source/status/info model, and update related modules

This commit is contained in:
2026-03-04 17:21:34 +08:00
parent 56688785ba
commit e6a071fc93
17 changed files with 139 additions and 105 deletions

View File

@@ -15,7 +15,7 @@ public abstract class PreRunningAbstractAgentModuleAbstract extends AbstractAgen
data.setModuleName(moduleName());
Map<String, String> map = getPromptDataMap(context);
data.setAppendedPrompt(map);
context.setAppendedPrompt(data);
context.appendPrompt(data);
}
private synchronized void setActiveModule(PartnerRunningFlowContext context) {

View File

@@ -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<SchedulableExecutableAction> scheduledActions = new HashSet<>();

View File

@@ -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<String, String> getPromptDataMap(PartnerRunningFlowContext context) {
return interventionPrompt.remove(context.getUuid());
return interventionPrompt.remove(context.getInfo().getUuid());
}
@Override

View File

@@ -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<EvaluatorResult> 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<ExecutableAction> pendingActions = actionCapability.popPendingAction(context.getUserId());
List<ExecutableAction> 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<EvaluatorResult> 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<String, String> getPromptDataMap(PartnerRunningFlowContext context) {
HashMap<String, String> 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<ExecutableAction> pendingActions = actionCapability.listPendingAction(context.getUserId());
List<ExecutableAction> pendingActions = actionCapability.listPendingAction(context.getSource());
confirmerInput.setExecutableActionData(pendingActions);
return confirmerInput;
}

View File

@@ -61,7 +61,7 @@ public class CoreModel extends AbstractAgentModule.Running<PartnerRunningFlowCon
@Override
public void execute(PartnerRunningFlowContext runningFlowContext) {
String userId = runningFlowContext.getUserId();
String userId = runningFlowContext.getSource();
log.debug("[CoreModel] 主对话流程开始: {}", userId);
beforeChat(runningFlowContext);
executeChat(runningFlowContext);
@@ -144,8 +144,8 @@ public class CoreModel extends AbstractAgentModule.Running<PartnerRunningFlowCon
@Override
public @NotNull ChatResponse chat() {
List<@NotNull Message> baseMessages = getModel().getBaseMessages();
List<@NotNull Message> chatMessages = getModel().getChatMessages();
List<Message> baseMessages = getModel().getBaseMessages();
List<Message> chatMessages = getModel().getChatMessages();
List<Message> 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<PartnerRunningFlowCon
private void updateModuleContextAndChatMessages(PartnerRunningFlowContext runningFlowContext, String response, ChatResponse chatResponse) {
cognationCapability.getMessageLock().lock();
List<@NotNull Message> chatMessages = getModel().getChatMessages();
List<Message> 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<PartnerRunningFlowCon
//设置上下文
runningFlowContext.getModuleContext().getExtraContext().put("total_token", chatResponse.getUsageBean().getTotal_tokens());
//区分单人聊天场景
if (runningFlowContext.isSingle()) {
// if (runningFlowContext.isSingle()) {
MetaMessage metaMessage = new MetaMessage(primaryUserMessage, assistantMessage);
cognationCapability.addMetaMessage(runningFlowContext.getUserId(), metaMessage);
}
cognationCapability.addMetaMessage(runningFlowContext.getSource(), metaMessage);
// }
}
private void setMessage(String coreContextStr) {

View File

@@ -40,7 +40,7 @@ public class MemorySelector extends PreRunningAbstractAgentModuleAbstract {
@Override
public void doExecute(PartnerRunningFlowContext runningFlowContext) {
String userId = runningFlowContext.getUserId();
String userId = runningFlowContext.getSource();
//获取主题路径
ExtractorResult extractorResult = memorySelectExtractor.execute(runningFlowContext);
if (extractorResult.isRecall() || !extractorResult.getMatches().isEmpty()) {
@@ -54,7 +54,7 @@ public class MemorySelector extends PreRunningAbstractAgentModuleAbstract {
private List<EvaluatedSlice> selectAndEvaluateMemory(PartnerRunningFlowContext runningFlowContext, ExtractorResult extractorResult) {
log.debug("[MemorySelector] 触发记忆回溯...");
//查找切片
String userId = runningFlowContext.getUserId();
String userId = runningFlowContext.getSource();
List<MemoryResult> 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<String, String> getPromptDataMap(PartnerRunningFlowContext context) {
HashMap<String, String> map = new HashMap<>();
String userId = context.getUserId();
String userId = context.getSource();
String dialogMapStr = memoryCapability.getDialogMapStr();
if (!dialogMapStr.isEmpty()) {
map.put("[记忆缓存] <你最近两日和所有聊天者的对话记忆印象>", dialogMapStr);

View File

@@ -37,9 +37,9 @@ public class MemorySelectExtractor extends AbstractAgentModule.Sub<PartnerRunnin
log.debug("[MemorySelectExtractor] 主题提取模块开始...");
// 结构化为指定格式
List<Message> chatMessages = new ArrayList<>();
List<MetaMessage> metaMessages = cognationCapability.getSingleMetaMessageMap().get(context.getUserId());
List<MetaMessage> 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<PartnerRunnin
}
ExtractorResult extractorResult;
try {
List<EvaluatedSlice> activatedMemorySlices = memoryCapability.getActivatedSlices(context.getUserId());
List<EvaluatedSlice> 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)

View File

@@ -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;
}

View File

@@ -22,7 +22,7 @@ public class PerceiveSelector extends PreRunningAbstractAgentModuleAbstract {
@Override
protected Map<String, String> getPromptDataMap(PartnerRunningFlowContext context) {
HashMap<String, String> 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());

View File

@@ -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<Callable<Void>> tasks = new ArrayList<>();
tasks.add(() -> {
runStaticExtractorAction(context, userLock, user);

View File

@@ -31,7 +31,7 @@ public class RelationExtractor extends AbstractAgentModule.Sub<PartnerRunningFlo
@Override
public RelationExtractResult execute(PartnerRunningFlowContext context) {
tempMessages = new ArrayList<>(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<PartnerRunningFlo
private User getTempUser(PartnerRunningFlowContext context, RelationExtractResult relationExtractResult) {
User user = new User();
user.setUuid(context.getUserId());
user.setUuid(context.getSource());
user.setRelation(relationExtractResult.getRelation());
user.setImpressions(relationExtractResult.getImpressions());
user.setAttitude(relationExtractResult.getAttitude());

View File

@@ -26,9 +26,9 @@ public class StaticMemoryExtractor extends AbstractAgentModule.Sub<PartnerRunnin
@Override
public HashMap<String, String> 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());

View File

@@ -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<PartnerInputData, PartnerOutputData, PartnerRunningFlowContext> {
@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()
);
}
}

View File

@@ -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()
var finished: Boolean
get() = moduleContext.isFinished
set(value) {
moduleContext.isFinished = value
}
public void setAppendedPrompt(AppendPromptData appendedPrompt) {
List<AppendPromptData> appendPromptList = moduleContext.getAppendedPrompt();
appendPromptList.addFirst(appendedPrompt);
}
fun appendPrompt(appendPromptData: AppendPromptData) = moduleContext.appendPromptData(appendPromptData)
}

View File

@@ -20,4 +20,8 @@ public class ModuleContext extends PersistableObject {
private List<AppendPromptData> appendedPrompt = new ArrayList<>();
private JSONObject extraContext = new JSONObject();
private boolean finished = false;
public void appendPromptData(AppendPromptData appendPromptData) {
this.appendedPrompt.addFirst(appendPromptData);
}
}

View File

@@ -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

View File

@@ -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<String> errMsg = new ArrayList<>();
abstract class RunningFlowContext {
/**
* 消息来源: 由谁发出
*/
abstract val source: String
/**
* 消息内容
*/
abstract val input: String
/**
* 消息回应对象,默认与 source 一致
*/
var target = source
private val _additionalUserInfo = mutableMapOf<String, String>()
val additionalUserInfo: Map<String, String>
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<String>()
}
}