Ë
    µŒjM<  ã                   ó   — d Z ddlZddlZddlZddlmZ ddl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 ddlmZ dd	lmZ dd
lmZ erddlmZ ddlmZ  ej8                  e«      Ze G d„ d«      «       Z eddd¬«       G d„ de«      «       Z y)zÌModule contains a PDF parser based on Document AI from Google Cloud.

You need to install two libraries to use this parser:
pip install google-cloud-documentai
pip install google-cloud-documentai-toolbox
é    N)Ú	dataclass)ÚTYPE_CHECKINGÚIteratorÚListÚOptionalÚSequence)Ú
deprecated)ÚDocument)Úbatch_iterate)ÚBaseBlobParser)ÚBlob)Úget_client_info)Ú	Operation©ÚDocumentProcessorServiceClientc                   ó&   — e Zd ZU dZeed<   eed<   y)ÚDocAIParsingResultsz/Dataclass to store Document AI parsing results.Úsource_pathÚparsed_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    ú|/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/document_loaders/parsers/docai.pyr   r      s   … á9àÓØÔr   r   z0.0.32z1.0z&langchain_google_community.DocAIParser)ÚsinceÚremovalÚalternative_importc                   óŽ  — e Zd ZdZdddddœded   dee   dee   dee   fd	„Zd
edee	   fd„Z
	 	 	 d"d
ededee   deee      dee	   f
d„Z	 	 	 d#dee   dee   dededee	   f
d„Zdee   dee	   fd„Zdee   ded   fd„Zded   defd„Zddddddœdee   dee   dee   dededee   ded   fd „Zded   dee   fd!„Zy)$ÚDocAIParserz²`Google Cloud Document AI` parser.

    For a detailed explanation of Document AI, refer to the product documentation.
    https://cloud.google.com/document-ai/docs/overview
    N)ÚclientÚlocationÚgcs_output_pathÚprocessor_namer$   r   r%   r&   r'   c                óh  — t        |«      t        |«      k(  rt        d«      ‚d}|r%t        j                  ||«      st        d|› d�«      ‚|| _        || _        |r|| _        y		 ddlm} ddl	m
}  ||› d
�¬«      }	 ||	t        d¬«      ¬«      | _        y	# t        $ r}t        d«      |‚d	}~ww xY w)aõ  Initializes the parser.

        Args:
            client: a DocumentProcessorServiceClient to use
            location: a Google Cloud location where a Document AI processor is located
            gcs_output_path: a path on Google Cloud Storage to store parsing results
            processor_name: full resource name of a Document AI processor or processor
                version

        You should provide either a client or location (and then a client
            would be instantiated).
        zGYou must specify either a client or a location to instantiate a client.z?projects\/[0-9]+\/locations\/[a-z\-0-9]+\/processors\/[a-z0-9]+zProcessor name zï has the wrong format. If your prediction endpoint looks like https://us-documentai.googleapis.com/v1/projects/PROJECT_ID/locations/us/processors/PROCESSOR_ID:process, use only projects/PROJECT_ID/locations/us/processors/PROCESSOR_ID part.r   )ÚClientOptionsr   úZdocumentai package not found, please install it with `pip install google-cloud-documentai`Nz-documentai.googleapis.com)Úapi_endpointzdocument-ai)Úmodule)Úclient_optionsÚclient_info)ÚboolÚ
ValueErrorÚreÚ	fullmatchÚ_gcs_output_pathÚ_processor_nameÚ_clientÚgoogle.api_core.client_optionsr)   Úgoogle.cloud.documentair   ÚImportErrorr   )
Úselfr$   r%   r&   r'   Úpatternr)   r   ÚexcÚoptionss
             r   Ú__init__zDocAIParser.__init__2   sÝ   € ô* �‹<œ4 ›>Ò)Üðóð ð
 UˆÙ¤"§,¡,¨w¸Ô"GÜØ! .Ð!1ð 2ð óð ð !0ˆÔØ-ˆÔÙØ!ˆD�LðÝHÝRñ $Ø (˜zÐ)CÐDôˆGñ :Ø&Ü+°=ÔAôˆD�Løô ò Ü!ð=óð ðûðús   Á%B Â	B1Â B,Â,B1ÚblobÚreturnc              #   ó\   K  — | j                  |g| j                  ¬«      E d{  –—†  y7 Œ­w)zÜParses a blob lazily.

        Args:
            blobs: a Blob to parse

        This is a long-running operation. A recommended way is to batch
            documents together and use the `batch_parse()` method.
        ©r&   N)Úbatch_parser3   )r9   r>   s     r   Ú
lazy_parsezDocAIParser.lazy_parsel   s)   è ø€ ð ×#Ñ# T F¸D×<QÑ<QÐ#ÓR×RÒRús   ‚",¤*¥,TÚenable_native_pdf_parsingÚ
field_maskÚ
page_rangec           
   #   ó  ‡‡‡K  — 	 ddl m} ddlm}m}m} 	 ddlmŠ |r	 ||¬«      nd}
|r	 ||¬	«      nd}| j                  j                  |j                  | j                  |j                  ‰j                  ‰j                  xs d
¬«       ||
|¬«      d|¬«      «      Šˆˆˆfd„‰j                   j"                  D «       E d{  –—†  y# t        $ r}	t        d«      |	‚d}	~	ww xY w# t        $ r}	t        d«      |	‚d}	~	ww xY w7 Œ?­w)aÜ  Parses a blob lazily using online processing.

        Args:
            blob: a blob to parse.
            enable_native_pdf_parsing: enable pdf embedded text extraction
            field_mask: a comma-separated list of which fields to include in the
                Document AI response.
                suggested: "text,pages.pageNumber,pages.layout"
            page_range: list of page numbers to parse. If `None`,
                entire document will be parsed.
        r   ©Ú
documentai)ÚIndividualPageSelectorÚ	OcrConfigÚProcessOptionsr*   N©Ú_text_from_layoutújdocumentai_toolbox package not found, please install it with `pip install google-cloud-documentai-toolbox`©rD   )Úpagesúapplication/pdf©Úgcs_uriÚ	mime_type)Ú
ocr_configÚindividual_page_selectorT)ÚnameÚgcs_documentÚprocess_optionsÚskip_human_reviewrE   c              3   ó°   •K  — | ]M  }t         ‰|j                  ‰j                  j                  «      |j                  ‰j
                  d œ¬«      –— ŒO y­w©)ÚpageÚsource)Úpage_contentÚmetadataN)r
   ÚlayoutÚdocumentÚtextÚpage_numberÚpath)Ú.0r^   rN   r>   Úresponses     €€€r   Ú	<genexpr>z-DocAIParser.online_process.<locals>.<genexpr>´   sV   øè ø€ ð 	
ñ 0�ô Ù.¨t¯{©{¸H×<MÑ<M×<RÑ<RÓSà ×,Ñ,Ø"Ÿi™iñ÷ð ñ 0ùs   ƒAA)Úgoogle.cloudrI   Ú google.cloud.documentai_v1.typesrJ   rK   rL   r8   Ú-google.cloud.documentai_toolbox.wrappers.pagerN   r5   Úprocess_documentÚProcessRequestr4   ÚGcsDocumentrf   Úmimetyperc   rQ   )r9   r>   rD   rE   rF   rI   rJ   rK   rL   r;   rV   rW   rN   rh   s    `          @@r   Úonline_processzDocAIParser.online_processw   s<  úè ø€ ð$	Ý/÷ñ ð	ÝWñ )ñ Ð0IÕJàð 	ñ 9CÑ"¨Õ4Èð 	!ð —<‘<×0Ñ0Ø×%Ñ%Ø×)Ñ)Ø'×3Ñ3Ø ŸI™IØ"Ÿm™mÒ@Ð/@ð 4ó ñ !/Ø)Ø-Eô!ð #'Ø%ð &ó ó
ˆõ	
ð !×)Ñ)×/Ò/ó	
÷ 		
ñ 		
øôI ò 	Üð9óð ðûð	ûô ò 	ÜðAóð ðûð	úð:		
úsQ   …D‡C ˜C) žB(DÃDÃDÃ	C&ÃC!Ã!C&Ã&DÃ)	DÃ2C>Ã>DÄDÚblobsÚtimeout_secÚcheck_in_interval_secc              #   ó  K  — |xs | j                   }|st        d«      ‚| j                  ||¬«      }|D �cg c]  }|j                  j                  ‘Œ }}t
        j                  d|«       d}	| j                  |«      rUt        j                  |«       |	|z  }	|	|kD  rt        d|› d�«      ‚t
        j                  d«       | j                  |«      rŒU| j                  |¬«      }
| j                  |
«      E d	{  –—†  y	c c}w 7 Œ
­w)
a  Parses a list of blobs lazily.

        Args:
            blobs: a list of blobs to parse.
            gcs_output_path: a path on Google Cloud Storage to store parsing results.
            timeout_sec: a timeout to wait for Document AI to complete, in seconds.
            check_in_interval_sec: an interval to wait until next check
                whether parsing operations have been completed, in seconds
        This is a long-running operation. A recommended way is to decouple
            parsing from creating LangChain Documents:
            >>> operations = parser.docai_parse(blobs, gcs_path)
            >>> parser.is_running(operations)
            You can get operations names and save them:
            >>> names = [op.operation.name for op in operations]
            And when all operations are finished, you can use their results:
            >>> operations = parser.operations_from_names(operation_names)
            >>> results = parser.get_results(operations)
            >>> docs = parser.parse_from_results(results)
        ú:An output path on Google Cloud Storage should be provided.rA   z9Started parsing with Document AI, submitted operations %sr   z#Timeout exceeded! Check operations z later!Ú.)Ú
operationsN)r3   r0   Údocai_parseÚ	operationrX   ÚloggerÚdebugÚ
is_runningÚtimeÚsleepÚTimeoutErrorÚget_resultsÚparse_from_results)r9   rr   r&   rs   rt   Úoutput_pathrx   ÚopÚoperation_namesÚtime_elapsedÚresultss              r   rB   zDocAIParser.batch_parse¿   s  è ø€ ð4 &Ò>¨×)>Ñ)>ˆÙÜØLóð ð ×%Ñ% e¸[Ð%ÓIˆ
Ù7AÓB±z°˜2Ÿ<™<×,Ó,°zˆÐBÜ�‰ØGÈô	
ð ˆØ�o‰o˜jÔ)Ü�J‰JÐ,Ô-ØÐ1Ñ1ˆLØ˜kÒ)Ü"Ø9¸/Ð9JÈ'ÐRóð ô �L‰L˜Ôð �o‰o˜jÕ)ð ×"Ñ"¨jÐ"Ó9ˆØ×*Ñ*¨7Ó3×3Ñ3ùò Cð 	4ús#   ‚5D·D ÁA?DÃ&DÃ:DÃ;Dr‡   c              #   óæ   ‡‡	K  — 	 ddl m} ddlm} ddlmŠ |D ]4  Š	 |‰	j                  «      \  }} |||«      }ˆˆ	fd„|D «       E d {  –—†  Œ6 y # t        $ r}t        d«      |‚d }~ww xY w7 Œ$­w)Nr   )Úsplit_gcs_uri)Ú_get_shardsrM   rO   c              3   ó¾   •K  — | ]T  }|j                   D ]C  }t         ‰|j                  |j                  «      |j                  ‰j
                  d œ¬«      –— ŒE ŒV y­wr]   )rQ   r
   rb   rd   re   r   )rg   Úshardr^   rN   Úresults      €€r   ri   z1DocAIParser.parse_from_results.<locals>.<genexpr>  s`   øè ø€ ð ñ
 $�EØ!ŸKœK�Dô Ù!2°4·;±;ÀÇ
Á
Ó!KØ&*×&6Ñ&6À&×BTÑBTÑU÷ð ð
 (ðñ $ùs   ƒAA)Ú7google.cloud.documentai_toolbox.utilities.gcs_utilitiesr‰   Ú1google.cloud.documentai_toolbox.wrappers.documentrŠ   rl   rN   r8   r   )
r9   r‡   r‰   rŠ   r;   Úgcs_bucket_nameÚ
gcs_prefixÚshardsrN   r�   s
           @@r   r‚   zDocAIParser.parse_from_resultsð   s�   ùè ø€ ð
	õõ VÝWó ˆFÙ*7¸×8JÑ8JÓ*KÑ'ˆO˜ZÙ  °*Ó=ˆFôñ
 $ó÷ ñ ñ øô ò 	ÜðAóð ðûð	úðús3   „A1†A ˜2A1Á
A/ÁA1Á	A,ÁA'Á'A,Á,A1r…   r   c                 ó¶   — 	 ddl m} |D �cg c]%  }| j                  j	                   ||¬«      ¬«      ‘Œ' c}S # t        $ r}t        d«      |‚d}~ww xY wc c}w )z5Initializes Long-Running Operations from their names.r   )ÚGetOperationRequestzhlong running operations package not found, please install it with `pip install gapic-google-longrunning`N)rX   )Úrequest)Ú!google.longrunning.operations_pb2r”   r8   r5   Úget_operation)r9   r…   r”   r;   rX   s        r   Úoperations_from_namesz!DocAIParser.operations_from_names
  ss   € ð	õñ (ó
á'�ð �L‰L×&Ñ&Ñ/BÈÔ/MÐ&ÕNØ'ñ
ð 	
øô ò 	Üð:óð ðûð	üò
s   ‚9 Œ*A¹	AÁAÁArx   c                 ó&   — t        d„ |D «       «      S )Nc              3   ó>   K  — | ]  }|j                  «        –— Œ y ­w)N)Údone)rg   r„   s     r   ri   z)DocAIParser.is_running.<locals>.<genexpr>  s   è ø€ Ð6©: R�r—w‘w“y”=©:ùs   ‚)Úany)r9   rx   s     r   r}   zDocAIParser.is_running  s   € ÜÑ6©:Ó6Ó6Ð6r   iè  )r&   r'   Ú
batch_sizerD   rE   r�   c                ó´  — 	 ddl m} ddlm}m}	 |xs | j                  }|€t        d«      ‚|xs | j                  }|€t        d«      ‚g }t        ||¬«      D ]Ú  }|j                  |j                  |D �cg c]-  }|j                  |j                  |j                  xs d	¬
«      ‘Œ/ c}¬«      ¬«      }|j                  |j                  j!                  ||¬«      ¬«      }|r |	 ||¬«      ¬«      nd}|j#                  | j$                  j'                  |j)                  ||||d¬«      «      «       ŒÜ |S # t
        $ r}
t        d«      |
‚d}
~
ww xY wc c}w )a3  Runs Google Document AI PDF Batch Processing on a list of blobs.

        Args:
            blobs: a list of blobs to be parsed
            gcs_output_path: a path (folder) on GCS to store results
            processor_name: name of a Document AI processor.
            batch_size: amount of documents per batch
            enable_native_pdf_parsing: a config option for the parser
            field_mask: a comma-separated list of which fields to include in the
                Document AI response.
                suggested: "text,pages.pageNumber,pages.layout"

        Document AI has a 1000 file limit per batch, so batches larger than that need
        to be split into multiple requests.
        Batch processing is an async long-running operation
        and results are stored in a output GCS bucket.
        r   rH   )rK   rL   r*   Nrv   z0A Document AI processor name should be provided.)ÚsizeÚiterablerR   rS   )Ú	documents)Úgcs_documents)rT   rE   )Úgcs_output_configrP   )rV   T)rX   Úinput_documentsÚdocument_output_configrZ   r[   )rj   rI   rk   rK   rL   r8   r3   r0   r4   r   ÚBatchDocumentsInputConfigÚGcsDocumentsro   rf   rp   ÚDocumentOutputConfigÚGcsOutputConfigÚappendr5   Úbatch_process_documentsÚBatchProcessRequest)r9   rr   r&   r'   r�   rD   rE   rI   rK   rL   r;   rƒ   rx   Úbatchr>   Úinput_configÚoutput_configrZ   s                     r   ry   zDocAIParser.docai_parse  s³  € ð6	Ý/ßRð &Ò>¨×)>Ñ)>ˆØÐÜØLóð ð (Ò?¨4×+?Ñ+?ˆØÐ!ÜÐOÓPÐPàˆ
Ü"¨
¸U×CˆEØ%×?Ñ?Ø(×5Ñ5ñ %*óñ
 %*˜Dð	 #×.Ñ.Ø$(§I¡IØ&*§m¡mÒ&HÐ7Hð /õ ð %*ñð 6ó ð @ó 
ˆLð '×;Ñ;Ø",×"AÑ"A×"QÑ"QØ'°Jð #Ró #ð <ó ˆMñ -ñ Ù(Ø2Kô õð ð ð ×ÑØ—‘×4Ñ4Ø×2Ñ2Ø+Ø(4Ø/<Ø(7Ø*.ð 3ó óõ
ð9 DðN Ðøôo ò 	Üð9óð ðûð	üò&s   ‚D8 Á62EÄ8	EÅEÅEc           	      óx  — 	 ddl m} |D ��cg c]ƒ  }t        |j                  |«      r|j                  j
                  n.|j                  |j                  j                  «      j
                  D ]#  }t        |j                  |j                  ¬«      ‘Œ% Œ… c}}S # t        $ r}t        d«      |‚d }~ww xY wc c}}w )Nr   )ÚBatchProcessMetadatar*   )r   r   )Úgoogle.cloud.documentai_v1r±   r8   Ú
isinstancera   Úindividual_process_statusesÚdeserializeÚvaluer   Úinput_gcs_sourceÚoutput_gcs_destination)r9   rx   r±   r;   r„   Ústatuss         r   r�   zDocAIParser.get_resultsu  sÉ   € ð	ÝGñ !ô
ñ
 !�ô ˜bŸk™kÐ+?Ô@ð —‘×7Ò7à)×5Ñ5Ø—K‘K×%Ñ%óç-Ñ-ò	.ð ô  Ø"×3Ñ3Ø"×9Ñ9öð.ðð !ò
ð 	
øô ò 	Üð9óð ðûð	üó
s   ‚B �BB6Â	B3Â"B.Â.B3)TNN)Ni  é<   )r   r   r   r   r   r   r=   r   r   r
   rC   r/   r   Úintrq   r   rB   r   r‚   r˜   r}   ry   r�   r   r   r   r#   r#   &   s  „ ñð >BØ"&Ø)-Ø(,ò8ð Ð9Ñ:ð8ð ˜3‘-ð	8ð
 " #™ð8ð ! ™ó8ðt	S˜tð 	S¨°Ñ(:ó 	Sð +/Ø$(Ø*.ñF
àðF
ð $(ðF
ð ˜S‘Mð	F
ð
 ˜T #™YÑ'ðF
ð 
�(Ñ	óF
ðV *.ØØ%'ñ/4à˜‰~ð/4ð " #™ð/4ð ð	/4ð
  #ð/4ð 
�(Ñ	ó/4ðbØÐ/Ñ0ðà	�(Ñ	óð4
°T¸#±Yð 
À4ÈÑCTó 
ð"7 T¨+Ñ%6ð 7¸4ó 7ð *.Ø(,ØØ*.Ø$(òUà˜‰~ðUð " #™ð	Uð
 ! ™ðUð ðUð $(ðUð ˜S‘MðUð 
ˆkÑ	óUðn
 d¨;Ñ&7ð 
¸DÐATÑ<Uô 
r   r#   )!r   Úloggingr1   r~   Údataclassesr   Útypingr   r   r   r   r   Úlangchain_core._api.deprecationr	   Úlangchain_core.documentsr
   Úlangchain_core.utils.iterr   Ú)langchain_community.document_loaders.baser   Ú1langchain_community.document_loaders.blob_loadersr   Ú&langchain_community.utilities.vertexair   Úgoogle.api_core.operationr   r7   r   Ú	getLoggerr   r{   r   r#   r   r   r   Ú<module>rÇ      s’   ðñó Û 	Û Ý !ß DÕ Då 6Ý -Ý 3å DÝ BÝ BáÝ3ÝFð 
ˆ×	Ñ	˜8Ó	$€ð ÷ð ó ðñ Ø
ØØ?ôô
`
�.ó `
óñ
`
r   