
    $jq,                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZmZmZmZmZ ddlZdZ e	j        d	          Zd
Z G d ded          Z G d ded          Z G d ded          Z G d de          Z G d de          Z d9dZ!d:dZ"d;dZ#d<d!Z$d=d"Z%d>d%Z&d?d(Z'd@d+Z(dAd.Z)dBd2Z*dCd6Z+ G d7 d8          Z,dS )Dz1LangSmith profile configuration and auth helpers.    )annotationsN)Mapping)Path)Any
NamedTupleOptional	TypedDictcastzlangsmith-cli   )minutes
   c                  .    e Zd ZU ded<   ded<   ded<   dS )ProfileOAuthstraccess_tokenrefresh_token
expires_atN__name__
__module____qualname____annotations__     e/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/langsmith/_internal/_profiles.pyr   r      s1         OOOOOr   r   F)totalc                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )ProfileConfigr   api_keyapi_urlworkspace_idr   oauthNr   r   r   r   r   r      s<         LLLLLLr   r   c                  $    e Zd ZU ded<   ded<   dS )ProfileConfigFiler   current_profilezdict[str, ProfileConfig]profilesNr   r   r   r   r$   r$   !   s*         &&&&&&r   r$   c                  .    e Zd ZU ded<   ded<   ded<   dS )ProfileStater   pathr$   configr   profile_nameNr   r   r   r   r(   r(   &   s3         JJJr   r(   c                      e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
d	ed
<   edd            ZdS )ProfileClientConfigNOptional[str]r    r   r!   oauth_access_tokenoauth_refresh_tokenoauth_expires_atOptional[ProfileState]profile_statereturnboolc                8    t          | j        p| j                  S N)r5   r/   r0   selfs    r   	has_oauthzProfileClientConfig.has_oauth5   s    D+Gt/GHHHr   r4   r5   )r   r   r   r    r   r   r!   r/   r0   r1   r3   propertyr:   r   r   r   r-   r-   ,   s         !G!!!!!G!!!!"&L&&&&(,,,,,)-----&*****,0M0000I I I XI I Ir   r-   valuer.   r4   c                    | sd S |                                                       d                               d          }|pd S )N"')strip)r=   trimmeds     r   trim_auth_valuerC   :   sB     tkkmm!!#&&,,S11G?dr   Optional[Path]c                     t           j                            d          x} rt          |           S 	 t          j                    dz  dz  S # t
          $ r Y d S w xY w)NLANGSMITH_CONFIG_FILEz
.langsmithzconfig.json)osenvirongetr   homeRuntimeError)config_files    r   _profile_config_pathrM   A   si    jnn%<==={ !K   y{{\)M99   tts   A 
AAr2   c                    t                      } | |                                 sd S 	 t          j        |                     d                    }n# t
          t          j        f$ r Y d S w xY wt          |t                    sd S |	                    d          }t          |t                    sd S t          j        	                    d          }|s5|	                    d          }t          |t                    r|r|}nd|v rd}|r(t          |	                    |          t                    sd S t          | t          t          |          |          S )Nutf-8encodingr&   LANGSMITH_PROFILEr%   default)rM   existsjsonloads	read_textOSErrorJSONDecodeError
