Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
6b591c3
fix(ovhcloud): migrate reasoning_content->reasoning and duration->sec…
KunalG67 Apr 27, 2026
e55e73d
fix(ovhcloud): use explicit None check for seconds field in STT response
KunalG67 Apr 27, 2026
c0da139
fix(otel): populate gen_ai.output.messages and gen_ai.system_instruct…
Aneesh-Fiddler Apr 27, 2026
4d2e13c
test(otel): add tests for Responses API output messages, system instr…
Aneesh-Fiddler Apr 27, 2026
e70b0c9
style: apply black formatting to opentelemetry.py
Aneesh-Fiddler Apr 28, 2026
c30d58f
fix: resolve mypy indexed assignment error in function_call handling
Aneesh-Fiddler Apr 28, 2026
466b4dd
fix: address review comments — Pydantic compat, falsy fallthrough, pe…
Aneesh-Fiddler Apr 28, 2026
982fed4
fix(ovhcloud): handle reasoning field migration in non-streaming resp…
KunalG67 Apr 28, 2026
8f48d88
style: apply black formatting to ovhcloud chat transformation
KunalG67 Apr 28, 2026
9928618
fix: remove duplicate gen_ai.response.finish_reasons block
Aneesh-Fiddler Apr 28, 2026
90bcd23
fix(ovhcloud): remove dead transform_response override
KunalG67 Apr 28, 2026
d73e24c
fix(ovhcloud): remove dead transform_response override, parent alread…
KunalG67 Apr 28, 2026
5310252
ci: retrigger checks after retargeting to litellm_oss_staging_04_27_2026
Aneesh-Fiddler Apr 29, 2026
c319a19
fix: handle raw Pydantic v2 models from openai SDK in output transfor…
Aneesh-Fiddler Apr 30, 2026
209bd0b
fix(proxy): sort spend updates to prevent DB deadlocks
pnookala-godaddy May 5, 2026
2993e45
allow non-admin roles on /compliance/* read routes
May 5, 2026
85d4d96
fix(proxy): preserve HTTP operations when injecting WebSocket stubs i…
michelligabriele May 5, 2026
ed7ded9
Merge PR #27221 into agent staging branch
oss-pr-review-agent-shin[bot] May 6, 2026
062b5b3
Add main module header comment
cursoragent May 6, 2026
b631863
Add utils module docstring
oss-agent-shin May 6, 2026
f8c0e03
Merge PR #27255 into agent staging branch
oss-pr-review-agent-shin[bot] May 6, 2026
5b91fc0
Merge PR #27253 into agent staging branch
oss-pr-review-agent-shin[bot] May 6, 2026
1087766
Merge PR #27244 into agent staging branch
oss-pr-review-agent-shin[bot] May 6, 2026
abf0381
Merge PR #27234 into agent staging branch
oss-pr-review-agent-shin[bot] May 6, 2026
75245de
Merge PR #26595 into agent staging branch
oss-pr-review-agent-shin[bot] May 6, 2026
a466c2e
Merge PR #26670 into agent staging branch
oss-pr-review-agent-shin[bot] May 6, 2026
158b0c2
[litellm-agent] Staging → litellm_internal_staging (5/7/2026) (#27375)
oss-pr-review-agent-shin[bot] May 7, 2026
bac03ac
feat(auth): add scope and wildcard support for JWT routing overrides …
milan-berri May 7, 2026
b379f4f
[Feature] UI - Logs: Add 'Last Minute' to time-range quick select
yuneng-berri May 8, 2026
b834817
[Feat] Add endpoint for bulk key updates for team (#26468)
Michael-RZ-Berri May 9, 2026
2b4beae
Fix/shared health check polling (#26434)
noahnistler May 9, 2026
0f908e6
fix(proxy): resolve provider from deployment for multi-provider defau…
Anai-Guo May 9, 2026
f8b078b
fix(bedrock/messages): preserve compact_20260112 context_management o…
Anai-Guo May 9, 2026
d1d2400
fix(router): register model info under responses/-stripped variant (#…
krisxia0506 May 9, 2026
b799f94
fix(ui): remove blank leading entry from access group model dropdown …
Bytechoreographer May 9, 2026
8044529
fix(proxy): coerce non-str x-litellm-* header values to avoid httpx T…
Anai-Guo May 9, 2026
c7739c9
feat: add ability to auth to azure with token (#27556)
shivamrawat1 May 9, 2026
02edaef
fix: reset org and tag budgets (#27326)
Michael-RZ-Berri May 9, 2026
9f68d2b
Fix: tag budget reset must drop stale management-cache entry (#27568)
oss-agent-shin May 10, 2026
36caeb0
fix: enforce tag budgets on x-litellm-tags header requests
shivamrawat1 May 10, 2026
4fc0f1d
fix: keep body tags visible to _tag_max_budget_check pre-auth
shivamrawat1 May 10, 2026
0af33fb
fix(ui): omit allowed_routes from key edit save when unchanged (#27553)
ryan-crabbe-berri May 10, 2026
ce17e94
Merge branch 'litellm_internal_staging' into litellm_agent_oss_stagin…
Sameerlite May 11, 2026
99218c6
Fix deprecated model test
Sameerlite May 11, 2026
157d813
fix(openai): route reasoningSummary on gpt-5.4+ chat without tools to…
Sameerlite May 11, 2026
eed6985
Fix reasoning summary alias stripping
cursoragent May 11, 2026
c7e6bcc
Merge pull request #27256 from BerriAI/litellm_agent_oss_staging_05_0…
Sameerlite May 11, 2026
0ac923c
Fix GPT-5 reasoning summary alias stripping
cursoragent May 11, 2026
22e9fd1
Fix reasoningSummary for gpt-5 series as well
Sameerlite May 11, 2026
e74329d
Fix greptile issue
Sameerlite May 11, 2026
57ed2da
Simplify GPT-5 responses bridge condition
cursoragent May 11, 2026
1628886
Fix GPT-5 reasoning summary strip test path
cursoragent May 11, 2026
083d87a
Merge branch 'litellm_internal_staging' into shin_agent_oss_staging_0…
Sameerlite May 11, 2026
055bdc3
fix(auth): harden JWT routing wildcard iss and merge list team_id claims
Sameerlite May 11, 2026
9ed9903
Merge pull request #27422 from BerriAI/shin_agent_oss_staging_05_07_2026
Sameerlite May 11, 2026
aa587bd
Merge pull request #27549 from BerriAI/shin_agent_oss_staging_05_09_2026
Sameerlite May 11, 2026
7524c40
dummy change
Sameerlite May 11, 2026
aa1f57f
fix black and github mock test
Sameerlite May 11, 2026
b150816
Preserve reasoning summary without effort
cursoragent May 11, 2026
4801425
Add gpt-realtime-2 model pricing
superpoussin22 May 11, 2026
8631d97
Add gpt-realtime-2 model pricing and capabilities
superpoussin22 May 11, 2026
9bc90f6
chore: remove accidental .evidence screenshot from repo (#27633)
Sameerlite May 11, 2026
79618b1
Merge pull request #27658 from BerriAI/litellm_internal_staging
Sameerlite May 11, 2026
4c1d91d
fix(anthropic): inject dummy tool without modify_params (#27620)
Sameerlite May 11, 2026
5e016f9
fix(responses): normalize chat tool_choice for completions→responses …
Sameerlite May 11, 2026
12e59c8
Fix internal tag usage scoping (#27315)
ishaan-berri May 11, 2026
5833d3e
Merge pull request #27618 from BerriAI/litellm_reasoning_summary_chat…
Sameerlite May 11, 2026
0751886
feat(batch-job): bedrock batch model invocation job retrieval (#26834)
dgu1-godaddy May 11, 2026
9ac4092
[litellm-agent] Staging → litellm_internal_staging (5/11/2026) (#27677)
oss-pr-review-agent-shin[bot] May 11, 2026
be84d5c
ci: add manually-triggered mutation testing workflow (#27576)
ryan-crabbe-berri May 11, 2026
473cfca
Add Bedrock Claude Platform route (#27678)
oss-agent-shin May 11, 2026
afbe864
Merge pull request #27446 from BerriAI/litellm_ui_logs_last_minute_fi…
yuneng-berri May 11, 2026
6de00e2
fix(ci): unbreak realtime + bedrock batch tests (#27690)
mateo-berri May 12, 2026
f3b8aad
fix(router): pin Responses API affinity to Azure resource on model-gr…
mateo-berri May 12, 2026
40db114
fix(router): accept Pydantic LiteLLM_Params in encryption-boundary ke…
cursoragent May 12, 2026
aa9e7b9
feat: litellm shin agent oss staging 05 10 2026 (#27631)
Sameerlite May 12, 2026
a47cf03
Merge pull request #27703 from BerriAI/litellm_lit-2531-affinity-cros…
Sameerlite May 12, 2026
7bb5eb5
Merge pull request #27653 from superpoussin22/realtime-2
Sameerlite May 12, 2026
fc8a9a3
Match litellm.completion supported model parameters with proxy model …
jyeros May 12, 2026
b39cac9
feat(ui): add Expires to key Overview header; merge User into one fie…
ryan-crabbe-berri May 12, 2026
9c4faea
feat(ui): search teams by team ID alongside name (#27684)
ryan-crabbe-berri May 12, 2026
63a2d1d
fix(tests): use canonical litellm_enterprise import path (#27699)
ryan-crabbe-berri May 12, 2026
6bffa3e
Merge branch 'litellm_internal_staging' into litellm_tag_budget_heade…
shivamrawat1 May 12, 2026
4a78bfc
fix(proxy): always merge caller-supplied tags into request metadata
yuneng-berri May 12, 2026
96c62c1
docs(proxy): refresh stale comments referencing removed tag strip
yuneng-berri May 12, 2026
8c8621e
fix(tests): swap dall-e to gpt-image-1 after openai deprecation
yuneng-berri May 12, 2026
945b10d
fix(tests): drop dall-e-only test classes; route live image tests via…
yuneng-berri May 12, 2026
f9c8de2
Merge pull request #27787 from BerriAI/litellm_/serene-goldwasser-8f121e
yuneng-berri May 12, 2026
ad2a74c
Merge pull request #27784 from BerriAI/litellm_/vibrant-bose-d1a024
yuneng-berri May 12, 2026
0deffd3
chore: reject bare str at file-input sinks to prevent local-file read…
krrish-berri-2 May 12, 2026
7066587
fix(tests): swap dall-e to gpt-image-1 after openai deprecation
yuneng-berri May 12, 2026
10a106a
fix(tests): drop dall-e-only test classes; route live image tests via…
yuneng-berri May 12, 2026
75da2f3
fix(proxy): always merge caller-supplied tags into request metadata
yuneng-berri May 12, 2026
5859fcc
docs(proxy): refresh stale comments referencing removed tag strip
yuneng-berri May 12, 2026
ddb4bd8
feat(ui): add Vertex AI Search as vector store provider (#27790)
ryan-crabbe-berri May 13, 2026
8f25942
Litellm key rotation bug (#27756)
harish-berri May 13, 2026
7738b03
chore(proxy): close /key/regenerate ownership-rebind + premium-gate b…
stuxf May 13, 2026
9cad30a
Merge branch 'litellm_internal_staging' into litellm_tag_budget_heade…
shivamrawat1 May 13, 2026
d5d73f1
chore(proxy): clarify ownership-rebind error message (actor vs target)
stuxf May 13, 2026
eb142b9
test(proxy): drop allow_client_tags opt-in gate and add credential re…
shivamrawat1 May 13, 2026
8f3056c
chore(proxy): block explicit-null user_id in ownership rebind guard
stuxf May 13, 2026
4c3ff78
Merge pull request #27793 from stuxf/chore/key-regenerate-ownership-r…
yuneng-berri May 13, 2026
a594414
fix(proxy): parse string metadata before pre-auth tag merge
shivamrawat1 May 13, 2026
1c4e4d4
Fix 3 OpenTelemetry tracing bugs in proxy integration (#27757)
yassin-berriai May 13, 2026
924e8b2
Merge pull request #27573 from BerriAI/litellm_tag_budget_header_enfo…
yuneng-berri May 13, 2026
a232cd2
Merge pull request #27798 from BerriAI/litellm_yj_may12
yuneng-berri May 13, 2026
e42ba1e
chore: update Next.js build artifacts (2026-05-13 01:42 UTC, node v20…
yuneng-berri May 13, 2026
be2552b
Merge pull request #27805 from BerriAI/yj_build_may12
yuneng-berri May 13, 2026
83f26d1
Strip SERVER_ROOT_PATH before lazy-feature prefix match
yuneng-berri May 13, 2026
384fc0b
Cache normalized SERVER_ROOT_PATH at middleware init
yuneng-berri May 13, 2026
aee58db
test: replace dall-e-3 with gpt-image-1 in health check and router te…
yuneng-berri May 13, 2026
431daa1
Merge pull request #27812 from BerriAI/litellm_lazyFeatureRootPath
yuneng-berri May 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
131 changes: 131 additions & 0 deletions .github/workflows/mutation-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
name: "Mutation Test (manual)"

# Manually-triggered mutation testing. Runs mutmut against the scope
# configured in [tool.mutmut] in pyproject.toml (currently the
# litellm/proxy/management_endpoints/ folder). Intended cadence is roughly
# weekly — clicked from the Actions tab when someone wants a fresh report.
#
# Uploads a structured `mutation-report.md` (Meta ACH-style: original +
# mutated function with `# MUTANT START`/`# MUTANT END` delimiters + the
# existing tests + a task instruction) as a workflow artifact. Failures
# do not block anything because nothing depends on this workflow.

on:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: mutation-test-${{ github.ref }}
cancel-in-progress: true

jobs:
mutation:
name: Run mutmut
runs-on: ubuntu-latest
# Whole-folder mutation against ~15 files / ~7.5k LOC can take hours.
# 350 minutes is just under the GitHub-hosted job cap of 360 minutes.
timeout-minutes: 350

steps:
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.12"

- name: Set up uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
version: "0.10.9"

- name: Cache uv dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: |
~/.cache/uv
.venv
key: ${{ runner.os }}-uv-${{ hashFiles('uv.lock') }}
restore-keys: |
${{ runner.os }}-uv-

- name: Install dependencies
run: |
uv sync --frozen --group ci --group proxy-dev --extra google --extra proxy --extra semantic-router

- name: Generate Prisma client
env:
PRISMA_BINARY_CACHE_DIR: ${{ runner.temp }}/prisma-cache
run: |
uv run --no-sync prisma generate --schema litellm/proxy/schema.prisma

# mutmut 3.x runs tests inside a `mutants/` sandbox where it injects
# mutation trampolines. uv installs the project as editable by default,
# which puts the original source dir on sys.path via a .pth file and
# shadows the sandbox copy — so tests would never exercise the mutated
# code. Reinstalling non-editable removes the .pth shadow.
- name: Reinstall litellm non-editable (so mutants/ is not shadowed)
run: |
uv pip uninstall litellm
uv pip install . --no-deps

# pytest-retry's pytest_configure hook crashes with
# `INTERNALERROR: no option named 'filtered_exceptions'` when invoked
# via mutmut's in-process pytest.main() call. The entry-point name
# doesn't normalize cleanly with `-p no:<name>`, so just remove the
# package outright. Reruns are wrong for mutation testing anyway —
# rerunning a "failed" mutant test would mask which mutants are killed.
- name: Remove pytest plugins that conflict with mutmut
run: |
uv pip uninstall pytest-retry || true

- name: Run mutmut
env:
# Make the mutants/ sandbox win over site-packages on sys.path so the
# trampolined files are imported instead of the installed copy.
PYTHONPATH: ${{ github.workspace }}/mutants
run: |
set -o pipefail
mkdir -p mutants
uv run --no-sync --with mutmut==3.5.0 mutmut run 2>&1 | tee mutmut-run.log

# Generate the structured report. The script embeds the enclosing
# function source for each survivor (via Python AST) and includes the
# existing test files, so an LLM agent has enough context to write
# killing tests without further file lookups. Modeled on Meta's ACH
# prompt template (arXiv 2501.12862).
- name: Generate detailed mutation report
if: always()
run: |
set +e
uv run --no-sync --with mutmut==3.5.0 mutmut export-cicd-stats > /dev/null 2>&1
uv run --no-sync --with mutmut==3.5.0 mutmut results > mutmut-results.txt 2>&1
uv run --no-sync python scripts/mutation_report.py
# The full report can be very long for big test files; the run-page
# summary cuts off at 1 MB. Append the head of the report (summary
# + survivor list) and link out to the artifact for the full body.
{
head -c 900000 mutation-report.md
echo ""
echo ""
echo "_Full report (with embedded function bodies and test files) is in the workflow artifact._"
} >> "$GITHUB_STEP_SUMMARY"

- name: Upload mutmut artifacts
if: always()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
with:
name: mutmut-${{ github.run_id }}-${{ github.run_attempt }}
path: |
mutation-report.md
mutmut-results.txt
mutmut-run.log
mutants/mutmut-stats.json
mutants/mutmut-cicd-stats.json
mutants/litellm/proxy/management_endpoints/**/*.py
if-no-files-found: warn
retention-days: 14
1 change: 1 addition & 0 deletions .github/workflows/test-unit-proxy-db.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ jobs:
test-path: >-
tests/proxy_unit_tests/test_auth_checks.py
tests/proxy_unit_tests/test_user_api_key_auth.py
tests/proxy_unit_tests/test_deprecated_key_grace_period.py
workers: 4
dist: loadscope
timeout: 15
Expand Down
6 changes: 6 additions & 0 deletions litellm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1426,6 +1426,12 @@ def set_global_gitlab_config(config: Dict[str, Any]) -> None:
)
from .llms.datarobot.chat.transformation import DataRobotConfig as DataRobotConfig
from .llms.anthropic.chat.transformation import AnthropicConfig as AnthropicConfig
from .llms.bedrock.claude_platform.transformation import (
BedrockClaudePlatformConfig as BedrockClaudePlatformConfig,
)
from .llms.bedrock.claude_platform.messages_transformation import (
BedrockClaudePlatformMessagesConfig as BedrockClaudePlatformMessagesConfig,
)
from .llms.anthropic.completion.transformation import (
AnthropicTextConfig as AnthropicTextConfig,
)
Expand Down
10 changes: 10 additions & 0 deletions litellm/_lazy_imports_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@
"OpenrouterConfig",
"DataRobotConfig",
"AnthropicConfig",
"BedrockClaudePlatformConfig",
"AnthropicTextConfig",
"GroqSTTConfig",
"TritonConfig",
Expand Down Expand Up @@ -170,6 +171,7 @@
"SagemakerNovaConfig",
"CohereChatConfig",
"AnthropicMessagesConfig",
"BedrockClaudePlatformMessagesConfig",
"AmazonAnthropicClaudeMessagesConfig",
"AmazonMantleMessagesConfig",
"TogetherAIConfig",
Expand Down Expand Up @@ -610,6 +612,10 @@
"OpenrouterConfig": (".llms.openrouter.chat.transformation", "OpenrouterConfig"),
"DataRobotConfig": (".llms.datarobot.chat.transformation", "DataRobotConfig"),
"AnthropicConfig": (".llms.anthropic.chat.transformation", "AnthropicConfig"),
"BedrockClaudePlatformConfig": (
".llms.bedrock.claude_platform.transformation",
"BedrockClaudePlatformConfig",
),
"AnthropicTextConfig": (
".llms.anthropic.completion.transformation",
"AnthropicTextConfig",
Expand Down Expand Up @@ -712,6 +718,10 @@
".llms.anthropic.experimental_pass_through.messages.transformation",
"AnthropicMessagesConfig",
),
"BedrockClaudePlatformMessagesConfig": (
".llms.bedrock.claude_platform.messages_transformation",
"BedrockClaudePlatformMessagesConfig",
),
"AmazonAnthropicClaudeMessagesConfig": (
".llms.bedrock.messages.invoke_transformations.anthropic_claude3_transformation",
"AmazonAnthropicClaudeMessagesConfig",
Expand Down
Loading
Loading