Skip to content

fix(docker): restore litellm-proxy-extras source dir in runtime images - #33592

Merged
yuneng-berri merged 2 commits into
litellm_internal_stagingfrom
litellm_/docker-allowlist-denylist-pr-4b26e6
Jul 16, 2026
Merged

fix(docker): restore litellm-proxy-extras source dir in runtime images#33592
yuneng-berri merged 2 commits into
litellm_internal_stagingfrom
litellm_/docker-allowlist-denylist-pr-4b26e6

Conversation

@yuneng-berri

@yuneng-berri yuneng-berri commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Relevant issues

Linear ticket

Pre-Submission checklist

Please complete all items before asking a LiteLLM maintainer to review your PR

  • I have added meaningful tests
  • My PR passes all CI/CD checks (e.g., lint, format, unit tests)
  • My PR's scope is as isolated as possible; it only solves 1 specific problem
  • I have received a Greptile Confidence Score of at least 4/5 before requesting a maintainer review (Greptile reviews automatically once the PR is opened; only comment @greptileai to re-request a review after pushing changes)

Screenshots / Proof of Fix

Broken behavior, captured on the published ghcr.io/berriai/litellm:v1.90.4 image (tag commit ae0cfc0). The folder is gone:

$ docker run --rm --entrypoint sh ghcr.io/berriai/litellm:v1.90.4 -c 'ls /app/litellm-proxy-extras'
ls: /app/litellm-proxy-extras: No such file or directory
$ echo $?
1

What makes the breakage silent: pointing prisma at the /app/schema.prisma that does still ship exits 0 while applying nothing, so a migration job reports success against an unmigrated database

$ docker run --rm -e DATABASE_URL="postgresql://postgres:...@host.docker.internal:55432/mig_before" \
    --entrypoint sh ghcr.io/berriai/litellm:v1.90.4 -c 'prisma migrate deploy --schema /app/schema.prisma'
Datasource "client": PostgreSQL database "mig_before", schema "public" at "host.docker.internal:55432"

No migration found in prisma/migrations

No pending migrations to apply.
$ echo $?
0
$ docker exec pg psql -U postgres -d mig_before -tc "SELECT count(*) FROM pg_tables WHERE schemaname='public';"
     1

The single table left behind is prisma's own _prisma_migrations bookkeeping table

Fixed behavior, captured at d2a79d8 on images built locally from each of the three Dockerfiles, each run against a fresh database:

$ docker build -t litellm-pe-fix:main -f Dockerfile .
$ docker run --rm -e DATABASE_URL="postgresql://postgres:...@host.docker.internal:55432/mig_after" \
    --entrypoint sh litellm-pe-fix:main -c '
      test -f /app/litellm-proxy-extras/litellm_proxy_extras/schema.prisma && echo "schema: present" &&
      test -d /app/litellm-proxy-extras/litellm_proxy_extras/migrations && echo "migrations dir: present" &&
      diff /app/schema.prisma /app/litellm-proxy-extras/litellm_proxy_extras/schema.prisma && echo "schema matches /app/schema.prisma" &&
      prisma migrate deploy --schema /app/litellm-proxy-extras/litellm_proxy_extras/schema.prisma'
schema: present
migrations dir: present
schema matches /app/schema.prisma
135 migrations found in prisma/migrations

All migrations have been successfully applied.
$ echo $?
0
$ docker exec pg psql -U postgres -d mig_after -tc "SELECT count(*) FROM pg_tables WHERE schemaname='public';"
    66

The same flow passes on the database variant and on the non_root variant running as its default uid 65534: migrations dir present and readable, 135 migrations applied to a fresh database, exit 0

Beyond the migration path, the image built at d2a79d8 was run through a 41-check contract suite covering DB-less and Postgres-backed boots, the migration entrypoint, admin UI serving, key generation, and real completion and streaming calls against the Anthropic API; everything passes except the one hygiene check this change deliberately inverts (it asserted the folder's absence)

Type

🐛 Bug Fix

Changes

#30243 narrowed the runtime stage of the three Dockerfiles to an allowlist COPY, which dropped /app/litellm-proxy-extras from published images starting v1.90.0. Deployments that run their own pre-deploy migration job (modeled on the helm migration job: pull the same image the app runs, then prisma migrate deploy against the schema and migrations shipped at that path) broke on upgrade to 1.90.x, and the breakage is silent because prisma migrate deploy exits 0 without applying anything when the schema it is pointed at has no adjacent migrations directory

This restores the litellm-proxy-extras folder in the runtime stage of all three Dockerfiles, matching what images up to v1.89.x contained (about 6 MB per image)

Final Attestation

  • The tests check the right things, including the edge cases, and regressions in the respective real-world customer use-cases are not possible after this PR

#30243 narrowed the runtime stage to an allowlist COPY, which dropped
/app/litellm-proxy-extras from the published images. Downstream
migration jobs point prisma migrate deploy at that path; with the
schema gone (or a schema with no adjacent migrations dir, where prisma
exits 0 without applying anything) those jobs went green while never
migrating the database. Restore the folder in all three runtime stages
and assert in image-scan that the schema and a non-empty migrations dir
ship at the source path
@yuneng-berri
yuneng-berri requested a review from a team July 16, 2026 21:04
@greptile-apps

greptile-apps Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR restores the /app/litellm-proxy-extras directory in the runtime stage of all three Dockerfiles, reversing a regression introduced in v1.90.0 where an allowlist-style COPY accidentally dropped the directory from published images. Without it, prisma migrate deploy exits 0 while applying nothing, silently leaving databases unmigrated.

  • Adds one identical COPY --from=builder /app/litellm-proxy-extras /app/litellm-proxy-extras line to Dockerfile, docker/Dockerfile.database, and docker/Dockerfile.non_root.
  • In Dockerfile.non_root the new COPY is placed before the chown -R nobody:nogroup /app block, so the restored directory picks up correct ownership and the existing LITELLM_PROXY_EXTRAS_PATH permission fixups still apply.
  • The fix is minimal and surgical; the PR description includes before/after migration run evidence and a 41-check contract test suite confirming correctness across all three image variants.

Confidence Score: 5/5

Safe to merge — the change adds a single, well-placed COPY line to each of the three Dockerfiles, restoring a directory that was accidentally dropped and causing silent migration failures.

The fix is a one-line COPY restoration in each Dockerfile, correctly positioned before the chown/permission blocks in the non-root variant so ownership is handled automatically. The PR description includes concrete before/after evidence of the silent migration failure being resolved, and a 41-check integration suite confirms all three image variants behave correctly. No logic changes, no new code paths, and no custom rules are implicated.

No files require special attention.

Important Files Changed

Filename Overview
Dockerfile Adds one COPY line to restore /app/litellm-proxy-extras in the runtime stage; positioned before existing chown/permission blocks, no ownership gap.
docker/Dockerfile.database Identical one-line COPY restoration as the main Dockerfile; consistent placement relative to Prisma cache copy blocks.
docker/Dockerfile.non_root Same COPY line added before the chown -R nobody:nogroup /app block, so the new directory inherits correct nobody:nogroup ownership and the existing LITELLM_PROXY_EXTRAS_PATH permission fixups still apply.

Reviews (2): Last reviewed commit: "chore(ci): drop image-scan migration-ass..." | Re-trigger Greptile

Comment thread .github/workflows/image-scan.yml Outdated
Comment on lines +54 to +59
- name: Assert prisma migration assets ship at the source path
run: |
docker run --rm --entrypoint sh litellm-image-scan:${{ github.sha }} -c '
test -f /app/litellm-proxy-extras/litellm_proxy_extras/schema.prisma &&
find /app/litellm-proxy-extras/litellm_proxy_extras/migrations -name migration.sql | grep -q .
'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 CI assertion covers only one of three patched Dockerfiles

The new assertion validates migration assets only in the Dockerfile.non_root image. The main Dockerfile and docker/Dockerfile.database each received the same COPY line, but neither is built nor tested here. The paths: trigger for this workflow also omits Dockerfile and docker/Dockerfile.database, so a future regression in those files would never run this check. If the COPY line is accidentally dropped from the main Dockerfile again, the silent migration failure that motivated this fix could recur undetected.

@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@yuneng-berri

Copy link
Copy Markdown
Contributor Author

@greptile

@yuneng-berri
yuneng-berri enabled auto-merge (squash) July 16, 2026 21:23
@codspeed-hq

codspeed-hq Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_/docker-allowlist-denylist-pr-4b26e6 (b55fcd9) with litellm_internal_staging (2162da5)

Open in CodSpeed

@yuneng-berri
yuneng-berri merged commit 111d447 into litellm_internal_staging Jul 16, 2026
127 of 128 checks passed
@yuneng-berri
yuneng-berri deleted the litellm_/docker-allowlist-denylist-pr-4b26e6 branch July 16, 2026 22:04
yuneng-berri added a commit that referenced this pull request Jul 16, 2026
…xy_extras_0716

chore(release): backport #33592 to stable/1.90.x and cut 1.90.5
yuneng-berri added a commit that referenced this pull request Jul 18, 2026
…1.93.0 stable cut (#33847)

* fix(ci): bump pillow to 12.3.0 to resolve osv-scan CVEs (#33093)

(cherry picked from commit 20e646c)

* chore(deps): pin httplib2 and setuptools transitive floors (#33233)

Raise the constraint floors for two transitive dependencies so resolution moves them to their latest maintenance releases: httplib2 0.31.2 -> 0.32.0 and setuptools 82.0.1 -> 83.0.0. Both are pulled in only by optional integrations (Google API client, grpc tooling, lunary observability, the nvidia-riva extra), all lower-bound only, so the floors stay inside every requirer's allowed range and a default install is unaffected

(cherry picked from commit 8b32320)

* fix(anthropic/passthrough): drop incompatible temperature when downgrading adaptive thinking for pre-4.6 models (#33244)

* fix(anthropic/passthrough): drop temperature and cap thinking budget when downgrading adaptive thinking for pre-4.6 models

* test(anthropic/passthrough): use sufficient max_tokens for reasoning_effort thinking mapping

* fix(anthropic/passthrough): drop incompatible temperature when downgrading adaptive thinking for pre-4.6 models

Narrow the fix to the temperature reconciliation; the reasoning_effort
budget cap is reverted because the live translation grid relies on
budget_tokens >= max_tokens to reject unsupported effort tiers
(xhigh/max) on budget-mode models, so capping turned those 400s into
200s.

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
(cherry picked from commit 71dffc1)

* build: raise requires-python cap to <3.15 so Python 3.14 installs current releases (#33438)

* build: drop requires-python upper cap so Python 3.14 resolves to current releases

The <3.14 cap made pip on Python 3.14 fall back to litellm 1.83.7, a
pre-April release whose old auth flow fails with 400s. The cap was added
in d9a4602 because deps lacked 3.14 wheels and uv could not resolve
the 3.14 split; both are fixed now via the existing python_version
markers plus a ddtrace version split (2.x has no cp314 wheels, 3.16+
does). Verified on 3.14.5: uv sync --all-extras installs, litellm and
proxy_server import (rust bridge falls back to pure python), real
provider calls succeed sync/async/streaming, and the core-utils test
suite passes.

* build: cap requires-python at <3.15 and keep ddtrace on one major per python band

Reviewer preference to bound the supported window at the newest tested
minor rather than leaving it open-ended, and Greptile flagged the
ddtrace 3.14+ range spanning two majors; every ddtrace 4.x ships cp314
wheels so the band is now >=4.0,<5.0, matching the single-major
convention of the 2.x band.

(cherry picked from commit c6d49a8)

* build(deps): update ddtrace to the 4.x line

A single ddtrace constraint now covers every supported Python version, so this collapses the version split introduced in #33438. Also aligns the build_from_pip image pin and updates the type-only Tracer import to its current module path

(cherry picked from commit edc38ea)

* fix(docker): restore litellm-proxy-extras source dir in runtime images (#33592)

* fix(docker): restore litellm-proxy-extras source dir in runtime images

#30243 narrowed the runtime stage to an allowlist COPY, which dropped
/app/litellm-proxy-extras from the published images. Downstream
migration jobs point prisma migrate deploy at that path; with the
schema gone (or a schema with no adjacent migrations dir, where prisma
exits 0 without applying anything) those jobs went green while never
migrating the database. Restore the folder in all three runtime stages
and assert in image-scan that the schema and a non-empty migrations dir
ship at the source path

* chore(ci): drop image-scan migration-assets assertion

(cherry picked from commit 111d447)

* fix(model_armor): restore reference attachments via skip_unscannable_attachments and remove the attachment count cap (#33554)

* fix(model_armor): add skip_unscannable_attachments to allow reference-only attachments through

* fix(model_armor): wire skip_unscannable_attachments through guardrail config

* fix(model_armor): make max_file_attachments configurable and scan overflow instead of dropping

* fix(model_armor): remove the per-request attachment count cap and scan all attachments

---------

Co-authored-by: yucheng <yucheng@berri.ai>
(cherry picked from commit 0d7b0f7)

* build(rust): raise pyo3 to 0.29 so the native bridge compiles on Python 3.14 (#33798)

pyo3 0.23.5 hard-caps the interpreter at Python 3.13, so building the
native bridge against a 3.14 interpreter aborts inside pyo3-ffi's build
script before anything links. This raises pyo3 and pyo3-async-runtimes
to 0.29 (currently the newest line, and the range starting at 0.26 that
supports 3.14) and migrates the three call sites whose APIs were renamed
across that range: Python::with_gil is now Python::attach and
Python::allow_threads is now Python::detach. On a GIL-enabled interpreter
those are pure renames with identical semantics, so behavior on 3.10
through 3.13 is unchanged

Verified by compiling the native module for cp313 and cp314 and driving
it directly on both interpreters: gil_stats reports exactly one GIL
release per sync OCR call and the async path completes, matching the
0.23.5 baseline. cargo fmt, clippy, and the workspace tests pass on both
3.13 and 3.14 with the lockfile locked, and the lock churn is confined to
the pyo3 crates

Part of #26343; addresses the pyo3 build failure reported in #33116

(cherry picked from commit f3d2015)

* build(deps): allow redisvl, pypdf, and openapi-core on Python 3.14 (#33801)

Remove the python_version < '3.14' environment markers from redisvl,
pypdf, and openapi-core now that all three install and import cleanly
on 3.14. The relock is marker-only: no package version changed for any
Python branch, and the locked versions (redisvl 0.4.1, pypdf 6.13.3,
openapi-core 0.22.0) now serve 3.14 as well. semantic-router and
aurelio-sdk stay gated because every published release caps
python_requires below 3.14

(cherry picked from commit 967d934)

* build(deps): bump mcp lock to 1.28.1 to clear image-scan findings (#33803)

* build(deps): bump mcp lock to 1.28.1 to clear image-scan findings

* build(deps): require mcp>=1.28.1

(cherry picked from commit 40e914c)

* fix(proxy): source /v1/models token limits from the cost map instead of Router.get_model_group_info (#33721)

* fix(proxy): source /v1/models token limits from cost map instead of Router.get_model_group_info

Resolves the per-model get_model_group_info fan-out on GET /v1/models
(and /models) that pegged the event loop on wildcard listings (#33636).
create_model_info_response now reads max_input_tokens/max_output_tokens
from litellm.get_model_info (the static cost map) rather than the router,
which aggregated and deepcopied every deployment in a group per listed
model.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(proxy): inject model-info lookup into create_model_info_response for deterministic coverage

Inject the cost-map lookup (defaulting to litellm.get_model_info) so the
except and max_output_tokens branches are exercised deterministically and
the token-limit tests no longer hardcode mutable cost-map values.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* feat(proxy): surface custom deployment token limits on /v1/models via cheap index lookup

Add Router.get_configured_token_limits, an O(1) model-name index lookup that
reads a concrete deployment's configured max_input_tokens/max_output_tokens
without triggering pattern matching or deep copies. create_model_info_response
layers this over the cost map so custom deployments absent from the cost map
still surface their limits, and admin-configured limits override cost-map
defaults, while wildcard-expanded names stay on the fast path.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: ryan <ryan@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
(cherry picked from commit 8536e3b)

---------

Co-authored-by: yucheng-berri <yucheng@berri.ai>
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: ryan-crabbe-berri <ryan@berri.ai>
yuneng-berri added a commit that referenced this pull request Jul 19, 2026
#33592)

* fix(docker): restore litellm-proxy-extras source dir in runtime images

#30243 narrowed the runtime stage to an allowlist COPY, which dropped
/app/litellm-proxy-extras from the published images. Downstream
migration jobs point prisma migrate deploy at that path; with the
schema gone (or a schema with no adjacent migrations dir, where prisma
exits 0 without applying anything) those jobs went green while never
migrating the database. Restore the folder in all three runtime stages
and assert in image-scan that the schema and a non-empty migrations dir
ship at the source path

* chore(ci): drop image-scan migration-assets assertion

(cherry picked from commit 111d447)
yuneng-berri added a commit that referenced this pull request Jul 19, 2026
…x-0718

chore(release): backport #33592, #33853 to stable/1.91.x and cut 1.91.4
yuneng-berri added a commit that referenced this pull request Jul 19, 2026
…x-0718

chore(release): backport #33244, #33592, #33554, #33853 to stable/1.92.x and cut 1.92.1
doonga pushed a commit to greyrock-labs/home-ops that referenced this pull request Jul 29, 2026
…4.0) (#201)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/berriai/litellm](https://images.chainguard.dev/directory/image/wolfi-base/overview) ([source](https://github.com/BerriAI/litellm)) | minor | `v1.93.0` → `v1.94.0` |

---

### Release Notes

<details>
<summary>BerriAI/litellm (ghcr.io/berriai/litellm)</summary>

### [`v1.94.0`](https://github.com/BerriAI/litellm/releases/tag/v1.94.0)

[Compare Source](https://github.com/BerriAI/litellm/compare/v1.94.0...v1.94.0)

##### Verify Docker Image Signature

All LiteLLM Docker images are signed with [cosign](https://docs.sigstore.dev/cosign/overview/). Every release is signed with the same key introduced in [commit `0112e53`](https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0).

**Verify using the pinned commit hash (recommended):**

A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
  ghcr.io/berriai/litellm:v1.94.0
```

**Verify using the release tag (convenience):**

Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/v1.94.0/cosign.pub \
  ghcr.io/berriai/litellm:v1.94.0
```

Expected output:

```
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
```

***

##### What's Changed

- feat(ui): working Test Connection for the complexity auto router by [@&#8203;akapur99](https://github.com/akapur99) in [#&#8203;32950](https://github.com/BerriAI/litellm/pull/32950)
- fix(xecguard): use StandardLoggingGuardrailInformation in logging hook by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;32911](https://github.com/BerriAI/litellm/pull/32911)
- feat(ui): adopt openapi-react-query ($api) and convert useCustomers by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32949](https://github.com/BerriAI/litellm/pull/32949)
- refactor(ui): colocate the mcp-servers view, keeping the shared mcp\_tools surface by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32968](https://github.com/BerriAI/litellm/pull/32968)
- refactor(ui): convert endpoint usage charts to shadcn/recharts by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32723](https://github.com/BerriAI/litellm/pull/32723)
- fix(proxy-auth): stop unrecognized model namespaces slipping through provider wildcard keys by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32979](https://github.com/BerriAI/litellm/pull/32979)
- feat(router): random-pick multi-model complexity tiers by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32967](https://github.com/BerriAI/litellm/pull/32967)
- fix(xecguard): sanitize scan result before recording it for logging by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;32935](https://github.com/BerriAI/litellm/pull/32935)
- fix(auto\_router): filter embedding models in complexity tab dropdowns, require all tiers, inline validation by [@&#8203;akapur99](https://github.com/akapur99) in [#&#8203;32978](https://github.com/BerriAI/litellm/pull/32978)
- fix(anthropic): translate raw adaptive thinking for pre-4.6 models on chat completions and Bedrock Converse by [@&#8203;akapur99](https://github.com/akapur99) in [#&#8203;32944](https://github.com/BerriAI/litellm/pull/32944)
- feat(router): add Router(plugins=\[...]) routing-plugin pipeline by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32972](https://github.com/BerriAI/litellm/pull/32972)
- feat(router): soft-floor adaptive mode for complexity router by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32947](https://github.com/BerriAI/litellm/pull/32947)
- docs(github): add QA runbook section to the PR template by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32965](https://github.com/BerriAI/litellm/pull/32965)
- fix(model\_cost): add supports\_reasoning: false to Gemini image generation models by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32836](https://github.com/BerriAI/litellm/pull/32836)
- build(dev-env): add make bootstrap and unprovisioned-checkout preflight to pre-commit by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32981](https://github.com/BerriAI/litellm/pull/32981)
- ci(ui): report only error-level knip findings in CI by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32971](https://github.com/BerriAI/litellm/pull/32971)
- feat(batches): track cost for unmanaged Bedrock batches, generalize the flag by [@&#8203;Sameerlite](https://github.com/Sameerlite) in [#&#8203;32315](https://github.com/BerriAI/litellm/pull/32315)
- fix(guardrails): walk custom\_tool\_call\_output items in \_content\_utils by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;32969](https://github.com/BerriAI/litellm/pull/32969)
- fix: show and allow editing team model aliases after team creation by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33047](https://github.com/BerriAI/litellm/pull/33047)
- chore(deps): bump pillow to 12.3.0 to resolve osv-scan CVEs by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33093](https://github.com/BerriAI/litellm/pull/33093)
- feat(mcp): mint gateway-bound envelope at the token endpoint for dcr\_bridge oauth\_delegate by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32828](https://github.com/BerriAI/litellm/pull/32828)
- fix(mcp): surface rejected delegate-auth upstream tokens as connect-time 401 by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32741](https://github.com/BerriAI/litellm/pull/32741)
- fix(proxy): track unauthenticated pass-through requests in spend logs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;32410](https://github.com/BerriAI/litellm/pull/32410)
- feat(lasso): send source.type for Used By attribution by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33090](https://github.com/BerriAI/litellm/pull/33090)
- fix(responses): continue MCP gateway tool turns from the final response and surface failures by [@&#8203;thibault-linktree](https://github.com/thibault-linktree) in [#&#8203;33025](https://github.com/BerriAI/litellm/pull/33025)
- fix(responses): continue MCP gateway tool turns from the final response and surface failures by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33099](https://github.com/BerriAI/litellm/pull/33099)
- fix(completion): forward aws credential kwargs into litellm\_params so the responses bridge keeps WIF auth by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32956](https://github.com/BerriAI/litellm/pull/32956)
- fix(ui): respect litellm\_key\_header\_name in BYOK credential save and workflow runs fetches by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33103](https://github.com/BerriAI/litellm/pull/33103)
- refactor(ui): standardize debounce waits behind shared DEBOUNCE\_WAIT\_MS constant by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33040](https://github.com/BerriAI/litellm/pull/33040)
- feat(ui): rebuild the Virtual Keys table on the shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;32991](https://github.com/BerriAI/litellm/pull/32991)
- fix: redact async complete streaming response for custom callbacks by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33106](https://github.com/BerriAI/litellm/pull/33106)
- build(ui): bump [@&#8203;tanstack/react-pacer](https://github.com/tanstack/react-pacer) from 0.2.0 to 0.22.1 by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33041](https://github.com/BerriAI/litellm/pull/33041)
- fix(ui): address Virtual Keys redesign review nits by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33112](https://github.com/BerriAI/litellm/pull/33112)
- fix(openai/responses): clamp max\_output\_tokens below API minimum by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33098](https://github.com/BerriAI/litellm/pull/33098)
- fix(prometheus): read v3 rate limiter remaining values for per-key model gauges by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33119](https://github.com/BerriAI/litellm/pull/33119)
- fix(ui): drop w-full from page-content wrappers to remove 32px horizontal overflow by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33118](https://github.com/BerriAI/litellm/pull/33118)
- refactor(ui): migrate straightforward value debounces to react-pacer by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33042](https://github.com/BerriAI/litellm/pull/33042)
- feat(mcp): interactive SSO sign-in for dcr\_bridge oauth\_delegate DCR clients by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32946](https://github.com/BerriAI/litellm/pull/32946)
- test(proxy): add regression tests for management\_endpoints edge cases by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;32976](https://github.com/BerriAI/litellm/pull/32976)
- fix(auto-router): correct Responses API tool\_choice shape and propagate alias litellm\_params by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32974](https://github.com/BerriAI/litellm/pull/32974)
- fix(ui): render the sidebar scrollbar with shadcn ScrollArea by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33124](https://github.com/BerriAI/litellm/pull/33124)
- refactor(ui): migrate callback debounce sites to react-pacer with regression tests by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33043](https://github.com/BerriAI/litellm/pull/33043)
- chore: add CODEOWNERS for ui and proxy UI build artifacts by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33131](https://github.com/BerriAI/litellm/pull/33131)
- feat(mcp): client-held refresh envelope for the dcr\_bridge oauth\_delegate flow by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32980](https://github.com/BerriAI/litellm/pull/32980)
- feat(ui): rebuild the Teams table on the shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33128](https://github.com/BerriAI/litellm/pull/33128)
- fix(mcp): relay upstream OAuth token and DCR rejections instead of a generic 500 by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33113](https://github.com/BerriAI/litellm/pull/33113)
- fix(keys): persist key\_type so the UI shows correct key scope instead of "All Proxy Models" by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33115](https://github.com/BerriAI/litellm/pull/33115)
- feat(router): opt-in session affinity for complexity router by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;33126](https://github.com/BerriAI/litellm/pull/33126)
- feat(prometheus): expose video duration and image count consumption metrics by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33138](https://github.com/BerriAI/litellm/pull/33138)
- test(e2e): otel trace completeness on /chat/completions by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33132](https://github.com/BerriAI/litellm/pull/33132)
- fix(sso): paginate through all pages when fetching service principal group assignments by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33149](https://github.com/BerriAI/litellm/pull/33149)
- test(e2e): otel trace completeness on /v1/messages by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33133](https://github.com/BerriAI/litellm/pull/33133)
- feat(ui): add adaptive routing settings to Auto-Router v2 by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;33146](https://github.com/BerriAI/litellm/pull/33146)
- refactor(mcp): extract the dcr\_bridge token flow into bridge\_token\_flow\.py by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33141](https://github.com/BerriAI/litellm/pull/33141)
- chore: bump litellm 1.93.0 -> 1.94.0, litellm-enterprise 0.1.49 -> 0.1.50, litellm-proxy-extras 0.4.76 -> 0.4.77 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33229](https://github.com/BerriAI/litellm/pull/33229)
- fix(proxy): route master key to team-scoped models by [@&#8203;kunal2002](https://github.com/kunal2002) in [#&#8203;32926](https://github.com/BerriAI/litellm/pull/32926)
- chore(deps): pin httplib2 and setuptools transitive floors by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33233](https://github.com/BerriAI/litellm/pull/33233)
- feat(ui): left-anchor the Create Key and Create Team CTAs by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33248](https://github.com/BerriAI/litellm/pull/33248)
- fix(anthropic/passthrough): drop incompatible temperature when downgrading adaptive thinking for pre-4.6 models by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33244](https://github.com/BerriAI/litellm/pull/33244)
- fix(guardrails): run apply\_guardrail-style model-level pre\_call guardrails at deployment hook by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33136](https://github.com/BerriAI/litellm/pull/33136)
- fix(proxy)!: enforce user budget on team keys (read-time + reservation) with UI opt-out by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;32005](https://github.com/BerriAI/litellm/pull/32005)
- fix(e2e): bound spend-log snapshots to a /spend/logs/v2 window by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33265](https://github.com/BerriAI/litellm/pull/33265)
- test(e2e): cover key rpm/tpm rate limiting, window reset, and pacing headers by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32914](https://github.com/BerriAI/litellm/pull/32914)
- fix(anthropic): use native output capability by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;33235](https://github.com/BerriAI/litellm/pull/33235)
- fix(ci): retry setup-uv installs to survive transient manifest fetch failures by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33279](https://github.com/BerriAI/litellm/pull/33279)
- fix(proxy): never log raw virtual keys in key insertion debug output by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33268](https://github.com/BerriAI/litellm/pull/33268)
- fix(bedrock\_mantle): route xai.grok-4.3 via /openai/v1 frontier path by [@&#8203;marty-sullivan](https://github.com/marty-sullivan) in [#&#8203;33027](https://github.com/BerriAI/litellm/pull/33027)
- feat(pricing): add gemini-omni-flash-preview with video output token pricing by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33274](https://github.com/BerriAI/litellm/pull/33274)
- fix(auth): scope the JWT enterprise gate to actual JWTs by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33296](https://github.com/BerriAI/litellm/pull/33296)
- fix(s3): sanitize slashes in response-id-derived object key file name by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33271](https://github.com/BerriAI/litellm/pull/33271)
- refactor(ui): migrate guardrails table onto shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33303](https://github.com/BerriAI/litellm/pull/33303)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33308](https://github.com/BerriAI/litellm/pull/33308)
- feat(guardrails): streaming text transformation in generic\_guardrail\_api by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33110](https://github.com/BerriAI/litellm/pull/33110)
- test(e2e): cover model-aware mid-conversation system handling on Bedrock Invoke /v1/messages by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32963](https://github.com/BerriAI/litellm/pull/32963)
- test(claude\_code): move the Claude Code compatibility matrix under tests/e2e by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;32548](https://github.com/BerriAI/litellm/pull/32548)
- chore(ci): sync litellm\_internal\_staging into daily OSS branch by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33337](https://github.com/BerriAI/litellm/pull/33337)
- feat(bedrock guardrails): add resource-less InvokeGuardrailChecks (detect-only) mode by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33299](https://github.com/BerriAI/litellm/pull/33299)
- Revert "chore(ci): sync litellm\_internal\_staging into daily OSS branch" by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33339](https://github.com/BerriAI/litellm/pull/33339)
- fix(websearch): intercept web search on the Responses API by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33129](https://github.com/BerriAI/litellm/pull/33129)
- fix(anthropic-adapter): drop empty content\_block\_delta events by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33315](https://github.com/BerriAI/litellm/pull/33315)
- fix(mcp): persist discovered OAuth endpoints and keep last known good on failed re-discovery by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33286](https://github.com/BerriAI/litellm/pull/33286)
- test(e2e): otel trace completeness on streaming chat, messages, and responses (LIT-3787) by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33234](https://github.com/BerriAI/litellm/pull/33234)
- feat(router): resolve auto-router routing plugins from proxy YAML config by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;33251](https://github.com/BerriAI/litellm/pull/33251)
- test(e2e): failed request error span carries the full untruncated message and status (LIT-4179) by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33304](https://github.com/BerriAI/litellm/pull/33304)
- refactor(ui): migrate tags table onto shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33314](https://github.com/BerriAI/litellm/pull/33314)
- fix(cli): surface actionable CLI SSO errors when CLI and proxy versions skew by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33309](https://github.com/BerriAI/litellm/pull/33309)
- feat(bedrock\_mantle): add GPT-5.6 sol/terra/luna to model cost map by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33412](https://github.com/BerriAI/litellm/pull/33412)
- chore(codeowners): exempt generated schema.d.ts from UI ownership by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33411](https://github.com/BerriAI/litellm/pull/33411)
- feat(proxy): push-based OTLP billable-request metering for enterprise deployments by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;31592](https://github.com/BerriAI/litellm/pull/31592)
- fix(mcp): cap per-user OAuth token cache TTL at the token's own lifetime by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33346](https://github.com/BerriAI/litellm/pull/33346)
- feat(ui): move Caching out of Experimental into Developer Tools by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33432](https://github.com/BerriAI/litellm/pull/33432)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33425](https://github.com/BerriAI/litellm/pull/33425)
- chore(ci): merge daily internal staging branch by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33335](https://github.com/BerriAI/litellm/pull/33335)
- feat(guardrails): add Compresr guardrail for query-aware context compression by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33295](https://github.com/BerriAI/litellm/pull/33295)
- fix(logging): preserve callback order in get\_combined\_callback\_list by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33005](https://github.com/BerriAI/litellm/pull/33005)
- fix(logging): redact assistant tool call arguments in spend logs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33111](https://github.com/BerriAI/litellm/pull/33111)
- fix(anthropic): honor messages request timeout by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33418](https://github.com/BerriAI/litellm/pull/33418)
- fix(llm\_guard): apply sanitized prompt returned by moderation API to request by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33331](https://github.com/BerriAI/litellm/pull/33331)
- fix(logging): stop pinning large request payloads past request end by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33455](https://github.com/BerriAI/litellm/pull/33455)
- feat(guardrails): forward optional metadata on POST /guardrails/apply\_guardrail by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33067](https://github.com/BerriAI/litellm/pull/33067)
- build: raise requires-python cap to <3.15 so Python 3.14 installs current releases by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33438](https://github.com/BerriAI/litellm/pull/33438)
- feat(ui): add reusable BetaBadge and use it for Projects sidebar item by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33449](https://github.com/BerriAI/litellm/pull/33449)
- fix(mcp): discover missing OAuth scopes and token\_url when authorization\_url is set manually by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33317](https://github.com/BerriAI/litellm/pull/33317)
- feat(ui): show exact license expiration date in usage cards by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33478](https://github.com/BerriAI/litellm/pull/33478)
- test(claude\_code): rename misleading REPO\_ROOT to SUITE\_ROOT in test\_v0\_layout by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33472](https://github.com/BerriAI/litellm/pull/33472)
- build(deps): update ddtrace to the 4.x line by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33484](https://github.com/BerriAI/litellm/pull/33484)
- fix(complexity\_router): return empty dict from \_classifier\_call\_metadata when metadata is absent by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33452](https://github.com/BerriAI/litellm/pull/33452)
- fix(ui/chat): resolve chat routes at render time so navigation works under server\_root\_path by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33446](https://github.com/BerriAI/litellm/pull/33446)
- fix(key management): enforce minimum custom key length and mask short keys in key\_name by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33462](https://github.com/BerriAI/litellm/pull/33462)
- chore(ui): remove unmounted UsageIndicator and the Hide Usage Indicator flag by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33482](https://github.com/BerriAI/litellm/pull/33482)
- test(e2e/claude\_code): add passthrough matrix row for the big-3 clouds and Anthropic API by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33473](https://github.com/BerriAI/litellm/pull/33473)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33491](https://github.com/BerriAI/litellm/pull/33491)
- fix(ui): stop sending the complexity-router pseudo-model to /health/test\_connection by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;33498](https://github.com/BerriAI/litellm/pull/33498)
- feat(cli): add lite up/down to ambiently route Claude Code through the proxy by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;33231](https://github.com/BerriAI/litellm/pull/33231)
- feat(complexity\_router): enable session\_affinity by default by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33500](https://github.com/BerriAI/litellm/pull/33500)
- fix(anthropic): stop 500 on combined thinking+signature streaming chunk by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33505](https://github.com/BerriAI/litellm/pull/33505)
- feat(autoroute): prompt for semantic keywords per tier in configure wizard by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33508](https://github.com/BerriAI/litellm/pull/33508)
- fix(cli/anthropic): unblock lite autoroute proxy deps, adaptive thinking, and thinking+signature streaming by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33507](https://github.com/BerriAI/litellm/pull/33507)
- test(ocr): use mistral-document-ai-2512 in azure\_ai OCR tests by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33489](https://github.com/BerriAI/litellm/pull/33489)
- fix(guardrails): show YAML-defined guardrails in the Guardrail Monitor by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;32853](https://github.com/BerriAI/litellm/pull/32853)
- refactor(ui): migrate policies, deleted keys, deleted teams, budgets, and search tools tables onto shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33357](https://github.com/BerriAI/litellm/pull/33357)
- refactor(ui): migrate vector stores, prompts, and skills tables onto shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33343](https://github.com/BerriAI/litellm/pull/33343)
- test(e2e): datadog log delivery for successful chat, messages, and responses (LIT-4447) by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33415](https://github.com/BerriAI/litellm/pull/33415)
- fix(cli): make CLI output ASCII-only so it doesn't crash legacy Windows consoles by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33465](https://github.com/BerriAI/litellm/pull/33465)
- fix: remove dead user-cache lookup with None key in spend-update path by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33555](https://github.com/BerriAI/litellm/pull/33555)
- feat(helm): add per-component PodDisruptionBudget and topologySpreadConstraints to componentized chart by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33430](https://github.com/BerriAI/litellm/pull/33430)
- fix(e2e/claude\_code): unblock stage collection, align proxy env names, register compat models by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33433](https://github.com/BerriAI/litellm/pull/33433)
- fix(mcp): index authed request-time tools missing from the semantic filter startup index by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33318](https://github.com/BerriAI/litellm/pull/33318)
- fix(streaming): use provider-reported usage cost for OpenRouter streams by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32255](https://github.com/BerriAI/litellm/pull/32255)
- feat(mcp): issuer-anchored OAuth discovery (RFC 8414 §3.3) to close the authorization-server mix-up by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33450](https://github.com/BerriAI/litellm/pull/33450)
- feat(logging): add user and team level spend and budget to StandardLoggingPayload metadata by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33459](https://github.com/BerriAI/litellm/pull/33459)
- fix(router): cast model\_info cost values to float in \_set\_model\_group\_info by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33556](https://github.com/BerriAI/litellm/pull/33556)
- chore(e2e): establish litellm\_e2e\_staging integration line by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33502](https://github.com/BerriAI/litellm/pull/33502)
- fix(ui): navigate to /ui/login/ with trailing slash via hard navigation by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33561](https://github.com/BerriAI/litellm/pull/33561)
- feat(logging): add structured budget fields to budget rejection failure logs by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33460](https://github.com/BerriAI/litellm/pull/33460)
- fix(streaming): surface upstream connection resets instead of empty 200 streams by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33222](https://github.com/BerriAI/litellm/pull/33222)
- fix(proxy\_cli): reap orphaned prisma query-engine processes when a worker dies by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33424](https://github.com/BerriAI/litellm/pull/33424)
- test(reasoning\_effort\_grid): enable azure fable-5 and opus-4-8 grid cells by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33485](https://github.com/BerriAI/litellm/pull/33485)
- build(deps): bump uvicorn lock to 0.51.0 so worker health-check and jitter flags take effect by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33574](https://github.com/BerriAI/litellm/pull/33574)
- fix(proxy): coerce default\_internal\_user\_params.max\_budget to float on config load by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;32434](https://github.com/BerriAI/litellm/pull/32434)
- fix(router): honor per-request routing\_strategy from key/team router\_settings by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33429](https://github.com/BerriAI/litellm/pull/33429)
- fix(redis): honor ssl value instead of key presence when building async connection pool by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;32590](https://github.com/BerriAI/litellm/pull/32590)
- fix(langfuse\_otel): build per-request OTLP exporter from key and team dynamic Langfuse credentials by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;32437](https://github.com/BerriAI/litellm/pull/32437)
- ci: run zizmor and proxy-db unit tests on PRs targeting litellm\_ branches by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33568](https://github.com/BerriAI/litellm/pull/33568)
- fix(router): apply team/key enable\_tag\_filtering to tag routing by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33436](https://github.com/BerriAI/litellm/pull/33436)
- feat(proxy): add disable\_auto\_add\_proxy\_admin\_to\_teams flag by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33563](https://github.com/BerriAI/litellm/pull/33563)
- fix(proxy): stop stale auth cache re-publish to Redis so key updates propagate across replicas by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33565](https://github.com/BerriAI/litellm/pull/33565)
- feat(e2e): emit structured E2E\_RESULT lines for package status history by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33578](https://github.com/BerriAI/litellm/pull/33578)
- chore: bump litellm-enterprise 0.1.50 -> 0.1.51, litellm-proxy-extras 0.4.77 -> 0.4.78 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33571](https://github.com/BerriAI/litellm/pull/33571)
- fix(docker): restore litellm-proxy-extras source dir in runtime images by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33592](https://github.com/BerriAI/litellm/pull/33592)
- feat(ui): require embedding model for semantic auto router by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33313](https://github.com/BerriAI/litellm/pull/33313)
- feat(scim): ingest and round-trip SCIM entitlements and roles user attributes by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33587](https://github.com/BerriAI/litellm/pull/33587)
- refactor(ui): migrate 5 simple tables onto shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33548](https://github.com/BerriAI/litellm/pull/33548)
- fix(model\_armor): restore reference attachments via skip\_unscannable\_attachments and remove the attachment count cap by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33554](https://github.com/BerriAI/litellm/pull/33554)
- fix(mcp): keep the MCP reference intact when the semantic filter narrows tools by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33584](https://github.com/BerriAI/litellm/pull/33584)
- fix(sso): stop enforcing UI session budget on CLI login tokens by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33312](https://github.com/BerriAI/litellm/pull/33312)
- test: e2e staging leftovers by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33613](https://github.com/BerriAI/litellm/pull/33613)
- test(e2e/claude\_code): add GPT-5.6 Sol/Terra/Luna columns for OpenAI, Azure OpenAI, and Bedrock Mantle by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;33474](https://github.com/BerriAI/litellm/pull/33474)
- test(e2e): otel streaming spans record a real ttft below span duration by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33588](https://github.com/BerriAI/litellm/pull/33588)
- fix(mcp): make the preemptive-401 OAuth challenge decision mode-aware by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33586](https://github.com/BerriAI/litellm/pull/33586)
- fix(ui): show all teams in policy attachment form for admins by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33628](https://github.com/BerriAI/litellm/pull/33628)
- refactor(ui): migrate AI Hub, public hub, and MCP Toolsets tables onto shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33629](https://github.com/BerriAI/litellm/pull/33629)
- test(e2e): datadog log delivery for streamed routes, read back from the real datadog api by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33566](https://github.com/BerriAI/litellm/pull/33566)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33640](https://github.com/BerriAI/litellm/pull/33640)
- fix(vertex\_ai): surface Gemini grounding toolUsePromptTokenCount in Usage by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33533](https://github.com/BerriAI/litellm/pull/33533)
- test(e2e): harness fixes for stage job green (skips + router/UI/budget) by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33634](https://github.com/BerriAI/litellm/pull/33634)
- fix(router): resolve prompt cache minimum per model instead of a flat 1024 by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33637](https://github.com/BerriAI/litellm/pull/33637)
- fix(logging): classify async anthropic\_messages and generate\_content as async by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33589](https://github.com/BerriAI/litellm/pull/33589)
- fix(ui): remove Chat item from dashboard leftnav by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33647](https://github.com/BerriAI/litellm/pull/33647)
- fix(router): tag-aware pre-routing strategy selection for shared model\_name by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33691](https://github.com/BerriAI/litellm/pull/33691)
- fix(proxy): enforce max\_parallel\_requests as a per-slot concurrency gauge by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;32441](https://github.com/BerriAI/litellm/pull/32441)
- fix(proxy): stop treating upstream model body field as a LiteLLM model on auth-enforced pass-through routes by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33710](https://github.com/BerriAI/litellm/pull/33710)
- fix(mcp): expand toolset grants in shared permission primitives so tools/call honors them by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33612](https://github.com/BerriAI/litellm/pull/33612)
- feat(complexity-router): user-triggered escalation keywords by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33656](https://github.com/BerriAI/litellm/pull/33656)
- fix(fireworks\_ai): bill prompt-cache hits at cache\_read rate by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33714](https://github.com/BerriAI/litellm/pull/33714)
- fix(pricing): mark realtime-only gpt-realtime models as mode realtime by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33728](https://github.com/BerriAI/litellm/pull/33728)
- fix(rag): track LLM completion usage and spend for /v1/rag/query by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;32438](https://github.com/BerriAI/litellm/pull/32438)
- feat(anthropic): add enable\_anthropic\_prompt\_caching for automatic cache\_control injection by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33573](https://github.com/BerriAI/litellm/pull/33573)
- fix(anthropic): self-heal on missing thinking-signature errors from Bedrock/Vertex by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33719](https://github.com/BerriAI/litellm/pull/33719)
- fix(proxy): resolve router\_settings.plugins dotted paths and load plugins from installed packages by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33644](https://github.com/BerriAI/litellm/pull/33644)
- test(e2e): budget refusals are 429 for bare keys and team caps block every team key by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33632](https://github.com/BerriAI/litellm/pull/33632)
- feat(router): add router plugin reference catalog by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33746](https://github.com/BerriAI/litellm/pull/33746)
- test(e2e): assert an org budget block is a 429 naming the organization by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33638](https://github.com/BerriAI/litellm/pull/33638)
- fix(proxy): bill partial streamed spend when the client disconnects mid-stream by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33736](https://github.com/BerriAI/litellm/pull/33736)
- test(e2e): delete unreferenced Grafana panel docs by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33743](https://github.com/BerriAI/litellm/pull/33743)
- docs(tests/e2e): align skip-vs-fail docs with the hard-fail contract and scope the no-unit-tests rule by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33755](https://github.com/BerriAI/litellm/pull/33755)
- refactor(e2e): replace bespoke result reporter with standard JUnit report by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33758](https://github.com/BerriAI/litellm/pull/33758)
- test(e2e): user budget across keys and team member budget isolation by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33745](https://github.com/BerriAI/litellm/pull/33745)
- refactor(e2e): remove bob\_the\_builder; drive remediation from a Grafana alert (provisioned outside the repo) by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33749](https://github.com/BerriAI/litellm/pull/33749)
- feat(mcp): per-server outcomes for aggregate tools/list and truthful single-server REST statuses by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33153](https://github.com/BerriAI/litellm/pull/33153)
- test(e2e): mcp suite for key-without-access denial by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33752](https://github.com/BerriAI/litellm/pull/33752)
- chore(ci): merge oss branch by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33784](https://github.com/BerriAI/litellm/pull/33784)
- chore(ci): merge oss branch - July 17th by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33793](https://github.com/BerriAI/litellm/pull/33793)
- fix(ui): migrate tag deletion to shared DeleteResourceModal by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33795](https://github.com/BerriAI/litellm/pull/33795)
- build(rust): raise pyo3 to 0.29 so the native bridge compiles on Python 3.14 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33798](https://github.com/BerriAI/litellm/pull/33798)
- chore(guardrails): remove docstring from singulr module for consistency by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33800](https://github.com/BerriAI/litellm/pull/33800)
- fix(ui): stop credential edit from persisting the masked api key by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33797](https://github.com/BerriAI/litellm/pull/33797)
- build(deps): allow redisvl, pypdf, and openapi-core on Python 3.14 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33801](https://github.com/BerriAI/litellm/pull/33801)
- test(proxy): make streaming-cancel mocks awaitable for the disconnect slot release by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33802](https://github.com/BerriAI/litellm/pull/33802)
- test(e2e): a member's team budget cuts off only that member's key by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33718](https://github.com/BerriAI/litellm/pull/33718)
- test(e2e): a user's max\_budget follows the person across personal and team keys by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33762](https://github.com/BerriAI/litellm/pull/33762)
- test(e2e): skip flaky OpenAI GPT cells; raise multi-window max\_tokens by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33799](https://github.com/BerriAI/litellm/pull/33799)
- chore: remove accidentally committed dist tarball and ignore dist/ by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33805](https://github.com/BerriAI/litellm/pull/33805)
- fix(passthrough): stop classifying plain 'predict'/'search' paths as Vertex by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33658](https://github.com/BerriAI/litellm/pull/33658)
- build(deps): bump mcp lock to 1.28.1 to clear image-scan findings by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33803](https://github.com/BerriAI/litellm/pull/33803)
- test(pricing): pin the realtime mode assertion to the bundled cost map by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33806](https://github.com/BerriAI/litellm/pull/33806)
- fix(proxy): derive session id from Anthropic metadata.user\_id for session affinity by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33723](https://github.com/BerriAI/litellm/pull/33723)
- test(e2e): budget reset diagonal for team, org, user, and [#&#8203;32005](https://github.com/BerriAI/litellm/issues/32005) team-member keys by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33771](https://github.com/BerriAI/litellm/pull/33771)
- fix(proxy): source /v1/models token limits from the cost map instead of Router.get\_model\_group\_info by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33721](https://github.com/BerriAI/litellm/pull/33721)
- fix(fireworks\_ai): correct glm-5p2 prompt-cache read price to $0.14/1M by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33796](https://github.com/BerriAI/litellm/pull/33796)
- feat(proxy): add x-litellm-model-name response header with deployment model string by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33698](https://github.com/BerriAI/litellm/pull/33698)
- feat: add Straiker guardrail integration by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33781](https://github.com/BerriAI/litellm/pull/33781)
- fix(vertex\_ai): exclude Gemini Google Search grounding tokens from input token billing by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33742](https://github.com/BerriAI/litellm/pull/33742)
- feat(fireworks\_ai): map litellm session id to x-session-affinity header for prompt caching by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33717](https://github.com/BerriAI/litellm/pull/33717)
- feat(ui): configure Anthropic automatic prompt caching from the Admin UI by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33581](https://github.com/BerriAI/litellm/pull/33581)
- fix(router): enforce context-window pre-call checks for Responses API input by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33706](https://github.com/BerriAI/litellm/pull/33706)
- fix(otel): restore proxy-level error.\* attributes on v2 failure spans (LIT-4179) by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33664](https://github.com/BerriAI/litellm/pull/33664)
- fix(mcp): persist config.yaml DCR clients in a server-scoped store so refresh survives token expiry by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33768](https://github.com/BerriAI/litellm/pull/33768)
- refactor(ui): consolidate Add/Edit credential modals into one CredentialModal by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32572](https://github.com/BerriAI/litellm/pull/32572)
- feat(mcp): add ID-JAG (identity assertion authorization grant) support for MCP egress by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;31516](https://github.com/BerriAI/litellm/pull/31516)
- refactor(ui): migrate policy attachments table onto shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33827](https://github.com/BerriAI/litellm/pull/33827)
- docs(litellm-rust): add provider coding standards by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33833](https://github.com/BerriAI/litellm/pull/33833)
- test(e2e): rename Gateway to ProxyClient and expose it as a session-scoped pytest fixture by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33750](https://github.com/BerriAI/litellm/pull/33750)
- feat(messages): route Azure Anthropic /messages through Rust behind rust:true by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33616](https://github.com/BerriAI/litellm/pull/33616)
- test(e2e): add Locust throughput load test that runs last by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33748](https://github.com/BerriAI/litellm/pull/33748)
- fix(proxy): resolve team wildcard credentials for vector store files by [@&#8203;shivamrawat1](https://github.com/shivamrawat1) in [#&#8203;33649](https://github.com/BerriAI/litellm/pull/33649)
- refactor(e2e): fold claude\_code HTTP probes onto shared ProxyClient methods by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33760](https://github.com/BerriAI/litellm/pull/33760)
- test(e2e): harden stage flakes for batches, UI, and MCP by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33831](https://github.com/BerriAI/litellm/pull/33831)
- fix(e2e): migrate load suite from e2e\_gateway to ProxyClient by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;33839](https://github.com/BerriAI/litellm/pull/33839)
- chore(e2e): remove tests/e2e/docker-compose.yml by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33837](https://github.com/BerriAI/litellm/pull/33837)
- test(e2e): cover /v1/responses openai basic nonstream and stream by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33830](https://github.com/BerriAI/litellm/pull/33830)
- test(e2e): cover /v1/responses openai cost\_logged and tool\_use by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33835](https://github.com/BerriAI/litellm/pull/33835)
- test(e2e): cover /v1/responses OpenAI vision and Anthropic basic by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33838](https://github.com/BerriAI/litellm/pull/33838)
- test(e2e): spendlog cost for streaming /v1/messages via responses bridge by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;33753](https://github.com/BerriAI/litellm/pull/33753)
- fix(docker): bake prisma CLI and engines at a fixed path so fresh-DB migrations work for any uid offline by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33853](https://github.com/BerriAI/litellm/pull/33853)
- feat(chat-ui): add personal Logs view scoped to the current user by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33829](https://github.com/BerriAI/litellm/pull/33829)
- chore: bump litellm-proxy-extras 0.4.78 -> 0.4.79 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33855](https://github.com/BerriAI/litellm/pull/33855)
- docs(litellm-rust): require the official Rust Style Guide in agent rules by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33867](https://github.com/BerriAI/litellm/pull/33867)
- fix(router): treat malformed configured token limits as absent on /v1/models by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33864](https://github.com/BerriAI/litellm/pull/33864)
- chore: rebuild admin UI bundle for the rc release by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33857](https://github.com/BerriAI/litellm/pull/33857)
- docs(rust): add provider abstraction standards by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33865](https://github.com/BerriAI/litellm/pull/33865)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33868](https://github.com/BerriAI/litellm/pull/33868)
- chore(release): backport [#&#8203;33929](https://github.com/BerriAI/litellm/issues/33929) to rc/1.94.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34033](https://github.com/BerriAI/litellm/pull/34033)
- chore(release): backport [#&#8203;33810](https://github.com/BerriAI/litellm/issues/33810), [#&#8203;33733](https://github.com/BerriAI/litellm/issues/33733) to rc/1.94.0 and bump litellm-proxy-extras to 0.4.79.post1 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34215](https://github.com/BerriAI/litellm/pull/34215)
- chore(ui): rebuild Next.js bundle on rc/1.94.0 so the Cost Optimization page ships by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34216](https://github.com/BerriAI/litellm/pull/34216)
- chore(release): backport auth, CLI SSO and guardrail fixes to rc/1.94.0 and refresh flagged dependencies by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34640](https://github.com/BerriAI/litellm/pull/34640)
- chore(release): backport [#&#8203;33899](https://github.com/BerriAI/litellm/issues/33899), [#&#8203;33978](https://github.com/BerriAI/litellm/issues/33978), [#&#8203;34582](https://github.com/BerriAI/litellm/issues/34582), [#&#8203;34675](https://github.com/BerriAI/litellm/issues/34675) to rc/1.94.0 and bump litellm-proxy-extras to 0.4.79.post2 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34855](https://github.com/BerriAI/litellm/pull/34855)
- fix(ui): backport cache leakage card layout fix to rc/1.94.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34964](https://github.com/BerriAI/litellm/pull/34964)
- fix(ui): add missing cost-optimization page description on rc/1.94.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34967](https://github.com/BerriAI/litellm/pull/34967)
- feat(ui): mark Cost Optimization as beta in the left nav ([#&#8203;34984](https://github.com/BerriAI/litellm/issues/34984)) by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34987](https://github.com/BerriAI/litellm/pull/34987)
- chore: rebuild Admin UI bundle for v1.94.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34982](https://github.com/BerriAI/litellm/pull/34982)
- fix(cost-optimization): backport the savings chart axis fix and methodology popovers to rc/1.94.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34994](https://github.com/BerriAI/litellm/pull/34994)
- chore: rebuild Admin UI bundle for rc/1.94.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;34995](https://github.com/BerriAI/litellm/pull/34995)

**Full Changelog**: <https://github.com/BerriAI/litellm/compare/v1.93.0...v1.94.0>

### [`v1.94.0`](https://github.com/BerriAI/litellm/releases/tag/v1.94.0)

##### Verify Docker Image Signature

All LiteLLM Docker images are signed with [cosign](https://docs.sigstore.dev/cosign/overview/). Every release is signed with the same key introduced in [commit `0112e53`](https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0).

**Verify using the pinned commit hash (recommended):**

A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
  ghcr.io/berriai/litellm:v1.94.0
```

**Verify using the release tag (convenience):**

Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/v1.94.0/cosign.pub \
  ghcr.io/berriai/litellm:v1.94.0
```

Expected output:

```
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
```

***

##### What's Changed

- feat(ui): working Test Connection for the complexity auto router by [@&#8203;akapur99](https://github.com/akapur99) in [#&#8203;32950](https://github.com/BerriAI/litellm/pull/32950)
- fix(xecguard): use StandardLoggingGuardrailInformation in logging hook by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;32911](https://github.com/BerriAI/litellm/pull/32911)
- feat(ui): adopt openapi-react-query ($api) and convert useCustomers by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32949](https://github.com/BerriAI/litellm/pull/32949)
- refactor(ui): colocate the mcp-servers view, keeping the shared mcp\_tools surface by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32968](https://github.com/BerriAI/litellm/pull/32968)
- refactor(ui): convert endpoint usage charts to shadcn/recharts by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32723](https://github.com/BerriAI/litellm/pull/32723)
- fix(proxy-auth): stop unrecognized model namespaces slipping through provider wildcard keys by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32979](https://github.com/BerriAI/litellm/pull/32979)
- feat(router): random-pick multi-model complexity tiers by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32967](https://github.com/BerriAI/litellm/pull/32967)
- fix(xecguard): sanitize scan result before recording it for logging by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;32935](https://github.com/BerriAI/litellm/pull/32935)
- fix(auto\_router): filter embedding models in complexity tab dropdowns, require all tiers, inline validation by [@&#8203;akapur99](https://github.com/akapur99) in [#&#8203;32978](https://github.com/BerriAI/litellm/pull/32978)
- fix(anthropic): translate raw adaptive thinking for pre-4.6 models on chat completions and Bedrock Converse by [@&#8203;akapur99](https://github.com/akapur99) in [#&#8203;32944](https://github.com/BerriAI/litellm/pull/32944)
- feat(router): add Router(plugins=\[...]) routing-plugin pipeline by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32972](https://github.com/BerriAI/litellm/pull/32972)
- feat(router): soft-floor adaptive mode for complexity router by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32947](https://github.com/BerriAI/litellm/pull/32947)
- docs(github): add QA runbook section to the PR template by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32965](https://github.com/BerriAI/litellm/pull/32965)
- fix(model\_cost): add supports\_reasoning: false to Gemini image generation models by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32836](https://github.com/BerriAI/litellm/pull/32836)
- build(dev-env): add make bootstrap and unprovisioned-checkout preflight to pre-commit by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32981](https://github.com/BerriAI/litellm/pull/32981)
- ci(ui): report only error-level knip findings in CI by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;32971](https://github.com/BerriAI/litellm/pull/32971)
- feat(batches): track cost for unmanaged Bedrock batches, generalize the flag by [@&#8203;Sameerlite](https://github.com/Sameerlite) in [#&#8203;32315](https://github.com/BerriAI/litellm/pull/32315)
- fix(guardrails): walk custom\_tool\_call\_output items in \_content\_utils by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;32969](https://github.com/BerriAI/litellm/pull/32969)
- fix: show and allow editing team model aliases after team creation by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33047](https://github.com/BerriAI/litellm/pull/33047)
- chore(deps): bump pillow to 12.3.0 to resolve osv-scan CVEs by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33093](https://github.com/BerriAI/litellm/pull/33093)
- feat(mcp): mint gateway-bound envelope at the token endpoint for dcr\_bridge oauth\_delegate by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32828](https://github.com/BerriAI/litellm/pull/32828)
- fix(mcp): surface rejected delegate-auth upstream tokens as connect-time 401 by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32741](https://github.com/BerriAI/litellm/pull/32741)
- fix(proxy): track unauthenticated pass-through requests in spend logs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;32410](https://github.com/BerriAI/litellm/pull/32410)
- feat(lasso): send source.type for Used By attribution by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33090](https://github.com/BerriAI/litellm/pull/33090)
- fix(responses): continue MCP gateway tool turns from the final response and surface failures by [@&#8203;thibault-linktree](https://github.com/thibault-linktree) in [#&#8203;33025](https://github.com/BerriAI/litellm/pull/33025)
- fix(responses): continue MCP gateway tool turns from the final response and surface failures by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33099](https://github.com/BerriAI/litellm/pull/33099)
- fix(completion): forward aws credential kwargs into litellm\_params so the responses bridge keeps WIF auth by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;32956](https://github.com/BerriAI/litellm/pull/32956)
- fix(ui): respect litellm\_key\_header\_name in BYOK credential save and workflow runs fetches by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33103](https://github.com/BerriAI/litellm/pull/33103)
- refactor(ui): standardize debounce waits behind shared DEBOUNCE\_WAIT\_MS constant by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33040](https://github.com/BerriAI/litellm/pull/33040)
- feat(ui): rebuild the Virtual Keys table on the shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;32991](https://github.com/BerriAI/litellm/pull/32991)
- fix: redact async complete streaming response for custom callbacks by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33106](https://github.com/BerriAI/litellm/pull/33106)
- build(ui): bump [@&#8203;tanstack/react-pacer](https://github.com/tanstack/react-pacer) from 0.2.0 to 0.22.1 by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33041](https://github.com/BerriAI/litellm/pull/33041)
- fix(ui): address Virtual Keys redesign review nits by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33112](https://github.com/BerriAI/litellm/pull/33112)
- fix(openai/responses): clamp max\_output\_tokens below API minimum by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;33098](https://github.com/BerriAI/litellm/pull/33098)
- fix(prometheus): read v3 rate limiter remaining values for per-key model gauges by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;33119](https://github.com/BerriAI/litellm/pull/33119)
- fix(ui): drop w-full from page-content wrappers to remove 32px horizontal overflow by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33118](https://github.com/BerriAI/litellm/pull/33118)
- refactor(ui): migrate straightforward value debounces to react-pacer by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33042](https://github.com/BerriAI/litellm/pull/33042)
- feat(mcp): interactive SSO sign-in for dcr\_bridge oauth\_delegate DCR clients by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32946](https://github.com/BerriAI/litellm/pull/32946)
- test(proxy): add regression tests for management\_endpoints edge cases by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;32976](https://github.com/BerriAI/litellm/pull/32976)
- fix(auto-router): correct Responses API tool\_choice shape and propagate alias litellm\_params by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;32974](https://github.com/BerriAI/litellm/pull/32974)
- fix(ui): render the sidebar scrollbar with shadcn ScrollArea by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33124](https://github.com/BerriAI/litellm/pull/33124)
- refactor(ui): migrate callback debounce sites to react-pacer with regression tests by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;33043](https://github.com/BerriAI/litellm/pull/33043)
- chore: add CODEOWNERS for ui and proxy UI build artifacts by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33131](https://github.com/BerriAI/litellm/pull/33131)
- feat(mcp): client-held refresh envelope for the dcr\_bridge oauth\_delegate flow by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;32980](https://github.com/BerriAI/litellm/pull/32980)
- feat(ui): rebuild the Teams table on the shared DataTable by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;33128](https://github.com/BerriAI/litellm/pull/33128)
- fix(mcp): relay upstream OAuth token and DCR rejections instead of a generic 500 by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;33113](https://github.com/BerriAI/litellm/pull/33113)
- fix(keys): persist key\_type so the UI shows correct key scope instead of "All Proxy…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants