perf: reduce redundant tokens sent per turn for Codex and Claude providers#7
Merged
Merged
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.
Summary
"local"fromCLAUDE_SETTING_SOURCESso Claude sessions no longer loadCLAUDE.local.mdon every session startsetPermissionModecall when the permission mode hasn't changed between turns (unnecessary SDK round-trip per turn)lastSentTurnParamsdiff mechanism toCodexAppServerManager—collaborationMode(developer_instructions),approvalPolicy/sandboxPolicy,model, andeffortare only sent when they change or on the first turn after a thread openBackground
Codex app-server persists
collaborationMode,approvalPolicy,sandboxPolicy,model, andeffortacross turns on the same thread. PeakCode was re-sending all of these on everyturn/start, wasting tokens each turn.Root cause:
interactionModeandruntimeModeinThreadTurnStartRequestedPayloadhaveSchema.withDecodingDefault, so they are neverundefined— all conditional "only send if changed" guards were dead code.Token savings per turn
collaborationMode/developer_instructionsapprovalPolicy+sandboxPolicymodel+effortChanges
apps/server/src/codexAppServerManager.ts—CodexLastSentTurnParamstype +lastSentTurnParamsfield on context; reset onthread/start/thread/resume; diff insendTurnapps/server/src/codexAppServerManager.test.ts— 4 new deduplication testsapps/server/src/provider/Layers/ClaudeAdapter.ts—lastSentPermissionModefield on context; conditionalsetPermissionMode; remove"local"fromCLAUDE_SETTING_SOURCESapps/server/src/provider/Layers/ClaudeAdapter.test.ts— update 2 test assertions for newsettingSourcesvalueTest plan
interactionModechange re-sendscollaborationModewith correct moderuntimeModechange re-sendsapprovalPolicy/sandboxPolicybun fmt && bun lint && bun typecheckall pass