fix(agent): sanitize messages after orphan user repair
When repairing orphaned trailing user messages, buildSessionContext() was called but messages bypassed the sanitization pipeline. This could cause tool_result blocks without matching tool_use blocks, leading to Anthropic API "unexpected tool_use_id" errors. Apply full sanitization (sanitizeSessionHistory, validateTurns, limitHistoryTurns) to rebuilt messages.
This commit is contained in:
parent
5330595a5a
commit
5355b476f6
@ -709,7 +709,28 @@ export async function runEmbeddedAttempt(
|
|||||||
sessionManager.resetLeaf();
|
sessionManager.resetLeaf();
|
||||||
}
|
}
|
||||||
const sessionContext = sessionManager.buildSessionContext();
|
const sessionContext = sessionManager.buildSessionContext();
|
||||||
activeSession.agent.replaceMessages(sessionContext.messages);
|
// Re-sanitize the rebuilt messages to ensure tool_use/tool_result pairing is valid.
|
||||||
|
// Without this, Anthropic API rejects the request with "unexpected tool_use_id" errors.
|
||||||
|
const rebuiltSanitized = await sanitizeSessionHistory({
|
||||||
|
messages: sessionContext.messages,
|
||||||
|
modelApi: params.model.api,
|
||||||
|
modelId: params.modelId,
|
||||||
|
provider: params.provider,
|
||||||
|
sessionManager,
|
||||||
|
sessionId: params.sessionId,
|
||||||
|
policy: transcriptPolicy,
|
||||||
|
});
|
||||||
|
const rebuiltValidatedGemini = transcriptPolicy.validateGeminiTurns
|
||||||
|
? validateGeminiTurns(rebuiltSanitized)
|
||||||
|
: rebuiltSanitized;
|
||||||
|
const rebuiltValidated = transcriptPolicy.validateAnthropicTurns
|
||||||
|
? validateAnthropicTurns(rebuiltValidatedGemini)
|
||||||
|
: rebuiltValidatedGemini;
|
||||||
|
const rebuiltLimited = limitHistoryTurns(
|
||||||
|
rebuiltValidated,
|
||||||
|
getDmHistoryLimitFromSessionKey(params.sessionKey, params.config),
|
||||||
|
);
|
||||||
|
activeSession.agent.replaceMessages(rebuiltLimited);
|
||||||
log.warn(
|
log.warn(
|
||||||
`Removed orphaned user message to prevent consecutive user turns. ` +
|
`Removed orphaned user message to prevent consecutive user turns. ` +
|
||||||
`runId=${params.runId} sessionId=${params.sessionId}`,
|
`runId=${params.runId} sessionId=${params.sessionId}`,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user