From a2dac66f32c4b12afa46991d9306dfda05605cde Mon Sep 17 00:00:00 2001 From: jay-dhamale Date: Sat, 30 May 2026 23:25:32 +0530 Subject: [PATCH] Add HEIC/HEIF image format support to Vision API - Add image/heic and image/heif to Base64ImageSourceParam Literal types - Add image/heic and image/heif to MCP _SUPPORTED_IMAGE_TYPES frozenset - Update managed agents docstrings to list the new formats - Add test coverage for heic/heif in MCP tool tests Closes #1589 --- src/anthropic/lib/tools/mcp.py | 2 +- src/anthropic/types/base64_image_source_param.py | 2 +- .../types/beta/beta_base64_image_source_param.py | 2 +- .../beta_managed_agents_base64_image_source.py | 2 +- .../beta_managed_agents_base64_image_source_param.py | 2 +- tests/lib/tools/test_mcp_tool.py | 10 ++++++++++ 6 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/anthropic/lib/tools/mcp.py b/src/anthropic/lib/tools/mcp.py index 219f5cca9..bc3659ef5 100644 --- a/src/anthropic/lib/tools/mcp.py +++ b/src/anthropic/lib/tools/mcp.py @@ -68,7 +68,7 @@ # Supported MIME types # ----------------------------------------------------------------------- -_SUPPORTED_IMAGE_TYPES = frozenset({"image/jpeg", "image/png", "image/gif", "image/webp"}) +_SUPPORTED_IMAGE_TYPES = frozenset({"image/jpeg", "image/png", "image/gif", "image/webp", "image/heic", "image/heif"}) class _TaggedDict(dict): # type: ignore[type-arg] diff --git a/src/anthropic/types/base64_image_source_param.py b/src/anthropic/types/base64_image_source_param.py index 93fdb9d14..fc0e11151 100644 --- a/src/anthropic/types/base64_image_source_param.py +++ b/src/anthropic/types/base64_image_source_param.py @@ -15,7 +15,7 @@ class Base64ImageSourceParam(TypedDict, total=False): data: Required[Annotated[Union[str, Base64FileInput], PropertyInfo(format="base64")]] - media_type: Required[Literal["image/jpeg", "image/png", "image/gif", "image/webp"]] + media_type: Required[Literal["image/jpeg", "image/png", "image/gif", "image/webp", "image/heic", "image/heif"]] type: Required[Literal["base64"]] diff --git a/src/anthropic/types/beta/beta_base64_image_source_param.py b/src/anthropic/types/beta/beta_base64_image_source_param.py index 8f13ce386..97a017678 100644 --- a/src/anthropic/types/beta/beta_base64_image_source_param.py +++ b/src/anthropic/types/beta/beta_base64_image_source_param.py @@ -15,7 +15,7 @@ class BetaBase64ImageSourceParam(TypedDict, total=False): data: Required[Annotated[Union[str, Base64FileInput], PropertyInfo(format="base64")]] - media_type: Required[Literal["image/jpeg", "image/png", "image/gif", "image/webp"]] + media_type: Required[Literal["image/jpeg", "image/png", "image/gif", "image/webp", "image/heic", "image/heif"]] type: Required[Literal["base64"]] diff --git a/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source.py b/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source.py index 925627527..0893eaaef 100644 --- a/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source.py +++ b/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source.py @@ -16,7 +16,7 @@ class BetaManagedAgentsBase64ImageSource(BaseModel): media_type: str """ MIME type of the image (e.g., "image/png", "image/jpeg", "image/gif", - "image/webp"). + "image/webp", "image/heic", "image/heif"). """ type: Literal["base64"] diff --git a/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source_param.py b/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source_param.py index 46a555108..06eede703 100644 --- a/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source_param.py +++ b/src/anthropic/types/beta/sessions/beta_managed_agents_base64_image_source_param.py @@ -16,7 +16,7 @@ class BetaManagedAgentsBase64ImageSourceParam(TypedDict, total=False): media_type: Required[str] """ MIME type of the image (e.g., "image/png", "image/jpeg", "image/gif", - "image/webp"). + "image/webp", "image/heic", "image/heif"). """ type: Required[Literal["base64"]] diff --git a/tests/lib/tools/test_mcp_tool.py b/tests/lib/tools/test_mcp_tool.py index 8064a0f6f..7bf9c1f03 100644 --- a/tests/lib/tools/test_mcp_tool.py +++ b/tests/lib/tools/test_mcp_tool.py @@ -101,6 +101,16 @@ def test_image_content_webp(self) -> None: result = mcp_content(ImageContent(type="image", data="abc", mimeType="image/webp")) assert result["type"] == "image" + def test_image_content_heic(self) -> None: + result = mcp_content(ImageContent(type="image", data="heicdata", mimeType="image/heic")) + assert result["type"] == "image" + assert result["source"]["media_type"] == "image/heic" + + def test_image_content_heif(self) -> None: + result = mcp_content(ImageContent(type="image", data="heifdata", mimeType="image/heif")) + assert result["type"] == "image" + assert result["source"]["media_type"] == "image/heif" + def test_image_unsupported_mime_type(self) -> None: with pytest.raises(UnsupportedMCPValueError, match="image/bmp"): mcp_content(ImageContent(type="image", data="abc", mimeType="image/bmp"))