from abc import abstractmethod from typing import Tuple from deepeval.models.base_model import DeepEvalBaseLLM import asyncio class BaseLLM(DeepEvalBaseLLM): def __init__(self, model_name: str, base_url: str, api_key: str, max_concurrent: int): self.model_name = model_name self.base_url = base_url self.api_key = api_key self.max_concurrent = max_concurrent self.semaphore = asyncio.Semaphore(max_concurrent) @abstractmethod def load_model(self, *args, **kwargs): """Loads a model, that will be responsible for scoring. Returns: A model object """ pass @abstractmethod def test_model_connection(self) -> Tuple[bool, str]: """ Check if the specified model is properly connected and responsive. Returns: Tuple[bool, str]: - bool: True if the model is successfully connected, False otherwise. - str: Success message if connected, or detailed error information if connection failed. Example: >>> is_connected, message = test_model_connection(model) >>> print(f"Connected: {is_connected}, Message: {message}") Connected: True, Message: Model responded successfully in 200ms """ pass @abstractmethod def generate(self, prompt: str = None, messages: list = None, *args, **kwargs) -> str: """Runs the model to output LLM response. Returns: A string. """ pass @abstractmethod async def a_generate(self, prompt: str = None, messages: list = None, *args, **kwargs) -> str: """Runs the model to output LLM response. Returns: A string. """ async with self.semaphore: pass @abstractmethod def get_model_name(self, *args, **kwargs) -> str: pass