Ë
    âß²j   ã                  óî   — 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	 ddl
mZ ddlmZmZmZ ddlmZmZmZmZmZmZmZ  ej0                  e«      Zdd„Zdd	„Zdd
„Z G d„ de«      Zdd„ZdddddœZ d„ Z!y)u¦  DeepInfra image generation (FLUX, Qwen-Image-Edit, â€¦) via the OpenAI-compatible
``/v1/openai/images/generations`` endpoint. The catalog is fully dynamic (``image-gen``-tagged
models from :func:`hermes_cli.models._fetch_deepinfra_models_by_tag`; no ids hardcoded).
Selection: ``DEEPINFRA_IMAGE_MODEL`` â†’ ``image_gen.deepinfra.model`` â†’ first live model;
when all are absent ``generate()`` errors rather than guessing.é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional)Ú
get_secret)ÚDEFAULT_ASPECT_RATIOÚresolve_aspect_ratioÚsuccess_response)ÚStaticImageGenProviderÚerror_factoryÚimport_openaiÚload_image_gen_configÚmaterialize_imageÚprompt_required_errorÚsize_forc                 óx   — 	 ddl m}   | d«      S # t        $ r }t        j	                  d|«       Y d}~yd}~ww xY w)z=Fetch ``image-gen``-tagged models from the DeepInfra catalog.r   )Ú_fetch_deepinfra_models_by_tagz0Cannot import _fetch_deepinfra_models_by_tag: %sNz	image-gen)Úhermes_cli.modelsr   Ú	ExceptionÚloggerÚdebug)r   Úexcs     úI/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/deepinfra/__init__.pyÚ_live_modelsr      s;   € ðÝDñ *¨+Ó6Ð6øô ò Ü�‰ÐGÈÔMÜûðús   ‚ �	9™4´9c                óÄ  — | j                  dd«      }| j                  d«      }t        |t        «      r|ni }||j                  dd«      d   |j                  dd«      dœ}|j                  d	«      }t        |t        «      r(|j                  d
«      �	 dt	        |d
   «      d›d�|d<   dD ]  }|j                  |«      €Œ||   ||<   Œ |S # t
        t        f$ r Y Œ4w xY w)zPicker row for a catalog item.ÚidÚ Úmetadataú/é   éÿÿÿÿÚdescription)r   ÚdisplayÚ	strengthsÚpricingÚper_image_unitú$z.4fz/imageÚprice)Údefault_widthÚdefault_heightÚdefault_iterations)ÚgetÚ
isinstanceÚdictÚsplitÚfloatÚ	TypeErrorÚ
ValueError)ÚitemÚmidr   Úrowr&   Úkeys         r   Ú_format_catalog_rowr8       sö   € à
�(‰(�4˜Ó
€CØ�x‰x˜
Ó#€HÜ% h´Ô5‰x¸2€Hà˜cŸi™i¨¨QÓ/°Ñ3À(Ç,Á,È}Ð^`ÓBañ€Cð �l‰l˜9Ó%€GÜ�'œ4Ô  W§[¡[Ð1AÓ%BÐ%Nð	Øœu WÐ-=Ñ%>Ó?ÀÐDÀFÐKˆC�‰Lð Iò %ˆØ�<‰<˜ÓÑ(Ø ‘}ˆC�ŠHð%ð €Jøô œ:Ð&ò 	Ùð	ús   ÂC ÃCÃCc                óh  — t         j                  j                  dd«      j                  «       }|r|S t	        |t
        «      r|j                  d«      nd}t	        |t        «      r |j                  «       r|j                  «       S | r| d   j                  d«      nd}t	        |t        «      r|r|S dS )zWenv > config > first live result, else None (``cfg`` = loaded ``image_gen.deepinfra``).ÚDEEPINFRA_IMAGE_MODELr   ÚmodelNr   r   )ÚosÚenvironr-   Ústripr.   r/   Ústr)ÚcatalogÚcfgÚenv_overrideÚ	cfg_modelÚfirsts        r   Ú_resolve_modelrE   4   sŽ   € ä—:‘:—>‘>Ð"9¸2Ó>×DÑDÓF€LÙØÐÜ$.¨s´DÔ$9�—‘˜Ô ¸t€IÜ�)œSÔ! i§o¡oÔ&7Ø�‰Ó Ð Ù$+ˆG�A‰J�N‰N˜4Ô °€EÜ˜u¤cÔ*©uˆ5Ð>¸$Ð>ó    c                  ó`   — e Zd ZdZdZdZ edddddd¬	«      Zdd
