§
    ‰eî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m	Z	m
Z
 ddlmZmZmZmZmZmZ  ej        e¦  «        ZdZddd	d
dœdddddœdddddœdœZded<   dZddddœZd%d„Zd&d „Z G d!„ d"e¦  «        Zd'd$„ZdS )(u¯  OpenAI image generation backend.

Exposes OpenAI's ``gpt-image-2`` model at three quality tiers as an
:class:`ImageGenProvider` implementation. The tiers are implemented as
three virtual model IDs so the ``hermes tools`` model picker and the
``image_gen.model`` config key behave like any other multi-model backend:

    gpt-image-2-low     ~15s   fastest, good for iteration
    gpt-image-2-medium  ~40s   default â€” balanced
    gpt-image-2-high    ~2min  slowest, highest fidelity

All three hit the same underlying API model (``gpt-image-2``) with a
different ``quality`` parameter. Output is base64 JSON â†’ saved under
``$HERMES_HOME/cache/images/``.

Selection precedence (first hit wins):

1. ``OPENAI_IMAGE_MODEL`` env var (escape hatch for scripts / tests)
2. ``image_gen.openai.model`` in ``config.yaml``
3. ``image_gen.model`` in ``config.yaml`` (when it's one of our tier IDs)
4. :data:`DEFAULT_MODEL` â€” ``gpt-image-2-medium``
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚTuple)ÚDEFAULT_ASPECT_RATIOÚImageGenProviderÚerror_responseÚresolve_aspect_ratioÚsave_b64_imageÚsuccess_responsezgpt-image-2zGPT Image 2 (Low)z~15szFast iteration, lowest costÚlow)ÚdisplayÚspeedÚ	strengthsÚqualityzGPT Image 2 (Medium)z~40su   Balanced â€” defaultÚmediumzGPT Image 2 (High)z~2minz,Highest fidelity, strongest prompt adherenceÚhigh)zgpt-image-2-lowúgpt-image-2-mediumzgpt-image-2-highzDict[str, Dict[str, Any]]Ú_MODELSr   Ú	1536x1024Ú	1024x1024Ú	1024x1536)Ú	landscapeÚsquareÚportraitÚreturnúDict[str, Any]c                 ó  — 	 ddl m}   | ¦   «         }t          |t          ¦  «        r|                     d¦  «        nd}t          |t          ¦  «        r|ni S # t
          $ r'}t                               d|¦  «         i cY d}~S d}~ww xY w)z@Read ``image_gen`` from config.yaml (returns {} on any failure).r   )Úload_configÚ	image_genNz#Could not load image_gen config: %s)Úhermes_cli.configr!   Ú
