mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-05-06 09:42:39 +00:00
feat(bedrock): add Anthropic Claude 4 cross-region inference profile models
Fixes #5549 — adds Bedrock cross-region inference profile IDs for the Claude 4 family (Sonnet 4/4.5, Opus 4/4.1/4.5, Haiku 4.5) to BEDROCK_MODELS and BedrockModels so provider inference and validation work out-of-the-box for these identifiers. Co-Authored-By: João <joao@crewai.com>
This commit is contained in:
@@ -494,6 +494,30 @@ BedrockModels: TypeAlias = Literal[
|
|||||||
"qwen.qwen3-32b-v1:0",
|
"qwen.qwen3-32b-v1:0",
|
||||||
"qwen.qwen3-coder-30b-a3b-v1:0",
|
"qwen.qwen3-coder-30b-a3b-v1:0",
|
||||||
"twelvelabs.pegasus-1-2-v1:0",
|
"twelvelabs.pegasus-1-2-v1:0",
|
||||||
|
# Cross-region inference profiles for Anthropic Claude 4 models
|
||||||
|
"apac.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"apac.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"au.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"au.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"eu.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"eu.anthropic.claude-opus-4-1-20250805-v1:0",
|
||||||
|
"eu.anthropic.claude-opus-4-20250514-v1:0",
|
||||||
|
"eu.anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"eu.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"global.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"global.anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"global.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"global.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"jp.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"us.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-1-20250805-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-20250514-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"us.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"us.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
]
|
]
|
||||||
BEDROCK_MODELS: list[BedrockModels] = [
|
BEDROCK_MODELS: list[BedrockModels] = [
|
||||||
"ai21.jamba-1-5-large-v1:0",
|
"ai21.jamba-1-5-large-v1:0",
|
||||||
@@ -567,4 +591,28 @@ BEDROCK_MODELS: list[BedrockModels] = [
|
|||||||
"qwen.qwen3-32b-v1:0",
|
"qwen.qwen3-32b-v1:0",
|
||||||
"qwen.qwen3-coder-30b-a3b-v1:0",
|
"qwen.qwen3-coder-30b-a3b-v1:0",
|
||||||
"twelvelabs.pegasus-1-2-v1:0",
|
"twelvelabs.pegasus-1-2-v1:0",
|
||||||
|
# Cross-region inference profiles for Anthropic Claude 4 models
|
||||||
|
"apac.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"apac.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"au.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"au.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"eu.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"eu.anthropic.claude-opus-4-1-20250805-v1:0",
|
||||||
|
"eu.anthropic.claude-opus-4-20250514-v1:0",
|
||||||
|
"eu.anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"eu.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"global.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"global.anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"global.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"global.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"jp.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"us.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-1-20250805-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-20250514-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"us.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"us.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -992,6 +992,104 @@ def test_validate_model_in_constants():
|
|||||||
is True
|
is True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Bedrock Claude 4 cross-region inference profiles (issue #5549)
|
||||||
|
assert (
|
||||||
|
LLM._validate_model_in_constants(
|
||||||
|
"us.anthropic.claude-sonnet-4-5-20250929-v1:0", "bedrock"
|
||||||
|
)
|
||||||
|
is True
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
LLM._validate_model_in_constants(
|
||||||
|
"us.anthropic.claude-opus-4-20250514-v1:0", "bedrock"
|
||||||
|
)
|
||||||
|
is True
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
LLM._validate_model_in_constants(
|
||||||
|
"eu.anthropic.claude-sonnet-4-20250514-v1:0", "bedrock"
|
||||||
|
)
|
||||||
|
is True
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
LLM._validate_model_in_constants(
|
||||||
|
"apac.anthropic.claude-haiku-4-5-20251001-v1:0", "bedrock"
|
||||||
|
)
|
||||||
|
is True
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
LLM._validate_model_in_constants(
|
||||||
|
"global.anthropic.claude-sonnet-4-5-20250929-v1:0", "bedrock"
|
||||||
|
)
|
||||||
|
is True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bedrock_claude_4_models_in_constants():
|
||||||
|
"""Claude 4 Bedrock models (direct IDs and cross-region inference profiles)
|
||||||
|
must be present in BEDROCK_MODELS so providers can be inferred correctly.
|
||||||
|
|
||||||
|
See issue #5549: Anthropic V4 models were missing from the Bedrock model list.
|
||||||
|
"""
|
||||||
|
from crewai.llms.constants import BEDROCK_MODELS
|
||||||
|
|
||||||
|
# Direct Claude 4 model IDs
|
||||||
|
direct_models = [
|
||||||
|
"anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"anthropic.claude-opus-4-20250514-v1:0",
|
||||||
|
"anthropic.claude-opus-4-1-20250805-v1:0",
|
||||||
|
"anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
]
|
||||||
|
for model in direct_models:
|
||||||
|
assert model in BEDROCK_MODELS, (
|
||||||
|
f"Expected {model} to be listed in BEDROCK_MODELS"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Cross-region inference profiles (required for invoking Claude 4 on Bedrock)
|
||||||
|
inference_profile_models = [
|
||||||
|
"us.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"us.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-20250514-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-1-20250805-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-5-20251101-v1:0",
|
||||||
|
"us.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"eu.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"eu.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"apac.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"apac.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
"global.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"global.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
]
|
||||||
|
for model in inference_profile_models:
|
||||||
|
assert model in BEDROCK_MODELS, (
|
||||||
|
f"Expected {model} to be listed in BEDROCK_MODELS"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_infer_provider_for_bedrock_claude_4_models():
|
||||||
|
"""Claude 4 Bedrock model IDs should be inferred as the 'bedrock' provider.
|
||||||
|
|
||||||
|
Before the fix for issue #5549, cross-region inference profile IDs (e.g.
|
||||||
|
'us.anthropic.claude-sonnet-4-5-20250929-v1:0') were not listed in
|
||||||
|
BEDROCK_MODELS, so ``_infer_provider_from_model`` incorrectly fell back to
|
||||||
|
the default 'openai' provider.
|
||||||
|
"""
|
||||||
|
claude_4_bedrock_models = [
|
||||||
|
"anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"anthropic.claude-opus-4-1-20250805-v1:0",
|
||||||
|
"us.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
||||||
|
"us.anthropic.claude-opus-4-20250514-v1:0",
|
||||||
|
"eu.anthropic.claude-sonnet-4-20250514-v1:0",
|
||||||
|
"global.anthropic.claude-haiku-4-5-20251001-v1:0",
|
||||||
|
]
|
||||||
|
for model in claude_4_bedrock_models:
|
||||||
|
assert LLM._infer_provider_from_model(model) == "bedrock", (
|
||||||
|
f"Expected provider for {model} to be inferred as 'bedrock'"
|
||||||
|
)
|
||||||
|
|
||||||
@pytest.mark.vcr(record_mode="once",decode_compressed_response=True)
|
@pytest.mark.vcr(record_mode="once",decode_compressed_response=True)
|
||||||
def test_usage_info_non_streaming_with_call():
|
def test_usage_info_non_streaming_with_call():
|
||||||
llm = LLM(model="gpt-4o-mini", is_litellm=True)
|
llm = LLM(model="gpt-4o-mini", is_litellm=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user