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:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user