Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
8e5d8fc
update timeout for llm from 600 to 1200
OscarDDD Oct 14, 2026
a089413
add test for timeout upperbound
OscarDDD Oct 14, 2026
f555d1e
add code and tests for 'drop_unsupported_params'
OscarDDD Oct 14, 2026
6ce0b76
add the file content
OscarDDD Oct 14, 2026
94397cc
provider specific finish reason for LLMChoice and StreamLLMChoice
OscarDDD Oct 14, 2026
5adcea3
Set promp as optional in PromptTemplatingModuleConfig
OscarDDD Oct 15, 2026
17ed06b
sync emeddings inputs/types and add EmbeddingMultiFormat support
OscarDDD Oct 16, 2026
a887ad9
set embedding model timeout to 1200
OscarDDD Oct 16, 2026
7e822d7
add config override functionality
OscarDDD Oct 17, 2026
ad56140
add data masking functionality
OscarDDD Oct 17, 2026
13eabed
add data masking model into init files
OscarDDD Oct 17, 2026
f2c48cc
sync feedback service header
OscarDDD Oct 17, 2026
d9014d5
Add feedback service header
OscarDDD Oct 19, 2026
75c16c0
strip drop unsupported params for prompt registry API
OscarDDD Oct 19, 2026
fc11ff1
Merge branch 'main' into sync_sdk_with_orchestration_spec
OscarDDD Oct 19, 2026
d38b0c2
fix import issues
OscarDDD Oct 19, 2026
e904b10
add checks for configref with full orchestrationConfig
OscarDDD Oct 19, 2026
a14de38
set default value to None for drop unsupported params
OscarDDD Oct 19, 2026
85bbb37
remove unused feedback comments and variables
OscarDDD Oct 19, 2026
f1fd53e
Merge branch 'main' into sync_sdk_with_orchestration_spec
OscarDDD Oct 20, 2026
fd0ba9b
fix the review question
OscarDDD Oct 22, 2026
f3ed2ba
revert feedback service, add response header and integration tests
OscarDDD Oct 23, 2026
f2493a7
replace file_llm with llm
OscarDDD Oct 26, 2026
9871ac0
add headers into the unit tests
OscarDDD Oct 27, 2026
4ca2a3d
switch to a file-supported model
OscarDDD Oct 27, 2026
6659a37
switch file llm to gemini-2.5-flash
OscarDDD Oct 27, 2026
e6a91a9
set default value to true
OscarDDD Oct 28, 2026
0b796f9
add integration tests for response header and fix the unit tests for …
OscarDDD Oct 28, 2026
62c7295
change the drop parameter example
OscarDDD Oct 28, 2026
d36ea49
fix magic header
OscarDDD Oct 28, 2026
b3e2fcf
set headers as dict
OscarDDD Oct 28, 2026
c14c20a
Merge branch 'main' into sync_sdk_with_orchestration_spec
OscarDDD Oct 28, 2026
95b5d15
remove embedding mutli format
OscarDDD Oct 29, 2026
3cdfccc
clean up
OscarDDD Oct 29, 2026
27a2c8e
exclude headers from serialization, add tests for data masking file, …
OscarDDD Oct 30, 2026
d695e7b
fix the integration test
OscarDDD Oct 30, 2026
ecaef9e
fix the integration tests
OscarDDD Oct 30, 2026
45ffd11
set url and file_data to mandatory
OscarDDD Nov 2, 2026
8d49e68
enhance the max_tokens
OscarDDD Nov 2, 2026
5b753f8
Merge branch 'main' into sync_sdk_with_orchestration_spec
OscarDDD Nov 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions packages/gen/gen_ai_hub/orchestration_v2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

# config
"ModuleConfig", "OrchestrationConfig", "OrchestrationConfigReference",
"PartialPromptTemplatingModuleConfig", "PartialModuleConfigs", "PartialOrchestrationConfig",
"CompletionRequestConfigurationReferenceByIdConfigRef",
"CompletionRequestConfigurationReferenceByNameScenarioVersionConfigRef",

Expand All @@ -22,8 +23,9 @@
"InputFiltering", "OutputFiltering", "FilteringModuleConfig",

