fix(ai-gateway): retain streamed upstream responses#3947
Open
marius-kilocode wants to merge 2 commits into
Open
fix(ai-gateway): retain streamed upstream responses#3947marius-kilocode wants to merge 2 commits into
marius-kilocode wants to merge 2 commits into
Conversation
Contributor
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryAll 3 previously flagged warnings are resolved: the Previously Flagged Issues — All Resolved
Files Reviewed (3 files)
Fix these issues in Kilo Cloud Reviewed by claude-4.6-sonnet-20260217 · 280,524 tokens Review guidance: REVIEW.md from base branch |
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.
The proxy returns upstream responses by constructing a new
NextResponsearoundresponse.body. For fetched responses, runtime cleanup remains associated with the originalResponseobject. Passing only the body to a new response does not transfer that ownership. If the original response becomes unreachable before the downstream reader is acquired, garbage collection can cancel the returned branch even while sibling clones continue consuming the upstream stream.This is especially hazardous in the shared proxy path, where metrics, usage, and optional request logging create independent tee branches before the original body is handed to Next.js. A sibling branch completing therefore does not protect the client-facing leaf from cleanup tied to the original fetched response.
The response wrapper now uses a lazy identity
ReadableStreamthat keeps the original response strongly reachable for the full lifetime of the returned body:The fix applies at the common
wrapInSafeNextResponseboundary used by streaming model responses and other direct proxy routes. It does not change provider selection, response rewriting, retry behavior, protocol interpretation, or completion semantics.