{"record":{"id":"c470266cd0d10189","repo":"OpenBMB/ChatDev","slug":"node-node-id-is-not-a-passthrough-node","errorCode":null,"errorMessage":"Node {node.id} is not a passthrough node","messagePattern":"Node (.+?) is not a passthrough node","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"runtime/node/executor/passthrough_executor.py","lineNumber":16,"sourceCode":"\"\"\"Passthrough node executor.\"\"\"\n\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()]","sourceCodeStart":1,"sourceCodeEnd":34,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/runtime/node/executor/passthrough_executor.py#L1-L34","documentation":"PassthroughNodeExecutor.execute asserts node.node_type == 'passthrough'; any other type reaching it is a routing or node-construction bug.","triggerScenarios":"Invoking PassthroughNodeExecutor with a node whose type isn't 'passthrough'.","commonSituations":"Direct executor instantiation in tests; corrupted workflow files; refactored routing tables.","solutions":["Set node_type to 'passthrough' for nodes forwarded to this executor","Route through create_executor rather than manual construction","Repair malformed workflow definitions"],"exampleFix":"# before\nnode.node_type = 'relay'\n\n# after\nnode.node_type = 'passthrough'","handlingStrategy":"type-guard","validationCode":"assert node.node_type == 'passthrough'","typeGuard":"def is_passthrough_node(node) -> bool:\n    return node.node_type == 'passthrough'","tryCatchPattern":null,"preventionTips":["Use the executor factory for routing"],"tags":["passthrough-node","validation","routing"],"backgroundTag":"node-type-mismatch","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}