
    ihM              	       *   d dl 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Zd dlmZ d dlmZmZ d dlmZmZ d dl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# d dl$m%Z%m&Z&m'Z' d d	l(m)Z)m*Z* d d
l+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2 dZ3 e jh                  e5      Z6dedee   defdZ7dedee8ef   fdZ9dedefdZ:dedefdZ;dee   dee   fdZ<dejz                  ddfdZ>dejz                  ddfdZ? G d de      Z@	 d!de@de	eeef      deegef   fd ZAy)"    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                    | j                         }| j                  dk(  rt        |      }t        d|      S |j	                  d      }|j	                  d      }|j	                  d      xs d}|dk(  s	|t
        k(  rt        |      S |d	k(  s	|t        k(  rt        |      S |d
k(  s	|t        k(  rt        |      S |s	|t        k(  rt        ||      S  ||      S )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          c/var/www/html/dev/engine/venv/lib/python3.12/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d;;W--    r;   c                     i }d| v r| d   |d<   d| v r| d   |d<   d| v r| d   |d<   d| v r| d   |d<   d| v r| d   |d	<   |S )
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                    t        | t              r!t        | j                  | j                        S t        | t
              rt        d| j                        S t        | t              rt        d| j                        S t        | t              rt        d| j                        S t        j                  d       t        d|        )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                    | d   }|dv s
J d|        t        t        | d         }i }|dk(  rt        ||      S |dk(  rt        ||      S |dk(  rt	        ||      S t
        j                  d	|       t        d
|       )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                  K   | 4 d{   }t        |j                         d{    |j                         2 3 d{   }|j                         }|j                  dk(  r'|j                  di       dk(  r ddd      d{    y|j                  dk(  rt        |j                        | z7 7 7 y7 66 ddd      d{  7   y# 1 d{  7  sw Y   yxY ww)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%B5C%CB7CB=B9 B=6C9C%B;C%
+C5C%7C9B=;C%=C>C%	C
C%C"CC"C%r^   c                    t         j                  j                  | j                        r^| j	                         j                  d      }t        j                  d| j                   d| j                   d| | j                  |       y)+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 ..w7##h223 4&ll^2m_>$$	
 	
 2r>   c                 .  K   t         j                  j                  | j                        rf| j	                          d{   j                  d      }t        j                  d| j                   d| j                   d| | j                  |       y7 Sw)rd   Nre   rf   rg   rh   ri   )	rk   rl   rm   rn   areadrp   rq   rr   rj   rs   s     r<   r]   r]      s     {{H001'~~//77@##h223 4&ll^2m_>$$	
 	
 2/s   =BB ABc                   v    e Zd ZU dZ ed      Zeej                     e	d<    ed      Z
eej                     e	d<    ed edd      d	
      Zee	d<    edd      Zee   e	d<    edd      Zee	d<    edd      Zee   e	d<   	  edd      Zee   e	d<   	  edd      Zee	d<   	  eddd      Zee   e	d<    eddd      Zee   e	d <    eddd!      Zee   e	d"<    edd#d$      Zee   e	d%<    edd&d'      Zee   e	d(<    edd)      Zeee      e	d*<    ed      Zee   e	d+<    edd,d      Z ee   e	d-<    edd./      Z!ee	d0<    ed1d23      Z"ee	d4<    e#d5d67      Z$e%d8e&ee'f   fd9       Z(e%d8e&ee'f   fd:       Z)e%d8e&eef   fd;       Z*e%d8efd<       Z+	 dRd)ee,e      d=e'd8e-f fd>Z.e%d8e&ee'f   fd?       Z/e%d8efd@       Z0 e1dAB      d8e2fdC       Z3d8efdDZ4dSdEZ5d8e&ee'f   fdFZ6dGe,e7   d)ee,e      d8e8e,e&   e&ee'f   f   fdHZ9d=e'd8e'fdIZ:	 dRdJee;   d=e'd8e'fdKZ<dLe&d8e=fdMZ>	 	 dTdGe,e7   d)ee,e      dJee?   d=e'd8e=f
dNZ@	 	 dTdGe,e7   d)ee,e      dJee?   d=e'd8eAeB   f
dOZC	 	 dTdGe,e7   d)ee,e      dJee;   d=e'd8e=f
dPZD	 	 dTdGe,e7   d)ee,e      dJee;   d=e'd8eEeB   f
dQZF xZGS )U
ChatClovaXa  `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)rz   validation_aliasdescriptionz*NCP Clova Studio chat model tuning task ID)rz   r   task_idFz=false: use testapp, true: use service app on NCP Clova Studioservice_appapi_key)rz   aliasncp_clovastudio_api_keyapigw_api_keyncp_apigw_api_keyr/   base_urlg        g      ?g      ?)gtlerz   temperaturer      )ger   rz   top_kg?top_p
   g      @repeat_penaltyi   d   
max_tokensstopstop_beforeinclude_ai_filtersl    rF   Z   )r   rz   timeout      )r   rz   max_retriesTrI   )populate_by_nameprotected_namespacesr,   c           	         | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  d}|j                         D ci c]  \  }}|	|| }}}|S c c}}w )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_paramszChatClovaX._default_params   s~      ++JJJJ!00** $ 7 7II	
 &.^^%5GTQAqDGG Hs   /
B:Bc                 L    | j                   | j                  d<   | j                  S )zGet the identifying parameters.r}   )r}   r   r   s    r<   _identifying_paramszChatClovaX._identifying_params   s$     .2__\*###r>   c                 4    | j                         sddiS dddS )Nr   NCP_CLOVASTUDIO_API_KEYNCP_APIGW_API_KEY)r   r   )_is_new_api_keyr   s    r<   
lc_secretszChatClovaX.lc_secrets  s1    ##%)+D 
 ,E%8 r>   c                      y)zReturn type of chat model.z
chat-naverrI   r   s    r<   	_llm_typezChatClovaX._llm_type  s     r>   kwargsc                 4    t        |   dd|i|}d|d<   |S )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   zChatClovaX._get_ls_params  s+     '<T<V< '}r>   c                     | j                   S )z'Get the parameters used for the client.)r   r   s    r<   _client_paramszChatClovaX._client_params  s     ###r>   c                     | j                   rdnd}| j                  r| j                   d| d| j                   dS | j                   d| d| j                   S )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_urlzChatClovaX._api_url$  sa     $(#3#3<<<==/8*Jt||nDUV mm_AhZ/DT__DUVVr>   after)modec                 H   | j                   s| j                  st        d      | j                  st	        t        dd            | _        | j                         s| j                          | j                  st        ddt              | _        | j                  s?t        j                  | j                  | j                         | j                        | _
        | j                  s?t        j                   | j                  | j                         | j                        | _        | S )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_afterzChatClovaX.validate_model_after0  s    4<<UVV+++@68QR,D( ##%,,.}}(:<MDM {{,,,,.DK    % 1 1,,.!D r>   c                 n    | j                   r)| j                   j                         j                  d      S y)Nznv-F)r   get_secret_value
startswithr   s    r<   r   zChatClovaX._is_new_api_keyR  s.    ''//@@BMMeTTr>   c                 T    | j                   st        t        ddd            | _         y y )Nr   r   r/   )r   r"   r#   r   s    r<   r   z&ChatClovaX._init_fields_on_old_api_keyX  s+    %%%:02ErJ&D" &r>   c                     ddd}| j                   r| j                   j                         nd }| j                         r
d| |d<   |S |r||d<   | j                  r| j                  j                         nd }|r||d<   |S )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   zChatClovaX.default_headers^  s    .(
 ++ ((99; 	 !)01D0E'FGO$  #7J34 )) &&779 
 1>-.r>   messagesc                 r    | j                   }|	d|v r||d<   |D cg c]  }t        |       }}||fS c c}w )Nr   )r   rQ   )r   r   r   r   mmessage_dictss         r<   _create_message_dictsz ChatClovaX._create_message_dicts|  sP     $$ 6#'F< LTUq?BUUf$$ Vs   4c                 $    ddl m}m dvrdd<   d   }t        t        j
                   j                        |rdt        |   f fd} |       S j                   j                        }t        |       |j                         S )Nr   )ServerSentEventconnect_ssestreamFr,   c               3     K    dj                         5 } t        | j                         | j                         D ]i  }|j	                         }|j
                  dk(  r|j                  di       dk(  r
 d d d        y |j
                  dk(  rt        |j                        | k 	 d d d        y # 1 sw Y   y xY ww)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   z3ChatClovaX._completion_with_retry.<locals>.iter_sse  s      FDMM "!#L$9$9:+446 	"%(XXZ
II1 *vr :h F"" " 99/"*388"<<!		"	" " "s)   CAB68	C+B6-	C6B?;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_retryz!ChatClovaX._completion_with_retry  s    	

 6!$F8!ellDKK0"h7 " "  :{{t}}6{BHH%==?"r>   run_managerc                     K   ddl m 	 t         |      }|dt        dt        f fd       } |di | d {   S 7 w)Nr   )aconnect_sse)r   r   r,   c                  N  K   d| vrd| d<   | d   }t        t        j                  j                        }|r! |dj                  |       }t        |      S |j                  j                  |        d {   }t        |       d {    |j                         S 7 '7 w)Nr   Fr   r   r   )	r   rk   r   r|   r   rb   r   r]   r7   )r   r   r|   r`   r^   r   r   s        r<   r   zBChatClovaX._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$   A6B%9B!:B%B#B%#B%rI   )r   r   _create_retry_decoratorr   )r   r   r   retry_decoratorr   r   s   `    @r<   _acompletion_with_retryz"ChatClovaX._acompletion_with_retry  sQ     
 	+>1$KP		'3 	'3 	' 
	' ,5f5555s   8AAAr^   c                    g }|j                  di       }|j                  di       }t        |      }t        |t              rJ|j                  d      |j                  d      |j                  d      |j                  d      z   d|_        t        |      }|j                  |       |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      d
}t        ||      S )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_resultz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/

 kjIIr>   c                     | j                  ||      \  }}i ||} | j                  dd|i|}| j                  |      S )Nr   rI   )r   r   r   r   r   r   r   r   r   r   r^   s           r<   	_generatezChatClovaX._generate  sU     !% : :8T Jv%F%f%.4..PPP''11r>   c              +   4  K   | j                  ||      \  }}i ||ddi}t        } | j                  d||d|D ]W  }t        ||      }	|	j                  }t        |	      }
