
    Ji%I                     "   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 d dlZd dl	m
Z
 d dlmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ erd dlZ d	e!d
e"fdZ# G d de$      Z% G d de%      Z& G d de%      Z' G d d      Z(y)    N)AnyDictTYPE_CHECKING)AsyncLlamaCloud)AsyncRetryingretry_if_exceptionstop_after_attemptwait_exponential)FileUploadResponse	JobStatusPresignedUrlResponseSpreadsheetJobSpreadsheetJobResultSpreadsheetParsingConfigSpreadsheetResultType)BASE_URL)
FileClient)augment_async_errors	FileInput	exceptionreturnc                 h    t        | t        j                        r| j                  j                  dv S y)z,Determine if an exception should be retried.)i  i  i  i  i  F)
isinstancehttpxHTTPStatusErrorresponsestatus_code)r   s    y/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/llama_cloud_services/beta/sheets/client.py_should_retry_exceptionr   $   s-    )U223!!--1JJJ    c                       e Zd ZdZy)SpreadsheetAPIErrorz)Base exception for spreadsheet API errorsN__name__
__module____qualname____doc__ r    r   r"   r"   +   s    3r    r"   c                       e Zd ZdZy)SpreadsheetJobErrorz-Exception raised when a spreadsheet job failsNr#   r(   r    r   r*   r*   1   s    7r    r*   c                       e Zd ZdZy)SpreadsheetTimeoutErrorz%Exception raised when a job times outNr#   r(   r    r   r,   r,   7   s    /r    r,   c                      e Zd ZdZ	 	 	 	 	 	 	 	 d*dedz  dedz  dededededz  d	edz  d
ej                  dz  ddfdZde	eef   fdZ
dej                  fdZde	eef   fdZ	 d+dededz  defdZ	 d+dede	ez  dz  defdZ	 d,dededefdZdedefdZej0                  fdedededefdZej0                  fdedededdfdZ	 d+dede	ez  dz  defdZ	 d+dededz  defd Z	 d+dede	ez  dz  defd!Z	 d,dededefd"Zdedefd#Z ej0                  fdedededefd$Z!ej0                  fdedededdfd%Z"	 d+dede	ez  dz  defd&Z#d-d'Z$d.d(Z%d-d)Z&y)/LlamaSheetsz)Client for the LlamaCloud Spreadsheet APINapi_keybase_urlmax_timeoutpoll_intervalmax_retries
project_idorganization_idasync_httpx_clientr   c	                 v   |xs t         j                  j                  d      | _        | j                  st	        d      |xs$ t         j                  j                  dt
              }t        |      j                  d      | _        || _	        || _
        || _        |xs t         j                  j                  d      | _        |xs t         j                  j                  d      | _        || _        t        t!        | j                  | j                  |      | j                  | j                        | _        y	)
a  Initialize the LlamaSheets client.

        Args:
            api_key: API key for authentication. If not provided, will use LLAMA_CLOUD_API_KEY env var
            base_url: Base URL for the API
            max_timeout: Maximum time to wait for job completion in seconds
            poll_interval: Interval between status checks in seconds
            max_retries: Maximum number of retries for failed requests
            project_id: Project ID for file operations. If not provided, will use LLAMA_CLOUD_PROJECT_ID env var
            organization_id: Organization ID for file operations. If not provided, will use LLAMA_CLOUD_ORGANIZATION_ID env var
            async_httpx_client: Optional custom async httpx client
        LLAMA_CLOUD_API_KEYzfAn API key must be provided either as an argument or via the LLAMA_CLOUD_API_KEY environment variable.LLAMA_CLOUD_BASE_URL/LLAMA_CLOUD_PROJECT_IDLLAMA_CLOUD_ORGANIZATION_ID)tokenr0   httpx_clientr4   r5   N)osenvirongetr/   
ValueErrorr   strrstripr0   r1   r2   r3   r4   r5   _async_clientr   r   _files_client)	selfr/   r0   r1   r2   r3   r4   r5   r6   s	            r   __init__zLlamaSheets.__init__@   s    . G"**..1F"G||x  Orzz~~.DhOH,,S1&*&$P

