[Rust Frontend] Fix DeepSeek V3.2 continue_final_message rendering (#45155)

Signed-off-by: reidliu41 <reid201711@gmail.com>
This commit is contained in:
Reid
2026-06-11 09:34:19 +00:00
committed by GitHub
parent aa1df36c53
commit 0d657e44dc
2 changed files with 22 additions and 3 deletions
@@ -49,6 +49,7 @@ pub(super) fn render_request(request: &ChatRequest) -> Result<String> {
let last_user_render_index =
find_last_user_render_index(request.messages.as_slice(), render_offset);
let last_user_actual_index = find_last_user_actual_index(request.messages.as_slice());
let continue_final_message = request.chat_options.continue_final_message();
let mut prompt = String::from(BOS_TOKEN);
if request.tool_parsing_enabled() {
@@ -66,6 +67,7 @@ pub(super) fn render_request(request: &ChatRequest) -> Result<String> {
last_user_actual_index,
thinking_mode,
drop_thinking,
continue_final_message,
)?;
}
@@ -96,6 +98,7 @@ fn render_message(
last_user_actual_index: usize,
thinking_mode: ThinkingMode,
drop_thinking: bool,
continue_final_message: bool,
) -> Result<()> {
let render_index = message_index as isize + render_offset;
let opens_thinking = render_index == last_user_render_index;
@@ -125,9 +128,7 @@ fn render_message(
thinking_mode,
drop_thinking,
),
// TODO: Respect `continue_final_message` and map it to DeepSeek's
// prefix-style final-assistant continuation behavior.
false,
continue_final_message && message_index + 1 == messages.len(),
),
ChatMessage::ToolResponse { content, .. } => render_tool_message(
out,
@@ -404,6 +404,24 @@ fn assistant_after_last_user_requires_reasoning_or_tool_calls() {
expect!["chat template error: invalid DeepSeek V3.2 assistant message after last user message: expected reasoning or tool calls"]
.assert_eq(&error.to_report_string());
}
#[test]
fn continue_final_assistant_omits_final_eos() {
let mut request = ChatRequest {
messages: vec![
ChatMessage::user("write"),
ChatMessage::assistant_text("partial answer"),
],
..ChatRequest::for_test()
};
request.chat_options.generation_prompt_mode = GenerationPromptMode::ContinueFinalAssistant;
let rendered = render_request(&request);
expect!["<begin▁of▁sentence><User>write<Assistant></think>partial answer"]
.assert_eq(&rendered);
}
#[test]
fn render_rejects_multimodal_input() {
let request = ChatRequest {