Commit graph

54067 commits

Author SHA1 Message Date
devin-ai-integration[bot]
a1cdc2dd04 fix(ui): label the Decisions yes / no answer type instead of noul (#45931)
* fix(ui): label the Decisions yes / no answer type instead of noul

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

* refactor(ui): drop the unused NOUL_HELP constant

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

* fix(ui): say yes / no in the Decisions form validation message

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

---------

Co-authored-by: mateo <mateo@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
(cherry picked from commit 5f0e51f482)
2026-10-11 07:02:27 +00:00
yuneng-jiang
5a53186bdb
Merge pull request #45930 from BerriAI/litellm_ui_bundle_rc_1_106_0
chore: rebuild Admin UI bundle for rc/1.106.0
2026-10-10 23:45:00 -07:00
Yuneng Jiang
fc86b8b054
chore: update Next.js build artifacts (2026-10-11 06:41 UTC, node v24.19.0) 2026-10-10 23:41:31 -07:00
Mateo Wang
390da4174e
Merge pull request #45929 from BerriAI/litellm_backport_playground_restyle_rc_1_106_0
feat(ui): backport the OpenRouter-style Decisions playground restyle to rc/1.106.0
2026-10-10 23:14:08 -07:00
devin-ai-integration[bot]
a339902031 feat(ui): restyle Decisions playground after OpenRouter's model playground (#45903)
* feat(ui): restyle Decisions playground after OpenRouter's model playground

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

* feat(ui): replace the Decisions JSON editor with a read-only cURL tab

The form is the only way to edit the request. The cURL tab shows the exact curl to the proxy with a $LITELLM_API_KEY placeholder and a copy button, so nothing can be typed into a broken payload

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

* fix(ui): shell-quote the proxy URL in the Decisions cURL preview

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

* fix(ui): send the Decisions cURL under the configured auth header and preview the validated payload

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

* test(ui): name the cURL builder inputs to stay inside the lint budget

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

* fix(ui): keep the Decisions cURL key placeholder shell-expandable

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

* fix(ui): match the Decisions cURL URL to the send path and block copying an invalid payload

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

* refactor(ui): share the Decisions error count helper and cover the cURL preview

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

---------

Co-authored-by: mateo <mateo@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
(cherry picked from commit 246c0e126b)
2026-10-11 06:05:13 +00:00
Mateo Wang
c7a3fee491
Merge pull request #45922 from BerriAI/litellm_whats_new_local_default_rc_1_106_0
fix(home): serve the bundled whats_new.json by default on rc/1.106.0
2026-10-10 23:03:42 -07:00
mateo
4bfec53865 test(home): pin whats_new_url to the env var and regenerate the dashboard API types
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-11 05:57:04 +00:00
mateo
d1ae7ea085 style: annotate whats_new_url with str | None
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-11 05:44:03 +00:00
mateo
4dd96800e8 fix(home): serve the bundled whats_new.json by default so a release shows only its own launches
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-11 05:43:27 +00:00
joshua-berri
69738f56db
feat(ui): backport decision auto-router setup to 1.106 (#45916)
* feat(auto-router): backport decision model creation flow to rc 1.106

* fix(ui): preserve deployed decision model editing

* test(ui): use supported decision picker query options

* fix(ui): align decision router backport with release prerequisites

* style(ui): format decision model selection regression

* test(router): verify deployed classifier cost and provider accounting

---------

Co-authored-by: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com>
2026-10-10 22:35:10 -07:00
Mateo Wang
d5a344411f
Merge pull request #45911 from BerriAI/litellm_backport_home_page_rc_1_106_0
feat(ui): backport the Home page dashboard root to rc/1.106.0
2026-10-10 22:24:50 -07:00
Mateo Wang
7b406378bd
Merge pull request #45891 from BerriAI/litellm_backport_decisions_ui_rc_1_106_0
feat(decisions): backport the rest of the decisions and System One launch to rc/1.106.0
2026-10-10 22:15:21 -07:00
mateo
d5b0ad087c test(unit): drop the GLOBAL_LOGGING_WORKER import duplicated by the conftest pick
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-11 04:26:28 +00:00
mateo
cd141c6d36 test(unit): flush queued logging tasks after each test so systemone callback checks stay isolated
Ports the pytest_runtest_call hook from tests/unit/conftest.py on main (#44146). Without it the asystemone call type test picks up adecisions callbacks queued by earlier tests in the same worker

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
(cherry picked from commit 23fec69be2)
2026-10-11 04:15:19 +00:00
devin-ai-integration[bot]
025f451a9a feat(ui): load Home page What's new launches from /public/whats_new at runtime (#45912)
* feat(ui): load the Home page What's new launches from /public/whats_new at runtime

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

* feat(ui): show the three newest What's new launches

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

* build: ship whats_new.json in the wheel

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

---------

Co-authored-by: kerry <kerry@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
(cherry picked from commit 55c89977d7)
2026-10-11 04:10:00 +00:00
devin-ai-integration[bot]
b0f9d9f785 feat(ui): add a Home page as the dashboard root with usage summary, recent launches, blog updates and a model leaderboard (#45858)
* feat(ui): add a Home page as the dashboard root with usage summary, recent launches, blog updates and a model leaderboard

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

* fix(ui): fall back to spend-log request counts on Home when the gateway has recorded none

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

* test(ui): cover the Home page totals, launches, leaderboard and updates feed

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

* feat(ui): render Home Updates as rows and return up to 6 blog posts from /public/litellm_blog_posts

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

* feat(ui): filter Home Updates by the new-model and api-change blog tags

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

* fix(blog): import NotRequired from typing_extensions for py3.10 and test the endpoint passes every fetched post through

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

* revert(ui): drop the Updates filter chips, keep Updates as a plain row list

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

* chore(ui): restore generated schema.d.ts to main

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

* feat(ui): label the Home key button Create New Virtual Key

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

* chore(ui): drop the What's new sublabel on Home

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

* fix(ui): show an error with retry when Home usage fails to load and move the Home test to the integration tier

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

---------

Co-authored-by: kerry <kerry@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
(cherry picked from commit 9e2aae8490)
2026-10-11 02:12:08 +00:00
joshua-berri
1d18cc43e3
fix(mcp): backport request-local guardrail bearers to RC 106 (#45901)
Some checks are pending
LiteLLM Rust / rust-lint (push) Waiting to run
LiteLLM Rust / rust-test (push) Waiting to run
LiteLLM Rust / rust-wheel (push) Waiting to run
* fix(mcp): preserve caller bearer for guardrail evaluation (#45746)

Co-authored-by: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com>
(cherry picked from commit f57906c124)

* fix(mcp): exclude gateway credentials from guardrail bearers

(cherry picked from commit 77444a7e3b)

* fix(mcp): type legacy JWT claims for RC checks

---------

Co-authored-by: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com>
2026-10-10 18:02:53 -07:00
yuneng-jiang
96b182ff42
fix(credentials): backport credential edit fixes to rc/1.106.0 (#45890)
Backport #45835 from b2cc5f25f6

Keep RC provider support while adapting credential form callbacks and regression tests
2026-10-10 16:39:52 -07:00
mateo-berri
acf7455911 chore(ui): regenerate dashboard API types for the decisions backport
The picks above each touched schema.d.ts on main against a different OpenAPI surface, so the file is regenerated on this line with npm run gen:api instead of hand-merged.
2026-10-10 16:38:05 -07:00
devin-ai-integration[bot]
bc924c850c feat(sdk): add litellm.systemone and trim litellm.decisions to the OpenAI shape (#45846)
Backport of #45846 to rc/1.106.0.
Cherry-picked from 25d9b05386 (main).
2026-10-10 16:32:22 -07:00
devin-ai-integration[bot]
0258ae608b test(decisions): bill the OpenAI-format openrouter case from provider-reported cost (#45853)
Backport of #45853 to rc/1.106.0.
Cherry-picked from 5894968c5d (main).
2026-10-10 16:30:26 -07:00
devin-ai-integration[bot]
153a0fb09b feat(ui): label the System One yes / no question type noul and explain it on hover (#45841)
Backport of #45841 to rc/1.106.0.
Cherry-picked from 988cc7dc94 (main).
2026-10-10 16:30:25 -07:00
devin-ai-integration[bot]
ad4d9b1a92 feat(ui): replace Reset example with an Example preset dropdown and a Clear button on the Decisions tab (#45848)
Backport of #45848 to rc/1.106.0.
Cherry-picked from dc77381956 (main).
2026-10-10 16:30:25 -07:00
devin-ai-integration[bot]
7318f83976 docs(proxy): describe /v1/decisions and /v1/systemone in Swagger UI (#45838)
Backport of #45838 to rc/1.106.0.
Cherry-picked from bc2cc42340 (main).
2026-10-10 16:30:24 -07:00
devin-ai-integration[bot]
9dad3bde78 fix(ui): expose both decisions playground endpoints (#45817)
Backport of #45817 to rc/1.106.0.
Cherry-picked from 33b9d846b0 (main).
2026-10-10 16:29:34 -07:00
devin-ai-integration[bot]
3534962e17 fix(ui): drop the decision models sublabel from the Add Model provider dropdown (#45755)
Backport of #45755 to rc/1.106.0.
Cherry-picked from 38d0333fcc (main).
2026-10-10 16:29:34 -07:00
devin-ai-integration[bot]
11fa16e3e9 feat(ui): link the decision models banner to the supported providers docs and rename the System One playground to Decisions (#45732)
Backport of #45732 to rc/1.106.0.
Cherry-picked from 2d896d57f2 (main).
2026-10-10 16:29:34 -07:00
devin-ai-integration[bot]
8dcac8ab23 feat(ui): rename the Playground System One tab to Decisions and give the JSON editor VS Code light and dark themes (#45729)
Backport of #45729 to rc/1.106.0.
Cherry-picked from 512692dd36 (main).
2026-10-10 16:29:33 -07:00
devin-ai-integration[bot]
a978acffb3 feat(strands_decider): call a Strands Decider on an AgentCore runtime ARN (#45678)
Backport of #45678 to rc/1.106.0.
Cherry-picked from ed9c31cfa8 (main).
2026-10-10 16:29:33 -07:00
devin-ai-integration[bot]
3880fc285b fix(decisions)!: refuse safety_identifier on providers that cannot take it unless drop_params drops it (#44955)
Backport of #44955 to rc/1.106.0.
Cherry-picked from 546402c98c (main).
2026-10-10 16:29:32 -07:00
Mateo Wang
3c42f96a9d feat(decisions): add Databricks ai_decide as a /v1/decisions provider and auto-router decider (#45200)
Backport of #45200 to rc/1.106.0.
Cherry-picked from 883e3210ee (main).
2026-10-10 16:29:32 -07:00
devin-ai-integration[bot]
ddd4ee61c3 test(decisions): add hosted_vllm /v1/decisions and provider-400 translation cases (#45661)
Backport of #45661 to rc/1.106.0.
Cherry-picked from 097d018dbf (main).
2026-10-10 16:29:18 -07:00
devin-ai-integration[bot]
30ed6e1dd6 fix(openrouter): bill responses, decisions and pass-through from usage.cost and always allow reasoning params (#45640)
Backport of #45640 to rc/1.106.0.
Cherry-picked from 465f20f274 (main).
2026-10-10 16:29:18 -07:00
devin-ai-integration[bot]
6c23c27bca feat(decisions): add hosted_vllm provider (#45501)
Backport of #45501 to rc/1.106.0.
Cherry-picked from 61e5f2dd3c (main).
2026-10-10 16:29:01 -07:00
yucheng-berri
1bdfb67892
feat(guardrails): backport the decision model guardrail to rc/1.106.0 (#45663) (#45888)
Applies the net diff of #45663 at be36290a7d onto rc/1.106.0. rc/1.106.0 predates
litellm/decisions/call.py, so supported_decisions_providers stays in
litellm/decisions/main.py as it was before the PR merged main at ff60d27b60.
schema.d.ts was regenerated on this branch.

Co-authored-by: yucheng-berri <293926326+yucheng-berri@users.noreply.github.com>
2026-10-10 16:26:25 -07:00
yuneng-jiang
055f812200
fix(ui): backport modal backdrop fix to rc/1.106.0 (#45877)
Backport #45866

(cherry picked from commit 6fe46522d3)
2026-10-10 15:39:20 -07:00
yucheng-berri
879d4fb50a
feat(guardrails): split logging_only_scope direction from input-failure policy (#45709) (#45782)
* feat(guardrails): split logging_only_scope direction from input-failure policy

logging_only_scope is now direction-only (input, output, unset for both
directions). The new logging_only_continue_on_input_failure flag controls
whether a flagged or raising logging_only input scan still lets the
response be scanned. "both" stays accepted everywhere as a deprecated
alias for unset scope plus the flag set to true, normalized at callback
init while stored rows keep the written value.



* fix(dashboard): narrow continue-on-input-failure update type and stay under guardrail_info max-lines



* fix(dashboard): keep custom-code guardrail controls readable with logging_only



* fix(dashboard): scope continue-on-input-failure to the default direction and restore verdict assertion



* refactor(guardrails): remove the both value from logging_only_scope

logging_only_scope only shipped its both value in dev prereleases, so it is
dropped instead of kept as a deprecated alias. Leaving the scope unset and
setting logging_only_continue_on_input_failure gives the same behavior. A
stored both value is now treated like any other invalid scope: it is logged
and ignored on load, and rejected with 422 on create or update.

* fix(guardrails): tolerate an invalid logging_only_scope in the v1 guardrail list

A config.yaml guardrail whose logging_only_scope is no longer valid, such as
the removed both value, made GET /guardrails/list return 500 for every
guardrail. The v1 list now parses params with the same tolerant parser as
the v2 list, info and PATCH paths, so the bad value is logged and dropped.

* test(guardrails): drive continue-flag rejection tests through the real guardrail handler

---------



(cherry picked from commit 7ff5010674)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: yucheng-berri <293926326+yucheng-berri@users.noreply.github.com>
2026-10-10 09:18:14 -07:00
Mateo Wang
3dc1ed298f
feat(ui): backport the System One request form to rc/1.106.0 (#45721) (#45739)
* feat(azure): add azure_ai/Microsoft-Decision-1 (#45639)

Backport of #45639 to rc/1.106.0.
Cherry-picked from de6a0717b7 (main).

* feat(azure_ai): support Microsoft-Decision-1 on the decisions API (#45673)

Backport of #45673 to rc/1.106.0.
Cherry-picked from 2fcc780498 (main).

* feat(ui): let admins find, call, and test decision models from the Admin UI (#45654)

Backport of #45654 to rc/1.106.0.
Cherry-picked from e2276ac2b9 (main).

* feat(ui): build System One playground requests with a form (#45721)

Backport of #45721 to rc/1.106.0.
Cherry-picked from 62aee8bee9 (main).

* fix(model_prices): drop unverified output price for azure_ai/Microsoft-Decision-1 (#45717)

Backport of #45717 to rc/1.106.0.
Cherry-picked from 674208bb7d (main).

Co-authored-by: kerry <kerry@berri.ai>

---------

Co-authored-by: berriai-litellm-provider-info-sync[bot] <328147090+berriai-litellm-provider-info-sync[bot]@users.noreply.github.com>
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: moyai-devin-berriai[bot] <336287033+moyai-devin-berriai[bot]@users.noreply.github.com>
Co-authored-by: kerry <kerry@berri.ai>
2026-10-09 22:59:34 -07:00
Mateo Wang
98f717afce
feat(decisions): backport Microsoft-Decision-1 and the decision models Admin UI to rc/1.106.0 (#45639, #45673, #45654, #45717) (#45735)
* feat(azure): add azure_ai/Microsoft-Decision-1 (#45639)

Backport of #45639 to rc/1.106.0.
Cherry-picked from de6a0717b7 (main).

* feat(azure_ai): support Microsoft-Decision-1 on the decisions API (#45673)

Backport of #45673 to rc/1.106.0.
Cherry-picked from 2fcc780498 (main).

* feat(ui): let admins find, call, and test decision models from the Admin UI (#45654)

Backport of #45654 to rc/1.106.0.
Cherry-picked from e2276ac2b9 (main).

* fix(model_prices): drop unverified output price for azure_ai/Microsoft-Decision-1 (#45717)

Backport of #45717 to rc/1.106.0.
Cherry-picked from 674208bb7d (main).

Co-authored-by: kerry <kerry@berri.ai>

---------

Co-authored-by: berriai-litellm-provider-info-sync[bot] <328147090+berriai-litellm-provider-info-sync[bot]@users.noreply.github.com>
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: moyai-devin-berriai[bot] <336287033+moyai-devin-berriai[bot]@users.noreply.github.com>
Co-authored-by: kerry <kerry@berri.ai>
2026-10-09 22:34:01 -07:00
yuneng-jiang
bbcc985d4a
ci: run every build_and_test job in every CircleCI pipeline (#43152) (#45651)
Drop the main-only branch filter from the 26 build_and_test jobs, so a run-ci PR pipeline into any base, an rc branch pipeline and the scheduled pipeline all run the full suite. The migration cron stays on main

(cherry picked from commit dafa9cbd4c)

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-09 12:39:08 -07:00
joshua-berri
a4fd58501a
fix(mcp): never forward the caller's LiteLLM key to MCP servers (#45401)
* fix(mcp): never forward the caller's LiteLLM key to MCP servers

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

* refactor(mcp): tidy caller-key scrub

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

* test(mcp): avoid master-key scanner false positive

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

* fix(mcp): match admission when scrubbing the caller key

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

* refactor(mcp): drop header copy churn

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

* fix(mcp): normalize bearer variants in caller-key match

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

* fix(mcp): inject admission header name and cover provider keys

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

* test(mcp): exercise real REST header extraction

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

* test(mcp): cover caller-key scrub on the real REST path

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

* fix(mcp): exclude gateway admission header from upstream forwarding

* fix(mcp): skip empty admission headers when scrubbing keys

* fix(mcp): use scrubbed server credentials for auth probes

* fix(mcp): match probe credential precedence to upstream calls

* test(mcp): simplify probe header assertion

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com>
2026-10-09 03:21:07 -07:00
Mateo Wang
a3236ba947
feat(ui): configure OpenAI workload identity federation from the LLM Credentials and Add Model forms (#45528)
* feat(ui): configure OpenAI workload identity federation from the LLM Credentials and Add Model forms

* fix(ui): let a federated OpenAI credential omit the service account when the proxy env provides it

* fix(ui): clear the federation API Base error when the admin switches the credential to an API key
2026-10-09 00:30:44 -07:00
devin-ai-integration[bot]
cdba36a1f0
chore: bump litellm-enterprise 0.1.75 -> 0.1.76, litellm-proxy-extras 0.4.107 -> 0.4.108 (#45534)
Co-authored-by: yuneng <yuneng@berri.ai>
2026-10-09 07:29:44 +00:00
devin-ai-integration[bot]
ee47da334d
test(proxy): inject the clock into the v1 parallel request limiter and pin it in its tests (#45522)
Co-authored-by: yuneng <yuneng@berri.ai>
2026-10-09 00:16:03 -07:00
devin-ai-integration[bot]
488594e03f
refactor(proxy): inject one UTC clock read per operation into gateway tracking, PTU rollup and Mavvrik export (#45520)
* fix(proxy): read the UTC clock once per operation in gateway tracking, PTU rollup and Mavvrik export

* refactor(proxy): default the injected clocks to get_utc_datetime instead of three private copies

---------

Co-authored-by: yuneng <yuneng@berri.ai>
2026-10-09 00:15:38 -07:00
yuneng-jiang
a7ff709f3d
fix(ui): let the model picker remove selections that are no longer available (#43944)
* fix(ui): let ModelSelect deselect selections that are no longer offered

A selected model that is no longer served (removed from config, deleted,
or outside the org ceiling) never appeared in the dropdown, so once it sat
past the fifth chip nothing could remove it. List such selections in an
Unavailable group ahead of the offered options so they can be found and
unchecked.

* fix(ui): skip the Unavailable group when no live models were loaded

A failed or empty model list made every selection look unavailable. Only
flag selections as unavailable when there is a live model list to compare
against, and cover ordering with several unavailable selections.

* fix(ui): only suppress the Unavailable group when the model list failed to load

Keying the guard on the context-filtered list hid the group when an
organization ceiling excluded every selection, which brought the dead end
back for team forms. Key it on the proxy model list having loaded.

* fix(ui): keep other selections when removing one beside a special option

Removing an unavailable model while a special option stayed selected
collapsed the whole selection to the special option, dropping the other
saved values. Collapse only when a special option is newly picked. Also
skip the Unavailable group while an org team's model ceiling is unknown,
since the offered list is empty for that reason alone.
2026-10-09 00:00:26 -07:00
devin-ai-integration[bot]
0d17f954c0
feat(credentials): add display_name and make credential_name immutable on PATCH (#43148)
* feat(credentials): add credential_alias and make credential_name immutable on PATCH

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

* test(ui): query credential rows by role to stay under the no-node-access budget

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

* test(proxy): expect credential_alias in load_credential_list dump

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

* test(ui): drive the credential SearchSelect by placeholder and option roles

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

* fix(proxy): pass the decrypted CredentialItem to update_db_credential during master key rotation

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

* fix(ui): trim credential_alias in CredentialModal so whitespace-only input clears the alias

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

* feat(credentials): replace credential_alias with display_name and reject edits to config credentials

credential_name stays the immutable reference key. display_name is a nullable, trimmed, max 255
character label set on POST or PATCH (omit keeps it, null clears it, blank is a 400). Reads return
display_name plus an in-memory source tag (db or config), and PATCH or DELETE on a config-defined
credential answers 400 instead of a misleading 404

* feat(ui): show credential display names everywhere and lock config credentials

The credentials table shows the display name with the credential name beneath it, badges config
credentials and disables their edit and delete actions. The edit modal adds an editable display
name next to the read-only credential name and only sends it when it changed. Every credential
picker and reference (add model, model info, models table, vector store form and info) shows the
label while still submitting credential_name

* feat(cli): set display names on credentials and show them in the list

* refactor(credentials): keep the new credential types inside the lint gate budgets

* refactor(cli): print credential command JSON through one helper

* fix(credentials): treat an empty credential_name on PATCH as omitted and pin the 404 for vanished rows

A blank credential_name never renamed anything, so PATCH accepts it again instead of answering 400. New tests pin a trimmed display_name on PATCH, the repository carrying display_name, and a 404 (not the config-owned 400) for a DB credential another worker already deleted. The hydration helper no longer copies display_name, since none of its callers read it, and the CLI update passes display_name straight through because the exactly-one check already makes it None when clearing.

* fix(ui): keep a model's credential when its picker text is emptied and skip the admin-only list for other roles

Clearing the search text in the model edit form's credential picker used to submit null, silently detaching the model's credential on save. None is now the only way to clear it. The models table fetches /credentials only for proxy admins, since everyone else got a 403 on each page load and falls back to the raw name anyway. Also fixes a type error in the re-use credential dialog and adds tests for the display name surviving a provider switch, the 255 character limit, the request payload, and the vector store None choice.

* fix(client): percent-encode the credential name when updating its display name

A name with ? or # was cut short in the URL, so the PATCH landed on a different credential or 404'd.

* fix(credentials): answer 405 with Allow: GET for PATCH and DELETE on config credentials

A config-defined credential exists (GET returns it) but is read-only through the API, which is what 405 Method Not Allowed means. 400 described a malformed request, and 404 would claim the credential does not exist.

* fix(proxy): ignore a display_name set on config credential_list entries so non-string values cannot fail boot

---------

Co-authored-by: yuneng <yuneng@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-08 23:49:56 -07:00
devin-ai-integration[bot]
5c6ea040b0
test: update stale MCP call_tool and usage card assertions, add timeout headroom to request-log index boot test (#45523)
Co-authored-by: yuneng <yuneng@berri.ai>
2026-10-08 23:44:46 -07:00
devin-ai-integration[bot]
145d382089
ci: run only integration jobs on PR CircleCI pipelines and move router and guardrails suites to GHA (#45509)
Restrict 26 build_and_test jobs to main with job-level branch filters, delete litellm_router_unit_testing in favor of a router-unit-tests GHA shard, and narrow guardrails_testing to the license-dependent test while the rest of tests/guardrails_tests runs in a guardrails-tests GHA shard

Co-authored-by: yuneng <yuneng@berri.ai>
2026-10-08 22:58:55 -07:00
devin-ai-integration[bot]
d34ad35281
fix(anthropic): count a leading system run through count_tokens' system parameter (#45463)
* fix(anthropic): count a leading system run through count_tokens' system parameter

Anthropic's count_tokens rejects role "system" at the head of messages, so
/v1/responses/input_tokens with instructions, and /v1/messages/count_tokens
with a system-role message, fell back to the local tokenizer. The shared
Anthropic count_tokens transformation now lifts the leading run of system
messages into the top-level system parameter, the way the chat path sends
it, after any system the caller set. Anthropic direct, Azure AI Anthropic,
and Bedrock Mantle share that transformation.

* test(integration): cover the count_tokens leading-system lift across Anthropic, Azure AI and Bedrock Mantle

---------

Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com>
2026-10-08 22:34:25 -07:00