"""共享 Protocol 端口定义。

LLMProvider / VLMProvider / TelemetryRecorder 是跨子包共享接口，
被 core/agent/、core/evolution/、app/ 各模块引用。
adapters/ 提供具体实现。
"""

from __future__ import annotations

from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable

if TYPE_CHECKING:
    from pathlib import Path

    from core.types import LLMResponse


@runtime_checkable
class LLMProvider(Protocol):
    """LLM 文本调用端口。"""

    async def chat(
        self,
        messages: list[dict[str, Any]],
        *,
        session_id: str | None = None,
        parent_call_id: str | None = None,
    ) -> LLMResponse: ...


@runtime_checkable
class VLMProvider(Protocol):
    """VLM 图文调用端口。"""

    async def chat_with_images(
        self,
        messages: list[dict[str, Any]],
        images: list[str | Path],
        *,
        session_id: str | None = None,
        parent_call_id: str | None = None,
    ) -> LLMResponse: ...


@runtime_checkable
class TelemetryRecorder(Protocol):
    """LLM 调用遥测记录端口。"""

    async def record_llm_call(
        self,
        *,
        call_id: str,
        parent_call_id: str | None,
        session_id: str | None,
        model_name: str,
        provider: str,
        messages: str,
        response: str,
        thinking: str,
        prompt_tokens: int,
        completion_tokens: int,
        latency_ms: int,
        ttft_ms: float | None,
        max_inter_token_ms: float | None,
        cache_hit: bool,
        error: str | None,
    ) -> None: ...
