refactor(tools): image gen — merge provider exception branches, single Krea probe try; compact image_source module doc

This commit is contained in:
Teknium
2026-09-02 22:25:42 -07:00
parent 4b691d2ca8
commit d14c61a4e2
2 changed files with 15 additions and 27 deletions
+9 -18
View File
@@ -29,11 +29,8 @@ def _load_fal_client() -> Any:
from tools.debug_helpers import DebugSession
from tools.fal_common import (
_ManagedFalSyncClient,
_extract_http_status,
_normalize_fal_queue_url_format, # noqa: F401 — re-exported for tests
)
from tools.fal_common import ( # noqa: F401 — _normalize_fal_queue_url_format re-exported for tests
_ManagedFalSyncClient, _extract_http_status, _normalize_fal_queue_url_format)
from tools.image_generation_catalog import ( # noqa: F401 — re-exported (plugins/tests/tools_config)
DEFAULT_ASPECT_RATIO, DEFAULT_MODEL, FAL_MODELS, UPSCALER_CREATIVITY, UPSCALER_DEFAULT_PROMPT,
UPSCALER_FACTOR, UPSCALER_GUIDANCE_SCALE, UPSCALER_MODEL, UPSCALER_NEGATIVE_PROMPT,
@@ -626,10 +623,11 @@ def _dispatch_to_plugin_provider(
try:
_add_provider_kwargs(kwargs, image_url, reference_image_urls, upscale, model=_read_configured_image_model())
result = provider.generate(**kwargs)
except TypeError as exc:
# generate() predating image_url support (third-party plugin not yet updated):
# text-to-image keeps working; surface a clear note when an edit was requested.
if "image_url" in kwargs or "reference_image_urls" in kwargs:
except Exception as exc:
# A TypeError from generate() predating image_url support (third-party plugin not yet
# updated): text-to-image keeps working; surface a clear note when an edit was requested.
is_type_error = isinstance(exc, TypeError)
if is_type_error and ("image_url" in kwargs or "reference_image_urls" in kwargs):
logger.warning("image_gen provider '%s' rejected image-to-image kwargs "
"(signature too narrow): %s", pname, exc)
return _provider_error(
@@ -637,10 +635,7 @@ def _dispatch_to_plugin_provider(
f"signature is out of date with the image_generate schema). Omit image_url for "
f"text-to-image, or pick a backend that supports editing via `hermes tools` → "
f"Image Generation.", "modality_unsupported")
logger.warning("Image gen provider '%s' raised TypeError: %s", pname, exc)
return _provider_error(f"Provider '{pname}' error: {exc}", "provider_exception")
except Exception as exc:
logger.warning("Image gen provider '%s' raised: %s", pname, exc)
logger.warning("Image gen provider '%s' raised%s: %s", pname, " TypeError" if is_type_error else "", exc)
return _provider_error(f"Provider '{pname}' error: {exc}", "provider_exception")
return _provider_result(result, "Provider returned a non-dict result")
@@ -674,13 +669,9 @@ def _maybe_route_managed_krea(
from plugins.image_gen.krea import _resolve_managed_krea_gateway
if _resolve_managed_krea_gateway() is None:
return None
except Exception as exc: # noqa: BLE001
logger.debug("Managed Krea routing probe failed: %s", exc)
return None
try:
provider = _get_plugin_provider("krea")
except Exception as exc: # noqa: BLE001
logger.debug("Managed Krea routing: provider unavailable: %s", exc)
logger.debug("Managed Krea routing unavailable: %s", exc)
return None
if provider is None:
return None
+6 -9
View File
@@ -1,13 +1,10 @@
"""Single resolver for every media source -> bytes + mime.
"""Single resolver for every media source (data:/http(s)/file/local/container) -> bytes + mime.
All source handling (data:/http(s)/file/local/container) funnels through
:func:`resolve_image_source` so size and magic-byte checks are enforced exactly once.
Images are the default; callers whose argument takes video opt in via ``permitted=("video",)``.
Security (terminal-backend confinement, GHSA-gpxw-6wxv-w3qq): under a non-local backend
vision is confined like the file tools: local -> read any host path; non-local -> host-read
only inside a media cache (bind-mounted into the sandbox), anything else is exec-read
*inside the sandbox*, so an injected ``vision_analyze('/etc/passwd')`` never reads the host.
Everything funnels through :func:`resolve_image_source` so size and magic-byte checks run
exactly once. Images are the default; video callers opt in via ``permitted=("video",)``.
Security (GHSA-gpxw-6wxv-w3qq): under a non-local backend vision is confined like the file
tools — host-read only inside a media cache (bind-mounted into the sandbox), anything else is
exec-read *inside the sandbox*, so ``vision_analyze('/etc/passwd')`` never reads the host.
"""
from __future__ import annotations