from abc import ABC, abstractmethod class LLMClient(ABC): @abstractmethod async def chat(self, model: str, messages: list[dict]) -> str: """Send a text chat request and return the response content string.""" @abstractmethod async def chat_vision(self, model: str, messages: list[dict]) -> str: """Send a multimodal (vision) chat request and return the response content string.""" @abstractmethod async def submit_finetune(self, jsonl_url: str, base_model: str, hyperparams: dict) -> str: """Submit a fine-tune job and return the job_id.""" @abstractmethod async def get_finetune_status(self, job_id: str) -> dict: """Return a dict with keys: job_id, status (raw SDK string), progress (int|None), error_message (str|None)."""