7O(P.  
"**..)3
 8J'll/
  00
r    c                 v    i }| j                   | j                   |d<   | j                  | j                  |d<   |S )z-Get default query parameters for API requestsr4   r5   r?   )rH   paramss     r   _get_default_paramszLlamaSheets._get_default_paramst   sA    ??&#'??F< +(,(<(<F$%r    c                     | j                   /t        j                  t        j                  d      d      | _         | j                   S )z$Get or create the async httpx clientg      N@T)timeoutfollow_redirects)rF   r   AsyncClientTimeoutrH   s    r   _get_async_clientzLlamaSheets._get_async_client~   s>    %!&!2!2d+!%"D !!!r    c                 &    d| j                    ddS )z#Get common headers for API requestszBearer zapplication/json)AuthorizationzContent-Type)r/   rR   s    r   _get_headerszLlamaSheets._get_headers   s      't||n5.
 	
r    file_obj	file_namec                     t               5  t        j                  | j                  |            cddd       S # 1 sw Y   yxY w)	  Upload a file to the Files API.

        Args:
            file_obj: File to upload (path, bytes, or file-like object)
            file_name: Optional name for the uploaded filename

        Returns:
            FileUploadResponse with the uploaded file ID
        N)r   asynciorunaupload_file)rH   rW   rX   s      r   upload_filezLlamaSheets.upload_file   s6     "# 	<;;t00:;	< 	< 	<	   $9Afile_idconfigc                     t               5  t        j                  | j                  ||            cddd       S # 1 sw Y   yxY w)Create a new spreadsheet parsing job.

        Args:
            file_id: ID of the uploaded file
            config: Parsing configuration

        Returns:
            SpreadsheetJob with job details
        N)r   r[   r\   acreate_job)rH   r`   ra   s      r   
create_jobzLlamaSheets.create_job   s<     "# 	B;;t//@A	B 	B 	B	   %:Ajob_idinclude_results_metadatac                     t               5  t        j                  | j                  ||            cddd       S # 1 sw Y   yxY w)a  Get the status of a spreadsheet parsing job.

        Args:
            job_id: ID of the job
            include_results_metadata: Whether to include results metadata in the response

        Returns:
            SpreadsheetJobResult with job status and optionally results
        N)r   r[   r\   aget_job)rH   rg   rh   s      r   get_jobzLlamaSheets.get_job   s;     "# 	P;;t}}V5MNO	P 	P 	Prf   c                     t               5  t        j                  | j                  |            cddd       S # 1 sw Y   yxY w)C  Wait for a job to complete by polling.

        Args:
            job_id: ID of the job to wait for

        Returns:
            SpreadsheetJobResult when job is complete

        Raises:
            SpreadsheetTimeoutError: If job doesn't complete within max_timeout
            SpreadsheetJobError: If job fails
        N)r   r[   r\   await_for_completion)rH   rg   s     r   wait_for_completionzLlamaSheets.wait_for_completion   s:     "# 	B;;t88@A	B 	B 	Br_   	region_idresult_typec                     t               5  t        j                  | j                  |||            cddd       S # 1 sw Y   yxY w)+  Download a region result (either region data or cell metadata).

        Args:
            job_id: ID of the job
            region_id: ID of the region
            result_type: Type of result to download (region or cell_metadata)

        Returns:
            Raw bytes of the parquet file
        N)r   r[   r\   adownload_region_resultrH   rg   rp   rq   s       r   download_region_resultz"LlamaSheets.download_region_result   s=      "# 	;;,,VYL	 	 		   &;Azpd.DataFramec                     t               5  t        j                  | j                  |||            cddd       S # 1 sw Y   yxY w)  Download a region result as a pandas DataFrame.

        Args:
            job_id: ID of the job
            region_id: ID of the region
            result_type: Type of result to download (region or cell_metadata)

        Returns:
            pandas DataFrame
        N)r   r[   r\   adownload_region_as_dataframeru   s       r   download_region_as_dataframez(LlamaSheets.download_region_as_dataframe   s=      "# 	;;2269kR	 	 	rw   c                     t               5  t        j                  | j                  ||            cddd       S # 1 sw Y   yxY wa  High-level method to parse a spreadsheet file.

        This method handles the entire workflow:
        1. Upload the file
        2. Create a parsing job
        3. Wait for completion
        4. Return results

        Args:
            file_obj: File to parse (path, bytes, or file-like object)
            config: Parsing configuration

        Returns:
            SpreadsheetJobResult with parsing results
        N)r   r[   r\   aextract_regions)rH   rW   ra   s      r   extract_regionszLlamaSheets.extract_regions   s<    ( "# 	H;;t44XvFG	H 	H 	Hrf   c                 t  K   	 t        t        | j                        t        ddd      t	        t
              d      2 3 d{   }|5  | j                  j                  ||       d{   cddd       c S 7 77 # 1 sw Y   IxY w6 	 t        d	      # t        $ r}t        d|       |d}~ww xY ww)
rZ          
multiplierminmaxTstopwaitretryreraiseN)external_file_idzFailed to upload file: Tenacity did not execute)r   r	   r3   r
   r   r   rG   upload_content	Exceptionr"   RuntimeError)rH   rW   rX   attemptes        r   r]   zLlamaSheets.aupload_file  s     	L!.'(8(89%rB()@A	" 	 	g  !%!3!3!B!B 9 "C "  	 " 566  	L%(?s&CD!K	Lsu   B8;B BA;BB 
!A?+A=,A?/B :B8;B=A??B	B B8	B5!B00B55B8c                   K   |t               }n%t        |t              rt        j                  |      }t        |t               st	        d      ||j                  dd      d}| j                         }	 t        t        | j                        t        ddd	      t        t              d
      2 3 d{   }|5  | j                         }|j                  | j                   d| j!                         ||       d{   }|j#                          t%        j                  |j'                               cddd       c S 7 7 D# 1 sw Y   xY w6 	 t-        d      # t(        $ r}t+        d|       |d}~ww xY ww)rc   Nz:config must be a dict or SpreadsheetParsingConfig instancejsonT)modeexclude_none)r`   ra   r   r   r   r   z/api/v1/beta/sheets/jobs)headersrK   r   zFailed to create job: r   )r   r   dictmodel_validaterC   
