feat(trace): support trace input/output information on Running/Sub AgentModule

This commit is contained in:
2026-04-13 22:27:11 +08:00
parent e65d3302c6
commit 737f9d122a
16 changed files with 61 additions and 18 deletions

View File

@@ -26,7 +26,7 @@ public class ActionCorrectionRecognizer extends AbstractAgentModule.Sub<Correcti
private CognitionCapability cognitionCapability; private CognitionCapability cognitionCapability;
@Override @Override
public @NotNull Result<CorrectionRecognizerResult> execute(CorrectionRecognizerInput input) { protected @NotNull Result<CorrectionRecognizerResult> doExecute(CorrectionRecognizerInput input) {
List<Message> messages = List.of( List<Message> messages = List.of(
resolveContextMessage(), resolveContextMessage(),
resolveTaskMessage(input) resolveTaskMessage(input)

View File

@@ -26,7 +26,7 @@ public class ActionCorrector extends AbstractAgentModule.Sub<CorrectorInput, Res
private CognitionCapability cognitionCapability; private CognitionCapability cognitionCapability;
@Override @Override
public @NotNull Result<CorrectorResult> execute(CorrectorInput input) { protected @NotNull Result<CorrectorResult> doExecute(CorrectorInput input) {
List<Message> messages = List.of( List<Message> messages = List.of(
resolveContextMessage(), resolveContextMessage(),
resolveTaskMessage(input) resolveTaskMessage(input)

View File

@@ -27,7 +27,7 @@ public class ParamsExtractor extends AbstractAgentModule.Sub<ExtractorInput, Res
private CognitionCapability cognitionCapability; private CognitionCapability cognitionCapability;
@Override @Override
public @NotNull Result<ExtractorResult> execute(ExtractorInput input) { protected @NotNull Result<ExtractorResult> doExecute(ExtractorInput input) {
List<Message> messages = List.of( List<Message> messages = List.of(
resolveContextMessage(), resolveContextMessage(),
resolveTaskMessage(input) resolveTaskMessage(input)

View File

@@ -68,7 +68,7 @@ public class ActionPlanner extends AbstractAgentModule.Running<PartnerRunningFlo
} }
@Override @Override
public void execute(@NotNull PartnerRunningFlowContext context) { protected void doExecute(@NotNull PartnerRunningFlowContext context) {
String input = context.getInput(); String input = context.getInput();
Result<ExtractorResult> result = actionExtractor.execute(input) Result<ExtractorResult> result = actionExtractor.execute(input)
.onFailure(exp -> { .onFailure(exp -> {

View File

@@ -45,7 +45,7 @@ public class ActionEvaluator extends AbstractAgentModule.Sub<EvaluatorInput, Lis
* @return 评估结果集合 * @return 评估结果集合
*/ */
@Override @Override
public List<EvaluatorResult> execute(EvaluatorInput data) { protected List<EvaluatorResult> doExecute(EvaluatorInput data) {
List<String> tendencies = data.getTendencies(); List<String> tendencies = data.getTendencies();
CountDownLatch latch = new CountDownLatch(tendencies.size()); CountDownLatch latch = new CountDownLatch(tendencies.size());
List<EvaluatorResult> evaluatorResults = new ArrayList<>(); List<EvaluatorResult> evaluatorResults = new ArrayList<>();

View File

@@ -20,7 +20,7 @@ public class ActionExtractor extends AbstractAgentModule.Sub<String, Result<Extr
private CognitionCapability cognitionCapability; private CognitionCapability cognitionCapability;
@Override @Override
public @NotNull Result<ExtractorResult> execute(String input) { protected @NotNull Result<ExtractorResult> doExecute(String input) {
List<Message> messages = List.of( List<Message> messages = List.of(
cognitionCapability.contextWorkspace().resolve(List.of( cognitionCapability.contextWorkspace().resolve(List.of(
ContextBlock.VisibleDomain.COGNITION, ContextBlock.VisibleDomain.COGNITION,

View File

@@ -59,7 +59,7 @@ public class CommunicationProducer extends AbstractAgentModule.Running<PartnerRu
} }
@Override @Override
public void execute(PartnerRunningFlowContext runningFlowContext) { protected void doExecute(PartnerRunningFlowContext runningFlowContext) {
log.debug("Communicating with: {}", runningFlowContext.getSource()); log.debug("Communicating with: {}", runningFlowContext.getSource());
executeChat(runningFlowContext); executeChat(runningFlowContext);
} }

View File

@@ -57,7 +57,7 @@ public class MemorySelector extends AbstractAgentModule.Running<PartnerRunningFl
private Lock inputsLock = new ReentrantLock(); private Lock inputsLock = new ReentrantLock();
@Override @Override
public void execute(@NotNull PartnerRunningFlowContext runningFlowContext) { protected void doExecute(@NotNull PartnerRunningFlowContext runningFlowContext) {
inputsLock.lock(); inputsLock.lock();
try { try {
collectedInputs.put(ZonedDateTime.now().toLocalDateTime(), runningFlowContext.getInput()); collectedInputs.put(ZonedDateTime.now().toLocalDateTime(), runningFlowContext.getInput());

View File

@@ -45,7 +45,7 @@ public class SliceSelectEvaluator extends AbstractAgentModule.Sub<EvaluatorInput
} }
@Override @Override
public List<ActivatedMemorySlice> execute(EvaluatorInput evaluatorInput) { protected List<ActivatedMemorySlice> doExecute(EvaluatorInput evaluatorInput) {
List<ActivatedMemorySlice> preparedSlices = evaluatorInput.getMemorySlices(); List<ActivatedMemorySlice> preparedSlices = evaluatorInput.getMemorySlices();
List<ActivatedMemorySlice> result = new ArrayList<>(); List<ActivatedMemorySlice> result = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(preparedSlices.size()); CountDownLatch latch = new CountDownLatch(preparedSlices.size());

View File

@@ -32,7 +32,7 @@ public class MemorySelectExtractor extends AbstractAgentModule.Sub<ExtractorInpu
private MemoryRuntime memoryRuntime; private MemoryRuntime memoryRuntime;
@Override @Override
public ExtractorResult execute(ExtractorInput input) { protected ExtractorResult doExecute(ExtractorInput input) {
ExtractorResult extractorResult; ExtractorResult extractorResult;
List<Message> messages = List.of( List<Message> messages = List.of(
resolveContextMessage(), resolveContextMessage(),

View File

@@ -85,7 +85,7 @@ public class MemoryUpdater extends AbstractAgentModule.Running<PartnerRunningFlo
} }
@Override @Override
public void execute(@NotNull PartnerRunningFlowContext context) { protected void doExecute(@NotNull PartnerRunningFlowContext context) {
boolean trigger = cognitionCapability.getChatMessages().size() >= MEMORY_UPDATE_TRIGGER_ROLL_LIMIT; boolean trigger = cognitionCapability.getChatMessages().size() >= MEMORY_UPDATE_TRIGGER_ROLL_LIMIT;
if (!trigger) { if (!trigger) {
return; return;

View File

@@ -24,7 +24,7 @@ public class MultiSummarizer extends AbstractAgentModule.Sub<SummarizeInput, Res
private MemoryRuntime memoryRuntime; private MemoryRuntime memoryRuntime;
@Override @Override
public @NotNull Result<SummarizeResult> execute(SummarizeInput input) { protected @NotNull Result<SummarizeResult> doExecute(SummarizeInput input) {
return formattedChat( return formattedChat(
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(input))), List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(input))),
SummarizeResult.class SummarizeResult.class

View File

@@ -29,7 +29,7 @@ public class SingleSummarizer extends AbstractAgentModule.Sub<List<Message>, Voi
} }
@Override @Override
public Void execute(List<Message> chatMessages) { protected Void doExecute(List<Message> chatMessages) {
log.debug("[MemorySummarizer] 长文本摘要开始..."); log.debug("[MemorySummarizer] 长文本摘要开始...");
CountDownLatch latch = new CountDownLatch(chatMessages.size()); CountDownLatch latch = new CountDownLatch(chatMessages.size());
for (int i = 0; i < chatMessages.size(); i++) { for (int i = 0; i < chatMessages.size(); i++) {

View File

@@ -13,7 +13,7 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
public class TotalSummarizer extends AbstractAgentModule.Sub<HashMap<String, String>, String> implements ActivateModel { public class TotalSummarizer extends AbstractAgentModule.Sub<HashMap<String, String>, String> implements ActivateModel {
public String execute(HashMap<String, String> singleMemorySummary) { protected String doExecute(HashMap<String, String> singleMemorySummary) {
return formattedChat( return formattedChat(
List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(singleMemorySummary))), List.of(new Message(Message.Character.USER, JSONUtil.toJsonPrettyStr(singleMemorySummary))),
SummaryContent.class SummaryContent.class

View File

@@ -23,7 +23,7 @@ public class PerceiveMonitor extends AbstractAgentModule.Running<PartnerRunningF
private CognitionCapability cognitionCapability; private CognitionCapability cognitionCapability;
@Override @Override
public void execute(@NotNull PartnerRunningFlowContext context) { protected void doExecute(@NotNull PartnerRunningFlowContext context) {
String lastInteractTime = perceiveCapability.refreshInteract(); String lastInteractTime = perceiveCapability.refreshInteract();
ContextBlock block = new ContextBlock( ContextBlock block = new ContextBlock(
new CommunicationBlockContent( new CommunicationBlockContent(

View File

@@ -4,6 +4,8 @@ import org.slf4j.Logger
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import work.slhaf.partner.framework.agent.factory.component.annotation.AgentComponent import work.slhaf.partner.framework.agent.factory.component.annotation.AgentComponent
import work.slhaf.partner.framework.agent.interaction.flow.RunningFlowContext import work.slhaf.partner.framework.agent.interaction.flow.RunningFlowContext
import work.slhaf.partner.framework.agent.log.LogAdviceProvider
import java.lang.reflect.ParameterizedType
/** /**
* 模块基类 * 模块基类
@@ -18,16 +20,57 @@ sealed class AbstractAgentModule {
abstract class Running<T : RunningFlowContext> : AbstractAgentModule() { abstract class Running<T : RunningFlowContext> : AbstractAgentModule() {
abstract fun execute(context: T) private val advice = run {
@Suppress("UNCHECKED_CAST")
LogAdviceProvider.createAdvice(
moduleName,
resolveGenericType(0) as Class<T>,
Void::class.java
) { context ->
doExecute(context)
null
}
}
fun execute(context: T) {
advice.invoke(context)
}
protected abstract fun doExecute(context: T)
abstract fun order(): Int abstract fun order(): Int
} }
abstract class Sub<I, O> : AbstractAgentModule() { abstract class Sub<I, O> : AbstractAgentModule() {
abstract fun execute(input: I): O private val advice = run {
@Suppress("UNCHECKED_CAST")
LogAdviceProvider.createAdvice(
moduleName,
resolveGenericType(0) as Class<I>,
resolveGenericType(1) as Class<O>
) { input ->
doExecute(input)
}
}
fun execute(input: I): O? {
return advice.invoke(input).getOrThrow()
}
protected abstract fun doExecute(input: I): O?
} }
abstract class Standalone : AbstractAgentModule() abstract class Standalone : AbstractAgentModule()
protected fun resolveGenericType(index: Int): Class<*> {
val genericType = (javaClass.genericSuperclass as? ParameterizedType)
?.actualTypeArguments
?.getOrNull(index)
?: return Any::class.java
return when (genericType) {
is Class<*> -> genericType
is ParameterizedType -> genericType.rawType as? Class<*> ?: Any::class.java
else -> Any::class.java
}
}
} }