Skip to main content
LiteLLM is moving to Rust Read the latest updates.

v1.103.3 - Safer Database Migrations, Streamed Alias Spend and Dependency Updates

Deploy this version​

docker run \
-e LITELLM_MASTER_KEY=sk-<paste-a-long-random-key> \
-e DATABASE_URL=postgresql://<user>:<password>@<host>:5432/<dbname> \
-e STORE_MODEL_IN_DB=True \
-p 4000:4000 \
docker.litellm.ai/berriai/litellm:1.103.3

This release is published as ghcr.io/berriai/litellm:v1.103.3. See the GitHub release and the full releases page

Breaking Changes

The proxy exits when database setup fails at startup instead of serving against an outdated schema. Set ENFORCE_PRISMA_MIGRATION_CHECK=false to keep the old behavior. See PR #44205

Upgrading from v1.102.x or earlier

The two LiteLLM_SpendLogs index migrations from v1.103.0 are now no-ops. Build the indexes online yourself, outside a transaction:

CREATE INDEX CONCURRENTLY IF NOT EXISTS "LiteLLM_SpendLogs_api_key_startTime_idx" ON "LiteLLM_SpendLogs"("api_key", "startTime");
CREATE INDEX CONCURRENTLY IF NOT EXISTS "LiteLLM_SpendLogs_litellm_call_id_idx" ON "LiteLLM_SpendLogs"("litellm_call_id");

v1.103.3 is a patch release on top of v1.103.2. Startup exits on database setup failure, the LiteLLM_SpendLogs index migrations no longer build anything, streamed requests through an alias are billed correctly, and the base image and several dependencies are bumped. The v1.103.3 tag points at ecae261

Bug fixes​

Streamed chat completions through a dotted alias like claude-opus-4.6 recorded $0 spend, because pricing looked up the alias instead of the deployment's model. Streamed requests are now priced from the deployment's model, the same way as non-streamed ones, and logged streamed responses still show the alias. An alias that points at a deployment with no pricing now records $0 on streamed requests too, matching the non-streamed behavior. See PR #44341

Chat replies bridged from the Responses API put the tool calls in a separate choices[1], so apps that read only choices[0] never ran the tool. choices[0] now carries both the text and the tool calls with finish_reason: "tool_calls". See PR #44346

What's Changed​

  • Startup exits on database setup failure, and the LiteLLM_SpendLogs index migrations no longer build anything - PR #44205, PR #44286
  • fix(proxy): stamp the client alias on a copy of each streamed chunk so pricing sees the deployment model - PR #44341
  • fix(responses): merge bridged tool calls into the same choice as the text - PR #44346
  • Bump wolfi-base digest to pick up glibc 2.44-r6 - PR #42643
  • Dependency bumps: pyjwt, pypdf, tornado, urllib3, gitpython, litellm-proxy-extras 0.4.100.post1 - PR #44352, PR #44225
  • test(e2e): move the Together structured-output and text-completion tests to models that still answer - PR #44437

Full Changelog​

https://github.com/BerriAI/litellm/compare/v1.103.2...v1.103.3

LiteLLM Enterprise
SSO/SAML, audit logs, spend tracking, multi-team management, and guardrails, built for production.
Learn more →