model_dumprL   r   r	   r3   r
   r   r   rS   postr0   rV   raise_for_statusr   r   r   r"   r   )	rH   r`   ra   payloadrK   r   clientr   r   s	            r   rd   zLlamaSheets.acreate_job-  s     >-/F%-<<VDF&":;L 
 ''V$'G

 ))+	K!.'(8(89%rB()@A	" J Jg  	J!335F%+[[==/)AB $ 1 1 3%$	 &1 &  H --/)88I	J 	JJ 	J 	J"$ 566  	K%(>qc&BCJ	Ksy   A4F7;E! 2E6E7E:E! =AEE6E8E! FEEE	E! F!	E>*E99E>>Fc                 J  K   	 t        t        | j                        t        ddd      t	        t
              d      2 3 d{   }|5  | j                         }d|i| j                         }|j                  | j                   d| | j                         |	       d{   }|j                          t        j                  |j                               cddd       c S 7 7 D# 1 sw Y   xY w6 	 t#        d      # t        $ r}t!        d
|       |d}~ww xY ww)a  Get the status of a spreadsheet parsing job.

        Args:
            job_id: ID of the job
            include_results_metadata: Whether to include results in the response

        Returns:
            SpreadsheetJobResult with job status and optionally results
        r   r   r   Tr   Ninclude_results/api/v1/beta/sheets/jobs/r   rK   zFailed to get job status: r   )r   r	   r3   r
   r   r   rS   rL   rB   r0   rV   r   r   r   r   r   r"   r   )rH   rg   rh   r   r   rK   r   r   s           r   rj   zLlamaSheets.aget_joba  s>    	O!.'(8(89%rB()@A	" P Pg  P!335F)+C.224.F &,ZZ==/)B6(K $ 1 1 3% &0 &  H
 --//>>x}}OP PP P P", 566  	O%(B1#&FGQN	Osv   D#;D C6C&C6D 
AC*#C($6C*D %D#&C6(C**C3	/D 8D#	D DD  D#c                   K   t        j                          }t        j                          |z
  | j                  k  r'| j                  |d       d{   }|j                  t        j
                  t        j                  t        j                  t        j                  fv ru|j                  t        j
                  t        j                  fv r|S d|j                   }|j                  r!|ddj                  |j                         z  }t        |      t        j                  | j                         d{    t        j                          |z
  | j                  k  r't        d| j                   d      7 *7 Fw)	rm   T)rh   NzJob failed with status: z	
Errors: z, zJob did not complete within z seconds)timer1   rj   statusr   SUCCESSPARTIAL_SUCCESSERRORFAILUREerrorsjoinr*   r[   sleepr2   r,   )rH   rg   
start_time
job_result	error_msgs        r   rn   z LlamaSheets.await_for_completion  sF     YY[
yy{Z'4+;+;;#}}Vd}SSJ  !!))!!	%  $$):):I<U<U(VV%%"::;L;L:M NI!((!z$))J<M<M2N1O%PP	-i88-- 2 2333# yy{Z'4+;+;;& &*4+;+;*<HE
 	
% T  4s+   AFE<C%F8E?9(F#F?Fc                   K   d}t        |      }| j                         }	 t        t        | j                        t        ddd      t        t              d      2 3 d{   }|5  | j                         }|j                  | j                   d| d| d	| | j                         |
       d{   }	|	j                          t        j                  |	j                               }ddd       7 7 B# 1 sw Y   xY w6 n # t         $ r}
t#        d|
       |
d}
~
ww xY w|t#        d      	 t        t        | j                        t        ddd      t        t              d      2 3 d{  7  }|5  j                  |j$                         d{  7  }|j                          |j&                  cddd       c S # 1 sw Y   axY w6 	 t)        d      # t         $ r}
t#        d|
       |
d}
~
ww xY ww)rs   Nr   r   r   Tr   r   z	/regions/z/result/r   zFailed to get presigned URL: zFailed to obtain presigned URL.zFailed to download result: r   )rD   rL   r   r	   r3   r
   r   r   rS   rB   r0   rV   r   r   r   r   r   r"   urlcontentr   )rH   rg   rp   rq   presigned_responseresult_type_strrK   r   r   r   r   download_responses               r   rt   z#LlamaSheets.adownload_region_result  s    " "k*))+	R!.'(8(89%rB()@A	"  g  
