// // AiVM.h // keyBoard // // Created by Mac on 2026/1/22. // #import #import "KBPersonaPageModel.h" #import "KBChatHistoryPageModel.h" #import "KBCommentModel.h" #import "KBLikedCompanionModel.h" #import "KBChattedCompanionModel.h" #import "KBChatSessionResetModel.h" #import "KBAICompanionDetailModel.h" NS_ASSUME_NONNULL_BEGIN @interface KBAiSyncData : NSObject @property(nonatomic, copy, nullable) NSString *aiResponse; @property(nonatomic, copy, nullable) NSString *audioBase64; @property(nonatomic, strong, nullable) NSData *audioData; @end @interface KBAiSyncResponse : NSObject @property(nonatomic, assign) NSInteger code; @property(nonatomic, strong, nullable) KBAiSyncData *data; @end typedef void (^AiVMSyncCompletion)(KBAiSyncResponse *_Nullable response, NSError *_Nullable error); @interface KBAiMessageData : NSObject @property(nonatomic, copy, nullable) NSString *content; @property(nonatomic, copy, nullable) NSString *text; @property(nonatomic, copy, nullable) NSString *message; @property(nonatomic, copy, nullable) NSString *aiResponse; @property(nonatomic, copy, nullable) NSString *audioId; @property(nonatomic, assign) NSInteger llmDuration; @end @interface KBAiMessageResponse : NSObject @property(nonatomic, assign) NSInteger code; @property(nonatomic, strong, nullable) KBAiMessageData *data; @property(nonatomic, copy, nullable) NSString *message; @end typedef void (^AiVMMessageCompletion)(KBAiMessageResponse *_Nullable response, NSError *_Nullable error); typedef void (^AiVMAudioURLCompletion)(NSString *_Nullable audioURL, NSError *_Nullable error); typedef void (^AiVMUploadAudioCompletion)(NSString *_Nullable fileURL, NSError *_Nullable error); @interface KBAiSpeechTranscribeData : NSObject @property(nonatomic, copy, nullable) NSString *transcript; @property(nonatomic, assign) double confidence; @property(nonatomic, assign) double duration; @property(nonatomic, copy, nullable) NSString *detectedLanguage; @end @interface KBAiSpeechTranscribeResponse : NSObject @property(nonatomic, assign) NSInteger code; @property(nonatomic, strong, nullable) KBAiSpeechTranscribeData *data; @property(nonatomic, copy, nullable) NSString *message; @end typedef void (^AiVMSpeechTranscribeCompletion)(KBAiSpeechTranscribeResponse *_Nullable response, NSError *_Nullable error); @interface AiVM : NSObject - (void)syncChatWithTranscript:(NSString *)transcript completion:(AiVMSyncCompletion)completion; - (void)requestChatMessageWithContent:(NSString *)content companionId:(NSInteger)companionId completion:(AiVMMessageCompletion)completion; /// 根据 audioId 获取音频 URL - (void)requestAudioWithAudioId:(NSString *)audioId completion:(AiVMAudioURLCompletion)completion; /// 上传语音文件(m4a) - (void)uploadAudioFileAtURL:(NSURL *)fileURL completion:(AiVMUploadAudioCompletion)completion; /// 语音转文字(multipart/form-data) - (void)transcribeAudioFileAtURL:(NSURL *)fileURL completion:(AiVMSpeechTranscribeCompletion)completion; #pragma mark - 人设相关接口 /// 分页查询人设列表 /// @param pageNum 页码(从 1 开始) /// @param pageSize 每页大小 /// @param completion 完成回调 - (void)fetchPersonasWithPageNum:(NSInteger)pageNum pageSize:(NSInteger)pageSize completion:(void(^)(KBPersonaPageModel * _Nullable pageModel, NSError * _Nullable error))completion; /// 分页查询聊天记录 /// @param companionId AI 陪聊角色 ID /// @param pageNum 页码(从 1 开始) /// @param pageSize 每页大小 /// @param completion 完成回调 - (void)fetchChatHistoryWithCompanionId:(NSInteger)companionId pageNum:(NSInteger)pageNum pageSize:(NSInteger)pageSize completion:(void(^)(KBChatHistoryPageModel * _Nullable pageModel, NSError * _Nullable error))completion; #pragma mark - 评论相关接口 /// 发表评论 /// @param companionId AI 陪聊角色 ID /// @param content 评论内容 /// @param parentId 父评论 ID(一级评论传 NULL) /// @param rootId 根评论 ID(用于标识一级评论) /// @param completion 完成回调(newItem 可能为空,取决于后端是否返回 data) - (void)addCommentWithCompanionId:(NSInteger)companionId content:(NSString *)content parentId:(nullable NSNumber *)parentId rootId:(nullable NSNumber *)rootId completion:(void(^)(KBCommentItem * _Nullable newItem, NSInteger code, NSError * _Nullable error))completion; /// 分页查询评论列表 /// @param companionId AI 陪聊角色 ID /// @param pageNum 页码(从 1 开始,默认 1) /// @param pageSize 每页大小(默认 20) /// @param completion 完成回调(返回评论分页模型) - (void)fetchCommentsWithCompanionId:(NSInteger)companionId pageNum:(NSInteger)pageNum pageSize:(NSInteger)pageSize completion:(void(^)(KBCommentPageModel * _Nullable pageModel, NSError * _Nullable error))completion; /// 点赞/取消点赞评论 /// @param commentId 评论 ID /// @param completion 完成回调(返回点赞响应模型) - (void)likeCommentWithCommentId:(NSInteger)commentId completion:(void(^)(KBCommentLikeResponse * _Nullable response, NSError * _Nullable error))completion; /// 点赞/取消点赞 AI 角色 /// @param companionId AI 角色 ID /// @param completion 完成回调(返回点赞响应模型) - (void)likeCompanionWithCompanionId:(NSInteger)companionId completion:(void(^)(KBCommentLikeResponse * _Nullable response, NSError * _Nullable error))completion; #pragma mark - 点赞列表接口 /// 获取当前用户点赞过的 AI 角色列表(Thumbs Up) /// @param completion 完成回调(返回点赞角色数组) - (void)fetchLikedCompanionsWithCompletion:(void(^)(NSArray * _Nullable list, NSError * _Nullable error))completion; /// 获取当前用户聊过天的 AI 角色列表(Chatting) /// @param completion 完成回调(返回聊天角色数组) - (void)fetchChattedCompanionsWithCompletion:(void(^)(NSArray * _Nullable list, NSError * _Nullable error))completion; #pragma mark - 会话管理接口 /// 重置会话(将当前会话设为不活跃并创建新会话) /// @param companionId AI 角色 ID /// @param completion 完成回调(返回新会话信息) - (void)resetChatSessionWithCompanionId:(NSInteger)companionId completion:(void(^)(KBChatSessionResetResponse * _Nullable response, NSError * _Nullable error))completion; #pragma mark - AI 角色详情接口 /// 根据 ID 获取 AI 角色详情 /// @param companionId AI 角色 ID /// @param completion 完成回调(返回角色详情) - (void)fetchCompanionDetailWithCompanionId:(NSInteger)companionId completion:(void(^)(KBAICompanionDetailModel * _Nullable detail, NSError * _Nullable error))completion; @end NS_ASSUME_NONNULL_END