feat: Chat-History auf max. 500 Nachrichten limitieren
This commit is contained in:
1 parent
58c5ccb79b
commit
e31daa2385
4 files changed
+53
-7
No files matched your search
@@ -33,16 +33,31 @@ public static class HistoryEndpoint
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int messageLimit = 500;
|
||||||
|
|
||||||
|
var totalCount = await db.GetActiveMessageCount(sessionId);
|
||||||
|
var messages = await db.GetLatestActiveMessages(sessionId, messageLimit);
|
||||||
|
|
||||||
|
// Nach Chain gruppieren (Reihenfolge beibehalten)
|
||||||
|
var chainIds = messages.Select(m => m.ChainId).Distinct().ToList();
|
||||||
var chains = await db.GetActiveChains(sessionId);
|
var chains = await db.GetActiveChains(sessionId);
|
||||||
|
var chainMap = chains.ToDictionary(c => c.ChainId);
|
||||||
|
|
||||||
var result = new List<object>();
|
var result = new List<object>();
|
||||||
foreach (var chain in chains)
|
foreach (var chainId in chainIds)
|
||||||
{
|
{
|
||||||
var messages = await db.GetChainMessages(chain.ChainId);
|
chainMap.TryGetValue(chainId, out var chain);
|
||||||
result.Add(new { chain, messages });
|
var chainMessages = messages.Where(m => m.ChainId == chainId).ToList();
|
||||||
|
result.Add(new { chain, messages = chainMessages });
|
||||||
}
|
}
|
||||||
|
|
||||||
await ctx.Response.WriteAsJsonAsync(result);
|
await ctx.Response.WriteAsJsonAsync(new
|
||||||
|
{
|
||||||
|
entries = result,
|
||||||
|
hasMore = totalCount > messageLimit,
|
||||||
|
totalCount,
|
||||||
|
loadedCount = messages.Count
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task HandlePoll(HttpContext ctx, DatabaseService db)
|
private static async Task HandlePoll(HttpContext ctx, DatabaseService db)
|
||||||
|
|||||||
@@ -492,6 +492,28 @@ public class DatabaseService
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<int> GetActiveMessageCount(string sessionId)
|
||||||
|
{
|
||||||
|
using var conn = CreateConnection();
|
||||||
|
return await conn.ExecuteScalarAsync<int>(@"
|
||||||
|
SELECT COUNT(*) FROM messages m
|
||||||
|
JOIN chains c ON m.chain_id = c.chain_id
|
||||||
|
WHERE c.archive_id IS NULL AND c.session_id = @sessionId",
|
||||||
|
new { sessionId });
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<MessageRecord>> GetLatestActiveMessages(string sessionId, int limit)
|
||||||
|
{
|
||||||
|
using var conn = CreateConnection();
|
||||||
|
var messages = await conn.QueryAsync<MessageRecord>(@"
|
||||||
|
SELECT m.* FROM messages m
|
||||||
|
JOIN chains c ON m.chain_id = c.chain_id
|
||||||
|
WHERE c.archive_id IS NULL AND c.session_id = @sessionId
|
||||||
|
ORDER BY m.id DESC LIMIT @limit",
|
||||||
|
new { sessionId, limit });
|
||||||
|
return messages.Reverse().ToList();
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<MessageRecord>> GetActiveMessagesAfterId(string sessionId, long afterId, int limit = 200)
|
public async Task<IEnumerable<MessageRecord>> GetActiveMessagesAfterId(string sessionId, long afterId, int limit = 200)
|
||||||
{
|
{
|
||||||
using var conn = CreateConnection();
|
using var conn = CreateConnection();
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
- [ ] Subagents: Möglichkeit Subagents zu starten und zu orchestrieren
|
- [ ] Subagents: Möglichkeit Subagents zu starten und zu orchestrieren
|
||||||
- [x] Im Chat: Menüpunkt "Datenbank sichern" entfernen und stattdessen in den Einstellungen platzieren. Außerdem soll nun nicht mehr nur die Datenbank gesichert werden, sondern der gesamte data-Ordner (der Unterordner backup muss natürlich exkludiert werden)
|
- [x] Im Chat: Menüpunkt "Datenbank sichern" entfernen und stattdessen in den Einstellungen platzieren. Außerdem soll nun nicht mehr nur die Datenbank gesichert werden, sondern der gesamte data-Ordner (der Unterordner backup muss natürlich exkludiert werden)
|
||||||
- [ ] Agents-Formular (nur beim Bearbeiten von vorhandenen Agent): Button der das File-Explorer Modal öffnet bei dem ich den Agent-Ordner sehe.
|
- [ ] Agents-Formular (nur beim Bearbeiten von vorhandenen Agent): Button der das File-Explorer Modal öffnet bei dem ich den Agent-Ordner sehe.
|
||||||
- [ ] Chat: Maximal 500 Nachrichten laden. Dauert sonst zu lange und der Browser wird langsam
|
- [x] Chat: Maximal 500 Nachrichten laden. Dauert sonst zu lange und der Browser wird langsam
|
||||||
|
|
||||||
## Bugs
|
## Bugs
|
||||||
- [x] Wenn gerade gestreamt wird und man refreshed die Seite, dann verliert das Frontend den Status "Streaming..." und ich kann eine Nachricht schreiben, obwohl das nicht möglich sein sollte
|
- [x] Wenn gerade gestreamt wird und man refreshed die Seite, dann verliert das Frontend den Status "Streaming..." und ich kann eine Nachricht schreiben, obwohl das nicht möglich sein sollte
|
||||||
|
|||||||
+11
-2
@@ -13,9 +13,18 @@ async function loadHistory() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const data = await apiHistory(sid);
|
const data = await apiHistory(sid);
|
||||||
data.reverse();
|
const entries = data.entries || [];
|
||||||
|
entries.reverse();
|
||||||
|
|
||||||
for (const entry of data) {
|
if (data.hasMore) {
|
||||||
|
const skipped = data.totalCount - data.loadedCount;
|
||||||
|
const info = document.createElement('div');
|
||||||
|
info.className = 'msg system-info';
|
||||||
|
info.innerHTML = `<i class="fa fa-info-circle"></i> ${skipped} ältere Nachrichten nicht geladen`;
|
||||||
|
chatEl().appendChild(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
renderMessages(entry.messages, true);
|
renderMessages(entry.messages, true);
|
||||||
if (entry.chain) addChainMetaBubble(entry.chain, false);
|
if (entry.chain) addChainMetaBubble(entry.chain, false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user