fix(tools): abort retries on cancel#52
Merged
Merged
Conversation
ExecuteTools' retry loops slept on a non-cancellable time.Sleep(attempts+1 seconds) backoff and re-issued the LLM call even after the caller's context was cancelled. A Ctrl+C therefore took up to several seconds to take effect because an in-flight/retrying call kept running through the backoff before noticing cancellation. Add a backoffOrCancel(ctx, attempt) helper that waits the backoff but returns ctx.Err() immediately when the context is done, and check ctx.Err() at the top of each retry loop. The interrupt now propagates in ~0.3s. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mudler
added a commit
that referenced
this pull request
Jun 2, 2026
Go 1.25's gofmt expands a single-line function body that earlier versions left inline, so the repo-wide `go fmt ./...` CI check failed on this file (inherited from #52). No behavior change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mudler
added a commit
that referenced
this pull request
Jun 2, 2026
…rn ends (#53) * fix(agent): keep detached/background sub-agents alive after parent turn ends A sub-agent's context was a child of the parent turn context (r.ctx), so when an embedder cancelled its per-turn context right after ExecuteTools returned — the normal end-of-turn cleanup — a just-detached (or background) agent was cancelled too, defeating the whole point of detaching. Parent the sub-agent context off context.WithoutCancel(r.ctx): it keeps the context's values but no longer propagates the parent's cancellation. Foreground cancellation is unaffected because the foreground select already watches r.ctx.Done() and calls cancel() explicitly; detached and background agents now run to completion independently and remain cancellable via AgentState.Cancel. Add TestDetachedAgentSurvivesParentCancel, which fails on the old behavior (agent cancelled after parent cancel) and passes now. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: gofmt cancel_inflight_test.go under Go 1.25 Go 1.25's gofmt expands a single-line function body that earlier versions left inline, so the repo-wide `go fmt ./...` CI check failed on this file (inherited from #52). No behavior change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cancellation responsiveness: the decision()/decisionWithStreaming() retry loops retried on any error (including context.Canceled) and slept the backoff non-cancellably between attempts. Bail out the moment the context is cancelled (check ctx.Err() each attempt + context-aware backoffOrCancel), so a cancelled in-flight LLM call surfaces context.Canceled promptly instead of sleeping through the full backoff.
Adds a unit test asserting ExecuteTools aborts an in-flight call on cancel. Branched off the commit wiz pins (67811fa) so it is testable end-to-end with wiz.