Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
211 commits
Select commit Hold shift + click to select a range
ec004a5
feat(vertex_ai): propagate metadata labels to embedding, Imagen, rerank
Sameerlite Apr 2, 2026
5805609
Merge pull request #25521 from BerriAI/main
Sameerlite Apr 10, 2026
ebdc34e
Fix mypy
Sameerlite Apr 10, 2026
b19951a
Add litellm_metadata support
Sameerlite Apr 17, 2026
b594001
Merge pull request #25949 from BerriAI/litellm_internal_staging
Sameerlite Apr 17, 2026
2b028a6
Merge branch 'litellm_internal_staging' into litellm_vertex_request_m…
Sameerlite Apr 21, 2026
f4e976e
fix(anthropic): handle response_format tool alongside user tools in n…
Sameerlite Apr 22, 2026
fbcdacc
[Fix] Proxy: reconnect Prisma DB without blocking the event loop
yuneng-berri Apr 22, 2026
47f46b4
Merge pull request #26304 from BerriAI/litellm_internal_staging
Sameerlite Apr 23, 2026
9d58e6e
Merge pull request #26379 from BerriAI/litellm_internal_staging
Sameerlite Apr 24, 2026
f503c06
Fix black formatting
Sameerlite Apr 24, 2026
be41d4b
Merge pull request #26437 from BerriAI/litellm_internal_staging
Sameerlite Apr 24, 2026
73869f0
fix(mcp): tighten public-route detection and OAuth2 fallback gating
stuxf Apr 25, 2026
0a4640f
fix(mcp): don't coerce ProxyException.code with int()
stuxf Apr 25, 2026
796844e
test(mcp): explicit registry mock in TestMCPPublicRouteGuard
stuxf Apr 25, 2026
3337128
Fix black
Sameerlite Apr 27, 2026
3e4f9af
Add support for azure entra discovery endpoint
Sameerlite Apr 27, 2026
6c5b501
Fix greptile review
Sameerlite Apr 27, 2026
09b648a
fix lint
Sameerlite Apr 27, 2026
cfe4bc6
feat(vector-stores): support provider-specific Bedrock retrieval config
Sameerlite Apr 28, 2026
6b86e54
Fix greptile reviews
Sameerlite Apr 28, 2026
2d2f540
feat(proxy): add team-level search provider credential resolution
Sameerlite Apr 28, 2026
c4e074f
feat(proxy): add model-like search tool access control
Sameerlite Apr 28, 2026
77d48e7
chore(proxy): remove unintended generated and local files from prior …
Sameerlite Apr 28, 2026
0543c59
revert proxy config
Sameerlite Apr 28, 2026
50eba8a
fix(bedrock, anthropic): translate OpenAI file content on tool-result…
minznerjosh Apr 28, 2026
898040f
Fix tests
Sameerlite Apr 28, 2026
5b5363c
test: mirror PDF tool-result tests under tests/test_litellm
minznerjosh Apr 28, 2026
12e1d02
address Greptile review feedback on tool-result PDF fix
minznerjosh Apr 28, 2026
b07e1c0
drop response body from vertex/bedrock transformation errors
Apr 29, 2026
fc49c18
feat(mcp): opt-in short-ID tool prefix to stay under 60-char tool nam…
cursoragent Apr 29, 2026
1da1eb6
ci(release): accept PEP 440 tag forms in create-release workflow
yuneng-berri Apr 29, 2026
3a59808
ci(release): mark rc / dev / nightly tags as GitHub pre-releases
yuneng-berri Apr 29, 2026
804e7c0
Merge pull request #26734 from BerriAI/yj/create-release-pep440-tags
yuneng-berri Apr 29, 2026
4e82744
fix: type error
mateo-berri Apr 29, 2026
cf74f55
Fix extra body error
Sameerlite Apr 29, 2026
4ae2996
Add gpt-image-2 support (#26644) (#26705)
ishaan-berri Apr 29, 2026
44ab016
feat(provider): add AIHubMix as an OpenAI-compatible provider (#24294)
xinrui-z Apr 29, 2026
b516120
Merge pull request #26737 from BerriAI/litellm_internal_staging
Sameerlite Apr 29, 2026
e0cd536
Fix lint
Sameerlite Apr 29, 2026
df3dbd1
feat(mcp): rehash short tool prefix on collision and cache per server
cursoragent Apr 29, 2026
3215874
fix(test): scope ERROR log assertion to LiteLLM logger in test_model_…
cursoragent Apr 29, 2026
af5b7be
Merge pull request #26742 from BerriAI/litellm_internal_staging
Sameerlite Apr 29, 2026
6b3f07b
fix(mcp): register OpenAPI tools after short prefix collision resolut…
cursoragent Apr 29, 2026
d7862e7
Merge pull request #26745 from BerriAI/litellm_internal_staging
Sameerlite Apr 29, 2026
3fb5056
fix(mcp): address greptile review on short tool prefix
cursoragent Apr 29, 2026
6e6b2ca
Merge pull request #26741 from BerriAI/litellm_fix-model-alias-flake-…
mateo-berri Apr 29, 2026
8c91c8b
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 29, 2026
1c9c219
fix(proxy): self-heal Prisma read paths + harden reconnect state machine
yuneng-berri Apr 29, 2026
aa2ef41
fix(proxy): preserve original transport error if reconnect itself raises
yuneng-berri Apr 29, 2026
06d9a69
docs(proxy): clarify _kill_engine_process is on the routine reconnect…
yuneng-berri Apr 29, 2026
4b03cb6
feat(proxy): move search tool access to object permissions
Sameerlite Apr 29, 2026
814e785
Remove unused docs
Sameerlite Apr 29, 2026
b5c60d8
Add migration script
Sameerlite Apr 29, 2026
7b307c4
fix lint
Sameerlite Apr 29, 2026
8af338a
Merge pull request #26757 from BerriAI/litellm_internal_staging
Sameerlite Apr 29, 2026
d592dc5
Fix mypy
Sameerlite Apr 29, 2026
28bcad3
Fix mypy
Sameerlite Apr 29, 2026
d8d1444
Merge pull request #26710 from minznerjosh/fix/bedrock-anthropic-tool…
Sameerlite Apr 29, 2026
e340360
Fix black
Sameerlite Apr 29, 2026
d38609e
fix mypy
Sameerlite Apr 29, 2026
45c2208
Fix ui unit test
Sameerlite Apr 29, 2026
848b79a
fix: added keepalive args for aiohttp tcpconnector
yassinkortam Apr 29, 2026
ea27565
remove /ui/chat page (#26739)
ishaan-berri Apr 29, 2026
9b3cd5c
Merge pull request #26730 from yassinkortam/fix/http-handler-keepalive
yassinkortam Apr 29, 2026
2b9ad4d
Fall through to team default when per-member budget max_budget is NULL
Apr 29, 2026
04687ba
Trim verbose comments and docstrings
Apr 29, 2026
9d9f099
chore(auth): substitute alias for master key on UserAPIKeyAuth
stuxf Apr 25, 2026
bdb00c4
fix(spend-tracking): drop orphaned imports; align tests with alias co…
stuxf Apr 25, 2026
0806cca
chore(vector-stores): redact credentials from list/info responses
stuxf Apr 25, 2026
a99943e
test+style: drop _redact_vector_store wrapper; inherit masker defaults
stuxf Apr 25, 2026
51d560b
chore(vector-stores): also gate /vector_store/update; upstream creden…
stuxf Apr 25, 2026
78d12ee
refactor(vector-stores): extract _fetch_and_authorize_vector_store he…
stuxf Apr 25, 2026
294ac83
fix(vector-stores): recurse into nested litellm_params; handle JSON-s…
stuxf Apr 25, 2026
4d92bc8
fix(vector-stores): re-raise HTTPException from get_vector_store_info…
stuxf Apr 25, 2026
3f5c589
fix(bedrock): add 1-hour cache write tier for Claude 4.5/4.6/4.7 (Glo…
cursoragent Apr 29, 2026
4cecfec
feat(proxy): LiteLLM headers on Google native generateContent routes …
Sameerlite Apr 29, 2026
295a36a
Merge pull request #26685 from BerriAI/litellm_bedrock_retrievalconfi…
mateo-berri Apr 29, 2026
97a3bd5
Merge pull request #26733 from BerriAI/litellm_mcp-short-prefix-id-0e42
mateo-berri Apr 29, 2026
55c3129
fix(proxy/batches): forward model to retrieve_batch for bedrock
sruthi-sixt-26 Apr 29, 2026
602a6cf
Merge pull request #26756 from BerriAI/litellm_prisma_reconnect_harde…
yuneng-berri Apr 29, 2026
4f6192a
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 29, 2026
4b9505b
fix: address Cursor Bugbot findings on PR #26691
cursoragent Apr 29, 2026
b5b0708
Update get_team_member_default_budget docstring for NULL fallback
Apr 29, 2026
0166992
fix(proxy): contain UI_LOGO_PATH and LITELLM_FAVICON_URL to allowed a…
stuxf Apr 29, 2026
9ef8572
fix(proxy): /get_logo_url no longer discloses local UI_LOGO_PATH
stuxf Apr 29, 2026
4f751fd
fix(proxy): also accept LITELLM_ASSETS_PATH for /get_favicon local path
stuxf Apr 29, 2026
08d35f6
Merge pull request #26662 from BerriAI/litellm_spendLogsErrorRedaction
Michael-RZ-Berri Apr 29, 2026
9bc317b
Merge pull request #26584 from BerriAI/litellm_mcp-oauth-azure-entra-…
mateo-berri Apr 29, 2026
1b6ab9f
Merge branch 'litellm_internal_staging' into litellm_oss_staging
cursoragent Apr 29, 2026
55d393d
fix(static-assets): unblock CI — pass headers explicitly + harden + u…
stuxf Apr 29, 2026
2ccb4b9
fix(proxy/auth): gate guardrail modification check on key presence
ryan-crabbe-berri Apr 29, 2026
75d1a01
fix(static-assets): use async_safe_get; drop SVG; serve bytes inline …
stuxf Apr 29, 2026
c112bdf
chore(static-assets): /simplify pass — top-level Response import + cl…
stuxf Apr 29, 2026
a291cc6
fix: drop sensitive locals from re-raised error messages
ryan-crabbe-berri Apr 29, 2026
f3fd79b
fix: trim caller-supplied dicts from compile_prompt error message
ryan-crabbe-berri Apr 29, 2026
89aa13f
fix(static-assets): also wrap admin-only Vault token verification in …
stuxf Apr 29, 2026
1277cbe
Add health status pagination controls
shivamrawat1 Apr 29, 2026
14473ed
fix(static-assets): ruff F811 — drop duplicate Response import
stuxf Apr 29, 2026
fc0cc9c
Merge pull request #26225 from BerriAI/litellm_dbReconnectNonBlocking
yuneng-berri Apr 29, 2026
148485c
fix(passthrough): default auth=True; drop enterprise gate on the safe…
stuxf Apr 29, 2026
7c4ef97
fix(passthrough): drop now-unused CommonProxyErrors top-level import
stuxf Apr 29, 2026
2461139
fix(proxy): inherit caller identity in passthrough batch managed-object
ryan-crabbe-berri Apr 29, 2026
0b9d06a
Fix model e2e result count locator
shivamrawat1 Apr 29, 2026
a7a3f0a
Address health pagination review feedback
shivamrawat1 Apr 29, 2026
4a7af1f
feat(proxy): durable agent workflow run tracking via /v1/workflows/ru…
ishaan-berri Apr 30, 2026
88d8a80
tighten cli sso session flow
stuxf Apr 30, 2026
181e99b
Fix health pagination review issues
shivamrawat1 Apr 30, 2026
0f8dd28
lazy-load optional feature routers on first request
Apr 25, 2026
adcab43
swagger: stub-inject unloaded lazy features and warm on dropdown expand
Apr 28, 2026
1b9d216
add openapi snapshotting to CI pipeline
Apr 29, 2026
b3f3b11
address greptile fixes: shared _loaded state, auth on /lazy/warm, pin…
Apr 29, 2026
de75cd7
test_proxy_routes: dedupe lazy force-load to match vector_store test …
Apr 29, 2026
466ce9d
fix ruff: APIRouter type-checking import, replace print with sys.std*…
Apr 30, 2026
2612187
fix cli auth test expectations
stuxf Apr 30, 2026
19ca420
cover cli sso start validation
stuxf Apr 30, 2026
f3000bd
chore(mcp): encrypt user-scoped credentials at rest
stuxf Apr 30, 2026
dedaf74
chore(auth): tighten clientside api_base handling (#26518)
stuxf Apr 30, 2026
d7431c9
Merge pull request #26823 from BerriAI/litellm_fix-error-message-reda…
ryan-crabbe-berri Apr 30, 2026
6293252
harden cli sso review findings
stuxf Apr 30, 2026
c76c300
fix(mcp): address Greptile P2s on credential encoding helpers
stuxf Apr 30, 2026
8af0544
chore(mcp): tighten OAuth root endpoint resolution
stuxf Apr 30, 2026
8205e24
chore(auth): harden invite-link onboarding token flow
stuxf Apr 30, 2026
e0b32eb
fix(mcp): re-encrypt user credentials during master-key rotation
stuxf Apr 30, 2026
5975d69
test(vertex-batches): set is_redirect=False on mocked retrieve response
yuneng-berri Apr 30, 2026
1557b1f
Merge pull request #26844 from BerriAI/litellm_fix_vertex_retrieve_sa…
yuneng-berri Apr 30, 2026
20b937d
chore(auth): address onboarding review follow-ups
stuxf Apr 30, 2026
d20d444
chore(auth): drop generated dashboard output
stuxf Apr 30, 2026
00d71f5
Merge pull request #26489 from stuxf/fix/vector-store-list-cred-leak
yuneng-berri Apr 30, 2026
c6c546b
Merge pull request #26484 from stuxf/fix/master-key-pass-the-hash
yuneng-berri Apr 30, 2026
2e561bd
Merge pull request #26463 from stuxf/fix/mcp-routing-auth
yuneng-berri Apr 30, 2026
1ef034b
fix(passthrough): flush spend tracking on interrupted Bedrock streams
cursoragent Apr 28, 2026
8759413
refactor: trim explanatory comments from streaming-flush fix
cursoragent Apr 28, 2026
3791abf
fix(passthrough): log when streaming spend-tracking flush fails to sc…
cursoragent Apr 28, 2026
df62dd8
chore(mcp): SSRF guard on OAuth metadata discovery follow-up fetches
stuxf Apr 30, 2026
383bf12
Merge pull request #26809 from BerriAI/litellm_teamMemberNullBudgetFa…
yuneng-berri Apr 30, 2026
7c8e958
Merge pull request #26831 from BerriAI/litellm_fix-passthrough-batch-…
ryan-crabbe-berri Apr 30, 2026
b1b98c3
Merge pull request #26821 from BerriAI/litellm_fix-guardrail-auth-check
ryan-crabbe-berri Apr 30, 2026
1005fcd
[Fix] CI/Tooling: Correct min-release-age value in .npmrc files
yuneng-berri Apr 30, 2026
f2f1e3a
chore(proxy): block env callback refs in key metadata
stuxf Apr 30, 2026
b514f22
Merge pull request #26850 from BerriAI/litellm_fix_npmrc_min_release_age
yuneng-berri Apr 30, 2026
4d056a1
test(proxy): cover callback env metadata rejection
stuxf Apr 30, 2026
1bb04cd
fix(mcp): close redirect bypass + empty-getaddrinfo gap on SSRF guard
stuxf Apr 30, 2026
ff24d2a
Merge pull request #26800 from BerriAI/litellm_bedrock-anthropic-1hr-…
Sameerlite Apr 30, 2026
6588564
Merge pull request #26691 from BerriAI/litellm_team_search_credential…
Sameerlite Apr 30, 2026
c0211d7
Merge pull request #26759 from BerriAI/litellm_oss_staging
Sameerlite Apr 30, 2026
22c01ad
chore(proxy): ignore invalid callback metadata rows
stuxf Apr 30, 2026
793a35d
test(prometheus): update master-key hash assertions to alias
cursoragent Apr 30, 2026
1ebb192
fix(proxy): catch callback metadata validation errors
stuxf Apr 30, 2026
26cb28e
Merge pull request #26814 from sruthi-sixt-26/fix/bedrock-batch-retrieve
Sameerlite Apr 30, 2026
e4c4d98
chore(team): close authz bypass via the available-team check
stuxf Apr 30, 2026
72674b0
test(team): add /team/permissions_update regression for available-tea…
stuxf Apr 30, 2026
d3891e6
Merge pull request #26719 from BerriAI/litellm_fix-bedrock-stream-int…
Sameerlite Apr 30, 2026
50ef2d5
Merge pull request #26855 from BerriAI/litellm_internal_staging
Sameerlite Apr 30, 2026
2c4979e
Fix review
Sameerlite Apr 30, 2026
2c11fa0
chore(static-assets): keep vault tester out of asset hardening
stuxf Apr 30, 2026
adc2c55
chore(team): audit-log team-callback admin mutations
stuxf Apr 30, 2026
986cded
fix(audit): redact callback secrets and surface fire-and-forget failures
stuxf Apr 30, 2026
842eea0
chore(proxy): harden request control fields
stuxf Apr 30, 2026
7497674
fix(proxy): sanitize redaction controls at ingress
stuxf Apr 30, 2026
7c3c9ab
test(proxy): opt mock-response fixtures into client mocks
stuxf Apr 30, 2026
119c70b
fix(proxy): gate delegated audit attribution
stuxf Apr 30, 2026
db00e67
test(proxy): cover control field hardening branches
stuxf Apr 30, 2026
697331b
fix(proxy): apply audit attribution helper consistently
stuxf Apr 30, 2026
ea4e83e
fix(proxy): keep mcp audit attribution typed
stuxf Apr 30, 2026
c52be31
fix(logging): redact standard logging choice metadata
stuxf Apr 30, 2026
09c4d0d
fix(proxy): gate redaction opt out controls
stuxf Apr 30, 2026
609454d
Merge pull request #26852 from BerriAI/litellm_oss_staging
mateo-berri Apr 30, 2026
3bbb5c7
Remove dead _transform_response_for_json_mode wrapper
mateo-berri Apr 30, 2026
f48dfdb
fix(proxy): require opt in for audit header fallback
stuxf Apr 30, 2026
b5df9d9
test(vertex_ai): add e2e tests for rerank userLabels propagation
mateo-berri Apr 30, 2026
215f538
fix(static-assets): browser-load remote branding assets
stuxf Apr 30, 2026
b8a141c
fix(static-assets): stop serving stale logo cache
stuxf Apr 30, 2026
d47948a
fix: validate aws region name
yassinkortam Apr 30, 2026
21c7864
Fix Vertex label metadata fallback
cursoragent Apr 30, 2026
d51d96f
Merge pull request #26859 from stuxf/chore/audit-log-team-callback-mu…
yuneng-berri Apr 30, 2026
b67a81d
test(proxy): align favicon remote asset expectations
stuxf Apr 30, 2026
0efa8b8
Merge pull request #26854 from stuxf/fix/team-authz-available-team-by…
yuneng-berri Apr 30, 2026
dfc080f
fix: drop milvus dbName and partitionNames from MILVUS_OPTIONAL_PARAMS
yassinkortam Apr 30, 2026
a9db887
Merge pull request #26843 from stuxf/codex/fix-onboarding-invite-token
yuneng-berri Apr 30, 2026
3c06036
Merge pull request #26840 from stuxf/codex/mcp-oauth-root-visibility
yuneng-berri Apr 30, 2026
51a3e90
fix(mcp): reuse safe URL fetch for OAuth discovery
stuxf Apr 30, 2026
d84b35c
Merge pull request #26906 from BerriAI/litellm_fix/validate-aws-region
yassin-berriai Apr 30, 2026
08541f4
Merge pull request #26910 from BerriAI/litellm_fix/drop-milvus-db-params
yuneng-berri Apr 30, 2026
9637d8c
Merge pull request #26802 from BerriAI/litellm_lazyLoadedFrontPage
Michael-RZ-Berri Apr 30, 2026
aa76ab2
Merge pull request #26862 from stuxf/codex/control-field-sanitization
yuneng-berri Apr 30, 2026
4ff8f0e
Merge pull request #26851 from stuxf/codex/fix-callback-env-secret-re…
yuneng-berri Apr 30, 2026
174c770
Merge pull request #26836 from stuxf/fix/byok-credential-encryption
yuneng-berri Apr 30, 2026
256e05e
Merge pull request #26849 from stuxf/fix/mcp-oauth-discovery-ssrf
yuneng-berri Apr 30, 2026
47b2832
test: replace subprocess startup-import diff with static source scan
Apr 30, 2026
e810d87
Merge pull request #26934 from BerriAI/litellm_lazyStartupTestFix
Michael-RZ-Berri Apr 30, 2026
053e040
run pre_call_hook on Google generateContent endpoints
Apr 30, 2026
be0e991
[Test] Proxy E2E: Opt In To Client Mock Response For Model Access Tests
yuneng-berri May 1, 2026
71d5015
Merge pull request #26827 from stuxf/fix/passthrough-auth-default
yuneng-berri May 1, 2026
15b7386
Merge pull request #26815 from stuxf/fix/get-image-lfi-ssrf
yuneng-berri May 1, 2026
bdcc238
Merge pull request #26835 from stuxf/codex/cli-sso-flow-binding
yuneng-berri May 1, 2026
326bcd6
Merge pull request #26941 from BerriAI/litellm_/stoic-jemison-cbb6cf
yuneng-berri May 1, 2026
bd63824
[Fix] Responses API: Omit Empty Body On DELETE
yuneng-berri May 1, 2026
76e43b7
Merge pull request #26949 from BerriAI/litellm_/condescending-hawking…
ryan-crabbe-berri May 1, 2026
9f08db9
Refresh Redis TTL on counter writes and skip stale in-memory on Redis…
Apr 29, 2026
fed5f36
Invalidate spend counters on budget reset
Apr 29, 2026
ff2a938
Match docstring style on async_increment_cache
Apr 29, 2026
4e26835
Reorder counter invalidation to run after DB write
Apr 30, 2026
e4fb325
Merge pull request #26914 from BerriAI/litellm_googleGenContentHooks
Michael-RZ-Berri May 1, 2026
05e6402
Merge pull request #26829 from BerriAI/litellm_budgetEnforcementMultiPod
Michael-RZ-Berri May 1, 2026
ebbe2f4
Merge pull request #26826 from BerriAI/litellm_health_status_pagination
yuneng-berri May 1, 2026
72ddbce
Merge pull request #25499 from BerriAI/litellm_vertex_request_metadat…
Sameerlite May 1, 2026
efa33bf
Merge pull request #26222 from BerriAI/litellm_anthropic-json-mode-no…
Sameerlite May 1, 2026
dd549d9
bump: version 0.4.69 → 0.4.70
yuneng-berri May 1, 2026
6da13ef
uv lock
yuneng-berri May 1, 2026
9397409
Merge pull request #26961 from BerriAI/yj_bump_apr30
shin-berri May 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions .github/workflows/check-lazy-openapi-snapshot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
name: Check Lazy OpenAPI Snapshot

on:
pull_request:
branches:
- main
- litellm_internal_staging
- "litellm_**"

permissions:
contents: read
checks: write

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
verify:
runs-on: ubuntu-latest
timeout-minutes: 10
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 --all-groups --all-extras

- name: Regenerate snapshot to /tmp
id: regen
run: |
cp litellm/proxy/_lazy_openapi_snapshot.json /tmp/snapshot.committed.json
uv run --no-sync python -m litellm.proxy._lazy_openapi_snapshot
mv litellm/proxy/_lazy_openapi_snapshot.json /tmp/snapshot.fresh.json
mv /tmp/snapshot.committed.json litellm/proxy/_lazy_openapi_snapshot.json

- name: Compare
id: diff
continue-on-error: true
run: |
diff -q /tmp/snapshot.fresh.json litellm/proxy/_lazy_openapi_snapshot.json

- name: Mark neutral if drift
if: steps.diff.outcome == 'failure'
uses: LouisBrunner/checks-action@6b626ffbad7cc56fd58627f774b9067e6118af23 # v2.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
name: lazy-openapi-snapshot
conclusion: neutral
output: |
{
"title": "Lazy openapi snapshot is stale",
"summary": "Run `python -m litellm.proxy._lazy_openapi_snapshot` and commit the regenerated `litellm/proxy/_lazy_openapi_snapshot.json`. Not blocking — the snapshot will regenerate at release if not committed."
}
8 changes: 4 additions & 4 deletions .github/workflows/create-release-branch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
tag:
description: "Release tag (e.g. v1.83.0-stable) — branch will be named release/<tag>"
description: "Release tag (e.g. 1.84.0, 1.84.0rc1, 1.84.0.dev42, 1.84.0.post1; legacy v1.83.10-stable still accepted) — branch will be named release/<tag>"
required: true
type: string
commit_hash:
Expand All @@ -14,7 +14,7 @@ on:
workflow_call:
inputs:
tag:
description: "Release tag"
description: "Release tag (e.g. 1.84.0, 1.84.0rc1, 1.84.0.dev42, 1.84.0.post1; legacy v1.83.10-stable still accepted)"
required: true
type: string
commit_hash:
Expand All @@ -40,8 +40,8 @@ jobs:
echo "::error::commit_hash must be a full 40-character commit SHA"
exit 1
fi
if ! echo "${TAG}" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+'; then
echo "::error::tag must start with vX.Y.Z"
if ! echo "${TAG}" | grep -qE '^v?[0-9]+\.[0-9]+\.[0-9]+'; then
echo "::error::tag must start with X.Y.Z (optional leading v), e.g. 1.84.0, 1.84.0rc1, 1.84.0.dev42, or v1.83.10-stable"
exit 1
fi

Expand Down
13 changes: 9 additions & 4 deletions .github/workflows/create-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
tag:
description: "Release tag (e.g. v1.83.0-stable)"
description: "Release tag (e.g. 1.84.0, 1.84.0rc1, 1.84.0.dev42, 1.84.0.post1; legacy v1.83.10-stable still accepted)"
required: true
type: string
commit_hash:
Expand All @@ -30,8 +30,8 @@ jobs:
echo "::error::commit_hash must be a full 40-character commit SHA"
exit 1
fi
if ! echo "${TAG}" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+'; then
echo "::error::tag must start with vX.Y.Z"
if ! echo "${TAG}" | grep -qE '^v?[0-9]+\.[0-9]+\.[0-9]+'; then
echo "::error::tag must start with X.Y.Z (optional leading v), e.g. 1.84.0, 1.84.0rc1, 1.84.0.dev42, or v1.83.10-stable"
exit 1
fi

Expand All @@ -45,6 +45,11 @@ jobs:
const tag = process.env.TAG;
const commitHash = process.env.COMMIT_HASH;

// Mark RC / dev / nightly / alpha / beta tags as GitHub pre-releases.
// PEP 440 post-releases (e.g. `1.84.0.post1`) and legacy `-stable[.patch.N]`
// are stable maintenance releases, not pre-releases.
const isPrerelease = /(?:rc|nightly|alpha|beta|\.dev)/i.test(tag);

const cosignSection = [
`## Verify Docker Image Signature`,
``,
Expand Down Expand Up @@ -89,7 +94,7 @@ jobs:
target_commitish: commitHash,
name: tag,
owner: context.repo.owner,
prerelease: false,
prerelease: isPrerelease,
repo: context.repo.repo,
tag_name: tag,
});
Expand Down
2 changes: 1 addition & 1 deletion .npmrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
# Packages needing lifecycle scripts: npm rebuild <pkg>
ignore-scripts=true
# Protects local npm install only — npm ci (used in CI) ignores this
min-release-age=3d
min-release-age=3
2 changes: 1 addition & 1 deletion litellm-js/proxy/.npmrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
# Packages needing lifecycle scripts: npm rebuild <pkg>
ignore-scripts=true
# Protects local npm install only — npm ci (used in CI) ignores this
min-release-age=3d
min-release-age=3
2 changes: 1 addition & 1 deletion litellm-js/spend-logs/.npmrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
# Packages needing lifecycle scripts: npm rebuild <pkg>
ignore-scripts=true
# Protects local npm install only — npm ci (used in CI) ignores this
min-release-age=3d
min-release-age=3
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- Search tool allowlists live on LiteLLM_ObjectPermissionTable (with agents, MCP, vector stores).
ALTER TABLE "LiteLLM_ObjectPermissionTable" ADD COLUMN IF NOT EXISTS "search_tools" TEXT[] DEFAULT ARRAY[]::TEXT[];
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
-- CreateTable
CREATE TABLE "LiteLLM_WorkflowRun" (
"run_id" TEXT NOT NULL,
"session_id" TEXT NOT NULL,
"workflow_type" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'pending',
"created_by" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
"input" JSONB,
"output" JSONB,
"metadata" JSONB,

CONSTRAINT "LiteLLM_WorkflowRun_pkey" PRIMARY KEY ("run_id")
);

-- CreateTable
CREATE TABLE "LiteLLM_WorkflowEvent" (
"event_id" TEXT NOT NULL,
"run_id" TEXT NOT NULL,
"event_type" TEXT NOT NULL,
"step_name" TEXT NOT NULL,
"sequence_number" INTEGER NOT NULL,
"data" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

CONSTRAINT "LiteLLM_WorkflowEvent_pkey" PRIMARY KEY ("event_id")
);

-- CreateTable
CREATE TABLE "LiteLLM_WorkflowMessage" (
"message_id" TEXT NOT NULL,
"run_id" TEXT NOT NULL,
"role" TEXT NOT NULL,
"content" TEXT NOT NULL,
"sequence_number" INTEGER NOT NULL,
"session_id" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

CONSTRAINT "LiteLLM_WorkflowMessage_pkey" PRIMARY KEY ("message_id")
);

-- CreateIndex
CREATE UNIQUE INDEX "LiteLLM_WorkflowRun_session_id_key" ON "LiteLLM_WorkflowRun"("session_id");

-- CreateIndex
CREATE INDEX "LiteLLM_WorkflowRun_workflow_type_status_idx" ON "LiteLLM_WorkflowRun"("workflow_type", "status");

-- CreateIndex
CREATE INDEX "LiteLLM_WorkflowRun_session_id_idx" ON "LiteLLM_WorkflowRun"("session_id");

-- CreateIndex
CREATE INDEX "LiteLLM_WorkflowRun_created_at_idx" ON "LiteLLM_WorkflowRun"("created_at");

-- CreateIndex
CREATE INDEX "LiteLLM_WorkflowRun_created_by_idx" ON "LiteLLM_WorkflowRun"("created_by");

-- CreateIndex
CREATE INDEX "LiteLLM_WorkflowEvent_run_id_idx" ON "LiteLLM_WorkflowEvent"("run_id");

-- CreateIndex
CREATE UNIQUE INDEX "LiteLLM_WorkflowEvent_run_id_sequence_number_key" ON "LiteLLM_WorkflowEvent"("run_id", "sequence_number");

-- CreateIndex
CREATE INDEX "LiteLLM_WorkflowMessage_run_id_idx" ON "LiteLLM_WorkflowMessage"("run_id");

-- CreateIndex
CREATE UNIQUE INDEX "LiteLLM_WorkflowMessage_run_id_sequence_number_key" ON "LiteLLM_WorkflowMessage"("run_id", "sequence_number");

-- AddForeignKey
ALTER TABLE "LiteLLM_WorkflowEvent" ADD CONSTRAINT "LiteLLM_WorkflowEvent_run_id_fkey" FOREIGN KEY ("run_id") REFERENCES "LiteLLM_WorkflowRun"("run_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "LiteLLM_WorkflowMessage" ADD CONSTRAINT "LiteLLM_WorkflowMessage_run_id_fkey" FOREIGN KEY ("run_id") REFERENCES "LiteLLM_WorkflowRun"("run_id") ON DELETE RESTRICT ON UPDATE CASCADE;

78 changes: 78 additions & 0 deletions litellm-proxy-extras/litellm_proxy_extras/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ model LiteLLM_ObjectPermissionTable {
models String[] @default([])
blocked_tools String[] @default([]) // Tool names blocked for any key/team/user with this permission
mcp_toolsets String[] @default([]) // Toolset IDs granted to this key/team/user
search_tools String[] @default([]) // search_tool_name values this key/team/user may call
teams LiteLLM_TeamTable[]
projects LiteLLM_ProjectTable[]
verification_tokens LiteLLM_VerificationToken[]
Expand Down Expand Up @@ -1290,3 +1291,80 @@ model LiteLLM_AdaptiveRouterSession {
@@id([session_id, router_name, model_name])
@@index([last_activity_at], map: "idx_adaptive_router_session_activity")
}

// ---------------------------------------------------------------------------
// Workflow Run Tracking
//
// Generic durable state tracking for any agent or automated workflow.
// Design: three tables — run (header + materialized status), event (append-only
// source of truth for state transitions), message (conversation inbox/outbox).
//
// Usage:
// - Set `workflow_type` to identify the owning system (e.g. "shin-builder").
// - Store domain-specific fields in `metadata` (worktree_path, pr_url, etc.).
// - `session_id` on WorkflowRun matches `x-litellm-session-id` header sent to
// the proxy — all spend logs for this run are automatically tagged.
// ---------------------------------------------------------------------------

// One instance of work being done. `status` is a materialized cache of the
// latest event; the event log is the authoritative source of truth.
model LiteLLM_WorkflowRun {
run_id String @id @default(uuid())
session_id String @unique @default(uuid())
workflow_type String
status String @default("pending")
created_by String? // user_id of the key that created this run; null = created by master key
created_at DateTime @default(now())
updated_at DateTime @updatedAt
input Json?
output Json?
metadata Json?

events LiteLLM_WorkflowEvent[]
messages LiteLLM_WorkflowMessage[]

@@index([workflow_type, status])
@@index([session_id])
@@index([created_at])
@@index([created_by])
}

// Append-only log of state transitions. Never mutate rows here.
// `step_name` and `event_type` are caller-defined strings — no hardcoded enums.
// Status auto-update rules (applied by the append endpoint):
// step.started → run.status = running
// step.failed → run.status = failed
// hook.waiting → run.status = paused
// hook.received → run.status = running
model LiteLLM_WorkflowEvent {
event_id String @id @default(uuid())
run_id String
event_type String
step_name String
sequence_number Int
data Json?
created_at DateTime @default(now())

run LiteLLM_WorkflowRun @relation(fields: [run_id], references: [run_id])

@@unique([run_id, sequence_number])
@@index([run_id])
}

// Conversation inbox/outbox — full message content, separate from the durable
// event log. Spend logs truncate messages; this table stores them in full.
// `session_id` here is the Claude --resume session ID (or similar).
model LiteLLM_WorkflowMessage {
message_id String @id @default(uuid())
run_id String
role String
content String
sequence_number Int
session_id String?
created_at DateTime @default(now())

run LiteLLM_WorkflowRun @relation(fields: [run_id], references: [run_id])

@@unique([run_id, sequence_number])
@@index([run_id])
}
4 changes: 2 additions & 2 deletions litellm-proxy-extras/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "litellm-proxy-extras"
version = "0.4.69"
version = "0.4.70"
description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package."
readme = "README.md"
requires-python = ">=3.9"
Expand All @@ -26,7 +26,7 @@ required-version = ">=0.10.9"
module-root = ""

[tool.commitizen]
version = "0.4.69"
version = "0.4.70"
version_files = [
"pyproject.toml:^version",
"../pyproject.toml:litellm-proxy-extras==",
Expand Down
10 changes: 6 additions & 4 deletions litellm/batches/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -543,15 +543,17 @@ def _handle_retrieve_batch_providers_without_provider_config(
)
else:
raise litellm.exceptions.BadRequestError(
message="LiteLLM doesn't support {} for 'create_batch'. Only 'openai' is supported.".format(
custom_llm_provider
),
message=(
"LiteLLM doesn't support custom_llm_provider={} for 'retrieve_batch' without a `model` kwarg. "
"Supported via this path: 'openai', 'azure', 'vertex_ai', 'anthropic'. "
"'bedrock' is supported but requires `model` to be passed so the provider config can be loaded."
).format(custom_llm_provider),
model="n/a",
llm_provider=custom_llm_provider,
response=httpx.Response(
status_code=400,
content="Unsupported provider",
request=httpx.Request(method="create_thread", url="https://github.com/BerriAI/litellm"), # type: ignore
request=httpx.Request(method="retrieve_batch", url="https://github.com/BerriAI/litellm"), # type: ignore
),
)
return response
Expand Down
5 changes: 5 additions & 0 deletions litellm/caching/dual_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -392,13 +392,17 @@ async def async_increment_cache(
value: float,
parent_otel_span: Optional[Span] = None,
local_only: bool = False,
refresh_ttl: bool = False,
**kwargs,
) -> Optional[float]:
"""
Key - the key in cache

Value - float - the value you want to increment by

Refresh_ttl - bool - if True, resets the Redis TTL on every write.
Default False preserves window-style semantics.

Returns - the incremented value, or None if no cache backend is
available (in_memory_cache is None and Redis failed/is absent).
"""
Expand All @@ -415,6 +419,7 @@ async def async_increment_cache(
value,
parent_otel_span=parent_otel_span,
ttl=kwargs.get("ttl", None),
refresh_ttl=refresh_ttl,
)

return result
Expand Down
Loading
Loading