Prhub

#42272 [Frontend]Responses API supports chat_template_kwargs

原始 PR 作者 chaunceyjiang 合并时间 2026-05-11 19:59 文件变更 4 提交数 3 评论 1 代码增减 +29 / -10

执行摘要

Responses API 支持 chat_template_kwargs 传递

允许用户通过 Responses API 的请求或服务级默认值向聊天模板渲染器传递额外关键字参数,例如 enable_thinking,以支持模板自定义。

该 PR 值得精读,展示了如何为 Responses API 增加参数透传能力的简洁实现,尤其在默认值与请求值合并的设计上值得借鉴。

讨论亮点

gemini-code-assist[bot] 评论指出 default_chat_template_kwargs 未正确传递给 _make_request_render_next_turn 中的 preprocess_chat,会导致服务级默认值被忽略。但最终提交版本已通过 _effective_chat_template_kwargs 获取合并后的值并作为 default_template_kwargs 传入,该问题已解决。

实现拆解

    • vllm/entrypoints/openai/responses/protocol.pyResponsesRequest 模型新增 chat_template_kwargs: dict[str, Any] | None 字段,并修改 build_chat_params 将其传入 merge_kwargs 以保留请求级参数。
    • vllm/entrypoints/openai/responses/serving.pyOpenAIServingResponses.__init__ 新增 default_chat_template_kwargs 参数并存储为 self.chat_template_kwargs;修改 _effective_chat_template_kwargs 通过 with_defaults 合并默认值与请求值;更新 _make_request_render_next_turn 将合并后的 chat_template_kwargs 传递给 preprocess_chatdefault_template_kwargs
    • vllm/entrypoints/openai/generate/api_router.pyinit_generate_stateargs.default_chat_template_kwargs 传递给 OpenAIServingResponses
    • tests/entrypoints/openai/responses/test_function_call.pytest_function_calling_with_streaming_types 新增 enable_thinking 参数并传入 extra_body
文件 模块 状态 重要度
vllm/entrypoints/openai/responses/serving.py 入口层 modified 6.0
vllm/entrypoints/openai/responses/protocol.py 入口层 modified 5.52
vllm/entrypoints/openai/generate/api_router.py 入口层 modified 4.93
tests/entrypoints/openai/responses/test_function_call.py 功能调用 modified 4.27

关键符号

OpenAIServingResponses.__init__ OpenAIServingResponses._effective_chat_template_kwargs OpenAIServingResponses._make_request OpenAIServingResponses._render_next_turn ResponsesRequest.build_chat_params

关键源码片段

vllm/entrypoints/openai/responses/serving.py core-logic

核心实现:新增 `default_chat_template_kwargs` 初始化,修改 `_effective_chat_template_kwargs` 合并默认值与请求值,更新渲染调用传递参数。

# vllm/entrypoints/openai/responses/serving.py
class OpenAIServingResponses(OpenAIServing):
    def __init__(
        self,
        # ... existing params ...
        default_chat_template_kwargs: dict[str, Any] | None = None, # 新增:服务级默认参数
    ) -> None:
        super().__init__(...)
        self.chat_template_kwargs = default_chat_template_kwargs or {} # 存储默认值
        # ...
​
    def _effective_chat_template_kwargs(
        self, request: ResponsesRequest
    ) -> dict[str, Any]:
        # 合并请求级与默认值:请求级优先级更高
        return (
            request.build_chat_params(
                self.chat_template,
                self.chat_template_content_format,
            )
            .with_defaults(self.chat_template_kwargs) # 以默认值作为 fallback
            .chat_template_kwargs
        )
​
    async def _make_request(self, request, ...):
        chat_template_kwargs = self._effective_chat_template_kwargs(request)
        _, engine_inputs = await self.openai_serving_render.preprocess_chat(
            request,
            messages,
            default_template=self.chat_template,
            default_template_content_format=self.chat_template_content_format,
            default_template_kwargs=chat_template_kwargs, # 传递合并后的参数
            # ...
        )
vllm/entrypoints/openai/responses/protocol.py core-logic

定义 `chat_template_kwargs` 请求字段,修改 `build_chat_params` 将其传入 `merge_kwargs`。

# vllm/entrypoints/openai/responses/protocol.py
# 在 ResponsesExtraParams 区域内新增字段
chat_template_kwargs: dict[str, Any] | None = Field(
    default=None,
    description=(
        "Additional keyword args to pass to the chat template renderer. "
        "Will be accessible by the template."
    ),
)# build_chat_params 中修改 merge_kwargs 的第一个参数
return ChatParams(
    chat_template=default_template,
    chat_template_content_format=default_template_content_format,
    chat_template_kwargs=merge_kwargs(
        self.chat_template_kwargs, # 原来是 {},现在使用请求级参数
        dict(
            add_generation_prompt=not continue_final,
            continue_final_message=continue_final,
            reasoning_effort=None if reasoning is None else reasoning.effort,
        ),
    ),
    media_io_kwargs=self.media_io_kwargs,
)

评论区精华

默认参数未传递给 preprocess_chat 正确性

gemini-code-assist[bot] 指出 `default_chat_template_kwargs` 在初始化时存储但未传入 `_make_request` 和 `_render_next_turn` 中的 `preprocess_chat`,导致服务级默认值被忽略。

结论:已修复(在最终代码中通过 `_effective_chat_template_kwargs` 获取合并值并传递)。 · 已解决

风险与影响

无显著技术风险。变更仅涉及参数传递和合并逻辑,未修改核心推理路径。需注意 with_defaults 方法的正确性,但已有测试覆盖。

对用户:新增 chat_template_kwargs 请求字段和服务级 default_chat_template_kwargs 配置,提供更灵活的模板自定义能力。对系统:无性能或兼容性影响,为纯参数扩展。

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论