@ModelBase.register("DeepseekV2ForCausalLM")
@ModelBase.register("DeepseekV3ForCausalLM")
+@ModelBase.register("KimiVLForConditionalGeneration")
class DeepseekV2Model(TextModel):
model_arch = gguf.MODEL_ARCH.DEEPSEEK2
_experts: list[dict[str, Tensor]] | None = None
def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]:
+ # skip vision tensors and remove "language_model." for Kimi-VL
+ if "vision_tower" in name or "multi_modal_projector" in name:
+ return []
+
+ if name.startswith("language_model."):
+ name = name.replace("language_model.", "")
+
# rename e_score_correction_bias tensors
if name.endswith("e_score_correction_bias"):
name = name.replace("e_score_correction_bias", "e_score_correction.bias")
with open(config_file, encoding = 'utf-8') as f:
config = json.load(f)
for typ in self.special_token_types:
- self._set_special_token(typ, config.get(f'{typ}_token_id'))
+ token_id = config.get(f'{typ}_token_id')
+ # If not found at root, check in text_config (for multimodal models like Kimi-VL)
+ if token_id is None and 'text_config' in config:
+ token_id = config['text_config'].get(f'{typ}_token_id')
+ self._set_special_token(typ, token_id)
return True