@@ -699,15 +699,25 @@ class ChatController(
|
699 | 699 | |
700 | 700 | private fun updateSessionFromHistory(history: ChatHistory) { |
701 | 701 | val info = history.sessionInfo ?: return |
702 | | - upsertSessionEntry(info) |
| 702 | + upsertSessionEntry(info, preserveExistingContextUsageWithoutTotal = true) |
703 | 703 | } |
704 | 704 | |
705 | | -private fun upsertSessionEntry(entry: ChatSessionEntry) { |
| 705 | +private fun upsertSessionEntry( |
| 706 | +entry: ChatSessionEntry, |
| 707 | +preserveExistingContextUsageWithoutTotal: Boolean = false, |
| 708 | + ) { |
706 | 709 | val current = _sessions.value |
707 | 710 | val index = current.indexOfFirst { it.key == entry.key } |
708 | 711 | _sessions.value = |
709 | 712 | if (index >= 0) { |
710 | | - current.toMutableList().also { it[index] = mergeChatSessionEntry(it[index], entry) } |
| 713 | + current.toMutableList().also { |
| 714 | + it[index] = |
| 715 | + mergeChatSessionEntry( |
| 716 | + existing = it[index], |
| 717 | + next = entry, |
| 718 | + preserveExistingContextUsageWithoutTotal = preserveExistingContextUsageWithoutTotal, |
| 719 | + ) |
| 720 | + } |
711 | 721 | } else { |
712 | 722 | listOf(entry) + current |
713 | 723 | } |
@@ -947,12 +957,34 @@ private fun JsonElement?.asBooleanOrNull(): Boolean? =
|
947 | 957 | internal fun mergeChatSessionEntry( |
948 | 958 | existing: ChatSessionEntry, |
949 | 959 | next: ChatSessionEntry, |
950 | | -): ChatSessionEntry = |
951 | | - existing.copy( |
| 960 | +preserveExistingContextUsageWithoutTotal: Boolean = false, |
| 961 | +): ChatSessionEntry { |
| 962 | +val preserveExistingContextUsage = preserveExistingContextUsageWithoutTotal && next.totalTokens == null |
| 963 | +return existing.copy( |
952 | 964 | updatedAtMs = next.updatedAtMs ?: existing.updatedAtMs, |
953 | 965 | displayName = next.displayName ?: existing.displayName, |
954 | | - totalTokens = if (next.hasContextUsageMetadata) next.totalTokens else null, |
955 | | - totalTokensFresh = if (next.hasContextUsageMetadata) next.totalTokensFresh else null, |
956 | | - contextTokens = if (next.hasContextUsageMetadata) next.contextTokens else null, |
957 | | - hasContextUsageMetadata = next.hasContextUsageMetadata, |
| 966 | + totalTokens = |
| 967 | +when { |
| 968 | + preserveExistingContextUsage -> existing.totalTokens |
| 969 | + next.hasContextUsageMetadata -> next.totalTokens |
| 970 | +else -> null |
| 971 | + }, |
| 972 | + totalTokensFresh = |
| 973 | +when { |
| 974 | + preserveExistingContextUsage -> existing.totalTokensFresh |
| 975 | + next.hasContextUsageMetadata -> next.totalTokensFresh |
| 976 | +else -> null |
| 977 | + }, |
| 978 | + contextTokens = |
| 979 | +when { |
| 980 | + preserveExistingContextUsage -> next.contextTokens ?: existing.contextTokens |
| 981 | + next.hasContextUsageMetadata -> next.contextTokens |
| 982 | +else -> null |
| 983 | + }, |
| 984 | + hasContextUsageMetadata = |
| 985 | +when { |
| 986 | + preserveExistingContextUsage -> existing.hasContextUsageMetadata || next.contextTokens != null |
| 987 | +else -> next.hasContextUsageMetadata |
| 988 | + }, |
958 | 989 | ) |
| 990 | +} |