summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bot.go24
-rw-r--r--popups.go14
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")