diff --git a/specforge/utils.py b/specforge/utils.py index af4d627c8..7e6e3870e 100644 --- a/specforge/utils.py +++ b/specforge/utils.py @@ -405,6 +405,10 @@ def safe_conversations_generator(file_path): else: result["tools"] = [] + # preserve image - required in preprocess_vlm_conversations for vlm + if "image" in row: + result["image"] = row["image"] + yield result except Exception as e: diff --git a/tests/test_data/data/vlm_conversation.jsonl b/tests/test_data/data/vlm_conversation.jsonl new file mode 100644 index 000000000..585d244a5 --- /dev/null +++ b/tests/test_data/data/vlm_conversation.jsonl @@ -0,0 +1,2 @@ + +{"id": 1, "image": "/data/images/test.jpg", "conversations": [{"role": "user", "content": "Describe this image."}, {"role": "assistant", "content": "A cat."}]} diff --git a/tests/test_data/test_build_eagle3_dataset.py b/tests/test_data/test_build_eagle3_dataset.py index 0e2b85122..d35d7d74a 100644 --- a/tests/test_data/test_build_eagle3_dataset.py +++ b/tests/test_data/test_build_eagle3_dataset.py @@ -194,6 +194,26 @@ def test_build_eagle3_dataset_basic(self): assistant_indices = torch.where(loss_mask == 1)[0] self.assertTrue(len(assistant_indices) > 0, "No assistant tokens found") + def test_vlm_image_field_preserved(self): + """Regression test - preprocess_vlm_conversations relies on 'image' + field being preserved when the dataset is built with build_eagle3_dataset.""" + data_file = os.path.join( + os.path.dirname(__file__), "data", "vlm_conversation.jsonl" + ) + with tempfile.TemporaryDirectory() as tmp_dir: + dataset = Dataset.from_generator( + generator=safe_conversations_generator, + gen_kwargs={"file_path": data_file}, + cache_dir=tmp_dir, + keep_in_memory=True, + ) + self.assertIn( + "image", + dataset.column_names, + "image column missing from dataset — results in KeyError in preprocess_vlm_conversations", + ) + self.assertEqual(dataset[0]["image"], "/data/images/test.jpg") + if __name__ == "__main__": unittest.main(verbosity=2)