{"record":{"id":"9c38df499133eb10","repo":"docling-project/docling","slug":"expected-image-classification-model-metadata-to-ex-9c38df","errorCode":null,"errorMessage":"Expected image-classification model metadata to expose at least 1 output, got {len(metadata.outputs)} outputs.","messagePattern":"Expected image-classification model metadata to expose at least 1 output, got (.+?) outputs\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"docling/models/inference_engines/image_classification/api_kserve_v2_engine.py","lineNumber":81,"sourceCode":"            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\"\n        model_folder = self._resolve_model_folder(\n            repo_id=self._repo_id, revision=revision\n        )\n\n        self._processor = self._load_preprocessor(model_folder)","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/docling-project/docling/blob/61d76f1ff3f8428065465889f7b4577da7df704c/docling/models/inference_engines/image_classification/api_kserve_v2_engine.py#L63-L99","documentation":"The KServe v2 model metadata response contains no output tensors. The engine reads outputs[0].name to know which tensor holds the logits, so zero outputs makes inference impossible. This signals a metadata/endpoint mismatch rather than a client bug.","triggerScenarios":"ApiKserveV2ImageClassificationEngine.initialize() -> _resolve_tensor_names() when get_model_metadata() returns an outputs list that is empty (model_metadata.outputs == []).","commonSituations":"Endpoint serves a different model kind (e.g. a transformer-only stage); model still loading so metadata is incomplete; wrong model_name/model_version; custom server not implementing the v2 metadata contract fully.","solutions":["Inspect the server's ModelMetadata response directly and confirm it declares at least one output tensor.","Correct options.model_name / options.model_version to point at the actual image-classification model.","Ensure the InferenceService is fully READY before engine initialization.","Fix the custom server to include outputs in its metadata response."],"exampleFix":"# before\noptions.model_version = None  # resolves to wrong/default version\n\n# after: pin the version whose metadata exposes outputs\noptions.model_version = \"v1\"\nmeta = client.get_model_metadata()\nassert meta.outputs, \"no outputs in model metadata\"","handlingStrategy":"validation","validationCode":"meta = kserve_client.get_model_metadata()\nif not meta.outputs:\n    raise ValueError(\n        f\"model '{model_name}' metadata has no outputs; wrong model or not READY?\"\n    )","typeGuard":null,"tryCatchPattern":"try:\n    engine.initialize()\nexcept RuntimeError as e:\n    if \"at least 1 output\" in str(e):\n        options.model_version = pinned_version\n        engine = ApiKserveV2ImageClassificationEngine(...)\n        engine.initialize()\n    else:\n        raise","preventionTips":["Validate metadata (inputs and outputs) as part of deployment smoke tests.","Pin model_version to avoid versionless endpoints drifting.","Confirm the endpoint serves a classification model, not a transformer-only stage."],"tags":["kserve","model-metadata","remote-inference","configuration"],"backgroundTag":null,"analyzedSha":"61d76f1ff3f8428065465889f7b4577da7df704c","analyzedAt":"2026-08-14T23:53:18.727Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}