# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import AutoTokenizer, PretrainedConfig

from swift.template import TemplateType
from swift.utils import Processor
from ..constant import LLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
from .glm import ChatGLMLoader
from .qwen import QwenLoader

register_model(
    ModelMeta(
        LLMModelType.codefuse_qwen, [
            ModelGroup([
                Model('codefuse-ai/CodeFuse-QWen-14B', 'codefuse-ai/CodeFuse-QWen-14B'),
            ]),
        ],
        QwenLoader,
        template=TemplateType.codefuse,
        architectures=['QWenLMHeadModel'],
        model_arch=ModelArch.qwen,
        tags=['coding']))

register_model(
    ModelMeta(
        LLMModelType.codefuse_codegeex2,
        [
            ModelGroup([Model('codefuse-ai/CodeFuse-CodeGeeX2-6B', 'codefuse-ai/CodeFuse-CodeGeeX2-6B')], ),
        ],
        ChatGLMLoader,
        template=TemplateType.codefuse,
        architectures=['ChatGLMModel', 'ChatGLMForConditionalGeneration'],
        model_arch=ModelArch.chatglm,
        tags=['coding'],
        requires=['transformers<4.34'],
    ))


class CodeLlamaLoader(ModelLoader):

    def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
        return AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False, legacy=False)


register_model(
    ModelMeta(
        LLMModelType.codefuse_codellama,
        [
            ModelGroup(
                [
                    Model('codefuse-ai/CodeFuse-CodeLlama-34B', 'codefuse-ai/CodeFuse-CodeLlama-34B'),
                ],
                tags=['coding'],
            ),
        ],
        CodeLlamaLoader,
        template=TemplateType.codefuse_codellama,
        model_arch=ModelArch.llama,
        mcore_model_type='gpt',
        architectures=['LlamaForCausalLM'],
    ))
