# coding=utf-8
"""
    @project: LZKB
    @Author：虎虎
    @file： model.py
    @date：2025/11/5 15:26
    @desc:
"""
from typing import Dict

from langchain_huggingface import HuggingFaceEmbeddings

from common.utils.logger import maxkb_logger
from models_provider.base_model_provider import LZKBBaseModel

max_retries = 3


class LocalEmbedding(LZKBBaseModel, HuggingFaceEmbeddings):
    @staticmethod
    def is_cache_model():
        return True

    @staticmethod
    def new_instance(model_type, model_name, model_credential: Dict[str, object], **model_kwargs):
        for attempt in range(max_retries):
            try:
                embedding = LocalEmbedding(model_name=model_name, cache_folder=model_credential.get('cache_folder'),
                                           model_kwargs={'device': model_credential.get('device')},
                                           encode_kwargs={'normalize_embeddings': True}
                                           )
                # 测试一下是否真的能用
                embedding.embed_query("test")
                return embedding
            except Exception as e:
                if 'meta tensor' in str(e).lower() and attempt < max_retries - 1:
                    maxkb_logger.warning(
                        f"Test failed with meta tensor error, retrying... (attempt {attempt + 1}/{max_retries})")
                    import time
                    time.sleep(1)
                    continue
                raise e
