@tencentcloud/sdk-mcp 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/index.js +5 -1
  2. package/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/resource/doc/chatuikit/faq/web_sdk/faq.md +117 -0
  5. package/resource/doc/chatuikit/flutter/client_api_Flutter.md +100 -179
  6. package/resource/doc/chatuikit/flutter/faq.md +17 -112
  7. package/resource/doc/chatuikit/flutter/integrate_tuikit_Flutter.md +272 -1281
  8. package/resource/doc/chatuikit/react/integration.md +516 -48
  9. package/resource/doc/chatuikit/react/workflow.md +254 -0
  10. package/resource/doc/chatuikit/uniapp-app/faq.md +0 -0
  11. package/resource/doc/chatuikit/uniapp-app/integration.md +619 -0
  12. package/resource/doc/chatuikit/uniapp-app/workflow.md +576 -0
  13. package/resource/doc/chatuikit/vue/integration.md +511 -129
  14. package/resource/doc/chatuikit/vue/workflow.md +395 -0
  15. package/resource/doc/roomkit/vue/features/call-user-to-room.md +256 -0
  16. package/resource/doc/roomkit/vue/features/device-detection.md +388 -0
  17. package/resource/doc/roomkit/vue/features/device-state.md +480 -0
  18. package/resource/doc/roomkit/vue/features/free-beauty-panel.md +238 -0
  19. package/resource/doc/roomkit/vue/features/room-chat.md +427 -0
  20. package/resource/doc/roomkit/vue/features/room-participant-state.md +407 -0
  21. package/resource/doc/roomkit/vue/features/room-state.md +291 -0
  22. package/resource/doc/roomkit/vue/features/room-view.md +338 -0
  23. package/resource/doc/roomkit/vue/features/schedule-room.md +349 -0
  24. package/resource/doc/roomkit/vue/features/screen-share.md +333 -0
  25. package/resource/doc/roomkit/vue/features/virtual-background.md +281 -0
  26. package/resource/doc/roomkit/vue/features/workflow.md +553 -0
  27. package/resource/doc/roomkit/vue/integration.md +479 -0
  28. package/resource/doc/roomkit/vue/workflow.md +487 -0
  29. package/resource/doc/tuicallkit/react/api.md +16 -0
  30. package/resource/doc/tuicallkit/vue/api.md +16 -0
  31. package/tools/chat/get-web-chat-integration.js +31 -14
  32. package/tools/chat/get-web-chat-integration.js.map +1 -1
  33. package/tools/definitions/get_web_chat_uikit_integration_def.js +18 -11
  34. package/tools/definitions/get_web_chat_uikit_integration_def.js.map +1 -1
  35. package/tools/definitions/get_web_live_uikit_integration_def.js +1 -1
  36. package/tools/definitions/get_web_room_feature_detail_def.js +95 -0
  37. package/tools/definitions/get_web_room_feature_detail_def.js.map +1 -0
  38. package/tools/definitions/get_web_room_uikit_integration_def.js +44 -0
  39. package/tools/definitions/get_web_room_uikit_integration_def.js.map +1 -0
  40. package/tools/definitions/present_framework_choice_def.js +1 -1
  41. package/tools/definitions/record_result_def.js +1 -1
  42. package/tools/definitions/record_result_def.js.map +1 -1
  43. package/tools/index.js +4 -4
  44. package/tools/index.js.map +1 -1
  45. package/tools/live/get-web-live-uikit-integration.js +1 -1
  46. package/tools/room/get-web-room-feature-detail.js +68 -0
  47. package/tools/room/get-web-room-feature-detail.js.map +1 -0
  48. package/tools/room/get-web-room-integration.js +43 -0
  49. package/tools/room/get-web-room-integration.js.map +1 -0
  50. package/utils/generate-structured-result.js +2 -2
  51. package/utils/generate-structured-result.js.map +1 -1
  52. package/utils/report-cls-client.js +1 -1
  53. package/utils/report-es-client.js +1 -1
  54. package/resource/doc/chatuikit/react/chat_window_integration.md +0 -83
  55. package/resource/doc/chatuikit/vue/chat_window_integration.md +0 -131
  56. package/resource/doc/roomkit/vue/states/device-state.md +0 -316
  57. package/resource/doc/roomkit/vue/states/login-state.md +0 -51
  58. package/resource/doc/roomkit/vue/states/room-list-state.md +0 -287
  59. package/resource/doc/roomkit/vue/states/room-participant-state.md +0 -307
  60. package/tools/chat/get-web-chat-window-integration.js +0 -28
  61. package/tools/chat/get-web-chat-window-integration.js.map +0 -1
  62. package/tools/definitions/get_web_chat_window_integration_def.js +0 -26
  63. package/tools/definitions/get_web_chat_window_integration_def.js.map +0 -1
  64. package/tools/definitions/get_web_room_state_detail_def.js +0 -19
  65. package/tools/definitions/get_web_room_state_detail_def.js.map +0 -1
  66. package/tools/room/get-web-room-state-detail.js +0 -31
  67. package/tools/room/get-web-room-state-detail.js.map +0 -1