isinstanceÚdictÚgetÚ	ExceptionÚloggerÚdebug)r!   ÚcfgÚsectionÚexcs       úC/home/div/.hermes/hermes-agent/plugins/image_gen/openai/__init__.pyÚ_load_openai_configr.   R   s¥   € ðØ1Ð1Ð1Ð1Ð1Ð1àˆk‰mŒmˆÝ*4°S½$Ñ*?Ô*?ÐI�#—'’'˜+Ñ&Ô&Ð&ÀTˆÝ$ W­dÑ3Ô3Ð;ˆwˆw¸Ð;øÝð ð ð Ý�ŠÐ:¸CÑ@Ô@Ð@Øˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs   ‚AA Á
BÁ!BÁ=BÂBúTuple[str, Dict[str, Any]]c                 óh  — t           j                             d¦  «        } | r| t          v r| t          |          fS t	          ¦   «         }t          |                     d¦  «        t          ¦  «        r|                     d¦  «        ni }d}t          |t          ¦  «        r5|                     d¦  «        }t          |t          ¦  «        r|t          v r|}|€5|                     d¦  «        }t          |t          ¦  «        r|t          v r|}|�|t          |         fS t          t          t                   fS )z9Decide which tier to use and return ``(model_id, meta)``.ÚOPENAI_IMAGE_MODELÚopenaiNÚmodel)	ÚosÚenvironr&   r   r.   r$   r%   ÚstrÚDEFAULT_MODEL)Úenv_overrider*   Ú
openai_cfgÚ	candidateÚvalueÚtops         r-   Ú_resolve_modelr=   _   s  € å”:—>’>Ð"6Ñ7Ô7€LØð 3˜­Ð/Ð/Ø�W \Ô2Ð2Ð2å
Ñ
Ô
€CÝ&0°·²¸Ñ1BÔ1BÅDÑ&IÔ&IÐQ�—’˜Ñ"Ô"Ð"Èr€JØ#€IÝ�*�dÑ#Ô#ð Ø—’˜wÑ'Ô'ˆÝ�e�SÑ!Ô!ð 	 e­wÐ&6Ð&6ØˆIØÐØ�gŠg�gÑÔˆÝ�c�3ÑÔð 	 C­7 N NØˆIàÐØ�' )Ô,Ð,Ð,å�'¥-Ô0Ð0Ð0ó    c                  ón   — e Zd ZdZedd„¦   «         Zedd„¦   «         Zdd„Zdd	„Zdd„Z	dd„Z
efdd„ZdS )ÚOpenAIImageGenProvideruF   OpenAI ``images.generate`` backend â€” gpt-image-2 at low/medium/high.r   r6   c                ó   — dS )Nr2   © ©Úselfs    r-   ÚnamezOpenAIImageGenProvider.name   ó   € àˆxr>   c                ó   — dS )NÚOpenAIrB   rC   s    r-   Údisplay_namez#OpenAIImageGenProvider.display_nameƒ   rF   r>   Úboolc                óv   — t           j                             d¦  «        sdS 	 dd l}n# t          $ r Y dS w xY wdS )NÚOPENAI_API_KEYFr   T)r4   r5   r&   r2   ÚImportError)rD   r2   s     r-   Úis_availablez#OpenAIImageGenProvider.is_available‡   sU   € ÝŒz�~Š~Ð.Ñ/Ô/ð 	Ø�5ð	ØˆMˆMˆMˆMøÝð 	ð 	ð 	Ø�5�5ð	øøøàˆts   £( ¨
6µ6úList[Dict[str, Any]]c                óH   — d„ t                                ¦   «         D ¦   «         S )Nc                óH   — g | ]\  }}||d          |d         |d         ddœ‘Œ S )r   r   r   Úvaries)Úidr   r   r   ÚpricerB   )Ú.0Úmodel_idÚmetas      r-   ú
<listcomp>z6OpenAIImageGenProvider.list_models.<locals>.<listcomp>‘   sQ   € ð 	
ð 	
ð 	
ñ �˜$ð Ø 	œ?Ø˜gœØ! +Ô.Ø!ðð ð	
ð 	
ð 	
r>   )r   ÚitemsrC   s    r-   Úlist_modelsz"OpenAIImageGenProvider.list_models�   s-   € ð	
ð 	
õ #*§-¢-¡/¤/ð	
ñ 	
ô 	
ð 		
r>   úOptional[str]c                ó   — t           S )N)r7   rC   s    r-   Údefault_modelz$OpenAIImageGenProvider.default_modelœ   s   € ÝÐr>   r   c                ó   — dddddddœgdœS )	NrH   Úpaidz,gpt-image-2 at low/medium/high quality tiersrL   zOpenAI API keyz$https://platform.openai.com/api-keys)ÚkeyÚpromptÚurl)rE   ÚbadgeÚtagÚenv_varsrB   rC   s    r-   Úget_setup_schemaz'OpenAIImageGenProvider.get_setup_schemaŸ   s4   € àØØAð ,Ø.ØAðð ðð	
ð 
ð 	
r>   ra   Úaspect_ratioÚkwargsr   c           	     ó   — |pd                      ¦   «         }t          |¦  «        }|st          ddd|¬¦  «        S t          j                             d¦  «        st          ddd|¬¦  «        S 	 d	d l}n## t          $ r t          d
dd|¬¦  «        cY S w xY wt          ¦   «         \  }}t                               |t          d         ¦  «        }t          ||d|d         dœ}		 |                     ¦   «         }
 |
