{"record":{"id":"1a098fddca270a03","repo":"microsoft/autogen","slug":"message-type-message-type-is-already-registered","errorCode":null,"errorMessage":"Message type {message_type} is already registered.","messagePattern":"Message type (.+?) is already registered\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/packages/autogen-agentchat/src/autogen_agentchat/messages.py","lineNumber":619,"sourceCode":"        self._message_types[MemoryQueryEvent.__name__] = MemoryQueryEvent\n        self._message_types[UserInputRequestedEvent.__name__] = UserInputRequestedEvent\n        self._message_types[ModelClientStreamingChunkEvent.__name__] = ModelClientStreamingChunkEvent\n        self._message_types[ThoughtEvent.__name__] = ThoughtEvent\n        self._message_types[SelectSpeakerEvent.__name__] = SelectSpeakerEvent\n        self._message_types[CodeGenerationEvent.__name__] = CodeGenerationEvent\n        self._message_types[CodeExecutionEvent.__name__] = CodeExecutionEvent\n\n    def is_registered(self, message_type: type[BaseAgentEvent | BaseChatMessage]) -> bool:\n        \"\"\"Check if a message type is registered with the factory.\"\"\"\n        # Get the class name of the message type.\n        class_name = message_type.__name__\n        # Check if the class name is already registered.\n        return class_name in self._message_types\n\n    def register(self, message_type: type[BaseAgentEvent | BaseChatMessage]) -> None:\n        \"\"\"Register a new message type with the factory.\"\"\"\n        if self.is_registered(message_type):\n            raise ValueError(f\"Message type {message_type} is already registered.\")\n        if not issubclass(message_type, BaseChatMessage) and not issubclass(message_type, BaseAgentEvent):\n            raise ValueError(f\"Message type {message_type} must be a subclass of BaseChatMessage or BaseAgentEvent.\")\n        # Get the class name of the\n        class_name = message_type.__name__\n        # Check if the class name is already registered.\n        # Register the message type.\n        self._message_types[class_name] = message_type\n\n    def create(self, data: Mapping[str, Any]) -> BaseAgentEvent | BaseChatMessage:\n        \"\"\"Create a message from a dictionary of JSON-serializable data.\"\"\"\n        # Get the type of the message from the dictionary.\n        message_type = data.get(\"type\")\n        if message_type is None:\n            raise ValueError(\"Field 'type' is required in the message data to recover the message type.\")\n        if message_type not in self._message_types:\n            raise ValueError(f\"Unknown message type: {message_type}\")\n        if not isinstance(message_type, str):\n            raise ValueError(f\"Message type must be a string, got {type(message_type)}\")","sourceCodeStart":601,"sourceCodeEnd":637,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/python/packages/autogen-agentchat/src/autogen_agentchat/messages.py#L601-L637","documentation":"MessageFactory.register raises ValueError when a message type whose class name is already present in the registry is registered again. Registration is keyed by __name__, so even two different classes sharing a class name collide. Built-in types (TextMessage, ToolCallExecutionEvent, CodeExecutionEvent, ...) are pre-registered.","triggerScenarios":"Re-registering a built-in type (e.g. factory.register(TextMessage)); registering a custom class whose name shadows a built-in or a previously registered custom type; running registration code repeatedly (e.g. module re-import or per-request init).","commonSituations":"App startup code that registers custom message types being executed twice (hot reload, notebooks re-running cells); subclassing a built-in message but keeping the same class name via type() factories.","solutions":["Check factory.is_registered(MyMessageType) before registering","Run registration once at application startup, not per request/cell","Give custom message types unique class names that do not collide with built-ins"],"exampleFix":"# before\nfactory.register(MyEvent)  # raises if run twice (notebook re-run)\n\n# after\nif not factory.is_registered(MyEvent):\n    factory.register(MyEvent)","handlingStrategy":"validation","validationCode":"if not factory.is_registered(MyMessageType):\n    factory.register(MyMessageType)","typeGuard":null,"tryCatchPattern":"try:\n    factory.register(MyMessageType)\nexcept ValueError as e:\n    if \"already registered\" not in str(e):\n        raise  # different registration error (e.g. wrong base class)","preventionTips":["Guard registration with is_registered()","Register custom types once at startup, not per request or notebook cell","Give custom message classes unique names that do not shadow built-ins"],"tags":["message-factory","registration","duplicate","agentchat"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}