]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
llama-cli: prevent spurious assistant token (#16202)
authorVinkal <redacted>
Mon, 29 Sep 2025 07:03:12 +0000 (12:33 +0530)
committerGitHub <redacted>
Mon, 29 Sep 2025 07:03:12 +0000 (10:03 +0300)
* tools/main: llama-cli: prevent spurious assistant token (#13402)

During prompt ingestion, prompt tokens are accepted into the sampler history (for repetition penalties). The conversation-mode path then appended `common_sampler_last(smpl)` to `assistant_ss` before any new token was sampled. At that point, "last" was a prompt-side token (e.g., an input prefix), so the assistant chat message began with an extra piece.

Fix: append to `assistant_ss` only for a newly sampled (non-EOG) token. This affects only chat message assembly (`assistant_ss` / `chat_msgs` / `common_chat_format_single`); terminal stdout is unchanged. Sampling order/logits are unchanged.

Fixes #13402.

Signed-off-by: Vinkal Chudgar <redacted>
* Update tools/main/main.cpp

Co-authored-by: Sigbjørn Skjæret <redacted>
* tools/main: remove outdated comment

Signed-off-by: Vinkal Chudgar <redacted>
---------

Signed-off-by: Vinkal Chudgar <redacted>
Co-authored-by: Sigbjørn Skjæret <redacted>
tools/main/main.cpp

index 083fc0cf26c932de636d4a43aec146cc7525a90d..498e00e3a5e58deb9e2622f1f6165e9ad0f1c375 100644 (file)
@@ -707,6 +707,10 @@ int main(int argc, char ** argv) {
 
             embd.push_back(id);
 
+            if (params.conversation_mode && !waiting_for_first_input && !llama_vocab_is_eog(vocab, id)) {
+                assistant_ss << common_token_to_piece(ctx, id, false);
+            }
+
             // echo this to console
             input_echo = true;
 
@@ -824,11 +828,7 @@ int main(int argc, char ** argv) {
                 }
             }
 
-            // if current token is not EOG, we add it to current assistant message
             if (params.conversation_mode && !waiting_for_first_input) {
-                const auto id = common_sampler_last(smpl);
-                assistant_ss << common_token_to_piece(ctx, id, false);
-
                 if (!prompt.empty()) {
                     prompt.clear();
                     is_interacting = false;