hermes-agent/gateway/platforms/qqbot
WideLee 9feaeb632b feat(qqbot): add chunked upload with structured error types
The v2 'single POST /v2/{users|groups}/{id}/files' upload path is capped
at ~10 MB inline (base64 'file_data' or 'url'). For larger files the QQ
platform provides a three-step flow:

  1. POST /upload_prepare           → upload_id + pre-signed COS part URLs
  2. PUT each part to its COS URL → POST /upload_part_finish
  3. POST /files with {upload_id}   → file_info token

This commit adds a new gateway/platforms/qqbot/chunked_upload.py module
that implements the flow, wires it into QQAdapter._send_media for local
files (URL uploads keep the existing inline path), and introduces
structured exceptions so the caller can surface actionable error text:

- UploadDailyLimitExceededError  (biz_code 40093002, non-retryable)
- UploadFileTooLargeError        (file exceeds the platform limit)

Both carry file_name / file_size_human / limit_human so the model can
compose user-friendly replies instead of seeing opaque HTTP codes.

The part_finish 40093001 retryable-error loop respects the server-
provided retry_timeout (capped at 10 minutes locally) with a 1 s
polling interval. COS PUTs retry transient failures up to 2 times
with exponential backoff. complete_upload retries up to 2 times.

Covers files up to the platform's ~100 MB per-file limit; before this
the adapter silently rejected anything over ~10 MB.

19 new unit tests under TestChunkedUpload* cover the happy path,
prepare-response parsing, helper functions, part retries, COS PUT
retries, group vs c2c routing, and the structured-error mapping.

Co-authored-by: WideLee <limkuan24@gmail.com>
2026-05-07 07:36:30 -07:00
..
__init__.py feat(qqbot): add chunked upload with structured error types 2026-05-07 07:36:30 -07:00
adapter.py feat(qqbot): add chunked upload with structured error types 2026-05-07 07:36:30 -07:00
chunked_upload.py feat(qqbot): add chunked upload with structured error types 2026-05-07 07:36:30 -07:00
constants.py refactor(qqbot): split qqbot.py into package & add QR scan-to-configure onboard flow 2026-04-17 15:31:14 -07:00
crypto.py refactor(qqbot): split qqbot.py into package & add QR scan-to-configure onboard flow 2026-04-17 15:31:14 -07:00
onboard.py refactor(qqbot): migrate qr onboard flow to sync + consolidate into onboard.py 2026-04-22 05:50:21 -07:00
utils.py refactor(qqbot): split qqbot.py into package & add QR scan-to-configure onboard flow 2026-04-17 15:31:14 -07:00