diff --git a/docs/my-website/blog/claude_opus_4_6/index.md b/docs/my-website/blog/claude_opus_4_6/index.md
index 0397f1288f..3fd7066154 100644
--- a/docs/my-website/blog/claude_opus_4_6/index.md
+++ b/docs/my-website/blog/claude_opus_4_6/index.md
@@ -223,11 +223,16 @@ curl --location 'http://0.0.0.0:4000/chat/completions' \
-## Compaction
+## Advanced Features
+
+### Compaction
+
+
+
Litellm supports enabling compaction for the new claude-opus-4-6.
-### Enabling Compaction
+**Enabling Compaction**
To enable compaction, add the `context_management` parameter with the `compact_20260112` edit type:
@@ -255,8 +260,43 @@ curl --location 'http://0.0.0.0:4000/chat/completions' \
```
All the parameters supported for context_management by anthropic are supported and can be directly added. Litellm automatically adds the `compact-2026-01-12` beta header in the request.
+
+
-### Response with Compaction Block
+Enable compaction to reduce context size while preserving key information. LiteLLM automatically adds the `compact-2026-01-12` beta header when compaction is enabled.
+
+:::info
+**Provider Support:** Compaction is supported on Anthropic, Azure AI, and Vertex AI. It is **not supported** on Bedrock (Invoke or Converse APIs).
+:::
+
+```bash
+curl --location 'http://0.0.0.0:4000/v1/messages' \
+--header 'x-api-key: sk-12345' \
+--header 'content-type: application/json' \
+--data '{
+ "model": "claude-opus-4-6",
+ "max_tokens": 4096,
+ "messages": [
+ {
+ "role": "user",
+ "content": "Hi"
+ }
+ ],
+ "context_management": {
+ "edits": [
+ {
+ "type": "compact_20260112"
+ }
+ ]
+ }
+}'
+```
+
+
+
+
+
+**Response with Compaction Block**
The response will include the compaction summary in `provider_specific_fields.compaction_blocks`:
@@ -292,7 +332,7 @@ The response will include the compaction summary in `provider_specific_fields.co
}
```
-### Using Compaction Blocks in Follow-up Requests
+**Using Compaction Blocks in Follow-up Requests**
To continue the conversation with compaction, include the compaction block in the assistant message's `provider_specific_fields`:
@@ -340,15 +380,17 @@ curl --location 'http://0.0.0.0:4000/chat/completions' \
}'
```
-### Streaming Support
+**Streaming Support**
Compaction blocks are also supported in streaming mode. You'll receive:
- `compaction_start` event when a compaction block begins
- `compaction_delta` events with the compaction content
- The accumulated `compaction_blocks` in `provider_specific_fields`
+### Adaptive Thinking
-## Adaptive Thinking
+
+
LiteLLM supports adaptive thinking through the `reasoning_effort` parameter:
@@ -368,7 +410,37 @@ curl --location 'http://0.0.0.0:4000/chat/completions' \
}'
```
-## Effort Levels
+
+
+
+Use the `thinking` parameter with `type: "adaptive"` to enable adaptive thinking mode:
+
+```bash
+curl --location 'http://0.0.0.0:4000/v1/messages' \
+--header 'x-api-key: sk-12345' \
+--header 'content-type: application/json' \
+--data '{
+ "model": "claude-opus-4-6",
+ "max_tokens": 16000,
+ "thinking": {
+ "type": "adaptive"
+ },
+ "messages": [
+ {
+ "role": "user",
+ "content": "Explain why the sum of two even numbers is always even."
+ }
+ ]
+}'
+```
+
+
+
+
+### Effort Levels
+
+
+
Four effort levels available: `low`, `medium`, `high` (default), and `max`. Pass directly via the `output_config` parameter:
@@ -387,17 +459,253 @@ curl --location 'http://0.0.0.0:4000/chat/completions' \
"output_config": {
"effort": "medium"
}
-
}'
```
You can use reasoning effort plus output_config to have more control on the model.
-## 1M Token Context (Beta)
+
+
+
+Four effort levels available: `low`, `medium`, `high` (default), and `max`. Pass directly via the `output_config` parameter:
+
+```bash
+curl --location 'http://0.0.0.0:4000/v1/messages' \
+--header 'x-api-key: sk-12345' \
+--header 'content-type: application/json' \
+--data '{
+ "model": "claude-opus-4-6",
+ "max_tokens": 4096,
+ "messages": [
+ {
+ "role": "user",
+ "content": "Explain quantum computing"
+ }
+ ],
+ "output_config": {
+ "effort": "medium"
+ }
+}'
+```
+
+
+
+
+### 1M Token Context (Beta)
Opus 4.6 supports 1M token context. Premium pricing applies for prompts exceeding 200k tokens ($10/$37.50 per million input/output tokens). LiteLLM supports cost calculations for 1M token contexts.
-## US-Only Inference
+
+
-Available at 1.1× token pricing. LiteLLM supports this pricing model.
+To use the 1M token context window, you need to forward the `anthropic-beta` header from your client to the LLM provider.
+**Step 1: Enable header forwarding in your config**
+
+```yaml
+general_settings:
+ forward_client_headers_to_llm_api: true
+```
+
+**Step 2: Send requests with the beta header**
+
+```bash
+curl --location 'http://0.0.0.0:4000/chat/completions' \
+--header 'Content-Type: application/json' \
+--header 'Authorization: Bearer $LITELLM_KEY' \
+--header 'anthropic-beta: context-1m-2025-08-07' \
+--data '{
+ "model": "claude-opus-4-6",
+ "messages": [
+ {
+ "role": "user",
+ "content": "Analyze this large document..."
+ }
+ ]
+}'
+```
+
+
+
+
+To use the 1M token context window, you need to forward the `anthropic-beta` header from your client to the LLM provider.
+
+**Step 1: Enable header forwarding in your config**
+
+```yaml
+general_settings:
+ forward_client_headers_to_llm_api: true
+```
+
+**Step 2: Send requests with the beta header**
+
+```bash
+curl --location 'http://0.0.0.0:4000/v1/messages' \
+--header 'x-api-key: sk-12345' \
+--header 'anthropic-beta: context-1m-2025-08-07' \
+--header 'content-type: application/json' \
+--data '{
+ "model": "claude-opus-4-6",
+ "max_tokens": 16000,
+ "messages": [
+ {
+ "role": "user",
+ "content": "Analyze this large document..."
+ }
+ ]
+}'
+```
+
+:::tip
+You can combine multiple beta headers by separating them with commas:
+```bash
+--header 'anthropic-beta: context-1m-2025-08-07,compact-2026-01-12'
+```
+:::
+
+
+
+
+### US-Only Inference
+
+Available at 1.1× token pricing. LiteLLM automatically tracks costs for US-only inference.
+
+
+
+
+Use the `inference_geo` parameter to specify US-only inference:
+
+```bash
+curl --location 'http://0.0.0.0:4000/chat/completions' \
+--header 'Content-Type: application/json' \
+--header 'Authorization: Bearer $LITELLM_KEY' \
+--data '{
+ "model": "claude-opus-4-6",
+ "messages": [
+ {
+ "role": "user",
+ "content": "What is the capital of France?"
+ }
+ ],
+ "inference_geo": "us"
+}'
+```
+
+LiteLLM will automatically apply the 1.1× pricing multiplier for US-only inference in cost tracking.
+
+
+
+
+Use the `inference_geo` parameter to specify US-only inference:
+
+```bash
+curl --location 'http://0.0.0.0:4000/v1/messages' \
+--header 'x-api-key: sk-12345' \
+--header 'content-type: application/json' \
+--data '{
+ "model": "claude-opus-4-6",
+ "max_tokens": 4096,
+ "messages": [
+ {
+ "role": "user",
+ "content": "What is the capital of France?"
+ }
+ ],
+ "inference_geo": "us"
+}'
+```
+
+LiteLLM will automatically apply the 1.1× pricing multiplier for US-only inference in cost tracking.
+
+
+
+
+### Fast Mode
+
+:::info
+Fast mode is **only supported on the Anthropic provider** (`anthropic/claude-opus-4-6`). It is not available on Azure AI, Vertex AI, or Bedrock.
+:::
+
+**Pricing:**
+- Standard: $5 input / $25 output per MTok
+- Fast: $30 input / $150 output per MTok (6× premium)
+
+
+
+
+```bash
+curl --location 'http://0.0.0.0:4000/chat/completions' \
+--header 'Content-Type: application/json' \
+--header 'Authorization: Bearer $LITELLM_KEY' \
+--data '{
+ "model": "claude-opus-4-6",
+ "messages": [
+ {
+ "role": "user",
+ "content": "Refactor this module..."
+ }
+ ],
+ "max_tokens": 4096,
+ "speed": "fast"
+}'
+```
+
+**Using OpenAI SDK:**
+
+```python
+import openai
+
+client = openai.OpenAI(
+ api_key="your-litellm-key",
+ base_url="http://0.0.0.0:4000"
+)
+
+response = client.chat.completions.create(
+ model="claude-opus-4-6",
+ messages=[{"role": "user", "content": "Refactor this module..."}],
+ max_tokens=4096,
+ extra_body={"speed": "fast"}
+)
+```
+
+**Using LiteLLM SDK:**
+
+```python
+from litellm import completion
+
+response = completion(
+ model="anthropic/claude-opus-4-6",
+ messages=[{"role": "user", "content": "Refactor this module..."}],
+ max_tokens=4096,
+ speed="fast"
+)
+```
+
+LiteLLM automatically tracks the higher costs for fast mode in usage and cost calculations.
+
+
+
+
+```bash
+curl --location 'http://0.0.0.0:4000/v1/messages' \
+--header 'x-api-key: sk-12345' \
+--header 'content-type: application/json' \
+--data '{
+ "model": "claude-opus-4-6",
+ "max_tokens": 4096,
+ "speed": "fast",
+ "messages": [
+ {
+ "role": "user",
+ "content": "Refactor this module..."
+ }
+ ]
+}'
+```
+
+LiteLLM automatically:
+- Adds the `fast-mode-2026-02-01` beta header
+- Tracks the 6× premium pricing in cost calculations
+
+
+
diff --git a/litellm/anthropic_beta_headers_config.json b/litellm/anthropic_beta_headers_config.json
index 193091c017..4ebb5ddb60 100644
--- a/litellm/anthropic_beta_headers_config.json
+++ b/litellm/anthropic_beta_headers_config.json
@@ -13,7 +13,8 @@
"web-fetch-2025-09-10",
"code-execution-2025-08-25",
"skills-2025-10-02",
- "files-api-2025-04-14"
+ "files-api-2025-04-14",
+ "fast-mode-2026-02-01"
],
"bedrock": [
"advanced-tool-use-2025-11-20",
@@ -22,7 +23,9 @@
"web-fetch-2025-09-10",
"code-execution-2025-08-25",
"skills-2025-10-02",
- "files-api-2025-04-14"
+ "files-api-2025-04-14",
+ "fast-mode-2026-02-01",
+ "mcp-servers-2025-12-04"
],
"vertex_ai": [
"prompt-caching-scope-2026-01-05"
diff --git a/litellm/llms/anthropic/chat/handler.py b/litellm/llms/anthropic/chat/handler.py
index 485e95d648..e85c0d0d01 100644
--- a/litellm/llms/anthropic/chat/handler.py
+++ b/litellm/llms/anthropic/chat/handler.py
@@ -75,6 +75,7 @@ async def make_call(
logging_obj,
timeout: Optional[Union[float, httpx.Timeout]],
json_mode: bool,
+ speed: Optional[str] = None,
) -> Tuple[Any, httpx.Headers]:
if client is None:
client = litellm.module_level_aclient
@@ -103,6 +104,7 @@ async def make_call(
streaming_response=response.aiter_lines(),
sync_stream=False,
json_mode=json_mode,
+ speed=speed,
)
# LOGGING
@@ -126,6 +128,7 @@ def make_sync_call(
logging_obj,
timeout: Optional[Union[float, httpx.Timeout]],
json_mode: bool,
+ speed: Optional[str] = None,
) -> Tuple[Any, httpx.Headers]:
if client is None:
client = litellm.module_level_client # re-use a module level client
@@ -159,7 +162,7 @@ def make_sync_call(
)
completion_stream = ModelResponseIterator(
- streaming_response=response.iter_lines(), sync_stream=True, json_mode=json_mode
+ streaming_response=response.iter_lines(), sync_stream=True, json_mode=json_mode, speed=speed
)
# LOGGING
@@ -213,6 +216,7 @@ class AnthropicChatCompletion(BaseLLM):
logging_obj=logging_obj,
timeout=timeout,
json_mode=json_mode,
+ speed=optional_params.get("speed") if optional_params else None,
)
streamwrapper = CustomStreamWrapper(
completion_stream=completion_stream,
@@ -427,6 +431,7 @@ class AnthropicChatCompletion(BaseLLM):
logging_obj=logging_obj,
timeout=timeout,
json_mode=json_mode,
+ speed=optional_params.get("speed") if optional_params else None,
)
return CustomStreamWrapper(
completion_stream=completion_stream,
@@ -485,13 +490,14 @@ class AnthropicChatCompletion(BaseLLM):
class ModelResponseIterator:
def __init__(
- self, streaming_response, sync_stream: bool, json_mode: Optional[bool] = False
+ self, streaming_response, sync_stream: bool, json_mode: Optional[bool] = False, speed: Optional[str] = None
):
self.streaming_response = streaming_response
self.response_iterator = self.streaming_response
self.content_blocks: List[ContentBlockDelta] = []
self.tool_index = -1
self.json_mode = json_mode
+ self.speed = speed
# Generate response ID once per stream to match OpenAI-compatible behavior
self.response_id = _generate_id()
@@ -541,7 +547,7 @@ class ModelResponseIterator:
def _handle_usage(self, anthropic_usage_chunk: Union[dict, UsageDelta]) -> Usage:
return AnthropicConfig().calculate_usage(
- usage_object=cast(dict, anthropic_usage_chunk), reasoning_content=None
+ usage_object=cast(dict, anthropic_usage_chunk), reasoning_content=None, speed=self.speed
)
def _content_block_delta_helper(self, chunk: dict) -> Tuple[
diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py
index 02b8d95244..82aa739018 100644
--- a/litellm/llms/anthropic/chat/transformation.py
+++ b/litellm/llms/anthropic/chat/transformation.py
@@ -190,6 +190,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
"response_format",
"user",
"web_search_options",
+ "speed",
]
if "claude-3-7-sonnet" in model or supports_reasoning(
@@ -882,6 +883,9 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
elif param == "context_management" and isinstance(value, dict):
# Pass through Anthropic-specific context_management parameter
optional_params["context_management"] = value
+ elif param == "speed" and isinstance(value, str):
+ # Pass through Anthropic-specific speed parameter for fast mode
+ optional_params["speed"] = value
## handle thinking tokens
self.update_optional_params_with_thinking_tokens(
@@ -1096,6 +1100,10 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
self._ensure_beta_header(
headers, ANTHROPIC_BETA_HEADER_VALUES.STRUCTURED_OUTPUT_2025_09_25.value
)
+ if optional_params.get("speed") == "fast":
+ self._ensure_beta_header(
+ headers, ANTHROPIC_BETA_HEADER_VALUES.FAST_MODE_2026_02_01.value
+ )
return headers
def transform_request(
@@ -1349,6 +1357,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
usage_object: dict,
reasoning_content: Optional[str],
completion_response: Optional[dict] = None,
+ speed: Optional[str] = None,
) -> Usage:
# NOTE: Sometimes the usage object has None set explicitly for token counts, meaning .get() & key access returns None, and we need to account for this
prompt_tokens = usage_object.get("input_tokens", 0) or 0
@@ -1447,6 +1456,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
else None
),
inference_geo=inference_geo,
+ speed=speed,
)
return usage
@@ -1457,6 +1467,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
model_response: ModelResponse,
json_mode: Optional[bool] = None,
prefix_prompt: Optional[str] = None,
+ speed: Optional[str] = None,
):
_hidden_params: Dict = {}
_hidden_params["additional_headers"] = process_anthropic_headers(
@@ -1553,6 +1564,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
usage_object=completion_response["usage"],
reasoning_content=reasoning_content,
completion_response=completion_response,
+ speed=speed,
)
setattr(model_response, "usage", usage) # type: ignore
@@ -1621,6 +1633,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
)
prefix_prompt = self.get_prefix_prompt(messages=messages)
+ speed = optional_params.get("speed")
model_response = self.transform_parsed_response(
completion_response=completion_response,
@@ -1628,6 +1641,7 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig):
model_response=model_response,
json_mode=json_mode,
prefix_prompt=prefix_prompt,
+ speed=speed,
)
return model_response
diff --git a/litellm/llms/anthropic/cost_calculation.py b/litellm/llms/anthropic/cost_calculation.py
index 11b61cc92f..271406f2f7 100644
--- a/litellm/llms/anthropic/cost_calculation.py
+++ b/litellm/llms/anthropic/cost_calculation.py
@@ -22,13 +22,18 @@ def cost_per_token(model: str, usage: "Usage") -> Tuple[float, float]:
Returns:
Tuple[float, float] - prompt_cost_in_usd, completion_cost_in_usd
"""
- # If usage has inference_geo, prepend it as prefix to model name
+ model_with_prefix = model
+
+ # First, prepend inference_geo if present
if hasattr(usage, "inference_geo") and usage.inference_geo and usage.inference_geo.lower() not in ["global", "not_available"]:
- model_with_geo_prefix = f"{usage.inference_geo}/{model}"
- else:
- model_with_geo_prefix = model
+ model_with_prefix = f"{usage.inference_geo}/{model_with_prefix}"
+
+ # Then, prepend speed if it's "fast"
+ if hasattr(usage, "speed") and usage.speed == "fast":
+ model_with_prefix = f"fast/{model_with_prefix}"
+
prompt_cost, completion_cost = generic_cost_per_token(
- model=model_with_geo_prefix, usage=usage, custom_llm_provider="anthropic"
+ model=model_with_prefix, usage=usage, custom_llm_provider="anthropic"
)
return prompt_cost, completion_cost
diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py
index a48d162215..7d93e18409 100644
--- a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py
+++ b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py
@@ -46,7 +46,12 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig):
"thinking",
"context_management",
"output_format",
+<<<<<<< litellm_v1_messages_claude_4_6
+ "inference_geo",
+ "speed",
+=======
"output_config",
+>>>>>>> main
# TODO: Add Anthropic `metadata` support
# "metadata",
]
@@ -184,10 +189,11 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig):
- context_management: adds 'context-management-2025-06-27'
- tool_search: adds provider-specific tool search header
- output_format: adds 'structured-outputs-2025-11-13'
+ - speed: adds 'fast-mode-2026-02-01'
Args:
headers: Request headers dict
- optional_params: Optional parameters including tools, context_management, output_format
+ optional_params: Optional parameters including tools, context_management, output_format, speed
custom_llm_provider: Provider name for looking up correct tool search header
"""
beta_values: set = set()
@@ -224,6 +230,10 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig):
if optional_params.get("output_format") is not None:
beta_values.add(ANTHROPIC_BETA_HEADER_VALUES.STRUCTURED_OUTPUT_2025_09_25.value)
+ # Check for fast mode
+ if optional_params.get("speed") == "fast":
+ beta_values.add(ANTHROPIC_BETA_HEADER_VALUES.FAST_MODE_2026_02_01.value)
+
# Check for tool search tools
tools = optional_params.get("tools")
if tools:
diff --git a/litellm/llms/azure_ai/anthropic/messages_transformation.py b/litellm/llms/azure_ai/anthropic/messages_transformation.py
index 0d00c90703..f86ec7082f 100644
--- a/litellm/llms/azure_ai/anthropic/messages_transformation.py
+++ b/litellm/llms/azure_ai/anthropic/messages_transformation.py
@@ -3,6 +3,9 @@ Azure Anthropic messages transformation config - extends AnthropicMessagesConfig
"""
from typing import TYPE_CHECKING, Any, List, Optional, Tuple
+from litellm.anthropic_beta_headers_manager import (
+ update_headers_with_filtered_beta,
+)
from litellm.llms.anthropic.experimental_pass_through.messages.transformation import (
AnthropicMessagesConfig,
)
@@ -68,6 +71,12 @@ class AzureAnthropicMessagesConfig(AnthropicMessagesConfig):
optional_params=optional_params,
)
+ # Filter out unsupported beta headers for Azure AI
+ headers = update_headers_with_filtered_beta(
+ headers=headers,
+ provider="azure_ai",
+ )
+
return headers, api_base
def get_complete_url(
diff --git a/litellm/llms/bedrock/chat/invoke_transformations/anthropic_claude3_transformation.py b/litellm/llms/bedrock/chat/invoke_transformations/anthropic_claude3_transformation.py
index c936b2cd23..31119c73d7 100644
--- a/litellm/llms/bedrock/chat/invoke_transformations/anthropic_claude3_transformation.py
+++ b/litellm/llms/bedrock/chat/invoke_transformations/anthropic_claude3_transformation.py
@@ -2,6 +2,7 @@ from typing import TYPE_CHECKING, Any, List, Optional
import httpx
+from litellm.anthropic_beta_headers_manager import filter_and_transform_beta_headers
from litellm.llms.anthropic.chat.transformation import AnthropicConfig
from litellm.llms.bedrock.chat.invoke_transformations.base_invoke_transformation import (
AmazonInvokeConfig,
@@ -133,27 +134,15 @@ class AmazonAnthropicClaudeConfig(AmazonInvokeConfig, AnthropicConfig):
beta_set.add("tool-search-tool-2025-10-19")
# Filter out beta headers that Bedrock Invoke doesn't support
- # AWS Bedrock only supports a specific whitelist of beta flags
- # Reference: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html
- BEDROCK_SUPPORTED_BETAS = {
- "computer-use-2024-10-22", # Legacy computer use
- "computer-use-2025-01-24", # Current computer use (Claude 3.7 Sonnet)
- "token-efficient-tools-2025-02-19", # Tool use (Claude 3.7+ and Claude 4+)
- "interleaved-thinking-2025-05-14", # Interleaved thinking (Claude 4+)
- "output-128k-2025-02-19", # 128K output tokens (Claude 3.7 Sonnet)
- "dev-full-thinking-2025-05-14", # Developer mode for raw thinking (Claude 4+)
- "context-1m-2025-08-07", # 1 million tokens (Claude Sonnet 4)
- "context-management-2025-06-27", # Context management (Claude Sonnet/Haiku 4.5)
- "effort-2025-11-24", # Effort parameter (Claude Opus 4.5)
- "tool-search-tool-2025-10-19", # Tool search (Claude Opus 4.5)
- "tool-examples-2025-10-29", # Tool use examples (Claude Opus 4.5)
- }
-
- # Only keep beta headers that Bedrock supports
- beta_set = {beta for beta in beta_set if beta in BEDROCK_SUPPORTED_BETAS}
+ # Uses centralized configuration from anthropic_beta_headers_config.json
+ beta_list = list(beta_set)
+ filtered_beta_list = filter_and_transform_beta_headers(
+ beta_headers=beta_list,
+ provider="bedrock",
+ )
- if beta_set:
- _anthropic_request["anthropic_beta"] = list(beta_set)
+ if filtered_beta_list:
+ _anthropic_request["anthropic_beta"] = filtered_beta_list
return _anthropic_request
diff --git a/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py
index 918b8ecc22..5a09168282 100644
--- a/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py
+++ b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py
@@ -68,6 +68,29 @@ class VertexAIPartnerModelsAnthropicMessagesConfig(AnthropicMessagesConfig, Vert
if existing_beta:
beta_values.update(b.strip() for b in existing_beta.split(","))
+ # Check for context management
+ context_management_param = optional_params.get("context_management")
+ if context_management_param is not None:
+ # Check edits array for compact_20260112 type
+ edits = context_management_param.get("edits", [])
+ has_compact = False
+ has_other = False
+
+ for edit in edits:
+ edit_type = edit.get("type", "")
+ if edit_type == "compact_20260112":
+ has_compact = True
+ else:
+ has_other = True
+
+ # Add compact header if any compact edits exist
+ if has_compact:
+ beta_values.add(ANTHROPIC_BETA_HEADER_VALUES.COMPACT_2026_01_12.value)
+
+ # Add context management header if any other edits exist
+ if has_other:
+ beta_values.add(ANTHROPIC_BETA_HEADER_VALUES.CONTEXT_MANAGEMENT_2025_06_27.value)
+
# Check for web search tool
for tool in tools:
if isinstance(tool, dict) and tool.get("type", "").startswith(ANTHROPIC_HOSTED_TOOLS.WEB_SEARCH.value):
diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json
index 6cc7f737ce..815d29c796 100644
--- a/litellm/model_prices_and_context_window_backup.json
+++ b/litellm/model_prices_and_context_window_backup.json
@@ -993,66 +993,6 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
- "anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.25e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
- "cache_read_input_token_cost": 5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1e-06,
- "input_cost_per_token": 5e-06,
- "input_cost_per_token_above_200k_tokens": 1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.5e-05,
- "output_cost_per_token_above_200k_tokens": 3.75e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
- "global.anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.25e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
- "cache_read_input_token_cost": 5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1e-06,
- "input_cost_per_token": 5e-06,
- "input_cost_per_token_above_200k_tokens": 1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.5e-05,
- "output_cost_per_token_above_200k_tokens": 3.75e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
"global.anthropic.claude-opus-4-6-v1": {
"cache_creation_input_token_cost": 6.25e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
@@ -1143,66 +1083,6 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
- "eu.anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.875e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
- "cache_read_input_token_cost": 5.5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1.1e-06,
- "input_cost_per_token": 5.5e-06,
- "input_cost_per_token_above_200k_tokens": 1.1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.75e-05,
- "output_cost_per_token_above_200k_tokens": 4.125e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
- "apac.anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.875e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
- "cache_read_input_token_cost": 5.5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1.1e-06,
- "input_cost_per_token": 5.5e-06,
- "input_cost_per_token_above_200k_tokens": 1.1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.75e-05,
- "output_cost_per_token_above_200k_tokens": 4.125e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
"apac.anthropic.claude-opus-4-6-v1": {
"cache_creation_input_token_cost": 6.875e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
@@ -7783,6 +7663,37 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
+ "fast/claude-opus-4-6": {
+ "cache_creation_input_token_cost": 6.25e-06,
+ "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
+ "cache_creation_input_token_cost_above_1hr": 1e-05,
+ "cache_read_input_token_cost": 5e-07,
+ "cache_read_input_token_cost_above_200k_tokens": 1e-06,
+ "input_cost_per_token": 3e-05,
+ "input_cost_per_token_above_200k_tokens": 1e-05,
+ "litellm_provider": "anthropic",
+ "max_input_tokens": 1000000,
+ "max_output_tokens": 128000,
+ "max_tokens": 128000,
+ "mode": "chat",
+ "output_cost_per_token": 0.00015,
+ "output_cost_per_token_above_200k_tokens": 3.75e-05,
+ "search_context_cost_per_query": {
+ "search_context_size_high": 0.01,
+ "search_context_size_low": 0.01,
+ "search_context_size_medium": 0.01
+ },
+ "supports_assistant_prefill": false,
+ "supports_computer_use": true,
+ "supports_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_tool_choice": true,
+ "supports_vision": true,
+ "tool_use_system_prompt_tokens": 346
+ },
"us/claude-opus-4-6": {
"cache_creation_input_token_cost": 6.875e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
@@ -7814,6 +7725,37 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
+ "fast/us/claude-opus-4-6": {
+ "cache_creation_input_token_cost": 6.875e-06,
+ "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
+ "cache_creation_input_token_cost_above_1hr": 1.1e-05,
+ "cache_read_input_token_cost": 5.5e-07,
+ "cache_read_input_token_cost_above_200k_tokens": 1.1e-06,
+ "input_cost_per_token": 3e-05,
+ "input_cost_per_token_above_200k_tokens": 1.1e-05,
+ "litellm_provider": "anthropic",
+ "max_input_tokens": 200000,
+ "max_output_tokens": 128000,
+ "max_tokens": 128000,
+ "mode": "chat",
+ "output_cost_per_token": 0.00015,
+ "output_cost_per_token_above_200k_tokens": 4.125e-05,
+ "search_context_cost_per_query": {
+ "search_context_size_high": 0.01,
+ "search_context_size_low": 0.01,
+ "search_context_size_medium": 0.01
+ },
+ "supports_assistant_prefill": false,
+ "supports_computer_use": true,
+ "supports_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_tool_choice": true,
+ "supports_vision": true,
+ "tool_use_system_prompt_tokens": 346
+ },
"claude-opus-4-6-20260205": {
"cache_creation_input_token_cost": 6.25e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
@@ -7845,6 +7787,37 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
+ "fast/claude-opus-4-6-20260205": {
+ "cache_creation_input_token_cost": 6.25e-06,
+ "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
+ "cache_creation_input_token_cost_above_1hr": 1e-05,
+ "cache_read_input_token_cost": 5e-07,
+ "cache_read_input_token_cost_above_200k_tokens": 1e-06,
+ "input_cost_per_token": 3e-05,
+ "input_cost_per_token_above_200k_tokens": 1e-05,
+ "litellm_provider": "anthropic",
+ "max_input_tokens": 1000000,
+ "max_output_tokens": 128000,
+ "max_tokens": 128000,
+ "mode": "chat",
+ "output_cost_per_token": 0.00015,
+ "output_cost_per_token_above_200k_tokens": 3.75e-05,
+ "search_context_cost_per_query": {
+ "search_context_size_high": 0.01,
+ "search_context_size_low": 0.01,
+ "search_context_size_medium": 0.01
+ },
+ "supports_assistant_prefill": false,
+ "supports_computer_use": true,
+ "supports_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_tool_choice": true,
+ "supports_vision": true,
+ "tool_use_system_prompt_tokens": 346
+ },
"us/claude-opus-4-6-20260205": {
"cache_creation_input_token_cost": 6.875e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
diff --git a/litellm/types/llms/anthropic.py b/litellm/types/llms/anthropic.py
index 6c47a54473..cef9c45042 100644
--- a/litellm/types/llms/anthropic.py
+++ b/litellm/types/llms/anthropic.py
@@ -355,11 +355,13 @@ class AnthropicMessagesRequestOptionalParams(TypedDict, total=False):
tool_choice: Optional[Union[AnthropicMessagesToolChoice, Dict]]
tools: Optional[List[Union[AllAnthropicToolsValues, Dict]]]
top_k: Optional[int]
+ inference_geo: Optional[str]
top_p: Optional[float]
mcp_servers: Optional[List[AnthropicMcpServerTool]]
context_management: Optional[Dict[str, Any]]
container: Optional[Dict[str, Any]] # Container config with skills for code execution
output_format: Optional[AnthropicOutputSchema] # Structured outputs support
+ speed: Optional[str] # Fast mode support for Opus models
output_config: Optional[AnthropicOutputConfig] # Configuration for Claude's output behavior
@@ -637,6 +639,7 @@ class ANTHROPIC_BETA_HEADER_VALUES(str, Enum):
COMPACT_2026_01_12 = "compact-2026-01-12"
STRUCTURED_OUTPUT_2025_09_25 = "structured-outputs-2025-11-13"
ADVANCED_TOOL_USE_2025_11_20 = "advanced-tool-use-2025-11-20"
+ FAST_MODE_2026_02_01 = "fast-mode-2026-02-01"
# Tool search beta header constant (for Anthropic direct API and Microsoft Foundry)
diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json
index 6cc7f737ce..815d29c796 100644
--- a/model_prices_and_context_window.json
+++ b/model_prices_and_context_window.json
@@ -993,66 +993,6 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
- "anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.25e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
- "cache_read_input_token_cost": 5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1e-06,
- "input_cost_per_token": 5e-06,
- "input_cost_per_token_above_200k_tokens": 1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.5e-05,
- "output_cost_per_token_above_200k_tokens": 3.75e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
- "global.anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.25e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
- "cache_read_input_token_cost": 5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1e-06,
- "input_cost_per_token": 5e-06,
- "input_cost_per_token_above_200k_tokens": 1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.5e-05,
- "output_cost_per_token_above_200k_tokens": 3.75e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
"global.anthropic.claude-opus-4-6-v1": {
"cache_creation_input_token_cost": 6.25e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
@@ -1143,66 +1083,6 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
- "eu.anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.875e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
- "cache_read_input_token_cost": 5.5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1.1e-06,
- "input_cost_per_token": 5.5e-06,
- "input_cost_per_token_above_200k_tokens": 1.1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.75e-05,
- "output_cost_per_token_above_200k_tokens": 4.125e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
- "apac.anthropic.claude-opus-4-6-v1": {
- "cache_creation_input_token_cost": 6.875e-06,
- "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
- "cache_read_input_token_cost": 5.5e-07,
- "cache_read_input_token_cost_above_200k_tokens": 1.1e-06,
- "input_cost_per_token": 5.5e-06,
- "input_cost_per_token_above_200k_tokens": 1.1e-05,
- "litellm_provider": "bedrock_converse",
- "max_input_tokens": 1000000,
- "max_output_tokens": 128000,
- "max_tokens": 128000,
- "mode": "chat",
- "output_cost_per_token": 2.75e-05,
- "output_cost_per_token_above_200k_tokens": 4.125e-05,
- "search_context_cost_per_query": {
- "search_context_size_high": 0.01,
- "search_context_size_low": 0.01,
- "search_context_size_medium": 0.01
- },
- "supports_assistant_prefill": false,
- "supports_computer_use": true,
- "supports_function_calling": true,
- "supports_pdf_input": true,
- "supports_prompt_caching": true,
- "supports_reasoning": true,
- "supports_response_schema": true,
- "supports_tool_choice": true,
- "supports_vision": true,
- "tool_use_system_prompt_tokens": 346
- },
"apac.anthropic.claude-opus-4-6-v1": {
"cache_creation_input_token_cost": 6.875e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
@@ -7783,6 +7663,37 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
+ "fast/claude-opus-4-6": {
+ "cache_creation_input_token_cost": 6.25e-06,
+ "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
+ "cache_creation_input_token_cost_above_1hr": 1e-05,
+ "cache_read_input_token_cost": 5e-07,
+ "cache_read_input_token_cost_above_200k_tokens": 1e-06,
+ "input_cost_per_token": 3e-05,
+ "input_cost_per_token_above_200k_tokens": 1e-05,
+ "litellm_provider": "anthropic",
+ "max_input_tokens": 1000000,
+ "max_output_tokens": 128000,
+ "max_tokens": 128000,
+ "mode": "chat",
+ "output_cost_per_token": 0.00015,
+ "output_cost_per_token_above_200k_tokens": 3.75e-05,
+ "search_context_cost_per_query": {
+ "search_context_size_high": 0.01,
+ "search_context_size_low": 0.01,
+ "search_context_size_medium": 0.01
+ },
+ "supports_assistant_prefill": false,
+ "supports_computer_use": true,
+ "supports_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_tool_choice": true,
+ "supports_vision": true,
+ "tool_use_system_prompt_tokens": 346
+ },
"us/claude-opus-4-6": {
"cache_creation_input_token_cost": 6.875e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
@@ -7814,6 +7725,37 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
+ "fast/us/claude-opus-4-6": {
+ "cache_creation_input_token_cost": 6.875e-06,
+ "cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
+ "cache_creation_input_token_cost_above_1hr": 1.1e-05,
+ "cache_read_input_token_cost": 5.5e-07,
+ "cache_read_input_token_cost_above_200k_tokens": 1.1e-06,
+ "input_cost_per_token": 3e-05,
+ "input_cost_per_token_above_200k_tokens": 1.1e-05,
+ "litellm_provider": "anthropic",
+ "max_input_tokens": 200000,
+ "max_output_tokens": 128000,
+ "max_tokens": 128000,
+ "mode": "chat",
+ "output_cost_per_token": 0.00015,
+ "output_cost_per_token_above_200k_tokens": 4.125e-05,
+ "search_context_cost_per_query": {
+ "search_context_size_high": 0.01,
+ "search_context_size_low": 0.01,
+ "search_context_size_medium": 0.01
+ },
+ "supports_assistant_prefill": false,
+ "supports_computer_use": true,
+ "supports_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_tool_choice": true,
+ "supports_vision": true,
+ "tool_use_system_prompt_tokens": 346
+ },
"claude-opus-4-6-20260205": {
"cache_creation_input_token_cost": 6.25e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
@@ -7845,6 +7787,37 @@
"supports_vision": true,
"tool_use_system_prompt_tokens": 346
},
+ "fast/claude-opus-4-6-20260205": {
+ "cache_creation_input_token_cost": 6.25e-06,
+ "cache_creation_input_token_cost_above_200k_tokens": 1.25e-05,
+ "cache_creation_input_token_cost_above_1hr": 1e-05,
+ "cache_read_input_token_cost": 5e-07,
+ "cache_read_input_token_cost_above_200k_tokens": 1e-06,
+ "input_cost_per_token": 3e-05,
+ "input_cost_per_token_above_200k_tokens": 1e-05,
+ "litellm_provider": "anthropic",
+ "max_input_tokens": 1000000,
+ "max_output_tokens": 128000,
+ "max_tokens": 128000,
+ "mode": "chat",
+ "output_cost_per_token": 0.00015,
+ "output_cost_per_token_above_200k_tokens": 3.75e-05,
+ "search_context_cost_per_query": {
+ "search_context_size_high": 0.01,
+ "search_context_size_low": 0.01,
+ "search_context_size_medium": 0.01
+ },
+ "supports_assistant_prefill": false,
+ "supports_computer_use": true,
+ "supports_function_calling": true,
+ "supports_pdf_input": true,
+ "supports_prompt_caching": true,
+ "supports_reasoning": true,
+ "supports_response_schema": true,
+ "supports_tool_choice": true,
+ "supports_vision": true,
+ "tool_use_system_prompt_tokens": 346
+ },
"us/claude-opus-4-6-20260205": {
"cache_creation_input_token_cost": 6.875e-06,
"cache_creation_input_token_cost_above_200k_tokens": 1.375e-05,
diff --git a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py
index 49db7367c6..e3bd7d2bb3 100644
--- a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py
+++ b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py
@@ -2506,3 +2506,164 @@ def test_compaction_block_empty_list_not_added():
provider_fields = result.choices[0].message.provider_specific_fields
if provider_fields:
assert "compaction_blocks" not in provider_fields or provider_fields.get("compaction_blocks") is None
+
+
+def test_fast_mode_beta_header():
+ """
+ Test that fast mode correctly adds the fast-mode-2026-02-01 beta header.
+ """
+ config = AnthropicConfig()
+
+ headers = {}
+ optional_params = {"speed": "fast"}
+
+ result_headers = config.update_headers_with_optional_anthropic_beta(
+ headers=headers,
+ optional_params=optional_params
+ )
+
+ assert "anthropic-beta" in result_headers
+ assert "fast-mode-2026-02-01" in result_headers["anthropic-beta"]
+
+
+def test_fast_mode_with_other_beta_headers():
+ """
+ Test that fast mode beta header is combined with other beta headers.
+ """
+ config = AnthropicConfig()
+
+ headers = {}
+ optional_params = {
+ "speed": "fast",
+ "output_format": {"type": "json_object"}
+ }
+
+ result_headers = config.update_headers_with_optional_anthropic_beta(
+ headers=headers,
+ optional_params=optional_params
+ )
+
+ assert "anthropic-beta" in result_headers
+ assert "fast-mode-2026-02-01" in result_headers["anthropic-beta"]
+ assert "structured-outputs-2025-11-13" in result_headers["anthropic-beta"]
+
+
+def test_fast_mode_usage_calculation():
+ """
+ Test that fast mode speed parameter is passed through to usage object.
+ """
+ config = AnthropicConfig()
+
+ usage_object = {
+ "input_tokens": 1000,
+ "output_tokens": 500,
+ }
+
+ usage = config.calculate_usage(
+ usage_object=usage_object,
+ reasoning_content=None,
+ speed="fast"
+ )
+
+ assert usage.prompt_tokens == 1000
+ assert usage.completion_tokens == 500
+ assert hasattr(usage, "speed")
+ assert usage.speed == "fast"
+
+
+def test_fast_mode_cost_calculation():
+ """
+ Test that fast mode correctly prepends 'fast/' to model name for pricing lookup.
+ """
+ from unittest.mock import patch
+
+ from litellm.llms.anthropic.cost_calculation import cost_per_token
+ from litellm.types.utils import Usage
+
+ # Mock the generic_cost_per_token to verify correct model name is passed
+ with patch('litellm.llms.anthropic.cost_calculation.generic_cost_per_token') as mock_cost:
+ mock_cost.return_value = (0.03, 0.15) # $30 and $150 per MTok
+
+ # Test fast mode
+ usage_fast = Usage(
+ prompt_tokens=1000,
+ completion_tokens=1000,
+ speed="fast"
+ )
+
+ prompt_cost, completion_cost = cost_per_token(
+ model="claude-opus-4-6",
+ usage=usage_fast
+ )
+
+ # Verify that generic_cost_per_token was called with "fast/claude-opus-4-6"
+ mock_cost.assert_called_once()
+ call_args = mock_cost.call_args
+ assert call_args[1]['model'] == "fast/claude-opus-4-6"
+ assert call_args[1]['custom_llm_provider'] == "anthropic"
+
+
+def test_fast_mode_with_inference_geo():
+ """
+ Test that fast mode works correctly with inference_geo prefix.
+ Expected format: fast/us/claude-opus-4-6
+ """
+ from unittest.mock import patch
+
+ from litellm.llms.anthropic.cost_calculation import cost_per_token
+ from litellm.types.utils import Usage
+
+ # Mock the generic_cost_per_token to verify correct model name is passed
+ with patch('litellm.llms.anthropic.cost_calculation.generic_cost_per_token') as mock_cost:
+ mock_cost.return_value = (0.03, 0.15)
+
+ # Test with both speed and inference_geo
+ usage = Usage(
+ prompt_tokens=1000,
+ completion_tokens=1000,
+ speed="fast",
+ inference_geo="us"
+ )
+
+ # This should look up "fast/us/claude-opus-4-6" in pricing
+ prompt_cost, completion_cost = cost_per_token(
+ model="claude-opus-4-6",
+ usage=usage
+ )
+
+ # Verify that generic_cost_per_token was called with "fast/us/claude-opus-4-6"
+ mock_cost.assert_called_once()
+ call_args = mock_cost.call_args
+ assert call_args[1]['model'] == "fast/us/claude-opus-4-6"
+ assert call_args[1]['custom_llm_provider'] == "anthropic"
+
+
+def test_fast_mode_parameter_in_supported_params():
+ """
+ Test that 'speed' is in the list of supported OpenAI params.
+ """
+ config = AnthropicConfig()
+
+ supported_params = config.get_supported_openai_params(model="claude-opus-4-6")
+
+ assert "speed" in supported_params
+
+
+def test_fast_mode_parameter_mapping():
+ """
+ Test that speed parameter is correctly mapped in map_openai_params.
+ """
+ config = AnthropicConfig()
+
+ non_default_params = {"speed": "fast"}
+ optional_params = {}
+
+ result = config.map_openai_params(
+ non_default_params=non_default_params,
+ optional_params=optional_params,
+ model="claude-opus-4-6",
+ drop_params=False
+ )
+
+ assert "speed" in result
+ assert result["speed"] == "fast"
diff --git a/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_messages_config.py b/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_messages_config.py
index 623f8c579f..7bb84b0a2c 100644
--- a/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_messages_config.py
+++ b/tests/test_litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/test_vertex_ai_partner_models_anthropic_messages_config.py
@@ -98,3 +98,120 @@ def test_web_search_header_not_added_without_tool():
# Assert that the anthropic-beta header is NOT present when no web search tool
assert "anthropic-beta" not in updated_headers, \
"anthropic-beta header should not be present without web search tool"
+
+
+def test_compact_context_management_header_added():
+ """Test that compact-2026-01-12 beta header is added when context_management with compact_20260112 is used"""
+ config = VertexAIPartnerModelsAnthropicMessagesConfig()
+ headers = {}
+ litellm_params = {
+ "vertex_ai_project": "test-project",
+ "vertex_ai_location": "us-central1",
+ "vertex_credentials": "{}",
+ }
+ # Include context_management with compact_20260112
+ optional_params = {
+ "context_management": {
+ "edits": [
+ {"type": "compact_20260112"}
+ ]
+ }
+ }
+
+ with patch.object(
+ config, "_ensure_access_token", return_value=("token", "test-project")
+ ), patch.object(
+ config, "get_complete_vertex_url", return_value="https://mock-url"
+ ):
+ updated_headers, api_base = config.validate_anthropic_messages_environment(
+ headers=headers,
+ model="claude-vertex-ai-opus-4-6",
+ messages=[],
+ optional_params=optional_params,
+ litellm_params=litellm_params,
+ api_base=None,
+ )
+
+ # Assert that the anthropic-beta header with compact-2026-01-12 is present
+ assert "anthropic-beta" in updated_headers, "anthropic-beta header should be present"
+ assert "compact-2026-01-12" in updated_headers["anthropic-beta"], \
+ f"anthropic-beta should contain 'compact-2026-01-12', got: {updated_headers['anthropic-beta']}"
+
+
+def test_context_management_header_added_for_other_edits():
+ """Test that context-management-2025-06-27 beta header is added for non-compact edits"""
+ config = VertexAIPartnerModelsAnthropicMessagesConfig()
+ headers = {}
+ litellm_params = {
+ "vertex_ai_project": "test-project",
+ "vertex_ai_location": "us-central1",
+ "vertex_credentials": "{}",
+ }
+ # Include context_management with other edit types
+ optional_params = {
+ "context_management": {
+ "edits": [
+ {"type": "some_other_type"}
+ ]
+ }
+ }
+
+ with patch.object(
+ config, "_ensure_access_token", return_value=("token", "test-project")
+ ), patch.object(
+ config, "get_complete_vertex_url", return_value="https://mock-url"
+ ):
+ updated_headers, api_base = config.validate_anthropic_messages_environment(
+ headers=headers,
+ model="claude-vertex-ai-opus-4-6",
+ messages=[],
+ optional_params=optional_params,
+ litellm_params=litellm_params,
+ api_base=None,
+ )
+
+ # Assert that the anthropic-beta header with context-management-2025-06-27 is present
+ assert "anthropic-beta" in updated_headers, "anthropic-beta header should be present"
+ assert "context-management-2025-06-27" in updated_headers["anthropic-beta"], \
+ f"anthropic-beta should contain 'context-management-2025-06-27', got: {updated_headers['anthropic-beta']}"
+
+
+def test_both_compact_and_context_management_headers_added():
+ """Test that both compact and context-management beta headers are added when both edit types are present"""
+ config = VertexAIPartnerModelsAnthropicMessagesConfig()
+ headers = {}
+ litellm_params = {
+ "vertex_ai_project": "test-project",
+ "vertex_ai_location": "us-central1",
+ "vertex_credentials": "{}",
+ }
+ # Include context_management with both compact and other edit types
+ optional_params = {
+ "context_management": {
+ "edits": [
+ {"type": "compact_20260112"},
+ {"type": "some_other_type"}
+ ]
+ }
+ }
+
+ with patch.object(
+ config, "_ensure_access_token", return_value=("token", "test-project")
+ ), patch.object(
+ config, "get_complete_vertex_url", return_value="https://mock-url"
+ ):
+ updated_headers, api_base = config.validate_anthropic_messages_environment(
+ headers=headers,
+ model="claude-vertex-ai-opus-4-6",
+ messages=[],
+ optional_params=optional_params,
+ litellm_params=litellm_params,
+ api_base=None,
+ )
+
+ # Assert that both beta headers are present
+ assert "anthropic-beta" in updated_headers, "anthropic-beta header should be present"
+ assert "compact-2026-01-12" in updated_headers["anthropic-beta"], \
+ f"anthropic-beta should contain 'compact-2026-01-12', got: {updated_headers['anthropic-beta']}"
+ assert "context-management-2025-06-27" in updated_headers["anthropic-beta"], \
+ f"anthropic-beta should contain 'context-management-2025-06-27', got: {updated_headers['anthropic-beta']}"