From dbe351ac45286695f40f7e5b154661d35be8f9f9 Mon Sep 17 00:00:00 2001 From: Catherine Renelle <32781029+catrenelle@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:32:37 -0500 Subject: [PATCH] Fix AI ignoring tool results and page context in follow-ups Two issues caused the AI to lose context in multi-turn conversations: 1. Page context was a system message buried before 20 conversation messages. Now it's injected directly into the user's message so the model sees the data right next to the question. 2. Prior tool results were replayed with role="tool", which many Ollama models ignore in conversation history. Now they're replayed as assistant messages with a [Tool Result] prefix so the model reliably reads them. Co-Authored-By: Claude Opus 4.6 --- src/Purrse.Api/Services/ChatService.cs | 32 ++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/Purrse.Api/Services/ChatService.cs b/src/Purrse.Api/Services/ChatService.cs index 759ead2..f9aae7e 100644 --- a/src/Purrse.Api/Services/ChatService.cs +++ b/src/Purrse.Api/Services/ChatService.cs @@ -134,16 +134,6 @@ public class ChatService : IChatService Content = string.Format(SystemPromptTemplate, DateTime.UtcNow.ToString("yyyy-MM-dd")) }); - // Page context - if (!string.IsNullOrEmpty(request.PageContext)) - { - ollamaMessages.Add(new OllamaToolMessage - { - Role = "system", - Content = $"The user is currently viewing: {request.PageContext}" - }); - } - // Last 20 conversation messages var recentMessages = conversation.Messages .OrderBy(m => m.CreatedAt) @@ -152,6 +142,18 @@ public class ChatService : IChatService foreach (var msg in recentMessages) { + if (msg.Role == "tool") + { + // Replay tool results as assistant messages so the model reliably sees them. + // Many models ignore or mishandle the "tool" role in conversation replay. + ollamaMessages.Add(new OllamaToolMessage + { + Role = "assistant", + Content = $"[Tool Result]\n{msg.Content}" + }); + continue; + } + var ollamaMsg = new OllamaToolMessage { Role = msg.Role, Content = msg.Content }; if (msg.ToolCallsJson != null) { @@ -163,8 +165,14 @@ public class ChatService : IChatService // Check if the conversation already has tool results from prior turns var hasExistingToolResults = recentMessages.Any(m => m.Role == "tool"); - // Add current user message - ollamaMessages.Add(new OllamaToolMessage { Role = "user", Content = request.Message }); + // Inject page context directly into the user message so it's adjacent to + // the question. Smaller models lose track of data in distant system messages. + var userContent = request.Message; + if (!string.IsNullOrEmpty(request.PageContext)) + { + userContent = $"{request.Message}\n\n[Current page data]\n{request.PageContext}"; + } + ollamaMessages.Add(new OllamaToolMessage { Role = "user", Content = userContent }); // Build tool definitions var tools = BuildToolDefinitions();