From 6f6a35459ef4de340c0c6825da20828e7f579207 Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Sun, 1 Feb 2026 11:38:51 +0300 Subject: Chore: cleaning --- bot.go | 28 ++++++---------------------- bot_test.go | 2 +- llm.go | 6 +++--- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/bot.go b/bot.go index 6e7d094..f55fc6d 100644 --- a/bot.go +++ b/bot.go @@ -169,26 +169,10 @@ func filterMessagesForCharacter(messages []models.RoleMsg, character string) []m return filtered } -// cleanNullMessages removes messages with null or empty content to prevent API issues -func cleanNullMessages(messages []models.RoleMsg) []models.RoleMsg { - // // deletes tool calls which we don't want for now - // cleaned := make([]models.RoleMsg, 0, len(messages)) - // for _, msg := range messages { - // // is there a sense for this check at all? - // if msg.HasContent() || msg.ToolCallID != "" || msg.Role == cfg.AssistantRole || msg.Role == cfg.WriteNextMsgAsCompletionAgent { - // cleaned = append(cleaned, msg) - // } else { - // // Log filtered messages for debugging - // logger.Warn("filtering out message during cleaning", "role", msg.Role, "content", msg.Content, "tool_call_id", msg.ToolCallID, "has_content", msg.HasContent()) - // } - // } - return consolidateConsecutiveAssistantMessages(messages) -} - func cleanToolCalls(messages []models.RoleMsg) []models.RoleMsg { // If AutoCleanToolCallsFromCtx is false, keep tool call messages in context if cfg != nil && !cfg.AutoCleanToolCallsFromCtx { - return consolidateConsecutiveAssistantMessages(messages) + return consolidateAssistantMessages(messages) } cleaned := make([]models.RoleMsg, 0, len(messages)) for i, msg := range messages { @@ -198,11 +182,11 @@ func cleanToolCalls(messages []models.RoleMsg) []models.RoleMsg { cleaned = append(cleaned, msg) } } - return consolidateConsecutiveAssistantMessages(cleaned) + return consolidateAssistantMessages(cleaned) } -// consolidateConsecutiveAssistantMessages merges consecutive assistant messages into a single message -func consolidateConsecutiveAssistantMessages(messages []models.RoleMsg) []models.RoleMsg { +// consolidateAssistantMessages merges consecutive assistant messages into a single message +func consolidateAssistantMessages(messages []models.RoleMsg) []models.RoleMsg { if len(messages) == 0 { return messages } @@ -211,6 +195,7 @@ func consolidateConsecutiveAssistantMessages(messages []models.RoleMsg) []models isBuildingAssistantMsg := false for i := 0; i < len(messages); i++ { msg := messages[i] + // what about the case with multiplpe assistant roles? if msg.Role == cfg.AssistantRole || msg.Role == cfg.WriteNextMsgAsCompletionAgent { // If this is an assistant message, start or continue building if !isBuildingAssistantMsg { @@ -824,7 +809,6 @@ out: if findCall(respText.String(), toolResp.String()) { return nil } - // TODO: have a config attr // Check if this message was sent privately to specific characters // If so, trigger those characters to respond if that char is not controlled by user // perhaps we should have narrator role to determine which char is next to act @@ -850,7 +834,7 @@ func cleanChatBody() { // Tool request cleaning is now configurable via AutoCleanToolCallsFromCtx (default false) // /completion msg where part meant for user and other part tool call chatBody.Messages = cleanToolCalls(chatBody.Messages) - chatBody.Messages = cleanNullMessages(chatBody.Messages) + chatBody.Messages = consolidateAssistantMessages(chatBody.Messages) logger.Debug("cleanChatBody: after cleaning", "original_len", originalLen, "new_len", len(chatBody.Messages)) for i, msg := range chatBody.Messages { logger.Debug("cleanChatBody: after clean", "index", i, "role", msg.Role, "content_len", len(msg.Content), "has_content", msg.HasContent(), "tool_call_id", msg.ToolCallID) diff --git a/bot_test.go b/bot_test.go index 3dabc15..4cbe953 100644 --- a/bot_test.go +++ b/bot_test.go @@ -117,7 +117,7 @@ func TestConsolidateConsecutiveAssistantMessages(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - result := consolidateConsecutiveAssistantMessages(tt.input) + result := consolidateAssistantMessages(tt.input) if len(result) != len(tt.expected) { t.Errorf("Expected %d messages, got %d", len(tt.expected), len(result)) diff --git a/llm.go b/llm.go index 5bd7554..7651a19 100644 --- a/llm.go +++ b/llm.go @@ -322,7 +322,7 @@ func (op LCPChat) FormMsg(msg, role string, resume bool) (io.Reader, error) { } } // Clean null/empty messages to prevent API issues - bodyCopy.Messages = cleanNullMessages(bodyCopy.Messages) + bodyCopy.Messages = consolidateAssistantMessages(bodyCopy.Messages) req := models.OpenAIReq{ ChatBody: bodyCopy, Tools: nil, @@ -488,7 +488,7 @@ func (ds DeepSeekerChat) FormMsg(msg, role string, resume bool) (io.Reader, erro } } // Clean null/empty messages to prevent API issues - bodyCopy.Messages = cleanNullMessages(bodyCopy.Messages) + bodyCopy.Messages = consolidateAssistantMessages(bodyCopy.Messages) dsBody := models.NewDSChatReq(*bodyCopy) data, err := json.Marshal(dsBody) if err != nil { @@ -676,7 +676,7 @@ func (or OpenRouterChat) FormMsg(msg, role string, resume bool) (io.Reader, erro } } // Clean null/empty messages to prevent API issues - bodyCopy.Messages = cleanNullMessages(bodyCopy.Messages) + bodyCopy.Messages = consolidateAssistantMessages(bodyCopy.Messages) orBody := models.NewOpenRouterChatReq(*bodyCopy, defaultLCPProps) if cfg.ToolUse && !resume && role != cfg.ToolRole { orBody.Tools = baseTools // set tools to use -- cgit v1.2.3