From 0d657e44dcca844499b7adcd03ec590f933dfd29 Mon Sep 17 00:00:00 2001 From: Reid <61492567+reidliu41@users.noreply.github.com> Date: Thu, 11 Jun 2026 17:34:19 +0800 Subject: [PATCH] [Rust Frontend] Fix DeepSeek V3.2 continue_final_message rendering (#45155) Signed-off-by: reidliu41 --- .../chat/src/renderer/deepseek_v32/encoding.rs | 7 ++++--- .../chat/src/renderer/deepseek_v32/tests.rs | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/rust/src/chat/src/renderer/deepseek_v32/encoding.rs b/rust/src/chat/src/renderer/deepseek_v32/encoding.rs index 97825519276..2af7e4be7bc 100644 --- a/rust/src/chat/src/renderer/deepseek_v32/encoding.rs +++ b/rust/src/chat/src/renderer/deepseek_v32/encoding.rs @@ -49,6 +49,7 @@ pub(super) fn render_request(request: &ChatRequest) -> Result { 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 { 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, diff --git a/rust/src/chat/src/renderer/deepseek_v32/tests.rs b/rust/src/chat/src/renderer/deepseek_v32/tests.rs index 0b8f2b09e11..3dc3aa95795 100644 --- a/rust/src/chat/src/renderer/deepseek_v32/tests.rs +++ b/rust/src/chat/src/renderer/deepseek_v32/tests.rs @@ -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|>partial answer"] + .assert_eq(&rendered); +} + #[test] fn render_rejects_multimodal_input() { let request = ChatRequest {