|r+|j                  t        t        |	j                        |
       |
 Y y w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<   _streamzChatClovaX._stream  s      !% : :8T Jv5F5f5h56D.4.. 
"
?E
 	C 8=PQI"+"5"5+I>I,,sI$5$56i -  O	s   BBc                    K   | j                  ||      \  }}i ||} | j                  d||d| d {   }| j                  |      S 7 w)Nr  rI   )r   r   r   r   s           r<   
_ageneratezChatClovaX._agenerate  so      !% : :8T Jv%F%f%555 
"
?E
 
 ''11	
s   4AAAc                n  K   | j                  ||      \  }}i ||ddi}t        } | j                  d||d| d {   2 3 d {   }t        ||      }	|	j                  }t        |	      }
|r3|j                  t        t        |	j                        |
       d {    |
 h7 l7 e7 6 y wr   )
r   r   r   r=   r   r    r  r   rU   r0   )r   r   r   r   r   r   r   r  r  r  r  s              r<   _astreamzChatClovaX._astream  s      !% : :8T Jv5F5f5h56D!=!=!= "
""
?E"
 
 	 	% 8?RSI"+"5"5+I>I!22sI$5$56i 3    O
 	
sH   >B5 B-B5B3	B/
B3AB5"B1#B5/B31B53B5N)r,   N)NN)H__name__
__module____qualname____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  __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                 r    t         j                  t         j                  g}t        || j                  |      S )zFReturns a tenacity retry decorator, preconfigured to handle exceptions)error_typesr   r   )rk   RequestErrorStreamErrorr   r   )r  r   errorss      r<   r   r   1  s2       %"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>r,     s|         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>   