diff options
author | Grail Finder <wohilas@gmail.com> | 2025-02-16 09:22:15 +0300 |
---|---|---|
committer | Grail Finder <wohilas@gmail.com> | 2025-02-16 09:22:15 +0300 |
commit | c9f5b17f1fbfaa3647702496893ebd1a4204714e (patch) | |
tree | 14d0cf27038df57fed68fee23364a48035dd7452 /bot.go | |
parent | c1344794143ef48670d8eeb365a10a5295a145ae (diff) |
Feat: divide continue-gen and next-msg-gen
Diffstat (limited to 'bot.go')
-rw-r--r-- | bot.go | 55 |
1 files changed, 35 insertions, 20 deletions
@@ -83,12 +83,12 @@ func sendMsgToLLM(body io.Reader) { reader := bufio.NewReader(resp.Body) counter := uint32(0) for { + var ( + answerText string + content string + stop bool + ) counter++ - if interruptResp { - interruptResp = false - logger.Info("interrupted bot response", "chunk_counter", counter) - break - } // to stop from spiriling in infinity read of bad bytes that happens with poor connection if cfg.ChunkLimit > 0 && counter > cfg.ChunkLimit { logger.Warn("response hit chunk limit", "limit", cfg.ChunkLimit) @@ -105,12 +105,15 @@ func sendMsgToLLM(body io.Reader) { continue } if len(line) <= 1 { + if interruptResp { + goto interrupt // get unstuck from bad connection + } continue // skip \n } // starts with -> data: line = line[6:] logger.Debug("debugging resp", "line", string(line)) - content, stop, err := chunkParser.ParseChunk(line) + content, stop, err = chunkParser.ParseChunk(line) if err != nil { logger.Error("error parsing response body", "error", err, "line", string(line), "url", cfg.CurrentAPI) streamDone <- true @@ -127,8 +130,15 @@ func sendMsgToLLM(body io.Reader) { content = strings.TrimPrefix(content, " ") } // bot sends way too many \n - answerText := strings.ReplaceAll(content, "\n\n", "\n") + answerText = strings.ReplaceAll(content, "\n\n", "\n") chunkChan <- answerText + interrupt: + if interruptResp { // read bytes, so it would not get into beginning of the next req + interruptResp = false + logger.Info("interrupted bot response", "chunk_counter", counter) + streamDone <- true + break + } } } @@ -173,20 +183,21 @@ func roleToIcon(role string) string { return "<" + role + ">: " } -func chatRound(userMsg, role string, tv *tview.TextView, regen bool) { +func chatRound(userMsg, role string, tv *tview.TextView, regen, resume bool) { botRespMode = true // reader := formMsg(chatBody, userMsg, role) - reader, err := chunkParser.FormMsg(userMsg, role) + reader, err := chunkParser.FormMsg(userMsg, role, resume) if reader == nil || err != nil { logger.Error("empty reader from msgs", "role", role, "error", err) return } go sendMsgToLLM(reader) - // if userMsg != "" && !regen { // no need to write assistant icon since we continue old message - if userMsg != "" || regen { - fmt.Fprintf(tv, "(%d) ", len(chatBody.Messages)) + logger.Debug("looking at vars in chatRound", "msg", userMsg, "regen", regen, "resume", resume) + // TODO: consider case where user msg is regened (not assistant one) + if !resume { + fmt.Fprintf(tv, "[-:-:b](%d) ", len(chatBody.Messages)) fmt.Fprint(tv, roleToIcon(cfg.AssistantRole)) - fmt.Fprint(tv, "\n") + fmt.Fprint(tv, "[-:-:-]\n") if cfg.ThinkUse && !strings.Contains(cfg.CurrentAPI, "v1") { // fmt.Fprint(tv, "<think>") chunkChan <- "<think>" @@ -197,7 +208,6 @@ out: for { select { case chunk := <-chunkChan: - // fmt.Printf(chunk) fmt.Fprint(tv, chunk) respText.WriteString(chunk) tv.ScrollToEnd() @@ -207,10 +217,15 @@ out: } } botRespMode = false - // how can previous messages be affected? - chatBody.Messages = append(chatBody.Messages, models.RoleMsg{ - Role: cfg.AssistantRole, Content: respText.String(), - }) + // numbers in chatbody and displayed must be the same + if resume { + chatBody.Messages[len(chatBody.Messages)-1].Content += respText.String() + // lastM.Content = lastM.Content + respText.String() + } else { + chatBody.Messages = append(chatBody.Messages, models.RoleMsg{ + Role: cfg.AssistantRole, Content: respText.String(), + }) + } colorText() updateStatusLine() // bot msg is done; @@ -239,12 +254,12 @@ func findCall(msg string, tv *tview.TextView) { f, ok := fnMap[fc.Name] if !ok { m := fc.Name + "%s is not implemented" - chatRound(m, cfg.ToolRole, tv, false) + chatRound(m, cfg.ToolRole, tv, false, false) return } resp := f(fc.Args...) toolMsg := fmt.Sprintf("tool response: %+v", string(resp)) - chatRound(toolMsg, cfg.ToolRole, tv, false) + chatRound(toolMsg, cfg.ToolRole, tv, false, false) } func chatToTextSlice(showSys bool) []string { |