# data_masking
"DataMaskingProviderName", "MaskingMethod", "ProfileEntity", "DPIMethodConstant", "DPIMethodFabricatedData",
"DPICustomEntity", "DPIStandardEntity", "MaskGroundingInput", "MaskingProviderConfig", "MaskingModuleConfig",
"DataMaskingProviderName", "MaskingMethod", "MaskFileInputMethod", "ProfileEntity", "DPIMethodConstant",
"DPIMethodFabricatedData", "DPICustomEntity", "DPIStandardEntity", "MaskGroundingInput", "MaskingProviderConfig",
"MaskingModuleConfig",

# document_grounding
"GroundingType", "DataRepositoryType", "DocumentGroundingFilter", "DocumentGroundingPlaceholders",
Expand All @@ -33,7 +35,8 @@
# embeddings
"EmbeddingsEncodingFormat", "EmbeddingsInputType", "EmbeddingsModelParams", "EmbeddingsModelDetails",
"EmbeddingsModelConfig", "EmbeddingsModuleConfigs", "EmbeddingsOrchestrationConfig", "EmbeddingsInput",
"EmbeddingsUsage", "EmbeddingResult", "EmbeddingsResponse", "EmbeddingsPostResponse", "EmbeddingsRequest",
"EmbeddingsUsage", "EmbeddingResult", "EmbeddingsResponse",
"EmbeddingsPostResponse", "EmbeddingsRequest",

# llama_guard_3_filter
"LlamaGuard38bFilter",
Expand All @@ -47,6 +50,7 @@

# multimodal_items
"ImageDetailLevel", "TextPart", "ImageUrl", "ImagePart", "ContentPart", "ImageItem",
"FileContent", "FilePart", "FileItem",

