
    opj%+                    $   d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
 ddlZ	 ddlmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZmZmZ ddlmZm Z m!Z!  ejD                  e#      Z$ G d de      Z%y# e$ r eZdZd Zd Zd	 Zd
 Zd ZY Vw xY w)zhAbacus AI ImageGenProvider implementation.

Provides image generation through Abacus AI's RouteLLM API.
    )annotationsN)AnyDictListOptional)DEFAULT_ASPECT_RATIOImageGenProvidererror_responseresolve_aspect_ratiosave_b64_imagesave_url_imagesuccess_responsesquarec                     ddi| S )Nstatuserror kwargss    5/root/.hermes/plugins/image_gen/abacus_ai/provider.pyr
   r
      s    (G)Fv)F"F    c                     ddi| S )Nr   successr   r   s    r   r   r       s    Hi+J6+J$Jr   c                    | S Nr   )rs    r   r   r   !   s    r   c                      yN r   akws     r   r   r   "       r   c                      yr   r   r    s     r   r   r   #   r#   r      )resolve_credentialsresolve_model_chain)MODEL_CATALOG_REQUEST_TIMEOUTDEFAULT_MODELresolve_aspect_ratio_for_model)to_image_url_partdetect_image_formatstrip_data_url_prefixc                      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
ddZefd	d	d
	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy	)AbacusAIImageProviderzImage generation via Abacus AI RouteLLM.

    Provides access to 20+ image generation models through Abacus AI's
    OpenAI-compatible RouteLLM API, including FLUX, DALL-E, MidJourney,
    and more.
    c                     y)N	abacus_air   selfs    r   namezAbacusAIImageProvider.name9       r   c                     y)Nz	Abacus AIr   r3   s    r   display_namez"AbacusAIImageProvider.display_name=   r6   r   c                R    	 t               \  }}t        |      S # t        $ r Y yw xY w)NF)r&   bool	Exception)r4   _api_keys      r   is_availablez"AbacusAIImageProvider.is_availableE   s/    	,.JAw=  		s    	&&c                     t        t              S r   )listr(   r3   s    r   list_modelsz!AbacusAIImageProvider.list_modelsP   s    M""r   c                    t         S r   )r*   r3   s    r   default_modelz#AbacusAIImageProvider.default_modelS   s    r   c                    ddgddS )Ntextimage   )
modalitiesmax_reference_imagesr   r3   s    r   capabilitiesz"AbacusAIImageProvider.capabilitiesV   s    !7+$%
 	
r   c                <    ddl m} dddd|ddd	d
ddddddgdS )Nr%   )ABACUS_AI_DEFAULT_BASE_URLzAbacus AI (RouteLLM)paidzFLUX, DALL-E, MidJourney, and 20+ models via Abacus AI RouteLLM. Uses credentials from custom_providers in config.yaml or ABACUS_AI_API_KEY env var.zBase URL)labelplaceholderzAPI Keyzs2_...T)rN   rO   secret)baseUrlapiKeyABACUS_AI_API_KEYzAbacus AI API keyz$https://abacus.ai/app/route-llm-apis)keyprompturl)r5   badgetagconfig_keysenv_vars)configrL   )r4   rL   s     r   get_setup_schemaz&AbacusAIImageProvider.get_setup_schema\   sS    6 +0 (#=
 '#+"
 /1A'
 	
r   N)	image_urlreference_image_urlsc                  |xs dj                         }t        |      }|st        ddd|      S t               \  }}|st        ddd|      S t	        |j                  d            }	|	d	   }
t        ||
      }g }|j                  d
      xs g D ]  }|j                  t        |              |r|j                  t        |             |xs g D ]  }|j                  t        |              d|dg}|d d D ]&  }t        |      }|s|j                  dd|id       ( d| dd}d|i}|j                  d      }|r%dt        |      cxk  rdk  rn nt        |      |d<   |j                  d      }|r||d<   |j                  d      xs |j                  d      }|rt        |      |d<   |j                  d      }|||d<   |
ddgd|dg|d}	 t        j                  | d ||t        !      }|j                          	 |j%                         }| j+                  ||
      }|rt-        ||
