{"record":{"id":"082f682d87ad0182","repo":"OpenBMB/ChatDev","slug":"node-configuration-missing","errorCode":null,"errorMessage":"node configuration missing","messagePattern":"node configuration missing","errorType":"validation","errorClass":"ConfigError","httpStatus":null,"severity":"error","filePath":"entity/configs/node/node.py","lineNumber":298,"sourceCode":"        removed_keep = 0\n\n        for message in self.input:\n            is_keep = message.keep\n            if is_keep and drop_keep:\n                removed_keep += 1\n                continue\n            if not is_keep and drop_non_keep:\n                removed_non_keep += 1\n                continue\n            remaining.append(message)\n\n        if removed_non_keep or removed_keep:\n            self.input = remaining\n        return removed_non_keep, removed_keep\n\n    def validate(self) -> None:\n        if not self.config:\n            raise ConfigError(\"node configuration missing\", extend_path(self.path, \"config\"))\n        if hasattr(self.config, \"validate\"):\n            self.config.validate()\n\n    @property\n    def node_type(self) -> str:\n        return self.type\n\n    @property\n    def model_name(self) -> Optional[str]:\n        agent = self.as_config(AgentConfig)\n        if not agent:\n            return None\n        return agent.name\n\n    @property\n    def role(self) -> Optional[str]:\n        agent = self.as_config(AgentConfig)\n        if agent:","sourceCodeStart":280,"sourceCodeEnd":316,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/entity/configs/node/node.py#L280-L316","documentation":"NodeConfig.validate raises this ConfigError when self.config is falsy, delegating to the node type's own validate() afterwards. Like the memory-store analogue, from_dict normally guarantees a config, so this fires on programmatically constructed or mutated node objects.","triggerScenarios":"Creating NodeConfig directly with config=None (e.g. in tests or after a partial copy) and calling validate(), which from_dict also invokes.","commonSituations":"Direct constructor use in tests/mocks; code that clears config before validation; refactors bypassing from_dict.","solutions":["Build node configs via NodeConfig.from_dict so config is required and validated","Pass a valid config object when constructing manually","Check node.config is not None before calling validate"],"exampleFix":"# before\nnode = NodeConfig(id='n1', type='agent', config=None)\nnode.validate()\n# after\nnode = NodeConfig.from_dict({'id':'n1','type':'agent','config':{}}, path='nodes[0]')\nnode.validate()","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"def node_is_valid(node) -> bool:\n    return bool(getattr(node, 'config', None))","tryCatchPattern":"try:\n    node.validate()\nexcept ConfigError:\n    # rebuild via from_dict with a config block\n    ...","preventionTips":["Construct nodes via from_dict only","Never null out node.config before validate"],"tags":["config","node","api-misuse"],"backgroundTag":"missing-required-config-field","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}