
    `gj                        U d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZ  ej"                  e      ZdZ eh d	      Zd
ed<    G d de      ZdgZy)z xAI Grok OAuth upstream adapter.    )annotationsN)	FrozenSetOptional)CredentialPoolPooledCredential	load_pool)DEFAULT_XAI_OAUTH_BASE_URL)UpstreamAdapterUpstreamCredentialz	xai-oauth>   /models
/responses/embeddings/completions/chat/completionsFrozenSet[str]_ALLOWED_PATHSc                      e Zd ZdZdZddZed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y)XAIGrokAdapterzAProxy upstream for xAI Grok via Hermes-managed OAuth credentials.z&hermes auth add xai-oauth --type oauthc                D    t        j                         | _        d | _        y N)	threadingLock_lock_poolselfs    P/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/proxy/adapters/xai.py__init__zXAIGrokAdapter.__init__$   s    ^^%
/3
    c                     y)Nxai r   s    r   namezXAIGrokAdapter.name(   s    r   c                     y)NzxAI Grok OAuthr"   r   s    r   display_namezXAIGrokAdapter.display_name,   s    r   c                    t         S r   )r   r   s    r   allowed_pathszXAIGrokAdapter.allowed_paths0   s    r   c                \    | j                         }t        |xr |j                               S r   )
_load_poolboolhas_available)r   pools     r   is_authenticatedzXAIGrokAdapter.is_authenticated4   s'     D1T//122r   c                
   | j                   5  | j                         }||j                         st        d      |j	                         }|t        d      || _        | j                  |      cd d d        S # 1 sw Y   y xY w)NzSNo xAI OAuth credentials found. Run `hermes auth add xai-oauth --type oauth` first.zNo available xAI OAuth credentials found. Run `hermes auth reset xai-oauth` or re-authenticate with `hermes auth add xai-oauth --type oauth`.)r   r)   has_credentialsRuntimeErrorselectr   _credential_from_entry)r   r,   entrys      r   get_credentialzXAIGrokAdapter.get_credential8   s    ZZ 	6??$D|4#7#7#9"F 
 KKME}"@  DJ..u5#	6 	6 	6s   A"A99Bc                  |dvry | j                   5  | j                  xs | j                         }|
	 d d d        y |dk(  r|j                  |      }n$|j	                         }||j                  |      }|
	 d d d        y | j                  |      }|j                  |j                  k(  r
	 d d d        y t        j                  d|       |cd d d        S # 1 sw Y   y xY w)N>       r7   )status_codezFproxy: xAI upstream returned %s; retrying with rotated pool credential)	r   r   r)   mark_exhausted_and_rotatetry_refresh_currentr2   bearerloggerinfo)r   failed_credentialr8   r,   	refreshed
retry_creds         r   get_retry_credentialz#XAIGrokAdapter.get_retry_credentialL   s     j(ZZ 	::2!2D|	 	
 c! !::{:S	 446	$ $ > >; > WI 	 	" 44Y?J  $5$<$<<'	 	( KKX 1	 	 	s   "C?C+C9CC#c                z    	 t        t              S # t        $ r }t        j	                  d|       Y d }~y d }~ww xY w)Nz3proxy: failed to load xAI OAuth credential pool: %s)r   _POOL_PROVIDER	Exceptionr<   warning)r   excs     r   r)   zXAIGrokAdapter._load_poolo   s5    	^,, 	NNPRUV	s    	:5:c           	     x   t        |dd       xs t        |dd      xs d}t        |      j                         }|st        d      t        |dd       xs t        |dd       xs t        }t        |xs t              j                         j                  d      }t        ||xs t        t        |dd       	      S )
Nruntime_api_keyaccess_token zxAI OAuth credential pool entry did not contain an access token. Re-authenticate with `hermes auth add xai-oauth --type oauth`.runtime_base_urlbase_url/
expires_at)r;   rL   rN   )getattrstrstripr0   r	   rstripr   )r   r3   r;   rL   s       r   r2   z%XAIGrokAdapter._credential_from_entryv   s    E,d3 unb1 	
 V""$Q  E-t4 *uj$/*) 	
 x=#=>DDFMMcR!;!;ulD9
 	
r   N)returnNone)rS   rP   )rS   r   )rS   r*   )rS   r   )r>   r   r8   intrS   zOptional[UpstreamCredential])rS   zOptional[CredentialPool])r3   r   rS   r   )__name__
__module____qualname____doc__	auth_hintr   propertyr#   r%   r'   r-   r4   rA   r)   r2   r"   r   r   r   r      s    K8I4        36(! .! 	!
 
&!F
r   r   )rY   
__future__r   loggingr   typingr   r   agent.credential_poolr   r   r   hermes_cli.authr	   hermes_cli.proxy.adapters.baser
   r   	getLoggerrV   r<   rC   	frozensetr   __annotations__r   __all__r"   r   r   <module>rf      sh    & "   & M M 6 N			8	$
 "+" o
_ o
d 
r   