Чат: автоименование сессии из первого сообщения

- Assistant.processInSession: безымянная сессия получает имя из
  первого сообщения (обреза 30 симв.), «беседка» — пустое
- ChatScreen: периодическая перезагрузка подхватывает и список
  сессий — шапка обновляет название без ручного переключения
This commit is contained in:
2026-08-23 17:40:12 +03:00
parent ce2d9c5448
commit 51049d56a8
2 changed files with 9 additions and 1 deletions
@@ -39,6 +39,12 @@ class Assistant(
/** Обработать фразу в КОНКРЕТНОЙ сессии [sessionId] (переключение сессий). */
suspend fun processInSession(sessionId: Long, text: String): String {
chatDao.addMessage(sessionId, role = ChatRole.USER, content = text)
// Сессия безымянная (создана кнопкой «новая сессия») — имя из первого сообщения.
val s = chatDao.getSession(sessionId)
if (s != null && s.title.isBlank()) {
val t = text.trim().take(30)
chatDao.renameSession(sessionId, if (t.isEmpty()) "беседка" else t)
}
return processInSession(sessionId)
}
@@ -90,7 +90,8 @@ fun ChatScreen() {
}
// Периодическая перезагрузка сообщений из БД (ответ ассистента приходит
// асинхронно — лента должна подхватывать его без ручного обновления).
// асинхронно — лента должна подхватывать его без ручного обновления)
// + списка сессий (автоименование: имя проставляется при первом сообщении).
LaunchedEffect(activeId) {
while (true) {
delay(2_000)
@@ -99,6 +100,7 @@ fun ChatScreen() {
val fresh = withContext(Dispatchers.IO) { app.chatDao.messagesForSession(id).map { it.role to it.content } }
if (fresh != messages) messages = fresh
}
withContext(Dispatchers.IO) { app.chatDao.listSessions() }.let { s -> if (s != sessions) sessions = s }
}
}