Commit graph

39863 commits

Author SHA1 Message Date
yuneng-jiang
ccbed89e83
Merge pull request #36312 from BerriAI/litellm_backport_1_90_x_bp-190x-0808sec
chore(release): backport proxy request-handling fixes and refresh runtime deps for 1.90.7
2026-08-08 16:16:49 -07:00
Yuneng Jiang
f1adb8fc5f
chore: refresh uv.lock for 1.90.7 2026-08-08 01:15:58 -07:00
Yuneng Jiang
bb3624c428
bump: version 1.90.6 → 1.90.7 2026-08-08 01:15:44 -07:00
Yuneng Jiang
61b856a7e2
chore(deps): bump langchain to 1.3.9 2026-08-08 01:14:51 -07:00
Yuneng Jiang
50ef1d2c47
chore(deps): bump vcrpy to 8.2.1 2026-08-08 01:14:51 -07:00
Yuneng Jiang
8738f60a4e
chore(deps): bump Pillow to 12.3.0 2026-08-08 01:14:50 -07:00
Yuneng Jiang
1ca6182e6f
chore(deps): bump ddtrace to 4.8.2 2026-08-08 01:14:49 -07:00
Yuneng Jiang
dc3febc5e7
chore(deps): bump cryptography to 50.0.0 2026-08-08 01:14:48 -07:00
Yuneng Jiang
512ccc20f3
chore(deps): bump aiohttp to 3.14.3 2026-08-08 01:14:48 -07:00
Yuneng Jiang
b056c92872
chore(deps): bump langgraph-sdk to 0.3.15 2026-08-08 01:14:47 -07:00
Yuneng Jiang
ad9eab9807
chore(deps): bump langgraph-checkpoint to 4.1.1 2026-08-08 01:14:46 -07:00
Yuneng Jiang
5efe31feb1
chore(deps): bump setuptools to 83.0.0 2026-08-08 01:14:46 -07:00
Yuneng Jiang
9bfcac28bb
chore(deps): bump h2 to 4.4.1 2026-08-08 01:14:45 -07:00
Yuneng Jiang
fae6a6a5f3
chore(deps): bump langsmith to 0.8.18 2026-08-08 01:14:44 -07:00
Yuneng Jiang
5d446e535a
chore(deps): bump httplib2 to 0.32.0 2026-08-08 01:14:43 -07:00
Yuneng Jiang
8c4e505c7e
chore(deps): bump soupsieve to 2.8.4 2026-08-08 01:14:42 -07:00
Yuneng Jiang
994acf7776
chore(deps): bump gitpython to 3.1.58 2026-08-08 01:14:41 -07:00
Yuneng Jiang
75b5cb65f3
chore(deps): bump python-multipart to 0.0.31 2026-08-08 01:14:40 -07:00
Yuneng Jiang
08d2d6b0ed
chore(deps): bump pypdf to 6.14.2 2026-08-08 01:14:39 -07:00
Yuneng Jiang
77fe9f19df
chore(deps): bump pyasn1 to 0.6.4 2026-08-08 01:14:38 -07:00
yuneng-jiang
43193724aa
fix(proxy)!: apply request-parameter checks consistently across body, path and form inputs (#36011)
fix(proxy)!: apply request-parameter checks consistently across body, path and form inputs

(cherry picked from commit c898d341c0)
2026-08-08 01:14:12 -07:00
yucheng-berri
0aa667c9d9
chore(proxy): clean up request parameter validation and provider destination handling (#34189)
(cherry picked from commit 065faf6e69)
2026-08-08 01:14:11 -07:00
yucheng-berri
00b57575f2
fix(proxy): resolve os.environ/ refs universally in DB-sourced models
Root cause: PR #30867 removed request-time os.environ/ expansion in
BaseAWSLLM.get_credentials. That is only safe if config-load pre-resolves
os.environ/ refs so the value reaching get_credentials is already the real
secret. The YAML config path has always done this. The DB-load path
(ProxyConfig._resolve_db_litellm_param) only re-expanded keys in a hardcoded
whitelist (_DB_LITELLM_PARAM_ENV_REF_KEYS) plus short-circuited env-ref
resolution entirely for team-scoped rows. PR #32256 extended that whitelist
to 18 keys to unblock a customer whose Bedrock model with aws_role_name:
os.environ/BEDROCK_ASSUME_ROLE_ARN broke on v1.90+, but the whitelist is
structurally fragile: every future auth field breaks the same way until
someone remembers to add it

Fix: remove the whitelist and the team-scope short-circuit. The DB-load
resolver now expands os.environ/ on every string field, matching the YAML
path. Trust boundary stays on the write side: only PROXY_ADMIN can create
team_id=None rows, only team admins of a team can create rows scoped to
that team, and the request-body vector is still blocked by
_BANNED_REQUEST_BODY_PARAMS. Team-scoped rows now resolve env refs — this
is a deliberate LIT-3831 threat-model expansion trusting team admins for
env-var reads

Regression tests in tests/test_litellm/proxy/proxy_server/test_proxy_config.py:
- test_ProxyConfig__add_deployment_resolves_env_refs_after_db_decrypt pins
  admin-scoped rows resolve every field (previously api_base stayed literal)
- test_ProxyConfig__add_deployment_resolves_team_env_refs pins team rows
  resolve env refs (previously stayed literal)
- test_ProxyConfig__add_deployment_resolves_env_refs_on_arbitrary_field pins
  the no-whitelist invariant against a made-up field name
- test_ProxyConfig__add_deployment_resolves_env_refs_for_aws_bedrock_auth_params
  (from #32256) still passes
- Path B counterparts (decrypt_model_list_from_db) mirror the above

Left as followups (not fixed here):
- /model/info and /v2/model/info still echo resolved values for fields not
  in the current pop-list (aws_role_name, aws_sts_endpoint, api_base, etc.).
  Fix is to extend remove_sensitive_info_from_deployment; separate PR
- Master-key rotation reads DB rows via decrypt_model_list_from_db which
  now resolves universally, so rotation collapses env-refs into hardcoded
  values. Pre-existing bug for the 6 previously-whitelisted fields; wider
  surface after this PR. Separate PR

(cherry picked from commit 5862be3e79)
2026-08-08 01:14:10 -07:00
yucheng-berri
ebb8783a58
fix(anthropic): require caller api_key and SSRF-validate api_base in advisor tool (#32093)
* fix(anthropic): require caller api_key and SSRF-validate api_base in advisor tool

The advisor_20260301 interceptor honored a caller-supplied api_base once
allow_client_side_credentials was enabled, even without a caller-supplied
api_key. AnthropicModelInfo.get_auth_header() then fell back to the proxy's
own ANTHROPIC_API_KEY/ANTHROPIC_AUTH_TOKEN, so the server's real credentials
plus the conversation history got sent to a caller-chosen destination

_resolve_advisor_credentials() now only honors api_base alongside a
non-empty caller-supplied api_key, requires the https scheme, and validates
api_base via validate_url() before use, mirroring check_complete_credentials
in auth_utils.py. https is required because validate_url only DNS-pins the
connection for http; for https with TLS verification on it returns the URL
unchanged and relies on certificate validation to block DNS rebinding

* fix(anthropic): also reject advisor api_base when ssl_verify is disabled

validate_url only DNS-pins the connection for http, or for https with
litellm.ssl_verify disabled; the previous https-only check missed the
ssl_verify=False case, where validate_url's rewritten URL was still being
discarded, per Greptile's review of this PR. Reject api_base outright when
ssl_verify is False so the discarded rewrite can no longer matter

(cherry picked from commit 07b9ea8c3b)
2026-08-08 01:14:04 -07:00
yucheng-berri
6f4f4d3afe
fix(proxy): restore admin key/team callback_vars.turn_off_message_logging override (LIT-3587) (#31905)
The security fix in 34e9be1ba7 removed turn_off_message_logging from
_supported_callback_params to stop callers bypassing global redaction via
the request body. That also killed the documented admin-only per-key or
per-team override because both flows resolve through the same allowlist
in initialize_standard_callback_dynamic_params.

Put turn_off_message_logging back in _supported_callback_params so an
admin-configured metadata.logging[].callback_vars.turn_off_message_logging
survives into StandardCallbackDynamicParams and can override the global
setting for that key or team, as documented at
docs/proxy/team_logging#disableenable-message-redaction.

Consolidate the metadata traversal so the extractor and the proxy strip
walk the same set of client-controllable slots. iter_client_callback_metadata_dicts
in litellm_core_utils/initialize_dynamic_callback_params.py is the single
source of truth for metadata, litellm_metadata, and litellm_params.metadata;
_strip_client_message_redaction_opt_out imports it so a future addition
to one side automatically reaches the other. The extractor iterates the
helper in reversed order so litellm_params.metadata keeps overriding
metadata, matching the pre-refactor merge precedence.

Client bypass stays blocked. Restoring the field re-enrolls it in the
auth layer's _BANNED_REQUEST_BODY_PARAMS (derived from
_supported_callback_params via _build_banned_observability_params), so
client submissions at the top level, inside metadata, or inside a
JSON-string litellm_metadata all 401 at ingress. is_request_body_safe
also now descends into litellm_params.metadata for the same 401 defense
against the nested-body attack vector, matching how the metadata and
litellm_metadata slots are handled. _strip_client_message_redaction_opt_out
runs after the litellm_metadata JSON parse and before the admin callback_vars
unpack, so admin values survive while any leftover client-supplied
opt-out is dropped when global redaction is on and the key or team
lacks allow_client_message_redaction_opt_out.

Flip the two dynamic-param e2e tests added by the security fix to
reflect the restored override behavior, keeping the invariant that
proxy client bypass is stopped by the auth layer 401 above.

Co-authored-by: yucheng <yucheng@yuchengs-MBP.attlocal.net>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
(cherry picked from commit 8e6098adc3)
2026-08-08 01:14:04 -07:00
yucheng-berri
6e9b926957
fix(bedrock): only expand config-sourced AWS credential references (#30867)
AWS auth parameters in the Bedrock and SageMaker path could be expanded against
the process environment when credentials were built. Config-sourced references
are already expanded at load time, so restrict expansion to that path: a
reference still present at request time is treated as caller-supplied input and
is left as-is, and the web-identity helper rejects environment-variable
references before resolving the token.

Also rework the ambient AWS_* fallback as a single pass that pairs each value
with its own env-var name, fixing a latent index misalignment that left
AWS_EXTERNAL_ID unresolved.

Adds regression tests covering the resolution behavior.

(cherry picked from commit 4ef7d0815b)
2026-08-08 01:02:12 -07:00
yucheng-berri
9947a2fe6a
fix: reject model_list in proxy body and gate advisor client credentials (#30585)
* fix: validate proxy request body and nested fields

Ensure caller-supplied request fields cannot override server-side deployment
configuration, and apply request-body validation consistently to nested
structures. Adjusts router kwarg handling and client-side credential handling
for base-url overrides

* test: cover router strip ordering and advisor clientside credential gate

* fix: clear deployment credentials on client base-url override

When a request overrides api_base/base_url, recompute the deployment's
litellm_params (clearing the deployment's own api_key) and drop the cached
client built for the original endpoint, so the deployment credential is not
reused for the client-supplied endpoint. Adds regression tests that assert the
credentials actually forwarded to litellm.completion/acompletion.

* fix(proxy): require api_key alongside api_base override

A request that overrides api_base/base_url but supplies no api_key still
left the proxy carrying a server credential: once the override clears the
banned-param opt-in, the provider re-resolves a key from the environment
(api_key or get_secret("OPENAI_API_KEY") and ~30 sibling chains in
main.py) and forwards it to the caller-controlled URL. Popping the
deployment api_key only changed which server key leaked.

Gate is_request_body_safe so a permitted api_base/base_url override must
also carry a non-empty caller api_key; reject otherwise. The env
resolution in main.py is left as the provider boundary.

* fix(proxy): extend request-body banlist with five additional credential and session targeting fields

Yuneng's review found five deployment-owned request-body params still missing
from the denylist and the router strip set. Each lets a caller reach the
operator's provider credentials or retarget the outbound request:
aws_profile_name selects a local AWS profile, oci_compartment_id and oci_region
retarget the OCI request, litellm_credential_name selects any server-loaded
credential by name with no ownership check, and runtimeSessionId resumes a
Bedrock AgentCore runtime session (AWS does not enforce session-to-user
mapping, so this is a cross-tenant session-resume vector).

Add all five to _BANNED_REQUEST_BODY_PARAMS in auth_utils.py and to
_DEPLOYMENT_OWNED_CREDENTIAL_KWARGS in router.py. Deployment litellm_params and
SDK direct calls are unaffected: the banlist gates the request body only, and
the router strip drops caller kwargs, never deployment["litellm_params"].

* test: rename arbitrary canary values in security tests to neutral placeholders

* fix(proxy): apply api_key co-presence to nested base override and warn on Router credential strip

P1-A: is_request_body_safe descended into _NESTED_CONFIG_KEYS
(litellm_embedding_config, extra_body) for the banned-param check but not for
the api_key co-presence check, so a base override smuggled into one of those
nested dicts cleared the client-side-credentials opt-in without a paired
api_key and let the provider re-resolve a server credential from the
environment. Run _check_base_override_has_api_key on each nested config dict
too, so the requirement applies wherever a base override is permitted.

P1-B: the deployment-owned credential strip in the Router runs unconditionally
on every _completion/_acompletion, which is security-correct but silently
drops per-call api_version/vertex_project/etc. for SDK Router callers. Emit a
single warning (key names only, never values) when the strip removes a
non-empty value, so the backwards-incompatible behavior is visible without
gating the strip on a context flag that does not exist.

* fix(proxy): apply api_key co-presence to tool-entry base override

is_request_body_safe scans three surfaces (root, _NESTED_CONFIG_KEYS, and
tools[]); the previous commit extended the api_key co-presence rule to root
and nested config dicts but not to tool entries. With
allow_client_side_credentials enabled, a tool entry carrying api_base/base_url
and no paired api_key cleared the gate, letting a provider interceptor fall
back to a server-side credential for a caller-controlled URL. Add the same
_check_base_override_has_api_key call to each tool dict and its nested function
dict, mirroring the symmetry already applied to the nested config keys. The
rule is unchanged: api_key must live in the same dict as the base override it
accompanies.

* test(proxy/auth): require paired api_key under extra_body opt-in

* fix(router): gate deployment-owned kwarg strip on litellm.proxy_is_running

* fix(advisor): narrow proxy-import guard to ImportError-family

* fix(router): gate api_key clear on base override behind litellm.proxy_is_running

* test(proxy/auth): scope proxy_is_running flag to dynamic-params class with autouse fixture

* style: use built-in generics in PR-added type annotations

* revert: drop proxy_is_running flag and router-level credential strip; rely on proxy gate

* revert: scope PR to LIT-3828 + LIT-3834 only; drop LIT-3830/LIT-3833 changes

* style: black-format advisor orchestration test

(cherry picked from commit 1667b8f740)
2026-08-08 01:02:12 -07:00
yuneng-jiang
5113f5d53d
Merge pull request #33902 from BerriAI/litellm_/stable-backport-1-90-x-9289bf
chore(release): backport #33853 to stable/1.90.x and cut 1.90.6
2026-07-18 19:09:06 -07:00
Yuneng Jiang
231e776429
chore: refresh uv.lock for 1.90.6 2026-07-18 18:52:52 -07:00
Yuneng Jiang
f50fc5fd5a
bump: version 1.90.5 → 1.90.6 2026-07-18 18:52:39 -07:00
Yuneng Jiang
31bc0755fd
chore(deps): bump pypdf to 6.13.3 2026-07-18 18:47:12 -07:00
Yuneng Jiang
44e6573728
chore(deps): bump pydantic-settings to 2.14.2 2026-07-18 18:47:11 -07:00
Yuneng Jiang
31efe3eedd
chore(deps): bump mcp to 1.28.1 2026-07-18 18:47:09 -07:00
Yuneng Jiang
99d625a331
chore(deps): bump python-multipart to 0.0.30 2026-07-18 18:47:08 -07:00
Yuneng Jiang
23102308c2
chore(deps): bump starlette to 1.3.1 2026-07-18 18:46:59 -07:00
yuneng-jiang
a862a21973
fix(docker): bake prisma CLI and engines at a fixed path so fresh-DB migrations work for any uid offline (#33853)
* fix(docker): bake prisma CLI and engines at a fixed path so fresh-DB migrations work for any uid offline

The runtime image shipped the prisma CLI and engines under /root/.cache, the
default HOME-derived prisma-python cache location. Any deployment whose
runtime HOME is not /root (kubernetes runAsUser, docker --user, HOME
overrides) missed that cache on a fresh database, fell back to a nodeenv
Node download that crashes on Wolfi (libatomic.so.1), and started the proxy
with zero tables while every DB-backed endpoint returned 500

The bake now lives at /opt/prisma, a path no HOME resolution or cache
volume mount can shadow. The builder records the engine paths there at
generate time, and the runtime stage pins PRISMA_BINARY_CACHE_DIR,
PRISMA_CLI_PATH, PRISMA_CLI_QUERY_ENGINE_TYPE=binary and
PRISMA_OFFLINE_MODE so both litellm-proxy-extras and prisma-python resolve
the baked CLI and engines directly. prisma migrate deploy on a fresh
database now needs no npm and no network access for any runtime uid,
including readOnlyRootFilesystem deployments

Verified against live containers: fresh and existing databases as root,
uid 12345, HOME overridden, on an internal-only docker network, and with
a read-only root filesystem all migrate and serve /team/new successfully

Fixes #33650, #24554

* chore(docker): fail the image build if the baked prisma CLI layout drifts

Asserts the baked CLI shim is executable and its entrypoint exists in the
runtime stage after the COPY and chmod, so a layout change in a future
prisma-python release breaks the image build loudly instead of silently
degrading the migration path at container startup

(cherry picked from commit 567ebcb3e9)
2026-07-18 18:44:19 -07:00
yuneng-jiang
0430743f2f
Merge pull request #33610 from BerriAI/litellm_backport_1_90_x_bp_proxy_extras_0716
chore(release): backport #33592 to stable/1.90.x and cut 1.90.5
2026-07-16 16:32:48 -07:00
Yuneng Jiang
0dc1b2ac26
chore: refresh uv.lock for 1.90.5 2026-07-16 15:37:31 -07:00
Yuneng Jiang
80018ca908
bump: version 1.90.4 → 1.90.5 2026-07-16 15:37:16 -07:00
yuneng-jiang
f0b7d8df53
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 111d447e1b)
2026-07-16 15:31:59 -07:00
yuneng-jiang
ae0cfc05fd
Merge pull request #32937 from BerriAI/litellm_backport_1_90_x_bp-32542-90x
chore(release): backport #32542 to stable/1.90.x and cut 1.90.4
2026-07-11 13:32:51 -07:00
Yuneng Jiang
2cf7d1caac
chore: refresh uv.lock for 1.90.4 2026-07-11 12:10:46 -07:00
Yuneng Jiang
bf43dfa192
bump: version 1.90.3 → 1.90.4 2026-07-11 12:10:22 -07:00
yucheng-berri
342d8897b6
fix(guardrails): walk Responses-API text taxonomy in shared content helpers (#32542)
* fix(guardrails): walk Responses-API text taxonomy in shared content helpers

Every guardrail sharing litellm/proxy/guardrails/_content_utils.py silently
drops all text on the /v1/responses path. AIM turns it into a loud 422 (
{"error":"No messages in the request"}); every other guardrail (Lakera v2,
Cato, Lasso, Repello, IBM, Azure Content Safety, enterprise secret
detection) scans an empty payload and lets the request through unscanned.

Three defects, all in _content_utils.py:

1. _iter_text_parts_in_content recognised only part.type == "text", but the
   Responses API uses input_text (request) and output_text (assistant).
2. _coerce_input_to_messages gated on "every item has a role key"; any
   Responses input list containing a function_call or function_call_output
   item failed the check and was wrapped as one opaque blob.
3. build_inspection_messages forwarded any role through, including a bare
   tool role missing tool_call_id, which validators like AIM's /fw/v1/analyze
   reject with a schema error.

Fix walks the actual Responses item taxonomy (message, function_call,
function_call_output, bare content parts and strings), recognises
{text, input_text, output_text} everywhere, and coerces any role outside
{system, user, assistant} to user in the outbound inspection payload.

* style: ruff-format changed guardrail files

* test(guardrails): cover function_call_output string form; drop em-dash in new docstring

* fix(guardrails): map function_call_output straight to user role

Avoids ever materialising a schema-invalid bare tool message. The
downstream role-safety coercion in build_inspection_messages still
guards genuinely caller-supplied non-standard roles (developer,
function, custom values); add a regression test covering that path
so the coercion has real coverage after this simplification.

* test(guardrails): pin chat-completions tool-role coercion in build_inspection_messages

* docs(test): soften AIM-specific claims in LIT-4294 test docstrings

Ryan's review flagged that several test docstrings assert AIM's
/fw/v1/analyze validates + rejects specific schema violations. That
behavior is customer-reported in the LIT-4294 writeup, not directly
verified by us. Rephrase to attribute the AIM 422 to the customer's
writeup and describe the underlying constraint as the OpenAI chat
schema; any downstream API that validates against that schema rejects
the same shape.

* refactor(guardrails): move unsupported-role coercion into AIM only

The generic coercion in build_inspection_messages collapsed any role
outside {system, user, assistant} to user for every caller of the
helper. Combined with the pre-existing apply_redacted_messages_back
write-back behavior in Lakera/AIM/Cato, that turned a loud OpenAI 400
on chat-completions tool-message masking into a silent semantic
corruption of the outbound request (role tool with tool_call_id got
rewritten to bare role user, dropping the assistant + tool_calls
sibling).

AIM specifically requires the coercion because its /fw/v1/analyze
validates the payload against the OpenAI chat schema; other guardrails
either do not validate roles or do their own reconstruction. Move the
coercion to AimGuardrail._build_aim_inspection_messages so the shared
helper keeps caller roles intact and no new cross-guardrail role
corruption is introduced. The pre-existing apply_redacted_messages_back
structural flatten remains as separate follow-up work.

function_call_output items still synthesise role user in the shared
helper because they have no natural role field, which is a different
concern from coercing a caller-supplied role.

* refactor(guardrails): preserve role fidelity in shared _content_utils

Shared inspection helpers should extract text and preserve semantic
role signals; role coercion for third-party schema safety stays inside
the guardrail that needs it (AIM).

Three shared-helper changes:
- Bare content-part dicts (input_text/output_text) with an explicit role
  keep it; only role-less parts default to user.
- Responses message items already had their role preserved; the
  behavior is now covered by an explicit test.
- function_call_output items default to role tool (semantic equivalent
  of the chat-completions tool message shape) instead of role user, so
  Responses and chat completions produce symmetric inspection payloads.
  A caller-supplied role on the item is still preserved.

AIM's schema-safe coercion in _build_aim_inspection_messages already
handles the resulting role tool: it collapses to user before the POST
to /fw/v1/analyze so AIM's OpenAI-schema validator does not reject the
bare tool message (no tool_call_id can survive the flatten). Added a
regression test in test_aim.py covering that path.

(cherry picked from commit e84a19acd5)
2026-07-11 12:07:55 -07:00
yuneng-jiang
2d28d8fadf
Merge pull request #32025 from BerriAI/litellm_cherrypick_1_90_x
chore(release): backport #31923, #31929, #31393 to stable/1.90.x and cut 1.90.3
2026-07-03 12:17:20 -07:00
mateo-berri
01363fee3d bump: version 1.90.2 → 1.90.3 2026-07-02 21:41:21 -07:00
ryan-crabbe-berri
bb77cc0841 fix(mcp): stop logging tool-call input in MCP client (#31393)
Backport of #31393 to stable/1.90.x.
Cherry-picked from 7acc0157df (litellm_internal_staging).

The test-file conflict hunk also carried the staging-only TestMCPClientResolvedAuth
class from an unrelated commit that never reached this line; it was dropped and only
the additions belonging to #31393 were kept.
2026-07-02 21:41:21 -07:00
Shivam Rawat
bb90565092 fix(bedrock): honor ttl for tool_config cache injection points (#31929)
Backport of #31929 to stable/1.90.x.
Cherry-picked from 1543725916 (litellm_internal_staging).

Deviations from the upstream squash, needed because the line predates some
staging-only state:
- model_prices JSON churn reduced to its semantic content: drop the stale
  1h-TTL pricing keys from the two Claude 3.5 Sonnet Bedrock entries and add
  supports_parallel_tool_use_config to the flagged entries. 6 of the 58
  flagged entries (*.anthropic.claude-sonnet-5) do not exist on this line and
  were skipped
- ported the local_model_cost_map fixture into
  test_anthropic_claude3_transformation.py (added upstream by an earlier
  staging commit that never reached this line)
- test_parallel_tool_calls_config_kept_for_sonnet_5 renamed and pointed at
  anthropic.claude-sonnet-4-6, since sonnet-5 has no entry on this line
- test_parallel_tool_calls_newer_model_adds_disable_flag now forces the
  bundled cost map so it does not depend on the remote map having synced the
  new flag
- ruff-strict-budget.json kept at the line's schema (no change needed)
2026-07-02 21:22:01 -07:00
Mateo Wang
6a5353196d fix(bedrock/converse): drop toolSpec.strict for Opus 4.7/4.8 (#31582) (#31923)
Backport of #31923 to stable/1.90.x.
Cherry-picked from 85f924148a (litellm_internal_staging).
2026-07-02 21:07:31 -07:00
yuneng-jiang
1e60f26596
Merge pull request #31782 from BerriAI/litellm_backport_1_90_x_bp_31519_31733
chore(release): backport #31519, #31733 to stable/1.90.x and cut 1.90.2
2026-06-30 19:09:44 -07:00