litellm breaking changes
Every breaking API change we have recorded in litellm on PyPI: 2,982 breaking changes in 70 versions. Below are its newest 6 versions, removals and renames first, each with its source.
Newest change September 23, 2026

On this page
1.100.0
- Signature changed
litellm.a2a_protocol.litellm_completion_bridge.A2ACompletionBridgeTransformation.a2a_message_to_openai_messages
Was @staticmethod def a2a_message_to_openai_messages(a2a_message: dict[str, Any]) -> list[dict[str, Any]]; now @staticmethod def a2a_message_to_openai_messages(a2a_message: Mapping[str, JsonValue]) -> list[dict[str, object]]. pypi.org - Signature changed
litellm.a2a_protocol.litellm_completion_bridge.A2ACompletionBridgeTransformation.apply_forward_metadata_to_completion_params
Was @staticmethod def apply_forward_metadata_to_completion_params(completion_params: dict[str, Any], a2a_message: dict[str, Any], params: dict[str, Any] | None = None) -> None; now @staticmethod def... pypi.org - Signature changed
litellm.a2a_protocol.litellm_completion_bridge.A2ACompletionBridgeTransformation.create_artifact_update_event
Was @staticmethod def create_artifact_update_event(ctx: A2AStreamingContext, text: str) -> dict[str, Any]; now @staticmethod def create_artifact_update_event(ctx: A2AStreamingContext, text: str) -> dict[str, object]. pypi.org - Signature changed
litellm.a2a_protocol.litellm_completion_bridge.A2ACompletionBridgeTransformation.create_status_update_event
Was @staticmethod def create_status_update_event(ctx: A2AStreamingContext, state: str, final: bool = False, message_text: str | None = None) -> dict[str, Any]; now @staticmethod def create_status_update_event(ctx: A2AStreamingContext... pypi.org - Signature changed
litellm.a2a_protocol.litellm_completion_bridge.A2ACompletionBridgeTransformation.create_task_event
Was @staticmethod def create_task_event(ctx: A2AStreamingContext) -> dict[str, Any]; now @staticmethod def create_task_event(ctx: A2AStreamingContext) -> dict[str, object]. pypi.org - Signature changed
litellm.a2a_protocol.litellm_completion_bridge.A2ACompletionBridgeTransformation.get_forward_metadata
Was @staticmethod def get_forward_metadata(a2a_message: dict[str, Any], params: dict[str, Any] | None = None) -> dict[str, Any] | None; now @staticmethod def get_forward_metadata(a2a_message: Mapping[str, JsonValue], params: Mapping[str... pypi.org - Signature changed
litellm.a2a_protocol.litellm_completion_bridge.A2ACompletionBridgeTransformation.openai_response_to_a2a_response
Was @staticmethod def openai_response_to_a2a_response(response: Any, request_id: str | None = None) -> dict[str, Any]; now @staticmethod def openai_response_to_a2a_response(response: ModelResponse | CustomStreamWrapper, request_id: str |... pypi.org - Signature changed
litellm.a2a_protocol.litellm_completion_bridge.handler.A2AStreamingContext.__init__
Was def __init__(self, request_id: str, input_message: dict[str, Any]); now def __init__(self, request_id: str, input_message: Mapping[str, JsonValue]). pypi.org - Signature changed
litellm.A2AConfig.transform_response
Was def transform_response(self, model: str, raw_response: httpx.Response, model_response: ModelResponse, logging_obj: Any, request_data: dict, messages: list[AllMessageValues], optional_params: dict, litellm_params: dict, encoding: Any... pypi.org - Signature changed
litellm.acompletion
Was async def acompletion(model: str, messages: list = [], functions: list | None = None, function_call: str | None = None, timeout: float | None = None, temperature: float | None = None, top_p: float | None = None, n: int | None = None... pypi.org
And 244 more in this version.
1.100.0-rc.1
- Behavior changed
Logging callbacks now receive a null end user when none is set rather than a substituted value. Code that expects a non-null end user in callbacks must handle null. github.com
1.100.0-dev.2
- Removed
GET .health
The GET /health response no longer includes credential fields. Code that reads them from this output will stop getting them. github.com - Removed
router_model_name
Auto-routed responses no longer include the router_model_name field. Code that reads it must stop relying on it. github.com - Behavior changed
Adding a model now enforces rpm/tpm settings, so requests that previously succeeded without them may now be rejected. github.com - Behavior changed
prompt_data
Keyed prompt_data combined with prompt_id is now rejected instead of accepted. Callers must send only one of them. github.com - Configuration changed
complexity_router_config
Complexity-router settings written outside complexity_router_config are now rejected. Move them inside that block. github.com
1.100.0-dev.1
- Removed
prompt_token_calculator
prompt_token_calculator is removed in this release, so code that imports or calls it must stop using it. github.com - Behavior changed
get_supported_openai_params
get_supported_openai_params for Cerebras now reports max_retries and extra_headers as supported parameters, which changes what callers see. github.com - Default changed
Default endpoints now point to api.together.ai instead of api.together.xyz, so code relying on the old default host must set its endpoint explicitly. github.com
1.99.2
- Signature changed
litellm.integrations.otel.LLMUsage.__init__
Was def __init__(self, input_tokens: int | None = None, output_tokens: int | None = None, total_tokens: int | None = None) -> None; now def __init__(self, input_tokens: int | None = None, output_tokens: int | None = None, total_tokens: int... pypi.org
1.99.0
- Signature changed
litellm.a2a_protocol.providers.watsonx_orchestrate.config.WatsonxOrchestrateHandler.handle_non_streaming
Was @staticmethod async def handle_non_streaming(request_id: str, params: dict[str, Any], litellm_params: dict[str, Any]) -> dict[str, Any]; now @staticmethod async def handle_non_streaming(request_id: str, params: dict[str, object]... pypi.org - Signature changed
litellm.a2a_protocol.providers.watsonx_orchestrate.config.WatsonxOrchestrateHandler.handle_streaming
Was @staticmethod async def handle_streaming(request_id: str, params: dict[str, Any], litellm_params: dict[str, Any], chunk_size: int = 50, delay_ms: int = 10) -> AsyncIterator[dict[str, Any]]; now @staticmethod async def... pypi.org - Signature changed
litellm.acompletion
Was async def acompletion(model: str, messages: list = [], functions: list | None = None, function_call: str | None = None, timeout: float | None = None, temperature: float | None = None, top_p: float | None = None, n: int | None = None... pypi.org - Signature changed
litellm.acreate_container
Was async def acreate_container(name: str, expires_after: dict[str, Any] | None = None, file_ids: list[str] | None = None, timeout=600, custom_llm_provider: Literal['openai', 'azure', 'azure_text'] = 'openai', extra_headers: dict[str, Any]... pypi.org - Signature changed
litellm.adelete_container
Was async def adelete_container(container_id: str, timeout=600, custom_llm_provider: Literal['openai', 'azure', 'azure_text'] = 'openai', extra_headers: dict[str, Any] | None = None, extra_query: dict[str, Any] | None = None, extra_body... pypi.org - Signature changed
litellm.alist_container_files
Was async def alist_container_files(container_id: str, after: str | None = None, limit: int | None = None, order: str | None = None, timeout=600, custom_llm_provider: Literal['openai', 'azure', 'azure_text'] = 'openai', extra_headers... pypi.org - Signature changed
litellm.alist_containers
Was async def alist_containers(after: str | None = None, limit: int | None = None, order: str | None = None, timeout=600, custom_llm_provider: Literal['openai', 'azure', 'azure_text'] = 'openai', extra_headers: dict[str, Any] | None =... pypi.org - Signature changed
litellm.AnthropicConfig.calculate_usage
Was def calculate_usage(self, usage_object: dict, reasoning_content: str | None, completion_response: dict | None = None, speed: str | None = None) -> Usage; now def calculate_usage(self, usage_object: Mapping[str, Any], reasoning_content... pypi.org - Signature changed
litellm.aretrieve_container
Was async def aretrieve_container(container_id: str, timeout=600, custom_llm_provider: Literal['openai', 'azure', 'azure_text'] = 'openai', extra_headers: dict[str, Any] | None = None, extra_query: dict[str, Any] | None = None, extra_body... pypi.org - Signature changed
litellm.aupload_container_file
Was async def aupload_container_file(container_id: str, file: FileTypes, timeout=600, custom_llm_provider: Literal['openai', 'azure', 'azure_text'] = 'openai', extra_headers: dict[str, Any] | None = None, extra_query: dict[str, Any] | None... pypi.org
And 96 more in this version.
Check your code
These are the changes. To see which of them reach your code, scan a public repository, or have your coding agent call check_code with your manifest or lockfile over MCP. The API reads every change in every version, not only the newest. On Team and up, a fix pull request opens for the changes that reach a connected repository. Nothing merges or deploys.

Put your code on continuous management.
Scan a public repository now, or give your agent one line.
See how out of date your code is.
Tell your agent what changed since it was trained.
claude mcp add --transport http since https://api.since.dev/mcp