
    Ig^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 jd                  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jr                  ddfdZ:dejr                  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=y)    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                    | j                         }|j                  d      }|j                  d      }|j                  d      xs 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          b/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_community/chat_models/naver.py_convert_chunk_to_message_chunkr<   .   s     xxzHll9%G;;vDkk)$*G
yyH8#.6|.Dl+b<MNNv~*;; 11		 ?g..		].@@!'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        j                  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     ';'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
|       )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 
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| U7 7 k7 T7 6 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])_araise_on_errorresponse	aiter_sser7   r9   r8   )rK   event_sourcer)   
event_datas       r;   
_aiter_sserU   {   s         <|44555%//1 	 	#JyyH$)Cx)O   I5	1    s   C BC B+BB+BB B6B+9C BC 
B+C B+BC B+C $B'%C +B=1B42B=9C rQ   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 : requestrQ   N)	httpxcodesis_errorstatus_codereaddecodeHTTPStatusErrorurlr]   rQ   error_messages     r;   _raise_on_errorrh      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)rW   NrX   rY   rZ   r[   r\   )	r^   r_   r`   ra   areadrc   rd   re   r]   rf   s     r;   rP   rP      s     {{H001'~~//77@##h223 4&ll^2m_>$$	
 	
 2/s   =BB ABc                   b    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}|j                         D ci c]  \  }}|	|| }}}|S c c}}w )z/Get the default parameters for calling the API.)r~   topKtopPrepeatPenalty	maxTokens
stopBeforeincludeAiFiltersr   )	r~   r   r   r   r   r   r   r   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.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                      y)zReturn type of chat model.z
chat-naverr   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_providerr   )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/)ru   rt   r{   rp   )r   app_types     r;   _api_urlzChatClovaX._api_url
  sa     $(#3#3<<<==/8*Jt||nDUV mm_AhZ/DT__DUVVr=   after)modec                 V   | 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                  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.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    4<<UVV+++@68QR,D( %%%:02ErJ&D" }}(:<MDM {{,,,,.DK    % 1 1,,.!D r=   c                     ddd}| j                   r| j                   j                         nd }|r||d<   | j                  r| j                  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    .(
 ++ ((99; 	
 3FG/0 %% ""335 	
 -:G)*r=   messagesc                 r    | j                   }|	d|v r||d<   |D cg c]  }t        |       }}||fS c c}w )Nr   )r   rE   )r   r   r   r   mmessage_dictss         r;   _create_message_dictsz ChatClovaX._create_message_dictsR  sP     $$ 6#'F< LTUq?BUUf$$ Vs   4c                 ,    ddl m}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SSEErrorconnect_ssestreamFr+   c               3     K    dj                         5 } t        | j                         | j                         D ]f  }|j	                         }|j
                  dk(  r|j                  di       dk(  r
 d d d        y |j
                  dk(  r |j                        | h 	 d d d        y # 1 sw Y   y xY ww)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  s      FDMM "!#L$9$9:+446 	"%(XXZ
II1 *vr :h F"" " 99/"*388"<<!		"	" " "s)   B?AB38	B?(B3*	B?3B<8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!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   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 1 143D3DEL+ &$--f  ",//!-!2!2t}}6!2!RR&x000}}& S0s$   A6B%9B!:B%B#B%#B%r   )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rQ   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 )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  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   r   )r   r   r   r   r   r   r   r   r   r   rQ   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   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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   r   )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   rI   r/   )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)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      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 ! #!Fc3h 0%[)%19$s)1D%	tDz4S>)	*%"#s "#s "#L @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=   rl   llmr   c                 r    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     s2       %"3"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$     sX        V K   S R D P P "; 			8	$.	.!"23..488	8&555@
)#.
4
	
enn 	
 	
	
U^^ 	
 	
e eX 			+-EEF
 seSjr=   