Skip to content

Commit

Permalink
[Bugfix][Frontend] Raise exception when file-like chat template fails…
Browse files Browse the repository at this point in the history
… to be opened (vllm-project#4292)
  • Loading branch information
DarkLight1337 authored and joerunde committed May 6, 2024
1 parent 9b5dcec commit 3363b50
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 13 deletions.
19 changes: 14 additions & 5 deletions tests/async_engine/test_chat_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,29 @@ def test_load_chat_template():
{% if add_generation_prompt and messages[-1]['role'] != 'assistant' %}{{ '<|im_start|>assistant\\n' }}{% endif %}""" # noqa: E501


def test_no_load_chat_template():
def test_no_load_chat_template_filelike():
# Testing chatml template
template = "../../examples/does_not_exist"
tokenizer = MockTokenizer()

mock_serving_chat = MockServingChat(tokenizer)

with pytest.raises(ValueError, match="looks like a file path"):
OpenAIServingChat._load_chat_template(mock_serving_chat,
chat_template=template)


def test_no_load_chat_template_literallike():
# Testing chatml template
template = "{{ messages }}"
tokenizer = MockTokenizer()

mock_serving_chat = MockServingChat(tokenizer)
OpenAIServingChat._load_chat_template(mock_serving_chat,
chat_template=template)
template_content = tokenizer.chat_template

# Test assertions
assert template_content is not None
# Hard coded value for template_chatml.jinja
assert template_content == """../../examples/does_not_exist"""
assert template_content == template


@pytest.mark.asyncio
Expand Down
23 changes: 15 additions & 8 deletions vllm/entrypoints/openai/serving_chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,23 +319,30 @@ async def chat_completion_full_generator(
return response

def _load_chat_template(self, chat_template):
tokenizer = self.tokenizer

if chat_template is not None:
try:
with open(chat_template, "r") as f:
self.tokenizer.chat_template = f.read()
except OSError:
tokenizer.chat_template = f.read()
except OSError as e:
JINJA_CHARS = "{}\n"
if not any(c in chat_template for c in JINJA_CHARS):
msg = (f"The supplied chat template ({chat_template}) "
f"looks like a file path, but it failed to be "
f"opened. Reason: {e}")
raise ValueError(msg) from e

# If opening a file fails, set chat template to be args to
# ensure we decode so our escape are interpreted correctly
self.tokenizer.chat_template = codecs.decode(
tokenizer.chat_template = codecs.decode(
chat_template, "unicode_escape")

logger.info(
f"Using supplied chat template:\n{self.tokenizer.chat_template}"
)
elif self.tokenizer.chat_template is not None:
f"Using supplied chat template:\n{tokenizer.chat_template}")
elif tokenizer.chat_template is not None:
logger.info(
f"Using default chat template:\n{self.tokenizer.chat_template}"
)
f"Using default chat template:\n{tokenizer.chat_template}")
else:
logger.warning(
"No chat template provided. Chat API will not work.")

0 comments on commit 3363b50

Please sign in to comment.