[Bug] WeChat sendMessage can report success despite attachment failure; investigate Official Cloud image send
Client Type
Other — WeChat bot conversation on Official Cloud; inspected read-only with LobeHub CLI.
Operating System
macOS for CLI inspection. Recipient device OS was not verified.
Deployment Platform
Official Cloud (app.lobehub.com)
Version
Official Cloud build at 2026-09-09 03:54 UTC: unknown; please confirm the deployed revision. Inspection CLI: lh 0.0.48.
Browser
Not relevant to the outbound tool path; no browser-specific reproduction established.
What happened?
An agent called lobe-message.sendMessage with a text message and a JPEG attachment for the originating WeChat user. The tool returned:
Message sent to wechat:<redacted-recipient> (messageId: undefined)The assistant then told the user: “发出去了 ✅ 蓝天版的图片已经直接发到微信里了,你往上翻一下应该能看到”. However, the stored tool result contains no attachment-specific delivery evidence. We have confirmed a real tool invocation, but have NOT independently confirmed that the image reached the recipient, or established that this particular image failed.
Source inspection identifies a concrete error-propagation gap: attachment failures can be returned by the helper and ignored by the service, allowing the tool to report unconditional success. This makes the assistant's delivery claim unreliable.
Observed timeline and correlation information
All times below are on 2026-09-09, UTC (China time = UTC+8):
| Time | Stored evidence |
|---|---|
| 03:53:39.646 | External upload tool returned status: success from tmpfiles.org for the generated JPEG. This only establishes the external upload result. |
| 03:53:43.081 | Assistant message containing a lobe-message.sendMessage call was created. Payload included platform: wechat, text, and one image/jpeg image attachment named sky_blue.jpg, fetched from a tmpfiles.org /dl/…/sky_blue_1000.jpg URL. |
| 03:54:29.683 | Tool-result message persisted with Message sent ... (messageId: undefined), error: null, and toolExecutionTimeMs: 2157. |
| 03:54:34.365 | Assistant message asserting that the image had been sent was created. |
These are message creation timestamps, not precise network request timestamps.
- Account-scoped conversation: https://app.lobehub.com/agent/agt_gtgHHBOS8NvS/tpc_v3PNYCgRiv7F (sharing was not enabled for this report).
- Tool-result message ID:
msg_eazfA8GP5IlRl4GQJf - Tool call ID:
call_7e4f3e17d65c45a8b1835b19 - Operation ID from the invoking assistant message:
op_1788925172676_agt_gtgHHBOS8NvS_tpc_v3PNYCgRiv7F_O0L5HllA - Generated image was reported as 1000 × 750, 75,586 bytes by the sandbox.
- Raw recipient identifier, temporary image URL, signed source URLs and full conversation dump are intentionally omitted from this public report. Maintainers should be able to correlate the IDs above internally.
Read-only inspection used lh topic view tpc_v3PNYCgRiv7F -L 500 --json (61 messages) and lh message list. An actual lh bot message read attempt returned that readMessages is unsupported on WeChat, so CLI read-back cannot verify receipt. No message was resent during this investigation.
Source findings (local revision, not verified Official Cloud deployment)
Inspected clean repository revision: 0316ce6edb27df854f8026029638fe9724e01926.
sendWechatAttachmentscatches attachment download/upload/send failures and returns{ failures, undelivered }. Some cases can also fall back to a text link.WechatMessageService.sendMessagesends text first, awaits this helper, but discards its result and returns onlychannelIdandplatform.- The builtin tool runtime reports
success: trueand “Message sent” whenever the service resolves.
Therefore text success plus image failure can still be reported as overall success. messageId: undefined alone is not evidence of failure: the adapter simply does not supply this field.
How to reproduce it?
Observed user flow:
- Send an image to a connected WeChat bot and ask the agent to edit it.
- The agent obtains an externally hosted result image and invokes
lobe-message.sendMessagewith text plus an image attachment. - Observe the unconditional tool success message and the assistant's assertion of image delivery.
Suggested deterministic regression case for maintainers (not executed against production): make the attachment loader return no bytes, or make the media upload/send reject, while text sending succeeds. Verify whether the helper's failure result is lost at the service/tool boundary. No deterministic failure was injected in this investigation.
What it should be?
- Propagate per-attachment outcomes through the service and builtin tool result.
- Distinguish text accepted, image send accepted, link fallback, and attachment failed/undelivered.
- Do not claim full success when any requested attachment failed.
- Do not equate API acceptance with recipient receipt; represent unavailable receipt confirmation explicitly.
- Avoid rendering
messageId: undefinedas though it were a usable receipt.
Questions for Official Cloud maintainers
- Which revision handled this operation, and does it contain the same ignored-result path?
- Did the server fetch the actual JPEG bytes from the supplied URL? Please confirm HTTP status, content type and byte count, without publishing private URLs or payloads.
- Did WeChat CDN upload succeed? What did the image
sendmessagerequest return (ret,errcode,errmsgand any safe correlation ID)? Please distinguish this from the preceding text request. - Were any
source-unavailable,upload-failed,undeliveredor fallback outcomes logged and then discarded? - Can the available server/platform evidence establish image send acceptance or actual delivery? If receipt cannot be confirmed, please state that limit explicitly.
- Can a regression test cover partial failure and ensure the agent receives a truthful structured result?
Additional Information
Related: #19313 concerns self-hosted LAN attachment fetch/SSRF allowlisting and explicitly leaves this separate error-propagation issue unaddressed. This report concerns the success-reporting boundary and an Official Cloud incident; it does not attribute this cloud incident to the LAN/SSRF cause.
Searched existing open/closed issues for WeChat attachment, sendMessage, success and undelivered reports before filing.
Source: lobehub/lobehub