„Zdd„Z	dd„Z
dd„Zefdd„Zy)ÚDeepInfraImageGenProviderz[DeepInfra ``images.generations`` backend; catalog discovered live by the ``image-gen`` tag.Ú	deepinfraÚ	DeepInfraÚpaidu=   FLUX, Qwen-Image, â€¦ â€” live catalog from api.deepinfra.comÚDEEPINFRA_API_KEYzDeepInfra API keyz#https://deepinfra.com/dash/api_keys)ÚnameÚbadgeÚtagr7   ÚpromptÚurlc                óP   — t        t        dd«      xs dj                  «       «      S )NrL   r   )Úboolr   r>   ©Úselfs    r   Úis_availablez&DeepInfraImageGenProvider.is_availableJ   s#   € Ü”ZÐ 3°RÓ8Ò>¸B×EÑEÓGÓHÐHrF   c                óV   — t        «       xs g D �cg c]  }t        |«      ‘Œ c}S c c}w )N)r   r8   )rU   r4   s     r   Úlist_modelsz%DeepInfraImageGenProvider.list_modelsM   s#   € Ü6B³nÒ6JÈÖK¨dÔ# DÕ)ÒKÐKùÒKs   ‘&c                óR   — | j                  «       }|r|d   j                  d«      S d S )Nr   r   )rX   r-   )rU   Úrowss     r   Údefault_modelz'DeepInfraImageGenProvider.default_modelP   s*   € Ø×ÑÓ!ˆÙ$(ˆt�A‰w�{‰{˜4Ó Ð2¨dÐ2rF   c                ó   — dgddœS )z>DeepInfra's OpenAI-compatible generation surface is text-only.Útextr   )Ú
modalitiesÚmax_reference_images© rT   s    r   Úcapabilitiesz&DeepInfraImageGenProvider.capabilitiesT   s   € à%˜hÀÑBÐBrF   c                ó®  — |xs dj                  «       }t        |«      }t        d|«      }|j                  d«      s|j                  d«      r |dd|¬«      S |st	        d|«      S t        dd«      xs dj                  «       }|s	 |d	d
«      S t        d«      }t        t        «       xs g |«      }|s |dd|¬«      S t        |«      }	ddl
m}
 t        d|«      \  }}|r|S t        d|||¬«      }|j                  | |
