Auto-Reminder alle 30 Messages + History-Limit 120
- SystemPromptBuilder.BuildReminder(): generiert automatisch Reminder-Text aus den aktiven Prompt-Blöcken (Identity, Workspace, Memory, etc.) - Alle ~30 Messages wird ein [System Reminder]-Paar in die History injiziert (nur nach assistant-Messages, um user/assistant-Alternierung zu wahren) - History auf maximal 120 Messages begrenzt (älteste werden entfernt) - ChatContext um PromptBlocks-Property erweitert - Alle Aufrufer (ChatEndpoint, TelegramService, CronjobService) übergeben promptBlocks an BuildHistoryFromDb
This commit is contained in:
1 parent
83945689a6
commit
47d6f44e07
6 files changed
+91
-6
No files matched your search
+51
-2
@@ -63,10 +63,11 @@ public class ChatService
|
||||
if (string.IsNullOrEmpty(workspace) && agentSkills.Any())
|
||||
workspace = "/tmp";
|
||||
|
||||
var systemPromptText = SystemPromptBuilder.Build(
|
||||
var promptBlocks = SystemPromptBuilder.BuildBlocks(
|
||||
agent, session, markedMessages, _memoryService, agentMemoryDir,
|
||||
agentSkills, _skillService, userPersona: user?.GetEffectivePersona(),
|
||||
resolvedWorkspace: workspace, planMode: planMode);
|
||||
var systemPromptText = string.Join("\n\n", promptBlocks.Select(b => b.Content));
|
||||
|
||||
var hasWorkspace = !string.IsNullOrEmpty(workspace);
|
||||
var includeMemory = agent.UseMemory && !string.IsNullOrEmpty(agent.AgentId);
|
||||
@@ -258,6 +259,7 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop?
|
||||
AgentId = agent.AgentId,
|
||||
SystemPromptText = systemPromptText,
|
||||
SystemPrompt = systemPrompt,
|
||||
PromptBlocks = promptBlocks,
|
||||
ToolChoice = toolChoice,
|
||||
UseMemory = agent.UseMemory,
|
||||
WebSearchVersion = agent.WebSearchVersion,
|
||||
@@ -300,7 +302,7 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop?
|
||||
/// includeTag: Wenn gesetzt, werden Messages mit diesem Tag NICHT ausgefiltert
|
||||
/// (z.B. "preparer" damit der Preparer seine eigenen vorherigen Messages sieht).
|
||||
/// </summary>
|
||||
public async Task<List<object>> BuildHistoryFromDb(string sessionId, string includeTag = null)
|
||||
public async Task<List<object>> BuildHistoryFromDb(string sessionId, string includeTag = null, List<PromptBlock> promptBlocks = null)
|
||||
{
|
||||
var chainsList = (await _db.GetActiveChains(sessionId)).ToList();
|
||||
// chronologisch sortieren (älteste zuerst)
|
||||
@@ -476,6 +478,53 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop?
|
||||
}
|
||||
}
|
||||
|
||||
// History auf maximal 120 Messages begrenzen (älteste entfernen)
|
||||
const int maxHistory = 120;
|
||||
if (history.Count > maxHistory)
|
||||
history.RemoveRange(0, history.Count - maxHistory);
|
||||
|
||||
// Reminder einfügen: alle ~30 user/assistant-Paare ein Reminder-Paar einfügen
|
||||
var reminder = SystemPromptBuilder.BuildReminder(promptBlocks);
|
||||
if (!string.IsNullOrWhiteSpace(reminder) && history.Count > 30)
|
||||
{
|
||||
var reminderUser = new Dictionary<string, object>
|
||||
{
|
||||
["role"] = "user",
|
||||
["content"] = new List<object> { new { type = "text", text = "[System Reminder] " + reminder } }
|
||||
};
|
||||
var reminderAssistant = new Dictionary<string, object>
|
||||
{
|
||||
["role"] = "assistant",
|
||||
["content"] = new List<object> { new { type = "text", text = "Understood." } }
|
||||
};
|
||||
|
||||
// Alle 30 Messages ein Reminder-Paar einfügen (von hinten nach vorne, damit Indizes stimmen)
|
||||
var insertPositions = new List<int>();
|
||||
int messageCount = 0;
|
||||
for (int i = 0; i < history.Count; i++)
|
||||
{
|
||||
messageCount++;
|
||||
if (messageCount > 0 && messageCount % 30 == 0)
|
||||
{
|
||||
// Position nach dem aktuellen Element – aber nur einfügen wenn es eine
|
||||
// assistant-Message ist (damit user/assistant-Alternierung nicht bricht)
|
||||
if (history[i] is Dictionary<string, object> d &&
|
||||
d.TryGetValue("role", out var r) && r.ToString() == "assistant")
|
||||
{
|
||||
insertPositions.Add(i + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Von hinten nach vorne einfügen, damit Indizes nicht verschoben werden
|
||||
for (int j = insertPositions.Count - 1; j >= 0; j--)
|
||||
{
|
||||
var pos = insertPositions[j];
|
||||
history.Insert(pos, reminderAssistant);
|
||||
history.Insert(pos, reminderUser);
|
||||
}
|
||||
}
|
||||
|
||||
return history;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user