diff --git a/libs/core/langchain_core/messages/__init__.py b/libs/core/langchain_core/messages/__init__.py index f8fdf4d4a3b..19e61cb0c98 100644 --- a/libs/core/langchain_core/messages/__init__.py +++ b/libs/core/langchain_core/messages/__init__.py @@ -27,6 +27,10 @@ from langchain_core.messages.base import ( messages_to_dict, ) from langchain_core.messages.chat import ChatMessage, ChatMessageChunk +from langchain_core.messages.content_blocks import ( + DataContentBlock, + is_data_content_block, +) from langchain_core.messages.function import FunctionMessage, FunctionMessageChunk from langchain_core.messages.human import HumanMessage, HumanMessageChunk from langchain_core.messages.modifier import RemoveMessage @@ -60,6 +64,7 @@ __all__ = [ "BaseMessageChunk", "ChatMessage", "ChatMessageChunk", + "DataContentBlock", "FunctionMessage", "FunctionMessageChunk", "HumanMessage", @@ -76,6 +81,7 @@ __all__ = [ "_message_from_dict", "convert_to_messages", "get_buffer_string", + "is_data_content_block", "merge_content", "message_chunk_to_message", "message_to_dict", diff --git a/libs/core/langchain_core/messages/content_blocks.py b/libs/core/langchain_core/messages/content_blocks.py new file mode 100644 index 00000000000..638a4b7e0c4 --- /dev/null +++ b/libs/core/langchain_core/messages/content_blocks.py @@ -0,0 +1,35 @@ +"""Types for content blocks.""" + +from typing import Literal + +from typing_extensions import Required, TypedDict + + +class DataContentBlock(TypedDict, total=False): + """Data content block.""" + + type: Required[Literal["image", "audio", "file"]] + """Type of the content block.""" + source_type: Required[Literal["url", "base64", "id", "text"]] + """Source type.""" + source: Required[str] + """Data as a URL or data-URI, identifier, or plain-text.""" + mime_type: str + """MIME type of the content block (if block represents base64 data.)""" + metadata: dict + """Provider-specific metadata such as citations or filenames.""" + + +def is_data_content_block( + content_block: dict, +) -> bool: + """Check if the content block is a data content block. + + Args: + content_block: The content block to check. + + Returns: + True if the content block is a data content block, False otherwise. + """ + required_keys = DataContentBlock.__required_keys__ + return all(required_key in content_block for required_key in required_keys)