{"record":{"id":"54caf8471f2c71a3","repo":"OpenBMB/ChatDev","slug":"node-node-id-missing-passthrough-configuration","errorCode":null,"errorMessage":"Node {node.id} missing passthrough configuration","messagePattern":"Node (.+?) missing passthrough configuration","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"runtime/node/executor/passthrough_executor.py","lineNumber":20,"sourceCode":"\nfrom typing import List\n\nfrom entity.configs import Node\nfrom entity.configs.node.passthrough import PassthroughConfig\nfrom entity.messages import Message, MessageRole\nfrom runtime.node.executor.base import NodeExecutor\n\n\nclass PassthroughNodeExecutor(NodeExecutor):\n    \"\"\"Forward input messages without modifications.\"\"\"\n\n    def execute(self, node: Node, inputs: List[Message]) -> List[Message]:\n        if node.node_type != \"passthrough\":\n            raise ValueError(f\"Node {node.id} is not a passthrough node\")\n\n        config = node.as_config(PassthroughConfig)\n        if config is None:\n            raise ValueError(f\"Node {node.id} missing passthrough configuration\")\n\n        if not inputs:\n            warning_msg = f\"Passthrough node '{node.id}' triggered without inputs\"\n            self.log_manager.warning(warning_msg, node_id=node.id, details={\"input_count\": 0})\n            return [Message(content=\"\", role=MessageRole.USER)]\n\n        if config.only_last_message:\n            if len(inputs) > 1:\n                self.log_manager.debug(\n                    f\"Passthrough node '{node.id}' received {len(inputs)} inputs; forwarding the latest entry\",\n                    node_id=node.id,\n                    details={\"input_count\": len(inputs)},\n                )\n            return [inputs[-1].clone()]\n        else:\n            return [msg.clone() for msg in inputs]\n","sourceCodeStart":2,"sourceCodeEnd":37,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/runtime/node/executor/passthrough_executor.py#L2-L37","documentation":"A passthrough node must carry a PassthroughConfig; as_config returned None so the executor can't read its (optional) behavior settings and treats the node as misconfigured.","triggerScenarios":"Executing a 'passthrough' node with no config payload at all.","commonSituations":"Workflow builders that create passthrough nodes as bare edges; schema drift; hand-edited workflow JSON dropping empty config objects.","solutions":["Include a PassthroughConfig (even an empty/default one) on the node","Validate node configs before execution","Regenerate workflows with the current builder so defaults are materialized"],"exampleFix":"# before\nNode(id='p1', node_type='passthrough')\n\n# after\nNode(id='p1', node_type='passthrough', config={})  # or PassthroughConfig()","handlingStrategy":"validation","validationCode":"assert node.as_config(PassthroughConfig) is not None","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Give every node a default config object at build time"],"tags":["passthrough-node","missing-config"],"backgroundTag":"missing-node-config","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}