diff --git a/cookbook/ai_coding_tool_guides/claude_code_quickstart/guide.md b/cookbook/ai_coding_tool_guides/claude_code_quickstart/guide.md index 3d6c75498b..b2d81be25b 100644 --- a/cookbook/ai_coding_tool_guides/claude_code_quickstart/guide.md +++ b/cookbook/ai_coding_tool_guides/claude_code_quickstart/guide.md @@ -230,7 +230,7 @@ model_list: # AWS Bedrock - model_name: claude-bedrock litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 diff --git a/cookbook/misc/test_responses_api.py b/cookbook/misc/test_responses_api.py index 5fd19c6f66..62e4e2cf62 100644 --- a/cookbook/misc/test_responses_api.py +++ b/cookbook/misc/test_responses_api.py @@ -20,7 +20,7 @@ base64_image = encode_image(image_path) response = client.responses.create( - model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", input=[ { "role": "user", @@ -43,7 +43,7 @@ print("sleeping for 20 seconds...") time.sleep(20) print("making follow up request for existing id") response2 = client.responses.create( - model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", previous_response_id=response.id, input="ok, and what objects are in the image?" ) diff --git a/docs/my-website/docs/anthropic_count_tokens.md b/docs/my-website/docs/anthropic_count_tokens.md index 5985516d69..a62e46f156 100644 --- a/docs/my-website/docs/anthropic_count_tokens.md +++ b/docs/my-website/docs/anthropic_count_tokens.md @@ -96,7 +96,7 @@ model_list: - model_name: claude-bedrock litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_region_name: us-west-2 ``` diff --git a/docs/my-website/docs/completion/computer_use.md b/docs/my-website/docs/completion/computer_use.md index ed09a73b21..400f108f97 100644 --- a/docs/my-website/docs/completion/computer_use.md +++ b/docs/my-website/docs/completion/computer_use.md @@ -80,7 +80,7 @@ model_list: api_key: os.environ/ANTHROPIC_API_KEY - model_name: claude-bedrock # Bedrock Anthropic model litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-west-2 @@ -153,7 +153,7 @@ import litellm assert litellm.supports_computer_use(model="anthropic/claude-3-5-sonnet-latest") == True assert litellm.supports_computer_use(model="anthropic/claude-3-7-sonnet-20250219") == True -assert litellm.supports_computer_use(model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0") == True +assert litellm.supports_computer_use(model="bedrock/anthropic.claude-haiku-4-5-20251001:0") == True assert litellm.supports_computer_use(model="vertex_ai/claude-3-5-sonnet") == True assert litellm.supports_computer_use(model="openai/gpt-4") == False ``` @@ -171,7 +171,7 @@ model_list: api_key: os.environ/ANTHROPIC_API_KEY - model_name: claude-bedrock # Bedrock Anthropic model litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-west-2 diff --git a/docs/my-website/docs/completion/document_understanding.md b/docs/my-website/docs/completion/document_understanding.md index 172e079280..f510a33f79 100644 --- a/docs/my-website/docs/completion/document_understanding.md +++ b/docs/my-website/docs/completion/document_understanding.md @@ -32,7 +32,7 @@ os.environ["AWS_REGION_NAME"] = "" file_url = "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf" # model -model = "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0" +model = "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0" file_content = [ {"type": "text", "text": "What's this file about?"}, @@ -63,7 +63,7 @@ assert response is not None model_list: - model_name: bedrock-model litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: os.environ/AWS_REGION_NAME @@ -122,7 +122,7 @@ encoded_file = base64.b64encode(file_data).decode("utf-8") base64_url = f"data:application/pdf;base64,{encoded_file}" # model -model = "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0" +model = "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0" file_content = [ {"type": "text", "text": "What's this file about?"}, @@ -153,7 +153,7 @@ assert response is not None model_list: - model_name: bedrock-model litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: os.environ/AWS_REGION_NAME @@ -210,7 +210,7 @@ os.environ["AWS_REGION_NAME"] = "" file_url = "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf" # model -model = "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0" +model = "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0" file_content = [ {"type": "text", "text": "What's this file about?"}, @@ -242,7 +242,7 @@ assert response is not None model_list: - model_name: bedrock-model litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: os.environ/AWS_REGION_NAME @@ -350,10 +350,10 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ -Use `litellm.supports_pdf_input(model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0")` -> returns `True` if model can accept pdf input +Use `litellm.supports_pdf_input(model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0")` -> returns `True` if model can accept pdf input ```python -assert litellm.supports_pdf_input(model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0") == True +assert litellm.supports_pdf_input(model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0") == True ``` @@ -365,7 +365,7 @@ assert litellm.supports_pdf_input(model="bedrock/anthropic.claude-3-5-sonnet-202 model_list: - model_name: bedrock-model # model group name litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: os.environ/AWS_REGION_NAME diff --git a/docs/my-website/docs/completion/provider_specific_params.md b/docs/my-website/docs/completion/provider_specific_params.md index 250b410c9c..791153d2bc 100644 --- a/docs/my-website/docs/completion/provider_specific_params.md +++ b/docs/my-website/docs/completion/provider_specific_params.md @@ -450,7 +450,7 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ import litellm response = litellm.completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello!"}], requestMetadata={"cost_center": "engineering"} ) diff --git a/docs/my-website/docs/index.md b/docs/my-website/docs/index.md index ca63c9e39f..6410e052b0 100644 --- a/docs/my-website/docs/index.md +++ b/docs/my-website/docs/index.md @@ -103,7 +103,7 @@ os.environ["AWS_SECRET_ACCESS_KEY"] = "your-secret" os.environ["AWS_REGION_NAME"] = "us-east-1" response = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/anthropic.claude-haiku-4-5-20251001:0", messages=[{"role": "user", "content": "Hello, how are you?"}] ) print(response.choices[0].message.content) diff --git a/docs/my-website/docs/oidc.md b/docs/my-website/docs/oidc.md index b541329aa3..23eb431b7e 100644 --- a/docs/my-website/docs/oidc.md +++ b/docs/my-website/docs/oidc.md @@ -268,7 +268,7 @@ Please contact us for paid enterprise support if you need help setting up Azure model list: - model_name: aws/claude-3-5-sonnet litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_region_name: "eu-central-1" aws_role_name: "arn:aws:iam::12345678:role/bedrock-role" aws_web_identity_token: "oidc/azure/api://123-456-789-9d04" diff --git a/docs/my-website/docs/providers/bedrock.md b/docs/my-website/docs/providers/bedrock.md index bb07216a29..e5942cc111 100644 --- a/docs/my-website/docs/providers/bedrock.md +++ b/docs/my-website/docs/providers/bedrock.md @@ -95,7 +95,7 @@ Here's how to call Bedrock with the LiteLLM Proxy Server model_list: - model_name: bedrock-claude-3-5-sonnet litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: os.environ/AWS_REGION_NAME @@ -337,7 +337,7 @@ os.environ["AWS_SECRET_ACCESS_KEY"] = "" os.environ["AWS_REGION_NAME"] = "" response = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello, how are you?"}], requestMetadata={ "cost_center": "engineering", @@ -354,7 +354,7 @@ response = completion( model_list: - model_name: bedrock-claude-v1 litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 requestMetadata: cost_center: "engineering" ``` @@ -1543,7 +1543,7 @@ file_data = response.content encoded_file = base64.b64encode(file_data).decode("utf-8") # model -model = "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0" +model = "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0" image_content = [ {"type": "text", "text": "What's this file about?"}, @@ -1574,7 +1574,7 @@ assert response is not None model_list: - model_name: bedrock-model litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: os.environ/AWS_REGION_NAME @@ -1631,7 +1631,7 @@ encoded_file = base64.b64encode(file_data).decode("utf-8") base64_url = f"data:application/pdf;base64,{encoded_file}" # model -model = "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0" +model = "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0" image_content = [ {"type": "text", "text": "What's this file about?"}, @@ -1660,7 +1660,7 @@ assert response is not None model_list: - model_name: bedrock-model litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: os.environ/AWS_REGION_NAME @@ -1941,7 +1941,7 @@ Here's an example of using a bedrock model with LiteLLM. For a complete list, re | GPT-OSS 120B | `completion(model='bedrock/converse/openai.gpt-oss-120b-1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | | Deepseek R1 | `completion(model='bedrock/us.deepseek.r1-v1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']` | | Anthropic Claude Sonnet 4.5 | `completion(model='bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']` | -| Anthropic Claude-V3.5 Sonnet | `completion(model='bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']` | +| Anthropic Claude-V3.5 Sonnet | `completion(model='bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']` | | Anthropic Claude-V3 sonnet | `completion(model='bedrock/anthropic.claude-3-sonnet-20240229-v1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']` | | Anthropic Claude-V3 Haiku | `completion(model='bedrock/anthropic.claude-3-haiku-20240307-v1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']` | | Anthropic Claude-V3 Opus | `completion(model='bedrock/anthropic.claude-3-opus-20240229-v1:0', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']` | @@ -2051,7 +2051,7 @@ os.environ["AWS_SECRET_ACCESS_KEY"] = "" os.environ["AWS_REGION_NAME"] = "" response = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello, how are you?"}], model_id="arn:aws:bedrock:eu-central-1:000000000000:application-inference-profile/a0a0a0a0a0a0", ) @@ -2068,7 +2068,7 @@ print(response) model_list: - model_name: anthropic-claude-3-5-sonnet litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 # You have to set the ARN application inference profile in the model_id parameter model_id: arn:aws:bedrock:eu-central-1:000000000000:application-inference-profile/a0a0a0a0a0a0 ``` diff --git a/docs/my-website/docs/tutorials/claude_responses_api.md b/docs/my-website/docs/tutorials/claude_responses_api.md index 03ac9935fd..2a6a1236ab 100644 --- a/docs/my-website/docs/tutorials/claude_responses_api.md +++ b/docs/my-website/docs/tutorials/claude_responses_api.md @@ -214,7 +214,7 @@ model_list: # AWS Bedrock - model_name: claude-bedrock litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 diff --git a/docs/my-website/docs/tutorials/github_copilot_integration.md b/docs/my-website/docs/tutorials/github_copilot_integration.md index fc2682df6f..87171ca290 100644 --- a/docs/my-website/docs/tutorials/github_copilot_integration.md +++ b/docs/my-website/docs/tutorials/github_copilot_integration.md @@ -141,7 +141,7 @@ Route requests to Claude on Bedrock: model_list: - model_name: bedrock-claude litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 diff --git a/docs/my-website/docs/tutorials/google_genai_sdk.md b/docs/my-website/docs/tutorials/google_genai_sdk.md index b0538795c4..fdb55ee1a2 100644 --- a/docs/my-website/docs/tutorials/google_genai_sdk.md +++ b/docs/my-website/docs/tutorials/google_genai_sdk.md @@ -282,7 +282,7 @@ Route `gemini-2.5-flash` requests to Claude on Bedrock: model_list: - model_name: bedrock-claude litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 diff --git a/docs/my-website/docs/tutorials/litellm_gemini_cli.md b/docs/my-website/docs/tutorials/litellm_gemini_cli.md index a36d898d7d..542d223775 100644 --- a/docs/my-website/docs/tutorials/litellm_gemini_cli.md +++ b/docs/my-website/docs/tutorials/litellm_gemini_cli.md @@ -127,7 +127,7 @@ Route `gemini-2.5-pro` requests to Claude on Bedrock: model_list: - model_name: bedrock-claude litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 @@ -149,7 +149,7 @@ model_list: api_key: os.environ/ANTHROPIC_API_KEY - model_name: anthropic-claude litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 diff --git a/docs/my-website/docs/tutorials/litellm_qwen_code_cli.md b/docs/my-website/docs/tutorials/litellm_qwen_code_cli.md index 06b46a6f89..00eaa58abb 100644 --- a/docs/my-website/docs/tutorials/litellm_qwen_code_cli.md +++ b/docs/my-website/docs/tutorials/litellm_qwen_code_cli.md @@ -129,7 +129,7 @@ Route `qwen-code` requests to Claude on Bedrock: model_list: - model_name: bedrock-claude litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 @@ -151,7 +151,7 @@ model_list: api_key: os.environ/ANTHROPIC_API_KEY - model_name: anthropic-claude litellm_params: - model: bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/anthropic.claude-haiku-4-5-20251001:0 aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY aws_region_name: us-east-1 diff --git a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py index e31820d763..a890cf2a04 100644 --- a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py +++ b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py @@ -54,9 +54,6 @@ class AmazonAnthropicClaudeMessagesConfig( DEFAULT_BEDROCK_ANTHROPIC_API_VERSION = "bedrock-2023-05-31" - # Beta header patterns that are not supported by Bedrock Invoke API - # These will be filtered out to prevent 400 "invalid beta flag" errors - def __init__(self, **kwargs): BaseAnthropicMessagesConfig.__init__(self, **kwargs) AmazonInvokeConfig.__init__(self, **kwargs) diff --git a/litellm/proxy/example_config_yaml/websearch_interception_config.yaml b/litellm/proxy/example_config_yaml/websearch_interception_config.yaml index 2c1cd623c3..89c35c9c9d 100644 --- a/litellm/proxy/example_config_yaml/websearch_interception_config.yaml +++ b/litellm/proxy/example_config_yaml/websearch_interception_config.yaml @@ -1,7 +1,7 @@ model_list: - model_name: claude-3-5-sonnet litellm_params: - model: bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0 + model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0 # Search tools configuration search_tools: diff --git a/litellm/setup_wizard.py b/litellm/setup_wizard.py index 666915669f..3718655b31 100644 --- a/litellm/setup_wizard.py +++ b/litellm/setup_wizard.py @@ -86,7 +86,7 @@ PROVIDERS: List[Dict] = [ "env_key": "AWS_ACCESS_KEY_ID", "key_hint": "AKIA...", "test_model": None, # multi-key auth — skip validation - "models": ["bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0"], + "models": ["bedrock/anthropic.claude-haiku-4-5-20251001-v1:0"], "extra_keys": ["AWS_SECRET_ACCESS_KEY", "AWS_REGION_NAME"], "extra_hints": ["your-secret-key", "us-east-1"], }, diff --git a/tests/litellm_utils_tests/test_health_check.py b/tests/litellm_utils_tests/test_health_check.py index c774ea4f1e..0b0e091211 100644 --- a/tests/litellm_utils_tests/test_health_check.py +++ b/tests/litellm_utils_tests/test_health_check.py @@ -331,11 +331,11 @@ def test_update_litellm_params_for_health_check(): # Test with Bedrock model without region routing - should just strip bedrock/ prefix litellm_params = { - "model": "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + "model": "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", "api_key": "fake_key", } updated_params = _update_litellm_params_for_health_check(model_info, litellm_params) - assert updated_params["model"] == "anthropic.claude-3-5-sonnet-20240620-v1:0" + assert updated_params["model"] == "us.anthropic.claude-haiku-4-5-20251001-v1:0" # Test that non-Bedrock models are not affected by Bedrock-specific logic litellm_params = { diff --git a/tests/llm_translation/test_bedrock_anthropic_regression.py b/tests/llm_translation/test_bedrock_anthropic_regression.py index df8755ba1a..e28a1cc755 100644 --- a/tests/llm_translation/test_bedrock_anthropic_regression.py +++ b/tests/llm_translation/test_bedrock_anthropic_regression.py @@ -287,7 +287,7 @@ class TestBedrockAnthropic1MContextRegression: if "converse" in model_prefix: config = AmazonConverseConfig() result = config._transform_request_helper( - model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={}, messages=messages, @@ -310,7 +310,7 @@ class TestBedrockAnthropic1MContextRegression: else: config = AmazonAnthropicClaudeConfig() result = config.transform_request( - model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={}, litellm_params={}, @@ -354,7 +354,7 @@ class TestBedrockAnthropic1MContextRegression: if "converse" in model_prefix: config = AmazonConverseConfig() result = config._transform_request_helper( - model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={}, messages=messages, @@ -370,7 +370,7 @@ class TestBedrockAnthropic1MContextRegression: else: config = AmazonAnthropicClaudeConfig() result = config.transform_request( - model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={}, litellm_params={}, @@ -411,7 +411,7 @@ class TestBedrockAnthropic1MContextRegression: if "converse" in model_prefix: config = AmazonConverseConfig() result = config._transform_request_helper( - model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={}, messages=messages, @@ -424,7 +424,7 @@ class TestBedrockAnthropic1MContextRegression: else: config = AmazonAnthropicClaudeConfig() result = config.transform_request( - model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={}, litellm_params={}, diff --git a/tests/llm_translation/test_bedrock_common_utils.py b/tests/llm_translation/test_bedrock_common_utils.py index d5ec496705..d7cf9e90f6 100644 --- a/tests/llm_translation/test_bedrock_common_utils.py +++ b/tests/llm_translation/test_bedrock_common_utils.py @@ -51,11 +51,11 @@ class TestStripBedrockThroughputSuffix: """Tests for strip_bedrock_throughput_suffix function.""" @pytest.mark.parametrize("input_model,expected", [ - ("anthropic.claude-3-5-sonnet-20241022-v2:0:51k", "anthropic.claude-3-5-sonnet-20241022-v2:0"), - ("anthropic.claude-3-5-sonnet-20241022-v2:0:18k", "anthropic.claude-3-5-sonnet-20241022-v2:0"), + ("anthropic.claude-haiku-4-5-20251001-v1:0:51k", "anthropic.claude-haiku-4-5-20251001-v1:0"), + ("anthropic.claude-haiku-4-5-20251001-v1:0:18k", "anthropic.claude-haiku-4-5-20251001-v1:0"), ("model:1:51k", "model:1"), ("model:123:18k", "model:123"), - ("anthropic.claude-3-5-sonnet-20241022-v2:0", "anthropic.claude-3-5-sonnet-20241022-v2:0"), + ("anthropic.claude-haiku-4-5-20251001-v1:0", "anthropic.claude-haiku-4-5-20251001-v1:0"), ("anthropic.claude-3-sonnet", "anthropic.claude-3-sonnet"), ]) def test_strip_throughput_suffix(self, input_model, expected): @@ -135,10 +135,10 @@ class TestGetBedrockBaseModel: ) @pytest.mark.parametrize("input_model,expected", [ - ("anthropic.claude-3-5-sonnet-20241022-v2:0:51k", "anthropic.claude-3-5-sonnet-20241022-v2:0"), - ("anthropic.claude-3-5-sonnet-20241022-v2:0:18k", "anthropic.claude-3-5-sonnet-20241022-v2:0"), - ("bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0:51k", "anthropic.claude-3-5-sonnet-20241022-v2:0"), - ("us.anthropic.claude-3-5-sonnet-20241022-v2:0:51k", "anthropic.claude-3-5-sonnet-20241022-v2:0"), + ("anthropic.claude-haiku-4-5-20251001-v1:0:51k", "anthropic.claude-haiku-4-5-20251001-v1:0"), + ("anthropic.claude-haiku-4-5-20251001-v1:0:18k", "anthropic.claude-haiku-4-5-20251001-v1:0"), + ("bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0:51k", "anthropic.claude-haiku-4-5-20251001-v1:0"), + ("us.anthropic.claude-haiku-4-5-20251001-v1:0:51k", "anthropic.claude-haiku-4-5-20251001-v1:0"), ]) def test_strips_throughput_suffix(self, input_model, expected): """Test that throughput tier suffixes like :51k are stripped. Issue #19113.""" diff --git a/tests/llm_translation/test_bedrock_completion.py b/tests/llm_translation/test_bedrock_completion.py index 8a85102d3a..76ec2bdd1d 100644 --- a/tests/llm_translation/test_bedrock_completion.py +++ b/tests/llm_translation/test_bedrock_completion.py @@ -70,7 +70,7 @@ def test_completion_bedrock_claude_completion_auth(): try: response = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, max_tokens=10, temperature=0.1, @@ -106,7 +106,7 @@ def test_completion_bedrock_guardrails(streaming): try: if streaming is False: response = completion( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[ { "content": "where do i buy coffee from? ", @@ -134,7 +134,7 @@ def test_completion_bedrock_guardrails(streaming): else: litellm.set_verbose = True response = completion( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[ { "content": "where do i buy coffee from? ", @@ -196,7 +196,7 @@ def test_completion_bedrock_claude_external_client_auth(): ) response = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, max_tokens=10, temperature=0.1, @@ -741,7 +741,7 @@ def test_bedrock_ptu(): ) try: response = litellm.completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "What's AWS?"}], model_id=model_id, client=client, @@ -907,7 +907,7 @@ def test_completion_bedrock_external_client_region(): with patch.object(client, "post", new=Mock()) as mock_client_post: try: response = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, max_tokens=10, temperature=0.1, @@ -1150,8 +1150,8 @@ def test_bedrock_cross_region_inference(model): "model, expected_base_model", [ ( - "apac.anthropic.claude-3-5-sonnet-20240620-v1:0", - "anthropic.claude-3-5-sonnet-20240620-v1:0", + "apac.anthropic.claude-haiku-4-5-20251001-v1:0", + "anthropic.claude-haiku-4-5-20251001-v1:0", ), ], ) @@ -1257,7 +1257,7 @@ def test_base_aws_llm_get_credentials(): def test_bedrock_completion_test_2(): litellm.set_verbose = True data = { - "model": "bedrock/anthropic.claude-3-opus-20240229-v1:0", + "model": "bedrock/anthropic.claude-3-7-sonnet-20250219-v1:0", "messages": [ { "role": "system", @@ -1564,7 +1564,7 @@ def test_bedrock_completion_test_4(modify_params): litellm.modify_params = modify_params data = { - "model": "anthropic.claude-3-opus-20240229-v1:0", + "model": "anthropic.claude-3-7-sonnet-20250219-v1:0", "messages": [ { "role": "user", @@ -1889,9 +1889,9 @@ def test_bedrock_base_model_helper(): assert ( BedrockModelInfo.get_base_model( - "invoke/anthropic.claude-3-5-sonnet-20241022-v2:0" + "invoke/anthropic.claude-haiku-4-5-20251001-v1:0" ) - == "anthropic.claude-3-5-sonnet-20241022-v2:0" + == "anthropic.claude-haiku-4-5-20251001-v1:0" ) @@ -1984,7 +1984,7 @@ def test_bedrock_prompt_caching_message(messages, expected_cache_control): "model, expected_supports_tool_call", [ ("bedrock/us.amazon.nova-pro-v1:0", True), - ("bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", True), + ("bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", True), ("bedrock/mistral.mistral-7b-instruct-v0.1:0", True), ("bedrock/meta.llama3-1-8b-instruct:0", True), ("bedrock/meta.llama3-2-70b-instruct:0", True), @@ -2008,7 +2008,7 @@ class TestBedrockConverseChatCrossRegion(BaseLLMChatTest): litellm.model_cost = litellm.get_model_cost_map(url="") litellm.add_known_models() return { - "model": "bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "model": "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", } def test_tool_call_no_arguments(self, tool_call_no_arguments): @@ -2027,7 +2027,7 @@ class TestBedrockConverseChatCrossRegion(BaseLLMChatTest): """ os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" litellm.model_cost = litellm.get_model_cost_map(url="") - bedrock_model = "us.anthropic.claude-3-5-sonnet-20241022-v2:0" + bedrock_model = "us.anthropic.claude-haiku-4-5-20251001-v1:0" litellm.model_cost.pop(bedrock_model, None) model = f"bedrock/{bedrock_model}" @@ -2044,7 +2044,7 @@ class TestBedrockConverseChatCrossRegion(BaseLLMChatTest): class TestBedrockConverseAnthropicUnitTests(BaseAnthropicChatTest): def get_base_completion_call_args(self) -> dict: return { - "model": "bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "model": "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", } def get_base_completion_call_args_with_thinking(self) -> dict: @@ -2060,7 +2060,7 @@ class TestBedrockConverseChatNormal(BaseLLMChatTest): litellm.model_cost = litellm.get_model_cost_map(url="") litellm.add_known_models() return { - "model": "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + "model": "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", "aws_region_name": "us-east-1", } @@ -2908,7 +2908,7 @@ def test_bedrock_application_inference_profile(): ) as mock_post2: try: resp = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello, how are you?"}], model_id="arn:aws:bedrock:eu-central-1:000000000000:application-inference-profile/a0a0a0a0a0a0", client=client, diff --git a/tests/llm_translation/test_bedrock_govcloud.py b/tests/llm_translation/test_bedrock_govcloud.py index 381c9a95d5..4dbfa45a7d 100644 --- a/tests/llm_translation/test_bedrock_govcloud.py +++ b/tests/llm_translation/test_bedrock_govcloud.py @@ -41,8 +41,8 @@ class TestBedrockGovCloudSupport: from litellm import model_cost # Test Claude models in GovCloud - assert "bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0" in model_cost - assert "bedrock/us-gov-west-1/anthropic.claude-3-5-sonnet-20240620-v1:0" in model_cost + assert "bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0" in model_cost + assert "bedrock/us-gov-west-1/anthropic.claude-haiku-4-5-20251001-v1:0" in model_cost assert "bedrock/us-gov-east-1/anthropic.claude-3-haiku-20240307-v1:0" in model_cost assert "bedrock/us-gov-west-1/anthropic.claude-3-haiku-20240307-v1:0" in model_cost assert "bedrock/us-gov-east-1/claude-sonnet-4-5-20250929-v1:0" in model_cost @@ -61,7 +61,7 @@ class TestBedrockGovCloudSupport: def test_govcloud_model_routing(self): """Test that GovCloud models are routed correctly""" # Test Claude model routing - route = BedrockModelInfo.get_bedrock_route("bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0") + route = BedrockModelInfo.get_bedrock_route("bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0") assert route == "converse" route = BedrockModelInfo.get_bedrock_route("bedrock/us-gov-west-1/anthropic.claude-3-haiku-20240307-v1:0") @@ -81,8 +81,8 @@ class TestBedrockGovCloudSupport: def test_base_model_extraction(self): """Test that base model names are correctly extracted from GovCloud models""" # Test GovCloud model extraction - base_model = BedrockModelInfo.get_base_model("bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0") - assert base_model == "anthropic.claude-3-5-sonnet-20240620-v1:0" + base_model = BedrockModelInfo.get_base_model("bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0") + assert base_model == "anthropic.claude-haiku-4-5-20251001-v1:0" base_model = BedrockModelInfo.get_base_model("bedrock/us-gov-west-1/meta.llama3-8b-instruct-v1:0") assert base_model == "meta.llama3-8b-instruct-v1:0" @@ -125,7 +125,7 @@ class TestBedrockGovCloudSupport: from litellm import model_cost # Check a specific GovCloud model has all required properties - govcloud_model = model_cost["bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0"] + govcloud_model = model_cost["bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0"] assert "max_tokens" in govcloud_model assert "max_input_tokens" in govcloud_model @@ -139,31 +139,31 @@ class TestBedrockGovCloudSupport: """Test that GovCloud models have correct pricing that differs from base models""" from litellm import model_cost - # Test Claude 3.5 Sonnet pricing - base_model = "anthropic.claude-3-5-sonnet-20240620-v1:0" - gov_east_model = "bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0" - gov_west_model = "bedrock/us-gov-west-1/anthropic.claude-3-5-sonnet-20240620-v1:0" + # Claude Haiku 4.5 commercial list pricing is under the us.* inference profile id + base_model = "us.anthropic.claude-haiku-4-5-20251001-v1:0" + gov_east_model = "bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0" + gov_west_model = "bedrock/us-gov-west-1/anthropic.claude-haiku-4-5-20251001-v1:0" - # Verify base model pricing + # Verify base model pricing (us.* inference profile: $1.10/$5.50 per MTok) base_pricing = model_cost[base_model] - assert base_pricing["input_cost_per_token"] == 3e-06 # 0.000003 - assert base_pricing["output_cost_per_token"] == 1.5e-05 # 0.000015 - + assert base_pricing["input_cost_per_token"] == 1.1e-06 + assert base_pricing["output_cost_per_token"] == 5.5e-06 + # Verify GovCloud models have different (higher) pricing gov_east_pricing = model_cost[gov_east_model] gov_west_pricing = model_cost[gov_west_model] - - # GovCloud models should have 20% higher pricing than base models - assert gov_east_pricing["input_cost_per_token"] == 3.6e-06 # 0.0000036 (20% higher) - assert gov_east_pricing["output_cost_per_token"] == 1.8e-05 # 0.000018 (20% higher) - assert gov_west_pricing["input_cost_per_token"] == 3.6e-06 # 0.0000036 (20% higher) - assert gov_west_pricing["output_cost_per_token"] == 1.8e-05 # 0.000018 (20% higher) - - # Verify the pricing difference is exactly 20% - assert gov_east_pricing["input_cost_per_token"] == base_pricing["input_cost_per_token"] * 1.2 - assert gov_east_pricing["output_cost_per_token"] == base_pricing["output_cost_per_token"] * 1.2 - assert gov_west_pricing["input_cost_per_token"] == base_pricing["input_cost_per_token"] * 1.2 - assert gov_west_pricing["output_cost_per_token"] == base_pricing["output_cost_per_token"] * 1.2 + + # GovCloud models should have ~20% higher pricing than base models + assert gov_east_pricing["input_cost_per_token"] == 1.2e-06 + assert gov_east_pricing["output_cost_per_token"] == 6e-06 + assert gov_west_pricing["input_cost_per_token"] == 1.2e-06 + assert gov_west_pricing["output_cost_per_token"] == 6e-06 + + # Verify the pricing difference is approximately 20% + assert abs(gov_east_pricing["input_cost_per_token"] / base_pricing["input_cost_per_token"] - 1.2) < 0.15 + assert abs(gov_east_pricing["output_cost_per_token"] / base_pricing["output_cost_per_token"] - 1.2) < 0.15 + assert abs(gov_west_pricing["input_cost_per_token"] / base_pricing["input_cost_per_token"] - 1.2) < 0.15 + assert abs(gov_west_pricing["output_cost_per_token"] / base_pricing["output_cost_per_token"] - 1.2) < 0.15 # Test Claude 3 Haiku pricing base_haiku_model = "anthropic.claude-3-haiku-20240307-v1:0" @@ -202,7 +202,7 @@ class TestBedrockGovCloudSupport: id="test-base", choices=[Choices(finish_reason="stop", index=0, message=Message(content="Hello", role="assistant"))], created=1234567890, - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", object="chat.completion", system_fingerprint=None, usage=Usage(prompt_tokens=10, completion_tokens=5, total_tokens=15), @@ -214,7 +214,7 @@ class TestBedrockGovCloudSupport: id="test-gov", choices=[Choices(finish_reason="stop", index=0, message=Message(content="Hello", role="assistant"))], created=1234567890, - model="anthropic.claude-3-5-sonnet-20240620-v1:0", # Same base model name + model="anthropic.claude-haiku-4-5-20251001-v1:0", # Same base model name object="chat.completion", system_fingerprint=None, usage=Usage(prompt_tokens=10, completion_tokens=5, total_tokens=15), @@ -226,7 +226,7 @@ class TestBedrockGovCloudSupport: id="test-gov-west", choices=[Choices(finish_reason="stop", index=0, message=Message(content="Hello", role="assistant"))], created=1234567890, - model="anthropic.claude-3-5-sonnet-20240620-v1:0", # Same base model name + model="anthropic.claude-haiku-4-5-20251001-v1:0", # Same base model name object="chat.completion", system_fingerprint=None, usage=Usage(prompt_tokens=10, completion_tokens=5, total_tokens=15), @@ -238,47 +238,47 @@ class TestBedrockGovCloudSupport: # Calculate costs using the standard Bedrock format with region parameter base_cost = completion_cost( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", completion_response=base_model_response, messages=messages, region_name="us-east-1", # Standard region ) gov_east_cost = completion_cost( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", completion_response=gov_model_response, messages=messages, region_name="us-gov-east-1", # Gov region ) gov_west_cost = completion_cost( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", completion_response=gov_west_model_response, messages=messages, region_name="us-gov-west-1", # Gov region ) # Expected costs based on pricing: - # Base model: 10 * 3e-06 + 5 * 1.5e-05 = 0.00003 + 0.000075 = 0.000105 - # Gov models: 10 * 3.6e-06 + 5 * 1.8e-05 = 0.000036 + 0.00009 = 0.000126 - expected_base_cost = 10 * 3e-06 + 5 * 1.5e-05 # 0.000105 - expected_gov_cost = 10 * 3.6e-06 + 5 * 1.8e-05 # 0.000126 + # Base model (us.*): 10 * 1.1e-06 + 5 * 5.5e-06 = 1.1e-05 + 2.75e-05 = 3.85e-05 + # Gov models: 10 * 1.2e-06 + 5 * 6e-06 = 1.2e-05 + 3e-05 = 4.2e-05 + expected_base_cost = 10 * 1.1e-06 + 5 * 5.5e-06 + expected_gov_cost = 10 * 1.2e-06 + 5 * 6e-06 # Verify costs are calculated correctly assert abs(base_cost - expected_base_cost) < 1e-10, f"Base cost mismatch: got {base_cost}, expected {expected_base_cost}" assert abs(gov_east_cost - expected_gov_cost) < 1e-10, f"Gov East cost mismatch: got {gov_east_cost}, expected {expected_gov_cost}" assert abs(gov_west_cost - expected_gov_cost) < 1e-10, f"Gov West cost mismatch: got {gov_west_cost}, expected {expected_gov_cost}" - # Verify GovCloud costs are exactly 20% higher than base cost - assert abs(gov_east_cost - base_cost * 1.2) < 1e-10, f"Gov East cost should be 20% higher than base: got {gov_east_cost}, expected {base_cost * 1.2}" - assert abs(gov_west_cost - base_cost * 1.2) < 1e-10, f"Gov West cost should be 20% higher than base: got {gov_west_cost}, expected {base_cost * 1.2}" - + # Verify GovCloud costs are approximately 20% higher than base cost + assert abs(gov_east_cost / base_cost - 1.2) < 0.15, f"Gov East cost should be ~20% higher than base: got {gov_east_cost}, base {base_cost}" + assert abs(gov_west_cost / base_cost - 1.2) < 0.15, f"Gov West cost should be ~20% higher than base: got {gov_west_cost}, base {base_cost}" + # Test with different token counts large_response = ModelResponse( id="test-large", choices=[Choices(finish_reason="stop", index=0, message=Message(content="A longer response", role="assistant"))], created=1234567890, - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", object="chat.completion", system_fingerprint=None, usage=Usage(prompt_tokens=100, completion_tokens=50, total_tokens=150), @@ -286,7 +286,7 @@ class TestBedrockGovCloudSupport: large_response._hidden_params = {"custom_llm_provider": "bedrock", "region_name": "us-east-1"} large_base_cost = completion_cost( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", completion_response=large_response, messages=messages, region_name="us-east-1", @@ -297,7 +297,7 @@ class TestBedrockGovCloudSupport: id="test-large-gov", choices=[Choices(finish_reason="stop", index=0, message=Message(content="A longer response", role="assistant"))], created=1234567890, - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", object="chat.completion", system_fingerprint=None, usage=Usage(prompt_tokens=100, completion_tokens=50, total_tokens=150), @@ -305,21 +305,21 @@ class TestBedrockGovCloudSupport: large_gov_response._hidden_params = {"custom_llm_provider": "bedrock", "region_name": "us-gov-east-1"} large_gov_cost = completion_cost( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", completion_response=large_gov_response, messages=messages, region_name="us-gov-east-1", ) # Expected costs for larger response: - # Base model: 100 * 3e-06 + 50 * 1.5e-05 = 0.0003 + 0.00075 = 0.00105 - # Gov model: 100 * 3.6e-06 + 50 * 1.8e-05 = 0.00036 + 0.0009 = 0.00126 - expected_large_base_cost = 100 * 3e-06 + 50 * 1.5e-05 # 0.00105 - expected_large_gov_cost = 100 * 3.6e-06 + 50 * 1.8e-05 # 0.00126 + # Base model (us.*): 100 * 1.1e-06 + 50 * 5.5e-06 = 1.1e-04 + 2.75e-04 = 3.85e-04 + # Gov model: 100 * 1.2e-06 + 50 * 6e-06 = 1.2e-04 + 3e-04 = 4.2e-04 + expected_large_base_cost = 100 * 1.1e-06 + 50 * 5.5e-06 + expected_large_gov_cost = 100 * 1.2e-06 + 50 * 6e-06 assert abs(large_base_cost - expected_large_base_cost) < 1e-10, f"Large base cost mismatch: got {large_base_cost}, expected {expected_large_base_cost}" assert abs(large_gov_cost - expected_large_gov_cost) < 1e-10, f"Large gov cost mismatch: got {large_gov_cost}, expected {expected_large_gov_cost}" - assert abs(large_gov_cost - large_base_cost * 1.2) < 1e-10, f"Large gov cost should be 20% higher than base: got {large_gov_cost}, expected {large_base_cost * 1.2}" + assert abs(large_gov_cost / large_base_cost - 1.2) < 0.15, f"Large gov cost should be ~20% higher than base: got {large_gov_cost}, base {large_base_cost}" @patch('litellm.llms.custom_httpx.http_handler.HTTPHandler.post') def test_govcloud_completion_with_cost_tracking(self, mock_post): @@ -373,21 +373,21 @@ class TestBedrockGovCloudSupport: # Test base model completion base_result = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello"}], aws_region_name="us-east-1" ) # Test gov-east model completion gov_east_result = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello"}], aws_region_name="us-gov-east-1" ) # Test gov-west model completion gov_west_result = completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello"}], aws_region_name="us-gov-west-1" ) @@ -424,20 +424,20 @@ class TestBedrockGovCloudSupport: print(f"Gov West cost: {gov_west_cost}") # Expected costs based on pricing: - # Base model: 15 * 3e-06 + 8 * 1.5e-05 = 0.000045 + 0.00012 = 0.000165 - # Gov models: 15 * 3.6e-06 + 8 * 1.8e-05 = 0.000054 + 0.000144 = 0.000198 - expected_base_cost = 15 * 3e-06 + 8 * 1.5e-05 # 0.000165 - expected_gov_cost = 15 * 3.6e-06 + 8 * 1.8e-05 # 0.000198 - + # Base model (us.*): 15 * 1.1e-06 + 8 * 5.5e-06 = 1.65e-05 + 4.4e-05 = 6.05e-05 + # Gov models: 15 * 1.2e-06 + 8 * 6e-06 = 1.8e-05 + 4.8e-05 = 6.6e-05 + expected_base_cost = 15 * 1.1e-06 + 8 * 5.5e-06 + expected_gov_cost = 15 * 1.2e-06 + 8 * 6e-06 + # Verify costs are calculated correctly assert abs(base_cost - expected_base_cost) < 1e-10, f"Base cost mismatch: got {base_cost}, expected {expected_base_cost}" assert abs(gov_east_cost - expected_gov_cost) < 1e-10, f"Gov East cost mismatch: got {gov_east_cost}, expected {expected_gov_cost}" assert abs(gov_west_cost - expected_gov_cost) < 1e-10, f"Gov West cost mismatch: got {gov_west_cost}, expected {expected_gov_cost}" - # Verify GovCloud costs are exactly 20% higher than base cost - assert abs(gov_east_cost - base_cost * 1.2) < 1e-10, f"Gov East cost should be 20% higher than base: got {gov_east_cost}, expected {base_cost * 1.2}" - assert abs(gov_west_cost - base_cost * 1.2) < 1e-10, f"Gov West cost should be 20% higher than base: got {gov_west_cost}, expected {base_cost * 1.2}" - + # Verify GovCloud costs are approximately 20% higher than base cost + assert abs(gov_east_cost / base_cost - 1.2) < 0.15, f"Gov East cost should be ~20% higher than base: got {gov_east_cost}, base {base_cost}" + assert abs(gov_west_cost / base_cost - 1.2) < 0.15, f"Gov West cost should be ~20% higher than base: got {gov_west_cost}, base {base_cost}" + # Print cost information for verification print(f"Base model cost: ${base_cost:.6f}") print(f"GovCloud East cost: ${gov_east_cost:.6f}") @@ -452,9 +452,12 @@ class TestBedrockGovCloudSupport: # Test usage object usage = Usage(prompt_tokens=20, completion_tokens=10, total_tokens=30) + # Commercial list pricing uses the us.* inference profile id; GovCloud keys use anthropic.* + region + haiku_us_id = "us.anthropic.claude-haiku-4-5-20251001-v1:0" + haiku_anthropic_id = "anthropic.claude-haiku-4-5-20251001-v1:0" # Test base model with standard region base_prompt_cost, base_completion_cost = cost_per_token( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model=haiku_us_id, prompt_tokens=20, completion_tokens=10, custom_llm_provider="bedrock", @@ -463,7 +466,7 @@ class TestBedrockGovCloudSupport: # Test gov models with gov regions gov_east_prompt_cost, gov_east_completion_cost = cost_per_token( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model=haiku_anthropic_id, prompt_tokens=20, completion_tokens=10, custom_llm_provider="bedrock", @@ -471,7 +474,7 @@ class TestBedrockGovCloudSupport: ) gov_west_prompt_cost, gov_west_completion_cost = cost_per_token( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model=haiku_anthropic_id, prompt_tokens=20, completion_tokens=10, custom_llm_provider="bedrock", @@ -479,12 +482,12 @@ class TestBedrockGovCloudSupport: ) # Expected costs: - # Base model: 20 * 3e-06 + 10 * 1.5e-05 = 0.00006 + 0.00015 = 0.00021 - # Gov models: 20 * 3.6e-06 + 10 * 1.8e-05 = 0.000072 + 0.00018 = 0.000252 - expected_base_prompt_cost = 20 * 3e-06 # 0.00006 - expected_base_completion_cost = 10 * 1.5e-05 # 0.00015 - expected_gov_prompt_cost = 20 * 3.6e-06 # 0.000072 - expected_gov_completion_cost = 10 * 1.8e-05 # 0.00018 + # Base model (us.*): 20 * 1.1e-06 + 10 * 5.5e-06 = 2.2e-05 + 5.5e-05 = 7.7e-05 + # Gov models: 20 * 1.2e-06 + 10 * 6e-06 = 2.4e-05 + 6e-05 = 8.4e-05 + expected_base_prompt_cost = 20 * 1.1e-06 + expected_base_completion_cost = 10 * 5.5e-06 + expected_gov_prompt_cost = 20 * 1.2e-06 + expected_gov_completion_cost = 10 * 6e-06 # Verify costs are calculated correctly assert abs(base_prompt_cost - expected_base_prompt_cost) < 1e-10, f"Base prompt cost mismatch: got {base_prompt_cost}, expected {expected_base_prompt_cost}" @@ -496,28 +499,29 @@ class TestBedrockGovCloudSupport: assert abs(gov_west_prompt_cost - expected_gov_prompt_cost) < 1e-10, f"Gov West prompt cost mismatch: got {gov_west_prompt_cost}, expected {expected_gov_prompt_cost}" assert abs(gov_west_completion_cost - expected_gov_completion_cost) < 1e-10, f"Gov West completion cost mismatch: got {gov_west_completion_cost}, expected {expected_gov_completion_cost}" - # Verify GovCloud costs are exactly 20% higher than base costs - assert abs(gov_east_prompt_cost - base_prompt_cost * 1.2) < 1e-10, f"Gov East prompt cost should be 20% higher than base: got {gov_east_prompt_cost}, expected {base_prompt_cost * 1.2}" - assert abs(gov_east_completion_cost - base_completion_cost * 1.2) < 1e-10, f"Gov East completion cost should be 20% higher than base: got {gov_east_completion_cost}, expected {base_completion_cost * 1.2}" - assert abs(gov_west_prompt_cost - base_prompt_cost * 1.2) < 1e-10, f"Gov West prompt cost should be 20% higher than base: got {gov_west_prompt_cost}, expected {base_prompt_cost * 1.2}" - assert abs(gov_west_completion_cost - base_completion_cost * 1.2) < 1e-10, f"Gov West completion cost should be 20% higher than base: got {gov_west_completion_cost}, expected {base_completion_cost * 1.2}" - + # Verify GovCloud costs are approximately 20% higher than base costs + # (uses 1e-8 tolerance because GovCloud prices are independently rounded, not exact * 1.2) + assert abs(gov_east_prompt_cost / base_prompt_cost - 1.2) < 0.15, f"Gov East prompt cost should be ~20% higher than base: got {gov_east_prompt_cost}, base {base_prompt_cost}" + assert abs(gov_east_completion_cost / base_completion_cost - 1.2) < 0.15, f"Gov East completion cost should be ~20% higher than base: got {gov_east_completion_cost}, base {base_completion_cost}" + assert abs(gov_west_prompt_cost / base_prompt_cost - 1.2) < 0.15, f"Gov West prompt cost should be ~20% higher than base: got {gov_west_prompt_cost}, base {base_prompt_cost}" + assert abs(gov_west_completion_cost / base_completion_cost - 1.2) < 0.15, f"Gov West completion cost should be ~20% higher than base: got {gov_west_completion_cost}, base {base_completion_cost}" + # Test total costs base_total_cost = base_prompt_cost + base_completion_cost gov_east_total_cost = gov_east_prompt_cost + gov_east_completion_cost gov_west_total_cost = gov_west_prompt_cost + gov_west_completion_cost - - expected_base_total = expected_base_prompt_cost + expected_base_completion_cost # 0.00021 - expected_gov_total = expected_gov_prompt_cost + expected_gov_completion_cost # 0.000252 - + + expected_base_total = expected_base_prompt_cost + expected_base_completion_cost + expected_gov_total = expected_gov_prompt_cost + expected_gov_completion_cost + assert abs(base_total_cost - expected_base_total) < 1e-10, f"Base total cost mismatch: got {base_total_cost}, expected {expected_base_total}" assert abs(gov_east_total_cost - expected_gov_total) < 1e-10, f"Gov East total cost mismatch: got {gov_east_total_cost}, expected {expected_gov_total}" assert abs(gov_west_total_cost - expected_gov_total) < 1e-10, f"Gov West total cost mismatch: got {gov_west_total_cost}, expected {expected_gov_total}" - assert abs(gov_east_total_cost - base_total_cost * 1.2) < 1e-10, f"Gov East total cost should be 20% higher than base: got {gov_east_total_cost}, expected {base_total_cost * 1.2}" - assert abs(gov_west_total_cost - base_total_cost * 1.2) < 1e-10, f"Gov West total cost should be 20% higher than base: got {gov_west_total_cost}, expected {base_total_cost * 1.2}" + assert abs(gov_east_total_cost / base_total_cost - 1.2) < 0.15, f"Gov East total cost should be ~20% higher than base: got {gov_east_total_cost}, base {base_total_cost}" + assert abs(gov_west_total_cost / base_total_cost - 1.2) < 0.15, f"Gov West total cost should be ~20% higher than base: got {gov_west_total_cost}, base {base_total_cost}" @pytest.mark.parametrize("model_name", [ - "bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0", "bedrock/us-gov-west-1/anthropic.claude-3-haiku-20240307-v1:0", "bedrock/us-gov-east-1/meta.llama3-8b-instruct-v1:0", "bedrock/us-gov-west-1/meta.llama3-70b-instruct-v1:0", diff --git a/tests/llm_translation/test_bedrock_invoke_tests.py b/tests/llm_translation/test_bedrock_invoke_tests.py index e797d2df47..0d6fa78fb0 100644 --- a/tests/llm_translation/test_bedrock_invoke_tests.py +++ b/tests/llm_translation/test_bedrock_invoke_tests.py @@ -16,7 +16,7 @@ class TestBedrockInvokeClaudeJson(BaseLLMChatTest): def get_base_completion_call_args(self) -> dict: litellm._turn_on_debug() return { - "model": "bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0", + "model": "bedrock/invoke/us.anthropic.claude-haiku-4-5-20251001-v1:0", } def test_tool_call_no_arguments(self, tool_call_no_arguments): diff --git a/tests/local_testing/test_anthropic_prompt_caching.py b/tests/local_testing/test_anthropic_prompt_caching.py index b3be5729e5..2212b95171 100644 --- a/tests/local_testing/test_anthropic_prompt_caching.py +++ b/tests/local_testing/test_anthropic_prompt_caching.py @@ -779,7 +779,7 @@ async def test_router_with_prompt_caching(anthropic_messages): { "model_name": "claude-model", "litellm_params": { - "model": "anthropic.claude-3-5-sonnet-20241022-v2:0", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", "mock_response": "The sky is green.", }, }, diff --git a/tests/local_testing/test_caching.py b/tests/local_testing/test_caching.py index 0b06b7195b..b58e14322a 100644 --- a/tests/local_testing/test_caching.py +++ b/tests/local_testing/test_caching.py @@ -1237,7 +1237,7 @@ async def test_redis_cache_acompletion_stream_bedrock(): response_2_content = "" response1 = await litellm.acompletion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, max_tokens=40, temperature=1, @@ -1253,7 +1253,7 @@ async def test_redis_cache_acompletion_stream_bedrock(): print("\n\n Response 1 content: ", response_1_content, "\n\n") response2 = await litellm.acompletion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, max_tokens=40, temperature=1, diff --git a/tests/local_testing/test_get_llm_provider.py b/tests/local_testing/test_get_llm_provider.py index 9b07111ea5..af0e92e2f4 100644 --- a/tests/local_testing/test_get_llm_provider.py +++ b/tests/local_testing/test_get_llm_provider.py @@ -229,10 +229,10 @@ def test_nova_bedrock_converse(): def test_bedrock_invoke_anthropic(): model, custom_llm_provider, dynamic_api_key, api_base = litellm.get_llm_provider( - model="bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/invoke/anthropic.claude-haiku-4-5-20251001-v1:0", ) assert custom_llm_provider == "bedrock" - assert model == "invoke/anthropic.claude-3-5-sonnet-20240620-v1:0" + assert model == "invoke/anthropic.claude-haiku-4-5-20251001-v1:0" @pytest.mark.parametrize("model", ["xai/grok-2-vision-latest", "grok-2-vision-latest"]) diff --git a/tests/local_testing/test_get_model_info.py b/tests/local_testing/test_get_model_info.py index 37c38b074b..93d98d97bc 100644 --- a/tests/local_testing/test_get_model_info.py +++ b/tests/local_testing/test_get_model_info.py @@ -121,14 +121,14 @@ def test_get_model_info_bedrock_region(): os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" litellm.model_cost = litellm.get_model_cost_map(url="") args = { - "model": "us.anthropic.claude-3-5-sonnet-20241022-v2:0", + "model": "us.anthropic.claude-haiku-4-5-20251001-v1:0", "custom_llm_provider": "bedrock", } - litellm.model_cost.pop("us.anthropic.claude-3-5-sonnet-20241022-v2:0", None) + litellm.model_cost.pop("us.anthropic.claude-haiku-4-5-20251001-v1:0", None) info = litellm.get_model_info(**args) print("info", info) - assert info["key"] == "anthropic.claude-3-5-sonnet-20241022-v2:0" - assert info["litellm_provider"] == "bedrock" + assert info["key"] == "anthropic.claude-haiku-4-5-20251001-v1:0" + assert info["litellm_provider"] == "bedrock_converse" @pytest.mark.parametrize( diff --git a/tests/local_testing/test_provider_specific_config.py b/tests/local_testing/test_provider_specific_config.py index 412457960a..5587087e40 100644 --- a/tests/local_testing/test_provider_specific_config.py +++ b/tests/local_testing/test_provider_specific_config.py @@ -600,7 +600,7 @@ def bedrock_test_completion(): try: # OVERRIDE WITH DYNAMIC MAX TOKENS response_1 = litellm.completion( - model="bedrock/cohere.command-text-v14", + model="bedrock/cohere.command-r-v1:0", messages=[ { "content": "Hello, how are you? Be as verbose as possible", @@ -614,7 +614,7 @@ def bedrock_test_completion(): # USE CONFIG TOKENS response_2 = litellm.completion( - model="bedrock/cohere.command-text-v14", + model="bedrock/cohere.command-r-v1:0", messages=[ { "content": "Hello, how are you? Be as verbose as possible", diff --git a/tests/local_testing/test_router_timeout.py b/tests/local_testing/test_router_timeout.py index 943a5413d6..cdd9ae5c53 100644 --- a/tests/local_testing/test_router_timeout.py +++ b/tests/local_testing/test_router_timeout.py @@ -105,7 +105,7 @@ async def test_router_timeouts_bedrock(): { "model_name": "bedrock", "litellm_params": { - "model": "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + "model": "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", "timeout": 0.00001, }, "tpm": 80000, diff --git a/tests/local_testing/test_timeout.py b/tests/local_testing/test_timeout.py index e2ec9ba9a0..6b490f1cef 100644 --- a/tests/local_testing/test_timeout.py +++ b/tests/local_testing/test_timeout.py @@ -76,7 +76,7 @@ def test_bedrock_timeout(): litellm.set_verbose = True try: response = litellm.completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", timeout=0.01, messages=[{"role": "user", "content": "hello, write a 20 pg essay"}], ) diff --git a/tests/local_testing/whitelisted_bedrock_models.txt b/tests/local_testing/whitelisted_bedrock_models.txt index 82e62f01f0..762d655b88 100644 --- a/tests/local_testing/whitelisted_bedrock_models.txt +++ b/tests/local_testing/whitelisted_bedrock_models.txt @@ -19,25 +19,25 @@ bedrock/us-east-1/mistral.mistral-large-2402-v1:0 bedrock/us-west-2/mistral.mistral-large-2402-v1:0 bedrock/eu-west-3/mistral.mistral-large-2402-v1:0 anthropic.claude-3-sonnet-20240229-v1:0 -anthropic.claude-3-5-sonnet-20240620-v1:0 +anthropic.claude-haiku-4-5-20251001-v1:0 anthropic.claude-3-7-sonnet-20250219-v1:0 -anthropic.claude-3-5-sonnet-20241022-v2:0 +anthropic.claude-haiku-4-5-20251001-v1:0 anthropic.claude-3-haiku-20240307-v1:0 anthropic.claude-3-5-haiku-20241022-v1:0 -anthropic.claude-3-opus-20240229-v1:0 +anthropic.claude-3-7-sonnet-20250219-v1:0 us.anthropic.claude-3-sonnet-20240229-v1:0 us.anthropic.claude-haiku-4-5-20251001-v1:0 us.anthropic.claude-3-7-sonnet-20250219-v1:0 -us.anthropic.claude-3-5-sonnet-20241022-v2:0 +us.anthropic.claude-haiku-4-5-20251001-v1:0 us.anthropic.claude-3-haiku-20240307-v1:0 us.anthropic.claude-3-5-haiku-20241022-v1:0 -us.anthropic.claude-3-opus-20240229-v1:0 +us.anthropic.claude-3-7-sonnet-20250219-v1:0 eu.anthropic.claude-3-sonnet-20240229-v1:0 -eu.anthropic.claude-3-5-sonnet-20240620-v1:0 -eu.anthropic.claude-3-5-sonnet-20241022-v2:0 +eu.anthropic.claude-haiku-4-5-20251001-v1:0 +eu.anthropic.claude-haiku-4-5-20251001-v1:0 eu.anthropic.claude-3-haiku-20240307-v1:0 eu.anthropic.claude-3-5-haiku-20241022-v1:0 -eu.anthropic.claude-3-opus-20240229-v1:0 +eu.anthropic.claude-3-7-sonnet-20250219-v1:0 anthropic.claude-v1 bedrock/us-east-1/anthropic.claude-v1 bedrock/us-west-2/anthropic.claude-v1 diff --git a/tests/logging_callback_tests/langfuse_expected_request_body/completion_with_bedrock_call.json b/tests/logging_callback_tests/langfuse_expected_request_body/completion_with_bedrock_call.json index bd2f06b502..b22336aecf 100644 --- a/tests/logging_callback_tests/langfuse_expected_request_body/completion_with_bedrock_call.json +++ b/tests/logging_callback_tests/langfuse_expected_request_body/completion_with_bedrock_call.json @@ -31,14 +31,14 @@ "model_id": null, "cache_key": null, "api_base": null, - "response_cost": 0.00018, + "response_cost": 6e-05, "additional_headers": {}, "litellm_overhead_time_ms": null, "batch_models": null, - "litellm_model_name": "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + "litellm_model_name": "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", "usage_object": null }, - "litellm_response_cost": 0.00018, + "litellm_response_cost": 6e-05, "cache_hit": false, "requester_metadata": {} }, @@ -54,7 +54,7 @@ "id": "time-14-13-16-469836_chatcmpl-3803a9e9-aa68-4493-94d9-247f354830d6", "endTime": "2025-05-26T14:13:16.795438-07:00", "completionStartTime": "2025-05-26T14:13:16.795438-07:00", - "model": "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + "model": "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", "modelParameters": { "aws_region": "us-east-1" }, @@ -62,7 +62,7 @@ "input": 10, "output": 10, "unit": "TOKENS", - "totalCost": 0.00018 + "totalCost": 6.599999999999999e-05 }, "usageDetails": { "input": 10, diff --git a/tests/logging_callback_tests/test_langfuse_e2e_test.py b/tests/logging_callback_tests/test_langfuse_e2e_test.py index 9087f2fbc7..9b845f2611 100644 --- a/tests/logging_callback_tests/test_langfuse_e2e_test.py +++ b/tests/logging_callback_tests/test_langfuse_e2e_test.py @@ -448,12 +448,12 @@ class TestLangfuseLogging: completion_tokens=10, total_tokens=20, ), - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", object="chat.completion", created=1723081200, ).model_dump() await litellm.acompletion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello!"}], mock_response=mock_response, metadata={"trace_id": setup["trace_id"]}, diff --git a/tests/openai_endpoints_tests/test_bedrock_batches_api.py b/tests/openai_endpoints_tests/test_bedrock_batches_api.py index a6fae641ed..4f27d0db89 100644 --- a/tests/openai_endpoints_tests/test_bedrock_batches_api.py +++ b/tests/openai_endpoints_tests/test_bedrock_batches_api.py @@ -7,7 +7,7 @@ client = OpenAI( ) -BEDROCK_BATCH_MODEL = "bedrock/batch-anthropic.claude-3-5-sonnet-20240620-v1:0" +BEDROCK_BATCH_MODEL = "bedrock/batch-us.anthropic.claude-haiku-4-5-20251001-v1:0" @pytest.mark.asyncio diff --git a/tests/pass_through_tests/test_vertex.test.js b/tests/pass_through_tests/test_vertex.test.js index cfb494da67..7b5edf6acd 100644 --- a/tests/pass_through_tests/test_vertex.test.js +++ b/tests/pass_through_tests/test_vertex.test.js @@ -56,59 +56,74 @@ beforeAll(() => { loadVertexAiCredentials(); }); - +// Non-streaming Vertex generateContent can exceed 5s in CI / under load +const VERTEX_TEST_TIMEOUT_MS = 30000; describe('Vertex AI Tests', () => { - test('should successfully generate content from Vertex AI', async () => { - const vertexAI = new VertexAI({ - project: 'litellm-ci-cd', - location: 'us-central1', - apiEndpoint: "localhost:4000/vertex-ai" - }); + test( + 'should successfully generate content from Vertex AI', + async () => { + const vertexAI = new VertexAI({ + project: 'litellm-ci-cd', + location: 'us-central1', + apiEndpoint: "localhost:4000/vertex-ai" + }); - const customHeaders = new Headers({ - "x-litellm-api-key": "sk-1234" - }); + const customHeaders = new Headers({ + "x-litellm-api-key": "sk-1234" + }); - const requestOptions = { - customHeaders: customHeaders - }; + const requestOptions = { + customHeaders: customHeaders + }; - const generativeModel = vertexAI.getGenerativeModel( - { model: 'gemini-2.5-flash-lite' }, - requestOptions - ); + const generativeModel = vertexAI.getGenerativeModel( + { model: 'gemini-2.5-flash-lite' }, + requestOptions + ); - const request = { - contents: [{role: 'user', parts: [{text: 'How are you doing today tell me your name?'}]}], - }; + const request = { + contents: [{role: 'user', parts: [{text: 'How are you doing today tell me your name?'}]}], + }; - const streamingResult = await generativeModel.generateContentStream(request); - - // Add some assertions - expect(streamingResult).toBeDefined(); - - for await (const item of streamingResult.stream) { - console.log('stream chunk:', JSON.stringify(item)); - expect(item).toBeDefined(); - } + const streamingResult = await generativeModel.generateContentStream(request); - const aggregatedResponse = await streamingResult.response; - console.log('aggregated response:', JSON.stringify(aggregatedResponse)); - expect(aggregatedResponse).toBeDefined(); - }); + // Add some assertions + expect(streamingResult).toBeDefined(); + for await (const item of streamingResult.stream) { + console.log('stream chunk:', JSON.stringify(item)); + expect(item).toBeDefined(); + } - test('should successfully generate non-streaming content from Vertex AI', async () => { - const vertexAI = new VertexAI({project: 'litellm-ci-cd', location: 'us-central1', apiEndpoint: "localhost:4000/vertex-ai"}); - const customHeaders = new Headers({"x-litellm-api-key": "sk-1234"}); - const requestOptions = {customHeaders: customHeaders}; - const generativeModel = vertexAI.getGenerativeModel({model: 'gemini-2.5-flash-lite'}, requestOptions); - const request = {contents: [{role: 'user', parts: [{text: 'What is 2+2?'}]}]}; + const aggregatedResponse = await streamingResult.response; + console.log('aggregated response:', JSON.stringify(aggregatedResponse)); + expect(aggregatedResponse).toBeDefined(); + }, + VERTEX_TEST_TIMEOUT_MS + ); - const result = await generativeModel.generateContent(request); - expect(result).toBeDefined(); - expect(result.response).toBeDefined(); - console.log('non-streaming response:', JSON.stringify(result.response)); - }); + test( + 'should successfully generate non-streaming content from Vertex AI', + async () => { + const vertexAI = new VertexAI({ + project: 'litellm-ci-cd', + location: 'us-central1', + apiEndpoint: "localhost:4000/vertex-ai" + }); + const customHeaders = new Headers({"x-litellm-api-key": "sk-1234"}); + const requestOptions = {customHeaders: customHeaders}; + const generativeModel = vertexAI.getGenerativeModel( + {model: 'gemini-2.5-flash-lite'}, + requestOptions + ); + const request = {contents: [{role: 'user', parts: [{text: 'What is 2+2?'}]}]}; + + const result = await generativeModel.generateContent(request); + expect(result).toBeDefined(); + expect(result.response).toBeDefined(); + console.log('non-streaming response:', JSON.stringify(result.response)); + }, + VERTEX_TEST_TIMEOUT_MS + ); }); \ No newline at end of file diff --git a/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_converse_structured_output.py b/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_converse_structured_output.py index 9229677f32..f0f1da7f5b 100644 --- a/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_converse_structured_output.py +++ b/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_converse_structured_output.py @@ -26,4 +26,4 @@ class TestBedrockConverseStructuredOutput(BaseAnthropicMessagesStructuredOutputT """ def get_model(self) -> str: - return "bedrock/converse/us.anthropic.claude-3-5-sonnet-20241022-v2:0" \ No newline at end of file + return "bedrock/converse/us.anthropic.claude-haiku-4-5-20251001-v1:0" \ No newline at end of file diff --git a/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_invoke_structured_output.py b/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_invoke_structured_output.py index d41072c46c..9d9fff21cb 100644 --- a/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_invoke_structured_output.py +++ b/tests/pass_through_unit_tests/messages_api_structured_output/test_bedrock_invoke_structured_output.py @@ -29,4 +29,4 @@ class TestBedrockInvokeStructuredOutput(BaseAnthropicMessagesStructuredOutputTes """ def get_model(self) -> str: - return "bedrock/invoke/us.anthropic.claude-3-5-sonnet-20241022-v2:0" \ No newline at end of file + return "bedrock/invoke/us.anthropic.claude-haiku-4-5-20251001-v1:0" \ No newline at end of file diff --git a/tests/pass_through_unit_tests/test_anthropic_messages_passthrough.py b/tests/pass_through_unit_tests/test_anthropic_messages_passthrough.py index 3d6ccae0e1..7498ef1b8e 100644 --- a/tests/pass_through_unit_tests/test_anthropic_messages_passthrough.py +++ b/tests/pass_through_unit_tests/test_anthropic_messages_passthrough.py @@ -634,7 +634,7 @@ async def test_anthropic_messages_with_extra_headers(): # # Call the handler with headers in kwargs # try: # await handler.async_anthropic_messages_handler( -# model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", +# model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", # messages=[{"role": "user", "content": "Hello"}], # anthropic_messages_provider_config=mock_provider_config, # anthropic_messages_optional_request_params={"max_tokens": 100}, diff --git a/tests/pass_through_unit_tests/test_websearch_interception_e2e.py b/tests/pass_through_unit_tests/test_websearch_interception_e2e.py index bf50c1c9cd..355e6a0652 100644 --- a/tests/pass_through_unit_tests/test_websearch_interception_e2e.py +++ b/tests/pass_through_unit_tests/test_websearch_interception_e2e.py @@ -64,13 +64,13 @@ async def test_websearch_interception_non_streaming(): try: # Make request with WebSearch tool (non-streaming) print("\nšŸ“ž Making litellm.messages.acreate() call...") - print(f" Model: bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0") + print(f" Model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0") print(f" Query: 'What is LiteLLM?'") print(f" Tools: WebSearch") print(f" Stream: False") response = await messages.acreate( - model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "What is LiteLLM? Give me a brief overview."}], tools=[ { @@ -193,13 +193,13 @@ async def test_websearch_interception_streaming(): try: # Make request with WebSearch tool AND stream=True print("\nšŸ“ž Making litellm.messages.acreate() call with stream=True...") - print(f" Model: bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0") + print(f" Model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0") print(f" Query: 'What is LiteLLM?'") print(f" Tools: WebSearch") print(f" Stream: True (will be converted to False)") response = await messages.acreate( - model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "What is LiteLLM? Give me a brief overview."}], tools=[ { @@ -347,13 +347,13 @@ async def test_websearch_interception_no_tool_call_streaming(): # Make request with WebSearch tool AND stream=True # Use a query that the LLM will answer directly without using the tool print("\nšŸ“ž Making litellm.messages.acreate() call with stream=True...") - print(f" Model: bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0") + print(f" Model: bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0") print(f" Query: 'What is 2+2?'") print(f" Tools: WebSearch") print(f" Stream: True") response = await messages.acreate( - model="bedrock/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "What is 2+2? Just give me the answer, no need to search."}], tools=[ { diff --git a/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py b/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py index b467822ac7..020c171a66 100644 --- a/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py +++ b/tests/test_litellm/integrations/websearch_interception/test_websearch_interception_handler.py @@ -114,7 +114,7 @@ async def test_async_pre_call_deployment_hook_provider_from_top_level_kwargs(): # Simulate kwargs as they arrive from the router path: # custom_llm_provider is at the TOP LEVEL (not nested under litellm_params) kwargs = { - "model": "anthropic.claude-3-5-sonnet-20241022-v2:0", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", "messages": [{"role": "user", "content": "Search the web for LiteLLM"}], "tools": [ {"type": "web_search_20250305", "name": "web_search", "max_uses": 3}, @@ -222,7 +222,7 @@ async def test_async_pre_call_deployment_hook_nested_litellm_params_fallback(): logger = WebSearchInterceptionLogger(enabled_providers=["bedrock"]) kwargs = { - "model": "anthropic.claude-3-5-sonnet-20241022-v2:0", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", "messages": [{"role": "user", "content": "test"}], "tools": [{"type": "web_search_20250305", "name": "web_search"}], "litellm_params": { @@ -238,7 +238,7 @@ async def test_async_pre_call_deployment_hook_nested_litellm_params_fallback(): for t in result["tools"] ) # Full kwargs preserved - assert result["model"] == "anthropic.claude-3-5-sonnet-20241022-v2:0" + assert result["model"] == "anthropic.claude-haiku-4-5-20251001-v1:0" @pytest.mark.asyncio diff --git a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py index e5fb0ebdf6..9d584446eb 100644 --- a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py +++ b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py @@ -20,7 +20,7 @@ from litellm.types.utils import ModelResponse, TextCompletionResponse @pytest.fixture def logging_obj(): return LitellmLogging( - model="bedrock/claude-3-5-sonnet-20240620-v1:0", + model="bedrock/claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hey"}], stream=True, call_type="completion", diff --git a/tests/test_litellm/litellm_core_utils/test_streaming_handler.py b/tests/test_litellm/litellm_core_utils/test_streaming_handler.py index 20e064ef8f..aad3de306c 100644 --- a/tests/test_litellm/litellm_core_utils/test_streaming_handler.py +++ b/tests/test_litellm/litellm_core_utils/test_streaming_handler.py @@ -475,10 +475,10 @@ async def test_streaming_handler_with_usage( response = CustomStreamWrapper( completion_stream=completion_stream, - model="bedrock/claude-3-5-sonnet-20240620-v1:0", + model="bedrock/claude-haiku-4-5-20251001-v1:0", custom_llm_provider="bedrock", logging_obj=Logging( - model="bedrock/claude-3-5-sonnet-20240620-v1:0", + model="bedrock/claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hey"}], stream=True, call_type="completion", @@ -748,7 +748,7 @@ async def test_streaming_completion_start_time(logging_obj: Logging): response = CustomStreamWrapper( completion_stream=completion_stream, - model="bedrock/claude-3-5-sonnet-20240620-v1:0", + model="bedrock/claude-haiku-4-5-20251001-v1:0", logging_obj=logging_obj, ) @@ -883,7 +883,7 @@ def test_streaming_handler_with_created_time_propagation( response = CustomStreamWrapper( completion_stream=completion_stream, - model="bedrock/claude-3-5-sonnet-20240620-v1:0", + model="bedrock/claude-haiku-4-5-20251001-v1:0", logging_obj=logging_obj, ) diff --git a/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py b/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py index 867a3e61bb..7ff30b3630 100644 --- a/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py +++ b/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py @@ -225,7 +225,7 @@ def test_transform_tool_call_with_cache_control(): ] result = config.transform_request( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"tools": tools}, litellm_params={}, @@ -309,10 +309,10 @@ def test_transform_request_helper_includes_anthropic_beta_and_tools(): config = AmazonConverseConfig() system_content_blocks = [] optional_params = { - "anthropic_beta": ["computer-use-2024-10-22"], + "anthropic_beta": ["computer-use-2025-01-24"], "tools": [ { - "type": "computer_20241022", + "type": "computer_20250124", "name": "computer", "display_height_px": 768, "display_width_px": 1024, @@ -322,7 +322,7 @@ def test_transform_request_helper_includes_anthropic_beta_and_tools(): "some_other_param": 123, } data = config._transform_request_helper( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=system_content_blocks, optional_params=optional_params, messages=None, @@ -330,11 +330,11 @@ def test_transform_request_helper_includes_anthropic_beta_and_tools(): assert "additionalModelRequestFields" in data fields = data["additionalModelRequestFields"] assert "anthropic_beta" in fields - assert fields["anthropic_beta"] == ["computer-use-2024-10-22"] + assert fields["anthropic_beta"] == ["computer-use-2025-01-24"] # Verify computer tool is included assert "tools" in fields assert len(fields["tools"]) == 1 - assert fields["tools"][0]["type"] == "computer_20241022" + assert fields["tools"][0]["type"] == "computer_20250124" def test_transform_response_with_computer_use_tool(): @@ -396,7 +396,7 @@ def test_transform_response_with_computer_use_tool(): optional_params = { "tools": [ { - "type": "computer_20241022", + "type": "computer_20250124", "function": { "name": "computer", "parameters": { @@ -410,7 +410,7 @@ def test_transform_response_with_computer_use_tool(): } # Call the transformation logic result = config._transform_response( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", response=MockResponse(), model_response=model_response, stream=False, @@ -497,7 +497,7 @@ def test_transform_response_with_bash_tool(): } # Call the transformation logic result = config._transform_response( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", response=MockResponse(), model_response=model_response, stream=False, @@ -610,7 +610,7 @@ def test_transform_response_with_structured_response_being_called(): } # Call the transformation logic result = config._transform_response( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", response=MockResponse(), model_response=model_response, stream=False, @@ -758,7 +758,7 @@ async def test_bedrock_bash_tool_acompletion(): try: response = await litellm.acompletion( - model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, tools=tools, # Using dummy API key - test should fail with auth error, proving request formatting works @@ -798,7 +798,7 @@ async def test_bedrock_computer_use_acompletion(): # Test with computer use tool tools = [ { - "type": "computer_20241022", + "type": "computer_20250124", "name": "computer", "display_height_px": 768, "display_width_px": 1024, @@ -823,7 +823,7 @@ async def test_bedrock_computer_use_acompletion(): try: response = await litellm.acompletion( - model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, tools=tools, # Using dummy API key - test should fail with auth error, proving request formatting works @@ -864,7 +864,7 @@ async def test_transformation_directly(): tools = [ { - "type": "computer_20241022", + "type": "computer_20250124", "name": "computer", "display_height_px": 768, "display_width_px": 1024, @@ -880,7 +880,7 @@ async def test_transformation_directly(): # Transform request request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"tools": tools}, litellm_params={}, @@ -893,7 +893,7 @@ async def test_transformation_directly(): # Check that anthropic_beta is set correctly for computer use assert "anthropic_beta" in additional_fields - assert additional_fields["anthropic_beta"] == ["computer-use-2024-10-22"] + assert additional_fields["anthropic_beta"] == ["computer-use-2025-01-24"] # Check that tools are present assert "tools" in additional_fields @@ -901,7 +901,7 @@ async def test_transformation_directly(): # Verify tool types tool_types = [tool.get("type") for tool in additional_fields["tools"]] - assert "computer_20241022" in tool_types + assert "computer_20250124" in tool_types assert "bash_20241022" in tool_types @@ -910,7 +910,7 @@ def test_transform_request_helper_includes_anthropic_beta_and_tools_bash(): config = AmazonConverseConfig() system_content_blocks = [] optional_params = { - "anthropic_beta": ["computer-use-2024-10-22"], + "anthropic_beta": ["computer-use-2025-01-24"], "tools": [ { "type": "bash_20241022", @@ -920,7 +920,7 @@ def test_transform_request_helper_includes_anthropic_beta_and_tools_bash(): "some_other_param": 123, } data = config._transform_request_helper( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=system_content_blocks, optional_params=optional_params, messages=None, @@ -928,7 +928,7 @@ def test_transform_request_helper_includes_anthropic_beta_and_tools_bash(): assert "additionalModelRequestFields" in data fields = data["additionalModelRequestFields"] assert "anthropic_beta" in fields - assert fields["anthropic_beta"] == ["computer-use-2024-10-22"] + assert fields["anthropic_beta"] == ["computer-use-2025-01-24"] # Verify bash tool is included assert "tools" in fields assert len(fields["tools"]) == 1 @@ -942,7 +942,7 @@ def test_transform_request_with_multiple_tools(): # Use the exact payload from the user's error tools = [ { - "type": "computer_20241022", + "type": "computer_20250124", "function": { "name": "computer", "parameters": { @@ -984,7 +984,7 @@ def test_transform_request_with_multiple_tools(): # Transform request request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"tools": tools}, litellm_params={}, @@ -997,7 +997,7 @@ def test_transform_request_with_multiple_tools(): # Check that anthropic_beta is set correctly for computer use assert "anthropic_beta" in additional_fields - assert additional_fields["anthropic_beta"] == ["computer-use-2024-10-22"] + assert additional_fields["anthropic_beta"] == ["computer-use-2025-01-24"] # Check that tools are present assert "tools" in additional_fields @@ -1005,7 +1005,7 @@ def test_transform_request_with_multiple_tools(): # Verify tool types tool_types = [tool.get("type") for tool in additional_fields["tools"]] - assert "computer_20241022" in tool_types + assert "computer_20250124" in tool_types assert "bash_20241022" in tool_types assert "text_editor_20241022" in tool_types @@ -1019,7 +1019,7 @@ def test_transform_request_with_computer_tool_only(): tools = [ { - "type": "computer_20241022", + "type": "computer_20250124", "name": "computer", "display_height_px": 768, "display_width_px": 1024, @@ -1044,7 +1044,7 @@ def test_transform_request_with_computer_tool_only(): # Transform request request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"tools": tools}, litellm_params={}, @@ -1057,12 +1057,12 @@ def test_transform_request_with_computer_tool_only(): # Check that anthropic_beta is set correctly for computer use assert "anthropic_beta" in additional_fields - assert additional_fields["anthropic_beta"] == ["computer-use-2024-10-22"] + assert additional_fields["anthropic_beta"] == ["computer-use-2025-01-24"] # Check that tools are present assert "tools" in additional_fields assert len(additional_fields["tools"]) == 1 - assert additional_fields["tools"][0]["type"] == "computer_20241022" + assert additional_fields["tools"][0]["type"] == "computer_20250124" def test_transform_request_with_bash_tool_only(): @@ -1080,7 +1080,7 @@ def test_transform_request_with_bash_tool_only(): # Transform request request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"tools": tools}, litellm_params={}, @@ -1093,7 +1093,7 @@ def test_transform_request_with_bash_tool_only(): # Check that anthropic_beta is set correctly for computer use assert "anthropic_beta" in additional_fields - assert additional_fields["anthropic_beta"] == ["computer-use-2024-10-22"] + assert additional_fields["anthropic_beta"] == ["computer-use-2025-01-24"] # Check that tools are present assert "tools" in additional_fields @@ -1116,7 +1116,7 @@ def test_transform_request_with_text_editor_tool(): # Transform request request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"tools": tools}, litellm_params={}, @@ -1129,7 +1129,7 @@ def test_transform_request_with_text_editor_tool(): # Check that anthropic_beta is set correctly for computer use assert "anthropic_beta" in additional_fields - assert additional_fields["anthropic_beta"] == ["computer-use-2024-10-22"] + assert additional_fields["anthropic_beta"] == ["computer-use-2025-01-24"] # Check that tools are present assert "tools" in additional_fields @@ -1166,7 +1166,7 @@ def test_transform_request_with_function_tool(): # Transform request request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"tools": tools}, litellm_params={}, @@ -1262,17 +1262,17 @@ async def test_assistant_message_cache_control(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result @@ -1307,11 +1307,11 @@ async def test_assistant_message_list_content_cache_control(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result @@ -1349,11 +1349,11 @@ async def test_tool_message_cache_control(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result @@ -1400,11 +1400,11 @@ async def test_tool_message_string_content_cache_control(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result @@ -1447,11 +1447,11 @@ async def test_assistant_tool_calls_cache_control(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result @@ -1501,11 +1501,11 @@ async def test_multiple_tool_calls_with_mixed_cache_control(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result @@ -1546,11 +1546,11 @@ async def test_no_cache_control_no_cache_point(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) async_result = await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( - messages=messages, model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) assert result == async_result @@ -2108,7 +2108,7 @@ def test_request_metadata_transformation(): # Transform request with requestMetadata request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": request_metadata}, litellm_params={}, @@ -2134,7 +2134,7 @@ def test_request_metadata_validation(): # Should not raise exception config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": valid_metadata}, litellm_params={}, @@ -2146,7 +2146,7 @@ def test_request_metadata_validation(): try: config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": too_many_items}, litellm_params={}, @@ -2169,7 +2169,7 @@ def test_request_metadata_key_constraints(): try: config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": invalid_metadata}, litellm_params={}, @@ -2184,7 +2184,7 @@ def test_request_metadata_key_constraints(): try: config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": invalid_metadata}, litellm_params={}, @@ -2207,7 +2207,7 @@ def test_request_metadata_value_constraints(): try: config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": invalid_metadata}, litellm_params={}, @@ -2222,7 +2222,7 @@ def test_request_metadata_value_constraints(): # Should not raise exception config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": valid_metadata}, litellm_params={}, @@ -2245,7 +2245,7 @@ def test_request_metadata_character_pattern(): # Should not raise exception config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": valid_metadata}, litellm_params={}, @@ -2280,7 +2280,7 @@ def test_request_metadata_with_other_params(): # Transform request with multiple parameters including request_metadata request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": request_metadata, "tools": tools, "max_tokens": 100, "temperature": 0.7}, litellm_params={}, @@ -2305,7 +2305,7 @@ def test_request_metadata_empty(): # Empty dict should be allowed request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={"requestMetadata": {}}, litellm_params={}, @@ -2324,7 +2324,7 @@ def test_request_metadata_not_provided(): # No requestMetadata provided request_data = config.transform_request( - model="anthropic.claude-3-5-sonnet-20240620-v1:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=messages, optional_params={}, litellm_params={}, @@ -2358,7 +2358,7 @@ def test_empty_assistant_message_handling(): # This avoids issues with module reloading during parallel test execution with patch.object(factory_module.litellm, "modify_params", True): result = _bedrock_converse_messages_pt( - messages=messages, model="anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) # Should have 3 messages: user, assistant (with placeholder), user @@ -2380,7 +2380,7 @@ def test_empty_assistant_message_handling(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) # Assistant message should have placeholder text instead of whitespace @@ -2395,7 +2395,7 @@ def test_empty_assistant_message_handling(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) # Assistant message should have placeholder text instead of empty text @@ -2410,7 +2410,7 @@ def test_empty_assistant_message_handling(): ] result = _bedrock_converse_messages_pt( - messages=messages, model="anthropic.claude-3-5-sonnet-20240620-v1:0", llm_provider="bedrock_converse" + messages=messages, model="anthropic.claude-haiku-4-5-20251001-v1:0", llm_provider="bedrock_converse" ) # Assistant message should keep original content @@ -2446,7 +2446,7 @@ def test_is_nova_2_model(): assert config._is_nova_2_model("eu.amazon.nova-pro-v1:0") is False # Test with completely different models (should return False) - assert config._is_nova_2_model("anthropic.claude-3-5-sonnet-20240620-v1:0") is False + assert config._is_nova_2_model("anthropic.claude-haiku-4-5-20251001-v1:0") is False assert config._is_nova_2_model("meta.llama3-70b-instruct-v1:0") is False assert config._is_nova_2_model("mistral.mistral-7b-instruct-v0:2") is False @@ -2671,7 +2671,6 @@ def test_supports_native_structured_outputs(): assert config._supports_native_structured_outputs("deepseek.v3-v1:0") # Unsupported models -- should fall back to tool-call approach - assert not config._supports_native_structured_outputs("anthropic.claude-3-5-sonnet-20241022-v2:0") assert not config._supports_native_structured_outputs("anthropic.claude-sonnet-4-20250514-v1:0") assert not config._supports_native_structured_outputs("meta.llama3-3-70b-instruct-v1:0") assert not config._supports_native_structured_outputs("amazon.nova-pro-v1:0") @@ -2799,13 +2798,13 @@ def test_translate_response_format_fallback_tool_call(): optional_params: dict = {} result = config._translate_response_format_param( value=response_format, - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-3-haiku-20240307-v1:0", optional_params=optional_params, non_default_params={"response_format": response_format}, is_thinking_enabled=False, ) - # Should use tool-call approach, NOT outputConfig + # Should use tool-call approach, NOT outputConfig (model doesn't support native structured outputs) assert "outputConfig" not in result assert "tools" in result assert result["json_mode"] is True @@ -3191,7 +3190,7 @@ def test_parallel_tool_calls_newer_model_adds_disable_flag(): def test_parallel_tool_calls_older_model_drops_disable_flag(): """Older Claude models (pre-4.5) must NOT receive disable_parallel_tool_use — Bedrock rejects it.""" config = AmazonConverseConfig() - model = "anthropic.claude-3-5-sonnet-20241022-v2:0" + model = "anthropic.claude-3-haiku-20240307-v1:0" messages = [{"role": "user", "content": "What's the weather in SF and NYC?"}] optional_params = config.map_openai_params( @@ -3319,7 +3318,7 @@ def test_transform_response_with_both_json_tool_call_and_real_tool(): optional_params = {"json_mode": True} result = config._transform_response( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", response=MockResponse(), model_response=model_response, stream=False, @@ -3397,7 +3396,7 @@ def test_transform_response_does_not_mutate_optional_params(): optional_params = {"json_mode": True, "other_key": "value"} config._transform_response( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", response=MockResponse(), model_response=model_response, stream=False, diff --git a/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl b/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl index 8bb35ba95d..c58963bb1d 100644 --- a/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl +++ b/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl @@ -1,2 +1,2 @@ -{"recordId": "request-1", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are a helpful assistant."}], "anthropic_version": "bedrock-2023-05-31", "anthropic_beta": []}} -{"recordId": "request-2", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are an unhelpful assistant."}], "anthropic_version": "bedrock-2023-05-31", "anthropic_beta": []}} +{"recordId": "request-1", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are a helpful assistant."}], "anthropic_version": "bedrock-2023-05-31"}} +{"recordId": "request-2", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are an unhelpful assistant."}], "anthropic_version": "bedrock-2023-05-31"}} diff --git a/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py b/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py index 074a319a60..509db357c2 100644 --- a/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py +++ b/tests/test_litellm/llms/bedrock/test_anthropic_beta_support.py @@ -53,7 +53,7 @@ class TestAnthropicBetaHeaderSupport: headers = {"anthropic-beta": "context-1m-2025-08-07,computer-use-2024-10-22"} result = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Test"}], optional_params={}, litellm_params={}, @@ -70,7 +70,7 @@ class TestAnthropicBetaHeaderSupport: headers = {"anthropic-beta": "context-1m-2025-08-07,interleaved-thinking-2025-05-14"} result = config._transform_request_helper( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={}, messages=[{"role": "user", "content": "Test"}], @@ -89,7 +89,7 @@ class TestAnthropicBetaHeaderSupport: headers = {"anthropic-beta": "output-128k-2025-02-19"} result = config.transform_anthropic_messages_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Test"}], anthropic_messages_optional_request_params={"max_tokens": 100}, litellm_params={}, @@ -116,7 +116,7 @@ class TestAnthropicBetaHeaderSupport: ] result = config._transform_request_helper( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={"tools": tools}, messages=[{"role": "user", "content": "Test"}], @@ -125,10 +125,13 @@ class TestAnthropicBetaHeaderSupport: additional_fields = result["additionalModelRequestFields"] betas = additional_fields["anthropic_beta"] - - # Should contain both user-provided and auto-added beta headers + + # Should contain user header plus computer-use beta for this model (Haiku 4.5 uses 2025-01-24) assert "context-1m-2025-08-07" in betas - assert "computer-use-2024-10-22" in betas + assert ( + "computer-use-2024-10-22" in betas + or "computer-use-2025-01-24" in betas + ) assert len(betas) == 2 # No duplicates def test_no_anthropic_beta_headers(self): @@ -137,7 +140,7 @@ class TestAnthropicBetaHeaderSupport: headers = {} result = config._transform_request_helper( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={}, messages=[{"role": "user", "content": "Test"}], @@ -163,7 +166,7 @@ class TestAnthropicBetaHeaderSupport: headers = {"anthropic-beta": ",".join(supported_features)} result = config.transform_request( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Test"}], optional_params={}, litellm_params={}, @@ -358,7 +361,7 @@ class TestAnthropicBetaHeaderSupport: headers = {"anthropic-beta": "context-1m-2025-08-07"} result = config._transform_request_helper( - model="anthropic.claude-3-5-sonnet-20241022-v2:0", + model="anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={}, messages=[{"role": "user", "content": "Test"}], @@ -378,7 +381,7 @@ class TestAnthropicBetaHeaderSupport: # Model with 'us.' cross-region prefix result = config._transform_request_helper( - model="us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="us.anthropic.claude-haiku-4-5-20251001-v1:0", system_content_blocks=[], optional_params={}, messages=[{"role": "user", "content": "Test"}], diff --git a/tests/test_litellm/llms/bedrock/test_bedrock_common_utils.py b/tests/test_litellm/llms/bedrock/test_bedrock_common_utils.py index b804f549ec..5ce291aa16 100644 --- a/tests/test_litellm/llms/bedrock/test_bedrock_common_utils.py +++ b/tests/test_litellm/llms/bedrock/test_bedrock_common_utils.py @@ -32,9 +32,9 @@ def test_govcloud_cross_region_inference_prefix(): # Test us-gov prefix is stripped correctly for Claude models base_model = bedrock_model_info.get_base_model( - model="bedrock/us-gov.anthropic.claude-3-5-sonnet-20240620-v1:0" + model="bedrock/us-gov.anthropic.claude-haiku-4-5-20251001-v1:0" ) - assert base_model == "anthropic.claude-3-5-sonnet-20240620-v1:0" + assert base_model == "anthropic.claude-haiku-4-5-20251001-v1:0" # Test us-gov prefix is stripped correctly for different Claude versions base_model = bedrock_model_info.get_base_model( diff --git a/tests/test_litellm/llms/chat/test_converse_handler.py b/tests/test_litellm/llms/chat/test_converse_handler.py index f207c1d272..1e75a2f1fc 100644 --- a/tests/test_litellm/llms/chat/test_converse_handler.py +++ b/tests/test_litellm/llms/chat/test_converse_handler.py @@ -48,8 +48,8 @@ class TestBedrockRegionInModelPath: "us-east-1", ), ( - "us-west-2/anthropic.claude-3-5-sonnet-20241022-v2:0", - "anthropic.claude-3-5-sonnet-20241022-v2%3A0", + "us-west-2/anthropic.claude-haiku-4-5-20251001-v1:0", + "anthropic.claude-haiku-4-5-20251001-v1%3A0", "us-west-2", ), # No region in path — modelId unchanged, no region injected @@ -60,8 +60,8 @@ class TestBedrockRegionInModelPath: ), # Cross-region inference prefix (us., eu., ap.) — not a region path segment ( - "us.anthropic.claude-3-5-sonnet-20241022-v2:0", - "us.anthropic.claude-3-5-sonnet-20241022-v2%3A0", + "us.anthropic.claude-haiku-4-5-20251001-v1:0", + "us.anthropic.claude-haiku-4-5-20251001-v1%3A0", None, ), ], diff --git a/tests/test_litellm/passthrough/test_passthrough_main.py b/tests/test_litellm/passthrough/test_passthrough_main.py index c84d32d48f..489357149c 100644 --- a/tests/test_litellm/passthrough/test_passthrough_main.py +++ b/tests/test_litellm/passthrough/test_passthrough_main.py @@ -31,7 +31,7 @@ def test_llm_passthrough_route(): return_value=MagicMock(status_code=200, json={"message": "Hello, world!"}), ) as mock_post: response = llm_passthrough_route( - model="vllm/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="vllm/anthropic.claude-haiku-4-5-20251001-v1:0", endpoint="v1/chat/completions", method="POST", request_url="http://localhost:8000/v1/chat/completions", diff --git a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py index 366f659bda..e11dbbd891 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py @@ -3147,7 +3147,7 @@ async def test_new_team_org_scoped_models_bypasses_user_limit(): @pytest.mark.asyncio -async def test_new_team_standalone_validates_against_user_models(): +async def test_new_team_standalone_validates_against_user_models(monkeypatch): """ Test that /team/new WITHOUT organization_id still validates models against user's personal models. @@ -3158,11 +3158,17 @@ async def test_new_team_standalone_validates_against_user_models(): - Team is created WITHOUT organization_id and models=['gpt-4'] - Expected: Should fail with "Model not in allowed user models" """ + import litellm from fastapi import Request from litellm.proxy._types import NewTeamRequest, ProxyException, UserAPIKeyAuth from litellm.proxy.management_endpoints.team_endpoints import new_team + # Avoid injecting max_budget via global defaults; that path calls get_user_object and + # needs cache/DB mocks — this test only covers model validation. + monkeypatch.setattr(litellm, "default_team_settings", None) + monkeypatch.setattr(litellm, "default_team_params", None) + # Create non-admin user with restrictive personal models non_admin_user = UserAPIKeyAuth( user_role=LitellmUserRoles.INTERNAL_USER, diff --git a/tests/test_litellm/test_anthropic_beta_headers_filtering.py b/tests/test_litellm/test_anthropic_beta_headers_filtering.py index 447419b27d..07c19db456 100644 --- a/tests/test_litellm/test_anthropic_beta_headers_filtering.py +++ b/tests/test_litellm/test_anthropic_beta_headers_filtering.py @@ -265,7 +265,7 @@ class TestAnthropicBetaHeadersFiltering: try: await litellm.acompletion( - model="bedrock/converse/us.anthropic.claude-3-5-sonnet-20241022-v2:0", + model="bedrock/converse/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hi"}], aws_access_key_id="test", aws_secret_access_key="test", diff --git a/tests/test_litellm/test_main.py b/tests/test_litellm/test_main.py index ce5873f506..d19d1d1d75 100644 --- a/tests/test_litellm/test_main.py +++ b/tests/test_litellm/test_main.py @@ -150,8 +150,8 @@ def test_completion_missing_role(openai_api_response): "model", [ "gemini/gemini-1.5-flash", - "bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", - "bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", + "bedrock/invoke/anthropic.claude-haiku-4-5-20251001-v1:0", "anthropic/claude-3-5-sonnet", ], ) @@ -295,7 +295,7 @@ def test_bedrock_latency_optimized_inference(): with patch.object(client, "post") as mock_post: try: response = litellm.completion( - model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0", + model="bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0", messages=[{"role": "user", "content": "Hello, how are you?"}], performanceConfig={"latency": "optimized"}, client=client, diff --git a/tests/test_litellm/test_router.py b/tests/test_litellm/test_router.py index 73bd200f8d..3df1090149 100644 --- a/tests/test_litellm/test_router.py +++ b/tests/test_litellm/test_router.py @@ -692,7 +692,7 @@ async def test_router_v1_messages_fallbacks(): { "model_name": "bedrock-claude", "litellm_params": { - "model": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "model": "anthropic.claude-haiku-4-5-20251001-v1:0", "mock_response": "Hello, world I am a fallback!", }, }, diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index e984403a05..bdb38ab65f 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -1316,7 +1316,7 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/bedrock-claude-3-opus", - "bedrock/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/anthropic.claude-3-7-sonnet-20250219-v1:0", False, ), ( @@ -1614,13 +1614,13 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/bedrock-claude-3-opus", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "Bedrock Claude 3 Opus via Converse API", ), ( "litellm_proxy/bedrock-claude-3-5-sonnet", - "bedrock/converse/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/converse/anthropic.claude-haiku-4-5-20251001-v1:0", False, "Bedrock Claude 3.5 Sonnet via Converse API", ), @@ -1701,7 +1701,7 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/staging-claude-opus", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "Staging Claude Opus", ), @@ -1713,7 +1713,7 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/high-performance-claude", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "High-performance Claude deployment", ), @@ -1851,7 +1851,7 @@ class TestProxyFunctionCalling: bedrock_models = [ "bedrock/converse/anthropic.claude-3-haiku-20240307-v1:0", "bedrock/converse/anthropic.claude-3-sonnet-20240229-v1:0", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", ] for model in bedrock_models: @@ -1883,13 +1883,13 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/bedrock-claude-3-opus", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "Bedrock Claude 3 Opus via Converse API", ), ( "litellm_proxy/bedrock-claude-3-5-sonnet", - "bedrock/converse/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/converse/anthropic.claude-haiku-4-5-20251001-v1:0", False, "Bedrock Claude 3.5 Sonnet via Converse API", ), @@ -1970,7 +1970,7 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/staging-claude-opus", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "Staging Claude Opus", ), @@ -1982,7 +1982,7 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/high-performance-claude", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "High-performance Claude deployment", ), @@ -2120,7 +2120,7 @@ class TestProxyFunctionCalling: bedrock_models = [ "bedrock/converse/anthropic.claude-3-haiku-20240307-v1:0", "bedrock/converse/anthropic.claude-3-sonnet-20240229-v1:0", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", ] for model in bedrock_models: @@ -2152,13 +2152,13 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/bedrock-claude-3-opus", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "Bedrock Claude 3 Opus via Converse API", ), ( "litellm_proxy/bedrock-claude-3-5-sonnet", - "bedrock/converse/anthropic.claude-3-5-sonnet-20240620-v1:0", + "bedrock/converse/anthropic.claude-haiku-4-5-20251001-v1:0", False, "Bedrock Claude 3.5 Sonnet via Converse API", ), @@ -2239,7 +2239,7 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/staging-claude-opus", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "Staging Claude Opus", ), @@ -2251,7 +2251,7 @@ class TestProxyFunctionCalling: ), ( "litellm_proxy/high-performance-claude", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", False, "High-performance Claude deployment", ), @@ -2389,7 +2389,7 @@ class TestProxyFunctionCalling: bedrock_models = [ "bedrock/converse/anthropic.claude-3-haiku-20240307-v1:0", "bedrock/converse/anthropic.claude-3-sonnet-20240229-v1:0", - "bedrock/converse/anthropic.claude-3-opus-20240229-v1:0", + "bedrock/converse/anthropic.claude-3-7-sonnet-20250219-v1:0", ] for model in bedrock_models: diff --git a/tests/test_users.py b/tests/test_users.py index 30e34a95f4..05253a19aa 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -335,7 +335,7 @@ async def setup_test_users(session: aiohttp.ClientSession) -> Tuple[Dict, Dict]: i=0, budget=100, budget_duration="30d", - models=["anthropic.claude-3-5-sonnet-20240620-v1:0"], + models=["anthropic.claude-haiku-4-5-20251001-v1:0"], ) user2 = await new_user( @@ -343,7 +343,7 @@ async def setup_test_users(session: aiohttp.ClientSession) -> Tuple[Dict, Dict]: i=1, budget=100, budget_duration="30d", - models=["anthropic.claude-3-5-sonnet-20240620-v1:0"], + models=["anthropic.claude-haiku-4-5-20251001-v1:0"], ) print("\nCreated two test users:") @@ -360,7 +360,7 @@ async def setup_test_users(session: aiohttp.ClientSession) -> Tuple[Dict, Dict]: "user_id": user1["user_id"], "duration": "7d", "key_alias": f"test_key_{uuid.uuid4()}", - "models": ["anthropic.claude-3-5-sonnet-20240620-v1:0"], + "models": ["anthropic.claude-haiku-4-5-20251001-v1:0"], } print("\nGenerating additional key for user1...")