
    Ng^H              	          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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-m.Z. d d
l/m0Z0 dZ1 e j2        e3          Z4dedee         defdZ5dedefdZ6dedefdZ7dee         dee         fdZ8dej9        ddfdZ:dej9        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Z=dS )    N)AnyAsyncContextManagerAsyncIteratorCallableDictIteratorListOptionalTupleTypeUnioncast)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                     |                                  }|                    d          }|                    d          }|                    d          pd}| j        dk    r"i }d|v r|d         |d<   t          d|          S |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messagerolecontent result
stopReason)r/   response_metadatauser)r/   	assistantsystem)r/   r.   )jsongeteventr   r   r   r   )r)   r*   sse_datar-   r.   r/   r3   s          a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/naver.py_convert_chunk_to_message_chunkr<   .   s6    xxzzHll9%%G;;vDkk)$$*G
yH8##.6|.Dl+b<MNNNNv~~*;;; 1111			 ? ?g....			].@@@!'2222	 ."222d;;;;}W----    r-   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)r.   r/   r4   r6   r5   zmFunctionMessage, ToolMessage not yet supported (https://api.ncloud-docs.com/docs/clovastudio-chatcompletions)zGot unknown type )
isinstancer   dictr.   r/   r   r   r   loggerwarning
ValueErrorr-   s    r;   &_convert_message_to_naver_chat_messagerE   H   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
|           )Nr.   )r5   r6   r4   z7Expected role to be 'assistant', 'system', 'user', got r/   r4   )r/   additional_kwargsr6   r5   zGot unknown role %szGot unknown role )r   strr   r   r   rA   rB   rC   )rF   r.   r/   rH   s       r;   &_convert_naver_chat_message_to_messagerJ   [   s    FD     HGG	  
 3+,,G v~~/
 
 
 	
 
		/
 
 
 	
 
		/
 
 
 	

 	,d3333T33444r=   event_source_mgrc                x  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 |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])_araise_on_errorresponse	aiter_sser7   r9   r8   )rK   event_sourcer)   
