fix: persist filter outlet() changes to structured message output (#27414)

When a filter's outlet() modified the structured assistant output in place, the change was shown immediately but lost after reload. outlet_filter_handler built its outlet payload with a shallow reference to the message's output list from messages_map, so the filter mutated the stored baseline itself and the subsequent output comparison compared the object against itself, never detecting a change and never persisting it. The same aliasing corrupted originalContent for messages whose text lives only in output. Deepcopy the output when building the outlet payload so messages_map stays a pristine pre-filter baseline and the existing change detection persists outlet-modified output through the existing upsert path. Fixes #27017.
This commit is contained in:
Classic298
2026-07-27 00:55:21 +02:00
committed by GitHub
parent 69f8be4cf9
commit 381149ea5e

View File

@@ -3424,7 +3424,8 @@ async def outlet_filter_handler(ctx):
'content': m.get('content') or get_output_text(m.get('output')),
'info': m.get('info'),
'timestamp': m.get('timestamp'),
**({'output': m['output']} if m.get('output') else {}),
# Deepcopy so in-place filter mutations do not alias messages_map's baseline
**({'output': copy.deepcopy(m['output'])} if m.get('output') else {}),
**({'usage': m['usage']} if m.get('usage') else {}),
**({'sources': m['sources']} if m.get('sources') else {}),
}