# response
"CacheCreationTokenDetails", "PromptTokensDetails", "CompletionTokensDetails", "TokenUsage", "GenericModuleResult", "TopLogprob",
Expand Down
25 changes: 16 additions & 9 deletions packages/gen/gen_ai_hub/orchestration_v2/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,29 @@
from .azure_content_filter import AzureContentSafetyInput, AzureContentSafetyOutput, AzureContentFilter, AzureThreshold
from .cache_control import CacheControl
from .config import (ModuleConfig, OrchestrationConfig, OrchestrationConfigReference,
PartialPromptTemplatingModuleConfig, PartialModuleConfigs, PartialOrchestrationConfig,
CompletionRequestConfigurationReferenceByIdConfigRef,
CompletionRequestConfigurationReferenceByNameScenarioVersionConfigRef)
from .content_filter import (ContentFilterProvider, ContentFilter, LlamaGuard38bFilterConfig,
AzureContentSafetyInputFilterConfig, AzureContentSafetyOutputFilterConfig,
FilteringStreamOptions)
from .content_filtering import InputFiltering, OutputFiltering, FilteringModuleConfig
from .data_masking import (DataMaskingProviderName, MaskingMethod, ProfileEntity, DPIMethodConstant,
DPIMethodFabricatedData, DPICustomEntity, DPIStandardEntity, MaskGroundingInput,
MaskingProviderConfig, MaskingModuleConfig)
from .data_masking import (DataMaskingProviderName, MaskingMethod, MaskFileInputMethod, ProfileEntity,
DPIMethodConstant, DPIMethodFabricatedData, DPICustomEntity, DPIStandardEntity,
MaskGroundingInput, MaskingProviderConfig, MaskingModuleConfig)
from .document_grounding import (GroundingType, DataRepositoryType, DocumentGroundingFilter,
DocumentGroundingPlaceholders, DocumentGroundingConfig, GroundingModuleConfig,
KeyValueListPair, DocumentMetadataKeyValueListPairs, GroundingSearchConfig)
from .embeddings import (EmbeddingsEncodingFormat, EmbeddingsInputType, EmbeddingsModelParams, EmbeddingsModelDetails,
EmbeddingsModelConfig, EmbeddingsModuleConfigs, EmbeddingsOrchestrationConfig, EmbeddingsInput,
EmbeddingsUsage, EmbeddingResult, EmbeddingsResponse, EmbeddingsPostResponse, EmbeddingsRequest)
EmbeddingsUsage, EmbeddingResult, EmbeddingsResponse,
EmbeddingsPostResponse, EmbeddingsRequest)
from .llama_guard_3_filter import LlamaGuard38bFilter
from .llm_model_details import LLMModelDetails
from .message import (SystemMessage, UserMessage, AssistantMessage, ToolChatMessage, DeveloperChatMessage, ChatMessage,
ResponseChatMessage, FunctionCall, MessageToolCall, ReasoningBlock)
from .multimodal_items import ImageDetailLevel, TextPart, ImageUrl, ImagePart, ContentPart, ImageItem
from .multimodal_items import (ImageDetailLevel, TextPart, ImageUrl, ImagePart, ContentPart, ImageItem,
FileContent, FilePart, FileItem)
from .response import (CacheCreationTokenDetails, PromptTokensDetails, CompletionTokensDetails, TokenUsage, GenericModuleResult, TopLogprob,
ChatCompletionTokenLogprob, ChoiceLogprobs, LLMChoice, StreamFunctionObject, StreamToolCall,
StreamDelta, StreamLLMChoice, Citation, LLMModuleResult, StreamLLMModuleResult, ModuleResults,
Expand All @@ -45,6 +48,7 @@

# config
"ModuleConfig", "OrchestrationConfig", "OrchestrationConfigReference",
"PartialPromptTemplatingModuleConfig", "PartialModuleConfigs", "PartialOrchestrationConfig",
"CompletionRequestConfigurationReferenceByIdConfigRef",
"CompletionRequestConfigurationReferenceByNameScenarioVersionConfigRef",

Expand All @@ -56,8 +60,9 @@
"InputFiltering", "OutputFiltering", "FilteringModuleConfig",

# data_masking
"DataMaskingProviderName", "MaskingMethod", "ProfileEntity", "DPIMethodConstant", "DPIMethodFabricatedData",
"DPICustomEntity", "DPIStandardEntity", "MaskGroundingInput", "MaskingProviderConfig", "MaskingModuleConfig",
"DataMaskingProviderName", "MaskingMethod", "MaskFileInputMethod", "ProfileEntity", "DPIMethodConstant",
"DPIMethodFabricatedData", "DPICustomEntity", "DPIStandardEntity", "MaskGroundingInput", "MaskingProviderConfig",
"MaskingModuleConfig",

# document_grounding
"GroundingType", "DataRepositoryType", "DocumentGroundingFilter", "DocumentGroundingPlaceholders",
Expand All @@ -67,7 +72,8 @@
# embeddings
"EmbeddingsEncodingFormat", "EmbeddingsInputType", "EmbeddingsModelParams", "EmbeddingsModelDetails",
"EmbeddingsModelConfig", "EmbeddingsModuleConfigs", "EmbeddingsOrchestrationConfig", "EmbeddingsInput",
"EmbeddingsUsage", "EmbeddingResult", "EmbeddingsResponse", "EmbeddingsPostResponse", "EmbeddingsRequest",
"EmbeddingsUsage", "EmbeddingResult", "EmbeddingsResponse",
"EmbeddingsPostResponse", "EmbeddingsRequest",

# llama_guard_3_filter
"LlamaGuard38bFilter",
Expand All @@ -81,14 +87,15 @@

# multimodal_items
"ImageDetailLevel", "TextPart", "ImageUrl", "ImagePart", "ContentPart", "ImageItem",
"FileContent", "FilePart", "FileItem",

# response
"CacheCreationTokenDetails", "PromptTokensDetails", "CompletionTokensDetails", "TokenUsage", "GenericModuleResult", "TopLogprob",
"ChatCompletionTokenLogprob", "ChoiceLogprobs", "LLMChoice", "StreamFunctionObject", "StreamToolCall",
"StreamDelta", "StreamLLMChoice", "Citation", "LLMModuleResult", "StreamLLMModuleResult", "ModuleResults",
"StreamModuleResults", "SAPAPIError", "SAPAPIErrorStreaming", "CompletionPostResponse",
"StreamCompletionPostResponse", "ErrorResponse", "ErrorResponseStreaming", "OrchestrationResponseWithRetries",

# response_format
"ResponseFormatText", "ResponseFormatJsonObject", "ResponseFormatJsonSchema", "JSONResponseSchema",

Expand Down
61 changes: 60 additions & 1 deletion packages/gen/gen_ai_hub/orchestration_v2/models/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
from gen_ai_hub.orchestration_v2.models.content_filtering import FilteringModuleConfig
from gen_ai_hub.orchestration_v2.models.data_masking import MaskingModuleConfig
from gen_ai_hub.orchestration_v2.models.document_grounding import GroundingModuleConfig
from gen_ai_hub.orchestration_v2.models.llm_model_details import LLMModelDetails
from gen_ai_hub.orchestration_v2.models.streaming import GlobalStreamOptions
from gen_ai_hub.orchestration_v2.models.template import PromptTemplatingModuleConfig
from gen_ai_hub.orchestration_v2.models.template import PromptTemplatingModuleConfig, Template
from gen_ai_hub.orchestration_v2.models.template_ref import TemplateRef
from gen_ai_hub.orchestration_v2.models.translation import TranslationModuleConfig


Expand Down Expand Up @@ -59,6 +61,62 @@ class OrchestrationConfig(BaseModel):
stream: Optional[GlobalStreamOptions] = None


class PartialPromptTemplatingModuleConfig(BaseModel):
"""
Partial prompt templating configuration for use with config_ref overrides.

Every field is optional so that only the parts to override need to be provided;
the referenced configuration supplies the rest.

Args:
prompt: Optional prompt template override (inline Template or TemplateRef).

model: Optional model override. Unlike the non-partial config, model is optional
here so that only the prompt can be overridden without repeating the model config.
"""
prompt: Optional[Template | TemplateRef] = None
model: Optional[LLMModelDetails] = None


class PartialModuleConfigs(BaseModel):
"""
Partial module configuration for use with config_ref overrides.

Every module is optional; only the modules provided here override the referenced config.

Args:
prompt_templating: Optional partial prompt templating override.

filtering: Optional filtering module override.

masking: Optional masking module override.

grounding: Optional grounding module override.

translation: Optional translation module override.
"""
prompt_templating: Optional[PartialPromptTemplatingModuleConfig] = None
filtering: Optional[FilteringModuleConfig] = None
masking: Optional[MaskingModuleConfig] = None
grounding: Optional[GroundingModuleConfig] = None
translation: Optional[TranslationModuleConfig] = None


class PartialOrchestrationConfig(BaseModel):
Comment thread
yamaceay marked this conversation as resolved.
Resolved
"""
Partial orchestration configuration used to override a referenced config (config_ref).

The referenced configuration is the base; the fields provided here are merged on top.

Args:
modules: Optional partial module configurations to override.

stream: Optional streaming configuration to override.
"""
modules: Optional[PartialModuleConfigs] = None
stream: Optional[GlobalStreamOptions] = None


class CompletionRequestConfigurationReferenceByIdConfigRef(BaseModel):
"""Represents a reference to an orchestration config identified by a unique ID.

Expand Down Expand Up @@ -86,5 +144,6 @@ class CompletionRequestConfigurationReferenceByNameScenarioVersionConfigRef(Base
CompletionRequestConfigurationReferenceByNameScenarioVersionConfigRef)

__all__ = ["ModuleConfig", "OrchestrationConfig", "OrchestrationConfigReference",
"PartialPromptTemplatingModuleConfig", "PartialModuleConfigs", "PartialOrchestrationConfig",
"CompletionRequestConfigurationReferenceByIdConfigRef",
"CompletionRequestConfigurationReferenceByNameScenarioVersionConfigRef"]
23 changes: 21 additions & 2 deletions packages/gen/gen_ai_hub/orchestration_v2/models/data_masking.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,21 @@ class MaskGroundingInput(BaseModel):
"""
enabled: bool = False

class MaskFileInputMethod(str, Enum):
"""
Enumerates the supported masking methods for file inputs.

This enum defines how file inputs are handled by the data masking module. It is required if file inputs
are provided.

Values:
ANONYMIZATION: Irreversibly replaces sensitive data in file inputs with placeholders.

SKIP: Skips masking of file inputs, leaving them unchanged.
"""
ANONYMIZATION = "anonymization"
SKIP = "skip"


class MaskingProviderConfig(BaseModel):
"""
Expand All @@ -183,12 +198,15 @@ class MaskingProviderConfig(BaseModel):
allowlist: A list of strings that should not be masked.

mask_grounding_input: A flag indicating whether to mask input to the grounding module.

mask_file_input_method: The method of masking to apply to file inputs. Required if file inputs are provided.
"""
type_: DataMaskingProviderName = Field(default=DataMaskingProviderName.SAP_DATA_PRIVACY_INTEGRATION, alias="type")
method: MaskingMethod
entities: List[Union[DPIStandardEntity, DPICustomEntity]]
allowlist: Optional[List[str]] = None
mask_grounding_input: Optional[MaskGroundingInput] = None
mask_file_input_method: Optional[MaskFileInputMethod] = None

class MaskingModuleConfig(BaseModel):
"""
Expand Down Expand Up @@ -217,5 +235,6 @@ def enforce_exactly_one_provider_list(self):

return self

__all__ = ["DataMaskingProviderName", "MaskingMethod", "ProfileEntity", "DPIMethodConstant", "DPIMethodFabricatedData",
"DPICustomEntity", "DPIStandardEntity", "MaskGroundingInput", "MaskingProviderConfig", "MaskingModuleConfig"]
__all__ = ["DataMaskingProviderName", "MaskingMethod", "MaskFileInputMethod", "ProfileEntity", "DPIMethodConstant",
"DPIMethodFabricatedData", "DPICustomEntity", "DPIStandardEntity", "MaskGroundingInput",
"MaskingProviderConfig", "MaskingModuleConfig"]
27 changes: 22 additions & 5 deletions packages/gen/gen_ai_hub/orchestration_v2/models/embeddings.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,19 @@ class EmbeddingsEncodingFormat(str, Enum):
Encoding format for the embeddings output.

Values:
FLOAT: Returns embeddings as an array of floats.
FLOAT: Returns embeddings as an array of floating point numbers.
BASE64: Returns embeddings as a base64 encoded string.
BINARY: Returns embeddings in binary format.
INT8: Returns embeddings as an array of 8-bit integers.
UINT8: Returns embeddings as an array of unsigned 8-bit integers.
UBINARY: Returns embeddings in unsigned binary format.
"""
FLOAT = "float"
BASE64 = "base64"
BINARY = "binary"
INT8 = "int8"
UINT8 = "uint8"
UBINARY = "ubinary"


class EmbeddingsInputType(str, Enum):
Expand All @@ -35,10 +41,20 @@ class EmbeddingsInputType(str, Enum):
TEXT: General purpose text (default).
DOCUMENT: Content to be searched/retrieved.
QUERY: Short search queries.
SEARCH_DOCUMENT: Content stored in a search index to be retrieved.
SEARCH_QUERY: Query run against a search index.
CLASSIFICATION: Text used in a classification task.
CLUSTERING: Text used in a clustering task.
IMAGE: Image input.
"""
TEXT = "text"
DOCUMENT = "document"
QUERY = "query"
SEARCH_DOCUMENT = "search_document"
SEARCH_QUERY = "search_query"
CLASSIFICATION = "classification"
CLUSTERING = "clustering"
IMAGE = "image"


class EmbeddingsModelParams(BaseModel):
Expand All @@ -47,7 +63,7 @@ class EmbeddingsModelParams(BaseModel):

Args:
dimensions: The number of dimensions for the output embeddings.
encoding_format: The format for the embeddings output (float, base64, or binary).
encoding_format: The format to return the embeddings in.
normalize: Whether to normalize the embeddings.
"""
dimensions: Optional[int] = None
Expand All @@ -69,7 +85,7 @@ class EmbeddingsModelDetails(BaseModel):
name: str
version: Optional[str] = "latest"
params: Optional[EmbeddingsModelParams] = None
timeout: Optional[int] = Field(default=600, ge=1, le=600)
timeout: Optional[int] = Field(default=600, ge=1, le=1200)
max_retries: Optional[int] = Field(default=2, ge=0, le=5)


Expand Down Expand Up @@ -135,7 +151,7 @@ class EmbeddingResult(ResponseBaseModel):

Args:
object: The object type, always "embedding".
embedding: The embedding vector (array of floats) or base64 string.
embedding: The embedding vector (array of floats) or a base64 string.
index: The index of this embedding in the list.
"""
object: str = "embedding"
Expand Down Expand Up @@ -186,4 +202,5 @@ class EmbeddingsRequest(BaseModel):

__all__ = ["EmbeddingsEncodingFormat", "EmbeddingsInputType", "EmbeddingsModelParams", "EmbeddingsModelDetails",
"EmbeddingsModelConfig", "EmbeddingsModuleConfigs", "EmbeddingsOrchestrationConfig", "EmbeddingsInput",
"EmbeddingsUsage", "EmbeddingResult", "EmbeddingsResponse", "EmbeddingsPostResponse", "EmbeddingsRequest"]
"EmbeddingsUsage", "EmbeddingResult", "EmbeddingsResponse",
"EmbeddingsPostResponse", "EmbeddingsRequest"]
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,18 @@ class LLMModelDetails(BaseModel):
timeout: Timeout for the LLM request in seconds. This parameter is currently ignored for Vertex AI models.

max_retries: Maximum number of retries for the LLM request. This parameter is currently ignored for Vertex AI models.

drop_unsupported_params: Controls behaviour when Chat Completions parameters not supported by the
Responses API are present in the request. Only applies to models that use the Responses API.
When True: unsupported params are silently dropped and reported in the
X-Orchestration-Dropped-Model-Params response header. When False: any unsupported parameter
Comment thread
OscarDDD marked this conversation as resolved.
Resolved
causes a 400 error with an actionable message. Defaults to True.
"""
name: str
version: Optional[str] = "latest"
params: Optional[Dict] = None
timeout: Optional[int] = Field(default=600, ge=1, le=600)
timeout: Optional[int] = Field(default=600, ge=1, le=1200)
max_retries: Optional[int] = Field(default=2, ge=0, le=5)
drop_unsupported_params: Optional[bool] = True

__all__ = ["LLMModelDetails"]
12 changes: 8 additions & 4 deletions packages/gen/gen_ai_hub/orchestration_v2/models/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
from pydantic import field_validator, ValidationError

from gen_ai_hub.orchestration_v2.models.base import ABCBaseModel as BaseModel, ResponseBaseModel
from gen_ai_hub.orchestration_v2.models.multimodal_items import ContentPart, ImageItem, TextPart, ImageUrl, ImagePart
from gen_ai_hub.orchestration_v2.models.multimodal_items import (
ContentPart, ImageItem, TextPart, ImageUrl, ImagePart, FileItem, FilePart, FileContent
)


class FunctionCall(ResponseBaseModel):
Expand Down Expand Up @@ -122,10 +124,10 @@ class UserMessage(BaseModel):
Args:
role: The role of the entity sending the message.

content: The message content, which may be plain text or a sequence of text and images.
content: The message content, which may be plain text or a sequence of text, images, or files.
"""
role: Role = Role.USER
content: Union[str, ContentPart, List[Union[str, ContentPart, ImageItem, ImagePart]]]
content: Union[str, ContentPart, List[Union[str, ContentPart, ImageItem, ImagePart, FileItem, FilePart]]]

@field_validator("content", mode="before")
def content_validation(cls, content): # pylint: disable=no-self-argument
Expand All @@ -145,8 +147,10 @@ def content_validation(cls, content): # pylint: disable=no-self-argument
mapped_content.append(TextPart(text=item))
elif isinstance(item, ImageItem):
mapped_content.append(ImagePart(image_url=ImageUrl(url=item.url, detail=item.detail)))
elif isinstance(item, FileItem):
mapped_content.append(FilePart(file=FileContent(file_data=item.file_data, filename=item.filename)))
else:
raise ValidationError("User message content list must contain only str or ImageItem")
raise ValidationError("User message content list must contain only str, ImageItem or FileItem")
return mapped_content


Expand Down
Loading
Loading