
    dhM              	       <   S SK r S SKJrJrJrJrJrJrJrJ	r	J
r
JrJrJr  S SKrS SKJr  S SKJrJr  S SKJrJr  S SKJr  S SKJrJrJrJrJrJrJ r J!r!J"r"J#r#  S SK$J%r%J&r&J'r'  S S	K(J)r)J*r*  S S
K+J,r,J-r-J.r.J/r/J0r0  S SK1J2r2  Sr3\ Rh                  " \55      r6S\S\\   S\4S jr7S\S\\8\4   4S jr9S\S\4S jr:S\S\4S jr;S\\   S\\   4S jr<S\Rz                  SS4S jr>S\Rz                  SS4S jr? " S S\5      r@ S!S\@S\	\\\4      S\\/\4   4S  jjrAg)"    N)AnyAsyncContextManagerAsyncIteratorCallableDictIteratorListOptionalTupleTypeUnioncast)SSEError)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelLangSmithParams)create_base_retry_decorator)
	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)convert_to_secret_strget_from_env)AliasChoices
ConfigDictField	SecretStrmodel_validator)Selfz%https://clovastudio.stream.ntruss.comssedefault_classreturnc                    U R                  5       nU R                  S:X  a  [        U5      n[        SUS9$ UR	                  S5      nUR	                  S5      nUR	                  S5      =(       d    SnUS:X  d
  U[
        :X  a	  [        US9$ US	:X  d
  U[        :X  a	  [        US9$ US
:X  d
  U[        :X  a	  [        US9$ U(       d
  U[        :X  a	  [        XeS9$ U" US9$ )Nresult )contentresponse_metadatamessageroler0   user)r0   	assistantsystem)r0   r3   )jsonevent_sse_data_to_response_metadatar   getr   r   r   )r*   r+   sse_datar1   r2   r3   r0   s          ]/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/naver.py_convert_chunk_to_message_chunkr=   5   s     xxzH
yyH:8Db<MNNll9%G;;vDkk)$*Gv~*;; 11		 ?g..		].@@!'22	"22;;W--    r;   c                     0 nSU ;   a  U S   US'   SU ;   a  U S   US'   SU ;   a  U S   US'   SU ;   a  U S   US'   SU ;   a  U S   US	'   U$ )
N
stopReasonstop_reasoninputLengthinput_lengthoutputLengthoutput_lengthseedaiFilter	ai_filter )r;   r1   s     r<   r9   r9   L   s    x+3L+A-( ,4],C.)!-5n-E/*$,V$4&!X)1*)=+&r>   r2   c                    [        U [        5      (       a  [        U R                  U R                  S9$ [        U [
        5      (       a  [        SU R                  S9$ [        U [        5      (       a  [        SU R                  S9$ [        U [        5      (       a  [        SU R                  S9$ [        R                  S5        [        SU  35      e)N)r3   r0   r4   r6   r5   zmFunctionMessage, ToolMessage not yet supported (https://api.ncloud-docs.com/docs/clovastudio-chatcompletions)zGot unknown type )
isinstancer   dictr3   r0   r   r   r   loggerwarning
ValueErrorr2   s    r<   &_convert_message_to_naver_chat_messagerQ   [   s     ';''w??	G\	*	*99	G]	+	+7??;;	GY	'	'goo>>M	
 ,WI677r>   _messagec                     U S   nUS;   d
   SU 35       e[        [        U S   5      n0 nUS:X  a
  [        UUS9$ US:X  a
  [        UUS9$ US:X  a
  [	        UUS9$ [
        R                  S	U5        [        S
U 35      e)Nr3   )r5   r6   r4   z7Expected role to be 'assistant', 'system', 'user', got r0   r4   )r0   additional_kwargsr6   r5   zGot unknown role %szGot unknown role )r   strr   r   r   rM   rN   rO   )rR   r3   r0   rT   s       r<   &_convert_naver_chat_message_to_messagerV   n   s     FD   H 
AG	H 
 3+,G v~/
 	
 
	/
 	
 
	/
 	

 	,d3,TF344r>   event_source_mgrc                  #    U  ISh  vN n[        UR                  5      I Sh  vN   UR                  5         Sh  vN nUR                  5       nUR                  S:X  a(  UR                  S0 5      S:X  a    SSS5      ISh  vN   gUR                  S:X  a  [        UR                  S9eU7v   M{   N N Nz N5
 SSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f7f)z$Iterate over the server-sent events.Nsignaldata[DONE]errorrP   )_araise_on_errorresponse	aiter_sser7   r8   r:   r   rZ   )rW   event_sourcer*   
event_datas       r<   
_aiter_sserb      s       <|44555%//1 	#JyyH$)Cx)O   yyG#sxx00I  5	  1  s   C+B6C+CB8CB>B: B>8C;C+B<C+*C6C+8C:B><C+>C?C+
CC+C(CC($C+r^   c                    [         R                  R                  U R                  5      (       a\  U R	                  5       R                  S5      n[         R                  " SU R                   SU R                   SU 3U R                  U S9eg)+Raise an error if the response is an error.utf-8Error response  while fetching : requestr^   N)	httpxcodesis_errorstatus_codereaddecodeHTTPStatusErrorurlrj   r^   error_messages     r<   _raise_on_errorru      s~    {{H0011 ..w7##h223 4&ll^2m_>$$	
 	
 2r>   c                 4  #    [         R                  R                  U R                  5      (       ad  U R	                  5       I Sh  vN R                  S5      n[         R                  " SU R                   SU R                   SU 3U R                  U S9eg NQ7f)rd   Nre   rf   rg   rh   ri   )	rk   rl   rm   rn   areadrp   rq   rr   rj   rs   s     r<   r]   r]      s     {{H0011'~~//77@##h223 4&ll^2m_>$$	
 	
 2/s   ABBABc                   :  ^  \ rS rSr% Sr\" SS9r\\R                     \
S'   \" SS9r\\R                     \
S'   \" S\" SS	5      S
S9r\\
S'   \" SSS9r\\   \
S'   \" SSS9r\\
S'   \" SSS9r\\   \
S'    \" SSS9r\\   \
S'    \" SSS9r\\
S'    \" SSSS9r\\   \
S'   \" SSSS 9r\\   \
S!'   \" SSS"S 9r\\   \
S#'   \" SS$S%S9r\\   \
S&'   \" SS'S(S 9r\\   \
S)'   \" SS*S9r\\\      \
S+'   \" SS9r \\   \
S,'   \" SS-SS 9r!\\   \
S.'   \" SS/S09r"\\
S1'   \" S2S3S49r#\\
S5'   \$" S6S7S89r%\&S9\'\\(4   4S: j5       r)\&S9\'\\(4   4S; j5       r*\&S9\'\\4   4S< j5       r+\&S9\4S= j5       r, STS*\\-\      S>\(S9\.4U 4S? jjjr/\&S9\'\\(4   4S@ j5       r0\&S9\4SA j5       r1\2" SBSC9S9\34SD j5       r4S9\4SE jr5SUSF jr6S9\'\\(4   4SG jr7SH\-\8   S*\\-\      S9\9\-\'   \'\\(4   4   4SI jr:S>\(S9\(4SJ jr; STSK\\<   S>\(S9\(4SL jjr=SM\'S9\>4SN jr?  SVSH\-\8   S*\\-\      SK\\@   S>\(S9\>4
SO jjrA  SVSH\-\8   S*\\-\      SK\\@   S>\(S9\B\C   4
SP jjrD  SVSH\-\8   S*\\-\      SK\\<   S>\(S9\>4
SQ jjrE  SVSH\-\8   S*\\-\      SK\\<   S>\(S9\F\C   4
SR jjrGSSrHU =rI$ )W
ChatClovaX   a  `NCP ClovaStudio` Chat Completion API.

following environment variables set or passed in constructor in lower case:
- ``NCP_CLOVASTUDIO_API_KEY``
- ``NCP_APIGW_API_KEY``

Example:
    .. code-block:: python

        from langchain_core.messages import HumanMessage

        from langchain_community import ChatClovaX

        model = ChatClovaX()
        model.invoke([HumanMessage(content="Come up with 10 names for a song about parrots.")])
N)defaultclientasync_clientzHCX-003
model_namemodelzNCP ClovaStudio chat model name)r{   validation_aliasdescriptionz*NCP Clova Studio chat model tuning task ID)r{   r   task_idFz=false: use testapp, true: use service app on NCP Clova Studioservice_appapi_key)r{   aliasncp_clovastudio_api_keyapigw_api_keyncp_apigw_api_keyr/   base_urlg        g      ?g      ?)gtler{   temperaturer      )ger   r{   top_kg?top_p
   g      @repeat_penaltyi   d   
max_tokensstopstop_beforeinclude_ai_filtersl    rF   Z   )r   r{   timeout      )r   r{   max_retriesTrI   )populate_by_nameprotected_namespacesr,   c           	         U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  S.nUR                  5        VVs0 sH  u  p#Uc  M
  X#_M     nnnU$ s  snnf )z/Get the default parameters for calling the API.)r   topKtopPrepeatPenalty	maxTokens
stopBeforeincludeAiFiltersrF   )	r   r   r   r   r   r   r   rF   items)selfdefaultskvfiltereds        r<   _default_paramsChatClovaX._default_params   s}      ++JJJJ!00** $ 7 7II	
 &.^^%5G%5TQDAD%5G Hs   /B;Bc                 L    U R                   U R                  S'   U R                  $ )zGet the identifying parameters.r~   )r~   r   r   s    r<   _identifying_paramsChatClovaX._identifying_params   s$     .2__\*###r>   c                 >    U R                  5       (       d  SS0$ SSS.$ )Nr   NCP_CLOVASTUDIO_API_KEYNCP_APIGW_API_KEY)r   r   )_is_new_api_keyr   s    r<   
lc_secretsChatClovaX.lc_secrets  s4    ##%%)+D 
 ,E%8 r>   c                     g)zReturn type of chat model.z
chat-naverrI   r   s    r<   	_llm_typeChatClovaX._llm_type  s     r>   kwargsc                 6   > [         TU ]  " SSU0UD6nSUS'   U$ )z,Get the parameters used to invoke the model.r   naverls_providerrI   )super_get_ls_params)r   r   r   params	__class__s       r<   r   ChatClovaX._get_ls_params  s+     '<T<V< '}r>   c                     U R                   $ )z'Get the parameters used for the client.)r   r   s    r<   _client_paramsChatClovaX._client_params  s     ###r>   c                     U R                   (       a  SOSnU R                  (       a  U R                   SU SU R                   S3$ U R                   SU SU R                   3$ )zGET chat completion api url
serviceapptestapp/z
/v1/tasks/z/chat-completionsz/v1/chat-completions/)r   r   r   r~   )r   app_types     r<   _api_urlChatClovaX._api_url$  sa     $(#3#3<<<==/8*Jt||nDUV mm_AhZ/DT__DUVVr>   after)modec                    U R                   (       d  U R                  (       d  [        S5      eU R                  (       d  [	        [        SS5      5      U l        U R                  5       (       d  U R                  5         U R                  (       d  [        SS[        5      U l        U R                  (       d=  [        R                  " U R                  U R                  5       U R                  S9U l
        U R                  (       d=  [        R                   " U R                  U R                  5       U R                  S9U l        U $ )Nz6either model_name or task_id must be assigned a value.r   r   r   NCP_CLOVASTUDIO_API_BASE_URL)r   headersr   )r~   r   rO   r   r"   r#   r   _init_fields_on_old_api_keyr   _DEFAULT_BASE_URLr|   rk   Clientdefault_headersr   r}   AsyncClientr   s    r<   validate_model_afterChatClovaX.validate_model_after0  s    4<<UVV+++@68QR,D( ##%%,,.}}(:<MDM {{,,,,.DK    % 1 1,,.!D r>   c                 x    U R                   (       a)  U R                   R                  5       R                  S5      $ g)Nznv-F)r   get_secret_value
startswithr   s    r<   r   ChatClovaX._is_new_api_keyR  s.    ''//@@BMMeTTr>   c                 ^    U R                   (       d  [        [        SSS5      5      U l         g g )Nr   r   r/   )r   r"   r#   r   s    r<   r   &ChatClovaX._init_fields_on_old_api_keyX  s+    %%%:02ErJ&D" &r>   c                 .   SSS.nU R                   (       a  U R                   R                  5       OS nU R                  5       (       a
  SU 3US'   U$ U(       a  X!S'   U R                  (       a  U R                  R                  5       OS nU(       a  X1S'   U$ )Nzapplication/json)zContent-TypeAcceptzBearer AuthorizationzX-NCP-CLOVASTUDIO-API-KEYzX-NCP-APIGW-API-KEY)r   r   r   r   )r   r   clovastudio_api_keyr   s       r<   r   ChatClovaX.default_headers^  s    .(
 ++ ((99; 	 !!)01D0E'FGO$  #7J34 )) &&779 
 1>-.r>   messagesc                 x    U R                   nUb
  SU;   a  X#S'   U Vs/ sH  n[        U5      PM     nnXS4$ s  snf )Nr   )r   rQ   )r   r   r   r   mmessage_dictss         r<   _create_message_dicts ChatClovaX._create_message_dicts|  sM     $$ 6#'< LTUHq?BHU$$ Vs   7c                 0  ^ ^^^ SSK JnJm  ST;  a  STS'   TS   n[        [        R
                  T R                  5      mU(       a  S[        U   4UUUU 4S jjnU" 5       $ TR                  T R                  TS9n[        U5        UR                  5       $ )Nr   )ServerSentEventconnect_ssestreamFr,   c               3     >#    T" TSTR                   TS9 n [        U R                  5        U R                  5        Hj  nUR	                  5       nUR
                  S:X  a   UR                  S0 5      S:X  a
    S S S 5        g UR
                  S:X  a  [        UR                  S9eUv   Ml     S S S 5        g ! , (       d  f       g = f7f)NPOSTr7   rY   rZ   r[   r\   rP   )	r   ru   r^   iter_sser7   r8   r:   r   rZ   )r`   r*   ra   r|   r   r   r   s      r<   r   3ChatClovaX._completion_with_retry.<locals>.iter_sse  s      FDMM!#L$9$9:+446%(XXZ
II1 *vr :h F"  99/"*388"<<!	  7	  s)   CA B47	C +B4+	C4
C>Crr   r7   )	httpx_sser   r   r   rk   r   r|   r   postr   ru   r7   )r   r   r   r   r   r^   r|   r   s   ``    @@r<   _completion_with_retry!ChatClovaX._completion_with_retry  s    	

 6!$F8!ellDKK0"h7 " "  :{{t}}6{BHH%==?"r>   run_managerc                    ^ ^#    SSK Jm   [        T US9nUS[        S[        4UU 4S jj5       nU" S0 UD6I S h  vN $  N7f)Nr   )aconnect_sse)r   r   r,   c                  P  >#    SU ;  a  SU S'   U S   n[        [        R                  TR                  5      nU(       a  T" USTR                  U S9n[        U5      $ UR                  TR                  U S9I S h  vN n[        U5      I S h  vN   UR                  5       $  N' N7f)Nr   Fr   r   r   )	r   rk   r   r}   r   rb   r   r]   r7   )r   r   r}   r`   r^   r   r   s        r<   r   BChatClovaX._acompletion_with_retry.<locals>._completion_with_retry  s     v%#(x H%F 1 143D3DEL+ &$--f  ",//!-!2!2t}}6!2!RR&x000}}& S0s$   A7B&:B";B&B$B&$B&rI   )r   r   _create_retry_decoratorr   )r   r   r   retry_decoratorr   r   s   `    @r<   _acompletion_with_retry"ChatClovaX._acompletion_with_retry  sP     
 	+>1$KP		'3 	'3 	' 
	' ,5f5555s   7AA Ar^   c                    / nUR                  S0 5      nUR                  S0 5      n[        U5      n[        U[        5      (       aJ  UR                  S5      UR                  S5      UR                  S5      UR                  S5      -   S.Ul        [        US9nUR                  U5        UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S	5      S
.n[        X'S9$ )Nr.   r2   rB   rD   )input_tokensoutput_tokenstotal_tokensrP   r@   rF   rG   )rA   rC   rE   rF   rH   )generations
llm_output)r:   rV   rK   r   usage_metadatar   appendr!   )r   r^   r  r.   msgr2   genr  s           r<   _create_chat_resultChatClovaX._create_chat_result  s    h+jjB'8=gy)) &

= 9!'N!; &

= 9FJJ~<V V&G" 
 	3 "::l3"JJ}5#ZZ7JJv&J/

 kIIr>   c                 ~    U R                  X5      u  pV0 UEUEnU R                  " SSU0UD6nU R                  U5      $ )Nr   rI   )r   r   r  r   r   r   r   r   r   r   r^   s           r<   	_generateChatClovaX._generate  sO     !% : :8 J%F%f%..PPP''11r>   c              +   .  #    U R                  X5      u  pV0 UEUESS0En[        nU R                  " SXSS.UD6 HV  n[        X5      n	U	R                  n[        U	S9n
U(       a(  UR                  [        [        U	R                  5      U
S9  U
v   MX     g 7fNr   Tr   r   rP   )tokenchunkrI   )
r   r   r   r=   r   r    on_llm_new_tokenr   rU   r0   )r   r   r   r   r   r   r   default_chunk_classr*   	new_chunk	gen_chunks              r<   _streamChatClovaX._stream  s      !% : :8 J5F5f5h56D.. 
"
?E
C 8QI"+"5"5+I>I,,sI$5$56i -  O
s   BBc                    #    U R                  X5      u  pV0 UEUEnU R                  " SXSS.UD6I S h  vN nU R                  U5      $  N7f)Nr  rI   )r   r   r  r  s           r<   
_agenerateChatClovaX._agenerate  sf      !% : :8 J%F%f%55 
"
?E
 
 ''11	
s   1AA	Ac                f  #    U R                  X5      u  pV0 UEUESS0En[        nU R                  " SXSS.UD6I S h  vN   S h  vN n[        X5      n	U	R                  n[        U	S9n
U(       a0  UR                  [        [        U	R                  5      U
S9I S h  vN   U
7v   Mg   Nk Nd N
 g 7fr  )
r   r   r   r=   r   r    r  r   rU   r0   )r   r   r   r   r   r   r   r  r  r  r  s              r<   _astreamChatClovaX._astream  s      !% : :8 J5F5f5h56D!%!=!= "
""
?E"
 
 
 	% 8SI"+"5"5+I>I!22sI$5$56i 3    O
 	
sF   ;B1B)B1B/B+B/
AB1B-B1+B/-B1/B1)r}   r   r|   r   r   N)r,   N)NN)J__name__
__module____qualname____firstlineno____doc__r&   r|   r
   rk   r   __annotations__r}   r   r$   r~   rU   r   r   boolr   r'   r   r   r   floatr   intr   r   r   r   listr   rF   r   r   r%   model_configpropertyr   r   r   r   r   r   r	   r   r   r   r   r(   r)   r   r   r   r   r   r   r   r   r   r   r!   r  r   r  r   r    r  r  r   r!  __static_attributes____classcell__)r   s   @r<   ry   ry      s   " &+4%8FHU\\"805d0CL(5,,-C%lG<5J 
 #"NGXc]  SK 
 49Y3WXi0WX-24-Wx	*WR"J7Hc7 $)CC#EK%E A#q9E8C=9"aC=E8E?=&+sr3&GNHUOG %tS AJA',T'HK$s)$H).u)==1Q?D(3-?Ar*GS*1-K-t"MLc3h   $T#s(^ $ $
 	DcN 	 	 3  
 +/T#Y':=	  $S#X $ $ 	W# 	W 	W '"d  #B c3h <%[)%19$s)1D%	tDz4S>)	*%!#s !#s !#J @D6;<6 6 
	68JD JZ J< %):>	2{#2 tCy!2 67	2
 2 
2" %):>	{# tCy! 67	
  
%	&8 %)?C	2{#2 tCy!2 ;<	2
 2 
2& %)?C	{# tCy! ;<	
  
*	+ r>   ry   llmr   c                 j    [         R                  [         R                  /n[        X R                  US9$ )zFReturns a tenacity retry decorator, preconfigured to handle exceptions)error_typesr   r   )rk   RequestErrorStreamErrorr   r   )r2  r   errorss      r<   r   r   1  s0       %"3"34F&[ r>   r#  )Bloggingtypingr   r   r   r   r   r   r	   r
   r   r   r   r   rk   r   r   langchain_core.callbacksr   r   *langchain_core.language_models.chat_modelsr   r   #langchain_core.language_models.llmsr   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   langchain_core.outputsr   r    r!   langchain_core.utilsr"   r#   pydanticr$   r%   r&   r'   r(   typing_extensionsr)   r   	getLoggerr$  rM   r=   rU   r9   rQ   rV   rb   Responseru   r]   ry   r   rI   r>   r<   <module>rD     sz         V K   S R D  #; 			8	$.	.!"23...T d38n 88	8&555@)#.4	
enn 	
 	
	
U^^ 	
 	
y y@ 			+-EEF
 seSjr>   