1
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user