From 385203d7fff6bfc4214441f0b3e6c410b0fb2a61 Mon Sep 17 00:00:00 2001 From: chottokun <29515187+chottokun@users.noreply.github.com> Date: Mon, 12 Oct 2026 00:24:52 +0000 Subject: [PATCH 1/2] refactor: clean up is_encoder_decoder config check in HFTextEncoder - Replace hasattr/truthy check with getattr(self.config, "is_encoder_decoder", False) in src/app/visual_bge/eva_clip/hf_model.py - Remove TODO comment inquiring about is_encoder_decoder attribute - Add unit tests in src/tests/test_hf_model.py covering True, False, and missing attribute cases Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- src/app/visual_bge/eva_clip/hf_model.py | 3 +- src/tests/test_hf_model.py | 78 +++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/tests/test_hf_model.py diff --git a/src/app/visual_bge/eva_clip/hf_model.py b/src/app/visual_bge/eva_clip/hf_model.py index c4b9fd8..51bcff3 100644 --- a/src/app/visual_bge/eva_clip/hf_model.py +++ b/src/app/visual_bge/eva_clip/hf_model.py @@ -101,8 +101,7 @@ def __init__( else: create_func, model_args = (AutoModel.from_pretrained, model_name_or_path) if pretrained else ( AutoModel.from_config, self.config) - # TODO: do all model configs have this attribute? PretrainedConfig does so yes?? - if hasattr(self.config, "is_encoder_decoder") and self.config.is_encoder_decoder: + if getattr(self.config, "is_encoder_decoder", False): self.transformer = create_func(model_args) self.transformer = self.transformer.encoder else: diff --git a/src/tests/test_hf_model.py b/src/tests/test_hf_model.py new file mode 100644 index 0000000..d588326 --- /dev/null +++ b/src/tests/test_hf_model.py @@ -0,0 +1,78 @@ +import unittest +from unittest.mock import MagicMock, patch +import torch +import torch.nn as nn + +from app.visual_bge.eva_clip.hf_model import HFTextEncoder + + +class TestHFTextEncoderConfig(unittest.TestCase): + @patch("app.visual_bge.eva_clip.hf_model.AutoTokenizer") + @patch("app.visual_bge.eva_clip.hf_model.AutoModel") + @patch("app.visual_bge.eva_clip.hf_model.AutoConfig") + def test_encoder_decoder_true(self, mock_autoconfig, mock_automodel, mock_autotokenizer): + mock_config = MagicMock() + mock_config.is_encoder_decoder = True + mock_config.model_type = "bert" + mock_config.hidden_size = 768 + mock_config.vocab_size = 30522 + mock_autoconfig.from_pretrained.return_value = mock_config + + mock_model_instance = MagicMock() + mock_encoder = MagicMock(spec=nn.Module) + mock_model_instance.encoder = mock_encoder + mock_automodel.from_pretrained.return_value = mock_model_instance + + encoder = HFTextEncoder( + model_name_or_path="dummy-model", + output_dim=768, + tokenizer_name="dummy-model", + ) + + mock_automodel.from_pretrained.assert_called_once_with("dummy-model") + self.assertEqual(encoder.transformer, mock_encoder) + + @patch("app.visual_bge.eva_clip.hf_model.AutoTokenizer") + @patch("app.visual_bge.eva_clip.hf_model.AutoModel") + @patch("app.visual_bge.eva_clip.hf_model.AutoConfig") + def test_encoder_decoder_false(self, mock_autoconfig, mock_automodel, mock_autotokenizer): + mock_config = MagicMock() + mock_config.is_encoder_decoder = False + mock_config.model_type = "bert" + mock_config.hidden_size = 768 + mock_config.vocab_size = 30522 + mock_autoconfig.from_pretrained.return_value = mock_config + + mock_model_instance = MagicMock(spec=nn.Module) + mock_automodel.from_pretrained.return_value = mock_model_instance + + encoder = HFTextEncoder( + model_name_or_path="dummy-model", + output_dim=768, + tokenizer_name="dummy-model", + ) + + mock_automodel.from_pretrained.assert_called_once_with("dummy-model", add_pooling_layer=False) + self.assertEqual(encoder.transformer, mock_model_instance) + + @patch("app.visual_bge.eva_clip.hf_model.AutoTokenizer") + @patch("app.visual_bge.eva_clip.hf_model.AutoModel") + @patch("app.visual_bge.eva_clip.hf_model.AutoConfig") + def test_encoder_decoder_missing_attribute(self, mock_autoconfig, mock_automodel, mock_autotokenizer): + mock_config = MagicMock(spec=["model_type", "hidden_size", "vocab_size"]) + mock_config.model_type = "bert" + mock_config.hidden_size = 768 + mock_config.vocab_size = 30522 + mock_autoconfig.from_pretrained.return_value = mock_config + + mock_model_instance = MagicMock(spec=nn.Module) + mock_automodel.from_pretrained.return_value = mock_model_instance + + encoder = HFTextEncoder( + model_name_or_path="dummy-model", + output_dim=768, + tokenizer_name="dummy-model", + ) + + mock_automodel.from_pretrained.assert_called_once_with("dummy-model", add_pooling_layer=False) + self.assertEqual(encoder.transformer, mock_model_instance) From 953495e5d4957682c54d2a4a60ff806db6b01e0a Mon Sep 17 00:00:00 2001 From: chottokun Date: Mon, 12 Oct 2026 11:27:31 +0900 Subject: [PATCH 2/2] fix(tests): remove unused import in test_hf_model.py --- src/tests/test_hf_model.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/tests/test_hf_model.py b/src/tests/test_hf_model.py index d588326..d2d82d7 100644 --- a/src/tests/test_hf_model.py +++ b/src/tests/test_hf_model.py @@ -1,6 +1,5 @@ import unittest from unittest.mock import MagicMock, patch -import torch import torch.nn as nn from app.visual_bge.eva_clip.hf_model import HFTextEncoder @@ -10,7 +9,9 @@ class TestHFTextEncoderConfig(unittest.TestCase): @patch("app.visual_bge.eva_clip.hf_model.AutoTokenizer") @patch("app.visual_bge.eva_clip.hf_model.AutoModel") @patch("app.visual_bge.eva_clip.hf_model.AutoConfig") - def test_encoder_decoder_true(self, mock_autoconfig, mock_automodel, mock_autotokenizer): + def test_encoder_decoder_true( + self, mock_autoconfig, mock_automodel, mock_autotokenizer + ): mock_config = MagicMock() mock_config.is_encoder_decoder = True mock_config.model_type = "bert" @@ -35,7 +36,9 @@ def test_encoder_decoder_true(self, mock_autoconfig, mock_automodel, mock_autoto @patch("app.visual_bge.eva_clip.hf_model.AutoTokenizer") @patch("app.visual_bge.eva_clip.hf_model.AutoModel") @patch("app.visual_bge.eva_clip.hf_model.AutoConfig") - def test_encoder_decoder_false(self, mock_autoconfig, mock_automodel, mock_autotokenizer): + def test_encoder_decoder_false( + self, mock_autoconfig, mock_automodel, mock_autotokenizer + ): mock_config = MagicMock() mock_config.is_encoder_decoder = False mock_config.model_type = "bert" @@ -52,13 +55,17 @@ def test_encoder_decoder_false(self, mock_autoconfig, mock_automodel, mock_autot tokenizer_name="dummy-model", ) - mock_automodel.from_pretrained.assert_called_once_with("dummy-model", add_pooling_layer=False) + mock_automodel.from_pretrained.assert_called_once_with( + "dummy-model", add_pooling_layer=False + ) self.assertEqual(encoder.transformer, mock_model_instance) @patch("app.visual_bge.eva_clip.hf_model.AutoTokenizer") @patch("app.visual_bge.eva_clip.hf_model.AutoModel") @patch("app.visual_bge.eva_clip.hf_model.AutoConfig") - def test_encoder_decoder_missing_attribute(self, mock_autoconfig, mock_automodel, mock_autotokenizer): + def test_encoder_decoder_missing_attribute( + self, mock_autoconfig, mock_automodel, mock_autotokenizer + ): mock_config = MagicMock(spec=["model_type", "hidden_size", "vocab_size"]) mock_config.model_type = "bert" mock_config.hidden_size = 768 @@ -74,5 +81,7 @@ def test_encoder_decoder_missing_attribute(self, mock_autoconfig, mock_automodel tokenizer_name="dummy-model", ) - mock_automodel.from_pretrained.assert_called_once_with("dummy-model", add_pooling_layer=False) + mock_automodel.from_pretrained.assert_called_once_with( + "dummy-model", add_pooling_layer=False + ) self.assertEqual(encoder.transformer, mock_model_instance)