From 9546dab93db118583063c2fffafd971f5a4a9f6f Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 4 Mar 2026 02:32:08 -0800 Subject: [PATCH] fix(it0_app): stop using systemPrompt as conversation title MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voice sessions set systemPrompt to the voice-mode instruction string, causing every voice conversation to display '你正在通过语音与用户实时对话。请…' as its title in the chat history list. Title derivation priority (highest to lowest): 1. metadata.title — explicit title saved by backend on first task 2. metadata.voiceMode == true → '语音对话 M/D HH:mm' 3. Fallback → '对话 M/D HH:mm' based on session createdAt --- .../widgets/conversation_drawer.dart | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/it0_app/lib/features/chat/presentation/widgets/conversation_drawer.dart b/it0_app/lib/features/chat/presentation/widgets/conversation_drawer.dart index 794104c..8b03977 100644 --- a/it0_app/lib/features/chat/presentation/widgets/conversation_drawer.dart +++ b/it0_app/lib/features/chat/presentation/widgets/conversation_drawer.dart @@ -22,7 +22,11 @@ class SessionSummary { factory SessionSummary.fromJson(Map json) { return SessionSummary( id: json['id'] as String, - title: json['systemPrompt'] as String? ?? _generateTitle(json), + // NOTE: Never use systemPrompt as title — it's an internal engine instruction + // (voice sessions set systemPrompt to the voice-mode rules string, which caused + // every voice conversation to appear as "你正在通过语音与用户实时对话。请…"). + // Always derive the display title from metadata or the session creation time. + title: _generateTitle(json), status: json['status'] as String? ?? 'active', createdAt: DateTime.tryParse(json['createdAt'] as String? ?? '') ?? DateTime.now(), updatedAt: DateTime.tryParse(json['updatedAt'] as String? ?? '') ?? DateTime.now(), @@ -30,12 +34,21 @@ class SessionSummary { } static String _generateTitle(Map json) { - // Use metadata or fallback to date-based title final meta = json['metadata'] as Map?; - if (meta != null && meta['title'] != null) { - return meta['title'] as String; - } + + // 1. Use the explicit title stored by the backend on first task (text sessions) + final storedTitle = meta?['title'] as String?; + if (storedTitle != null && storedTitle.isNotEmpty) return storedTitle; + final createdAt = DateTime.tryParse(json['createdAt'] as String? ?? ''); + + // 2. Voice sessions: prefix with 🎙 and show time + final isVoice = meta?['voiceMode'] as bool? ?? false; + if (isVoice && createdAt != null) { + return '语音对话 ${createdAt.month}/${createdAt.day} ${createdAt.hour}:${createdAt.minute.toString().padLeft(2, '0')}'; + } + + // 3. Fallback: date-based title if (createdAt != null) { return '对话 ${createdAt.month}/${createdAt.day} ${createdAt.hour}:${createdAt.minute.toString().padLeft(2, '0')}'; }