From 2c694e2b2b76ea9a5b30dbd979731ba92cb1e3ba Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Sat, 21 Feb 2026 20:42:43 +0300 Subject: [PATCH] Enha: add (loaded) suffix if model is loaded --- bot.go | 24 ++++++++++++++++++++++++ popups.go | 14 ++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/bot.go b/bot.go index 227751d..fa59de6 100644 --- a/bot.go +++ b/bot.go @@ -403,6 +403,23 @@ func fetchLCPModels() ([]string, error) { return localModels, nil } +// fetchLCPModelsWithLoadStatus returns models with "(loaded)" indicator for loaded models +func fetchLCPModelsWithLoadStatus() ([]string, error) { + models, err := fetchLCPModelsWithStatus() + if err != nil { + return nil, err + } + result := make([]string, 0, len(models.Data)) + for _, m := range models.Data { + modelName := m.ID + if m.Status.Value == "loaded" { + modelName = modelName + " (loaded)" + } + result = append(result, modelName) + } + return result, nil +} + // fetchLCPModelsWithStatus returns the full LCPModels struct including status information. func fetchLCPModelsWithStatus() (*models.LCPModels, error) { resp, err := http.Get(cfg.FetchModelNameAPI) @@ -832,6 +849,7 @@ func chatRound(r *models.ChatRoundReq) error { // Variables for handling thinking blocks during streaming inThinkingBlock := false thinkingBuffer := strings.Builder{} + justExitedThinkingCollapsed := false out: for { select { @@ -859,6 +877,7 @@ out: if thinkingCollapsed { // Thinking already displayed as placeholder, just update respText respText.WriteString(chunk) + justExitedThinkingCollapsed = true if scrollToEndEnabled { textView.ScrollToEnd() } @@ -872,6 +891,11 @@ out: } // If not collapsed, fall through to normal display } + // Add spacing after collapsed thinking block before real response + if justExitedThinkingCollapsed { + chunk = "\n\n" + chunk + justExitedThinkingCollapsed = false + } fmt.Fprint(textView, chunk) respText.WriteString(chunk) // Update the message in chatBody.Messages so it persists during Alt+T diff --git a/popups.go b/popups.go index b0ee4ae..e5c46a1 100644 --- a/popups.go +++ b/popups.go @@ -17,9 +17,13 @@ func showModelSelectionPopup() { } else if strings.Contains(api, "openrouter.ai") { return ORFreeModels } - // Assume local llama.cpp - updateModelLists() - return LocalModels + // Assume local llama.cpp - fetch with load status + models, err := fetchLCPModelsWithLoadStatus() + if err != nil { + logger.Error("failed to fetch models with load status", "error", err) + return LocalModels + } + return models } // Get the current model list based on the API modelList := getModelListForAPI(cfg.CurrentAPI) @@ -57,8 +61,10 @@ func showModelSelectionPopup() { modelListWidget.SetCurrentItem(currentModelIndex) } modelListWidget.SetSelectedFunc(func(index int, mainText string, secondaryText string, shortcut rune) { + // Strip "(loaded)" suffix if present for local llama.cpp models + modelName := strings.TrimSuffix(mainText, " (loaded)") // Update the model in both chatBody and config - chatBody.Model = mainText + chatBody.Model = modelName cfg.CurrentModel = chatBody.Model // Remove the popup page pages.RemovePage("modelSelectionPopup")