Skip to content

Commit f1a3d0b

Browse files
committed
fix(orchestrator): Remove duplicate message alternation in provider layer
**Problem:** Messages were being merged TWICE - once in AgentOrchestrator.ensureMessageAlternation() and again in GitHubCopilotProvider.enforceMessageAlternation(). This double-alternation was over-merging messages and potentially losing context. **Root Cause:** Both the orchestrator and provider had their own alternation logic: 1. AgentOrchestrator line 173: ensureMessageAlternation (smart, preserves tools) 2. GitHubCopilotProvider line 1258: enforceMessageAlternation (simple merge) All messages pass through orchestrator FIRST, then provider, causing duplicate processing. **Solution:** - Removed enforceMessageAlternation from GitHubCopilotProvider - Kept ensureMessageAlternation in AgentOrchestrator (better logic + logging) - Added comment explaining why provider doesn't do alternation **Testing:** ✅ GitHub Copilot: Works correctly (no double-merge) ✅ Claude: Works correctly (single alternation only) ✅ Tested with alternation disabled - confirmed alternation NOT the cause of task quality issues **Note:** This fix resolves the double-alternation bug. Separate task quality issues with Claude (incomplete task execution) are unrelated to alternation and require separate investigation.
1 parent b6c0973 commit f1a3d0b

2 files changed

Lines changed: 4 additions & 10 deletions

File tree

Sources/APIFramework/AgentOrchestrator.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4507,8 +4507,6 @@ public class AgentOrchestrator: ObservableObject, IterationController {
45074507
/// Claude requires strict user/assistant alternation with no empty messages
45084508
/// This MUST happen before YARN because YARN compresses individual messages
45094509
/// If we merge AFTER YARN, we concatenate compressed content and blow up token count!
4510-
/// TEMPORARY: Force alternation to run to diagnose bug
4511-
/// TODO: Remove this after fixing ensureMessageAlternation
45124510
messages = ensureMessageAlternation(messages)
45134511
logger.debug("callLLMStreaming: Applied message alternation fix - \(messages.count) messages after merging")
45144512

Sources/APIFramework/Providers.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,15 +1480,11 @@ public class GitHubCopilotProvider: AIProvider, ObservableObject {
14801480
return !isToolResultPreview
14811481
}
14821482

1483-
/// MESSAGE_ALTERNATION FIX: Enforce strict user/assistant alternation
1484-
/// GitHub Copilot requires alternating roles (user → assistant → user → assistant)
1485-
/// Without this, consecutive same-role messages cause token counting errors
1486-
let alternationFixedMessages = enforceMessageAlternation(filteredMessages)
1487-
if alternationFixedMessages.count != filteredMessages.count {
1488-
logger.debug("MESSAGE_ALTERNATION: Applied fix - \(filteredMessages.count)\(alternationFixedMessages.count) messages")
1489-
}
1483+
/// NOTE: Message alternation is handled in AgentOrchestrator.ensureMessageAlternation()
1484+
/// before reaching this provider. Doing it here would cause double-merging and lose context.
1485+
/// The orchestrator version preserves tool messages and has better logging.
14901486

1491-
let messages = alternationFixedMessages.map { message in
1487+
let messages = filteredMessages.map { message in
14921488
var messageDict: [String: Any] = [
14931489
"role": message.role
14941490
]

0 commit comments

Comments
 (0)