j        j        d#i |	¤Ž}nK# t          $ r>}t                               dd¬¦  «         t          d|› �dd|||¬¦  «        cY d }~S d }~ww xY wt#          |dd ¦  «        pg }|st          ddd|||¬¦  «        S |d	         }t#          |dd ¦  «        }t#          |dd ¦  «        }t#          |dd ¦  «        }|rU	 t%          |d|› �¬¦  «        }n/# t          $ r"}t          d|› �dd|||¬¦  «        cY d }~S d }~ww xY wt'          |¦  «        }n|r|}nt          d dd|||¬¦  «        S ||d         d!œ}|r||d<   t)          ||||d|¬"¦  «        S )$NÚ z1Prompt is required and must be a non-empty stringÚinvalid_argumentr2   )ÚerrorÚ
error_typeÚproviderrg   rL   uz   OPENAI_API_KEY not set. Run `hermes tools` â†’ Image Generation â†’ OpenAI to configure, or `hermes setup` to add the key.Úauth_requiredr   z8openai Python package not installed (pip install openai)Úmissing_dependencyr   é   r   )r3   ra   ÚsizeÚnr   zOpenAI image generation failedT)Úexc_infoz OpenAI image generation failed: Ú	api_error)rl   rm   rn   r3   ra   rg   ÚdatazOpenAI returned no image dataÚempty_responseÚb64_jsonrb   Úrevised_promptÚopenai_)ÚprefixzCould not save image to cache: Úio_errorz2OpenAI response contained neither b64_json nor URL)rr   r   )Úimager3   ra   rg   rn   ÚextrarB   )Ústripr   r   r4   r5   r&   r2   rM   r=   Ú_SIZESÚ	API_MODELrH   ÚimagesÚgenerater'   r(   r)   Úgetattrr   r6   r   )rD   ra   rg   rh   Úaspectr2   Útier_idrW   rr   ÚpayloadÚclientÚresponser,   rv   ÚfirstÚb64rb   ry   Ú
saved_pathÚ	image_refr~   s                        r-   rƒ   zOpenAIImageGenProvider.generate­   s”  € ð �,˜B×%Ò%Ñ'Ô'ˆÝ% lÑ3Ô3ˆàð 	Ý!ØIØ-Ø!Ø#ð	ñ ô ð õ Œz�~Š~Ð.Ñ/Ô/ð 
	Ý!ð&ð +Ø!Ø#ð	ñ 	ô 	ð 	ð	ØˆMˆMˆMˆMøÝð 	ð 	ð 	Ý!ØPØ/Ø!Ø#ð	ñ ô ð ð ð ð	øøøõ 'Ñ(Ô(‰ˆ�Ý�zŠz˜&¥&¨Ô"2Ñ3Ô3ˆõ
 ØØØØ˜I”ð#
ð #
ˆð	Ø—]’]‘_”_ˆFØ-�v”}Ô-Ð8Ð8°Ð8Ð8ˆHˆHøÝð 		ð 		ð 		Ý�LŠLÐ9ÀDˆLÑIÔIÐIÝ!Ø>¸Ð>Ð>Ø&Ø!ØØØ#ðñ ô ð ð ð ð ð ð øøøøð		øøøõ �x ¨Ñ.Ô.Ð4°"ˆØð 	Ý!Ø5Ø+Ø!ØØØ#ðñ ô ð ð �Q”ˆÝ�e˜Z¨Ñ.Ô.ˆÝ�e˜U DÑ)Ô)ˆÝ  Ð(8¸$Ñ?Ô?ˆàð 	ð
Ý+¨CÐ8KÀ'Ð8KÐ8KÐLÑLÔL�
�
øÝð ð ð Ý%ØA¸CÐAÐAØ)Ø%Ø!Ø!Ø!'ðñ ô ð ð ð ð ð ð øøøøðøøøõ ˜J™œˆIˆIØð 	ð ˆIˆIå!ØJØ+Ø!ØØØ#ðñ ô ð ð *.¸$¸y¼/Ð JÐ JˆØð 	5Ø&4ˆEÐ"Ñ#åØØØØØØð
ñ 
ô 
ð 	
sN   Á.A3 Á3BÂBÃ!&D Ä
EÄ3EÅEÅEÆ;G Ç
G<ÇG7Ç1G<Ç7G<N)r   r6   )r   rJ   )r   rO   )r   r[   ©r   r   )ra   r6   rg   r6   rh   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpropertyrE   rI   rN   rZ   r]   rf   r	   rƒ   rB   r>   r-   r@   r@   |   sÍ   € € € € € ØPÐPàðð ð ñ „Xðð ðð ð ñ „Xððð ð ð ð

ð 

ð 

ð 

ðð ð ð ð
ð 
ð 
ð 
ð" 1ðx
ð x
ð x
ð x
ð x
ð x
ð x
r>   r@   ÚNonec                óH   — |                       t          ¦   «         ¦  «         dS )uI   Plugin entry point â€” wire ``OpenAIImageGenProvider`` into the registry.N)Úregister_image_gen_providerr@   )Úctxs    r-   Úregisterr˜   -  s#   € à×#Ò#Õ$:Ñ$<Ô$<Ñ=Ô=Ð=Ð=Ð=r>   rŽ   )r   r/   )r   r”   )r’   Ú
__future__r   Úloggingr4   Útypingr   r   r   r   r   Úagent.image_gen_providerr	   r
   r   r   r   r   Ú	getLoggerr�   r(   r�   r   Ú__annotations__r7   r€   r.   r=   r@   r˜   rB   r>   r-   ú<module>rŸ      sÏ  ððð ð ð. #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ð €	ð 'ØØ2Øð	ð ð *ØØ+Øð	ð ð (ØØCØð	ð ð&ð &€ð ð ð ñ ð* %€ð ØØð
ð 
€ð
ð 
ð 
ð 
ð1ð 1ð 1ð 1ð:i
ð i
ð i
ð i
ð i
Ð-ñ i
ô i
ð i
ðb>ð >ð >ð >ð >ð >r>   