{"record":{"id":"8ba680fd20e5ec55","repo":"run-llama/llama_index","slug":"must-provide-either-output-cls-or-output-parser","errorCode":null,"errorMessage":"Must provide either output_cls or output_parser.","messagePattern":"Must provide either output_cls or output_parser\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"llama-index-core/llama_index/core/program/multi_modal_llm_program.py","lineNumber":79,"sourceCode":"                    OpenAIResponses,\n                )  # pants: no-infer-dep\n\n                multi_modal_llm = OpenAIResponses(model=\"gpt-4.1\", temperature=0)\n            except ImportError as e:\n                raise ImportError(\n                    \"`llama-index-llms-openai` package cannot be found. \"\n                    \"Please install it by using `pip install `llama-index-llms-openai`\"\n                )\n        if prompt is None and prompt_template_str is None:\n            raise ValueError(\"Must provide either prompt or prompt_template_str.\")\n        if prompt is not None and prompt_template_str is not None:\n            raise ValueError(\"Must provide either prompt or prompt_template_str.\")\n        if prompt_template_str is not None:\n            prompt = PromptTemplate(prompt_template_str)\n\n        if output_parser is None:\n            if output_cls is None:\n                raise ValueError(\"Must provide either output_cls or output_parser.\")\n            output_parser = PydanticOutputParser(output_cls=output_cls)\n\n        return cls(\n            output_parser,\n            prompt=cast(PromptTemplate, prompt),\n            multi_modal_llm=multi_modal_llm,\n            image_documents=image_documents or [],\n            verbose=verbose,\n        )\n\n    @property\n    def output_cls(self) -> Type[BaseModel]:\n        return self._output_parser.output_cls\n\n    @property\n    def prompt(self) -> BasePromptTemplate:\n        return self._prompt\n","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/run-llama/llama_index/blob/afd0fef371831f9bda13e5af7167cf4e981278ab/llama-index-core/llama_index/core/program/multi_modal_llm_program.py#L61-L97","documentation":"The multimodal program must know what Pydantic model to parse into. If output_parser is None and output_cls is also None, there is no way to build a parser, so construction fails. Passing either one is required; output_cls alone is enough (a PydanticOutputParser is created for you).","triggerScenarios":"Calling MultiModalLLMCompletionProgram.from_defaults(prompt_template_str=..., image_documents=[...]) with neither output_cls nor output_parser.","commonSituations":"Assuming the program returns raw text (it returns a parsed model); omitting output_cls when refactoring from LLM.complete(); examples trimmed down for brevity.","solutions":["Pass output_cls=YourPydanticModel.","Or pass output_parser=PydanticOutputParser(output_cls=YourPydanticModel).","Define a small Pydantic model describing the expected structured output."],"exampleFix":"# before\nprogram = MultiModalLLMCompletionProgram.from_defaults(\n    prompt_template_str=\"Describe: {context}\",\n    image_documents=docs,\n)\n# after\nclass Description(BaseModel):\n    text: str\n\nprogram = MultiModalLLMCompletionProgram.from_defaults(\n    output_cls=Description,\n    prompt_template_str=\"Describe: {context}\",\n    image_documents=docs,\n)","handlingStrategy":"validation","validationCode":"if output_parser is None and output_cls is None:\n    raise ValueError(\"define a Pydantic output_cls for the multimodal program\")","typeGuard":"from pydantic import BaseModel\n\ndef is_pydantic_model(cls) -> bool:\n    return isinstance(cls, type) and issubclass(cls, BaseModel)","tryCatchPattern":null,"preventionTips":["Define one small Pydantic model per extraction task and always pass it as output_cls.","Remember these programs return parsed models, not raw strings."],"tags":["validation","output-parser","pydantic","multimodal"],"backgroundTag":null,"analyzedSha":"afd0fef371831f9bda13e5af7167cf4e981278ab","analyzedAt":"2026-08-15T05:42:58.429Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}