"""Agent 运行时端口。

会话服务只知道“提交一次调用并得到回复”，不依赖 LangChain 或具体模型。
真实环境使用 AgentKernel；未配置模型时使用明确失败的占位实现。
"""

from typing import Protocol

from zbt.core.errors import AppError
from zbt.harness.kernel import AgentInvocation
from zbt.harness.schemas import AgentReply

__all__ = [
    "AgentInvocation",
    "AgentReply",
    "AgentRuntime",
    "UnavailableAgentRuntime",
]


class AgentRuntime(Protocol):
    """所有 Agent 运行时必须实现的最小接口。"""

    def reply(self, invocation: AgentInvocation) -> AgentReply: ...


class UnavailableAgentRuntime:
    """没有配置模型密钥时使用，调用时返回清晰的可重试错误。"""

    def reply(self, invocation: AgentInvocation) -> AgentReply:
        del invocation
        raise AppError(
            "AGENT_NOT_CONFIGURED",
            "DeepSeek尚未配置，无法启动智能体",
            503,
            retryable=False,
        )
