@@ -295,6 +295,39 @@ def register(
295295message_normalizer_registry = NormalizerRegistry()
296296
297297
298+ def register_custom_normalizer(
299+ provider: str, normalizer: BaseMessageNormalizer, force: bool = False
300+ ) -> None:
301+ """
302+ Register a custom normalizer for handling specific message types.
303+
304+ Parameters
305+ ----------
306+ provider : str
307+ A unique identifier for this normalizer in the registry
308+ normalizer : BaseMessageNormalizer
309+ A normalizer instance that can handle your specific message type
310+ force : bool, optional
311+ Whether to override an existing normalizer with the same provider name,
312+ by default False
313+
314+ Examples
315+ --------
316+ >>> class MyCustomMessage:
317+ ... def __init__(self, content):
318+ ... self.content = content
319+ ...
320+ >>> class MyCustomNormalizer(StringNormalizer):
321+ ... def normalize(self, message):
322+ ... return ChatMessage(content=message.content, role="assistant")
323+ ... def can_normalize(self, message):
324+ ... return isinstance(message, MyCustomMessage)
325+ ...
326+ >>> register_custom_normalizer("my_provider", MyCustomNormalizer())
327+ """
328+ message_normalizer_registry.register(provider, normalizer, force)
329+
330+
298331def normalize_message(message: Any) -> ChatMessage:
299332 strategies = message_normalizer_registry._strategies
300333 for strategy in strategies.values():
@@ -313,5 +346,5 @@ def normalize_message_chunk(chunk: Any) -> ChatMessage:
313346 return strategy.normalize_chunk(chunk)
314347 raise ValueError(
315348 f"Could not find a normalizer for message chunk of type {type(chunk)}: {chunk}. "
316- "Consider registering a custom normalizer via shiny.ui._chat_types.registry.register ()"
349+ "Consider registering a custom normalizer via shiny.ui._chat_normalize.register_custom_normalizer ()"
317350 )
0 commit comments