
    hhM              	       D   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 j4        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j=        ddfdZ>dej=        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 ZAdS )"    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        dk    r t          |          }t          d|          S |                    d          }|                    d          }|                    d          p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          b/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/chat_models/naver.py_convert_chunk_to_message_chunkr=   5   s#    xxzzH
yH:8DDb<MNNNNll9%%G;;vDkk)$$*Gv~~*;;; 1111			 ? ?g....			].@@@!'222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          	                    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     ';'' 8w????	G\	*	* 89999	G]	+	+ 	87?;;;;	GY	'	' 8go>>>>M	
 	
 	
 6W66777r>   _messagec                 R   | 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
                              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GG	  
 3+,,G v~~/
 
 
 	
 
		/
 
 
 	
 
		/
 
 
 	

 	,d3333T33444r>   event_source_mgrc                  K   | 4 d{V }t          |j                   d{V  |                                2 3 d{V }|                                }|j        dk    r.|                    di           dk    r ddd          d{V  dS |j        dk    rt          |j                  |W V  z6 	 ddd          d{V  dS # 1 d{V swxY w Y   dS )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555555555%//11 	 	 	 	 	 	 	#JyH$$)C)Cx)O)O              yG##sx0000IIIII 21                             s"   /C	B4 ;C	'C		
CCr^   c                     t           j                            | j                  rV|                                                     d          }t          j        d| j         d| j         d| | j        |           dS )+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11 
 ..w77#>h2 > >&l> >.;> >$	
 
 
 	

 
r>   c                 
  K   t           j                            | j                  r\|                                  d{V                     d          }t          j        d| j         d| j         d| | j        |           dS )rd   Nre   rf   rg   rh   ri   )	rk   rl   rm   rn   areadrp   rq   rr   rj   rs   s     r<   r]   r]      s      {H011 
'~~////////77@@#>h2 > >&l> >.;> >$	
 
 
 	

 
r>   c                       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}d |                                D             }|S )z/Get the default parameters for calling the API.)r   topKtopPrepeatPenalty	maxTokens
stopBeforeincludeAiFiltersrF   c                     i | ]
\  }}|||S NrI   ).0kvs      r<   
<dictcomp>z.ChatClovaX._default_params.<locals>.<dictcomp>   s    GGGTQAqr>   )	r   r   r   r   r   r   r   rF   items)selfdefaultsfiltereds      r<   _default_paramszChatClovaX._default_params   sa      +JJ!0* $ 7I	
 	
 HGX^^%5%5GGGr>   c                 .    | 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                 <    |                                  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  s>    ##%% 	)+D 
 ,E%8  r>   c                     dS )zReturn type of chat model.z
chat-naverrI   r   s    r<   	_llm_typezChatClovaX._llm_type  s	     |r>   kwargsc                 H     t                      j        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  s5     ('<<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                 x    | 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$  sg     $(#3B<<< 	W=VV8VVt|VVV mVVhVVT_VVVr>   after)modec                 "   | j         s| j        st          d          | j        s"t	          t          dd                    | _        |                                 s|                                  | j        st          ddt                    | _        | j
        s8t          j        | j        |                                 | j                  | _
        | j        s8t          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"    	W4< 	WUVVV+ 	+@68QRR, ,D( ##%% 	/,,...} 	(:<M DM { 	,,,..  DK   	 % 1,,..! ! !D r>   c                 l    | j         r,| j                                                             d          S dS )Nznv-F)r   get_secret_value
startswithr   s    r<   r   zChatClovaX._is_new_api_keyR  s5    ' 	/@@BBMMeTTT5r>   c                 ^    | j         s%t          t          ddd                    | _         d S d S )Nr   r   r/   )r   r"   r#   r   s    r<   r   z&ChatClovaX._init_fields_on_old_api_keyX  s@    % 	%:02ErJJ& &D"""	 	r>   c                     ddd}| j         r| j                                         nd }|                                 r	d| |d<   n0|r||d<   | j        r| 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    .(
 
 +D(99;;; 	 !! 	?'F1D'F'FGO$$ # K7J34 )&77999 
  ?1>-.r>   messagesc                 F    | j         }|	d|v r||d<   d |D             }||fS )Nr   c                 ,    g | ]}t          |          S rI   )rQ   )r   ms     r<   
