
    `gj&                        U d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
  ej                  e      Zi Zded<    ej                          ZddZdd	Zdd
ZddZddZy)u  
Image Generation Provider Registry
==================================

Central map of registered providers. Populated by plugins at import-time via
``PluginContext.register_image_gen_provider()``; consumed by the
``image_generate`` tool to dispatch each call to the active backend.

Active selection
----------------
The active provider is chosen by ``image_gen.provider`` in ``config.yaml``.
If unset, :func:`get_active_provider` applies fallback logic:

1. If exactly one provider is registered, use it.
2. Otherwise if a provider named ``fal`` is registered, use it (legacy
   default — matches pre-plugin behavior).
3. Otherwise return ``None`` (the tool surfaces a helpful error pointing
   the user at ``hermes tools``).
    )annotationsN)DictListOptional)ImageGenProviderzDict[str, ImageGenProvider]
_providersc                   t        | t              s!t        dt        |       j                         | j
                  }t        |t              r|j                         st        d      t        5  t        j                  |      }| t        |<   ddd       +t        j                  d|t        |      j                         yt        j                  d|t        |       j                         y# 1 sw Y   axY w)u   Register an image generation provider.

    Re-registration (same ``name``) overwrites the previous entry and logs
    a debug message — this makes hot-reload scenarios (tests, dev loops)
    behave predictably.
    z>register_provider() expects an ImageGenProvider instance, got z3Image gen provider .name must be a non-empty stringNz.Image gen provider '%s' re-registered (was %r)z'Registered image gen provider '%s' (%s))
isinstancer   	TypeErrortype__name__namestrstrip
ValueError_lockr   getloggerdebug)providerr   existings      K/root/.hermes/venv/lib/python3.12/site-packages/agent/image_gen_registry.pyregister_providerr   $   s     h 01>**+-
 	
 ==DdC 

NOO	 $>>$'#
4$ EtTRZ^MdMde>d8nF]F]^$ $s   /C..C7c                     t         5  t        t        j                               } ddd       t	         d       S # 1 sw Y   xY w)z0Return all registered providers, sorted by name.Nc                    | j                   S )Nr   )ps    r   <lambda>z list_providers.<locals>.<lambda>@   s
    qvv     )key)r   listr   valuessorted)itemss    r   list_providersr%   <   s;    	 *Z&&()*%-..* *s	   ;Ac                    t        | t              syt        5  t        j	                  | j                               cddd       S # 1 sw Y   yxY w)z5Return the provider registered under *name*, or None.N)r
   r   r   r   r   r   r   s    r   get_providerr'   C   s9    dC 	 ,~~djjl+, , ,s   #AAc                    d} 	 ddl m}  |       }t        |t              r|j	                  d      nd}t        |t              rA|j	                  d      }t        |t
              r |j                         r|j                         } t        5  t        t              }ddd       dd}| r+j	                  |       }||S t        j                  d|        j                         D 	cg c]  }	 ||	      s|	 }
}	t        |
      d	k(  r|
d   S |j	                  d
      }|
 ||      r|S y# t        $ r }t        j                  d|       Y d}~d}~ww xY w# 1 sw Y   xY wc c}	w )u  Resolve the currently-active provider.

    Reads ``image_gen.provider`` from config.yaml; falls back per the
    module docstring.

    **Availability semantics** (mirrors :mod:`agent.web_search_registry`):

    - When ``image_gen.provider`` is explicitly set, the configured
      provider is returned even if :meth:`ImageGenProvider.is_available`
      reports False — the dispatcher surfaces a precise "X_API_KEY is not
      set" error rather than silently switching backends.
    - When ``image_gen.provider`` is unset, the fallback path (single-
      provider shortcut and the FAL legacy preference) is filtered by
      ``is_available()`` so we don't pick a provider the user has no
      credentials for.
    Nr   )load_config	image_genr   z1Could not read image_gen.provider from config: %sc                    	 t        | j                               S # t        $ r+}t        j	                  d| j
                  |       Y d}~yd}~ww xY w)zDWrap ``is_available()`` so a buggy provider doesn't kill resolution.z.image_gen provider %s.is_available() raised %sNF)boolis_available	Exceptionr   r   r   )r   excs     r   _is_available_safez/get_active_provider.<locals>._is_available_safel   sB    	()) 	LLI166SVW	s    	A!A

AzCimage_gen.provider='%s' configured but not registered; falling back   fal)r   r   returnr,   )hermes_cli.configr)   r
   dictr   r   r   r.   r   r   r   r   r"   len)
configuredr)   cfgsectionrawr/   snapshotr0   r   r   	availabler2   s               r   get_active_providerr=   K   sK   " !%J
O1m*4S$*?#''+&Tgt$++j)C#s#		 YY[
 
 $
#$ <<
+OQ	
 %OO-Gq1CA1FGIG
9~| ,,u
C
-c2
K  OH#NNO$ $2 Hs0   BD+ E&E#4E#+	E4EEE c                 b    t         5  t        j                          ddd       y# 1 sw Y   yxY w)z"Clear the registry. **Test-only.**N)r   r   clear r   r   _reset_for_testsrA      s&    	   s   %.)r   r   r3   None)r3   zList[ImageGenProvider])r   r   r3   Optional[ImageGenProvider])r3   rC   )r3   rB   )__doc__
__future__r   logging	threadingtypingr   r   r   agent.image_gen_providerr   	getLoggerr   r   r   __annotations__Lockr   r   r%   r'   r=   rA   r@   r   r   <module>rM      sg   ( #   ' ' 5			8	$ +-
' ,	_0/,@Fr   