isinstancedictrI   rG   rH   r   r(   r
   r$   )r)   rawr&   r+   r%   s        r   _load_profile_stater]   J   sU   !!D|4;;==|tj99::T)*   ttc4   twwz""Hh%% t:>>"566L %''"344os++ 	% 	%*LL(""$L z(,,|*D*DdKK td#4c::LIIIs   (A A+*A+stateOptional[ProfileConfig]c                    | j                             d          pi }|                    | j                  }t          |t                    sd S t          t          |          S )Nr&   )r*   rI   r+   rZ   r[   r
   r   )r^   r&   profiles      r   _profile_from_staterb   c   sW    |
++1rHll5-..Ggt$$ tw'''r   c                    t                      } | t                      S t          |           }|t                      S |                    d          pi }t          |                    d          t	          |                    d                    |                    d          t	          |                    d                    t	          |                    d                    |                    d          |           S )	Nr"   r    r   r!   r   r   r   )r    r   r!   r/   r0   r1   r3   )r]   r-   rb   rI   rC   )r^   ra   r"   s      r   load_profile_client_configrd   k   s    !!E}"$$$!%((G"$$$KK  &BEI&&I 6 677[[00*599^+D+DEE+EIIo,F,FGG<00   r   r    r   c                    |                      d          r| d d         } |                      d          d}|                      |          r| d t          |                    S | S )N/z/api/v1)endswithlen)r    suffixs     r   _normalize_profile_api_urlrk   ~   st    


3

 #2#, 

3

 F '~#f++~&&Nr   r   Optional[datetime.datetime]c                    	 t           j                             |                     dd                    }n# t          $ r Y d S w xY w|j        %|                    t           j        j                  }|S )NZ+00:00)tzinfo)datetimefromisoformatreplace
ValueErrorrp   timezoneutc)r   parseds     r   _parse_profile_expires_atrx      sw    "001C1CC1R1RSS   tt}x'8'<==Ms   36 
AAra   r5   c                X   |                      d          pi }|                     d          sdS |                     d          sdS |                     d          }|sdS t          |          }|dS |t          j                            t          j        j                  t          z   k    S )Nr"   r   Fr   Tr   )rI   rx   rq   nowru   rv   _TOKEN_REFRESH_LEEWAY)ra   r"   r   rw   s       r   should_refresh_profile_tokenr|      s    KK  &BE99_%% u99^$$ t<((J u&z22F~u(#''(9(=>>AVVVr   r   Optional[dict[str, Any]]c                   t          | pd          }	 t          j        | ddt          |dddit                    }n# t          j        $ r Y d S w xY w|j        dk     s|j        d	k    rd S 	 |                                }n# t          $ r Y d S w xY wt          |t                    r|                    d
          sd S |S )Nzhttps://api.smith.langchain.comz/oauth/tokenr   )
grant_type	client_idr   zContent-Typez!application/x-www-form-urlencoded)dataheaderstimeout   i,  r   )rk   requestspost_OAUTH_CLIENT_ID_TOKEN_REFRESH_TIMEOUTRequestExceptionstatus_coderU   rt   rZ   r[   rI   )r    r   refresh_urlresponsetokens        r   _refresh_profile_oauth_tokenr      s    -44 K=(((--!. 
 $%HI*	
 	
 	
 $   ttc!!X%9S%@%@t   tteT"" %))N*C*C tLs!   +? AA.B 
BBr   Mapping[str, Any]Nonec                J   |                      di           }|                    d          }t          |t                    r|r||d<   |                    d          }t          |t                    r|r||d<   |                    d          }t          |t          t
          f          rw|dk    rst          j                            t          j        j	                  t          j
        |          z   }|                                                    dd          |d	<   d S d S d S )
Nr"   r   r   
expires_inr   )secondsro   rn   r   )
setdefaultrI   rZ   r   intfloatrq   rz   ru   rv   	timedelta	isoformatrs   )ra   r   r"   r   r   r   r   s          r   _apply_profile_token_responser      s*    w++E99^,,L,$$ - - ,nIIo..M-%% /- /!.o<((J*sEl++ L
Q&**8+<+@AAHDVE
 E
 E
 

 )2244<<XsKKl	L Lr   r)   r   r*   c                x   	 | j                             ddd           |                     | j         d          }|                    t          j        |d          dz   d	           t          j        |d
           t          j	        ||            t          j        | d
           d S # t          $ r Y d S w xY w)Ni  T)modeparentsexist_okz.tmp   )indent
rO   rP   i  )parentmkdir	with_namename
write_textrU   dumpsrG   chmodrs   rX   )r)   r*   	temp_paths      r   _save_profile_configr      s    udTBBBNNdi#5#5#566	TZq999D@7SSS
E"""

9d###
u   s   B'B+ +
B98B9c                      e Zd Z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d(dZd)dZd*dZd+dZd,dZd-dZd.d Zd!S )/ProfileAuthr*   r-   api_key_headerr   r4   r   c                   |j         | _        || _        t          j                    | _        t                      | _        |                     | 	                    d                     d S NFrefresh)
r3   _state_api_key_header	threadingLock_lockset_managed_auth_headers_remember_auth_headers_auth_headers)r9   r*   r   s      r   __init__zProfileAuth.__init__   s\     *-^%%
;>55"##D$6$6u$6$E$EFFFFFr   r5   c                F   |                                  }|dS |                    d          pi }t          t          |                    d                    pCt          |                    d                    p!t          |                    d                              S )NFr"   r   r   r   )_profilerI   r5   rC   )r9   ra   r"   s      r   has_authzProfileAuth.has_auth   s    --//?5G$$*EIIn5566 7uyy99::7w{{95566
 
 	
r   r.   c                    |                                  }|d S t          |                    d          pi                     d                    S )Nr"   r   )r   rC   rI   r9   ra   s     r   r/   zProfileAuth.oauth_access_token   sF    --//?4G 4 4 :??OOPPPr   c                P    |                                  }|d uot          |          S r7   )r   r|   r   s     r   needs_refreshzProfileAuth.needs_refresh   s(    --//d"L'CG'L'LLr   dict[str, str]c                \    |                      d          }|                     |           |S r   r   r   r9   r   s     r   current_auth_headersz ProfileAuth.current_auth_headers  s1    $$U$33##G,,,r   c                \    |                      d          }|                     |           |S )NTr   r   r   s     r   get_auth_headerszProfileAuth.get_auth_headers  s1    $$T$22##G,,,r   r   Mapping[str, str]c                   t          |          }t          |                                          D ]\  }}|                     ||          r||= |                     |          s'|                    |                                            |S )zBReplace stale profile-managed auth while preserving explicit auth.)r[   listitems_is_profile_auth_header_has_auth_headerupdater   )r9   r   request_headerskeyr=   s        r   prepare_request_headersz#ProfileAuth.prepare_request_headers  s    w--446677 	) 	)JC++C77 )#C($$_55 	@""4#<#<#>#>???r   r_   c                <    | j         d S t          | j                   S r7   )r   rb   r8   s    r   r   zProfileAuth._profile  s    ;4"4;///r   r   c               0   |                                  }|i S |rht          |          rY| j        5  |                                  }|$t          |          r|                     |           d d d            n# 1 swxY w Y   |                     |          S r7   )r   r|   r   _refresh_headers_from_profile)r9   r   ra   s      r   r   zProfileAuth._auth_headers  s    --//?I 	+3G<< 	+ + +--//&+G+P+P&MM'***+ + + + + + + + + + + + + + + ))'222s   ;A88A<?A<ra   r   c                   t          |                    d          pi                     d                    }|| j        d S |                    d          }t          ||          }|d S t	          ||           | j        j                            d          pi }||| j        j        <   || j        j        d<   t          | j        j        | j        j                   d S )Nr"   r   r    r&   )	rC   rI   r   r   r   r*   r+   r   r)   )r9   ra   r   r    r   r&   s         r   r   zProfileAuth._refresh&  s    '[[!!'R,,_==
 
  DK$7F++i((,WmDD=F%gu555;%))*55;-4)*)1:&T[-t{/ABBBBBr   c                    |i S t          |                    d          pi                     d                    }|rdd| iS t          |                    d                    }|r	| j        |iS i S )Nr"   r   AuthorizationzBearer r   )rC   rI   r   )r9   ra   r/   r   s       r   r   z!ProfileAuth._headers_from_profile6  s    ?I,[[!!'R,,^<<
 
  	E#%C/A%C%CDD!'++i"8"899 	3('22	r   c                    |                                 D ]J\  }}|                     |          r0|r.| j                            |                                |f           Kd S r7   )r   _is_auth_header_namer   addlower)r9   r   r   r=   s       r   r   z"ProfileAuth._remember_auth_headersC  so    "==?? 	F 	FKD%((.. F5 F*..

e/DEEE	F 	Fr   r   r=   c                <    |                                 |f| j        v S r7   )r   r   )r9   r   r=   s      r   r   z#ProfileAuth._is_profile_auth_headerH  s    

e$(BBBr   c                ^     t           fd|                                D                       S )Nc              3  f   K   | ]+\  }}                     |          ot          |          V  ,d S r7   )r   r5   ).0r   r=   r9   s      r   	<genexpr>z/ProfileAuth._has_auth_header.<locals>.<genexpr>L  sT       
 
e %%d++;U
 
 
 
 
 
r   )anyr   r   s   ` r   r   zProfileAuth._has_auth_headerK  sC     
 
 
 
&}}
 
 
 
 
 	
r   c                `    |                                 d| j                                         hv S )Nauthorization)r   r   )r9   r   s     r   r   z ProfileAuth._is_auth_header_nameQ  s)    zz||1E1K1K1M1MNNNr   N)r*   r-   r   r   r4   r   r;   )r4   r.   )r4   r   )r   r   r4   r   )r4   r_   )r   r5   r4   r   )ra   r   r4   r   )ra   r_   r4   r   )r   r   r4   r   )r   r   r=   r   r4   r5   )r   r   r4   r5   )r   r   r4   r5   )r   r   r   r   r<   r   r/   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sv       
G 
G 
G 
G 	
 	
 	
 X	
 Q Q Q XQM M M M   
   
   0 0 0 0
	3 	3 	3 	3C C C C    F F F F
C C C C
 
 
 
O O O O O Or   r   )r=   r.   r4   r.   )r4   rD   )r4   r2   )r^   r(   r4   r_   )r4   r-   )r    r   r4   r   )r   r   r4   rl   )ra   r   r4   r5   )r    r.   r   r   r4   r}   )ra   r   r   r   r4   r   )r)   r   r*   r$   r4   r   )-__doc__
__future__r   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arrq   rU   rG   r   collections.abcr   pathlibr   typingr   r   r   r	   r
   r   r   r   r{   r   r   r   r$   r(   r-   rC   rM   r]   rb   rd   rk   rx   r|   r   r   r   r   r   r   r   <module>r      s   7 7 " " " " " "                				     # # # # # #       = = = = = = = = = = = = = = " **1555      9E        IU    ' ' ' ' '	 ' ' ' '
    :   I I I I I* I I I      J J J J2( ( ( (   &         "   <L L L L$	 	 	 	tO tO tO tO tO tO tO tO tO tOr   