fix(task): auto-retry on empty assistant response (#9076) (#9083)

This commit is contained in:
Daniel 2025-11-06 16:15:31 -05:00 committed by GitHub
parent bf048492fb
commit d631aa643c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2429,15 +2429,69 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
// If there's no assistant_responses, that means we got no text
// or tool_use content blocks from API which we should assume is
// an error.
await this.say(
"error",
"Unexpected API Response: The language model did not provide any assistant messages. This may indicate an issue with the API or the model's output.",
)
await this.addToApiConversationHistory({
role: "assistant",
content: [{ type: "text", text: "Failure: I did not provide a response." }],
})
// Check if we should auto-retry or prompt the user
const state = await this.providerRef.deref()?.getState()
if (state?.autoApprovalEnabled && state?.alwaysApproveResubmit) {
// Auto-retry with backoff - don't persist failure message when retrying
const errorMsg =
"Unexpected API Response: The language model did not provide any assistant messages. This may indicate an issue with the API or the model's output."
await this.backoffAndAnnounce(
currentItem.retryAttempt ?? 0,
new Error("Empty assistant response"),
errorMsg,
)
// Check if task was aborted during the backoff
if (this.abort) {
console.log(
`[Task#${this.taskId}.${this.instanceId}] Task aborted during empty-assistant retry backoff`,
)
break
}
// Push the same content back onto the stack to retry, incrementing the retry attempt counter
stack.push({
userContent: currentUserContent,
includeFileDetails: false,
retryAttempt: (currentItem.retryAttempt ?? 0) + 1,
})
// Continue to retry the request
continue
} else {
// Prompt the user for retry decision
const { response } = await this.ask(
"api_req_failed",
"The model returned no assistant messages. This may indicate an issue with the API or the model's output.",
)
if (response === "yesButtonClicked") {
await this.say("api_req_retried")
// Push the same content back to retry
stack.push({
userContent: currentUserContent,
includeFileDetails: false,
retryAttempt: (currentItem.retryAttempt ?? 0) + 1,
})
// Continue to retry the request
continue
} else {
// User declined to retry - persist error and failure message
await this.say(
"error",
"Unexpected API Response: The language model did not provide any assistant messages. This may indicate an issue with the API or the model's output.",
)
await this.addToApiConversationHistory({
role: "assistant",
content: [{ type: "text", text: "Failure: I did not provide a response." }],
})
}
}
}
// If we reach here without continuing, return false (will always be false for now)