diff options
| author | Grail Finder <wohilas@gmail.com> | 2026-01-16 16:53:19 +0300 |
|---|---|---|
| committer | Grail Finder <wohilas@gmail.com> | 2026-01-16 16:53:19 +0300 |
| commit | eb44b1e4b244e5a93e7d465b14df39819d8dfaba (patch) | |
| tree | abd29b6c63e198e5ce8057cd6a51a0b20b0d143f /llm.go | |
| parent | f5d76eb60587564648e9f5084469a27cef5765b8 (diff) | |
Feat: impl attempt
Diffstat (limited to 'llm.go')
| -rw-r--r-- | llm.go | 66 |
1 files changed, 42 insertions, 24 deletions
@@ -34,6 +34,24 @@ func ClearImageAttachment() { imageAttachmentPath = "" } +// filterMessagesForCurrentCharacter filters messages based on char-specific context. +// Returns filtered messages and the bot persona role (target character). +func filterMessagesForCurrentCharacter(messages []models.RoleMsg) ([]models.RoleMsg, string) { + if cfg == nil || !cfg.CharSpecificContextEnabled { + botPersona := cfg.AssistantRole + if cfg.WriteNextMsgAsCompletionAgent != "" { + botPersona = cfg.WriteNextMsgAsCompletionAgent + } + return messages, botPersona + } + botPersona := cfg.AssistantRole + if cfg.WriteNextMsgAsCompletionAgent != "" { + botPersona = cfg.WriteNextMsgAsCompletionAgent + } + filtered := filterMessagesForCharacter(messages, botPersona) + return filtered, botPersona +} + type ChunkParser interface { ParseChunk([]byte) (*models.TextChunk, error) FormMsg(msg, role string, cont bool) (io.Reader, error) @@ -113,6 +131,7 @@ func (lcp LCPCompletion) FormMsg(msg, role string, resume bool) (io.Reader, erro } if msg != "" { // otherwise let the bot to continue newMsg := models.RoleMsg{Role: role, Content: msg} + newMsg = processMessageTag(newMsg) chatBody.Messages = append(chatBody.Messages, newMsg) } if !resume { @@ -136,17 +155,14 @@ func (lcp LCPCompletion) FormMsg(msg, role string, resume bool) (io.Reader, erro // add to chat body chatBody.Messages = append(chatBody.Messages, models.RoleMsg{Role: cfg.ToolRole, Content: toolSysMsg}) } - messages := make([]string, len(chatBody.Messages)) - for i, m := range chatBody.Messages { + filteredMessages, botPersona := filterMessagesForCurrentCharacter(chatBody.Messages) + messages := make([]string, len(filteredMessages)) + for i, m := range filteredMessages { messages[i] = m.ToPrompt() } prompt := strings.Join(messages, "\n") // strings builder? if !resume { - botPersona := cfg.AssistantRole - if cfg.WriteNextMsgAsCompletionAgent != "" { - botPersona = cfg.WriteNextMsgAsCompletionAgent - } botMsgStart := "\n" + botPersona + ":\n" prompt += botMsgStart } @@ -270,6 +286,7 @@ func (op LCPChat) FormMsg(msg, role string, resume bool) (io.Reader, error) { // Create a simple text message newMsg = models.NewRoleMsg(role, msg) } + newMsg = processMessageTag(newMsg) chatBody.Messages = append(chatBody.Messages, newMsg) logger.Debug("LCPChat FormMsg: added message to chatBody", "role", newMsg.Role, "content_len", len(newMsg.Content), "message_count_after_add", len(chatBody.Messages)) } @@ -291,12 +308,13 @@ func (op LCPChat) FormMsg(msg, role string, resume bool) (io.Reader, error) { } } // openai /v1/chat does not support custom roles; needs to be user, assistant, system + filteredMessages, _ := filterMessagesForCurrentCharacter(chatBody.Messages) bodyCopy := &models.ChatBody{ - Messages: make([]models.RoleMsg, len(chatBody.Messages)), + Messages: make([]models.RoleMsg, len(filteredMessages)), Model: chatBody.Model, Stream: chatBody.Stream, } - for i, msg := range chatBody.Messages { + for i, msg := range filteredMessages { if msg.Role == cfg.UserRole { bodyCopy.Messages[i] = msg bodyCopy.Messages[i].Role = "user" @@ -348,6 +366,7 @@ func (ds DeepSeekerCompletion) FormMsg(msg, role string, resume bool) (io.Reader logger.Debug("formmsg deepseekercompletion", "link", cfg.CurrentAPI) if msg != "" { // otherwise let the bot to continue newMsg := models.RoleMsg{Role: role, Content: msg} + newMsg = processMessageTag(newMsg) chatBody.Messages = append(chatBody.Messages, newMsg) } if !resume { @@ -372,17 +391,14 @@ func (ds DeepSeekerCompletion) FormMsg(msg, role string, resume bool) (io.Reader // add to chat body chatBody.Messages = append(chatBody.Messages, models.RoleMsg{Role: cfg.ToolRole, Content: toolSysMsg}) } - messages := make([]string, len(chatBody.Messages)) - for i, m := range chatBody.Messages { + filteredMessages, botPersona := filterMessagesForCurrentCharacter(chatBody.Messages) + messages := make([]string, len(filteredMessages)) + for i, m := range filteredMessages { messages[i] = m.ToPrompt() } prompt := strings.Join(messages, "\n") // strings builder? if !resume { - botPersona := cfg.AssistantRole - if cfg.WriteNextMsgAsCompletionAgent != "" { - botPersona = cfg.WriteNextMsgAsCompletionAgent - } botMsgStart := "\n" + botPersona + ":\n" prompt += botMsgStart } @@ -432,6 +448,7 @@ func (ds DeepSeekerChat) FormMsg(msg, role string, resume bool) (io.Reader, erro logger.Debug("formmsg deepseekerchat", "link", cfg.CurrentAPI) if msg != "" { // otherwise let the bot continue newMsg := models.RoleMsg{Role: role, Content: msg} + newMsg = processMessageTag(newMsg) chatBody.Messages = append(chatBody.Messages, newMsg) } if !resume { @@ -451,12 +468,13 @@ func (ds DeepSeekerChat) FormMsg(msg, role string, resume bool) (io.Reader, erro logger.Debug("RAG message added to chat body", "message_count", len(chatBody.Messages)) } } + filteredMessages, _ := filterMessagesForCurrentCharacter(chatBody.Messages) bodyCopy := &models.ChatBody{ - Messages: make([]models.RoleMsg, len(chatBody.Messages)), + Messages: make([]models.RoleMsg, len(filteredMessages)), Model: chatBody.Model, Stream: chatBody.Stream, } - for i, msg := range chatBody.Messages { + for i, msg := range filteredMessages { if msg.Role == cfg.UserRole || i == 1 { bodyCopy.Messages[i] = msg bodyCopy.Messages[i].Role = "user" @@ -502,6 +520,7 @@ func (or OpenRouterCompletion) FormMsg(msg, role string, resume bool) (io.Reader logger.Debug("formmsg openroutercompletion", "link", cfg.CurrentAPI) if msg != "" { // otherwise let the bot to continue newMsg := models.RoleMsg{Role: role, Content: msg} + newMsg = processMessageTag(newMsg) chatBody.Messages = append(chatBody.Messages, newMsg) } if !resume { @@ -525,17 +544,14 @@ func (or OpenRouterCompletion) FormMsg(msg, role string, resume bool) (io.Reader // add to chat body chatBody.Messages = append(chatBody.Messages, models.RoleMsg{Role: cfg.ToolRole, Content: toolSysMsg}) } - messages := make([]string, len(chatBody.Messages)) - for i, m := range chatBody.Messages { + filteredMessages, botPersona := filterMessagesForCurrentCharacter(chatBody.Messages) + messages := make([]string, len(filteredMessages)) + for i, m := range filteredMessages { messages[i] = m.ToPrompt() } prompt := strings.Join(messages, "\n") // strings builder? if !resume { - botPersona := cfg.AssistantRole - if cfg.WriteNextMsgAsCompletionAgent != "" { - botPersona = cfg.WriteNextMsgAsCompletionAgent - } botMsgStart := "\n" + botPersona + ":\n" prompt += botMsgStart } @@ -619,6 +635,7 @@ func (or OpenRouterChat) FormMsg(msg, role string, resume bool) (io.Reader, erro // Create a simple text message newMsg = models.NewRoleMsg(role, msg) } + newMsg = processMessageTag(newMsg) chatBody.Messages = append(chatBody.Messages, newMsg) } if !resume { @@ -639,12 +656,13 @@ func (or OpenRouterChat) FormMsg(msg, role string, resume bool) (io.Reader, erro } } // Create copy of chat body with standardized user role + filteredMessages, _ := filterMessagesForCurrentCharacter(chatBody.Messages) bodyCopy := &models.ChatBody{ - Messages: make([]models.RoleMsg, len(chatBody.Messages)), + Messages: make([]models.RoleMsg, len(filteredMessages)), Model: chatBody.Model, Stream: chatBody.Stream, } - for i, msg := range chatBody.Messages { + for i, msg := range filteredMessages { bodyCopy.Messages[i] = msg // Standardize role if it's a user role if bodyCopy.Messages[i].Role == cfg.UserRole { |
