{"record":{"id":"6d356c75a29f61fd","repo":"keras-team/keras","slug":"outputs-argument-cannot-be-empty-received-inpu","errorCode":null,"errorMessage":"`outputs` argument cannot be empty. Received:\ninputs={inputs}\noutputs={outputs}","messagePattern":"`outputs` argument cannot be empty\\. Received:\ninputs=(.+?)\noutputs=(.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/ops/function.py","lineNumber":69,"sourceCode":"            # https://github.com/keras-team/keras/issues/931\n            # This stop tensorflow from wrapping tf.function output in a\n            # _DictWrapper object.\n            _self_setattr_tracking = getattr(\n                self, \"_self_setattr_tracking\", True\n            )\n            self._self_setattr_tracking = False\n        self._inputs_struct = tree.map_structure(lambda x: x, inputs)\n        self._outputs_struct = tree.map_structure(lambda x: x, outputs)\n        self._inputs = tree.flatten(inputs)\n        self._outputs = tree.flatten(outputs)\n        if not self._inputs:\n            raise ValueError(\n                \"`inputs` argument cannot be empty. Received:\\n\"\n                f\"inputs={inputs}\\n\"\n                f\"outputs={outputs}\"\n            )\n        if not self._outputs:\n            raise ValueError(\n                \"`outputs` argument cannot be empty. Received:\\n\"\n                f\"inputs={inputs}\\n\"\n                f\"outputs={outputs}\"\n            )\n\n        if backend() == \"tensorflow\":\n            self._self_setattr_tracking = _self_setattr_tracking\n\n        (nodes, nodes_by_depth, operations, operations_by_depth) = map_graph(\n            self._inputs, self._outputs\n        )\n        self._nodes = nodes\n        self._nodes_by_depth = nodes_by_depth\n        self._operations = operations\n        self._operations_by_depth = operations_by_depth\n\n        # Run through graph to check all outputs are connected to the inputs.\n        def empty_op_outputs(op, *args, **kwargs):","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/ops/function.py#L51-L87","documentation":"Symmetric to the inputs check, outputs must flatten to a non-empty structure; a Function with no outputs is meaningless and rejected at construction.","triggerScenarios":"keras.ops.Function(inputs=[x], outputs=[]) or outputs=()","commonSituations":"Programmatic graph construction with bugs that drop the computed tensors","solutions":["Ensure the op graph produces at least one output tensor","Pass a concrete output tensor instead of an empty container"],"exampleFix":"# before\nfn = keras.ops.Function([x], [])\n\n# after\nfn = keras.ops.Function([x], y)","handlingStrategy":"validation","validationCode":"assert tree.flatten(outputs), 'outputs must be non-empty'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Make sure the op graph actually consumes the input tensors","Return at least one tensor derived from inputs"],"tags":["keras","ops","function","outputs"],"backgroundTag":"invalid-function-construction","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}