The webui stores display-only fields on messages (attachments, timestamp, _ts) for UI rendering. These leaked into the conversation_history passed to AIAgent.run_conversation(). Most providers ignore unknown fields, but Z.AI/GLM tries to deserialize 'attachments' as its native ChatAttachments type, causing HTTP 400 on every subsequent message after an image upload. Fix: _sanitize_messages_for_api() creates a clean copy with only API-standard keys (role, content, tool_calls, tool_call_id, name, refusal) before passing to run_conversation(). Applied to both the streaming path (streaming.py) and non-streaming path (routes.py). Closes #66 Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
53 KiB
53 KiB