From 9a519e3c5a50cbe3c32e16d4f438bd4ebbb2e4c0 Mon Sep 17 00:00:00 2001 From: ARIA Date: Fri, 21 Aug 2026 20:56:16 +0200 Subject: [PATCH] Omit null media in history frames (schema-conformant) history() wrote "media": null for streaming finals, but the frame schema says array. The app's HistoryMessage.media was non-nullable, so deserialization threw and every history page was silently dropped. Omit the key when media is absent instead. --- gateway-plugin/outbox.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/gateway-plugin/outbox.py b/gateway-plugin/outbox.py index 89a304d..5775484 100644 --- a/gateway-plugin/outbox.py +++ b/gateway-plugin/outbox.py @@ -207,21 +207,25 @@ class Outbox: role = payload.get("role") if role not in ("user", "assistant"): continue - final.append( - { - "cursor": int(r["cursor"]), - "message_id": payload.get("message_id"), - "role": role, - "text": payload.get("text", ""), - "reasoning": payload.get("reasoning"), - "model": payload.get("model"), - "tokens": payload.get("tokens"), - "runtime": payload.get("runtime"), - "ts": payload.get("ts"), - "media": payload.get("media"), - } - ) + msg = { + "cursor": int(r["cursor"]), + "message_id": payload.get("message_id"), + "role": role, + "text": payload.get("text", ""), + "reasoning": payload.get("reasoning"), + "model": payload.get("model"), + "tokens": payload.get("tokens"), + "runtime": payload.get("runtime"), + "ts": payload.get("ts"), + } + # Omit ``media`` when absent (schema: array, not null) — a + # ``"media": null`` would break the app's deserialization. + if payload.get("media"): + msg["media"] = payload["media"] + final.append(msg) elif ftype == "message.stop": + # Streaming finals carry no media (offers are separate + # frames); omit the key (schema: array, not null). final.append( { "cursor": int(r["cursor"]), @@ -233,7 +237,6 @@ class Outbox: "tokens": payload.get("tokens"), "runtime": payload.get("runtime"), "ts": payload.get("ts"), - "media": None, } ) # Deduplicate by message_id (keep the latest occurrence), keep order.