
    Zis                         d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZmZ  G d d          Z G d d	e          ZdS )
    N)LiteralSequenceOptionalListUnion	Generator   )get_max_items_from_list)UsageLimitExceededErrorInvalidAPIKeyErrorMissingAPIKeyErrorBadRequestErrorForbiddenErrorTimeoutErrorc            )          e Zd ZdZdSdee         deeeef                  dee         dee         dee         f
dZd	 Zd
 Z	d Z
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dTdeded         ded         ded         dededededee         dee         deeed         f         deeed         f         deded ed!ed"ed#ed$ed%ef(d&Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dTdeded         ded         ded         dededededee         dee         deeed         f         deeed         f         deded ed!ed"ed#ed$ed%ef(d'Z	 	 	 	 	 	 	 	 dUd)eee         ef         ded*ed         d+ed         ded"ed#eded,ed%efd-Z	 	 	 	 	 	 	 	 dUd)eee         ef         ded*ed         d+ed         ded"ed#eded,ed%efd.Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dVd0ed1ed2ed3ed4ed5ee         d6ee         d7ee         dee         d8eded*ed         d+ed         ded"ed#ed,ed%ef$d9Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dVd0ed1ed2ed3ed4ed5ee         d6ee         d7ee         dee         d8eded*ed         d+ed         ded"ed#ed,ed%ef$d:Z	 	 	 	 	 	 	 	 	 	 	 	 dWd0ed1ed2ed3ed4ed5ee         d6ee         d7ee         dee         d8ededed#ed%efd;Z	 	 	 	 	 	 	 	 	 	 	 	 dWd0ed1ed2ed3ed4ed5ee         d6ee         d7ee         dee         d8ededed#ed%efd<Z	 	 	 	 	 	 	 	 	 	 dXdeded         ded         dededee         dee         dBeded ed"ed%efdCZ	 	 	 	 	 	 	 	 	 dYdeded         ded         dededee         dee         ded ed"ed%efdEZ	 	 	 	 	 dZdHedIedJ         dKedLedMedN         dee         d%eeeeddf         f         fdOZ	 	 	 	 	 dZdHedIedJ         dKedLedMedN         dee         d%eeeeddf         f         fdPZdQed%efdRZ dS )[TavilyClientz"
    Tavily API client class.
    Napi_keyproxiesapi_base_urlclient_source
project_idc                    |t          j        d          }|st                      |r|                    d          nt          j        d          |r|                    d          nt          j        d          d}d |                                D             pd }|pt          j        d          }|pd	| _        || _        || _        d
d| j         |pdd|rd|ini | _        t          j
                    | _        | j        j                            | j                   | j        r&| j        j                            | j                   d S d S )NTAVILY_API_KEYhttpTAVILY_HTTP_PROXYhttpsTAVILY_HTTPS_PROXY)r   r   c                     i | ]
\  }}|||S  r   .0kvs      H/root/projects/butler/venv/lib/python3.11/site-packages/tavily/tavily.py
<dictcomp>z)TavilyClient.__init__.<locals>.<dictcomp>   s#    KKKTQKAqKKK    TAVILY_PROJECTzhttps://api.tavily.comzapplication/jsonzBearer ztavily-python)zContent-TypeAuthorizationzX-Client-SourcezX-Project-ID)osgetenvr   getitemsbase_urlr   r   headersrequestsSessionsessionupdate)selfr   r   r   r   r   resolved_proxiestavily_projects           r$   __init__zTavilyClient.__init__   s   ?i 011G 	'$&&& ,3VGKK'''	BU8V8V-4YW[[)))")DX:Y:Y
 

 LK-=-C-C-E-EKKKSt#Bry1A'B'B$@(@' /5t|55,?
 
 4BI//r	
  '))##DL111< 	6L ''55555	6 	6r&   c                 8    | j                                          dS )z(Close the session and release resources.N)r1   closer3   s    r$   r8   zTavilyClient.close-   s    r&   c                     | S Nr   r9   s    r$   	__enter__zTavilyClient.__enter__1   s    r&   c                 .    |                                   d S r;   )r8   )r3   exc_typeexc_valexc_tbs       r$   __exit__zTavilyClient.__exit__4   s    

