chore(release): backport proxy request-handling maintenance and refresh runtime deps for 1.95.1 - #36332
Merged
yuneng-berri merged 12 commits intoAug 9, 2026
Merged
Conversation
refactor(ui): route MCP session tokens through the shared storage helper (cherry picked from commit e4fd790)
…p-bump-5feb4a chore(deps): bump grpc and golang.org/x modules in the terraform provider (cherry picked from commit 2e25519)
fix(proxy)!: apply request-parameter checks consistently across body, path and form inputs (cherry picked from commit c898d34)
Contributor
|
Too many files changed for review (468 files, 100 file limit). Bypass the limit by tagging |
shin-berri
approved these changes
Aug 9, 2026
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.
Relevant issues
Linear ticket
Pre-Submission checklist
Please complete all items before asking a LiteLLM maintainer to review your PR
make test-unit— the two CI proxy scopes were run locally and are green; the full suite was not run, leaving that for CI@greptileaiand received a Confidence Score of at least 4/5 before requesting a maintainer reviewDelays in PR merge?
If you're seeing a delay in your PR being merged, ping the LiteLLM Team on Slack (#pr-review).
CI (LiteLLM team)
Branch creation CI run
Link:
CI run for the last commit
Link:
Merge / cherry-pick CI run
Links:
Screenshots / Proof of Fix
Type
🧹 Refactoring
🚄 Infrastructure
Changes
Patch release
1.95.1on top ofv1.95.0. Every code commit is acherry-pick -xof a commit already merged tolitellm_internal_staging, so nothing here is new work written against the stable line.fix(proxy)!: apply request-parameter checks consistently across body, path and form inputs (#36011)c898d341c0refactor(ui): route MCP session tokens through the shared storage helper (#35835)e4fd790f1cchore(deps): bump grpc and golang.org/x modules in the terraform provider (#35844)2e255191abSix further commits were considered for this line and are already on it by direct ancestry —
stable/1.95.xwas cut from staging on 2026-07-29, after all six had merged, so they needed no pick: #30585, #30867, #31905, #32093, #32405, #34189.Adaptation notes
#35835and#35844are verbatim.#35835's only divergence is a path: staging renamedcreate_mcp_server.tsxtoCreateMCPServer.tsxafter this line was cut, so the component is still at the old name here. The cherry-pick detected the rename and landed the hunk at this line's path; the added and removed lines are byte-identical to the staging commit across all five files.#36011diverges only in import plumbing. Every other added and removed line is byte-identical to staging. Two files needed it:_health_endpoints.py— staging importsIterable/Mappingfromcollections.abcandFinalfromtyping. This line still takesIterablefromtypingand has neitherFinalnorMapping. Rather than add a second import line and bindIterabletwice,FinalandMappingjoin the existingtypingimport, matching how the file already sources its generics.litellm_pre_call_utils.py— the commit's newreject_url_valued_destinationannotates a local withFinal, which this line'stypingimport also lacked.This is load-bearing rather than cosmetic: the commit adds a module-level
_CONFIG_CONNECTION_FIELDS: Final[frozenset[str]], and module-level annotations are evaluated at import, so a missingFinalwould be an import-time failure at proxy startup rather than a lint nit.One context line differs for the same reason: staging had migrated
auth_model_infoto aFinalannotation, so the commit carries the annotated form as context where this line has the plain assignment. This line's form is kept.Known behavior change
#36011is marked a breaking change upstream and it is worth stating plainly what changes on this line./health/test_connectionmerges differently. Previously the proxy config was the base and request parameters layered on top, so a request could name a configured model and override one field while still inheriting the configured connection details. Now, if the request carries any of the request-parameter list, the configured connection fields are not carried into it.There is a rough edge here, carried in unchanged from the upstream commit: the trigger is the full request-parameter list, but the fields dropped are the narrower connection set. So a request that includes a non-connection field such as
input_cost_per_tokenoroutput_cost_per_tokenalso loses the configuredapi_base/api_key, leaving the probe with no endpoint and reporting a failed connection for a model that is actually fine.general_settings.allow_client_side_credentialsrestores the previous merge. This reproduces identically onlitellm_internal_stagingandmain, so it is not introduced by this backport — flagging it so the release notes and any follow-up land in the right place.The endpoint's docstring still describes the old merge and is now inaccurate; it is unchanged here to keep this line byte-faithful to staging.
Two other behavior changes are the intended effect of the commit: a URL-valued
modelsupplied via the URL path or query is now rejected the same way a URL-valuedmodelin the JSON body already was, and bracket-notation form fields such asmetadata[...]are now inspected the same way the equivalent JSON object already was. Every bracket payload that is now rejected was already rejected in its JSON form on 1.95.0.Dependency refreshes
Routine maintenance of the image lockfile. Each entry moved to the smallest version that satisfies this line's ranges.
aiohttpgitpythonh2hpack4.1.0 → 4.2.0cryptography[tool.uv]overridemsalEach lock-only bump's regeneration moved nothing but its target.
hpackis forced rather than drift:h24.4.1 declareshpack<5,>=4.2.cryptographyis the one needing a manifest change. Theproxyextra moves to>=49.0.0,<51.0, matching staging's published range, and a[tool.uv]override pins the resolution at 50.x. The override is load-bearing and was verified by removing it and re-locking: without it the resolution falls to 49.0.0 and additionally dragsmlflowandmsalalong with it.That override raises
cryptographyfor every package in the workspace, including ones that declare a lower cap, so the caps it silences were checked rather than assumed:mlflow3.14.0 caps below 50. It is a dev/test dependency and is not installed in the published image. Its entire cryptography surface ismlflow/utils/crypto.py; KEK derivation, DEK wrap/unwrap, the AES-GCM authenticated round trip, and the wrong-AAD, wrong-key and tampered-ciphertext rejection paths were all exercised against 50.0.0 and pass.msal1.36.0 declarescryptography<49,>=2.5and is a production dependency here, reached throughazure-identityin both theproxyandextra_proxyextras. Rather than ship a pairingmsalitself does not support,msalmoves to 1.37.0, which declarescryptography<51. Nothing pinsmsal, and the bump moved onlymsal.The published
aiohttpfloor is also raised from>=3.10to>=3.14.2, matching staging. The lock already resolved 3.14.3; this makes the range a source install honours the same one, and it moved no package.pypdfis deliberately left where it is: a newer release exists butlitellm_internal_stagingstill resolves 6.14.2, and this line should not run ahead of staging.UI bundle
#35835changes production.tsx, so the dashboard bundle is rebuilt on this line with node v20.20.2 and committed. That is the bulk of the file count; the hand-reviewable surface is 18 files.The rebuild was verified by reproducing it independently: a clean rebuild from this branch's source produced 974 files matching the committed tree byte for byte, with no file present on one side only, the sole difference being the nondeterministic Next.js build-ID directory name.
Verification
Run on
stable/1.95.xwith a mirrored baseline worktree atv1.95.0for comparison.proxy-endpointsscope (23 directories, includinghealth_endpoints,image_endpointsandutils) at 6308 passed / 0 failed, and theproxy-authscope at 2278 passed / 0 failed.#36011's own tests are 366 passed. Reverting its five source files and rerunning drops that to 12 failed / 354 passed, spanning all three of its claims, which confirms the tests bind to this line's behavior rather than passing incidentally.#35835's store tests are 5 passed, 2 failed on the same revert check.modelcheck reached fromcommon_processing_pre_call_logic, and the health-check merge as reached from the route (its new tests call the helper directly, never the route). Both behave as intended.tests/documentation_tests/test_circular_imports.pypasses andfrom litellm import *is clean. The commit adds two new import edges out of_health_endpoints; neither introduces a cycle.#35844was built, not just diffed:go mod verify,go build ./...,go vet,go test ./...,gofmt -landgo mod tidy -diffare all clean under both Go 1.25.0 (the version CI resolves fromgo-version-file) and 1.26.5. Note thattest-terraform-provider.yml'spull_requesttrigger does not match a base ofstable/1.95.x, so those checks will run from the push trigger rather than as a PR gate.ruff format --check --exclude '/enterprise/'underlitellm/reports the same single pre-existing offender on this branch and on the untouched baseline (proxy/management_endpoints/credential_migration.py); every file this PR touches is clean.uv lock --checkpasses, so the lock is not stale against the manifest.A whole-tree
tests/test_litellm/proxyrun — a scope CI does not use — is order-dependent underxdiston both this branch and the untouched baseline: two identical runs of the same tree differ by 7 tests, and this branch reports fewer failures than the baseline. Every such failure passes in isolation on both trees. One recurring case traces totests/test_litellm/proxy/hooks/test_proxy_hooks_init.pyremovinglitellm.proxy.utilsfromsys.moduleswithout restoring it, which is pre-existing and affects both trees equally.