"""模型供应商适配层。

Agent Kernel 只依赖 ``ModelGateway`` 协议，不关心 API 地址、密钥或具体 SDK。
如果以后更换文本模型，只需要增加新的网关实现。
"""

from typing import Protocol

from langchain_core.language_models.chat_models import BaseChatModel
from langchain_openai import ChatOpenAI
from pydantic import SecretStr

from zbt.core.config import Settings


class ModelGateway(Protocol):
    """文本模型网关必须提供的最小接口。"""

    def chat_model(self, persona: str) -> BaseChatModel: ...


class DeepSeekModelGateway:
    """通过 OpenAI 兼容协议连接真实 DeepSeek。"""

    def __init__(self, settings: Settings) -> None:
        self._settings = settings

    def chat_model(self, persona: str) -> BaseChatModel:
        """创建 LangChain 能直接调用的聊天模型。

        ``persona`` 当前不改变模型参数，但保留它便于以后按人格选择不同模型。
        """

        del persona
        return ChatOpenAI(
            model=self._settings.deepseek_model,
            api_key=SecretStr(self._settings.deepseek_api_key),
            base_url=self._settings.deepseek_base_url,
            temperature=0,
            max_retries=2,
            timeout=60,
        )
