This commit is contained in:
2026-01-28 20:18:18 +08:00
parent 70a8466d9f
commit ef52cd4872
7 changed files with 165 additions and 44 deletions

View File

@@ -202,8 +202,14 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
//
[self.chatView stopPlayingAudio];
//
//
[self ensureOpeningMessageAtTop];
//
if (self.messages.count > 0) {
//
[[KBAIChatMessageCacheManager shared] saveMessages:self.messages
forCompanionId:persona.personaId];
[self.chatView reloadWithMessages:self.messages
keepOffset:NO
scrollToBottom:YES];
@@ -287,14 +293,19 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
[newMessages addObject:message];
}
//
//
if (weakSelf.currentPage == 1) {
//
weakSelf.messages = newMessages;
[weakSelf ensureOpeningMessageAtTop];
} else {
//
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, newMessages.count)];
[weakSelf.messages insertObjects:newMessages atIndexes:indexSet];
//
[weakSelf ensureOpeningMessageAtTop];
if (newMessages.count > 0) {
NSUInteger insertIndex = [weakSelf hasOpeningMessageAtTop] ? 1 : 0;
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(insertIndex, newMessages.count)];
[weakSelf.messages insertObjects:newMessages atIndexes:indexSet];
}
}
// UI
@@ -306,8 +317,8 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
scrollToBottom:scrollToBottom];
[weakSelf.chatView endLoadMoreWithHasMoreData:weakSelf.hasMoreHistory];
//
[[KBAIChatMessageCacheManager shared] saveMessages:weakSelf.messages
//
[[KBAIChatMessageCacheManager shared] saveMessages:weakSelf.messages
forCompanionId:companionId];
});
@@ -332,10 +343,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
- (void)showOpeningMessage {
//
KBAiChatMessage *openingMsg = [KBAiChatMessage assistantMessageWithText:self.persona.introText];
openingMsg.isComplete = YES;
openingMsg.needsTypewriterEffect = NO;
[self.messages addObject:openingMsg];
[self ensureOpeningMessageAtTop];
dispatch_async(dispatch_get_main_queue(), ^{
[self.chatView reloadWithMessages:self.messages
@@ -344,6 +352,41 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
});
}
- (BOOL)hasOpeningMessageAtTop {
if (self.messages.count == 0) {
return NO;
}
return [self isOpeningMessage:self.messages.firstObject];
}
- (BOOL)isOpeningMessage:(KBAiChatMessage *)message {
if (!message) {
return NO;
}
NSString *introText = self.persona.introText ?: @"";
if (introText.length == 0) {
return NO;
}
return (message.type == KBAiChatMessageTypeAssistant) && [message.text isEqualToString:introText];
}
- (void)ensureOpeningMessageAtTop {
NSString *introText = self.persona.introText ?: @"";
if (introText.length == 0) {
return;
}
if (!self.messages) {
self.messages = [NSMutableArray array];
}
if ([self hasOpeningMessageAtTop]) {
return;
}
KBAiChatMessage *openingMsg = [KBAiChatMessage assistantMessageWithText:introText];
openingMsg.isComplete = YES;
openingMsg.needsTypewriterEffect = NO;
[self.messages insertObject:openingMsg atIndex:0];
}
#pragma mark -
///
@@ -368,10 +411,8 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
//
[self.chatView clearMessages];
//
if (self.persona.introText.length > 0) {
[self showOpeningMessage];
}
//
[self showOpeningMessage];
}
}
@@ -386,13 +427,14 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
self.messages = [NSMutableArray array];
}
[self ensureOpeningMessageAtTop];
KBAiChatMessage *message = [KBAiChatMessage userMessageWithText:text];
[self.messages addObject:message];
[self.chatView addMessage:message autoScroll:YES];
}
- (void)appendAssistantMessage:(NSString *)text
audioId:(NSString *)audioId {
audioId:(NSString *)audioId {
if (text.length == 0) {
return;
}
@@ -401,6 +443,7 @@ static NSString * const KBChatSessionDidResetNotification = @"KBChatSessionDidRe
self.messages = [NSMutableArray array];
}
[self ensureOpeningMessageAtTop];
KBAiChatMessage *message = [KBAiChatMessage assistantMessageWithText:text
audioId:audioId];
message.needsTypewriterEffect = YES;