Skip to content

Feature/assistant prefill - exzile contribution#4364

Closed
mzegla wants to merge 10 commits into
mainfrom
feature/assistant-prefill
Closed

Feature/assistant prefill - exzile contribution#4364
mzegla wants to merge 10 commits into
mainfrom
feature/assistant-prefill

Conversation

@mzegla

@mzegla mzegla commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Creating this PR as a WA to trigger Ci for #4331

exzile and others added 10 commits June 30, 2026 09:26
The chat template was always rendered with add_generation_prompt=true,
hardcoded in every servable. This exposes an optional add_generation_prompt
field (bool, default true) on the /v3/chat/completions request, matching
HF transformers and vLLM. When false, the trailing generation prompt is
omitted, which is the building block for assistant prefill.

- Parse add_generation_prompt in the request (openai_api_handler.cpp) and
  store it on the request struct (openai_request.hpp).
- Honor it in all chat-template application sites: the MINJA path (LLM and
  VLM continuous batching, legacy) and the Python-Jinja path (read from the
  request body and pass into the template render).
- Add tests covering default (generation prompt added) and false
  (generation prompt omitted, assistant message preserved).

Verified end-to-end on the MINJA path with HuggingFaceTB/SmolLM2-360M-Instruct:
default renders a trailing "<|im_start|>assistant", add_generation_prompt=false
omits it.

Note: true assistant prefill (continue_final_message - continuing from the
final assistant message without closing it) is a separate control and is left
as a follow-up.

Implements #3877

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Per review: add_generation_prompt is valid and functional for the
Responses API - the Endpoint::RESPONSES path in servable.cpp reads
request.addGenerationPrompt and passes it to apply_chat_template (and
the Jinja path reads it from the request JSON), same as chat
completions. Document it in the responses REST API parameters table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Per review feedback: add_generation_prompt is only ever consumed by
chat template rendering, so route it through chat_template_kwargs
instead of a dedicated InputRequest field. The MINJA path extracts it
back out for genai's dedicated apply_chat_template argument; the
Python-Jinja path pops it from the kwargs dict before splatting into
render() to avoid a duplicate-keyword collision. Also fixes the
Python-Jinja path never having wired add_generation_prompt through at
all, and two llmtemplate_test.cpp tests that referenced a stale 4-arg
applyChatTemplate signature and never compiled.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…validate kwargs type

- Remove the now-redundant top-level add_generation_prompt request field/parsing
  and the OpenAIRequest.addGenerationPrompt member: the parameter lives entirely
  in chat_template_kwargs now, and both template paths already default it to
  true when absent.
- Fix MINJA path to use JsonContainer::as_bool() instead of get_bool(), which
  threw an unhandled ov::Exception (outside the surrounding try/catch) when
  add_generation_prompt was present but not a boolean; now returns a clean
  InvalidArgumentError, matching the Python-Jinja path's existing validation.
- Trim a leftover comment line in input_request.hpp per review suggestion.
- Update chat/responses REST docs to document add_generation_prompt as part of
  chat_template_kwargs instead of a separate top-level parameter.
- Add unit tests for add_generation_prompt=false and the invalid-type rejection
  on the MINJA path.
…tion_prompt parsing

- Remove the comments in openai_api_handler.cpp and input_request.hpp that
  called out add_generation_prompt specifically among chat_template_kwargs
  entries (mzegla) -- the field-level docs already cover it.
- Extract the add_generation_prompt lookup/validation in
  ChatTemplateProcessor::process into its own extractAddGenerationPrompt
  method (dkalinowski).
@mzegla mzegla closed this Jul 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants