Skip to content

Commit b1a8093

Browse files
committed
Fix tool_parser
1 parent ec4aaad commit b1a8093

File tree

3 files changed

+29
-9
lines changed

3 files changed

+29
-9
lines changed

vllm/entrypoints/openai/serving_chat.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,6 @@ async def chat_completion_stream_generator(
275275

276276
num_prompt_tokens = 0
277277

278-
tool_parser: Optional[ToolParser] = self.tool_parser(
279-
tokenizer) if self.tool_parser else None
280-
281278
if isinstance(request.tool_choice, ChatCompletionNamedToolChoiceParam):
282279
tool_choice_function_name = request.tool_choice.function.name
283280
else:
@@ -296,6 +293,19 @@ async def chat_completion_stream_generator(
296293
else:
297294
previous_texts, all_previous_token_ids = None, None
298295

296+
# Prepare the tool parser if it's needed
297+
try:
298+
if tool_choice_auto and self.tool_parser:
299+
tool_parser: Optional[ToolParser] = self.tool_parser(tokenizer)
300+
else:
301+
tool_parser = None
302+
except RuntimeError as e:
303+
logger.error("Error in tool parser creation: %s", e)
304+
data = self.create_streaming_error_response(str(e))
305+
yield f"data: {data}\n\n"
306+
yield "data: [DONE]\n\n"
307+
return
308+
299309
try:
300310
async for res in result_generator:
301311
if res.prompt_token_ids is not None:
@@ -664,7 +674,12 @@ async def chat_completion_full_generator(
664674
or request.tool_choice is None) and self.enable_auto_tools \
665675
and self.tool_parser:
666676

667-
tool_parser = self.tool_parser(tokenizer)
677+
try:
678+
tool_parser = self.tool_parser(tokenizer)
679+
except RuntimeError as e:
680+
logger.error("Error in tool parser creation: %s", e)
681+
return self.create_error_response(str(e))
682+
668683
tool_call_info = tool_parser.extract_tool_calls(output.text)
669684
tools_called = tool_call_info.tools_called
670685
if tool_call_info.tools_called:

vllm/entrypoints/openai/tool_parsers/hermes_tool_parser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ def __init__(self, tokenizer: AnyTokenizer):
4848
raise ValueError(
4949
"The model tokenizer must be passed to the ToolParser "
5050
"constructor during construction.")
51-
self.tool_call_start_token_id: int = self.model_tokenizer.vocab[
52-
self.tool_call_start_token]
53-
self.tool_call_end_token_id: int = self.model_tokenizer.vocab[
54-
self.tool_call_end_token]
51+
self.tool_call_start_token_id: int = self.model_tokenizer.vocab.get(
52+
self.tool_call_start_token, None)
53+
self.tool_call_end_token_id: int = self.model_tokenizer.vocab.get(
54+
self.tool_call_end_token, None)
5555
if not self.tool_call_start_token_id or not self.tool_call_end_token_id:
5656
raise RuntimeError(
5757
"Hermes 2 Pro Tool parser could not locate tool call start/end "

vllm/entrypoints/openai/tool_parsers/mistral_tool_parser.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,13 @@ def __init__(self, tokenizer: AnyTokenizer):
4545
self.streamed_args_for_tool: List[str] = [
4646
] # map what has been streamed for each tool so far to a list
4747
self.bot_token = "[TOOL_CALLS]"
48-
self.bot_token_id = self.model_tokenizer.vocab[self.bot_token]
48+
self.bot_token_id = self.model_tokenizer.vocab.get(
49+
self.bot_token, None)
4950
self.tool_call_regex = re.compile(r"\[{.*?}\]", re.DOTALL)
51+
if not self.bot_token_id:
52+
raise RuntimeError(
53+
"Mistral Tool Parser could not locate the tool call token in "
54+
"the tokenizer!")
5055

5156
def extract_tool_calls(self,
5257
model_output: str) -> ExtractedToolCallInformation:

0 commit comments

Comments
 (0)