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: