From 1324add563ca0a90fd4dd8ba07e3a0dd9cf365c6 Mon Sep 17 00:00:00 2001 From: xxxigm Date: Tue, 30 Jun 2026 19:46:27 +0700 Subject: [PATCH] fix(image-gen): honor top-level image_gen.model for Nous/OpenRouter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hermes tools persists the selected model to image_gen.model, but the OpenRouter-compatible provider only read scoped image_gen..model and ignored the dispatch model kwarg — so Nous users always hit the default quality-first chain and fell back to Gemini. --- plugins/image_gen/openrouter/__init__.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/plugins/image_gen/openrouter/__init__.py b/plugins/image_gen/openrouter/__init__.py index d15aaabd53b..65bd001915f 100644 --- a/plugins/image_gen/openrouter/__init__.py +++ b/plugins/image_gen/openrouter/__init__.py @@ -46,8 +46,9 @@ logger = logging.getLogger(__name__) # image model first, then fall back to Gemini 3 Pro Image if the OpenAI model # is access-gated / unavailable / times out on this endpoint. # -# Explicit override (OPENROUTER_IMAGE_MODEL or image_gen..model): -# use exactly that model (no auto fallback), so power users keep full control. +# Explicit override (OPENROUTER_IMAGE_MODEL, image_gen..model, or +# image_gen.model from ``hermes tools``): use exactly that model (no auto +# fallback), so power users keep full control. DEFAULT_MODEL = "openai/gpt-5.4-image-2" _FALLBACK_MODEL = "google/gemini-3-pro-image" _DEFAULT_MODEL_CHAIN = (DEFAULT_MODEL, _FALLBACK_MODEL) @@ -243,16 +244,18 @@ class OpenRouterCompatImageProvider(ImageGenProvider): def get_setup_schema(self) -> Dict[str, Any]: return dict(self._setup_schema) - def _resolve_model(self) -> str: + def _resolve_model(self, explicit: Optional[str] = None) -> str: """Pick the image model: env override → config → :data:`DEFAULT_MODEL`.""" - return self._resolve_model_chain()[0] + return self._resolve_model_chain(explicit)[0] - def _resolve_model_chain(self) -> list[str]: + def _resolve_model_chain(self, explicit: Optional[str] = None) -> list[str]: """Ordered model attempts for this request. Explicit user/model config means "use this exact model", so no fallback. Without overrides we run the quality-first default chain. """ + if isinstance(explicit, str) and explicit.strip(): + return [explicit.strip()] env_override = os.environ.get(self._model_env_var, "").strip() if env_override: return [env_override] @@ -262,6 +265,9 @@ class OpenRouterCompatImageProvider(ImageGenProvider): value = scoped.get("model") if isinstance(value, str) and value.strip(): return [value.strip()] + top = cfg.get("model") + if isinstance(top, str) and top.strip(): + return [top.strip()] return _dedupe_models(list(_DEFAULT_MODEL_CHAIN)) def generate( @@ -297,7 +303,7 @@ class OpenRouterCompatImageProvider(ImageGenProvider): aspect_ratio=aspect_ratio, ) - model_chain = self._resolve_model_chain() + model_chain = self._resolve_model_chain(kwargs.get("model")) aspect = resolve_aspect_ratio(aspect_ratio) or_aspect = _ASPECT_RATIOS.get(aspect, "1:1")