{"record":{"id":"e1e247e822ec3b81","repo":"docling-project/docling","slug":"expected-image-classification-model-metadata-to-ex","errorCode":null,"errorMessage":"Expected image-classification model metadata to expose at least 1 input, got {len(metadata.inputs)} inputs.","messagePattern":"Expected image-classification model metadata to expose at least 1 input, got (.+?) inputs\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"docling/models/inference_engines/image_classification/api_kserve_v2_engine.py","lineNumber":76,"sourceCode":"                \"pipeline_options.enable_remote_services=True.\"\n            )\n\n    def _resolve_model_name(self) -> str:\n        if self.options.model_name:\n            return self.options.model_name\n\n        return self._repo_id.replace(\"/\", \"--\")\n\n    def _resolve_model_version(self) -> Optional[str]:\n        return self.options.model_version\n\n    def _resolve_tensor_names(self) -> tuple[str, str]:\n        if self._kserve_client is None:\n            raise RuntimeError(\"KServe v2 client is not initialized.\")\n\n        metadata = self._kserve_client.get_model_metadata()\n        if not metadata.inputs:\n            raise RuntimeError(\n                f\"Expected image-classification model metadata to expose at least 1 input, \"\n                f\"got {len(metadata.inputs)} inputs.\"\n            )\n        if not metadata.outputs:\n            raise RuntimeError(\n                f\"Expected image-classification model metadata to expose at least 1 output, \"\n                f\"got {len(metadata.outputs)} outputs.\"\n            )\n\n        input_name = metadata.inputs[0].name\n        output_name = metadata.outputs[0].name\n        return input_name, output_name\n\n    def initialize(self) -> None:\n        \"\"\"Initialize preprocessor/labels and prepare remote client.\"\"\"\n        _log.info(\"Initializing KServe v2 image-classification engine\")\n\n        revision = self._model_config.revision or \"main\"","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/docling-project/docling/blob/61d76f1ff3f8428065465889f7b4577da7df704c/docling/models/inference_engines/image_classification/api_kserve_v2_engine.py#L58-L94","documentation":"After fetching model metadata from the KServe v2 server, the engine found zero input tensors. The engine needs at least one named input to send pixel values to, so an empty inputs list means the server returned metadata without inputs — typically a wrong model served at the endpoint, a routing/version mismatch, or a non-conforming server.","triggerScenarios":"ApiKserveV2ImageClassificationEngine.initialize() -> _resolve_tensor_names() when client.get_model_metadata() returns a metadata object whose inputs list is empty (model_metadata.inputs == []).","commonSituations":"Pointing inference_url at a model-ready but metadata-incomplete server; KServe InferenceService still loading (model not ready) so metadata omits inputs; wrong model_name or model_version resolving to a different model; predictor/transformer graph exposing only outputs.","solutions":["Verify the served model actually exposes inputs: query the server's ModelReady and ModelMetadata endpoints directly with the same model_name/model_version.","Check options.model_name and options.model_version match the deployed model exactly (the default derives a name from the HF repo id with '/' replaced by '--').","Wait until the InferenceService reports READY before initializing the engine.","If the server is custom, ensure its metadata response includes the inputs field per the KServe v2 protocol."],"exampleFix":"# before: wrong model name resolves to metadata-less endpoint\noptions.model_name = \"my-model\"\n\n# after: verify metadata before initializing the engine\nmeta = client.get_model_metadata()\nassert meta.inputs, f\"server returned {len(meta.inputs)} inputs\"\nengine.initialize()","handlingStrategy":"validation","validationCode":"meta = kserve_client.get_model_metadata()\nif not meta.inputs:\n    raise ValueError(\n        f\"model '{model_name}' metadata has no inputs; is the endpoint/model_name correct?\"\n    )","typeGuard":null,"tryCatchPattern":"try:\n    engine.initialize()\nexcept RuntimeError as e:\n    if \"at least 1 input\" in str(e):\n        # endpoint/model mismatch — check model_name/model_version, then re-init once\n        options.model_name = correct_name\n        engine = ApiKserveV2ImageClassificationEngine(...)\n        engine.initialize()\n    else:\n        raise","preventionTips":["Run a startup health check that asserts model metadata exposes inputs and outputs before serving traffic.","Pin model_name and model_version instead of relying on derived defaults.","Gate engine creation on the InferenceService reporting READY."],"tags":["kserve","model-metadata","remote-inference","configuration"],"backgroundTag":null,"analyzedSha":"61d76f1ff3f8428065465889f7b4577da7df704c","analyzedAt":"2026-08-14T23:53:18.727Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}