<listcomp>z4ChatClovaX._create_message_dicts.<locals>.<listcomp>  s!    UUUq?BBUUUr>   )r   )r   r   r   r   message_dictss        r<   _create_message_dictsz ChatClovaX._create_message_dicts|  sD     $ 6 6#'F< UUHUUUf$$r>   c                 <    ddl m}m dvrdd<   d         }t          t          j         j                  |r dt          |         f fd} |            S                      j	                  }t          |           |                                S )Nr   )ServerSentEventconnect_ssestreamFr,   c               3     K    dj                   5 } t          | j                   |                                 D ]m}|                                }|j        dk    r(|                    di           dk    r d d d            d S |j        dk    rt          |j                  |V  n	 d d d            d S # 1 swxY w Y   d S )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  sG      [FDM   "!#L$9:::+4466 	" 	"%(XXZZ
I11 *vr : :h F F"" " " " " " " " 9//"*38"<"<"<<!					"	" " " " " " " " " " " " " " " " " "s   A%B=
%B==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_retryz!ChatClovaX._completion_with_retry  s    	
 	
 	
 	
 	
 	
 	
 	

 6!!$F8!elDK00 	#"h7 " " " " " " " " "  8::{{t}6{BBHH%%%==??"r>   run_managerc                     K   ddl m 	 t           |          }|dt          dt          f fd            } |di | d {V S )Nr   )aconnect_sse)r   r   r,   c                  H  K   d| vrd| d<   | d         }t          t          j        j                  }|r# |dj        |           }t          |          S |                    j        |            d {V }t          |           d {V  |                                S )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 143DEEL '+| &$-f      ",///!-!2!2t}6!2!R!RRRRRRR&x000000000}}&r>   rI   )r   r   _create_retry_decoratorr   )r   r   r   retry_decoratorr   r   s   `    @r<   _acompletion_with_retryz"ChatClovaX._acompletion_with_retry  s      
 	+*****>1$KPPP		'3 	'3 	' 	' 	' 	' 	' 	' 
	' ,+55f555555555r>   r^   c                    g }|                     di           }|                     di           }t          |          }t          |t                    rZ|                     d          |                     d          |                     d          |                     d          z   d|_        t          |          }|                    |           |                     d          |                     d          |                     d          |                     d          |                     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  s6   h++jjB''8==gy)) 	 &

= 9 9!'N!;!; &

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

 kjIIIIr>   c                     |                      ||          \  }}i ||} | j        dd|i|}|                     |          S )Nr   rI   )r   r   r  r   r   r   r   r   r   r   r^   s           r<   	_generatezChatClovaX._generate  s^     !% : :8T J Jv%F%f%.4.PPPPP''111r>   c              +   <  K   |                      ||          \  }}i ||ddi}t          } | j        d||d|D ]^}t          ||          }	|	j        }t          |	          }
|r/|                    t          t          |	j	                  |
           |
V  _d S 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 Jv5F5f5h556D.4. 
"
 
?E
 
 	 	C 8=PQQI"+"5+I>>>I ,,sI$566i -    OOOO	 	r>   c                    K   |                      ||          \  }}i ||} | j        d||d| d {V }|                     |          S )Nr  rI   )r   r   r  r  s           r<   
_ageneratezChatClovaX._agenerate  s       !% : :8T J Jv%F%f%55 
"
 
?E
 
 
 
 
 
 
 
 ''111r>   c                b  K   |                      ||          \  }}i ||ddi}t          } | j        d||d| d {V 2 3 d {V }t          ||          }	|	j        }t          |	          }
|r5|                    t          t          |	j	                  |
           d {V  |
W V  k6 d S 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  sK      !% : :8T J Jv5F5f5h556D!=!= "
""
 "
?E"
 "
 
 
 
 
 
 
 	 	 	 	 	 	 	% 8?RSSI"+"5+I>>>I !22sI$566i 3          OOOOO
 
 
s   B.r   )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      sa         " &+U4%8%8%8FHU\"88805d0C0C0CL(5,-CCCe%lG<<5  J   
 #U"N  GXc]    S  K   
 495Y3W3W3WXi0WWWX-2U4-W-W-Wx	*WWWRE"J777Hc777 $)5CC#E#E#EK%EEE 5A#q999E8C=999"UaC===E8E?===&+esr3&G&G&GNHUOGGG %tS A A AJAAA',uT'H'H'HK$s)$HHH).u)=)=)====%1Q???D(3-???5Ar***GS***u1---K---:t"MMMLc3h    X $T#s(^ $ $ $ X$
 	DcN 	 	 	 X	 3    X
 +/ T#Y':=	      $S#X $ $ $ X$ 	W# 	W 	W 	W X	W _'"""d    #"B       c3h    <%[)%19$s)1D%	tDz4S>)	*% % % %!#s !#s !# !# !# !#J @D6 6;<6 6 
	6 6 6 68JD JZ J J J J< %):>	2 2{#2 tCy!2 67	2
 2 
2 2 2 2" %):>	 {# tCy! 67	
  
%	&   8 %)?C	2 2{#2 tCy!2 ;<	2
 2 
2 2 2 2& %)?C	 {# tCy! ;<	
  
*	+       r>   ry   llmr   c                 `    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  s4      %"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>r1     s                                             V U U U U U U U K K K K K K                        S R R R R R R R R R D D D D D D D D              # " " " " "; 		8	$	$.	.!"23.. . . ..T d38n    88	8 8 8 8&555 5 5 5@)#.4   	
en 	
 	
 	
 	
 	
	
U^ 	
 	
 	
 	
 	
y y y y y y y y@ 		 	+-EEF
 seSj     r>   