Ethan
353e522614
fix: handle expired chat file attachments in replay and UI ( #24518 )
...
Closes CODAGT-216
## Problem
`dbpurge` deletes `chat_files` rows after the deployment's configured
retention window, but `chat_messages.content` can still contain
`file_id` references to those files. On replay, that left the Anthropic
provider with an empty file payload and a `400 image cannot be empty`
error. In the UI, the same missing file showed up as a broken image.
## Fix
- Backend: when replay hits a `file_id` whose bytes are gone, replace it
with a short text placeholder instead of emitting an empty file part. We
could also drop the missing attachment entirely, but that would silently
remove context from the replay and make the conversation harder for the
model to interpret. The placeholder keeps the request valid while still
telling the model that a file used to be there and is no longer
available.
- Frontend: classify chat image failures instead of treating every
broken image the same.
- `404` file fetches render `Image expired`, with a tooltip explaining
that chat attachments are deleted after the retention window set for the
deployment.
- Other remote failures render `Image failed to load`, with a tooltip
that surfaces server/network detail when available.
- Invalid inline image data still renders `Image failed to load` without
a probe.
2026-04-22 14:10:51 +10:00
..
2026-04-17 16:55:24 -06:00
2025-06-20 13:16:55 -06:00
2026-03-31 12:54:38 -04:00
2026-03-16 12:36:26 -05:00
2026-04-21 11:11:56 +01:00
2026-03-02 16:02:01 +01:00
2026-04-21 14:26:22 +01:00
2026-02-24 16:45:56 +00:00
2025-12-15 13:44:44 -09:00
2026-02-06 09:52:17 -07:00
2026-03-13 00:22:55 +11:00
2026-04-20 18:04:35 +10:00
2026-04-09 16:33:00 +02:00
2026-04-03 15:47:26 -05:00
2026-01-08 15:24:11 +04:00
2026-04-21 11:10:17 +00:00
2026-02-19 09:02:19 +00:00
2026-03-23 23:19:23 +02:00
2026-01-29 13:50:15 +01:00
2026-04-18 14:28:29 +03:00
2026-01-08 15:24:11 +04:00
2026-01-08 15:24:11 +04:00
2026-04-16 12:46:52 -04:00
2026-03-29 20:11:30 -04:00
2026-04-20 15:38:52 +02:00
2026-03-05 20:29:49 +00:00
2026-03-19 21:51:26 +00:00
2025-06-20 13:16:55 -06:00
2026-04-21 11:37:10 +10:00
2026-01-08 15:24:11 +04:00
2026-03-23 23:19:23 +02:00
2026-04-10 12:49:22 +03:00
2025-10-15 17:37:37 +00:00
2026-03-18 09:30:22 -05:00
2026-04-02 23:51:02 +02:00
2026-04-15 12:48:38 +00:00
2026-01-30 13:30:06 +01:00
2026-04-16 13:59:09 +02:00
2025-10-23 15:38:49 -05:00
2025-06-17 09:00:32 -08:00
2026-04-10 10:47:30 +01:00
2026-04-16 00:12:54 +10:00
2025-06-20 13:16:55 -06:00
2025-07-08 14:31:05 +00:00
2026-02-19 09:02:19 +00:00
2026-04-07 07:24:53 -07:00
2026-03-13 17:35:26 +00:00
2026-04-17 21:56:11 +10:00
2025-12-14 03:00:03 +00:00
2026-03-20 20:00:55 +00:00
2026-01-08 15:24:11 +04:00
2026-03-18 09:30:22 -05:00
2025-06-20 13:16:55 -06:00
2026-03-25 22:15:27 +00:00
2026-04-15 11:31:43 +02:00
2026-04-16 00:12:54 +10:00
2026-04-15 19:53:10 +01:00
2026-04-17 00:16:37 +10:00
2026-03-13 20:37:41 -07:00
2026-04-22 14:10:51 +10:00
2026-03-12 18:07:52 +02:00
2025-11-17 13:24:12 +00:00
2026-03-23 09:52:34 +00:00
2026-03-23 09:52:34 +00:00
2025-09-26 11:56:34 +02:00
2026-04-01 09:54:59 -04:00
2026-04-01 09:54:59 -04:00
2026-04-21 11:11:56 +01:00
2026-01-08 15:24:11 +04:00
2026-04-21 11:11:56 +01:00
2025-10-27 17:14:16 -06:00
2026-03-31 17:26:58 +01:00
2025-06-20 13:16:55 -06:00
2026-03-25 09:57:28 -04:00
2026-04-20 15:38:52 +02:00
2026-01-08 15:24:11 +04:00
2026-03-13 14:09:39 +00:00
2026-03-13 14:09:39 +00:00
2025-06-25 13:03:32 +00:00
2026-04-21 11:36:20 +10:00
2026-04-21 17:10:00 +01:00
2026-04-21 11:11:56 +01:00
2025-04-22 16:21:15 +00:00
2025-06-24 09:14:41 +01:00
2026-04-09 16:33:00 +02:00
2026-01-12 18:19:19 -08:00
2025-12-15 17:41:47 +00:00
2026-03-23 19:54:43 +00:00
2026-01-08 15:24:11 +04:00
2025-12-15 11:26:41 -06:00
2025-05-15 15:32:52 +01:00
2025-06-20 13:16:55 -06:00
2025-06-20 13:16:55 -06:00
2026-01-26 09:24:45 +00:00
2026-03-23 19:54:43 +00:00
2025-08-19 10:41:33 +02:00
2025-06-20 13:16:55 -06:00
2026-03-04 18:01:56 -08:00
2026-03-04 12:54:39 +02:00
2026-04-21 11:37:10 +10:00
2026-04-21 12:26:12 +02:00
2026-04-21 12:26:12 +02:00
2026-04-07 12:25:32 -06:00
2026-03-26 10:36:40 +00:00
2026-02-13 08:19:07 -06:00
2026-01-08 15:24:11 +04:00
2026-03-25 09:53:06 +00:00
2026-01-15 12:41:28 +03:00
2026-03-23 21:03:34 +00:00
2026-03-25 09:53:06 +00:00
2026-03-06 09:14:11 +00:00
2025-10-22 15:18:42 -05:00
2026-02-03 17:52:07 +00:00
2025-07-15 14:55:34 +10:00
2025-07-15 14:55:34 +10:00
2026-02-02 09:03:18 -06:00
2026-02-03 17:52:07 +00:00
2026-02-19 09:02:19 +00:00
2025-07-28 15:02:26 +01:00
2025-08-21 16:03:34 -04:00
2026-02-03 17:52:07 +00:00
2025-06-20 13:16:55 -06:00
2026-04-10 09:50:11 -05:00
2026-04-10 09:50:11 -05:00
2026-03-31 10:07:21 +01:00
2025-09-26 11:43:32 +02:00
2025-09-26 11:43:32 +02:00
2025-06-20 13:16:55 -06:00
2026-01-08 15:24:11 +04:00
2026-03-25 09:43:06 +02:00
2026-03-25 09:43:06 +02:00
2026-03-23 19:54:43 +00:00
2026-03-03 16:50:18 +00:00
2025-06-20 13:16:55 -06:00
2026-03-25 09:53:06 +00:00
2026-03-23 23:19:23 +02:00
2026-04-08 20:56:17 +01:00
2026-04-08 20:56:17 +01:00
2026-04-13 07:24:34 -06:00
2026-04-14 12:44:55 -06:00
2026-04-15 11:31:43 +02:00
2026-04-15 11:31:43 +02:00
2026-04-15 11:31:43 +02:00
2026-01-12 18:19:19 -08:00
2025-06-18 14:07:53 +00:00
2026-04-16 23:57:05 +10:00
2026-04-09 16:33:00 +02:00
2026-04-16 23:57:05 +10:00
2026-04-20 21:33:35 +10:00
2026-04-09 13:21:28 +05:00
2026-04-20 13:19:59 +03:00
2025-12-22 10:21:39 +04:00
2026-03-12 18:07:52 +02:00
2026-03-20 15:42:05 -05:00
2025-06-20 13:16:55 -06:00
2025-09-26 11:56:34 +02:00
2026-02-03 09:45:23 +00:00
2026-03-13 20:37:41 -07:00
2026-03-19 14:07:36 +00:00
2026-04-16 13:59:09 +02:00
2026-04-16 13:59:09 +02:00
2026-03-25 13:46:58 -05:00
2026-04-09 13:21:28 +05:00
2026-03-20 15:42:05 -05:00
2025-04-16 10:37:09 -06:00
2026-01-08 15:24:11 +04:00