@@ -0,0 +1,395 @@
1
+ # Vue Chat TUIKit 代码生成工作流指令
2
+
3
+ ## 📋 指令目的
4
+
5
+ 为 Agent 提供实现 Vue Chat TUIKit **核心功能的代码生成蓝图**,并指导 Agent **优先使用工具实时获取的最新文档内容**,专门针对 Vue3 Web 应用场景。
6
+
7
+ ---
8
+
9
+ ## 🛑 Agent 执行硬性限制 (Guardrails)
10
+
11
+ Agent 在生成代码时必须严格遵守以下指令:
12
+
13
+ ### 1. 文档驱动集成
14
+ - 必须严格按照工具返回结果中的 `llm_code_generation_instructions_md` 步骤执行
15
+ - **必须严格按照集成文档中的示例代码生成代码**,不得擅自修改代码结构和实现方式
16
+ - 代码生成时应完全遵循集成文档提供的最佳实践和示例,确保代码的正确性和可运行性
17
+
18
+ ### 2. CSS 样式强制规范 🔴
19
+ - **必须严格按照集成文档中的完整 CSS 样式代码生成**,包括:
20
+ - 官方 CSS 类名(如 `.chat-layout`、`.chat-content-panel` 等)
21
+ - 官方 CSS 变量定义(如 `--bg-color-operate`、`--stroke-color-primary` 等)
22
+ - 官方布局结构和样式属性
23
+ - 官方 `#app` 样式配置
24
+ - **禁止创建任何自定义样式类名或修改官方样式**
25
+ - 所有样式代码必须从集成文档中完整复制,不得修改
26
+
27
+ ### 3. 静默执行集成 🔥
28
+ **CRITICAL**: 所有代码编写完成后,必须在最后一步自动安装依赖并启动项目,无需等待用户确认。
29
+
30
+ **强制执行要求**:
31
+ - **禁止询问**: 不得询问用户是否需要启动项目
32
+ - **禁止等待**: 不得等待用户手动执行启动命令
33
+ - **必须自动**: 代码完成后必须立即执行集成步骤
34
+ - **批量执行**: 安装依赖和启动命令必须在同一个 execute_command 调用中完成
35
+
36
+ **标准执行命令**:
37
+ ```bash
38
+ cd [项目路径] && npm install && npm run dev
39
+ ```
40
+
41
+ ### 4. 零外部配置
42
+ - 禁止自动创建任何 `config.js` 或 `.env` 文件
43
+ - SDKAppID、UserID 和 UserSig 等关键凭证必须直接注入到代码变量中
44
+
45
+ ### 5. 自动获取鉴权凭据
46
+ - 必须调用 `get_usersig` 工具获取测试凭证,禁止要求用户手动输入
47
+ - UserID 生成应保持简洁(禁止拼接动态时间戳以防逻辑出错)
48
+
49
+ ### 6. 默认激活会话
50
+ - 集成逻辑必须包含 `setActiveConversation` 调用
51
+ - 默认打开 `C2Cadministrator` 会话
52
+
53
+ ### 7. Vue3 组合式 API
54
+ - 优先使用 `<script setup>` 语法
55
+ - 使用 Vue3 Composition API(ref、reactive、computed 等)
56
+ - 正确引入和使用 TUIKit 组件
57
+
58
+ ### 8. chat-only 模式功能限制(⚠️ 默认约束 + 用户主动要求时的例外)
59
+
60
+ **默认行为**:
61
+ 当用户选择 chat-only 模式时,Agent **默认排除**以下扩展功能:
62
+ - **默认不集成 Sidebar**(侧边栏)
63
+ - **默认不集成 ChatSetting**(聊天设置)
64
+ - **默认不集成会话内搜索功能**
65
+ - **默认不集成 ConversationList**(会话列表)
66
+ - **默认仅保留核心聊天组件**:`Chat`、`MessageList`、`ChatHeader`、`MessageInput`
67
+
68
+ **例外处理**:
69
+ 如果用户**明确要求**添加某些扩展功能(如"需要 ChatSetting"、"要集成搜索"等),Agent **应该允许并执行**:
70
+ - ✅ 在核心聊天组件基础上,额外集成用户明确要求的功能
71
+ - ✅ 只添加用户明确要求的功能,不擅自扩展其他功能
72
+ - ✅ 按照集成文档的规范正确集成所需组件
73
+
74
+ **判断标准**:
75
+ - 用户需求中包含明确的功能关键词(如"ChatSetting"、"搜索"、"设置"、"侧边栏"等)
76
+ - 用户明确说明需要某个扩展功能
77
+
78
+ ---
79
+
80
+ ## 📦 TUIKit 版本与依赖自动化
81
+
82
+ Agent 生成代码后,必须自动执行以下依赖链:
83
+
84
+ ### 1. 核心依赖版本推荐
85
+
86
+ ```json
87
+ {
88
+ "@tencentcloud/chat-uikit-vue3": "latest",
89
+ "@tencentcloud/call-uikit-vue": "latest"
90
+ }
91
+ ```
92
+
93
+ ### 2. 构建环境补丁 (Vite/esbuild)
94
+
95
+ 若检测到 Vite 项目,Agent 必须在 `package.json` 自动增加补丁配置以兼容 esbuild-wasm:
96
+
97
+ ```json
98
+ {
99
+ "overrides": {
100
+ "esbuild": "npm:esbuild-wasm@latest"
101
+ },
102
+ "resolutions": {
103
+ "esbuild": "npm:esbuild-wasm@latest"
104
+ }
105
+ }
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 📦 Vue3 TUIKit 组件说明
111
+
112
+ Agent 在生成代码时,必须了解并正确使用以下 Vue3 组件:
113
+
114
+ | 组件名称 | 说明 | 使用场景 |
115
+ |---------|------|---------|
116
+ | `ConversationList` | 会话列表组件 | full-featured 模式,显示所有会话 |
117
+ | `Chat` | 会话的容器组件 | 所有模式,聊天主容器 |
118
+ | `MessageList` | 会话的消息列表组件 | 显示聊天消息记录 |
119
+ | `ChatHeader` | 会话的头部信息组件 | 显示会话标题、成员信息等 |
120
+ | `MessageInput` | 输入框组件 | 消息输入和发送 |
121
+ | `ChatSetting` | 单聊和群聊的管理组件 | 会话设置、群管理等 |
122
+ | `Search` | 云端搜索组件 | 搜索消息、联系人等 |
123
+ | `ContactList` | 联系人组件 | full-featured 模式,通讯录功能 |
124
+
125
+ **重要提示**:
126
+ - Agent 必须严格按照集成文档中的组件名称和用法生成代码
127
+ - 不要自行创造或修改组件名称
128
+ - 组件的具体使用方式以工具返回的集成文档为准
129
+
130
+ ---
131
+
132
+ ## 🛠️ 集成模式分发 (Goals)
133
+
134
+ 根据用户的需求,Agent 必须选择对应的执行路径:
135
+
136
+ ### 1. 全量功能集成 (full-featured)
137
+
138
+ **目标**: 实现类似微信的完整 IM 应用
139
+
140
+ **核心组件**:
141
+ - `ConversationList` (会话列表)
142
+ - `Chat` (聊天容器)
143
+ - `ContactList` (通讯录)
144
+ - `Search` (云端搜索)
145
+
146
+ **执行参考**:
147
+ - 参考工具返回结果中实时获取的 `integration.md` 指令
148
+
149
+ **适用场景**:
150
+ - 构建独立的聊天应用
151
+ - 需要完整的会话管理、通讯录、群组管理功能
152
+ - 作为 Web 应用的核心功能模块
153
+
154
+ ---
155
+
156
+ ### 2. 仅集成聊天窗口 (chat-only)
157
+
158
+ **目标**: 适用于客服、问诊、详情页私聊等纯对话场景
159
+
160
+ **核心组件**:
161
+ - `Chat` (聊天容器)
162
+ - `MessageList` (消息列表)
163
+ - `ChatHeader` (聊天头部)
164
+ - `MessageInput` (输入框)
165
+
166
+ **执行参考**:
167
+ - 参考工具返回结果中实时获取的 `integration.md` 指令
168
+
169
+ **适用场景**:
170
+ - 客服咨询场景(用户点击咨询按钮进入聊天页面)
171
+ - 医疗在线问诊(患者与医生一对一沟通)
172
+ - 订单详情页私聊(买家与卖家沟通)
173
+ - 社交应用中的私信功能
174
+
175
+ **🔴 默认排除功能(Agent 必须遵守)**:
176
+
177
+ Agent 在生成 chat-only 模式代码时,**默认排除**以下功能和组件:
178
+
179
+ 1. **默认不集成 Sidebar(侧边栏)**
180
+ - 默认不生成任何侧边栏相关代码
181
+ - 默认不引入会话列表、通讯录等侧边栏组件
182
+ - 聊天窗口默认应该是独立的、无侧边栏的纯聊天界面
183
+
184
+ 2. **默认不集成 ChatSetting(聊天设置)**
185
+ - 默认不生成会话设置、群管理等功能
186
+ - 默认不在 ChatHeader 右侧添加设置按钮
187
+ - 默认不引入 ChatSetting 组件
188
+
189
+ 3. **默认不集成会话内搜索功能**
190
+ - 默认不添加消息搜索功能
191
+ - 默认不在聊天界面添加搜索入口
192
+ - 默认不引入 Search 组件
193
+
194
+ 4. **默认不集成会话列表(ConversationList)**
195
+ - chat-only 模式下,用户通过外部路由/参数指定会话 ID
196
+ - 默认不需要会话切换功能
197
+
198
+ ---
199
+
200
+ **⚠️ 用户主动要求时的例外处理**:
201
+
202
+ 如果用户在 chat-only 模式下**明确要求**添加某些扩展功能,Agent **应该允许并执行**:
203
+
204
+ **触发条件**(满足任一即可):
205
+ - 用户明确说明:"需要 ChatSetting"、"要集成聊天设置"、"添加会话设置功能"
206
+ - 用户明确说明:"需要 Search"、"要添加搜索功能"、"集成会话内搜索"
207
+ - 用户明确说明:"需要 Sidebar"、"要添加侧边栏"
208
+ - 用户明确提出其他扩展功能需求
209
+
210
+ **Agent 执行流程**:
211
+ 1. ✅ **确认用户需求**:识别到用户主动要求添加扩展功能
212
+ 2. ✅ **允许集成**:在 chat-only 模式基础上,额外集成用户要求的组件
213
+ 3. ✅ **保持克制**:只添加用户明确要求的功能,不擅自扩展其他功能
214
+ 4. ✅ **遵循文档**:按照集成文档的规范正确集成所需组件
215
+
216
+ ---
217
+
218
+ ## 📞 扩展功能:音视频通话 (TUICallKit)
219
+
220
+ 若需求中包含"通话"或"视频"功能,Agent 必须执行:
221
+
222
+ ### 组件挂载
223
+ - 使用 `Teleport` 将 TUICallKit 组件挂载到 body
224
+
225
+ ### 交互注入
226
+
227
+ **在 ChatHeader 组件的右侧插槽注入通话按钮**:
228
+ - 图标: 电话、摄像机等
229
+ - 组件使用方式参考集成文档
230
+
231
+ **单聊逻辑**:
232
+ - 通过 `TUICallKitServer.call` 发起通话
233
+ - UserID 自动取自当前激活会话
234
+
235
+ **群聊逻辑**:
236
+ - 需集成成员选择组件
237
+ - 引导用户选择群成员后再发起通话
238
+
239
+ ---
240
+
241
+ ## ✍️ Agent 代码生成示例指令 (Prompts)
242
+
243
+ 当 Agent 开始编写代码时,应遵循以下语义逻辑:
244
+
245
+ **全量功能集成 (full-featured)**:
246
+ > "按照 `full-featured` 模式,为我生成一个 Vue3 TUIKit 集成页面。请自动配置 `C2Cadministrator` 默认激活会话,并注入由 `get_usersig` 工具获取的凭据。禁止创建 config 文件。**🔴 重要:必须严格按照集成文档中的完整 CSS 样式代码生成,禁止任何自定义或修改。**"
247
+
248
+ **仅聊天窗口集成 (chat-only)**:
249
+ > "按照 `chat-only` 模式,为我生成一个 Vue3 TUIKit 聊天窗口。请自动配置 `C2Cadministrator` 默认激活会话,并注入由 `get_usersig` 工具获取的凭据。禁止创建 config 文件。**严格排除 Sidebar、ChatSetting、会话内搜索等功能,仅保留核心聊天组件。🔴 重要:必须严格按照集成文档中的完整 CSS 样式代码生成,禁止任何自定义样式。**"
250
+
251
+ ---
252
+
253
+ ## 📝 关键要点总结
254
+
255
+ | 类别 | 要求 |
256
+ |------|------|
257
+ | **框架版本** | 专门针对 Vue3 项目 |
258
+ | **文档优先** | 严格遵循工具返回的最新文档指令 |
259
+ | **🔴 CSS 样式** | **严格按照集成文档 CSS,禁止任何自定义或修改** |
260
+ | **静默集成** | 代码编写完成后自动安装依赖并启动开发服务器 |
261
+ | **凭证注入** | 自动调用 `get_usersig`,直接注入代码 |
262
+ | **默认会话** | 自动激活 `C2Cadministrator` 会话 |
263
+ | **依赖管理** | 自动检测并安装所需依赖包 |
264
+ | **构建工具** | Vite 项目需添加 esbuild-wasm 补丁配置 |
265
+ | **集成模式** | 支持 full-featured(全量)和 chat-only(仅聊天)两种模式 |
266
+ | **chat-only 限制** | ⚠️ 默认排除 Sidebar、ChatSetting、搜索功能;用户主动要求时允许集成 |
267
+
268
+ ---
269
+
270
+ ## 🎯 Agent 执行检查清单
271
+
272
+ 在完成代码生成后,Agent 必须确认以下所有项目:
273
+
274
+ ### 项目初始化
275
+ - [ ] 已创建 Vue3 项目或在现有项目中集成
276
+ - [ ] 已安装 `@tencentcloud/chat-uikit-vue3` 依赖
277
+ - [ ] 如果需要音视频通话,已安装 `@tencentcloud/call-uikit-vue`
278
+ - [ ] 如果是 Vite 项目,已添加 esbuild-wasm 补丁配置
279
+
280
+ ### 代码生成
281
+ - [ ] 已在 main.js 中正确注册 TUIKit 组件
282
+ - [ ] 已创建主聊天容器组件(ChatContainer.vue 或类似)
283
+ - [ ] 组件使用了 `<script setup>` 语法
284
+ - [ ] 🔴 **CSS 样式严格合规**:
285
+ - [ ] 已从集成文档中完整获取所有 CSS 样式代码
286
+ - [ ] 已使用集成文档中的官方类名
287
+ - [ ] 已完整复制集成文档中的 CSS 变量定义
288
+ - [ ] 已使用集成文档中的布局样式配置
289
+ - [ ] 禁止创建任何自定义样式类名
290
+ - [ ] 禁止修改集成文档中的任何样式属性
291
+ - [ ] 样式代码与集成文档完全一致
292
+
293
+ ### 凭证与登录
294
+ - [ ] 🔴 已调用 `get_usersig` 工具获取测试凭证
295
+ - [ ] 已将 SDKAppID、UserID、UserSig 直接注入到代码中
296
+ - [ ] 禁止创建 config.js 或 .env 文件
297
+ - [ ] 已实现 TUILogin.login() 登录逻辑
298
+
299
+ ### 会话激活
300
+ - [ ] 已添加默认激活 `C2Cadministrator` 会话的逻辑
301
+ - [ ] 使用了正确的 API(setActiveConversation)
302
+
303
+ ### 集成模式
304
+ - [ ] 已根据用户需求选择正确的集成模式(full-featured 或 chat-only)
305
+ - [ ] full-featured 模式:已集成 ConversationList、Chat、Contact 等组件
306
+ - [ ] chat-only 模式:已集成核心组件(Chat、MessageList、ChatHeader、MessageInput)
307
+ - [ ] chat-only 模式:已根据用户需求判断是否需要集成扩展功能
308
+ - [ ] 如果用户未主动要求,已确认不包含 Sidebar、ChatSetting、Search 等组件
309
+ - [ ] 如果用户主动要求(如"需要 ChatSetting"),已额外集成用户明确要求的功能
310
+
311
+ ### 音视频通话(可选)
312
+ - [ ] 如果需要通话功能,已使用 Teleport 挂载 TUICallKit
313
+ - [ ] 已在 ChatHeader 组件右侧插槽添加通话按钮
314
+ - [ ] 已实现单聊和群聊的通话逻辑
315
+
316
+ ### 最终检查
317
+ - [ ] 已调用 `record_result` 记录集成结果
318
+ - [ ] 已自动安装依赖(npm install)
319
+ - [ ] 已自动启动开发服务器(npm run dev)
320
+ - [ ] 项目可以正常运行,无报错
321
+
322
+ ---
323
+
324
+ ## 💡 常见问题处理
325
+
326
+ ### 1. Vite 构建错误
327
+
328
+ **问题现象**:Vite 项目运行时报 esbuild 相关错误
329
+
330
+ **原因**:某些依赖包与 esbuild 不兼容
331
+
332
+ **解决方案**:
333
+ 在 `package.json` 中添加补丁配置:
334
+ ```json
335
+ {
336
+ "overrides": {
337
+ "esbuild": "npm:esbuild-wasm@latest"
338
+ },
339
+ "resolutions": {
340
+ "esbuild": "npm:esbuild-wasm@latest"
341
+ }
342
+ }
343
+ ```
344
+
345
+ ### 2. chat-only 模式包含了不该有的功能
346
+
347
+ **问题现象**:chat-only 模式生成的代码包含了用户未要求的 Sidebar、ChatSetting 或会话内搜索功能
348
+
349
+ **原因**:Agent 未正确判断用户需求,擅自添加了扩展功能
350
+
351
+ **判断标准**:
352
+ - ✅ **应该添加**:用户明确说明"需要 ChatSetting"、"要集成搜索"、"添加设置功能"等
353
+ - ❌ **不应添加**:用户只说"搭建 chat-only 聊天窗口",未提及扩展功能
354
+
355
+ **解决方案**:重新生成代码,确保默认不包含扩展功能
356
+
357
+ ### 3. CSS 样式不符合集成文档
358
+
359
+ **问题现象**:生成的代码使用了自定义样式类名,或修改了官方样式
360
+
361
+ **原因**:Agent 未严格按照集成文档中的 CSS 样式生成代码
362
+
363
+ **解决方案**:
364
+ 1. 重新调用 `get_web_chat_uikit_integration` 获取最新集成文档
365
+ 2. 从集成文档中完整复制所有 CSS 样式代码
366
+ 3. 严格按照集成文档中的类名、变量名、样式属性使用
367
+ 4. 禁止任何形式的修改或自定义
368
+
369
+ ---
370
+
371
+ ## 🔗 相关工具参考
372
+
373
+ ### 必须使用的工具
374
+
375
+ #### `get_usersig` - 获取完整测试凭证(强制调用)
376
+ **用途**:生成完整的测试账号和鉴权凭证,包括:
377
+ - `SDKAppID`: 应用标识
378
+ - `userID`: 测试用户 ID
379
+ - `userSig`: 用户签名(有效期 7 天)
380
+
381
+ **调用时机**:在生成登录代码之前必须调用
382
+
383
+ **使用约束**:
384
+ - ✅ 必须使用工具返回的完整凭证
385
+ - ❌ 禁止让用户手动填写 SDKAppID 和 secretKey
386
+ - ❌ 禁止创建配置文件存储凭证
387
+
388
+ #### `record_result` - 记录集成结果
389
+ **用途**:记录集成过程和结果,用于统计和分析
390
+
391
+ ---
392
+
393
+ **适用框架**: Vue3
394
+ **TUIKit 版本**: @tencentcloud/chat-uikit-vue3 > 4.0.0
395
+ **构建工具**: Vite (推荐) / Webpack
@@ -0,0 +1,256 @@
1
+ 会中呼叫功能允许会议内的用户(邀请者)向房间外的其他用户(被邀请者)发送实时入会邀请。该功能基于 `Atomicx State Hooks` 实现,能够帮助开发者快速构建具有主动邀约能力的互动场景。
2
+
3
+ ## 适用场景
4
+ - **协同办公:**在进行远程会议时,若涉及跨部门决策,可一键呼叫外部专家快速入会,缩短沟通链路。
5
+
6
+ - **直播教学:**老师在授课过程中,若发现部分学生缺席,可直接邀请其加入课堂。
7
+
8
+ - **互联网医疗会诊:**首诊医生在病历分析过程中,通过呼叫功能邀请上级医生进入虚拟诊室进行多方会诊,或者医生呼叫在等候室的患者进行问诊。
9
+
10
+
11
+ ## 前提条件
12
+
13
+ 在接入功能前,请确保满足以下条件:
14
+ - **邀请者 (User A):**用户已经通过 `useLoginState` 完成登录鉴权,参考 [接入概览](https://write.woa.com/document/197379797539790848),并已作为一个房间的房主或成员在房间内,参考 [房间周期](https://write.woa.com/document/197379861957083136)。
15
+
16
+ - **被邀请者 (User B):**用户已经通过 `useLoginState` 完成登录鉴权,参考 [接入概览](https://write.woa.com/document/197379797539790848),以便接收信令事件。
17
+
18
+ - **环境依赖:**项目已正确安装并引入 `tuikit-atomicx-vue3`。
19
+
20
+
21
+ ## 实现会中呼叫功能
22
+
23
+ 实现会中呼叫的核心流程如下:
24
+
25
+ ![会中呼叫时序图](https://write-document-release-1258344699.cos.ap-guangzhou.tencentcos.cn/100027160512/82ba8603dee611f0a4f35254007c27c5.png)
26
+
27
+ 会中呼叫时序图
28
+
29
+
30
+ ### 步骤1:发起呼叫(邀请者)
31
+
32
+ 邀请者调用 [callUserToRoom](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#callUserToRoom) 接口发起邀请。请确保邀请者当前已在房间内(即 [currentRoom](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#currentRoom) 不为空),否则无法发起呼叫。
33
+ ``` typescript
34
+ import { useRoomState } from 'tuikit-atomicx-vue3/room';
35
+
36
+ const { currentRoom, callUserToRoom } = useRoomState();
37
+
38
+ const inviteUser = async () => {
39
+ // 会中呼叫必须关联一个已存在的 roomId,因此需先校验当前用户的进房状态
40
+ if (!currentRoom.value) {
41
+ console.warn('请先进入房间再发起邀请');
42
+ return;
43
+ }
44
+
45
+ try {
46
+ const resultMap = await callUserToRoom({
47
+ roomId: currentRoom.value.roomId, // 被邀请者将要加入的房间 ID
48
+ userIdList: ['user1', 'user2'], // 目标用户 ID 数组,支持单人或多人
49
+ timeout: 60, // 邀请有效时长(秒),超时后双方会触发 onCallTimeout
50
+ // extensionInfo 可用于传递业务自定义数据,例如邀请类型、附加消息等
51
+ extensionInfo: JSON.stringify({ type: 'emergency', priority: 'high' })
52
+ });
53
+
54
+ // resultMap 返回每个 userId 对应的状态,例如 Success、AlreadyInRoom (已在房) 或 AlreadyInCalling (通话中)
55
+ console.log('邀请发送完成,详情状态映射:', resultMap);
56
+ } catch (error) {
57
+ console.error('呼叫请求发送失败,请检查网络或登录状态:', error);
58
+ }
59
+ };
60
+ ```
61
+
62
+ ### 步骤2:监听呼叫事件(被邀请者)
63
+
64
+ 被邀请者需要监听 `onCallReceived` 事件。建议在例如 `App.vue`等长驻组件中实现,以确保无论用户在哪个页面都能响应。
65
+ ``` typescript
66
+ import { ref, onMounted, onUnmounted } from 'vue';
67
+ import { useRoomState, RoomEvent } from 'tuikit-atomicx-vue3/room';
68
+
69
+ const {
70
+ subscribeEvent,
71
+ unsubscribeEvent,
72
+ acceptCall,
73
+ rejectCall,
74
+ joinRoom,
75
+ currentRoom
76
+ } = useRoomState();
77
+
78
+ const showInviteDialog = ref(false); // 控制 UI 弹窗显隐
79
+ const currentCallInfo = ref(null); // 缓存收到的邀请上下文
80
+
81
+ const handleCallReceived = async ({ roomInfo, call, extensionInfo }) => {
82
+ // 冲突处理:如果用户当前已经在会议中,根据业务策略通常应直接拒绝新邀请,防止干扰
83
+ if (currentRoom.value?.roomId) {
84
+ await rejectCall({ roomId: roomInfo.roomId });
85
+ return;
86
+ }
87
+
88
+ // 记录邀请详情,用于在 UI 上展示邀请者名称或业务透传数据
89
+ currentCallInfo.value = { roomInfo, call };
90
+ showInviteDialog.value = true;
91
+ };
92
+
93
+ // 接受邀请逻辑
94
+ const onUserAccept = async () => {
95
+ if (!currentCallInfo.value) return;
96
+ const { roomId } = currentCallInfo.value.roomInfo;
97
+
98
+ try {
99
+ // 关键流程 A:响应信令。告知邀请者已接受,使其能更新 UI(例如显示“对方已接听”)
100
+ await acceptCall({ roomId });
101
+
102
+ // 关键流程 B:执行进房。只有调用 joinRoom 才会真正开启音视频推拉流链路
103
+ await joinRoom({ roomId });
104
+ } catch (error) {
105
+ console.error('接受呼叫后的进房操作失败:', error);
106
+ } finally {
107
+ closeDialog();
108
+ }
109
+ };
110
+
111
+ // 拒绝邀请逻辑
112
+ const onUserReject = async () => {
113
+ if (currentCallInfo.value) {
114
+ // 告知邀请者已拒绝,邀请者会收到 onCallRejected 事件
115
+ await rejectCall({ roomId: currentCallInfo.value.roomInfo.roomId });
116
+ }
117
+ closeDialog();
118
+ };
119
+
120
+ const closeDialog = () => {
121
+ showInviteDialog.value = false;
122
+ currentCallInfo.value = null;
123
+ };
124
+
125
+ // 事件全生命周期管理:确保在组件挂载时监听,销毁时移除,防止事件溢出
126
+ onMounted(() => {
127
+ subscribeEvent(RoomEvent.onCallReceived, handleCallReceived);
128
+
129
+ // 监听导致邀请结束的各种异常/同步事件,确保 UI 弹窗能及时闭合
130
+ subscribeEvent(RoomEvent.onCallCancelled, closeDialog); // 邀请者取消了呼叫
131
+ subscribeEvent(RoomEvent.onCallTimeout, closeDialog); // 呼叫超时未响应
132
+ subscribeEvent(RoomEvent.onCallHandledByOtherDevice, closeDialog); // 用户在其他设备已处理该呼叫
133
+ });
134
+
135
+ onUnmounted(() => {
136
+ // 移除所有监听器,避免在组件销毁后继续执行 handleCallReceived 导致内存泄漏或报错
137
+ unsubscribeEvent(RoomEvent.onCallReceived, handleCallReceived);
138
+ unsubscribeEvent(RoomEvent.onCallCancelled, closeDialog);
139
+ unsubscribeEvent(RoomEvent.onCallTimeout, closeDialog);
140
+ unsubscribeEvent(RoomEvent.onCallHandledByOtherDevice, closeDialog);
141
+ });
142
+ ```
143
+
144
+ ## 实践教程:提升呼叫接通率
145
+
146
+ 为了在业务中获得更高的呼叫接通率,除了基础功能的实现外,建议参考以下策略优化用户体验:
147
+
148
+ ### 1. 增强呼叫感知(避免用户遗漏)
149
+
150
+ 由于 Web 端特性,浏览器静音或页面处于后台运行状态可能导致用户遗漏呼叫。
151
+ - **视觉提醒**:利用 [Page Visibility API](https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API) 检测页面可见性状态。若页面处于后台,可通过循环修改 `document.title` 实现标题栏闪烁提示(例如:“【新邀请】UserA 邀请您入会...”),以吸引用户注意。
152
+
153
+ - **听觉提醒**:在 `onCallReceived` 事件触发时播放高优先级的提示铃声。注意:需遵循浏览器的 [自动播放策略](https://developer.mozilla.org/zh-CN/docs/Web/Media/Guides/Autoplay),大部分浏览器在缺乏用户交互(例如点击、触摸或按键)的情况下会限制音频自动播放。
154
+
155
+
156
+ ### 2. 丰富邀请上下文(提升接听意愿)
157
+
158
+ 缺乏明确意图的邀请容易被用户拒绝。建议充分利用 `extensionInfo` 字段传递关键业务信息,以提升用户的接听意愿。
159
+ - **传递业务上下文**:利用 `extensionInfo` 透传如 `reason`(例如:“项目紧急评审”)、`level`(例如:“P0故障排查”)等业务字段,告知用户呼叫的紧迫性和重要性。
160
+
161
+
162
+ ### 3. 多通道触达兜底(确保消息可达)
163
+
164
+ 受限于 Web 端机制,浏览器进程结束将无法接收实时信令。建议采取以下替代方案以确保触达:
165
+ - **浏览器系统通知**:引导用户授权 [Web Notification API](https://developer.mozilla.org/en-US/docs/Web/API/Notification)。只要浏览器进程未关闭(包括最小化或在后台标签页),即可触发操作系统级别的弹窗通知,有效提醒用户。
166
+
167
+ - **多通道触达**:建议结合业务后端逻辑,在检测到用户不在线或超时未响应时,通过**短信**、**邮件**或**企业微信**等外部渠道发送入会链接,实现全方位触达。
168
+
169
+
170
+ ### 4. 智能重试机制(解决“接受邀请后进房失败”)
171
+
172
+ 在弱网或其他不稳定环境下,用户点击接受邀请后调用 `joinRoom` 可能会出现偶发性失败。
173
+ - **自动重试**:建议在 `onUserAccept` 的异常处理逻辑(`catch`)中引入 2-3 次自动重试机制(推荐结合指数退避策略),以最大程度确保用户点击“接受”后能成功加入会议。
174
+
175
+
176
+ ## 开发注意事项
177
+ 1. **接受邀请不等于进房**
178
+
179
+
180
+ `acceptCall` 仅仅是信令层面的回复(告知对方已接听)。用户必须在调用 `acceptCall` 后紧接着手动调用 `await joinRoom({ roomId })` 才能真正进入音视频房间。
181
+
182
+ 2. **生命周期管理**
183
+
184
+
185
+ 请务必在组件销毁周期(`onUnmounted`)调用 `unsubscribeEvent`。如果不清理监听器,当用户切换页面时,旧页面的监听器会残留在内存中,导致一次邀请弹出多个窗口或逻辑重复执行。
186
+
187
+ 3. **超时设置**
188
+
189
+
190
+ 如果不设置 `timeout` 参数,在某些网络异常或程序崩溃情况下,邀请可能长期处于挂起状态,导致无法再次对该用户发起呼叫。建议设置为 30-60 秒。
191
+
192
+
193
+ ## 常见问题
194
+ 1. **如何在呼叫时带上自定义参数(如“来自XX的紧急会议”)?**
195
+
196
+
197
+ 使用 `callUserToRoom` 的 `extensionInfo` 参数传递 JSON 字符串。被邀请者可以在 `onCallReceived` 事件的 `extensionInfo` 字段中解析该字符串获取业务信息。
198
+
199
+ 2. **被邀请者如果不在线,上线后能收到邀请吗?**
200
+
201
+
202
+ 不可以。邀请事件是一个瞬时信令动作,SDK 目前不会补发离线期间收到的呼叫通知。
203
+
204
+ 3. **可以取消已发出的邀请吗?**
205
+
206
+
207
+ 可以。调用 `cancelCall({ roomId, userIdList })` 即可撤销。此时被邀请者会收到 `onCallCancelled` 事件,您需要监听此事件来关闭被邀请端的 UI 弹窗。
208
+
209
+ 4. **接受后进房失败怎么办?**
210
+
211
+
212
+ 检查是否已登录 `TUIRoomEngine`,重试 `joinRoom({ roomId })` 并捕获错误提示用户;必要时在 UI 上提供“重试”按钮。
213
+
214
+ 5. **对方忙线或已在其他房间如何提示?**
215
+
216
+
217
+ `callUserToRoom` 的返回值 `resultMap` 中若出现 `AlreadyInRoom` / `AlreadyInCalling`,应在邀请者 UI 提示“对方忙线/已在会中”,并决定是否稍后重试。
218
+
219
+ 6. **超时/取消后弹窗不关闭?**
220
+
221
+
222
+ 确保监听 `onCallTimeout`、`onCallCancelled`、`onCallHandledByOtherDevice`,统一在回调里关闭弹窗、清理当前邀请数据。
223
+
224
+ 7. **多设备同时响铃如何处理?**
225
+
226
+
227
+ 在任意设备接受/拒绝后,其余设备会收到 `onCallHandledByOtherDevice`,需关闭其他端弹窗避免重复处理。
228
+
229
+ 8. **extensionInfo 该怎么约定?**
230
+
231
+
232
+ 建议使用 JSON 字符串并约定字段(例如 `type`、`priority`、`from`),在 `handleCallReceived` 时解析后展示友好文案(例如“来自XX的紧急会议”)。
233
+
234
+
235
+ ## **示例项目**
236
+
237
+ 腾讯云在 GitHub 上提供了示例项目 [atomicx-vite-vue3-ts](https://github.com/Tencent-RTC/TUIRoomKit/tree/main/Web/example/atomicx-vite-vue3-ts) ,您可以参考以实现完整的 RoomKit 功能。
238
+
239
+ ## API 文档
240
+ <table>
241
+ <tr>
242
+ <td rowspan="1" colSpan="1" >**State/Component**</td>
243
+
244
+ <td rowspan="1" colSpan="1" >**功能描述**</td>
245
+
246
+ <td rowspan="1" colSpan="1" >**API 文档**</td>
247
+ </tr>
248
+
249
+ <tr>
250
+ <td rowspan="1" colSpan="1" >**useRoomState**</td>
251
+
252
+ <td rowspan="1" colSpan="1" >房间状态管理(创建、加入、预约等)</td>
253
+
254
+ <td rowspan="1" colSpan="1" >[API 文档](https://web.sdk.qcloud.com/trtc/live/web/doc/zh/index.html#module-RoomState)</td>
255
+ </tr>
256
+ </table>