r&   <   querysearch_depth)basicadvancedfastz
ultra-fasttopic)generalnewsfinance
time_range)dayweekmonthyear
start_dateend_datedaysmax_resultsinclude_domainsexclude_domainsinclude_answer)rE   rF   include_raw_content)markdowntextinclude_imagestimeoutcountryauto_parametersinclude_faviconinclude_usageexact_matchreturnc                    i d|d|d|d|d|d|d|d|d	|d
|d|	d|
d|d|d|d|d|d|i}d |                                 D             }|r|                    |           t          |d          }| j        dz   }t	          j        |          }	 | j                            |||          }n'# t          j	        j
        $ r t          |          w xY w|j        dk    r|                                S d}	 |                                                    di                               dd          }n# t          $ r Y nw xY w|j        dk    rt          |          |j        dv rt!          |          |j        dk    rt#          |          |j        dk    rt%          |          |                                ) zH
        Internal search method to send the request to the API.
        rC   rD   rH   rL   rQ   rR   rS   rW   rX   rT   rU   rV   r[   r]   r^   r_   r`   ra   c                     i | ]
\  }}|||S r;   r   r    s      r$   r%   z(TavilyClient._search.<locals>.<dictcomp>f       ???A1r&   x   z/searchdatar\       detailerrorN  i  i  i      )r,   r2   minr-   jsondumpsr1   postr/   
exceptionsTimeoutr   status_coder+   	Exceptionr   r   r   r   raise_for_status)r3   rC   rD   rH   rL   rQ   rR   rS   rT   rU   rV   rW   rX   r[   r\   r]   r^   r_   r`   ra   kwargsrh   urlpayloadresponserk   s                             r$   _searchzTavilyClient._search7   s   4
U
L
 U
 *	

 *
 
 D
 n
 "#6
 ;
 
 
 n
 w
 
  !
" ]#
$ ;%
 
* @???? 	 KKgs##mi'*T""	(|((7G(LLHH"* 	( 	( 	(w'''	( 3&&==??"F!,,Xr::>>wMM    #s**-f555%88$V,,,%,,(000%,,%f---//111s   B< <$C <E 
EEc                      | j         |fi d|d|d|d|d|d|d|d|	d	|
d
|d|d|d|d|d|d|d|d||}|                    dg            |S )z)
        Combined search method.
        rD   rH   rL   rQ   rR   rS   rT   rU   rV   rW   rX   r[   r\   r]   r^   r_   r`   ra   results)r~   
setdefault)r3   rC   rD   rH   rL   rQ   rR   rS   rT   rU   rV   rW   rX   r[   r\   r]   r^   r_   r`   ra   rz   response_dicts                         r$   searchzTavilyClient.search   s!   4 %U / / /2>,/+05/ 1;
/ 1;
	/
 /7h/ +/$/ 2=/ 6E_/ 6E_/ 5CN/ :M9L/ 5CN/ .5W/ .5W/ 6E_/  6E_!/" 4A=#/$ 2='-'/ /( 	  B///r&      urlsextract_depthformatchunks_per_sourcec
           
         |||||||||	d	}d |                                 D             }|
r|                    |
           	 | j                            | j        dz   t          j        |          |          }n'# t          j        j	        $ r t          |          w xY w|j        dk    r|                                S d}	 |                                                    di                               dd	          }n# t          $ r Y nw xY w|j        d
