fix: добавлен retry при edit для ошибки attachment.file.not.processed - #192
fix: добавлен retry при edit для ошибки attachment.file.not.processed#1922-3savage wants to merge 2 commits into
Conversation
- Добавлен маппинг ошибки 'attachment.file.not.processed' в 'attachment.not.ready' - Добавлена обработка ответов API с success=False при HTTP 200 - TODO: убрать когда MAX API начнёт возвращать корректный HTTP статус"
|
Всем привет! Хотелось бы побыстрее увидеть в проде, т.к. буквально сегодня с этим столкнулся и очень нужен фикс 😊 Либо можно написать разрабам апишки и показать им, что выдает 200 при ошибке. |
|
|
||
| if "attachment.file.not.processed" in error_message or "attachment.not.ready" in error_message: | ||
| if bot.dispatcher: | ||
| asyncio.create_task( |
There was a problem hiding this comment.
Висячие таски не надо делать, посмотри как в других местах реализован сбор
There was a problem hiding this comment.
Привет! Спасибо за ревью.
Я посмотрел, как это реализовано в других местах проекта, например, при обработке ошибок if not response.ok. Там используется точно такой же паттерн с asyncio.create_task.
if not response.ok:
raw = await response.json()
if bot.dispatcher:
asyncio.create_task(
bot.dispatcher.handle_raw_response(
UpdateType.RAW_API_RESPONSE, raw
)
)
raise MaxApiError(code=response.status, raw=raw)Мне удалить asyncio.create_task и сделать асинхронный вызов await bot.dispatcher.handle_raw_response(...), или я что-то упускаю?
There was a problem hiding this comment.
Pull request overview
Normalizes a malformed HTTP 200 attachment error so EditMessage can trigger its existing retry mechanism.
Changes:
- Detects unsuccessful attachment-processing responses.
- Maps them to
attachment.not.ready. - Raises
MaxApiErrorand dispatches the raw response.
Suppressed comments (1)
maxapi/connection/base.py:235
MaxApiError.rawnormally contains the complete API response (see the HTTP-error path above), but this replacement dropssuccess,message, and any future diagnostic fields. Preserve the original body while adding the normalized code so callers and logs can still inspect the actual server error.
raise MaxApiError(code=400, raw={"code": "attachment.not.ready"})
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if raw.get('success') is False: | ||
| error_message = raw.get('message', '') | ||
|
|
||
| if "attachment.file.not.processed" in error_message or "attachment.not.ready" in error_message: |
| if raw.get('success') is False: | ||
| error_message = raw.get('message', '') | ||
|
|
||
| if "attachment.file.not.processed" in error_message or "attachment.not.ready" in error_message: |
| ) | ||
| ) | ||
|
|
||
| raise MaxApiError(code=400, raw={"code": "attachment.not.ready"}) |
There was a problem hiding this comment.
Сработать могло на "attachment.file.not.processed", а ты в ошибку пишешь "attachment.not.ready". Лучше сохранять оригинальное сообщение - иначе это может ввести в заблуждение
2a6970e to
501e650
Compare
Проблема
При использовании
EditMessageс предварительно загруженным черезupload_mediaфайлом (AttachmentUpload), API MAX иногда возвращаетHTTP 200с телом:{ "success": false, "message": "Key: errors.process.attachment.file.not.processed" }Ожидаемое поведение — возврат
HTTP 400с кодом attachment.not.ready, который должен быть перехваченMaxApiErrorи отправлен в retry-механизм с задержкой 2 секунды.Однако фактически:
rawне содержит поле code сattachment.not.ready, только сообщениеKey: errors.process.attachment.file.not.processedВажно отметить, что данная проблема воспроизводится только в
EditMessage. ВSendMessageAPI корректно возвращаетHTTP 400с правильным кодом ошибки.Фикс
Добавлена обработка ошибки
attachment.file.not.processedвBaseConnection.request()Теперь:
Ответ с
success=FalseперехватываетсяСообщение
attachment.file.not.processedмаппится в кодattachment.not.readyВыбрасывается
MaxApiErrorс корректным кодомRetry-механизм в
EditMessage.fetch()перехватывает ошибку и делает повторную попытку через 2 секунды и т.д.TODO
Удалить костыль, когда MAX API начнёт возвращать корректный HTTP-статус для этой ошибки