From 4de6aa2f10f0e0de9545b425737f3b3a70c8e09c Mon Sep 17 00:00:00 2001 From: hsuanguo Date: Tue, 10 Mar 2026 12:39:53 +0000 Subject: [PATCH] fix: resolve Claude 4.6 assistant prefill compatibility issues This commit addresses two root causes of the 'This model does not support assistant message prefill' error that occurs with Claude Opus 4.6 and Sonnet 4.6 models: 1. Max steps message role (prompt.ts:670) - Changed from assistant to user role for MAX_STEPS instruction - Claude 4.6 rejects conversations ending with assistant messages - User role maintains instruction delivery while ensuring compatibility 2. Agentic loop exit condition (prompt.ts:322) - Replaced timestamp-based ID comparison with explicit parentID check - Previous: lastUser.id < lastAssistant.id (vulnerable to clock skew) - Fixed: lastAssistant.parentID === lastUser.id (clock-skew resistant) - Prevents extra assistant messages when client/server clocks differ Fixes #13768 --- packages/opencode/src/session/prompt.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 7698b78baba..20eeffd6dc5 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -319,7 +319,7 @@ export namespace SessionPrompt { if ( lastAssistant?.finish && !["tool-calls", "unknown"].includes(lastAssistant.finish) && - lastUser.id < lastAssistant.id + lastAssistant.parentID === lastUser.id ) { log.info("exiting loop", { sessionID }) break @@ -667,7 +667,7 @@ export namespace SessionPrompt { ...(isLastStep ? [ { - role: "assistant" as const, + role: "user" as const, content: MAX_STEPS, }, ]