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();