{"record":{"id":"ecb530368a3099be","repo":"OpenBMB/ChatDev","slug":"edge-condition-type-name-already-registered","errorCode":null,"errorMessage":"Edge condition type '{name}' already registered","messagePattern":"Edge condition type '(.+?)' already registered","errorType":"validation","errorClass":"RegistryError","httpStatus":null,"severity":"error","filePath":"runtime/edge/conditions/registry.py","lineNumber":44,"sourceCode":"\n\ndef _ensure_builtins_loaded() -> None:\n    global _BUILTINS_LOADED\n    if not _BUILTINS_LOADED:\n        import_module(\"runtime.edge.conditions.builtin_types\")\n        _BUILTINS_LOADED = True\n\n\ndef register_edge_condition(\n    name: str,\n    *,\n    config_cls: Type[\"EdgeConditionTypeConfig\"],\n    manager_cls: Type[\"EdgeConditionManager[Any]\"],\n    summary: str | None = None,\n) -> None:\n    \"\"\"Register a manager class that encapsulates edge processing logic.\"\"\"\n    if name in edge_condition_registry.names():\n        raise RegistryError(f\"Edge condition type '{name}' already registered\")\n    entry = EdgeConditionRegistration(\n        name=name,\n        config_cls=config_cls,\n        manager_cls=manager_cls,\n        summary=summary,\n    )\n    edge_condition_registry.register(name, target=entry)\n    register_edge_condition_schema(name, config_cls=config_cls, summary=summary)\n\n\ndef get_edge_condition_registration(name: str) -> EdgeConditionRegistration:\n    \"\"\"Retrieve a registered condition type.\"\"\"\n    _ensure_builtins_loaded()\n    entry: RegistryEntry = edge_condition_registry.get(name)\n    registration = entry.load()\n    if not isinstance(registration, EdgeConditionRegistration):\n        raise RegistryError(f\"Entry '{name}' is not an EdgeConditionRegistration\")\n    return registration","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/runtime/edge/conditions/registry.py#L26-L62","documentation":"The edge condition type registry refuses duplicate registration. Each condition type name must map to exactly one EdgeConditionRegistration; registering the same name twice (e.g. via register_edge_condition) raises RegistryError.","triggerScenarios":"Calling register_edge_condition with a name already in edge_condition_registry.names(), typically because a plugin/builtin module is imported twice or a custom condition reuses a builtin name like 'condition' or 'timeout'.","commonSituations":"Plugin modules imported under different paths (module + package alias) causing double registration on re-import; picking a name that collides with a builtin; module-reload scenarios in notebooks or test suites.","solutions":["Choose a unique, namespaced name (e.g. 'myplugin.retry_condition')","Guard registration: `if name not in iter_edge_condition_registrations(): register(...)`","Avoid importing the registering module via two different paths; fix sys.path/duplicate package copies"],"exampleFix":"# before\nregister_edge_condition('condition', config_cls=C, manager_cls=M)\n\n# after\nfrom runtime.edge.conditions.registry import iter_edge_condition_registrations\nif 'condition' not in iter_edge_condition_registrations():\n    register_edge_condition('condition', config_cls=C, manager_cls=M)","handlingStrategy":"validation","validationCode":"from runtime.edge.conditions.registry import iter_edge_condition_registrations\nif 'mycond' not in iter_edge_condition_registrations():\n    register_edge_condition('mycond', config_cls=C, manager_cls=M)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Namespace plugin names","Register in idempotent guarded blocks"],"tags":["registry","duplicate","plugin","edge-conditions"],"backgroundTag":"duplicate-registry-registration","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}