event_datas       r;   
_aiter_sserU   {   s              <|4555555555%//11 	 	 	 	 	 	 	#JyH$$)C)Cx)O)O              IIIII	 21                             s"   /B)B ;B)B))
B36B3rQ   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 : requestrQ   N)	httpxcodesis_errorstatus_codereaddecodeHTTPStatusErrorurlr]   rQ   error_messages     r;   _raise_on_errorrh      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 )rW   NrX   rY   rZ   r[   r\   )	r^   r_   r`   ra   areadrc   rd   re   r]   rf   s     r;   rP   rP      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+	 dPd)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&ee'f         fdDZ4dEe,e5         d)ee,e                  d8e6e,e&         e&ee'f         f         fdFZ7d=e'd8e'fdGZ8	 dPdHee9         d=e'd8e'fdIZ:dJe&d8e;fdKZ<	 	 dQdEe,e5         d)ee,e                  dHee=         d=e'd8e;f
dLZ>	 	 dQdEe,e5         d)ee,e                  dHee=         d=e'd8e?e@         f
dMZA	 	 dQdEe,e5         d)ee,e                  dHee9         d=e'd8e;f
dNZB	 	 dQdEe,e5         d)ee,e                  dHee9         d=e'd8eCe@         f
dOZD xZES )R
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)rm   validation_aliasdescriptionz*NCP Clova Studio chat model tuning task ID)rm   rs   task_idFz=false: use testapp, true: use service app on NCP Clova Studioservice_appapi_key)rm   aliasncp_clovastudio_api_keyapigw_api_keyncp_apigw_api_keyr0   base_urlg        g      ?g      ?)gtlerm   temperaturer      )ger}   rm   top_kg?top_p
   g      @repeat_penaltyi   d   
max_tokensstopstop_beforeinclude_ai_filtersl    seedZ   )r|   rm   timeout      )r   rm   max_retriesT )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includeAiFiltersr   c                     i | ]
\  }}|||S Nr   ).0kvs      r;   
<dictcomp>z.ChatClovaX._default_params.<locals>.<dictcomp>   s    GGGTQAqr=   )	r~   r   r   r   r   r   r   r   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.rp   )rp   r   r   s    r;   _identifying_paramszChatClovaX._identifying_params   s     .2_\*##r=   c                     dddS )NNCP_CLOVASTUDIO_API_KEYNCP_APIGW_API_KEY)rx   rz   r   r   s    r;   
lc_secretszChatClovaX.lc_secrets   s     (A!4
 
 	
r=   c                     dS )zReturn type of chat model.z
chat-naverr   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_providerr   )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/)ru   rt   r{   rp   )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                    | _        | j        s#t	          t          ddd                    | _        | 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.rx   r   rz   r   r0   r{   NCP_CLOVASTUDIO_API_BASE_URL)r{   headersr   )rp   rt   rC   rx   r!   r"   rz   r{   _DEFAULT_BASE_URLrn   r^   Clientdefault_headersr   ro   AsyncClientr   s    r;   validate_model_afterzChatClovaX.validate_model_after  s,    	W4< 	WUVVV+ 	+@68QRR, ,D( % 	%:02ErJJ& &D" } 	(:<M DM { 	,,,..  DK   	 % 1,,..! ! !D r=   c                     ddd}| j         r| j                                         nd }|r||d<   | j        r| j                                        nd }|r||d<   |S )Nzapplication/json)zContent-TypeAcceptzX-NCP-CLOVASTUDIO-API-KEYzX-NCP-APIGW-API-KEY)rx   get_secret_valuerz   )r   r   clovastudio_api_keyry   s       r;   r   zChatClovaX.default_headers:  s    .(
 
 +D(99;;; 	
  	G3FG/0 %D"33555 	
  	;-:G)*r=   messagesc                 F    | j         }|	d|v r||d<   d |D             }||fS )Nr   c                 ,    g | ]}t          |          S r   )rE   )r   ms     r;   
<listcomp>z4ChatClovaX._create_message_dicts.<locals>.<listcomp>Y  s!    UUUq?BBUUUr=   )r   )r   r   r   r   message_dictss        r;   _create_message_dictsz ChatClovaX._create_message_dictsR  sD     $ 6 6#'F< UUHUUUf$$r=   c                 D    ddl m}mm dvrdd<   d         }t	          t
          j         j                  |r!dt          |         f fd} |            S 	                     j
                  }t          |           |                                S )Nr   )ServerSentEventSSEErrorconnect_ssestreamFr+   c               3     K    dj                   5 } t          | j                   |                                 D ]i}|                                }|j        dk    r(|                    di           dk    r d d d            d S |j        dk    r |j                  |V  j	 d d d            d S # 1 swxY w Y   d S )NPOSTr7   rM   rN   rO   errorrD   )r   rh   rQ   iter_sser7   r9   r8   rN   )rS   r)   rT   r   rn   r   r   r   s      r;   r   z3ChatClovaX._completion_with_retry.<locals>.iter_ssej  sI      [FDM   "!#L$9:::+4466 	" 	"%(XXZZ
I11 *vr : :h F F"" " " " " " " " 9//"*(38"<"<"<<!					"	" " " " " " " " " " " " " " " " " "s   A%B9
!B99B= B=re   r7   )	httpx_sser   r   r   r   r^   r   rn   r   postr   rh   r7   )	r   r   r   r   r   rQ   r   rn   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   r^   r   ro   r   rU   r   rP   r7   )r   r   ro   rS   rQ   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=   r   )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=   rQ   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 )Nr1   r-   inputLengthoutputLength)input_tokensoutput_tokenstotal_tokensrD   r2   r   aiFilter)stop_reasoninput_lengthoutput_lengthr   	ai_filter)generations
llm_output)r8   rJ   r?   r   usage_metadatar   appendr    )r   rQ   r   r1   msgr-   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   r   )r   r   r   r   r   r   r   r   r   r   rQ   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   rD   )tokenchunkr   )
r   r   r   r<   r   r   on_llm_new_tokenr   rI   r/   )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   r   )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   rI   r/   )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   )NN)F__name__
__module____qualname____doc__r%   rn   r
   r^   r   __annotations__ro   r   r#   rp   rI   rt   ru   boolrx   r&   rz   r{   r~   floatr   intr   r   r   r   listr   r   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
  __classcell__)r   s   @r;   rl   rl      s2         " &+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 ! ! ! #"!Fc3h    0%[)%19$s)1D%	tDz4S>)	*% % % %"#s "#s "# "# "# "#L @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=   rl   llmr   c                 `    t           j        t           j        g}t          || j        |          S )zFReturns a tenacity retry decorator, preconfigured to handle exceptions)error_typesr   r   )r^   RequestErrorStreamErrorr   r   )r  r   errorss      r;   r   r     s4      %"34F&[   r=   r   )>loggingtypingr   r   r   r   r   r   r	   r
   r   r   r   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  rA   r<   rE   rJ   rU   Responserh   rP   rl   r   r   r=   r;   <module>r)     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 P P P P P P P P P P P P P P " " " " " "; 		8	$	$.	.!"23.. . . .488	8 8 8 8&555 5 5 5@
)#.
4
 
 
 
	
en 	
 	
 	
 	
 	
	
U^ 	
 	
 	
 	
 	
e e e e e e e eX 		 	+-EEF
 seSj     r=   