|«      ¬«      }	 |j                  j                  |||	d¬«      }	 t'        |dd «      }t)        |«      r |«        	 t'        |dd «      xs g }|s	 |dd«      S |d   }t+        t'        |dd «      t'        |dd «      d|j-                  dd«      d    j/                  d!d"«      › �d#d|||d$„ ¬%«	      \  }}|r|S t1        ||||dd&|	i¬'«      S # t         $ rM}t"        j%                  dd¬«        |d|› �d«      cY d }~t'        |dd «      }t)        |«      r |«        S S d }~ww xY w# t'        |dd «      }t)        |«      r |«        w w xY w)(Nr   rI   Ú	image_urlÚreference_image_urlszuDeepInfra image generation is text-to-image only in this backend; image_url and reference_image_urls are unsupported.Úmodality_unsupported)rP   rL   u€   DEEPINFRA_API_KEY not set. Run `hermes tools` â†’ Image Generation â†’ DeepInfra to configure, or `hermes setup` to add the key.Úauth_requiredzÉNo DeepInfra image-gen model available. Pin one in config.yaml under image_gen.deepinfra.model, set DEEPINFRA_IMAGE_MODEL, or check connectivity to api.deepinfra.com so the live catalog can be fetched.Úno_model_availabler   )Údeepinfra_base_url)r;   rP   )Úapi_keyÚbase_urlr!   )r;   rP   ÚsizeÚnz!DeepInfra image generation failedT)Úexc_infoz#DeepInfra image generation failed: Ú	api_errorÚcloseÚdataz DeepInfra returned no image dataÚempty_responseÚb64_jsonrQ   Ú
deepinfra_r    r"   ú:Ú_rJ   c                ó.   — t         j                  d| «      S )Nz:DeepInfra: caching delivery URL failed (%s); returning URL)r   r   )r   s    r   ú<lambda>z4DeepInfraImageGenProvider.generate.<locals>.<lambda>�   s   € ¤F§L¡LØLÈcó%S€ rF   )ÚprefixÚlabelÚproviderr;   rP   ÚaspectÚon_url_failrk   )Úimager;   rP   Úaspect_ratiorz   Úextra)r>   r
   r   r-   r   r   r   rE   r   r   r   rh   r   ÚOpenAIÚimagesÚgenerater   r   r   ÚgetattrÚcallabler   r0   Úreplacer   )rU   rP   r~   Úkwargsr{   Úfailri   Údi_cfgÚmodel_idrk   rh   ÚopenaiÚerrÚclientÚresponser   ro   rp   rD   Ú	image_refs                       r   r‚   z"DeepInfraImageGenProvider.generateX   s£  € Ø’,˜B×%Ñ%Ó'ˆÜ% lÓ3ˆÜ˜[¨&Ó1ˆØ�:‰:�kÔ" f§j¡jÐ1GÔ&HÙðOà&¨vô7ð 7ñ Ü(¨°fÓ=Ð=ÜÐ1°2Ó6Ò<¸"×CÑCÓEˆÙÙð"ð  ó	!ð !ô
 ' {Ó3ˆÜ!¤,£.Ò"6°B¸Ó?ˆÙÙðHð %¨Vô5ð 5ô ˜ÓˆÝ8ô $ K°Ó8‰ˆ�ÙØˆJÜ˜[¨&¸ÈÔPˆØ—‘ wÑ9KÈFÓ9S�ÓTˆð	Ø—}‘}×-Ñ-°HÀVÐRVÐZ[Ð-Ó\‰Hô
 ˜F G¨TÓ2ˆEÜ˜ŒÙ•ä�x ¨Ó.Ò4°"ˆÙÙÐ:Ð<LÓMÐMØ�Q‘ˆô +Ü�E˜: tÓ,¬g°e¸UÀDÓ.IØ §¡¨s°AÓ 6°rÑ :× BÑ BÀ3ÈÓ LÐMÐNÐVaØ ¨¸ÈñSô	T‰ˆ	�3ñ ØˆJÜØ 8°FÈÐZeØ˜4�.ô"ð 	"øô- ò 	RÜ�L‰LÐ<ÀtˆLÔLÙÐ=¸c¸UÐCÀ[ÓQÔQä˜F G¨TÓ2ˆEÜ˜ŒÙ•ð ûð	Rûô ˜F G¨TÓ2ˆEÜ˜ŒÙ•ð ús0   ÄG Ç	H/Ç""H*ÈH/ÈH2 È*H/È/H2 È2"IN)ÚreturnrS   )r�   úList[Dict[str, Any]])r�   úOptional[str])r�   úDict[str, Any])rP   r?   r~   r?   r†   r   r�   r’   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úprovider_idry   r/   ÚsetuprV   rX   r[   ra   r	   r‚   r`   rF   r   rH   rH   @   sL   „ Ùeà€KØ€EÙØ Ð,kØÐ(;ÐAfô€Eó
IóLó3óCð 9Mõ >"rF   rH   c                ó6   — | j                  t        «       «       y)uL   Plugin entry point â€” wire ``DeepInfraImageGenProvider`` into the registry.N)Úregister_image_gen_providerrH   )Úctxs    r   Úregisterrœ   ™   s   € à×#Ñ#Ô$=Ó$?Õ@rF   )úagent.image_gen_providerÚImageGenProvider)r�   Úerror_response)r�   Úsave_b64_image)r�   Úsave_url_image)rž   rŸ   r    r¡   c                óÌ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t        |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_oncer!   )	Ú_PLUGIN_COMPAT_LAZYr-   ÚAttributeErrorr“   Ú	importlibÚhermes_cli.plugin_compatr£   rƒ   Úimport_module)rM   Útargetr¦   r£   s       r   Ú__getattr__rª   ¬   se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐArF   )r�   zOptional[List[Dict[str, Any]]])r4   r’   r�   r’   )r@   r�   rA   r’   r�   r‘   )r�   ÚNone)"r–   Ú
__future__r   Úloggingr<   Útypingr   r   r   r   Úagent.secret_scoper   Úagent.image_gen_providerr	   r
   r   Úplugins.image_gen._commonr   r   r   r   r   r   r   Ú	getLoggerr“   r   r   r8   rE   rH   rœ   r¤   rª   r`   rF   r   ú<module>r³      sŠ   ðñCõ #ã Û 	ß ,Ó ,å )ß aÑ a÷%÷ %ñ %ð 
ˆ×	Ñ	˜8Ó	$€ó7óó(	?ôV"Ð 6ô V"órAð IØDØDØDñ	Ð óBrF   