Commit graph

18613 commits

Author SHA1 Message Date
yuneng-jiang
4dbbe6eddd
test(ci): fix the e2e and integration reds left on rc/1.103.0 after #43382 and #43388 (#43391)
Some checks failed
LiteLLM Rust / rust-lint (push) Has been cancelled
LiteLLM Rust / rust-test (push) Has been cancelled
LiteLLM Rust / rust-wheel (push) Has been cancelled
The batch cleanup leftover warning used a class defined in a test-directory module. The xdist controller cannot import it, so an uncaught leftover warning crashed the whole e2e run. It is now a plain UserWarning.

The integration harness backport missed the workers option and Gateway.request headers that the OTel conversation id tests use.
2026-09-26 17:54:12 -07:00
yuneng-jiang
8aca86a571
test(e2e): clear the two rc/1.103.0 e2e reds owned by upstream providers (#43388)
Backports the batch cleanup half of #43321 so an Azure cancel still in progress after 120s leaves a warning instead of a teardown error, and points the MCP Tools UI test at DeepWiki's renamed ask_wiki_question tool.
2026-09-26 17:18:10 -07:00
yuneng-jiang
e640c0eb41
test(integration): make rc/1.103.0 integration groups collect and pass again (#43382)
Adds the OwnedProxy harness the #42486 backport's OTel test imports, registers the #43029 backport's spend flush test in contracts.json with its covers marker, and aligns the MCP tool failure assertion with main.
2026-09-26 17:00:41 -07:00
yuneng-jiang
10e77ce406
fix(caching): stand default cache points down when extra_body hides a direct client mark (#43342)
* fix(caching): stand default cache points down when extra_body hides a direct client mark

On native /v1/messages the extra_body envelope is dropped, so a client tool mark or root cache_control reaches Anthropic even when extra_body overrides it. The stand-down check only counted the envelope-merged view and injected two default marks on top of the client's.

(cherry picked from commit 01ef7c4725)

* fix(caching): keep chat completions on the envelope-merged mark count for the default stand-down

Chat completions merge extra_body over the request, so a direct tool mark that extra_body replaces never reaches the provider there. Only /v1/messages, where the native transforms drop the envelope, needs to count marks on both sides.

(cherry picked from commit a9c5fa760e)
2026-09-26 16:45:26 -07:00
yuneng-jiang
6076c0a058
fix(jwt,otel): backport session conversation id and JWT team header selection to rc/1.103.0 (#43343)
* feat(otel): emit gen_ai.conversation.id from the caller's session id on v2 LLM spans (#42486)

* feat(otel): emit gen_ai.conversation.id from the caller's session id on v2 LLM spans

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

* fix(otel): keep the caller's header session under missing_session_id: generate and read replayed payload session ids

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

* fix(otel): drop only the proxy-minted session id so a caller id on the other metadata key survives

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

* fix(otel): keep a replayed session id hidden when it only echoes the payload trace id

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

* fix(otel): keep a replayed session id even when the payload trace id fell back to it

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

* fix(otel): stop reading the replayed payload's session id, the generated marker does not survive replay

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

* test(integration): audit gen_ai.conversation.id on otel v2 spans through a real proxy, sink and postgres

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

* test(integration): keep otel conversation rigs alive for the whole session so shuffled shards do not reboot the proxy per test

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

* test(otel): stop the audit rig proxies from probing sibling test peers for model info

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

* test(otel): record accepted OTLP batches in the sink instead of mutating the collector

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

* test(otel): guard the accepted batch deque so snapshots cannot race sink appends

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

---------

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

* fix(jwt): accept a team alias in x-litellm-team-id (#42445)

* fix(jwt): accept a team alias in x-litellm-team-id

The header only matched canonical team ids, so a JWT caller selecting one of their teams by its alias got a 403 even though they belonged to it. The header value is now resolved through the existing alias lookup before the JWT allowed-team check and the DB membership fallback, while a value that is already a team id never costs an alias lookup and denials keep naming the value the caller sent

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

* fix(jwt): only alias a header team id the database provably lacks

Under fallback_to_db_teams a header value whose team row read fails for any reason other than TeamNotFoundError now keeps the membership denial instead of falling through to the alias lookup, so a degraded read cannot select a different team that carries the value as an alias. Drops the HeaderTeam docstring that only restated its fields

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 071cb49d32)

* fix(jwt): say x-litellm-team-id matched no team id or alias in the 403 (#42495)

* fix(jwt): say x-litellm-team-id matched no team id or alias in the 403

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

* fix(jwt): tell the caller when x-litellm-team-id names an alias shared by several teams

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

* fix(jwt): deny a shared x-litellm-team-id alias exactly like an unknown value

A distinct 403 for an alias several teams share was raised before the
allowed-teams check, so any JWT could probe which aliases exist. The
alias lookup now treats the duplicate as a miss, and both denials say
the value does not resolve to a team id or a unique team alias, which
is true for unknown, unauthorized and duplicate values alike

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 08639fcf42)

* fix(jwt): let x-litellm-team-id select DB membership teams when the token also carries a team claim (#43206)

* fix(jwt): let x-litellm-team-id select DB membership teams when the token also carries a team claim

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

* docs(jwt): describe header team selection under fallback_to_db_teams

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

---------

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

---------

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: mrinal <mrinal@berri.ai>
Co-authored-by: yucheng <yucheng@berri.ai>
Co-authored-by: ryan <ryan@berri.ai>
Co-authored-by: yassin <yassin@berri.ai>
2026-09-26 15:03:25 -07:00
yuneng-jiang
6397b3603d
fix: backport five regression fixes to rc/1.103.0 (#43331)
* fix: apply configured cache_control_injection_points beside client cache_control marks (#41956)

(cherry picked from commit d8267d507d)

* fix(token_counter): count replayed redacted_thinking blocks so prompt_caching keeps pinning (#42069)

(cherry picked from commit 0e7cf5113e)

* fix(mcp): return camelCase tool keys from /v1/mcp/tools after the SDK 2 upgrade (#42352)

(cherry picked from commit 5eb4e30f29)

* fix(rust_bridge): keep the Messages route on Python until the Rust path is ready (#42517)

rc/1.103.0 has no token counter or tokenizer routes in the catalog, so only the Messages rule moves to PYTHON_ONLY

(cherry picked from commit 85ed18e8f2)

* fix(proxy): stop leaking periodic tasks on every DB config reload (#42784)

(cherry picked from commit fc87a06f00)

---------

Co-authored-by: Mateo Wang <277851410+mateo-berri@users.noreply.github.com>
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-26 11:47:22 -07:00
yuneng-jiang
4d08789101
fix(proxy): pass team member spend rows as jsonb so a $0 flush cannot poison the pool connection (#43029) (#43323)
Prisma types a raw array parameter from the first batch a connection sees. After a flush in
which every member cost was a whole number (a free model), the connection's cached statement
expected int8[] and every later fractional batch on it failed with "improper binary format in
array element", so member spend silently stopped landing while team spend kept rising.

The rows now travel as one JSON document unpacked by jsonb_to_recordset with the column types
declared in SQL, so Postgres types the numbers and the batch shape no longer matters.

(cherry picked from commit 5e4b1b9df0)

Co-authored-by: ryan-crabbe-berri <ryan@berri.ai>
2026-09-26 11:15:05 -07:00
yuneng-jiang
a78a439c68
revert(usage): remove the top-N aggregated key cap and daily global spend rollup code from rc/1.103.0 (#43326)
Reverts the code from #41324 (merge 87694c26ef) and #41293 (merge 2e46b10320).
The LiteLLM_DailyGlobalSpend model and migration stay so databases that applied
rc.1 keep a consistent table and rollup marker when the feature returns.
2026-09-26 11:14:53 -07:00
devin-ai-integration[bot]
4a00468f38 fix(bedrock): stream /v1/messages Invoke bytes through instead of holding them in a 1024-byte chunker (#42607)
* fix(bedrock): stream /v1/messages Invoke bytes through instead of holding them in a 1024-byte chunker

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

* style(bedrock): apply ruff format to invoke messages stream passthrough

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

* style(bedrock): drop drive-by reformat of existing invoke messages tests

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

* test(bedrock): collect streamed chunks into a tuple in passthrough regression test

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

* test(bedrock): give the passthrough regression test a 10s first-chunk budget

* test(bedrock): type the eventstream frame helper's payload as Mapping[str, object]

* test(bedrock): take the gated byte stream's chunks as an immutable Sequence

---------

Co-authored-by: mateo <mateo@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com>
(cherry picked from commit 975bd28549)
2026-09-22 20:03:14 -07:00
Yuneng Jiang
379d256eb9
test(batches): skip the Bedrock GovCloud batch e2e until its secrets are provisioned
The test resolves four AWS_GOVCLOUD_* values through os.environ/ references on
the deployment, and none of them is injected into the e2e stack, so the upload
returns 500 "S3 bucket_name is required" and the test fails on configuration
rather than on the GovCloud partition behavior it guards.

The runner podSpec mounts 29 individual secretKeyRef entries from
litellm-provider-keys with no envFrom, and the string "govcloud" appears
nowhere in project-releaser, so nothing supplies these values today. The
commercial-partition Bedrock batch tests resolve their own os.environ/ bucket
and pass, which rules out the reference syntax and leaves the absent secrets as
the only cause.

Skipped rather than weakened, matching the LIT-5027 and LIT-4820 markers in
this file: the assertions stay as the correct contract and the marker names the
condition for removing it.

Reports 1 skipped instead of 1 failed.
2026-09-19 19:55:07 -07:00
yuneng-jiang
cc449198c7
Merge pull request #42076 from BerriAI/litellm_rc_1_103_0_gcs_autorouter_golden
test(logging): add autorouter estimate keys to the GCS pub/sub spend-log golden
2026-09-19 19:26:01 -07:00
Yuneng Jiang
dcd6e0def7
test(logging): add autorouter estimate keys to the GCS pub/sub spend-log golden
The spend-log payload now carries metadata.autorouter_savings_estimate and
metadata.autorouter_baseline_observation, but the golden this suite compares
against does not list them, so the exact-match check reports them as extra
keys and logging_testing goes red on the release candidate.

This backports the golden verbatim from main, where the same change landed in
09e14a485c after rc/1.103.0 was cut.

tests/logging_callback_tests/test_gcs_pub_sub.py::test_async_gcs_pub_sub_v1:
1 failed before, 1 passed after.
2026-09-19 19:25:17 -07:00
Yuneng Jiang
9f79a59a41
test(mcp): migrate the mcp test helpers to the mcp 2.x MCPServer API
pyproject pins mcp>=2.2.0,<3, where FastMCP was renamed to MCPServer and
stateless_http, json_response, transport_security, host and port moved off
the constructor onto streamable_http_app() and run(). The two helpers still
imported mcp.server.fastmcp, so every module reaching them died at collection
and integration-extensions went red on the release candidate.

This ports the helpers verbatim from main, where the same migration already
landed in 479360ae87 after rc/1.103.0 was cut. Only the two helper files are
taken; the rest of that commit restores unrelated test surface.

Collection on the four affected modules: 4 errors and 0 tests before, 0
errors and 6 tests after.
2026-09-19 19:09:46 -07:00
yucheng-berri
82ddab2405
Merge pull request #41840 from BerriAI/litellm_team_audit_lifecycle
fix(team): emit audit events for member_delete and role changes and carry the final roster on team create
2026-09-19 17:37:16 -07:00
yuneng-jiang
1f28813c4d
Merge pull request #42053 from BerriAI/litellm_nova_sonic_v2_e2e_model
test(e2e): point the Nova Sonic realtime test at nova-2-sonic
2026-09-19 17:31:07 -07:00
yucheng-berri
2ec5c2c7cd
Merge pull request #41740 from BerriAI/litellm_otel_v2_langfuse_llm_spans_only
feat(otel v2): opt-in llm_only span scope for Langfuse destinations and the operator Langfuse exporter
2026-09-19 17:24:50 -07:00
Yuneng Jiang
9f84382a24
test(e2e): cite the source and date for the pinned Nova Sonic model id
AGENTS.md allows a vendor-owned literal only when its source and date are cited
next to it. A live realtime test cannot avoid naming a model, so record how the
id was checked, and record that a retired id fails as a hang rather than an
error so the next reader does not start by suspecting litellm.
2026-09-19 17:20:00 -07:00
yucheng
de70cf842a fix(team): run the role update and budget upsert in one transaction under the team lock
Some checks failed
LiteLLM Rust / rust-lint (push) Has been cancelled
LiteLLM Rust / rust-test (push) Has been cancelled
LiteLLM Rust / rust-wheel (push) Has been cancelled
Terraform Provider / gofmt, vet, build, test (push) Has been cancelled
Terraform Provider / Provider endpoints vs proxy OpenAPI schema (push) Has been cancelled
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-20 00:04:32 +00:00
yucheng
b7db48c7c1 fix(team): 404 a role update whose target left the roster before the locked read
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 23:57:38 +00:00
Yuneng Jiang
ca18755b64
test(e2e): point the Nova Sonic realtime test at nova-2-sonic
AWS retired amazon.nova-sonic-v1:0. GetFoundationModel now answers
ResourceNotFoundException "This model version has reached the end of its life",
and opening a bidirectional stream against it fails with ValidationException
"The provided model identifier is invalid". amazon.nova-2-sonic-v1:0 is the
active replacement.

The test passed on builds 219 (2026-09-16) and 246 (2026-09-17) and has failed
every run since, three attempts per build, with no litellm change to the
realtime path in between. The symptom was a clean websocket close: Bedrock ends
the stream rather than erroring, the forwarder treats a None receive as a normal
stream end and closes the client socket, so the client sees ConnectionClosedOK
and the test fails waiting for response.done.

litellm already carries both models in the cost map, with
"deprecation_date": "2026-09-14" on the old one, and the promptStart
transformation already sends the audioOutputConfiguration that nova-2-sonic
requires; only the test constant was left behind.

Verified against live Bedrock with the promptStart shape the transformation
builds: amazon.nova-sonic-v1:0 raises "The provided model identifier is
invalid", amazon.nova-2-sonic-v1:0 opens a session and returns a usageEvent.

The mocked handler and provider-cache tests keep the old id: it is only a label
there, no call reaches AWS.
2026-09-19 16:55:00 -07:00
kerry-berri
1fcef68ab7
Merge pull request #42048 from BerriAI/litellm_fix_circleci_cost_and_bedrock_beta
Some checks failed
Unit Tests: Proxy DB Operations / auth-checks (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / budgets (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / custom-logging (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / db-and-spend (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / endpoints-and-responses (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / proxy-server-core (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / guardrails-hooks (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / jwt-and-keys (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / key-generation (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / logging-misc (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / proxy-runtime (push) Blocked by required conditions
Unit Tests: Proxy DB Operations / proxy-utils (push) Blocked by required conditions
Unit Tests / caching-local (push) Waiting to run
Unit Tests / core-utils (push) Waiting to run
Unit Tests / enterprise-package (push) Waiting to run
Unit Tests / enterprise-routing (push) Waiting to run
Unit Tests / integrations (push) Waiting to run
Unit Tests / All Other Providers (push) Waiting to run
Unit Tests / Vertex AI (push) Waiting to run
Unit Tests / mcp-integration (push) Waiting to run
Unit Tests / misc (push) Waiting to run
Unit Tests / proxy-auth (push) Waiting to run
Unit Tests / proxy-endpoints (push) Waiting to run
Unit Tests / proxy-extras (push) Waiting to run
Unit Tests / proxy-infra (push) Waiting to run
Unit Tests / proxy-server (push) Waiting to run
Unit Tests / responses-caching-types (push) Waiting to run
GitHub Actions Security Analysis / zizmor (push) Waiting to run
Terraform Provider / gofmt, vet, build, test (push) Has been cancelled
Terraform Provider / Provider endpoints vs proxy OpenAPI schema (push) Has been cancelled
fix(test): unbreak the integration-cost and proxy_e2e_anthropic_messages CircleCI jobs on main
2026-09-19 16:45:31 -07:00
yuneng-jiang
3df159308d
Merge pull request #42042 from BerriAI/litellm_websearch_activation_status
feat(ui): report whether the serving proxy has applied web search interception
2026-09-19 16:42:05 -07:00
kerry
7966f50c34 fix(test): run the all-beta-headers bedrock cases on Claude Fable 5.1
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 23:33:29 +00:00
kerry
02736e20cc fix(test): repin fireworks fallback cache-read case to the 50% default
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 23:33:29 +00:00
joshua-berri
f49fd22875
Merge pull request #42033 from BerriAI/litellm_mcp_redirect_regressions_7738
test(mcp): cover SDK redirect compatibility
2026-09-19 23:31:33 +00:00
joshua-berri
841193aab2
Merge pull request #42040 from BerriAI/revert-41909-litellm_mcp_oauth_happy_path_e2e
Revert "test(e2e): cover MCP OAuth SSO and cold restart persistence"
2026-09-19 23:25:20 +00:00
joshua-berri
93ebc1e281
Merge pull request #42039 from BerriAI/revert-41731-litellm_mcp_integration_regressions_4506
Revert "test(mcp): verify scoped execution and OAuth credential isolation"
2026-09-19 23:24:00 +00:00
yujonglee
271fe58ff0
Merge pull request #42037 from BerriAI/litellm_callbacks_legacy_python
refactor(rust): rename legacy callback adapter crate
2026-09-19 16:21:28 -07:00
tin-berri
252a0f1eac
Merge pull request #41617 from BerriAI/litellm_fuse_model_profile_presets
feat(router): add maintained Fuse model and harness presets
2026-09-19 16:17:19 -07:00
yucheng
431ddbdd22 test(team): exercise the member-add audit helper directly and drop its dead user_id None guard
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 23:17:18 +00:00
tin-berri
cc2c0d0f66
Merge pull request #42001 from BerriAI/litellm_heuristic_v2_scores
fix(auto-router): show heuristic v2 score estimates in routing details
2026-09-19 16:16:59 -07:00
yucheng
f63782f678 fix(otel v2): reject a langfuse_span_scope that conflicts with another callback entry on the same team or key
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 23:16:54 +00:00
tin-berri
1944d40097
Merge pull request #41177 from BerriAI/litellm_autorouter_baseline_cache
fix(proxy): estimate auto-router baseline costs from durable cache history
2026-09-19 16:16:29 -07:00
Yuneng Jiang
dd6a3558d5
Merge remote-tracking branch 'origin/main' into litellm_websearch_activation_status 2026-09-19 16:16:25 -07:00
Yuneng Jiang
c0bc45224c
feat(ui): report whether the serving proxy has applied the interception setting
The stored flag is the cluster's desired state and is what the form saves, so it
cannot also stand as proof that this process activated the callback: a pod that
lagged or failed to apply it would still read as on. Report the process's own
registration as a separate read-only field and warn on the page when the two
disagree, so a failed activation is visible instead of only logged.
2026-09-19 16:16:17 -07:00
Mateo Wang
af6a1798e2
Revert "test(e2e): cover MCP OAuth SSO and cold restart persistence" 2026-09-19 16:15:43 -07:00
Mateo Wang
57c757e9d7
Revert "test(mcp): verify scoped execution and OAuth credential isolation" 2026-09-19 16:10:47 -07:00
Mateo Wang
0058e1554b
Merge pull request #41909 from BerriAI/litellm_mcp_oauth_happy_path_e2e
test(e2e): cover MCP OAuth SSO and cold restart persistence
2026-09-19 16:08:51 -07:00
Yujong Lee
df84fef96e refactor(rust): rename legacy callback adapter crate
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 23:06:26 +00:00
Mateo Wang
43c0a267d5
Merge pull request #41731 from BerriAI/litellm_mcp_integration_regressions_4506
test(mcp): verify scoped execution and OAuth credential isolation
2026-09-19 16:05:56 -07:00
Mateo Wang
56408b3915
Merge pull request #42031 from BerriAI/litellm_internal_copy_41781
fix(azure): drop tool_choice when the request has no tools (internal copy of #41781)
2026-09-19 16:03:32 -07:00
Joshua Valluru
7cd96e9c2d test(mcp): assert redirect rejection without SDK wording 2026-09-19 16:01:42 -07:00
yuneng-jiang
5fc5afd595
Merge pull request #42007 from BerriAI/litellm_/web-search-autoship-scope-01a237
feat(ui): configure web search interception from the Admin UI
2026-09-19 15:54:03 -07:00
Joshua Valluru
3fdc13ccef test(mcp): cover SDK redirect compatibility 2026-09-19 15:51:01 -07:00
yucheng-berri
6afc807ae3
Merge pull request #42027 from BerriAI/litellm_stream_boundary_attr_forwarding
Co-authored-by: yucheng <yucheng@berri.ai>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 15:47:54 -07:00
yucheng
cc41b80770 test(team): patch the scheduled member-add audit helper in the cache eviction test
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 22:46:37 +00:00
Mateo Wang
7651d6b550
Merge pull request #41942 from BerriAI/litellm_vllm_batch_runner
feat(batches): run hosted_vllm batches inside LiteLLM
2026-09-19 15:44:26 -07:00
Yuneng Jiang
4ea21cb75c
fix(ui): answer the interception panel from the stored flag, not the local pod
Deriving enabled from whether this process has the callback registered makes a
pod that has not polled yet report off while the cluster runs it, and the next
save writes that off back for every pod. The stored flag is the cluster's own
answer, so prefer it and fall back to local registration only when none is
stored, which is the config-activated case that has no flag to read.
2026-09-19 15:42:16 -07:00
yucheng
2ade97f80e Merge remote-tracking branch 'origin/main' into litellm_team_audit_lifecycle 2026-09-19 22:41:02 +00:00
yucheng
181406e05f fix(team): schedule membership audit writes after commit and lock the roster on role updates
The member add, delete and role-change audit rows were awaited on the
request path, so a slow audit sink held the response, and the roster was
serialized before checking whether audit logging is enabled at all.
Membership audit work is now scheduled after the transaction commits and
skipped outright when auditing is off.

member_update read the roster outside the team advisory lock and wrote
it back, so a concurrent add or delete could be lost. It now takes the
lock, rereads the roster, and builds the before and after snapshots from
that read.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 22:33:22 +00:00