This is an automated email from the ASF dual-hosted git repository. wenjin272 pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/flink-agents.git
commit fa5bcf12ad73680fb120899c058b434e0acf1c0f Author: WenjinXie <[email protected]> AuthorDate: Wed May 6 17:33:38 2026 +0800 [api][java] Inject output format prompt after the first system prompt for ReAct agent. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]> --- .../apache/flink/agents/api/agents/ReActAgent.java | 3 ++- .../flink/agents/api/chat/messages/ChatMessage.java | 10 ++++++++++ .../agents/api/chat/messages/ChatMessageTest.java | 21 +++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/flink/agents/api/agents/ReActAgent.java b/api/src/main/java/org/apache/flink/agents/api/agents/ReActAgent.java index e3291050..0b394baa 100644 --- a/api/src/main/java/org/apache/flink/agents/api/agents/ReActAgent.java +++ b/api/src/main/java/org/apache/flink/agents/api/agents/ReActAgent.java @@ -160,7 +160,8 @@ public class ReActAgent extends Agent { if (schmaPrompt != null) { List<ChatMessage> instruct = schmaPrompt.formatMessages(MessageRole.SYSTEM, Map.of()); - inputMessages.addAll(0, instruct); + int index = ChatMessage.findFirstSystemMessage(inputMessages); + inputMessages.addAll(index + 1, instruct); } Object outputSchema = ctx.getActionConfigValue("output_schema"); diff --git a/api/src/main/java/org/apache/flink/agents/api/chat/messages/ChatMessage.java b/api/src/main/java/org/apache/flink/agents/api/chat/messages/ChatMessage.java index ef12dd29..c3be5ef8 100644 --- a/api/src/main/java/org/apache/flink/agents/api/chat/messages/ChatMessage.java +++ b/api/src/main/java/org/apache/flink/agents/api/chat/messages/ChatMessage.java @@ -154,4 +154,14 @@ public class ChatMessage { public String toString() { return role.getValue() + ": " + content; } + + /** Return the index of the first system message in the list, or -1 if none. */ + public static int findFirstSystemMessage(List<ChatMessage> messages) { + for (int i = 0; i < messages.size(); i++) { + if (messages.get(i).getRole() == MessageRole.SYSTEM) { + return i; + } + } + return -1; + } } diff --git a/api/src/test/java/org/apache/flink/agents/api/chat/messages/ChatMessageTest.java b/api/src/test/java/org/apache/flink/agents/api/chat/messages/ChatMessageTest.java index f24bae19..d58353ba 100644 --- a/api/src/test/java/org/apache/flink/agents/api/chat/messages/ChatMessageTest.java +++ b/api/src/test/java/org/apache/flink/agents/api/chat/messages/ChatMessageTest.java @@ -23,6 +23,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.HashMap; +import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; @@ -149,4 +150,24 @@ class ChatMessageTest { message.setRole(MessageRole.ASSISTANT); assertEquals(MessageRole.ASSISTANT, message.getRole()); } + + @Test + @DisplayName("findFirstSystemMessage returns the index of the first system message") + void testFindFirstSystemMessage() { + assertEquals(-1, ChatMessage.findFirstSystemMessage(List.of())); + assertEquals( + -1, ChatMessage.findFirstSystemMessage(List.of(userMessage, assistantMessage))); + assertEquals(0, ChatMessage.findFirstSystemMessage(List.of(systemMessage, userMessage))); + assertEquals( + 1, + ChatMessage.findFirstSystemMessage( + List.of(userMessage, systemMessage, assistantMessage))); + assertEquals( + 0, + ChatMessage.findFirstSystemMessage( + List.of( + systemMessage, + new ChatMessage(MessageRole.SYSTEM, "second system"), + userMessage))); + } }
