{"record":{"id":"1eca748a80670f15","repo":"BerriAI/litellm","slug":"no-messages-found-in-rendered-prompt","errorCode":null,"errorMessage":"No messages found in rendered prompt","messagePattern":"No messages found in rendered prompt","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"error","filePath":"litellm/proxy/prompts/prompt_endpoints.py","lineNumber":1246,"sourceCode":"        frontmatter, template_content = prompt_manager._parse_frontmatter(content=request.dotprompt_content)\n\n        # Create PromptTemplate to leverage existing parameter extraction logic\n        template: Final = PromptTemplate(content=template_content, metadata=frontmatter, template_id=\"test_prompt\")\n\n        # Extract model from template\n        if not template.model:\n            raise HTTPException(status_code=400, detail=\"Model is required in dotprompt metadata\")\n\n        # Always render the template to extract system messages and other metadata\n        variables: Final = request.prompt_variables or {}\n        rendered_content: Final = prompt_manager.jinja_env.from_string(template_content).render(**variables)\n\n        # Convert rendered content to messages using DotpromptManager's method\n        dotprompt_manager: Final = DotpromptManager()\n        rendered_messages: Final = dotprompt_manager._convert_to_messages(rendered_content=rendered_content)\n\n        if not rendered_messages:\n            raise HTTPException(status_code=400, detail=\"No messages found in rendered prompt\")\n\n        # If conversation history is provided, use it but preserve system messages\n        if request.conversation_history:\n            # Extract system messages from rendered prompt\n            system_messages: Final = [msg for msg in rendered_messages if msg.get(\"role\") == \"system\"]\n            # Use conversation history for user/assistant messages\n            messages = system_messages + request.conversation_history\n        else:\n            messages = rendered_messages\n\n        # Use PromptTemplate's optional_params which already extracts all parameters\n        optional_params: Final = template.optional_params.copy()\n\n        # Always stream the response\n        optional_params[\"stream\"] = True\n\n        # Build request data for chat completion\n        data: Final = {","sourceCodeStart":1228,"sourceCodeEnd":1264,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/prompts/prompt_endpoints.py#L1228-L1264","documentation":"Dotprompt rendering guard: the template rendered successfully but produced no messages (empty render output or a template with no content), so the prompt cannot be converted into a chat request; rejected with 400.","triggerScenarios":"Thrown at litellm/proxy/prompts/prompt_endpoints.py:1246 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the prompt template renders at least one message; check template variables and frontmatter."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}