Skip to content

Commit 5fff807

Browse files
committed
fix(orchestrator): ensure delta messages start with user role
**Problem:** Delta mode slicing could result in messages array starting with assistant/tool role. GitHub Copilot API requires first message to be USER role, causing: "messages: at least one message is required" (400 error) **Root Cause:** When statefulMarker exists and messages are sliced: 1. Slicing removed old user messages (correct) 2. Remaining messages started with assistant/tool results 3. API rejected: first message must be user role **Solution:** After building delta messages array, check if first message is user role. If not, prepend synthetic continue message: `<system-reminder>continue</system-reminder>` This matches SAM's existing pattern for workflow continuation and provides proper user message context for Claude. **Testing:** ✅ Build: PASS Next: Test with Claude via ask_sam.sh **Related:** Commits 29a4941, 4fdddf1
1 parent 4fdddf1 commit 5fff807

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

Sources/APIFramework/AgentOrchestrator.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4341,6 +4341,15 @@ public class AgentOrchestrator: ObservableObject, IterationController {
43414341
messages.append(contentsOf: messagesToAppend)
43424342
logger.debug("STATEFUL_MARKER_DELTA_MODE: Sending \(messagesToSend.count) conversation + \(internalMessages.count) internal messages (delta-only mode)")
43434343

4344+
/// CRITICAL FIX: Ensure messages start with USER role
4345+
/// GitHub Copilot API requires first message to be user role
4346+
/// If slicing resulted in only assistant/tool messages, prepend continue message
4347+
if !messages.isEmpty && messages.first?.role != "user" {
4348+
let continueMessage = OpenAIChatMessage(role: "user", content: "<system-reminder>continue</system-reminder>")
4349+
messages.insert(continueMessage, at: 0)
4350+
logger.debug("DELTA_USER_MESSAGE: Prepended <system-reminder>continue</system-reminder> (messages started with \(messages[1].role))")
4351+
}
4352+
43444353
/// CRITICAL: Enforce 16KB payload limit (vscode-copilot-chat pattern)
43454354
/// Even with cached large tool results, accumulated deltas can exceed limit
43464355
/// If trimming occurs, clear marker (it may reference removed message)

0 commit comments

Comments
 (0)