#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
@Project   : lq-agent-api
@File      : utils.py
@IDE       : VsCode
@Author    :
@Date      : 2025-12-04 10:13:12

=================================

📋 方法总览 (Method Overview)

🏗️ 核心模型管理:
├── ModelHandler()               # 模型处理器类
├── get_models()                 # 获取模型的全局函数
└── model_handler                # 全局模型处理器实例

🔍 模型获取方法:
├── _get_doubao_model()          # 获取豆包模型
├── _get_qwen_model()            # 获取通义千问模型
├── _get_deepseek_model()        # 获取DeepSeek模型
├── _get_gemini_model()          # 获取Gemini模型
├── _get_lq_qwen3_8b_model()     # 获取本地Qwen3-8B模型
├── _get_lq_qwen3_4b_model()     # 获取本地Qwen3-4B模型
└── _get_qwen_local_14b_model()  # 获取本地Qwen3-14B模型
'''

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

from foundation.base.config import config_handler
from foundation.logger.loggering import server_logger as logger


class ModelHandler:
    """
    AI模型处理器类，用于管理多种AI模型的创建和配置

    支持的模型类型：
    - doubao: 豆包模型
    - qwen: 通义千问模型
    - deepseek: DeepSeek模型
    - gemini: Gemini模型
    - lq_qwen3_8b: 本地Qwen3-8B模型
    - lq_qwen3_4b: 本地Qwen3-4B模型
    - qwen_local_14b: 本地Qwen3-14B模型
    """

    def __init__(self):
        """
        初始化模型处理器

        加载配置处理器，用于后续读取各种模型的配置信息
        """
        self.config = config_handler

    def get_models(self):
        """
        获取AI模型实例

        Returns:
            ChatOpenAI: 配置好的AI模型实例

        Note:
            根据配置文件中的MODEL_TYPE参数选择对应模型
            支持的模型类型：doubao, qwen, deepseek, lq_qwen3_8b, lq_qwen3_4b, qwen_local_14b
            默认返回豆包模型
        """
        model_type = self.config.get("model", "MODEL_TYPE")
        logger.info(f"正在初始化AI模型，模型类型: {model_type}")

        if model_type == "doubao":
            model = self._get_doubao_model()
        elif model_type == "gemini":
            model = self._get_gemini_model()
        elif model_type == "qwen":
            model = self._get_qwen_model()
        elif model_type == "deepseek":
            model = self._get_deepseek_model()
        elif model_type == "lq_qwen3_8b":
            model = self._get_lq_qwen3_8b_model()
        elif model_type == "lq_qwen3_4b":
            model = self._get_lq_qwen3_4b_model()
        elif model_type == "qwen_local_14b":
            model = self._get_qwen_local_14b_model()
        else:
            # 默认返回gemini
            logger.warning(f"未知的模型类型 '{model_type}'，使用默认gemini模型")
            model = self._get_gemini_model()

        logger.info(f"AI模型初始化完成: {model_type}")
        return model


    def _get_doubao_model(self):
        """
        获取豆包模型

        Returns:
            ChatOpenAI: 配置好的豆包模型实例
        """
        doubao_url = self.config.get("doubao", "DOUBAO_SERVER_URL")
        doubao_model_id = self.config.get("doubao", "DOUBAO_MODEL_ID")
        doubao_api_key = self.config.get("doubao", "DOUBAO_API_KEY")


        llm = ChatOpenAI(
            base_url=doubao_url,
            model=doubao_model_id,
            api_key=doubao_api_key,
            temperature=0.7,
            extra_body={
                "enable_thinking": False,
            })
        
        return llm

	
    def _get_qwen_model(self):
        """
        获取通义千问模型

        Returns:
            ChatOpenAI: 配置好的通义千问模型实例
        """
        qwen_url = self.config.get("qwen", "QWEN_SERVER_URL")
        qwen_model_id = self.config.get("qwen", "QWEN_MODEL_ID")
        qwen_api_key = self.config.get("qwen", "QWEN_API_KEY")

        llm = ChatOpenAI(
            base_url=qwen_url,
            model=qwen_model_id,
            api_key=qwen_api_key,
            temperature=0.7,
            extra_body={
                "enable_thinking": False,
            })

        return llm
	
    def _get_deepseek_model(self):
        """
        获取DeepSeek模型

        Returns:
            ChatOpenAI: 配置好的DeepSeek模型实例
        """
        deepseek_url = self.config.get("deepseek", "DEEPSEEK_SERVER_URL")
        deepseek_model_id = self.config.get("deepseek", "DEEPSEEK_MODEL_ID")
        deepseek_api_key = self.config.get("deepseek", "DEEPSEEK_API_KEY")

        llm = ChatOpenAI(
            base_url=deepseek_url,
            model=deepseek_model_id,
            api_key=deepseek_api_key,
            temperature=0.7,
            extra_body={
                "enable_thinking": False,
            })

        return llm

    def _get_gemini_model(self):
        """
        获取Gemini模型

        Returns:
            ChatOpenAI: 配置好的Gemini模型实例
        """
        gemini_url = self.config.get("gemini", "GEMINI_SERVER_URL")
        gemini_model_id = self.config.get("gemini", "GEMINI_MODEL_ID")
        gemini_api_key = self.config.get("gemini", "GEMINI_API_KEY")

        llm = ChatOpenAI(
            base_url=gemini_url,
            model=gemini_model_id,
            api_key=gemini_api_key,
            temperature=0.7,
            # extra_body={
            #     "enable_thinking": False,
            # }
            )

        return llm

    def _get_lq_qwen3_8b_model(self):
        """
        获取本地Qwen3-8B-Instruct模型

        Returns:
            ChatOpenAI: 配置好的本地Qwen3-8B模型实例
        """
        llm = ChatOpenAI(
            base_url="http://192.168.91.253:9002/v1",
            model="Qwen3-8B",
            api_key="dummy",  # 本地模型使用虚拟API key
            temperature=0.7,
        )

        return llm

    def _get_lq_qwen3_4b_model(self):
        """
        获取本地Qwen3-4B-Instruct模型

        Returns:
            ChatOpenAI: 配置好的本地Qwen3-4B模型实例
        """
        llm = ChatOpenAI(
            base_url="http://192.168.91.253:9001/v1",
            model="Qwen3-4B",
            api_key="dummy",  # 本地模型使用虚拟API key
            temperature=0.7,
        )

        return llm


# 创建全局实例
model_handler = ModelHandler()

def get_models():
    """
    获取模型的全局函数

    Returns:
        tuple: (llm, chat, embed) - LLM模型、聊天模型和嵌入模型实例
               注意：当前llm和chat使用相同模型实例，embed暂时返回None

    Note:
        这是一个便捷函数，直接使用全局model_handler实例获取模型
    """
    llm = model_handler.get_models()
    # 暂时返回相同的模型作为chat和embed
    return llm, llm, None