
    `gj                        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	 ddl
mZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ  ej4                  e      Z eh d      Zded	<    G d
 de      Z dgZ!y)a   Nous Portal upstream adapter.

Reads the user's Nous OAuth state from ``~/.hermes/auth.json`` through the
shared runtime resolver, validates or refreshes the inference JWT, then exposes
the upstream base URL plus bearer for the proxy server to forward to.
    )annotationsN)AnyDict	FrozenSetOptional)	AuthErrorDEFAULT_NOUS_INFERENCE_URL_load_auth_store_auth_store_lock_is_terminal_nous_refresh_error_nous_inference_env_override_quarantine_nous_oauth_state_quarantine_nous_pool_entries_save_auth_store)_validate_nous_inference_url_from_network_write_shared_nous_state resolve_nous_runtime_credentials)UpstreamAdapterUpstreamCredential>   /models/embeddings/completions/chat/completionsFrozenSet[str]_ALLOWED_PATHSc                      e 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
	 	 	 ddZddZddd	 	 	 	 	 	 	 ddZy)NousPortalAdapterz1Proxy upstream for the Nous Portal inference API.c                6    t        j                         | _        y N)	threadingLock_lockselfs    X/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/proxy/adapters/nous_portal.py__init__zNousPortalAdapter.__init__0   s     ^^%
    c                     y)Nnous r#   s    r%   namezNousPortalAdapter.name5   s    r'   c                     y)NzNous Portalr*   r#   s    r%   display_namezNousPortalAdapter.display_name9   s    r'   c                    t         S r   )r   r#   s    r%   allowed_pathszNousPortalAdapter.allowed_paths=   s    r'   c                    | j                         }|yt        |j                  d      xs$ |j                  d      xr |j                  d            S )NF	agent_keyrefresh_tokenaccess_token)_read_stateboolget)r$   states     r%   is_authenticatedz"NousPortalAdapter.is_authenticatedA   sS      "= IIk" J		/*Huyy/H
 	
r'   c                "    | j                         S r   )_get_credentialr#   s    r%   get_credentialz NousPortalAdapter.get_credentialL   s    ##%%r'   c               `    |}|dk7  ry t         j                  d       | j                  d      S )Ni  zAproxy: Nous upstream rejected bearer; force-refreshing invoke JWTTforce_refresh)loggerinfor:   )r$   failed_credentialstatus_code_s       r%   get_retry_credentialz&NousPortalAdapter.get_retry_credentialO   s<     #WX## $ 
 	
r'   Fr=   c               ^   | j                   5  | j                         }|t        d      	 t        |      }|j                  d      }|st        d      t               xs" t        |j                  d	            xs t        }|j                  d
      }t        |||j                  d            cd d d        S # t        $ rA}t        |      r"t        ||d       | j                  ||d       t        d|       |d }~wt        $ r}t        d|       |d }~ww xY w# 1 sw Y   y xY w)Nz>Not logged into Nous Portal. Run `hermes auth add nous` first.r=   proxy_refresh_failurereasonquarantine_errorquarantine_reasonz+Failed to refresh Nous Portal credentials: api_keyziNous Portal refresh did not return a usable inference JWT. Try `hermes auth add nous` to re-authenticate.base_url/
expires_at)bearerrM   rO   )r"   r4   RuntimeErrorr   r   r   r   _save_state	Exceptionr6   r   r   r	   rstripr   )r$   r>   r7   	refreshedexcruntime_keyrM   s          r%   r:   z!NousPortalAdapter._get_credential]   s`   
 ZZ 9	$$&E}"T <"/	. $--	2K"E  -. .<Y]]:=VW.- 
  s+H%"!$==6k9	 9	  23706
 $$),*A % 
 #A#G  "A#G59	 9	s:   D#B;A9D#;	D <D  D DD  D##D,c                2   	 t               5  t               }d d d        j                  d      xs i }|j                  d      }t        |t              sy t        |      S # 1 sw Y   KxY w# t        $ r }t        j	                  d|       Y d }~y d }~ww xY w)Nz$proxy: failed to load auth store: %s	providersr)   )r   r
   rS   r?   warningr6   
isinstancedict)r$   storerV   rY   r7   s        r%   r4   zNousPortalAdapter._read_state   s    	!# +(*+
 IIk*0b	f%%&E{+ + 	NNA3G	s-   
A- A!A- !A*&A- -	B6BBNrI   c               .   	 t               5  t               }||rt        |||       |j                  di       }||d<   t	        |       d d d        t        |       y # 1 sw Y   xY w# t        $ r }t        j                  d|       Y d }~y d }~ww xY w)NrG   rY   r)   z2proxy: failed to persist Nous quarantine state: %s)	r   r
   r   
setdefaultr   r   rS   r?   rZ   )r$   r7   rJ   rK   r]   rY   rV   s          r%   rR   zNousPortalAdapter._save_state   s    	V!# 
((*#/4E1(0
 ",,["=	$)	&! '
( %U+
( 
(  	VNNOQTUU	Vs.   
A+ ?AA+ A($A+ +	B4BB)returnNone)r`   str)r`   r   )r`   r5   )r`   r   )rA   r   rB   intr`   zOptional[UpstreamCredential])r>   r5   r`   r   )r`   zOptional[Dict[str, Any]])r7   zDict[str, Any]rJ   zOptional[AuthError]rK   zOptional[str]r`   ra   )__name__
__module____qualname____doc__r&   propertyr+   r-   r/   r8   r;   rD   r:   r4   rR   r*   r'   r%   r   r   -   s    ;&
      	
&
 .
 	

 
&
" $> > 
	>J" 15+/VV .	V
 )V 
Vr'   r   )"rg   
__future__r   loggingr    typingr   r   r   r   hermes_cli.authr   r	   r
   r   r   r   r   r   r   r   r   r   hermes_cli.proxy.adapters.baser   r   	getLoggerrd   r?   	frozensetr   __annotations__r   __all__r*   r'   r%   <module>rr      sz    #   1 1    O			8	$
 "+" WV WVt 
r'   