fix: add content-based session hash fallback for OpenAI compat clients#1459
Open
octo-patch wants to merge 1 commit intoWei-Shaw:mainfrom
Open
fix: add content-based session hash fallback for OpenAI compat clients#1459octo-patch wants to merge 1 commit intoWei-Shaw:mainfrom
octo-patch wants to merge 1 commit intoWei-Shaw:mainfrom
Conversation
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.
Fixes #1421
Problem
OpenAIGatewayService.GenerateSessionHashonly checks three explicit session signals (headerssession_id/conversation_id, body fieldprompt_cache_key). When none are present — which is the case for standard OpenAI-compatible clients such as Claude Code IDE extensions, custom scripts, and most non-Codex CLI tools — the function returns an empty string.An empty session hash means
SelectAccountWithSchedulerpicks a random upstream account on every request, preventing prompt caching entirely. Successive turns of the same conversation land on different accounts, so the upstream cache is never reused.Solution
Add a content-based fallback (priority 4) that builds a stable seed from:
Authorizationheader (SHA-256 hashed before use, so different API keys route independently)modelfieldUsing only the stable request prefix — rather than the full growing message list — ensures the hash remains constant across conversation turns. This gives sticky-session routing for the lifetime of a conversation without breaking when new messages are appended.
Clients that already provide explicit session signals (priorities 1-3) are completely unaffected.
Testing
TestOpenAIGatewayService_GenerateSessionHash_ContentBasedFallbackcovering:Authorization+ content are presentsession_idheader still takes priority over content-based fallback