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)));
+    }
 }

Reply via email to