{"record":{"id":"5ca55c1f8e7aa6e9","repo":"OpenBMB/ChatDev","slug":"node-node-id-has-no-human-configuration","errorCode":null,"errorMessage":"Node {node.id} has no human configuration","messagePattern":"Node (.+?) has no human configuration","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"runtime/node/executor/human_executor.py","lineNumber":33,"sourceCode":"    \"\"\"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,\n            metadata={\"node_type\": \"human\"},\n        )\n\n        return [self._build_message(","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/runtime/node/executor/human_executor.py#L15-L51","documentation":"The node is a human node but node.as_config(HumanConfig) returned None/empty — the HumanConfig payload is missing from the node, so there is no task description or settings.","triggerScenarios":"A 'human' node whose config dict is absent, empty, or failed to deserialize into HumanConfig.","commonSituations":"Workflow builder omitted config when creating the node; renamed/moved HumanConfig fields between versions breaking deserialization; hand-written workflow YAML missing the config block.","solutions":["Add a valid HumanConfig (at minimum a description) to the node's config payload","Validate workflow definitions against the current schema before execution","After runtime upgrades, migrate node configs to the current field names"],"exampleFix":"# before\nnode = Node(id='n1', node_type='human')  # no config\n\n# after\nnode = Node(id='n1', node_type='human', config={'description': 'Review the draft'})","handlingStrategy":"validation","validationCode":"cfg = node.as_config(HumanConfig)\nif not cfg:\n    raise ValueError('human node missing config')","typeGuard":"def has_human_config(node) -> bool:\n    return bool(node.as_config(HumanConfig))","tryCatchPattern":null,"preventionTips":["Schema-validate workflows before execution","Include configs in workflow builder templates"],"tags":["human-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"}