2026-01-23 21:51:37 +08:00
|
|
|
|
//
|
|
|
|
|
|
// KBAiChatMessage.h
|
|
|
|
|
|
// keyBoard
|
|
|
|
|
|
//
|
|
|
|
|
|
// Created by Kiro on 2026/1/23.
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#import <Foundation/Foundation.h>
|
|
|
|
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
|
|
/// 消息类型
|
|
|
|
|
|
typedef NS_ENUM(NSInteger, KBAiChatMessageType) {
|
|
|
|
|
|
KBAiChatMessageTypeUser, // 用户消息
|
|
|
|
|
|
KBAiChatMessageTypeAssistant, // AI 回复
|
|
|
|
|
|
KBAiChatMessageTypeTime // 时间戳
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// AI 聊天消息模型
|
|
|
|
|
|
@interface KBAiChatMessage : NSObject
|
|
|
|
|
|
|
|
|
|
|
|
/// 消息类型
|
|
|
|
|
|
@property (nonatomic, assign) KBAiChatMessageType type;
|
|
|
|
|
|
|
|
|
|
|
|
/// 文本内容
|
|
|
|
|
|
@property (nonatomic, copy) NSString *text;
|
|
|
|
|
|
|
|
|
|
|
|
/// 消息时间戳
|
|
|
|
|
|
@property (nonatomic, strong) NSDate *timestamp;
|
|
|
|
|
|
|
|
|
|
|
|
/// 语音时长(秒)- 仅 AI 消息使用
|
|
|
|
|
|
@property (nonatomic, assign) NSTimeInterval audioDuration;
|
|
|
|
|
|
|
|
|
|
|
|
/// 语音数据 - 仅 AI 消息使用
|
|
|
|
|
|
@property (nonatomic, strong, nullable) NSData *audioData;
|
|
|
|
|
|
|
|
|
|
|
|
/// 音频 ID - 用于异步加载音频
|
|
|
|
|
|
@property (nonatomic, copy, nullable) NSString *audioId;
|
|
|
|
|
|
|
|
|
|
|
|
/// 是否完成(用于打字机效果)
|
|
|
|
|
|
@property (nonatomic, assign) BOOL isComplete;
|
|
|
|
|
|
|
|
|
|
|
|
/// 是否需要打字机效果(只有当前正在输入的消息才需要)
|
|
|
|
|
|
@property (nonatomic, assign) BOOL needsTypewriterEffect;
|
|
|
|
|
|
|
2026-01-29 14:42:49 +08:00
|
|
|
|
/// 是否处于加载状态(用户消息)
|
|
|
|
|
|
@property (nonatomic, assign) BOOL isLoading;
|
|
|
|
|
|
|
2026-01-23 21:51:37 +08:00
|
|
|
|
#pragma mark - 便捷构造方法
|
|
|
|
|
|
|
2026-01-29 14:42:49 +08:00
|
|
|
|
/// 创建加载中的用户消息
|
|
|
|
|
|
+ (instancetype)loadingUserMessage;
|
|
|
|
|
|
|
2026-01-23 21:51:37 +08:00
|
|
|
|
/// 创建用户消息
|
|
|
|
|
|
+ (instancetype)userMessageWithText:(NSString *)text;
|
|
|
|
|
|
|
|
|
|
|
|
/// 创建 AI 消息(带语音)
|
|
|
|
|
|
+ (instancetype)assistantMessageWithText:(NSString *)text
|
|
|
|
|
|
audioDuration:(NSTimeInterval)duration
|
|
|
|
|
|
audioData:(nullable NSData *)audioData;
|
|
|
|
|
|
|
|
|
|
|
|
/// 创建 AI 消息(带 audioId,异步加载音频)
|
|
|
|
|
|
+ (instancetype)assistantMessageWithText:(NSString *)text
|
|
|
|
|
|
audioId:(nullable NSString *)audioId;
|
|
|
|
|
|
|
|
|
|
|
|
/// 创建 AI 消息(仅文本,无音频)
|
|
|
|
|
|
+ (instancetype)assistantMessageWithText:(NSString *)text;
|
|
|
|
|
|
|
2026-01-29 20:56:24 +08:00
|
|
|
|
/// 创建加载中的 AI 消息
|
|
|
|
|
|
+ (instancetype)loadingAssistantMessage;
|
|
|
|
|
|
|
2026-01-23 21:51:37 +08:00
|
|
|
|
/// 创建时间戳消息
|
|
|
|
|
|
+ (instancetype)timeMessageWithTimestamp:(NSDate *)timestamp;
|
|
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_END
|