Private
Public Access
1
0

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 <noreply@anthropic.com>
This commit is contained in:
Catherine Renelle
2026-02-11 19:32:37 -05:00
parent 6891f2d884
commit dbe351ac45
+20 -12
View File
@@ -134,16 +134,6 @@ public class ChatService : IChatService
Content = string.Format(SystemPromptTemplate, DateTime.UtcNow.ToString("yyyy-MM-dd")) 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 // Last 20 conversation messages
var recentMessages = conversation.Messages var recentMessages = conversation.Messages
.OrderBy(m => m.CreatedAt) .OrderBy(m => m.CreatedAt)
@@ -152,6 +142,18 @@ public class ChatService : IChatService
foreach (var msg in recentMessages) 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 }; var ollamaMsg = new OllamaToolMessage { Role = msg.Role, Content = msg.Content };
if (msg.ToolCallsJson != null) if (msg.ToolCallsJson != null)
{ {
@@ -163,8 +165,14 @@ public class ChatService : IChatService
// Check if the conversation already has tool results from prior turns // Check if the conversation already has tool results from prior turns
var hasExistingToolResults = recentMessages.Any(m => m.Role == "tool"); var hasExistingToolResults = recentMessages.Any(m => m.Role == "tool");
// Add current user message // Inject page context directly into the user message so it's adjacent to
ollamaMessages.Add(new OllamaToolMessage { Role = "user", Content = request.Message }); // 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 // Build tool definitions
var tools = BuildToolDefinitions(); var tools = BuildToolDefinitions();