@@ -699,15 +699,25 @@ class ChatController(
699699
700700 private fun updateSessionFromHistory (history : ChatHistory ) {
701701 val info = history.sessionInfo ? : return
702- upsertSessionEntry(info)
702+ upsertSessionEntry(info, preserveExistingContextUsageWithoutTotal = true )
703703 }
704704
705- private fun upsertSessionEntry (entry : ChatSessionEntry ) {
705+ private fun upsertSessionEntry (
706+ entry : ChatSessionEntry ,
707+ preserveExistingContextUsageWithoutTotal : Boolean = false,
708+ ) {
706709 val current = _sessions .value
707710 val index = current.indexOfFirst { it.key == entry.key }
708711 _sessions .value =
709712 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+ }
711721 } else {
712722 listOf (entry) + current
713723 }
@@ -947,12 +957,34 @@ private fun JsonElement?.asBooleanOrNull(): Boolean? =
947957internal fun mergeChatSessionEntry (
948958 existing : ChatSessionEntry ,
949959 next : ChatSessionEntry ,
950- ): ChatSessionEntry =
951- existing.copy(
960+ preserveExistingContextUsageWithoutTotal : Boolean = false,
961+ ): ChatSessionEntry {
962+ val preserveExistingContextUsage = preserveExistingContextUsageWithoutTotal && next.totalTokens == null
963+ return existing.copy(
952964 updatedAtMs = next.updatedAtMs ? : existing.updatedAtMs,
953965 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+ },
958989 )
990+ }
0 commit comments