diff --git a/app/core/config.py b/app/core/config.py index 73c1e30..7321ee2 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -69,6 +69,14 @@ class Settings(BaseSettings): description="Premium Llama model identifier", ) OPENROUTER_TIMEOUT: int = Field(default=30, description="OpenRouter API timeout in seconds") + OPENROUTER_PROVIDER_ORDER: List[str] = Field( + default=["NovitaAI", "AkashML", "Inception"], + description="Preferred OpenRouter providers in priority order", + ) + OPENROUTER_ALLOW_PROVIDER_FALLBACKS: bool = Field( + default=True, + description="Allow OpenRouter to fallback outside preferred providers", + ) # WordPress Integration WORDPRESS_API_URL: str = Field( @@ -103,6 +111,14 @@ class Settings(BaseSettings): return [origin.strip() for origin in v.split(",") if origin.strip()] return v + @field_validator("OPENROUTER_PROVIDER_ORDER", mode="before") + @classmethod + def parse_provider_order(cls, v: Union[str, List[str]]) -> List[str]: + """Parse comma-separated OpenRouter provider list into array.""" + if isinstance(v, str): + return [provider.strip() for provider in v.split(",") if provider.strip()] + return v + # Global settings instance _settings: Union[Settings, None] = None diff --git a/app/services/ai_generation.py b/app/services/ai_generation.py index 5fa283b..c6a0324 100644 --- a/app/services/ai_generation.py +++ b/app/services/ai_generation.py @@ -325,7 +325,7 @@ async def call_openrouter_api( "X-Title": "IRT Bank Soal", } - payload = { + payload: dict[str, Any] = { "model": model, "messages": [ { @@ -336,6 +336,14 @@ async def call_openrouter_api( "max_tokens": 2000, "temperature": 0.7, } + provider_order = [ + provider for provider in settings.OPENROUTER_PROVIDER_ORDER if provider.strip() + ] + if provider_order: + payload["provider"] = { + "order": provider_order, + "allow_fallbacks": settings.OPENROUTER_ALLOW_PROVIDER_FALLBACKS, + } timeout = httpx.Timeout(settings.OPENROUTER_TIMEOUT)