!335F%+ZZ==/)B6()T]S^^fgvfwx $ 1 1 3% &0 &  H
 --/)=)L)L *&
 
 
 
""  	R%(EaS&IJPQQ	R %%&GHH	P!.'(8(89%rB()@A	" 	5 	5g  5.4jj9K9O9O.P(P(P%%668,445 5 5" 566  	P%(CA3&GHaO	Ps   G?;D D C3!D$D 'AC72C537C7*	D 3D5C77D 	<D G?	D"DD""G?3;G .G2E53G7G :GF G:G G?G	G G?	G<(G77G<<G?c                    K   ddl }| j                  |||       d{   } |j                  t        j                  |            S 7 )w)ry   r   N)pandasrt   read_parquetioBytesIO)rH   rg   rp   rq   pdparquet_bytess         r   rz   z)LlamaSheets.adownload_region_as_dataframe  sH       	"::I{
 
 rrzz-899
s   A	A*A	c                    K   | j                  |       d{   }| j                  |j                  |       d{   }| j                  |j                         d{   S 7 K7 )7 wr}   )r]   rd   idrn   )rH   rW   ra   file_responsejobs        r   r~   zLlamaSheets.aextract_regions   sc     * #//99 $$]%5%5v>> ..svv666 : ? 7s1   A)A##A)A%"A)A'A)%A)'A)c                 n   K   | j                   r#| j                   j                          d{    yy7 w)zClose all HTTP clients (async)N)rF   acloserR   s    r   r   zLlamaSheets.aclose  s/     $$++--- -s   *535c                    K   | S wNr(   rR   s    r   
__aenter__zLlamaSheets.__aenter__"  s     s   c                 @   K   | j                          d {    y 7 wr   )r   )rH   	_exc_type_exc_val_exc_tbs       r   	__aexit__zLlamaSheets.__aexit__%  s     kkms   )NNi,        NNNr   )T)r   N)r   r.   )'r$   r%   r&   r'   rD   intr   rP   rI   r   rL   rS   rV   r   r   r^   r   r   re   boolr   rk   ro   r   TABLEbytesrv   r{   r   r]   rd   rj   rn   rt   rz   r~   r   r   r   r(   r    r   r.   r.   =   sP   3 ##!%&*7;2
t2
 *2
 	2

 2
 2
 $J2
 t2
 "--42
 
2
hT#s(^ "5#4#4 "
d38n 
 <@<!<.1Dj<	<$ :>BB //$6B 
	B$ =APP59P	PB# B2F B( .C-H-H	  +	
 
2 .C-H-H	  +	
 
0 :>HH //$6H 
	H4 <@7!7.1Dj7	7< :>2727 //$627 
	27j =A#7#759#7	#7J$
 $
9M $
T .C-H-H	;7;7 ;7 +	;7
 
;7B .C-H-H	:: : +	:
 
:4 :>77 //$67 
	7:.
r    r.   ))r[   r   r@   r   typingr   r   r   r   llama_cloud.clientr   tenacityr   r   r	   r
   &llama_cloud_services.beta.sheets.typesr   r   r   r   r   r   r   llama_cloud_services.constantsr   !llama_cloud_services.files.clientr   llama_cloud_services.utilsr   r   r   r   BaseExceptionr   r   r   r"   r*   r,   r.   r(   r    r   <module>r      s     	 	  + +  .    4 8
 }  	) 		- 		1 	i ir    