refactor: use sequential agent for chat workflow

This commit is contained in:
zhuyongxin
2026-07-03 18:03:06 +08:00
parent 6919092b83
commit f01866c1a2
2 changed files with 30 additions and 73 deletions
@@ -31,10 +31,10 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class ChatServiceSupervisorAgentTest {
class ChatServiceSequentialAgentTest {
@Test
void executeChatComplexInvokesSupervisorFlow() throws Exception {
void executeChatComplexInvokesSequentialWorkflow() throws Exception {
ChatService chatService = createChatService();
ScriptedChatModel chatModel = new ScriptedChatModel();
@@ -43,12 +43,12 @@ class ChatServiceSupervisorAgentTest {
new ToolCallback[0],
"请分析订单支付超时的原因,并给出修复建议",
List.of(),
"supervisor-test-session"
"sequential-test-session"
);
assertEquals("EXECUTOR_FINAL_ANSWER", result.answer());
assertEquals("supervisor-test-session", result.sessionId());
assertEquals(List.of("chat_planner", "chat_executor", "chat_verifier", "FINISH"), chatModel.decisions);
assertEquals("sequential-test-session", result.sessionId());
assertEquals(List.of("chat_planner", "chat_executor", "chat_verifier"), chatModel.agentCalls);
assertTrue(chatModel.sawVerifierPrompt);
}
@@ -78,47 +78,28 @@ class ChatServiceSupervisorAgentTest {
new ToolCallback[0],
"请分析订单支付超时的原因,并给出修复建议",
List.of(),
"supervisor-low-confidence-session"
"sequential-low-confidence-session"
);
assertTrue(result.answer().contains("EXECUTOR_FINAL_ANSWER"));
assertEquals(List.of("chat_planner", "chat_executor", "chat_verifier", "FINISH"), chatModel.decisions);
assertEquals(List.of("chat_planner", "chat_executor", "chat_verifier"), chatModel.agentCalls);
}
@Test
void executeChatComplexInvokesVerifierFallbackWhenSupervisorSkipsVerifier() throws Exception {
void executeChatComplexRunsPlannerExecutorVerifierInFixedOrder() throws Exception {
ChatService chatService = createChatService();
ScriptedChatModel chatModel = new ScriptedChatModel(
List.of("chat_planner", "chat_executor", "FINISH"),
"""
{
"verdict": "PASS",
"groundedness_score": 1.0,
"critical_fact_count": 1,
"facts_checked": [
{
"fact": "executor answer generated",
"is_critical": true,
"verification": "direct_evidence",
"detail": "covered by fallback verifier",
"evidence_refs": []
}
],
"rationale": "fallback verifier pass"
}
"""
);
ScriptedChatModel chatModel = new ScriptedChatModel();
ChatService.ChatResult result = chatService.executeChatComplex(
chatModel,
new ToolCallback[0],
"请分析订单支付超时的原因,并给出修复建议",
List.of(),
"supervisor-verifier-fallback-session"
"sequential-workflow-session"
);
assertEquals("EXECUTOR_FINAL_ANSWER", result.answer());
assertEquals(List.of("chat_planner", "chat_executor", "FINISH"), chatModel.decisions);
assertEquals(List.of("chat_planner", "chat_executor", "chat_verifier"), chatModel.agentCalls);
assertTrue(chatModel.sawVerifierPrompt);
}
@@ -190,15 +171,13 @@ class ChatServiceSupervisorAgentTest {
}
private static final class ScriptedChatModel implements ChatModel {
private final List<String> decisionScript;
private final java.util.ArrayList<String> decisions = new java.util.ArrayList<>();
private int decisionIndex;
private final java.util.ArrayList<String> agentCalls = new java.util.ArrayList<>();
private String promptText = "";
private boolean sawVerifierPrompt;
private final String verifierOutput;
private ScriptedChatModel() {
this(List.of("chat_planner", "chat_executor", "chat_verifier", "FINISH"), """
this("""
{
"verdict": "PASS",
"groundedness_score": 1.0,
@@ -218,11 +197,6 @@ class ChatServiceSupervisorAgentTest {
}
private ScriptedChatModel(String verifierOutput) {
this(List.of("chat_planner", "chat_executor", "chat_verifier", "FINISH"), verifierOutput);
}
private ScriptedChatModel(List<String> decisionScript, String verifierOutput) {
this.decisionScript = decisionScript;
this.verifierOutput = verifierOutput;
}
@@ -230,14 +204,14 @@ class ChatServiceSupervisorAgentTest {
public ChatResponse call(Prompt prompt) {
promptText = prompt.getContents();
String text;
if (promptText.contains("Available options:")) {
text = "{\"agent\":\"" + decisionScript.get(decisionIndex++) + "\"}";
decisions.add(text.substring(10, text.length() - 2));
} else if (promptText.contains("PLANNER_TEST_PROMPT")) {
if (promptText.contains("PLANNER_TEST_PROMPT")) {
agentCalls.add("chat_planner");
text = "PLANNER_PLAN";
} else if (promptText.contains("EXECUTOR_TEST_PROMPT")) {
agentCalls.add("chat_executor");
text = "EXECUTOR_FINAL_ANSWER";
} else if (promptText.contains("VERIFIER_TEST_PROMPT")) {
agentCalls.add("chat_verifier");
sawVerifierPrompt = true;
text = verifierOutput;
} else {