diff --git a/.env.example b/.env.example index d093e006..2e797d51 100644 --- a/.env.example +++ b/.env.example @@ -37,6 +37,7 @@ UPSTREAM_API_KEY=your-upstream-api-key # BASE_URL=https://openrouter.ai/api/v1 # MODELS_PATH=models.json # SOURCE= +# EXCLUDED_MODEL_IDS="openrouter/auto,google/gemini-2.5-pro-exp-03-25,opengvlab/internvl3-78b,openrouter/sonoma-dusk-alpha,openrouter/sonoma-sky-alpha" # UI Configuration (for Next.js frontend) # These variables are prefixed with NEXT_PUBLIC_ to be accessible in the browser diff --git a/routstr/core/settings.py b/routstr/core/settings.py index cd59758c..52ac5f51 100644 --- a/routstr/core/settings.py +++ b/routstr/core/settings.py @@ -16,7 +16,7 @@ class Settings(BaseSettings): @classmethod def parse_env_var(cls, field_name: str, raw_value: str) -> Any: # type: ignore[override] - if field_name in {"cashu_mints", "cors_origins", "relays"}: + if field_name in {"cashu_mints", "cors_origins", "relays", "excluded_model_ids"}: v = str(raw_value).strip() if v == "": return [] @@ -55,6 +55,18 @@ class Settings(BaseSettings): # Minimum per-request charge in millisatoshis when model pricing is free/zero min_request_msat: int = Field(default=1, env="MIN_REQUEST_MSAT") + # Model filtering + excluded_model_ids: list[str] = Field( + default_factory=lambda: [ + "openrouter/auto", + "google/gemini-2.5-pro-exp-03-25", + "opengvlab/internvl3-78b", + "openrouter/sonoma-dusk-alpha", + "openrouter/sonoma-sky-alpha" + ], + env="EXCLUDED_MODEL_IDS" + ) + # Network cors_origins: list[str] = Field(default_factory=lambda: ["*"], env="CORS_ORIGINS") tor_proxy_url: str = Field(default="socks5://127.0.0.1:9050", env="TOR_PROXY_URL") @@ -305,4 +317,4 @@ class SettingsService: for k, v in data.items(): setattr(settings, k, v) cls._current = settings - return settings + return settings \ No newline at end of file diff --git a/routstr/payment/models.py b/routstr/payment/models.py index 849cf103..61225b31 100644 --- a/routstr/payment/models.py +++ b/routstr/payment/models.py @@ -87,13 +87,15 @@ def fetch_openrouter_models(source_filter: str | None = None) -> list[dict]: model["id"] = model_id[len(source_prefix) :] model_id = model["id"] + # Check if model should be excluded based on configuration + try: + excluded_ids = getattr(settings, "excluded_model_ids", []) + except Exception: + excluded_ids = [] + if ( "(free)" in model.get("name", "") - or model_id == "openrouter/auto" - or model_id == "google/gemini-2.5-pro-exp-03-25" - or model_id == "opengvlab/internvl3-78b" - or model_id == "openrouter/sonoma-dusk-alpha" - or model_id == "openrouter/sonoma-sky-alpha" + or model_id in excluded_ids ): continue @@ -128,13 +130,15 @@ async def async_fetch_openrouter_models(source_filter: str | None = None) -> lis model["id"] = model_id[len(source_prefix) :] model_id = model["id"] + # Check if model should be excluded based on configuration + try: + excluded_ids = getattr(settings, "excluded_model_ids", []) + except Exception: + excluded_ids = [] + if ( "(free)" in model.get("name", "") - or model_id == "openrouter/auto" - or model_id == "google/gemini-2.5-pro-exp-03-25" - or model_id == "opengvlab/internvl3-78b" - or model_id == "openrouter/sonoma-dusk-alpha" - or model_id == "openrouter/sonoma-sky-alpha" + or model_id in excluded_ids ): continue