From e16c43715e1e4d876aa19dc842b118be65edf725 Mon Sep 17 00:00:00 2001 From: nathaninline Date: Fri, 10 Jul 2026 11:30:49 +0200 Subject: [PATCH] =?UTF-8?q?v0.2.20=20:=20corrige=20le=20tok/s=20de=20decod?= =?UTF-8?q?e=20qui=20retombait=20=C3=A0=200=20en=20fin=20de=20g=C3=A9n?= =?UTF-8?q?=C3=A9ration=20(timings=20llama.cpp=20sur=20le=20chunk=20final?= =?UTF-8?q?=20sans=20choices,=20lus=20avant=20le=20garde)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- llm.go | 26 ++++++++++++++------------ main.go | 2 +- resource_windows_amd64.syso | Bin 1196 -> 1196 bytes resource_windows_arm64.syso | Bin 1196 -> 1196 bytes versioninfo.json | 6 +++--- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/llm.go b/llm.go index 1916585..861f560 100644 --- a/llm.go +++ b/llm.go @@ -478,8 +478,20 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps if err := json.Unmarshal([]byte(data), &chunk); err != nil { continue } - // Le chunk d'usage (include_usage) arrive seul, sans choices : on l'émet - // avant le guard pour ne pas le perdre. + // Timings ET usage (include_usage) arrivent sur le CHUNK FINAL qui, sur ce + // build llama.cpp (MTP/spéculatif), a `choices:[]` — on les traite AVANT le + // garde de choices, sinon `gen_tokens`/`gen_per_second` (decode) sont jetés + // et l'UI retombe à « 0 tok/s » à la fin de la génération. + if chunk.Timings != nil { + stats.PromptTokens = chunk.Timings.PromptN + stats.PromptPerSecond = chunk.Timings.PromptPerSecond + stats.PromptMs = chunk.Timings.PromptMs + stats.GenTokens = chunk.Timings.PredictedN + stats.GenPerSecond = chunk.Timings.PredictedPerSec + stats.GenMs = chunk.Timings.PredictedMs + s := stats + cb(StreamEvent{Stats: &s}) + } if chunk.Usage != nil && chunk.Usage.PromptTokens > 0 { stats.PromptTokensTotal = chunk.Usage.PromptTokens s := stats @@ -492,16 +504,6 @@ func runChat(ctx context.Context, messages []Message, temperature float64, caps if ch.FinishReason != "" { finishReason = ch.FinishReason } - if chunk.Timings != nil { - stats.PromptTokens = chunk.Timings.PromptN - stats.PromptPerSecond = chunk.Timings.PromptPerSecond - stats.PromptMs = chunk.Timings.PromptMs - stats.GenTokens = chunk.Timings.PredictedN - stats.GenPerSecond = chunk.Timings.PredictedPerSec - stats.GenMs = chunk.Timings.PredictedMs - s := stats - cb(StreamEvent{Stats: &s}) - } if len(ch.Delta.ToolCalls) > 0 { for i, tc := range ch.Delta.ToolCalls { // llama.cpp's stream may omit index; fall back to slot i. diff --git a/main.go b/main.go index 94f4373..723494e 100644 --- a/main.go +++ b/main.go @@ -16,7 +16,7 @@ import ( "strings" ) -const Version = "0.2.19" +const Version = "0.2.20" func main() { // Migration one-shot des anciens skills (SKILLS//SKILL.md) vers la diff --git a/resource_windows_amd64.syso b/resource_windows_amd64.syso index fc5dc4065ddec7d7b9e2e6d2976fd52fc2d6e0ff..1a44b4c334914905d0a777471d3f8d9cbf5a5b79 100644 GIT binary patch delta 37 ocmZ3(xrTGXDNYdvCI%1?*?3uyiP?z3VDodPP(~1AvOP;K0H?(WjsO4v delta 37 ocmZ3(xrTGXDNbPqCI%1?-gsG%iP@0Ba`SVhP(~1AvOP;K0H`GhoB#j- diff --git a/resource_windows_arm64.syso b/resource_windows_arm64.syso index d758a2c7b214ea231f361801c8b4bef30ae2a393..76279042676aef39ba98bee7600ecfc78364218e 100644 GIT binary patch delta 37 ocmZ3(xrTGXDNYdvCI%1?*?3uyiP?z3VDodPP(~1AvOP;K0H?(WjsO4v delta 37 ocmZ3(xrTGXDNbPqCI%1?-gsG%iP@0Ba`SVhP(~1AvOP;K0H`GhoB#j- diff --git a/versioninfo.json b/versioninfo.json index 12b4d0b..fad94f8 100644 --- a/versioninfo.json +++ b/versioninfo.json @@ -3,13 +3,13 @@ "FileVersion": { "Major": 0, "Minor": 2, - "Patch": 19, + "Patch": 20, "Build": 0 }, "ProductVersion": { "Major": 0, "Minor": 2, - "Patch": 19, + "Patch": 20, "Build": 0 }, "FileFlagsMask": "3f", @@ -25,7 +25,7 @@ "LegalCopyright": "Copyright (c) 2026 Jean contributors. MIT License.", "OriginalFilename": "jean.exe", "ProductName": "Jean", - "ProductVersion": "0.2.19", + "ProductVersion": "0.2.20", "Comments": "https://github.com/nathaninline/jean — projet open source (MIT)" }, "VarFileInfo": {