from pydantic import BaseModel,Field
from typing import Literal
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate,ChatPromptTemplate,SystemMessagePromptTemplate,MessagesPlaceholder,HumanMessagePromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
import json
from ..utils.logger import get_logger


system1 = """
您是问题分析专家,根据用户问题,判断是否能从问题背景中获取到问题的答案,如果可以回答,请选择yes,不能则选择no,
以下是示例:
问题: 问题背景:无,问题:2024年10月15,北京市的设备在线率是多少?
是否能直接回答: no
----------------
问题: 问题背景:无,问题:自建CORS组网基准站观测墩的建造要求是什么?
是否需要调用工具: no
----------------
问题: 问题背景:陕西的设备在线率是90%,问题:陕西的设备在线率是多少,
分类: yes
----------------
问题: 问题背景:山西的设备在线率是90%,问题:陕西的设备在线率是多少,
分类: no
----------------
"""


class ExtendClassifyModel(BaseModel):
    """Route a user query to the most relevant datasource."""
    classify: Literal["yes", "no"] = Field(
        description="给定用户的问题,是否能从问题背景中获取到问题的答案。",
    )

class ExtendClassifyLLM:
    def __init__(self,base_llm):
        parser = PydanticOutputParser(pydantic_object=ExtendClassifyModel)
        prompt = PromptTemplate(
            template= system1 + "\n{format_instructions}\n{query}\n",
            input_variables=["query"],
            partial_variables={"format_instructions": parser.get_format_instructions()},
        )
        self.llm = prompt | base_llm | parser
        self.logger = get_logger(self.__class__.__name__)

    def invoke(self, question):
        try:
            result = self.llm.invoke({"query": question})
            self.logger.info(f"扩展分类结果: {result}")
            return result
        except Exception as e:
            self.logger.error(f"扩展分类结果失败: {e}", exc_info=True)
            return {'classify': 'no'}


def new_extend_classify_llm(llm):
    router = ExtendClassifyLLM(llm)
    return router