{"record":{"id":"4f244919bd1a7da1","repo":"OpenBMB/ChatDev","slug":"node-node-id-is-not-a-human-node","errorCode":null,"errorMessage":"Node {node.id} is not a human node","messagePattern":"Node (.+?) is not a human node","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"runtime/node/executor/human_executor.py","lineNumber":29,"sourceCode":"from runtime.node.executor.base import NodeExecutor\n\n\nclass HumanNodeExecutor(NodeExecutor):\n    \"\"\"Executor used for human interaction nodes.\"\"\"\n    \n    def execute(self, node: Node, inputs: List[Message]) -> List[Message]:\n        \"\"\"Execute a human node.\n        \n        Args:\n            node: Human node definition\n            inputs: Input messages\n            \n        Returns:\n            Result supplied by the human reviewer\n        \"\"\"\n        self._ensure_not_cancelled()\n        if node.node_type != \"human\":\n            raise ValueError(f\"Node {node.id} is not a human node\")\n        \n        human_config = node.as_config(HumanConfig)\n        if not human_config:\n            raise ValueError(f\"Node {node.id} has no human configuration\")\n        \n        human_task_description = human_config.description\n        # Use prompt-style preview so humans see the same flattened text format\n        # instead of raw message JSON.\n        input_data = self._inputs_to_text(inputs)\n\n        prompt_service = self.context.get_human_prompt_service()\n        if prompt_service is None:\n            raise RuntimeError(\"HumanPromptService is not configured; cannot execute human node\")\n\n        prompt_result = prompt_service.request(\n            node.id,\n            human_task_description or \"\",\n            inputs=input_data,","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/runtime/node/executor/human_executor.py#L11-L47","documentation":"HumanNodeExecutor.execute asserts node.node_type == 'human' before doing anything; a node of any other type routed here is a programming/serialization error.","triggerScenarios":"Calling HumanNodeExecutor.execute directly with a non-human node, or a factory misroute binding this executor to another node type.","commonSituations":"Manual executor instantiation in tests; corrupted workflow JSON pairing the wrong executor class; refactor renaming node types without updating routing.","solutions":["Route only nodes with node_type 'human' to this executor (normally via create_executor)","Fix the workflow definition so the node's type matches the executor","In tests, construct nodes with node_type='human'"],"exampleFix":"# before\nnode = Node(id='n1', node_type='agent')\nHumanNodeExecutor(ctx).execute(node, [])\n\n# after\nnode = Node(id='n1', node_type='human')","handlingStrategy":"type-guard","validationCode":"assert node.node_type == 'human', node.node_type","typeGuard":"def is_human_node(node) -> bool:\n    return node.node_type == 'human'","tryCatchPattern":null,"preventionTips":["Always obtain executors via create_executor","Never hard-code executor classes to node ids"],"tags":["human-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"}