k    rt          |          |j        dv rt          |          |j        dk    rt!          |          |j        dk    rt#          |          |                                )zJ
        Internal extract method to send the request to the API. 
        )	r   r[   r   r   r\   r_   r`   rC   r   c                     i | ]
\  }}|||S r;   r   r    s      r$   r%   z)TavilyClient._extract.<locals>.<dictcomp>   re   r&   z/extractrg   ri   rj   rk   rl   Nrm   rn   ro   rp   )r,   r2   r1   rt   r-   rr   rs   r/   ru   rv   r   rw   r+   rx   r   r   r   r   ry   )r3   r   r[   r   r   r\   r_   r`   rC   r   rz   rh   r}   rk   s                 r$   _extractzTavilyClient._extract   s     ,*.*!2

 

 @???? 	 KK	(|(()C$*UYJZJZdk(llHH"* 	( 	( 	(w'''	( 3&&==??"F!,,Xr::>>wMM    #s**-f555%88$V,,,%,,(000%,,%f---//111s   7A; ;$B<D 
DDc
                      | j         |||||f||||	d|
}|                    dg            |                    dg            |S )z*
        Combined extract method.
        )r_   r`   rC   r   r   failed_results)r   r   )r3   r   r[   r   r   r\   r_   r`   rC   r   rz   r   s               r$   extractzTavilyClient.extract   s}     &d&4&3&,&-		0
 7F4A,18I	0 	0 )/	0 	0 	  B///  !12666r&      r{   	max_depthmax_breadthlimitinstructionsselect_pathsselect_domainsexclude_pathsallow_externalc                 h   i d|d|d|d|d|d|d|d|d	|	d
|
d|d|d|d|d|d|d|}|r|                     |           d |                                D             }	 | j                            | j        dz   t          j        |          |          }n'# t          j        j	        $ r t          |          w xY w|j        dk    r|                                S d}	 |                                                    di                               dd          }n# t          $ r Y nw xY w|j        dk    rt          |          |j        dv rt          |          |j        dk    rt!          |          |j        dk    rt#          |          |                                )z
        Internal crawl method to send the request to the API.
        include_favicon: If True, include the favicon in the crawl results.
        r{   r   r   r   r   r   r   r   rV   r   r[   r   r   r\   r_   r`   r   c                     i | ]
\  }}|||S r;   r   r    s      r$   r%   z'TavilyClient._crawl.<locals>.<dictcomp>?  re   r&   z/crawlrg   ri   rj   rk   rl   Nrm   rn   ro   rp   r2   r,   r1   rt   r-   rr   rs   r/   ru   rv   r   rw   r+   rx   r   r   r   r   ry   )r3   r{   r   r   r   r   r   r   r   rV   r   r[   r   r   r\   r_   r`   r   rz   rh   r}   rk   s                         r$   _crawlzTavilyClient._crawl  si   0
3

 ;
 U	

 L
 L
 n
 ]
 
 n
 n
 ]
 f
 w
 
  ]!
