ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zoom Meeting SDK(Windows)AI Companion 集成实战:Smart Summary 与 AI Query 完整开发指南

Zoom Meeting SDK(Windows)AI Companion 集成实战:Smart Summary 与 AI Query 完整开发指南 Zoom Meeting SDKWindowsAI Companion 集成实战Smart Summary 与 AI Query 完整开发指南【免费下载链接】knowledge-work-pluginsOpen source repository of plugins primarily intended for knowledge workers to use in Claude Cowork项目地址: https://gitcode.com/GitHub_Trending/kn/knowledge-work-plugins导读本篇指南以 ai-companion.md 为主体系统讲解如何在 Zoom Meeting SDK for Windows原生 C中集成 AI Companion 的两大核心能力**Smart SummaryAI 会议纪要**与AI Query会议内容问答并覆盖IMeetingAICompanionController控制器的全局开关、与会者请求/审批流程等高级操作。阅读完成后你将掌握获取控制器 → 实现事件监听 → 注册并使用的完整落地套路能够直接在自己的 Windows 桌面应用或会议辅助工具中复刻一套可运行的 AI Companion 功能模块。1. 功能全景IMeetingAICompanionController 与三个子 HelperAI Companion 的所有能力都挂载在单例控制器IMeetingAICompanionController之下由IMeetingService通过GetMeetingAICompanionController()获取。该控制器提供Level 3 子 Helper分别对应不同代的 AI 功能HelperGetter状态用途IMeetingSmartSummaryHelperGetMeetingSmartSummaryHelper()DEPRECATED已废弃旧版 Smart Summary APIIMeetingAICompanionSmartSummaryHelperGetMeetingAICompanionSmartSummaryHelper()当前版本AI 会议纪要IMeetingAICompanionQueryHelperGetMeetingAICompanionQueryHelper()当前版本针对会议内容的 AI 问答从 SDK 的单例层级树singleton-hierarchy.md可以看出IMeetingAICompanionController位于IMeetingService下的 Level 2其三个子 Helper 均为 Level 3 叶子节点。导航路径如下IMeetingService └─► GetMeetingAICompanionController() ├─► GetMeetingSmartSummaryHelper() // DEPRECATED ├─► GetMeetingAICompanionSmartSummaryHelper() // Smart Summary └─► GetMeetingAICompanionQueryHelper() // AI Query/QA同一份层级文档还明确给出了废弃对应关系IMeetingSmartSummaryController应改用IMeetingAICompanionControllerIMeetingSmartSummaryHelper应改用GetMeetingAICompanionSmartSummaryHelper()。新代码务必直接使用带AICompanion前缀的接口避免踩入废弃 API 的坑。1.1 前置条件Prerequisites在调用任何 AI Companion 能力之前需要同时满足三个前提账号侧启用AI Companion 功能必须在 Zoom 账号设置中开启主持人权限启动相关功能如开启 Smart Summary、更改查询设置需要主持人Host权限会议进行中只有处于MEETING_STATUS_INMEETING状态时控制器才有效。这一点与 SDK 的通用约定一致控制器在未入会时可能返回nullptr详见 singleton-hierarchy.md 的Practical Rules因此必须在收到入会回调后再获取 AI Companion 控制器并始终做空指针检查。1.2 值得一提的边界Meeting SDK 面向真人用户跨平台参考文档 ai-companion.md 特别强调Meeting SDK仅供人类用户使用不支持 bot 或 AI 记笔记应用如需机器人的实时转写/自动化处理应使用 RTMSReal-Time Media Stream方案。如果你的项目定位是会议机器人需要先确认采用 Meeting SDK 的合法使用边界。2. Smart SummaryAI 会议纪要Smart Summary 由 AI 自动生成会议纪要涵盖关键要点key points、行动项action items与决策decisions。它本质上是一个状态机驱动的功能未支持 → 已支持未启用 → 已启用未启动 → 已启动每个状态迁移都会触发对应回调。2.1 获取 HelperIMeetingAICompanionController* aiCtrl meetingService-GetMeetingAICompanionController(); if (!aiCtrl) return; IMeetingAICompanionSmartSummaryHelper* summaryHelper aiCtrl-GetMeetingAICompanionSmartSummaryHelper(); if (!summaryHelper) return;2.2 注册事件处理器理解状态机回调核心接口是IMeetingAICompanionSmartSummaryHelperEvent它的每个回调都对应一次状态迁移或一次请求-审批交互class SmartSummaryEventHandler : public IMeetingAICompanionSmartSummaryHelperEvent { public: // 会议不支持 Smart Summary如账号未启用该功能 void onSmartSummaryStateNotSupported() override { // Meeting doesnt support smart summary // Account may not have the feature enabled } // 功能已支持但尚未启用 void onSmartSummaryStateSupportedButDisabled( IMeetingEnableSmartSummaryHandler* handler) override { if (handler) { if (handler-IsForRequest()) { // 这是来自其他用户的启用请求需由主持人决定是否启用 } else { // 当前用户可直接启用 handler-EnableSmartSummary(); } } } // 已启用但未启动 void onSmartSummaryStateEnabledButNotStarted( IMeetingStartSmartSummaryHandler* handler) override { if (handler) { if (handler-IsForRequest()) { // 其他用户发来的启动请求 } else { // 可直接启动 handler-StartSmartSummary(); } } } // Smart Summary 已启动 void onSmartSummaryStateStarted( IMeetingStopSmartSummaryHandler* handler) override { // handler 为 nullptr 表示当前用户无权停止 if (handler) { // handler-StopSmartSummary(); } } // 启动失败 void onFailedToStartSmartSummary(bool bTimeout) override { if (bTimeout) { // 请求超时 } else { // 主持人/联席主持人拒绝了请求 } } // 其他用户请求启用 → 主持人收到该回调 void onSmartSummaryEnableRequestReceived( IMeetingApproveEnableSmartSummaryHandler* handler) override { if (handler) { unsigned int requesterId handler-GetSenderUserID(); // 批准请求 handler-ContinueApprove(); } } // 其他用户请求启动 → 主持人收到该回调 void onSmartSummaryStartRequestReceived( IMeetingApproveStartSmartSummaryHandler* handler) override { if (handler) { unsigned int requesterId handler-GetSenderUserID(); handler-Approve(); // or handler-Decline(); } } // 启用前的确认对话框回调如需要向用户展示提示 void onSmartSummaryEnableActionCallback( IMeetingEnableSmartSummaryActionHandler* handler) override { if (handler) { const zchar_t* title handler-GetTipTitle(); const zchar_t* tip handler-GetTipString(); // 展示带提示文案的 UI然后 handler-Confirm(); // or handler-Cancel(); } } }; // 注册处理器 SmartSummaryEventHandler summaryHandler; summaryHelper-SetEvent(summaryHandler);2.3 状态机驱动的请求/审批设计要点从上述回调可以提炼出该功能的协作模型直接操作当前用户通常是主持人拥有权限时通过EnableSmartSummary()/StartSmartSummary()直接驱动状态请求转发无权限的参与者发起请求后主持人端通过onSmartSummaryEnableRequestReceived/onSmartSummaryStartRequestReceived收到审批句柄用ContinueApprove()/Approve()/Decline()裁决UI 联动onSmartSummaryEnableActionCallback提供GetTipTitle()/GetTipString()用于渲染确认弹窗这与会议内其他需要合规确认的功能如本地录制体验一致。3. AI Query针对会议内容的智能问答AI Query 允许参会者就会议内容提问并获得 AI 生成的答案同时支持权限管理谁能提问、何时能问以及用户对回答质量的反馈。3.1 获取 HelperIMeetingAICompanionController* aiCtrl meetingService-GetMeetingAICompanionController(); if (!aiCtrl) return; IMeetingAICompanionQueryHelper* queryHelper aiCtrl-GetMeetingAICompanionQueryHelper(); if (!queryHelper) return;3.2 注册事件处理器IMeetingAICompanionQueryHelperEvent的回调同样遵循状态机结构未支持 → 已支持未启用 → 已启用未启动 → 已启动并额外包含问答数据与设置变更两类事件class AIQueryEventHandler : public IMeetingAICompanionQueryHelperEvent { public: void onQueryStateNotSupported() override { // 会议不支持 AI 查询 } // 已支持但被禁用 void onQueryStateSupportedButDisabled( IMeetingEnableQueryHandler* pHandler) override { if (pHandler !pHandler-IsForRequest()) { pHandler-EnableQuery(); } } // 已启用、可启动 void onQueryStateEnabledButNotStarted( IMeetingStartQueryHandler* pHandler) override { if (pHandler !pHandler-IsForRequest()) { pHandler-StartMeetingQuery(); } } // 查询已激活此时才能发送问题 void onQueryStateStarted(IMeetingSendQueryHandler* pHandler) override { if (pHandler) { // 获取建议问题列表 IListconst zchar_t** defaultQuestions pHandler-GetDefaultQueryQuestions(); if (defaultQuestions) { for (int i 0; i defaultQuestions-GetCount(); i) { const zchar_t* question defaultQuestions-GetItem(i); // 在 UI 中展示 } } // 检查能否发送问题 if (pHandler-CanSendQuery()) { // 发送问题 pHandler-SendQueryQuestion(LWhat were the main action items?); } else { // 需要先申请提问权限 pHandler-RequestSendQueryPrivilege(); } } } // 收到回答 void onReceiveQueryAnswer(IMeetingAICompanionQueryItem* pQueryItem) override { if (pQueryItem) { const zchar_t* queryId pQueryItem-GetQueryID(); const zchar_t* question pQueryItem-GetQustionContent(); const zchar_t* answer pQueryItem-GetAnswerContent(); time_t timestamp pQueryItem-GetTimeStamp(); MeetingAICompanionQueryRequestError errorCode pQueryItem-GetErrorCode(); if (errorCode MeetingAICompanionQueryRequestError_OK) { // 展示回答若用户评价回答质量可上报反馈 // pQueryItem-Feedback(MeetingAICompanionQueryFeedbackType_Good); // or // pQueryItem-Feedback(MeetingAICompanionQueryFeedbackType_Bad); } else { const zchar_t* errorMsg pQueryItem-GetErrorMsg(); // 处理错误 } } } // 查询设置变更谁能提问 void onQuerySettingChanged(MeetingAICompanionQuerySettingOptions eSetting) override { switch (eSetting) { case MeetingAICompanionQuerySettingOptions_WhenQueryStarted: // 所有人都可询问 AI 启动以来的讨论内容 break; case MeetingAICompanionQuerySettingOptions_WhenParticipantsJoin: // 可询问参会者加入以来的讨论内容 break; case MeetingAICompanionQuerySettingOptions_OnlyHost: // 仅主持人可提问 break; // ... 处理其他设置项 } } void onFailedToStartQuery(bool bTimeout) override { if (bTimeout) { // 请求超时 } else { // 请求被拒绝 } } // 提问权限发生变化 void onSendQueryPrivilegeChanged(bool canSendQuery) override { if (canSendQuery) { // 现在可以发送问题 } else { // 失去了发送问题的权限 } } void onFailedToRequestSendQuery(bool bTimeout) override { // 获取提问权限失败 } // 其他请求处理回调 void onReceiveRequestToEnableQuery( IMeetingApproveEnableQueryHandler* pHandler) override {} void onReceiveRequestToStartQuery( IMeetingApproveStartQueryHandler* pHandler) override {} void onQueryEnableActionCallback( IMeetingEnableQueryActionHandler* pHandler) override {} void onReceiveRequestToSendQuery( IMeetingApproveSendQueryHandler* pHandler) override {} }; // 注册处理器 AIQueryEventHandler queryHandler; queryHelper-SetEvent(queryHandler);3.3 修改查询设置仅主持人查询设置决定谁能提问、能问哪段内容仅在主持人有权修改时才能调用bool canChange false; SDKError err queryHelper-CanChangeQuerySetting(canChange); if (err SDKERR_SUCCESS canChange) { // 设置允许提问的粒度参与者加入后即可询问 queryHelper-ChangeQuerySettings( MeetingAICompanionQuerySettingOptions_WhenParticipantsJoin); // 读取当前设置 MeetingAICompanionQuerySettingOptions currentSetting queryHelper-GetSelectedQuerySetting(); }3.4 法律声明Legal NoticesAI 问答涉及数据处理SDK 提供了合规所需的提示文案接口应用在首次展示前应先查询可用性bool isAvailable false; queryHelper-IsAICompanionQueryLegalNoticeAvailable(isAvailable); if (isAvailable) { const zchar_t* prompt queryHelper-GetAICompanionQueryLegalNoticesPrompt(); const zchar_t* explained queryHelper-GetAICompanionQueryLegalNoticesExplained(); // 向用户展示法律声明 }4. 控制器级操作全局开关 AI 功能除了两个子 HelperIMeetingAICompanionController本身还提供跨功能的全局控制一次性打开/关闭所有 AI Companion 功能并处理参与者与主持人之间的开关请求流转。4.1 打开/关闭全部 AI 功能IMeetingAICompanionController* aiCtrl meetingService-GetMeetingAICompanionController(); // 关闭全部 AI 功能 if (aiCtrl-IsTurnoffAllAICompanionsSupported()) { if (aiCtrl-CanTurnOffAllAICompanions()) { bool deleteAssets false; // 是否删除已生成的会议资产 aiCtrl-TurnOffAllAICompanions(deleteAssets); } } // 打开全部 AI 功能 if (aiCtrl-IsTurnOnAllAICompanionsSupported()) { if (aiCtrl-CanTurnOnAllAICompanions()) { aiCtrl-TurnOnAllAICompanions(); } }注意TurnOffAllAICompanions(deleteAssets)的布尔参数false表示保留会议资产true表示一并删除需结合产品策略谨慎选择。4.2 非主持人请求开关非主持人无法直接操作开关只能向主持人发起请求// 请求关闭全部 AI 功能 if (aiCtrl-CanRequestTurnoffAllAICompanions()) { aiCtrl-RequestTurnoffAllAICompanions(); } // 请求打开全部 AI 功能 if (aiCtrl-CanRequestTurnOnAllAICompanions()) { aiCtrl-RequestTurnOnAllAICompanions(); }4.3 控制器事件处理器控制器级事件负责两类场景参与者抢在主持人入会前关闭了 AI 功能以及有人请求切换 AI 功能开关class AICompanionCtrlEventHandler : public IMeetingAICompanionCtrlEvent { public: // 参与者在主持人加入前关闭了 AI 功能 void onAICompanionFeatureTurnOffByParticipant( IAICompanionFeatureTurnOnAgainHandler* handler) override { if (handler) { IListAICompanionFeature* features handler-GetFeatureList(); IListAICompanionFeature* deletedAssets handler-GetAssetsDeletedFeatureList(); // 主持人可选择重新开启 handler-TurnOnAgain(); // 或同意保持关闭 // handler-AgreeTurnOff(); } } // 用户请求切换 AI 功能开关 void onAICompanionFeatureSwitchRequested( IAICompanionFeatureSwitchHandler* handler) override { if (handler) { unsigned int requesterId handler-GetRequestUserID(); bool isTurningOn handler-IsTurnOn(); bool deleteAssets false; handler-Agree(deleteAssets); // or handler-Decline(); } } // 我们发起的请求收到响应 void onAICompanionFeatureSwitchRequestResponse( bool bTimeout, bool bAgree, bool bTurnOn) override { if (!bTimeout bAgree) { // 请求被批准 } } // 以下功能无法被关闭 void onAICompanionFeatureCanNotBeTurnedOff( IListAICompanionFeature* features) override { if (features) { for (int i 0; i features-GetCount(); i) { AICompanionFeature feature features-GetItem(i); // 逐个处理不可关闭的功能 } } } // 主持人客户端不支持停止 Notes void onHostUnsupportedStopNotesRequest() override { } }; // 注册控制器事件处理器 AICompanionCtrlEventHandler ctrlHandler; aiCtrl-SetEvent(ctrlHandler);5. 完整示例Smart Summary 状态管理器把前面的碎片拼装成一个可复用的管理器类是落地的最佳实践——它将获取控制器 → 注册监听 → 状态驱动封装为单一职责模块class SmartSummaryManager { private: IMeetingAICompanionController* m_aiCtrl nullptr; IMeetingAICompanionSmartSummaryHelper* m_summaryHelper nullptr; class SummaryHandler : public IMeetingAICompanionSmartSummaryHelperEvent { public: SmartSummaryManager* m_manager nullptr; void onSmartSummaryStateNotSupported() override { m_manager-OnFeatureNotSupported(); } void onSmartSummaryStateSupportedButDisabled( IMeetingEnableSmartSummaryHandler* handler) override { if (handler !handler-IsForRequest()) { handler-EnableSmartSummary(); } } void onSmartSummaryStateEnabledButNotStarted( IMeetingStartSmartSummaryHandler* handler) override { if (handler !handler-IsForRequest()) { handler-StartSmartSummary(); } } void onSmartSummaryStateStarted( IMeetingStopSmartSummaryHandler* handler) override { m_manager-OnSummaryStarted(handler); } void onFailedToStartSmartSummary(bool bTimeout) override { m_manager-OnStartFailed(bTimeout); } void onSmartSummaryEnableRequestReceived( IMeetingApproveEnableSmartSummaryHandler* handler) override { if (handler) handler-ContinueApprove(); } void onSmartSummaryStartRequestReceived( IMeetingApproveStartSmartSummaryHandler* handler) override { if (handler) handler-Approve(); } void onSmartSummaryEnableActionCallback( IMeetingEnableSmartSummaryActionHandler* handler) override { if (handler) handler-Confirm(); } }; SummaryHandler m_handler; IMeetingStopSmartSummaryHandler* m_stopHandler nullptr; public: bool Initialize(IMeetingService* meetingService) { m_aiCtrl meetingService-GetMeetingAICompanionController(); if (!m_aiCtrl) return false; m_summaryHelper m_aiCtrl-GetMeetingAICompanionSmartSummaryHelper(); if (!m_summaryHelper) return false; m_handler.m_manager this; m_summaryHelper-SetEvent(m_handler); return true; } void OnFeatureNotSupported() { // 更新 UI功能不可用 } void OnSummaryStarted(IMeetingStopSmartSummaryHandler* handler) { m_stopHandler handler; // 更新 UI纪要录制中 } void OnStartFailed(bool timeout) { // 展示错误提示 } void StopSummary() { if (m_stopHandler) { m_stopHandler-StopSmartSummary(); m_stopHandler nullptr; } } };该管理器的设计值得借鉴三点初始化返回布尔值便于上层判断把停止句柄缓存起来供外部触发StopSummary()对 UI 按钮开放所有回调只做状态转发业务逻辑收敛到管理器方法。6. AI Companion 功能与资产一览功能描述生成的资产SMART_SUMMARYAI 会议纪要纪要文档Summary documentQUERY针对会议内容的 AI 问答转写记录TranscriptSMART_RECORDINGAI 增强录制带 AI 洞察的录制文件这三个功能常量在跨平台参考 ai-companion.md 中被定义为AICompanionFeature枚举值可用于GetFeatureList()等接口中对单个功能做判定。7. 集成过程中的注意事项先跑通基础链路再谈 AI 功能AI Companion 依赖认证 → 入会 →MEETING_STATUS_INMEETING完整链路建议先参考 authentication-pattern.md 与 sdk-architecture-pattern.md 打好地基Windows 消息循环不可或缺SDK 通过 Windows 消息泵分发回调缺少PeekMessage()循环会导致认证超时、回调全部不触发的假象详见 windows-message-loop.md头文件包含顺序windows.h必须最先、cstdint其次再按依赖顺序引入 SDK 头文件详见 windows/SKILL.md空指针检查是常态控制器与 Helper 在权限不足或状态不对时返回nullptr尤其是主持人专属能力如ChangeQuerySettings务必先查询Can*系列方法再调用与字幕转写的关系Smart Summary 与 captions-transcription.md 中的实时转写是独立功能前者产出纪要文档后者产出逐句转写可组合使用形成转写 纪要的完整会议知识沉淀。8. 相关文档导航Singleton Hierarchy单例层级导航图完整的控制器导航地图含废弃对照表SDK Architecture Pattern通用三步模式适用于全部 35 功能特性的实现公式Captions Transcription字幕与实时转写与 AI 纪要互补的实时转写能力AI Companion 跨平台参考Android / iOS / macOS / Windows 的控制器对照与使用边界说明Windows Meeting SDK 总览环境搭建、头文件顺序、快速排障入口【免费下载链接】knowledge-work-pluginsOpen source repository of plugins primarily intended for knowledge workers to use in Claude Cowork项目地址: https://gitcode.com/GitHub_Trending/kn/knowledge-work-plugins创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表