from __future__ import annotations from typing import Any import pytest from app.generation.prompting import render_prompt, SYSTEM_PROMPT class TokenizerWithTemplate: def __init__(self, template: str | None = "some template"): self.chat_template = template def apply_chat_template(self, messages: list[dict[str, str]], **kwargs: Any) -> str: if self.chat_template is None: raise ValueError("No template set") return f"TEMPLATED: {messages[-1]['content']}" class TokenizerWithoutTemplate: pass def test_render_prompt_with_valid_template(): tokenizer = TokenizerWithTemplate() prompt = render_prompt(tokenizer, "Hello") assert prompt == "TEMPLATED: Hello" def test_render_prompt_with_none_template(): # This simulates the failure case reported by the user tokenizer = TokenizerWithTemplate(template=None) prompt = render_prompt(tokenizer, "Hello") assert "User: Hello" in prompt assert "Assistant:" in prompt assert SYSTEM_PROMPT in prompt def test_render_prompt_with_exception_in_apply(): tokenizer = TokenizerWithTemplate() # Mock apply_chat_template to raise exception def broken_apply(*args, **kwargs): raise RuntimeError("broken") tokenizer.apply_chat_template = broken_apply prompt = render_prompt(tokenizer, "Hello") assert "User: Hello" in prompt def test_render_prompt_without_apply_method(): tokenizer = TokenizerWithoutTemplate() prompt = render_prompt(tokenizer, "Hello") assert "User: Hello" in prompt def test_render_prompt_hrm_text_fallback(): tokenizer = TokenizerWithoutTemplate() setattr(tokenizer, "name_or_path", "sapientinc/HRM-Text-1B") prompt = render_prompt(tokenizer, "Hello") assert "<|im_start|><|quad_end|><|object_ref_end|><|im_end|>" in prompt assert "User: Hello" in prompt