
    i                        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dS )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]
_providersproviderr   returnNonec                <   t          | t                    s$t          dt          |           j                   | j        }t          |t                    r|                                st          d          t          5  t                              |          }| t          |<   ddd           n# 1 swxY w Y   |0t                              d|t          |          j                   dS t                              d|t          |           j                   dS )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)r	   r   existings      =/home/ubuntu/.hermes/hermes-agent/agent/image_gen_registry.pyregister_providerr   $   sJ    h 011 
->>*- -
 
 	
 =DdC   P

 PNOOO	 $ $>>$''#
4$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ EtTRZ^^Mdeeeee>d8nnF]^^^^^s    %B11B58B5List[ImageGenProvider]c                     t           5  t          t                                                    } ddd           n# 1 swxY w Y   t	          | d           S )z0Return all registered providers, sorted by name.Nc                    | j         S )Nr   )ps    r   <lambda>z list_providers.<locals>.<lambda>@   s    qv     )key)r   listr   valuessorted)itemss    r   list_providersr(   <   s    	 * *Z&&(())* * * * * * * * * * * * * * *%--....s   ';??r   r   Optional[ImageGenProvider]c                    t          | t                    sdS t          5  t                              |                                           cddd           S # 1 swxY w Y   dS )z5Return the provider registered under *name*, or None.N)r   r   r   r   r   r   r   s    r   get_providerr+   C   s    dC   t	 , ,~~djjll++, , , , , , , , , , , , , , , , , ,s   ,AAAc                 $   d} 	 ddl m}  |            }t          |t                    r|                    d          nd}t          |t                    rR|                    d          }t          |t
                    r(|                                r|                                } n2# t          $ r%}t          	                    d|           Y d}~nd}~ww xY wt          5  t          t                    }ddd           n# 1 swxY w Y   | r4|                    |           }||S t          	                    d|            t          |          dk    r.t          t          |                                                    S d	|v r|d	         S dS )
zResolve the currently-active provider.

    Reads ``image_gen.provider`` from config.yaml; falls back per the
    module docstring.
    Nr   )load_config	image_genr	   z1Could not read image_gen.provider from config: %szCimage_gen.provider='%s' configured but not registered; falling back   fal)hermes_cli.configr-   r   dictr   r   r   	Exceptionr   r   r   r   lennextiterr%   )
configuredr-   cfgsectionrawexcsnapshotr	   s           r   get_active_providerr=   K   s    !%J
O111111kmm*4S$*?*?I#''+&&&Tgt$$ 	)++j))C#s## )		 ) YY[[
 O O OH#NNNNNNNNO 
 $ $
##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $  
<<
++OQ	
 	
 	
 8}}D**++,,, 4s*   B#B( (
C2CC!DD	Dc                 x    t           5  t                                           ddd           dS # 1 swxY w Y   dS )z"Clear the registry. **Test-only.**N)r   r   clear r"   r   _reset_for_testsrA   u   s~    	                   s   /33)r	   r   r
   r   )r
   r   )r   r   r
   r)   )r
   r)   )r
   r   )__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>rK      s    ( # " " " " "      ' ' ' ' ' ' ' ' ' ' 5 5 5 5 5 5		8	$	$ +-
 , , , ,	_ _ _ _0/ / / /, , , ,' ' ' 'T     r"   