@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / a685b47c57
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 12, 13:30 UTC

[responsesAPI] refactor construct_input_messages (#29359)

Signed-off-by: Andrew Xia <axia@fb.com> Co-authored-by: Andrew Xia <axia@fb.com>

Andrew Xia committed Nov 25, 2025 at 01:47 UTC a685b47c575de7bf1c8adf309f9eba33af354535
2 files changed +52 -44
vllm/entrypoints/openai/serving_responses.py
+7 -43
@@ -94,7 +94,7 @@ from vllm.entrypoints.openai.protocol import (
94 from vllm.entrypoints.openai.serving_engine import OpenAIServing
95 from vllm.entrypoints.openai.serving_models import OpenAIServingModels
96 from vllm.entrypoints.responses_utils import (
97 - construct_chat_message_with_tool_call,
97 + construct_input_messages,
98 convert_tool_responses_to_completions_format,
99 extract_tool_types,
100 )
@@ -504,7 +504,12 @@ class OpenAIServingResponses(OpenAIServing):
504 for tool in request.tools
505 ]
506 # Construct the input messages.
507 - messages = self._construct_input_messages(request, prev_response)
507 + messages = construct_input_messages(
508 + request_instructions=request.instructions,
509 + request_input=request.input,
510 + prev_msg=self.msg_store.get(prev_response.id) if prev_response else None,
511 + prev_response_output=prev_response.output if prev_response else None,
512 + )
513 _, request_prompts, engine_prompts = await self._preprocess_chat(
514 request,
515 tokenizer,
@@ -869,47 +874,6 @@ class OpenAIServingResponses(OpenAIServing):
874 output_items.extend(last_items)
875 return output_items
876
872 - def _construct_input_messages(
873 - self,
874 - request: ResponsesRequest,
875 - prev_response: ResponsesResponse | None = None,
876 - ) -> list[ChatCompletionMessageParam]:
877 - messages: list[ChatCompletionMessageParam] = []
878 - if request.instructions:
879 - messages.append(
880 - {
881 - "role": "system",
882 - "content": request.instructions,
883 - }
884 - )
885 -
886 - # Prepend the conversation history.
887 - if prev_response is not None:
888 - # Add the previous messages.
889 - prev_msg = self.msg_store[prev_response.id]
890 - messages.extend(prev_msg)
891 -
892 - # Add the previous output.
893 - for output_item in prev_response.output:
894 - # NOTE: We skip the reasoning output.
895 - if isinstance(output_item, ResponseOutputMessage):
896 - for content in output_item.content:
897 - messages.append(
898 - {
899 - "role": "assistant",
900 - "content": content.text,
901 - }
902 - )
903 -
904 - # Append the new input.
905 - # Responses API supports simple text inputs without chat format.
906 - if isinstance(request.input, str):
907 - messages.append({"role": "user", "content": request.input})
908 - else:
909 - for item in request.input:
910 - messages.append(construct_chat_message_with_tool_call(item))
911 - return messages
912 -
877 def _construct_harmony_system_input_message(
878 self, request: ResponsesRequest, with_custom_tools: bool, tool_types: set[str]
879 ) -> OpenAIHarmonyMessage:
vllm/entrypoints/responses_utils.py
+45 -1
@@ -9,7 +9,8 @@ from openai.types.chat import (
9 from openai.types.chat.chat_completion_message_tool_call_param import (
10 Function as FunctionCallTool,
11 )
12 -from openai.types.responses import ResponseFunctionToolCall
12 +from openai.types.responses import ResponseFunctionToolCall, ResponseOutputItem
13 +from openai.types.responses.response_output_message import ResponseOutputMessage
14 from openai.types.responses.response_reasoning_item import ResponseReasoningItem
15 from openai.types.responses.tool import Tool
16
@@ -20,6 +21,49 @@ from vllm.entrypoints.openai.protocol import (
21 )
22
23
24 +def construct_input_messages(
25 + *,
26 + request_instructions: str | None = None,
27 + request_input: str | list[ResponseInputOutputItem],
28 + prev_msg: list[ChatCompletionMessageParam] | None = None,
29 + prev_response_output: list[ResponseOutputItem] | None = None,
30 +):
31 + messages: list[ChatCompletionMessageParam] = []
32 + if request_instructions:
33 + messages.append(
34 + {
35 + "role": "system",
36 + "content": request_instructions,
37 + }
38 + )
39 +
40 + # Prepend the conversation history.
41 + if prev_msg is not None:
42 + # Add the previous messages.
43 + messages.extend(prev_msg)
44 + if prev_response_output is not None:
45 + # Add the previous output.
46 + for output_item in prev_response_output:
47 + # NOTE: We skip the reasoning output.
48 + if isinstance(output_item, ResponseOutputMessage):
49 + for content in output_item.content:
50 + messages.append(
51 + {
52 + "role": "assistant",
53 + "content": content.text,
54 + }
55 + )
56 +
57 + # Append the new input.
58 + # Responses API supports simple text inputs without chat format.
59 + if isinstance(request_input, str):
60 + messages.append({"role": "user", "content": request_input})
61 + else:
62 + for item in request_input:
63 + messages.append(construct_chat_message_with_tool_call(item))
64 + return messages
65 +
66 +
67 def construct_chat_message_with_tool_call(
68 item: ResponseInputOutputItem,
69 ) -> ChatCompletionMessageParam: