重构会话页面的消息渲染,支持块级虚拟化,提升长会话性能,减少卡断

This commit is contained in:
xintaofei
2026-03-24 18:52:25 +08:00
parent b7df63c5f8
commit 284e45fbdf
11 changed files with 386 additions and 223 deletions

View File

@@ -863,11 +863,9 @@ fn group_into_turns(messages: Vec<UnifiedMessage>) -> Vec<MessageTurn> {
let turn_model = msg.model.clone();
i += 1;
// Absorb consecutive assistant msgs AND tool-result-only user msgs
while i < messages.len()
&& (matches!(messages[i].role, MessageRole::Assistant)
|| is_tool_result_only(&messages[i]))
{
// Only absorb immediately following tool-result-only user msgs
// (stop at the next assistant message to keep turns small for virtualization)
while i < messages.len() && is_tool_result_only(&messages[i]) {
blocks.extend(messages[i].content.clone());
i += 1;
}

View File

@@ -1192,9 +1192,10 @@ fn group_into_turns(messages: Vec<UnifiedMessage>) -> Vec<MessageTurn> {
let timestamp = msg.timestamp;
i += 1;
// Only absorb immediately following Tool messages
// (stop at the next assistant message to keep turns small for virtualization)
while i < messages.len()
&& (matches!(messages[i].role, MessageRole::Assistant)
|| matches!(messages[i].role, MessageRole::Tool))
&& matches!(messages[i].role, MessageRole::Tool)
{
blocks.extend(messages[i].content.clone());
if usage.is_none() {

View File

@@ -681,9 +681,10 @@ fn group_into_turns(messages: Vec<UnifiedMessage>) -> Vec<MessageTurn> {
let timestamp = msg.timestamp;
i += 1;
// Only absorb immediately following Tool messages
// (stop at the next assistant message to keep turns small for virtualization)
while i < messages.len()
&& (matches!(messages[i].role, MessageRole::Assistant)
|| matches!(messages[i].role, MessageRole::Tool))
&& matches!(messages[i].role, MessageRole::Tool)
{
blocks.extend(messages[i].content.clone());
if usage.is_none() {

View File

@@ -1105,9 +1105,10 @@ fn group_into_turns(messages: Vec<UnifiedMessage>) -> Vec<MessageTurn> {
let timestamp = msg.timestamp;
i += 1;
// Only absorb immediately following Tool messages
// (stop at the next assistant message to keep turns small for virtualization)
while i < messages.len()
&& (matches!(messages[i].role, MessageRole::Assistant)
|| matches!(messages[i].role, MessageRole::Tool))
&& matches!(messages[i].role, MessageRole::Tool)
{
blocks.extend(messages[i].content.clone());
if usage.is_none() {

View File

@@ -667,9 +667,10 @@ fn group_into_turns(messages: Vec<UnifiedMessage>) -> Vec<MessageTurn> {
let timestamp = msg.timestamp;
i += 1;
// Only absorb immediately following Tool messages
// (stop at the next assistant message to keep turns small for virtualization)
while i < messages.len()
&& (matches!(messages[i].role, MessageRole::Assistant)
|| matches!(messages[i].role, MessageRole::Tool))
&& matches!(messages[i].role, MessageRole::Tool)
{
blocks.extend(messages[i].content.clone());
if usage.is_none() {