||d&      S t        d'd(d||
$      S # t        j                  $ r9}t         j#                  d"|       t        t        |      d#d||
$      cY d }~S d }~ww xY w# t$        j&                  t(        f$ r}t        d%d#d||
$      cY d }~S d }~ww xY w))Nr   z1Prompt is required and must be a non-empty stringinvalid_argumentr2   )r   
error_typeprovideraspect_ratioziAbacus AI API key not found. Configure it under custom_providers in config.yaml or set ABACUS_AI_API_KEY.auth_requiredmodelr   reference_imagesrE   )typerE   rG   r]   rV   )rg   r]   zBearer zapplication/json)AuthorizationzContent-Typerc   
num_imagesr%      quality
resolutionresrewrite_promptrF   user)rolecontent)re   rH   messagesimage_configz/chat/completions)headersjsontimeoutzAbacus AI image gen failed: %s	api_error)r   ra   rb   rc   re   zInvalid JSON response)rF   re   rU   rc   rb   zNo image found in responseempty_response)stripr   r
   r&   r'   getr+   appendstrr,   intrequestspostr)   raise_for_statusRequestExceptionloggerwarningru   JSONDecodeError
ValueError_extract_imager   )r4   rU   rc   r]   r^   r   aspectbase_urlr=   model_chainmodel_id	or_aspect
referencesrefrq   partrt   rs   ri   rk   rl   rewritepayloadresponseexcdatarF   s                              r   generatezAbacusAIImageProvider.generate   sR    ,B%%'%l3!I-$#	  01'!P +$#  *&**W*=>q> 368D	 !#
::017R 	(Cc#h'	(c)n-'-2 	(Cc#h'	( V,)
 bq> 	C$S)D(t}E	  'wi0.
 I(

 ZZ-
!s:3!3),ZL& **Y'&-L# ZZ-BE1B
),ZL& **-.-4L)* "F+"(W=>(	#
	}}*-.(	H %%'		==?D ##D(3##$  .' 
 	
A (( 	NN;SA!#h&$# 	 $$j1 	!-&$# 	s<   0I J J#.JJJK8KKKc                t   	 |j                  dg       }|sy|d   j                  di       }|j                  d      xs g }|D ]  }|j                  d      xs i j                  d      xs |j                  dd      }|s>|j                  d	      r/t        |      }t        |      }	t	        t        |	||
            c S t	        t        ||            c S  |j                  dd      }
|
rAd	|
v r=ddl}|j                  d|
      }|r%t	        t        |j                  d      |            S |j                  d      xs |j                  d      }t        |t              r*|j                  dd      }|rt	        t        ||            S y# t        $ r }t        j                  d|       Y d}~yd}~ww xY w)zExtract image from Abacus AI response.

        Abacus AI RouteLLM returns images in OpenAI-compatible format:
        ``choices[0].message.images[].image_url.url`` (data URI).
        choicesNr   messageimagesr]   rV   r   z
data:image)prefix	extension)r   rq   z)data:image/[^;]+;base64,([a-zA-Z0-9+/=]+)r%   inline_data
inlineDatar   z)Failed to extract image from response: %s)rz   
startswithr-   r.   r|   r   r   researchgroup
isinstancedictr;   r   debug)r4   r   r   r   msgr   imgrV   extraw_b64rq   r   matchr   b64_datar   s                   r   r   z$AbacusAIImageProvider._extract_image  s   7	hhy"-G!*..B/CWWX&,"F WW[)/R44U; *wwub)  ~~l31#6"7"<"* 'C  
 &s8< & ggi,G<72		@ &!KKN8  ''-0 CGG5K +t,&??626&xA    	LL;S  	s7   F A)F ?F F AF /AF 	F7F22F7)returnr|   )r   r:   )r   zList[Dict[str, Any]])r   Optional[str])r   Dict[str, Any])rU   r|   rc   r|   r]   r   r^   zOptional[List[str]]r   r   r   r   )r   r   r   r|   r   r   )__name__
__module____qualname____doc__propertyr5   r8   r>   rA   rC   rJ   r\   r   r   r   r   r   r   r0   r0   1   s        #

L 1L

 $(48L
L
 L

 !L
 2L
 L
 
L
dAA$'A	Ar   r0   )&r   
__future__r   ru   loggingostypingr   r   r   r   r~   agent.image_gen_providerr   r	   r
   r   r   r   r   ImportErrorobjectr[   r&   r'   modelsr(   r)   r*   r+   utilsr,   r-   r.   	getLoggerr   r   r0   r   r   r   <module>r      s   
 #   	 , , ,  * =  Q P			8	$a, a1  
, #FJ)++
,s   A4 4BB