The migrations image fails for a different reason than the other five: its
base is pinned at 42df77a9 (glibc 2.43-r13), but Wolfi's current python-3.13
needs 2.44, so `uv sync` dies before it ever reaches the Python pin:
ImportError: /usr/lib/libm.so.6: version `GLIBC_2.44' not found
(required by .../math.cpython-313-aarch64-linux-gnu.so)
Cherry-picks #38973 (merge 0f84a7053a) onto stable/1.97.x: bumps the base to
e624c5d5 and applies the same python-3.13 pin the sibling images got in the
previous commit.
The wolfi-base digest hunk conflicted the same way as #38917's and was
resolved identically, to e624c5d5.
Without this the componentized leg cannot publish: a failed build-amd64 or
build-arm64 matrix leg skips merge and sign-images, and package-and-push-chart
accepts `merge.result == 'skipped'` -- so the chart would publish pointing at
component images that were never built.
(cherry picked from commit 0f84a7053a)
Wolfi now resolves unpinned `python3` to 3.14. uvloop 0.21.0 has no 3.14
wheel, so uv builds it from sdist and libuv's configure bootstrap fails,
killing every Docker image job in `uv sync`. This is the same failure that
took down the 1.99.0 release pipeline.
Cherry-picks #38917 (merge f814945d4c) onto stable/1.97.x: pins
python-3.13 / python-3.13-dev in every apk layer, passes --python
python3.13 to each uv sync, and sets UV_PYTHON_DOWNLOADS=0 so a missing
interpreter fails loudly instead of silently downloading one.
The wolfi-base digest hunks conflicted -- stable/1.97.x sits at 42df77a9
while #38917 moved a31344ab -> e624c5d5. Resolved to e624c5d5, the base
the 1.99.0 images build and ship on today.
migrations/Dockerfile is deliberately untouched; that image is covered by
#38973, which is not part of this pick.
(cherry picked from commit f814945d4c)
Transitive-only dependency; lockfile-only. Pulls its own new requirement floors (caniuse-lite, node-releases, electron-to-chromium, update-browserslist-db, baseline-browser-mapping), all landing on the versions internal staging already resolves.
Both entries expired on 2026-08-12 and named advisories the lock now resolves
past, so they no longer exempt anything. The diskcache entry stays: that
package still has no fixed release.
RestrictedPython 8.3 extended its protected-name validation to cover
positional-only parameters, so sandboxed source can no longer bind a
local named _getattr_, _getitem_, _write_ or _print_ that takes
precedence over the hooks the custom-code guardrail sandbox installs.
8.4 and 8.5 continue in the same direction with safer_getattr and the
Python 3.15 syntax audit.
The floor moves rather than the lock alone so downstream installs of
litellm[proxy] pick up the same behaviour.
(cherry picked from commit f1bebb6fbd)
* fix(otel): mark v2 server spans as failed for pre-call errors (LIT-4780)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(otel): authenticate malformed-body requests before rejecting them (LIT-4780)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(auth): cover malformed-body rejection when auth error is recovered
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(auth): skip authorization for a request whose body never parsed
Deferring the parse failure ran the full auth phase, including budget reservation, whose reserved amount is only released by the endpoint's post call path; the endpoint never runs, so malformed requests leaked reservations and locked a budgeted key out. Authorization now runs only when the body parsed, and a parse failure with a rejected key keeps returning the 400 it returned before.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---------
Co-authored-by: shivam <shivam@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
some users do not use make pre-commit as it is a multi-minute process. I personally use it but I want users themselves to decide whether to pre-commit before each commit or not, based on what works best for them
* fix(ui): show team BYOK models in team fallback settings
Team router settings loaded fallback options from /model_group/info, which resolves models without a team, so a team's own BYOK deployments were never selectable in its own fallback config. Load the team-scoped listing when a team id is present.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(ui): ignore stale team model responses in router settings
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* refactor(ui): use react-query for fallback model listing in router settings accordion
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: ryan-crabbe-berri <ryan@berri.ai>
Since #35491, every Router joins the module-global _live_routers weak set at
construction, and every model cost map swap replays the deployments of every
member on top of the freshly adopted map. #36039 isolated the register_model
ledger half of that replay but not this half: under pytest-xdist, a Router
created by an earlier test in the same worker that was still referenced (or
simply not yet garbage collected) re-registered its deployments during
TestPriceDataReloadIntegration::test_distributed_reload_check_function, and
register_model hydrated the sparse mocked gpt-3.5-turbo entry into a full
ModelInfo dict, failing the exact-equality assert (reruns cannot help since
the polluting router survives in the worker process)
The autouse isolate_litellm_state fixture now snapshots _live_routers before
each test and restores its membership on teardown, so a test's routers stop
contributing to cost map rebuilds once the test ends. A canary pair in
test_conftest_isolation.py asserts the rollback
Typing-only pass over the 21 files with the highest reportAny and
reportExplicitAny density among self-contained modules: management
endpoints, guardrails, streaming internals, response transformations,
MCP server, enterprise managed files, and vector store management.
Whole-tree basedpyright drops from 148,648 to 146,984 errors (-1,664),
with reportAny -1,111 and reportExplicitAny -296. No rule increased
repo-wide and no file regressed on any rule. No cast(), type: ignore,
noqa, suppression comments, or new Any annotations anywhere in the diff,
and no runtime behavior changes.
Budgets ratcheted by make lint-budget-update: basedpyright -1,663 across
48 rules, ruff-strict -86, type-discipline -110.
require_managed_files was only checked on upload, so raw provider ids still
reached the batch, fine-tuning and vector store file routes. Ownership rows
exist only for managed ids, so those requests were forwarded under shared
credentials with no tenant check: knowing another tenant's id was enough to
read, run against, cancel or delete their object.
Generalise the file-id guard to validate_managed_id_requirement(resource_id,
resource_kind) and call it on batch create/retrieve/cancel, fine-tuning
create/retrieve/cancel (training_file and validation_file both) and the shared
vector store file id resolver. Behaviour is unchanged when the setting is off.