Skip to content

feat: C2C 正在输入(InputNotify)心跳续发(每 5s),避免气泡中途消失#171

Merged
sliverp merged 2 commits intotencent-connect:feature/1.6.2from
xiaokui-bot:pr/typing-keepalive
Mar 17, 2026
Merged

feat: C2C 正在输入(InputNotify)心跳续发(每 5s),避免气泡中途消失#171
sliverp merged 2 commits intotencent-connect:feature/1.6.2from
xiaokui-bot:pr/typing-keepalive

Conversation

@xiaokui-bot
Copy link
Contributor

@xiaokui-bot xiaokui-bot commented Mar 14, 2026

🎯 解决的问题

当 AI 处理耗时较长时(如调用工具、生成语音等),QQ 客户端的正在输入气泡会中途消失——哪怕 AI 还在处理中,用户毫无感知,只能茫然等待。

触发气泡消失的场景:

  • 用户打开聊天窗口(气泡立即重置)
  • 系统切换前后台
  • inputSeconds 时长耗尽

原版仅在收到消息时调用一次 sendC2CInputNotify(inputSeconds=60),以上任何一种情况都会导致气泡提前消失。


✅ 解决方案

1. 心跳续发(5s 间隔)

收到 C2C 消息后,启动 setInterval 每 5 秒重发一次 sendC2CInputNotify。气泡最多消失 5 秒便会重新出现,对于处理耗时 10s~120s 的消息,用户始终能看到正在输入提示。

2. 延迟停止心跳(多段回复优化)

原版在 deliver 回调触发时立即 clearInterval。但 AI 可能分多次 deliver(block) 发消息,每次 deliver 之间若不续发,气泡依然会消失。

改为:在实际发送第一条消息前才停止 interval,确保多段回复之间也持续显示正在输入。

// 收到消息时启动心跳
if (event.type === "c2c") {
  typingIntervalId = setInterval(async () => {
    try {
      const token = await getAccessToken(account.appId, account.clientSecret);
      await sendC2CInputNotify(token, event.senderId, event.messageId, 60);
    } catch { /* 非关键,忽略 */ }
  }, 5000);
}

// 发送第一条消息前(而非 deliver 回调时)停止心跳
if (typingIntervalId) { clearInterval(typingIntervalId); typingIntervalId = null; }

🌟 用户体验改善

场景 修改前 修改后
AI 处理耗时 30s 气泡出现 → 用户打开窗口 → 气泡消失 → 茫然等待 气泡最多消失 5s 便恢复
分多段回复(工具调用后续文本) deliver 触发后气泡立即消失,后续段落发送前无提示 各段之间持续显示正在输入
语音生成(10-30s) 发完消息无任何提示 始终显示正在输入

🔧 技术细节

  • 仅对 event.type === 'c2c'(私聊)生效,群聊行为不变
  • 续发为纯异步操作,失败时静默忽略,不影响主消息处理
  • 每次 AI 实际开始发消息时清除 interval,不产生多余 API 调用

@xiaokui-bot xiaokui-bot force-pushed the pr/typing-keepalive branch from 4f2deac to 10a0732 Compare March 14, 2026 16:27
@xiaokui-bot xiaokui-bot changed the title feat: C2C 正在输入(InputNotify)心跳续发,防止长时处理时状态提前消失 feat: C2C 正在输入(InputNotify)心跳续发(每 5s),避免气泡中途消失 Mar 14, 2026
@xiaokui-bot xiaokui-bot force-pushed the pr/typing-keepalive branch 2 times, most recently from a433677 to 52ab44c Compare March 14, 2026 17:19
- 收到 C2C 消息后,启动 setInterval 每 5 秒重发一次 sendC2CInputNotify
- 在 deliver 回调触发时(即实际回复前)立即清除 interval
- 不影响群聊场景,仅对 event.type === 'c2c' 生效

## 用户体验改善

QQ 客户端在以下情况会重置正在输入气泡:
1. 用户打开聊天界面
2. 系统切换前后台

原版只发送一次 InputNotify(inputSeconds=60),在上述情况下气泡会立即消失,
用户看不到 AI 正在处理的反馈,体验等同于无提示等待。

通过每 5 秒续发,气泡最多消失 5 秒便会重新出现,
对于处理耗时较长的消息(调用工具、生成语音等),用户始终能感知 AI 正在工作。

## 技术细节

- 使用 setInterval 异步续发,不阻塞主处理流程
- 续发失败时静默忽略(非关键路径)
- 每次处理完成后通过 clearInterval 立即停止,不产生多余 API 调用
@xiaokui-bot xiaokui-bot force-pushed the pr/typing-keepalive branch from 52ab44c to e598936 Compare March 14, 2026 17:22
@sliverp
Copy link
Collaborator

sliverp commented Mar 14, 2026

关于提升用户体验,非常有必要的改动,将在测试后合入。

@sliverp
Copy link
Collaborator

sliverp commented Mar 14, 2026

方便的话,可以加一下开发者群

Clipboard_Screenshot_1773510152

@sliverp sliverp changed the base branch from main to feature/1.6.2 March 17, 2026 08:13
@sliverp sliverp merged commit 834dcb5 into tencent-connect:feature/1.6.2 Mar 17, 2026
@sliverp
Copy link
Collaborator

sliverp commented Mar 17, 2026

测试发现,正在输入后不会消失,一直保持正在输入状态

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants