Commit 5ba3b9fd3 for llama.cpp

commit 5ba3b9fd3da34e516450ea58c229949ea4cff3ce
Author: Xuan-Son Nguyen <son@huggingface.co>
Date:   Tue Oct 20 18:33:32 2026 +0200

    mtmd: fix gemma 4 ffn act (#30882)

diff --git a/conversion/gemma.py b/conversion/gemma.py
index 924d8e784..ab2d90610 100644
--- a/conversion/gemma.py
+++ b/conversion/gemma.py
@@ -999,6 +999,8 @@ class Gemma4VisionAudioModel(MmprojModel):
         assert self.hparams_vision is not None
         self.gguf_writer.add_clip_vision_projector_type(gguf.VisionProjectorType.GEMMA4V)
         self.gguf_writer.add_vision_attention_layernorm_eps(self.hparams_vision.get("layer_norm_eps", 1e-6))
+        assert self.hparams_vision.get("hidden_activation", "gelu_pytorch_tanh") == "gelu_pytorch_tanh"
+        self.gguf_writer.add_vision_use_gelu(True)

         # audio params
         if self.has_audio_encoder:
diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp
index 3a4dd682a..41aba280b 100644
--- a/tools/mtmd/clip.cpp
+++ b/tools/mtmd/clip.cpp
@@ -1735,6 +1735,8 @@ struct clip_model_loader {
                 case PROJECTOR_TYPE_GEMMA4UV:
                     {
                         hparams.rope_theta = 100.0f;
+                        hparams.ffn_op = FFN_GELU;
+                        log_ffn_op = "gelu";
                         hparams.n_merge = 3; // pooling_kernel_size
                         hparams.image_resize_algo = RESIZE_ALGO_BICUBIC;
                         get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false);