openclaw - 💡(How to fix) Fix QQ Bot: lane errors (rate limit, timeout) are silently swallowed with no user feedback

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

When a QQ Bot message triggers a lane error (e.g., API rate limit, response timeout, FailoverError), the error is silently caught and the user receives no feedback at all — the message simply disappears into the void.

Error Message

When a QQ Bot message triggers a lane error (e.g., API rate limit, response timeout, FailoverError), the error is silently caught and the user receives no feedback at all — the message simply disappears into the void. 3. Check gateway logs: lane task error: ... error="FailoverError: ⚠️ API rate limit reached. Please try again later." In the qqbot plugin's message dispatch handler (gateway-BdWwKDtj.js), the error is caught with an empty handler: The sendErrorMessage helper function exists in the plugin and works for other error paths (stream errors, media errors), but it is not called for lane-level failures like rate limits or timeouts. The catch block only clears the timeout — it never sends any feedback to the user. The bot should reply with a brief error message when the agent turn fails, so the user knows to retry. For example:

  • Generic error: ❌ 处理失败,请稍后重试 In the catch block of the dispatch Promise.race, add a sendErrorMessage() call with a user-friendly error description based on the error type. The sendErrorToTarget function is already available in scope.

Root Cause

In the qqbot plugin's message dispatch handler (gateway-BdWwKDtj.js), the error is caught with an empty handler:

try {
    await Promise.race([dispatchPromise, timeoutPromise]);
} catch {
    if (timeoutId) clearTimeout(timeoutId);
}

The sendErrorMessage helper function exists in the plugin and works for other error paths (stream errors, media errors), but it is not called for lane-level failures like rate limits or timeouts. The catch block only clears the timeout — it never sends any feedback to the user.

Fix Action

Fix / Workaround

In the qqbot plugin's message dispatch handler (gateway-BdWwKDtj.js), the error is caught with an empty handler:

try {
    await Promise.race([dispatchPromise, timeoutPromise]);
} catch {
    if (timeoutId) clearTimeout(timeoutId);
}

In the catch block of the dispatch Promise.race, add a sendErrorMessage() call with a user-friendly error description based on the error type. The sendErrorToTarget function is already available in scope.

Code Example

try {
    await Promise.race([dispatchPromise, timeoutPromise]);
} catch {
    if (timeoutId) clearTimeout(timeoutId);
}
RAW_BUFFERClick to expand / collapse

Summary

When a QQ Bot message triggers a lane error (e.g., API rate limit, response timeout, FailoverError), the error is silently caught and the user receives no feedback at all — the message simply disappears into the void.

Steps to Reproduce

  1. Send a message to the QQ Bot that triggers a model API rate limit or timeout
  2. Observe: no reply is sent to the user
  3. Check gateway logs: lane task error: ... error="FailoverError: ⚠️ API rate limit reached. Please try again later."

Root Cause

In the qqbot plugin's message dispatch handler (gateway-BdWwKDtj.js), the error is caught with an empty handler:

try {
    await Promise.race([dispatchPromise, timeoutPromise]);
} catch {
    if (timeoutId) clearTimeout(timeoutId);
}

The sendErrorMessage helper function exists in the plugin and works for other error paths (stream errors, media errors), but it is not called for lane-level failures like rate limits or timeouts. The catch block only clears the timeout — it never sends any feedback to the user.

Expected Behavior

The bot should reply with a brief error message when the agent turn fails, so the user knows to retry. For example:

  • Rate limit: ⚠️ 当前请求过多,请稍后再试
  • Timeout: ⏱️ 响应超时,请重新发送
  • Generic error: ❌ 处理失败,请稍后重试

This is especially important for QQ Bot because unlike Feishu/WebChat, there is no "thinking" indicator or verbose feedback — the user sees nothing until a reply arrives. A silent failure is indistinguishable from "the bot is offline."

Environment

  • OpenClaw: 2026.5.27
  • @openclaw/qqbot: 2026.5.27
  • Node: 24.15.0
  • OS: Linux 7.0.0-15-generic (x64)

Suggested Fix

In the catch block of the dispatch Promise.race, add a sendErrorMessage() call with a user-friendly error description based on the error type. The sendErrorToTarget function is already available in scope.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix QQ Bot: lane errors (rate limit, timeout) are silently swallowed with no user feedback