---
title: "litellm Breaking Changes on PyPI | Since.dev"
description: "What each litellm release removed, renamed or changed: 2,982 breaking changes in 70 versions on PyPI, each with its source."
canonical_url: https://since.dev/packages/pypi/litellm
last_updated: 2026-09-23
---

# 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

## 1.100.0

254 breaking changes, first published September 6, 2026.

- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)
- **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](https://pypi.org/project/litellm/1.100.0/)

And 244 more in this version.

## 1.100.0-rc.1

1 breaking change, first published September 6, 2026.

- **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](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-rc.1)

## 1.100.0-dev.2

5 breaking changes, first published September 6, 2026.

- **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](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.2)
- **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](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.2)
- **Behavior changed**  

Adding a model now enforces rpm/tpm settings, so requests that previously succeeded without them may now be rejected. [github.com](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.2)
- **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](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.2)
- **Configuration changed** `complexity_router_config`  

Complexity-router settings written outside complexity_router_config are now rejected. Move them inside that block. [github.com](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.2)

## 1.100.0-dev.1

3 breaking changes, first published September 6, 2026.

- **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](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.1)
- **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](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.1)
- **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](https://github.com/BerriAI/litellm/releases/tag/v1.100.0-dev.1)

## 1.99.2

1 breaking change, first published September 23, 2026.

- **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](https://pypi.org/project/litellm/1.99.2/)

## 1.99.0

106 breaking changes, first published September 1, 2026.

- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)
- **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](https://pypi.org/project/litellm/1.99.0/)

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](https://since.dev/scan.md), or have your coding agent call `check_code` with your manifest or lockfile over [MCP](https://since.dev/docs.md#mcp). [The API](https://since.dev/docs.md#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.

[Scan a repository](https://since.dev/scan.md). Any public GitHub repository. No sign-in.

### Tell your agent what changed since it was trained.

`claude mcp add --transport http since https://api.since.dev/mcp`

---

Every page on this site as Markdown: https://since.dev/sitemap.md. For agents: https://since.dev/llms.txt.