"  !2#
(  	 KK?????	(|(()A
SWHXHXbi(jjHH"* 	( 	( 	(w'''	( 3&&==??"F!,,Xr::>>wMM    #s**-f555%88$V,,,%,,(000%,,%f---//111s   ,7B$ $$C-<D* *
D76D7c                 ~     | j         |fi d|d|d|d|d|d|d|d|	d	|
d
|d|d|d|d|d|d||S )zt
        Combined crawl method.
        include_favicon: If True, include the favicon in the crawl results.
        r   r   r   r   r   r   r   rV   r   r[   r   r   r\   r_   r`   r   )r   )r3   r{   r   r   r   r   r   r   r   rV   r   r[   r   r   r\   r_   r`   r   rz   s                      r$   crawlzTavilyClient.crawlZ  s    0 t{3 % % %%.Y%'2{% "'% )5	%
 )5% +9.% *7% ,;?% +9.% +9.% *7% #)&% $+7% ,;?% *7%  .?->##% % 	%r&   c                    |||||||||	|
|||d}|r|                     |           d |                                D             }	 | j                            | j        dz   t          j        |          |          }n'# t          j        j	        $ r t          |          w xY w|j        dk    r|                                S d}	 |                                                    di                               dd	          }n# t          $ r Y nw xY w|j        d
k    rt          |          |j        dv rt          |          |j        dk    rt!          |          |j        dk    rt#          |          |                                )zE
        Internal map method to send the request to the API.
        )r{   r   r   r   r   r   r   r   rV   r   r[   r\   r`   c                     i | ]
\  }}|||S r;   r   r    s      r$   r%   z%TavilyClient._map.<locals>.<dictcomp>  re   r&   z/maprg   ri   rj   rk   rl   Nrm   rn   ro   rp   r   )r3   r{   r   r   r   r   r   r   r   rV   r   r[   r\   r`   rz   rh   r}   rk   s                     r$   _mapzTavilyClient._map  s   ( "&((,*.,,*
 
   	 KK?????	(|(()?djQUFVFV`g(hhHH"* 	( 	( 	(w'''	( 3&&==??"F!,,Xr::>>wMM    #s**-f555%88$V,,,%,,(000%,,%f---//111s   7A? ?$B#<D 
DDc                 8     | j         |f||||||||	|
|||d|S )z/
        Combined map method.
        
        )r   r   r   r   r   r   r   rV   r   r[   r\   r`   )r   )r3   r{   r   r   r   r   r   r   r   rV   r   r[   r\   r`   rz   s                  r$   mapzTavilyClient.map  sT    ( ty ##,%0$&2&2(6'4)8(6(6!('4# # "# # 	#r&   rE   rI           
max_tokensc                     t          j        dt          d            | j        |f||||||ddd|	|
|d|}|                    dg           }d |D             }t          j        t          ||                    S )a  
        Get the search context for a query. Useful for getting only related content from retrieved websites
        without having to deal with context extraction and limitation yourself.

        max_tokens: The maximum number of tokens to return (based on openai token compute). Defaults to 4000.

        Returns a string of JSON containing the search context up to context limit.
        zHget_search_context is deprecated and will be removed in future versions.   
stacklevelF)rD   rH   rS   rT   rU   rV   rW   rX   r[   r\   r]   r_   r   c                 0    g | ]}|d          |d         dS )r{   content)r{   r   r   )r!   sources     r$   
<listcomp>z3TavilyClient.get_search_context.<locals>.<listcomp>  s9     * * * "%=VI5FGG * * *r&   )warningswarnDeprecationWarningr~   r+   rr   rs   r
   )r3   rC   rD   rH   rS   rT   rU   rV   r   r\   r]   r_   rz   r   sourcescontexts                   r$   get_search_contextzTavilyClient.get_search_context  s    , 	`(Q	8 	8 	8 	8 %U '2>+0*.1<5D5D499>49-4-45D' ' (.' '  ##Ir22* *!(* * *z1':FFGGGr&   rF   c                     t          j        dt          d            | j        |f||||||ddd||	|
d|}|                    dd          S )	z`
        Q&A search method. Search depth is advanced by default to get the best answer.
        z@qna_search is deprecated and will be removed in future versions.r   r   FT)rD   rH   rS   rT   rU   rV   rX   r[   rW   r\   r]   r_   answerrj   )r   r   r   r~   r+   )r3   rC   rD   rH   rS   rT   rU   rV   r\   r]   r_   rz   r   s                r$   
qna_searchzTavilyClient.qna_search  s      	X(Q	8 	8 	8 	8$U '2>+0*.1<5D5D9>4948-4-45D' ' (.' '   2...r&   Fnumberedinputmodel)miniproautooutput_schemastreamcitation_format)r   mlaapachicagoc                    |||||d}d |                                 D             }|r|                    |           |r[	 | j                            | j        dz   t          j        |          |d          n'# t          j        j	        $ r t          |          w xY wj        dk    rd}		                                                     di                               d	d
          }	n# t          $ r Y nw xY wj        dk    rt          |	          j        dv rt          |	          j        dk    rt!          |	          j        dk    rt#          |	                                          dt&          t(          d
d
f         ffd}
 |
            S 	 | j                            | j        dz   t          j        |          |          n'# t          j        j	        $ r t          |          w xY wj        dk    r                                S d}		                                                     di                               d	d
          }	n# t          $ r Y nw xY wj        dk    rt          |	          j        dv rt          |	          j        dk    rt!          |	          j        dk    rt#          |	                                          )zJ
        Internal research method to send the request to the API.
        )r   r   r   r   r   c                     i | ]
\  }}|||S r;   r   r    s      r$   r%   z*TavilyClient._research.<locals>.<dictcomp>M  re   r&   z	/researchT)rh   r\   r   ri   rj   rk   rl   Nrm   rn   ro   rp   rb   c               3      K   	                      d           D ]} | r| V  		                                  d S #                                  w xY w)N)
chunk_size)iter_contentr8   )chunkr}   s    r$   stream_generatorz0TavilyClient._research.<locals>.stream_generatoro  sq      %!)!6!6$!6!G!G ( (  ("'KKK( NN$$$$$HNN$$$$s	   ; Arg   )r,   r2   r1   rt   r-   rr   rs   r/   ru   rv   r   rw   r+   rx   r   r   r   r   ry   r   bytes)r3   r   r   r   r   r   r\   rz   rh   rk   r   r}   s              @r$   	_researchzTavilyClient._research9  sj    *.
 
 @???? 	 KK B	6,<,,MK/D))#	 -   &. , , ,"7+++, #s**%]]__002>>BB7DQQFF    D '3..1&999)_<<(000)S00,V444)S00)&111"33555%itT0A&B % % % % % % $#%%%,<,,MK/D))# -  
 &. , , ,"7+++, #s**}}&%]]__002>>BB7DQQFF    D '3..1&999)_<<(000)S00,V444)S00)&111"33555s<   8A< <$B 1<C. .
C;:C;7G $G:<I 
I)(I)c           
      *     | j         d||||||d|S )a  
        Research method to create a research task.
        
        Args:
            input: The research task or question to investigate (required).
            model: The model used by the research agent - must be either 'mini', 'pro', or 'auto'.
            output_schema: Schema for the 'structured_output' response format (JSON Schema dict).
            stream: Whether to stream the research task.
            citation_format: Citation format - must be either 'numbered', 'mla', 'apa', or 'chicago'.
            timeout: Optional HTTP request timeout in seconds. 
            **kwargs: Additional custom arguments.
        
        Returns:
            dict: Response containing request_id, created_at, status, input, and model.
        )r   r   r   r   r   r\   r   )r   )r3   r   r   r   r   r   r\   rz   s           r$   researchzTavilyClient.research  s@    2 t~ 
'+
 
 
 
 	
r&   
request_idc                 f   	 | j                             | j        d| z             }n$# t          $ r}t          d|           d}~ww xY w|j        dv r|                                S d}	 |                                                    di                               dd          }n# t          $ r Y nw xY w|j        dk    rt          |          |j        d	v rt          |          |j        d
k    rt          |          |j        dk    rt          |          |
                                )a
  
        Get research results by request_id.
        
        Args:
            request_id: The research request ID.
        
        Returns:
            dict: Research response containing request_id, created_at, completed_at, status, content, and sources.
        z
/research/zError getting research: N)ri      rj   rk   rl   rm   rn   ro   rp   )r1   r+   r-   rx   rw   rr   r   r   r   r   ry   )r3   r   r}   erk   s        r$   get_researchzTavilyClient.get_research  s_   	<|''8QZ8Q8Q(QRRHH 	< 	< 	<:q::;;;	< :--==??"F!,,Xr::>>wMM    #s**-f555%88$V,,,%,,(000%,,%f---//111s&   %( 
A	AA	,<B) )
B65B6)NNNNN)NNNNNNNNNNNNrB   NNNNN)NNNr   NNNN)NNNNNNNNNNNNr   NNN)NNNNNNNNNNr   N)
rE   rI   r   r   NNr   rB   NN)	rF   rI   r   r   NNrB   NN)NNFr   N)!__name__
__module____qualname____doc__r   strdictr6   r8   r<   rA   r   intr   r   boolfloatr~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r$   r   r   	   s        6 6 6xSRUX?W 6nvwzn{ 6  T\  ]`  Ta 6  v~  B  vC 6 6 6 6>      
 TX?CFJ"& $ #'1515LPPT'+!##(,(,&*$('O2 O2O2%&OPO2 ;<O2 $$BC	O2
  O2 O2 O2 !O2 "*#O2 "*#O2 !&dG4G,H&H IO2 &+49K1L+L%MO2 !%O2 O2 O2  "&!O2" "&#O2$  $%O2& "'O2* +O2 O2 O2 O2h SW?CEI!%#"&0404KOOS&* ""'+'+%)#''/ //$%NO/ :</ ##AB	/
 / / /  / !)/ !)/  %T73F+G%GH/ %*$8J0K*K$L/  $/ / /  !%!/" !%#/$ #%/& !'/* +/ / / /f )-?C7;"$)-'+"*.72 72T#Y^,72!%72 !((; <72 !!34	72
  72 #'72 !%72 72 %(72 72 72 72 72v (,>B6:!#(,&*!)- DIsN+ $  '':;   23	
  "&  $  $'    > "# $*.,0+/-1#'#':>26 $("&%)#H2 H2H2H2 H2 	H2
 H2 #3-H2 %SMH2 $C=H2 &c]H2 !H2 !H2 ##67H2 ./H2 H2 "H2   !H2"  ##H2& 'H2 H2 H2 H2X  $!%"&,0.2-1/3%)%)<@48"&*$('+#)% )%)%)% )% 	)%
  )% %SM)% 'sm)% &c])%  (})% #)% #)% %%89)% 01)% )%  $)%  "!)%" "%#)%& ')% )% )% )%Z "# $*.,0+/-1#'#' "&?2 ?2?2?2 ?2 	?2
 ?2 #3-?2 %SM?2 $C=?2 &c]?2 !?2 !?2 ?2  ?2 ?2 ?2 ?2 ?2F  $!%"&,0.2-1/3%)%)"$(!# !#!#!# !# 	!#
  !# %SM!# 'sm!# &c]!#  (}!# #!# #!# !# "!# !# !# !# !#J _fJS'(./<@<@-1,.*.37+H +H"%+H)01Z)[+H #**F"G+H "%	+H
 ),+H -5SM+H -5SM+H (++H %*+H %(+H -1+H !$+H +H +H +H^ WaBK &'4848$&"&+/!/ !/!/!()R!S!/ "">?!/ 	!/
 !$!/ %-SM!/ %-SM!/ "!/  !/ %)!/ !/ !/ !/ !/J ;?(,!&R\-1[6 [6[6 !67[6 "&[6 	[6
 $++N#O[6 $E?[6 T9UD$->#??@[6 [6 [6 [6~ :>'+ %Q[,0!
 !
!
 56!
 !%!
 	!

 #**M"N!
 #5/!
 D)E4,=">>?!
 !
 !
 !
F#2!$#2#2 #2 #2 #2 #2 #2r&   r   c                   "     e Zd ZdZ fdZ xZS )Clientzk
    Tavily API client class.

    WARNING! This class is deprecated. Please use TavilyClient instead.
    c                     t          j        dt          d           t                                          |           d S )Nz5Client is deprecated, please use TavilyClient insteadr   r   )r   r   r   superr6   )r3   rz   	__class__s     r$   r6   zClient.__init__  sB    M(Q	8 	8 	8 	8     r&   )r   r   r   r   r6   __classcell__)r   s   @r$   r   r     sB         ! ! ! ! ! ! ! ! !r&   r   )r/   rr   r)   r   typingr   r   r   r   r   r   utilsr
   errorsr   r   r   r   r   r   r   r   r   r&   r$   <module>r      s0     				  F F F F F F F F F F F F F F F F * * * * * * C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  CS2 S2 S2 S2 S2 S2 S2 S2l
! 
! 
! 
! 
!\ 
! 
! 
! 
! 
!r&   