From 9aee7d92fcf4c2d8f1fd63f03e63ca9202a4d2af Mon Sep 17 00:00:00 2001 From: "shuwen.wu" Date: Thu, 3 Sep 2026 20:10:34 +0800 Subject: [PATCH] fix: handle None content in get_cur_message_text Fixes #5649 - TypeError when assistant message has no text content (e.g. image-only or rejection responses) --- aider/coders/base_coder.py | 3 ++- tests/basic/test_coder.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index 56613782b02..c4830f2cf16 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -672,7 +672,8 @@ def get_read_only_files_content(self): def get_cur_message_text(self): text = "" for msg in self.cur_messages: - text += msg["content"] + "\n" + if msg["content"] is not None: + text += msg["content"] + "\n" return text def get_ident_mentions(self, text): diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index 9dd0ce37ad8..237e6f0902e 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -1433,6 +1433,43 @@ def test_architect_coder_auto_accept_false_rejected(self): # (because user rejected the changes) mock_editor.run.assert_not_called() + def test_get_cur_message_text_with_none_content(self): + """Test that get_cur_message_text handles None content gracefully. + + This can happen when assistant messages have no text content + (e.g., image-only responses or refusals). + """ + with GitTemporaryDirectory(): + io = InputOutput(yes=True) + coder = Coder.create(self.GPT35, "diff", io=io) + + # Test with mixed None and string content + coder.cur_messages = [ + {"role": "user", "content": "Hello"}, + {"role": "assistant", "content": None}, # Image-only or refusal + {"role": "user", "content": "Continue"}, + ] + + # Should not raise TypeError + result = coder.get_cur_message_text() + self.assertEqual(result, "Hello\nContinue\n") + + def test_get_cur_message_text_all_none(self): + """Test that get_cur_message_text handles all None content.""" + with GitTemporaryDirectory(): + io = InputOutput(yes=True) + coder = Coder.create(self.GPT35, "diff", io=io) + + # Test with all None content + coder.cur_messages = [ + {"role": "assistant", "content": None}, + {"role": "assistant", "content": None}, + ] + + # Should not raise and return empty string + result = coder.get_cur_message_text() + self.assertEqual(result, "") + if __name__ == "__main__": unittest.main()