{"record":{"id":"ee5c6542389977db","repo":"OpenBMB/ChatDev","slug":"entry-name-is-not-a-baseconfig-subclass-ee5c65","errorCode":null,"errorMessage":"Entry '{name}' is not a BaseConfig subclass","messagePattern":"Entry '(.+?)' is not a BaseConfig subclass","errorType":"validation","errorClass":"RegistryError","httpStatus":null,"severity":"critical","filePath":"entity/configs/node/subgraph.py","lineNumber":41,"sourceCode":"\n\ndef register_subgraph_source(\n    name: str,\n    *,\n    config_cls: type[BaseConfig],\n    description: str | None = None,\n) -> None:\n    \"\"\"Register a subgraph source configuration class.\"\"\"\n\n    metadata = {\"summary\": description} if description else None\n    subgraph_source_registry.register(name, target=config_cls, metadata=metadata)\n\n\ndef get_subgraph_source_config(name: str) -> type[BaseConfig]:\n    entry = subgraph_source_registry.get(name)\n    config_cls = entry.load()\n    if not isinstance(config_cls, type) or not issubclass(config_cls, BaseConfig):\n        raise RegistryError(f\"Entry '{name}' is not a BaseConfig subclass\")\n    return config_cls\n\n\ndef iter_subgraph_source_registrations() -> Dict[str, type[BaseConfig]]:\n    return {name: entry.load() for name, entry in subgraph_source_registry.items()}\n\n\ndef iter_subgraph_source_metadata() -> Dict[str, Dict[str, Any]]:\n    return {name: dict(entry.metadata or {}) for name, entry in subgraph_source_registry.items()}\n\n\n@dataclass\nclass SubgraphFileConfig(BaseConfig):\n    file_path: str\n\n    @classmethod\n    def from_dict(cls, data: Mapping[str, Any], *, path: str) -> \"SubgraphFileConfig\":\n        mapping = require_mapping(data, path)","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/entity/configs/node/subgraph.py#L23-L59","documentation":"get_subgraph_source_config loads a registered subgraph source entry and verifies it resolves to a BaseConfig subclass; if the registered object is not a class inheriting BaseConfig, RegistryError is raised. Called from subgraph config from_dict when resolving the source by name.","triggerScenarios":"Registering a subgraph source whose entry.load() returns a function, instance, or non-BaseConfig class, then parsing a subgraph node config referencing that name.","commonSituations":"Plugin/custom registration mistakes (registering a factory function instead of the config class); refactors changing what the entry returns; version drift where registration API expectations changed.","solutions":["Register the BaseConfig subclass itself (or make entry.load() return it) for the subgraph source","Verify with iter_subgraph_source_registrations() what each name currently resolves to","Add an import-time check after registration asserting issubclass(cfg, BaseConfig)"],"exampleFix":"# before\nregister_subgraph_source('my_source', lambda: build_config_instance)\n# after\nclass MySourceConfig(BaseConfig):\n    ...\nregister_subgraph_source('my_source', lambda: MySourceConfig)","handlingStrategy":"type-guard","validationCode":"from entity.configs.node.subgraph import iter_subgraph_source_registrations\nfrom entity.configs import BaseConfig\nfor name, cls in iter_subgraph_source_registrations().items():\n    assert issubclass(cls, BaseConfig), f'{name} registered wrongly'","typeGuard":"def registration_is_valid(name: str) -> bool:\n    from entity.configs.node.subgraph import iter_subgraph_source_registrations\n    from entity.configs import BaseConfig\n    cls = iter_subgraph_source_registrations().get(name)\n    return isinstance(cls, type) and issubclass(cls, BaseConfig)","tryCatchPattern":"try:\n    cfg = SubgraphConfig.from_dict(d, path='subgraph')\nexcept RegistryError as e:\n    # the source name is registered incorrectly; fall back to inline config or fail fast\n    ...","preventionTips":["Register config classes, not instances or factories","Add an import-time self-check after plugin registration","Test subgraph configs in plugin CI"],"tags":["registry","subgraph","plugin","type-validation"],"backgroundTag":"invalid-registry-entry","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}