|
|
import os |
|
|
from typing import Optional |
|
|
|
|
|
from .base import ServerInterface |
|
|
from .protocol import ServerConfig |
|
|
from .providers import ( |
|
|
AsyncAzureOpenAIProvider, |
|
|
AsyncOpenAIProvider, |
|
|
AzureOpenAIProvider, |
|
|
DummyProvider, |
|
|
OpenAIProvider, |
|
|
) |
|
|
|
|
|
|
|
|
class ProviderFactory: |
|
|
"""Factory for creating judge instances based on configuration""" |
|
|
|
|
|
_provider_classes = {"openai": OpenAIProvider, "azure": AzureOpenAIProvider, "async_openai": AsyncOpenAIProvider, "async_azure": AsyncAzureOpenAIProvider, "dummy": DummyProvider} |
|
|
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
def register_additional_providers(cls): |
|
|
"""Register additional providers if available""" |
|
|
pass |
|
|
|
|
|
@classmethod |
|
|
def create_provider(cls, api_type: Optional[str] = None, config: Optional[ServerConfig] = None) -> ServerInterface: |
|
|
""" |
|
|
Create a judge instance based on API type |
|
|
|
|
|
Args: |
|
|
api_type: Type of API to use ('openai' or 'azure'). |
|
|
If None, will use API_TYPE environment variable |
|
|
config: Configuration for the judge |
|
|
|
|
|
Returns: |
|
|
ServerInterface instance |
|
|
""" |
|
|
if api_type is None: |
|
|
api_type = os.getenv("API_TYPE", "openai").lower() |
|
|
|
|
|
if api_type not in cls._provider_classes: |
|
|
raise ValueError(f"Unknown API type: {api_type}. Supported types: {list(cls._provider_classes.keys())}") |
|
|
|
|
|
judge_class = cls._provider_classes[api_type] |
|
|
return judge_class(config=config) |
|
|
|
|
|
@classmethod |
|
|
def register_provider(cls, api_type: str, judge_class: type): |
|
|
"""Register a new judge implementation""" |
|
|
if not issubclass(judge_class, ServerInterface): |
|
|
raise ValueError(f"{judge_class} must be a subclass of ServerInterface") |
|
|
cls._provider_classes[api_type] = judge_class |
|
|
|