From 118176f21a4a1d5c950f4ce295fec5f7b9460e3b Mon Sep 17 00:00:00 2001 From: Mateo Wang <277851410+mateo-berri@users.noreply.github.com> Date: Sat, 6 Jun 2026 20:34:31 -0700 Subject: [PATCH] refactor(bedrock): build Converse toolSpec via a BedrockToolSpec dict subclass (#29869) --- .../prompt_templates/factory.py | 30 +++++++------------ litellm/types/llms/bedrock.py | 30 +++++++++++++++++++ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/litellm/litellm_core_utils/prompt_templates/factory.py b/litellm/litellm_core_utils/prompt_templates/factory.py index 588a183d58..81a4c8b14b 100644 --- a/litellm/litellm_core_utils/prompt_templates/factory.py +++ b/litellm/litellm_core_utils/prompt_templates/factory.py @@ -3653,17 +3653,13 @@ from litellm.types.llms.bedrock import ContentBlock as BedrockContentBlock from litellm.types.llms.bedrock import DocumentBlock as BedrockDocumentBlock from litellm.types.llms.bedrock import ImageBlock as BedrockImageBlock from litellm.types.llms.bedrock import SourceBlock as BedrockSourceBlock +from litellm.types.llms.bedrock import BedrockToolSpec from litellm.types.llms.bedrock import ToolBlock as BedrockToolBlock -from litellm.types.llms.bedrock import ( - ToolInputSchemaBlock as BedrockToolInputSchemaBlock, -) -from litellm.types.llms.bedrock import ToolJsonSchemaBlock as BedrockToolJsonSchemaBlock from litellm.types.llms.bedrock import SearchResultBlock from litellm.types.llms.bedrock import ToolResultBlock as BedrockToolResultBlock from litellm.types.llms.bedrock import ( ToolResultContentBlock as BedrockToolResultContentBlock, ) -from litellm.types.llms.bedrock import ToolSpecBlock as BedrockToolSpecBlock from litellm.types.llms.bedrock import ToolUseBlock as BedrockToolUseBlock from litellm.types.llms.bedrock import VideoBlock as BedrockVideoBlock @@ -5554,22 +5550,16 @@ def _bedrock_tools_pt( normalize_json_schema_custom_types_to_object(parameters) if parameters.get("type") not in _valid_json_schema_root_types: parameters["type"] = "object" - json_schema = BedrockToolJsonSchemaBlock( - type=parameters["type"], - properties=parameters.get("properties", {}), - required=parameters.get("required", []), + tool_block = cast( + BedrockToolBlock, + BedrockToolSpec( + name=name, + description=description, + parameters=parameters, + strict=tool.get("function", {}).get("strict", None), + supports_strict_tools=supports_strict_tools, + ), ) - additional_properties = parameters.get("additionalProperties", None) - if supports_strict_tools and additional_properties is not None: - json_schema["additionalProperties"] = additional_properties - tool_input_schema = BedrockToolInputSchemaBlock(json=json_schema) - tool_spec = BedrockToolSpecBlock( - inputSchema=tool_input_schema, name=name, description=description - ) - strict = tool.get("function", {}).get("strict", None) - if supports_strict_tools and strict is not None: - tool_spec["strict"] = strict - tool_block = BedrockToolBlock(toolSpec=tool_spec) tool_block_list.append(tool_block) ## ADD CACHE POINT TOOL BLOCK ## diff --git a/litellm/types/llms/bedrock.py b/litellm/types/llms/bedrock.py index ed80b44414..fa8c3a93ef 100644 --- a/litellm/types/llms/bedrock.py +++ b/litellm/types/llms/bedrock.py @@ -285,6 +285,36 @@ class ToolBlock(TypedDict, total=False): cachePoint: Optional[CachePointBlock] +class BedrockToolSpec(dict): + def __init__( + self, + *, + name: str, + description: str, + parameters: dict, + strict: Optional[bool], + supports_strict_tools: bool, + ) -> None: + json_schema: ToolJsonSchemaBlock = { + "type": parameters["type"], + "properties": parameters.get("properties", {}), + "required": parameters.get("required", []), + } + additional_properties = parameters.get("additionalProperties") + if supports_strict_tools and additional_properties is not None: + json_schema["additionalProperties"] = additional_properties + + tool_spec: ToolSpecBlock = { + "inputSchema": {"json": json_schema}, + "name": name, + "description": description, + } + if supports_strict_tools and strict is not None: + tool_spec["strict"] = strict + + super().__init__(toolSpec=tool_spec) + + class SpecificToolChoiceBlock(TypedDict): name: str