§
    šŠtjM<  ã                   ó<  — 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j        e¦  «        Ze G d„ d¦  «        ¦   «         Z eddd¬¦  «         G d„ de¦  «        ¦   «         Z dS )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<   dS )ÚDocAIParsingResultsz/Dataclass to store Document AI parsing results.Úsource_pathÚparsed_pathN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    úp/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/parsers/docai.pyr   r      s0   € € € € € € à9Ð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dS )&Ú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                ó¬  — t          |¦  «        t          |¦  «        k    rt          d¦  «        ‚d}|r(t          j        ||¦  «        st          d|› d�¦  «        ‚|| _        || _        |r	|| _        d	S 	 ddlm} ddl	m
} n"# t          $ r}t          d¦  «        |‚d	}~ww xY w ||› d
�¬¦  «        }	 ||	t          d¬¦  «        ¬¦  «        | _        d	S )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Ô"Gð 	Ýð .ð ð ð ñô ð ð !0ˆÔØ-ˆÔØð 	Ø!ˆDŒLˆLˆLðØHÐHÐHÐHÐHÐHØRÐRÐRÐRÐRÐRÐRøÝð ð ð Ý!ð=ñô ð ðøøøøðøøøð
 $�mØ (ÐDÐDÐDðñ ô ˆGð :Ð9Ø&Ý+°=ÐAÑAÔAðñ ô ˆDŒLˆLˆLs   Á6B Â
B"ÂBÂB"ÚblobÚreturnc              #   óP   K  — |                       |g| j        ¬¦  «        E d{V —† dS )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Ð#ÑRÔRÐRÐRÐRÐRÐRÐRÐRÐRÐRr   TÚenable_native_pdf_parsingÚ
field_maskÚ
page_rangec           
   #   ó  ‡‡‡K  — 	 ddl m} ddlm}m}m} n"# t          $ r}	t          d¦  «        |	‚d}	~	ww xY w	 ddlmŠ n"# t          $ r}	t          d¦  «        |	‚d}	~	ww xY w|r ||¬¦  «        nd}
|r ||¬	¦  «        nd}| j	         
                    |                     | j        |                     ‰j        ‰j        pd
¬¦  «         ||
|¬¦  «        d|¬¦  «        ¦  «        Šˆˆˆfd„‰j        j        D ¦   «         E d{V —† dS )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  — | ];}t           ‰|j        ‰j        j        ¦  «        |j        ‰j        d œ¬¦  «        V — Œ<dS ©)ÚpageÚsource)Úpage_contentÚmetadataN)r
   ÚlayoutÚdocumentÚtextÚpage_numberÚpath)Ú.0r^   rN   r>   Úresponses     €€€r   ú	<genexpr>z-DocAIParser.online_process.<locals>.<genexpr>´   su   øè è € ð 	
ð 	
ð õ Ø.Ð.¨t¬{¸HÔ<MÔ<RÑSÔSà Ô,Ø"œiðð ðñ ô ð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   )Ú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  øøøè è € ð$	Ø/Ð/Ð/Ð/Ð/Ð/ðð ð ð ð ð ð ð ð ð ð øõ
 ð 	ð 	ð 	Ýð9ñô ð ðøøøøð	øøøð
	ØWÐWÐWÐWÐWÐWÐWøÝð 	ð 	ð 	ÝðAñô ð ðøøøøð	øøøð )ðˆIˆIÐ0IÐJÑJÔJÐJàð 	ð 9CÐLÐ"Ð"¨Ð4Ñ4Ô4Ð4Èð 	!ð ”<×0Ò0Ø×%Ò%ØÔ)Ø'×3Ò3Ø œIØ"œmÐ@Ð/@ð 4ñ ô ð !/ Ø)Ø-Eð!ñ !ô !ð #'Ø%ð &ñ ô ñ
ô 
ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð !Ô)Ô/ð	
ñ 	
ô 	
ð 		
ð 		
ð 		
ð 		
ð 		
ð 		
ð 		
ð 		
ð 		
s'   ‡ ˜
7¢2²7»A Á
A!ÁAÁA!é  é<   ÚblobsÚtimeout_secÚcheck_in_interval_secc              #   ó  K  — |p| j         }|st          d¦  «        ‚|                      ||¬¦  «        }d„ |D ¦   «         }t                               d|¦  «         d}|                      |¦  «        rat          j        |¦  «         ||z  }||k    rt          d|› d�¦  «        ‚t                               d¦  «         |                      |¦  «        °a|  	                    |¬	¦  «        }	|  
                    |	¦  «        E d
{V —† d
S )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   c                 ó&   — g | ]}|j         j        ‘ŒS r   )Ú	operationrX   ©rg   Úops     r   ú
<listcomp>z+DocAIParser.batch_parse.<locals>.<listcomp>ß   s   € ÐBÐBÐB°˜2œ<Ô,ÐBÐBÐBr   z9Started parsing with Document AI, submitted operations %sr   z#Timeout exceeded! Check operations z later!ú.)Ú
operationsN)r3   r0   Údocai_parseÚloggerÚdebugÚ
is_runningÚtimeÚsleepÚTimeoutErrorÚget_resultsÚparse_from_results)
r9   rt   r&   ru   rv   Úoutput_pathr   Úoperation_namesÚtime_elapsedÚresultss
             r   rB   zDocAIParser.batch_parse¿   sJ  è è € ð4 &Ð>¨Ô)>ˆØð 	ÝØLñô ð ð ×%Ò% e¸[Ð%ÑIÔIˆ
ØBÐB°zÐBÑBÔBˆÝ�ŠØGÈñ	
ô 	
ð 	
ð ˆØ�oŠo˜jÑ)Ô)ð 	ÝŒJÐ,Ñ-Ô-Ð-ØÐ1Ñ1ˆLØ˜kÒ)Ð)Ý"ØR¸/ÐRÐRÐRñô ð õ �LŠL˜ÑÔÐð �oŠo˜jÑ)Ô)ð 	ð ×"Ò"¨jÐ"Ñ9Ô9ˆØ×*Ò*¨7Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3r   rŒ   c              #   óì   ‡‡	K  — 	 ddl m} ddlm} ddlmŠ n"# t          $ r}t          d¦  «        |‚d }~ww xY w|D ]6Š	 |‰	j        ¦  «        \  }} |||¦  «        }ˆˆ	fd„|D ¦   «         E d {V —† Œ7d S )Nr   )Úsplit_gcs_uri)Ú_get_shardsrM   rO   c              3   ó�   •K  — | ]@}|j         D ]6}t           ‰|j        |j        ¦  «        |j        ‰j        d œ¬¦  «        V — Œ7ŒAdS r]   )rQ   r
   rb   rd   re   r   )rg   Úshardr^   rN   Úresults      €€r   ri   z1DocAIParser.parse_from_results.<locals>.<genexpr>  s†   øè è € ð ð ð
 Ø!œKðð ð õ Ø!2Ð!2°4´;ÀÄ
Ñ!KÔ!KØ&*Ô&6À&ÔBTÐUÐUðñ ô ðð ð ð ð ð ð r   )Ú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ÐUÐUÐUÐUÐUØWÐWÐWÐWÐWÐWÐWøÝð 	ð 	ð 	ÝðAñô ð ðøøøøð	øøøð
 ð 
	ð 
	ˆFØ*7¨-¸Ô8JÑ*KÔ*KÑ'ˆO˜ZØ �[ °*Ñ=Ô=ˆFðð ð ð ð ð
 $ðñ ô ð ð ð ð ð ð ð ð ð
	ð 
	s   † ™
8£3³8rŠ   r   c                 óx   ‡ ‡— 	 ddl mŠ n"# t          $ r}t          d¦  «        |‚d}~ww xY wˆˆ fd„|D ¦   «         S )z5Initializes Long-Running Operations from their names.r   )ÚGetOperationRequestzhlong running operations package not found, please install it with `pip install gapic-google-longrunning`Nc                 óZ   •— g | ]'}‰j                               ‰|¬ ¦  «        ¬¦  «        ‘Œ(S ))rX   )Úrequest)r5   Úget_operation)rg   rX   r™   r9   s     €€r   r}   z5DocAIParser.operations_from_names.<locals>.<listcomp>  sK   ø€ ð 
ð 
ð 
àð ŒL×&Ò&Ð/BÐ/BÈÐ/MÑ/MÔ/MÐ&ÑNÔNð
ð 
ð 
r   )Ú!google.longrunning.operations_pb2r™   r8   )r9   rŠ   r;   r™   s   `  @r   Úoperations_from_namesz!DocAIParser.operations_from_names
  s™   øø€ ð	ðð ð ð ð ð ð øõ ð 	ð 	ð 	Ýð:ñô ð ðøøøøð	øøøð
ð 
ð 
ð 
ð 
à'ð
ñ 
ô 
ð 	
s   „ ‹
*•%¥*r   c                 ó4   — t          d„ |D ¦   «         ¦  «        S )Nc              3   ó@   K  — | ]}|                      ¦   «          V — Œd S )N)Údoner{   s     r   ri   z)DocAIParser.is_running.<locals>.<genexpr>  s,   è è € Ð6Ð6 R�r—w’w‘y”y�=Ð6Ð6Ð6Ð6Ð6Ð6r   )Úany)r9   r   s     r   rƒ   zDocAIParser.is_running  s   € ÝÐ6Ð6¨:Ð6Ñ6Ô6Ñ6Ô6Ð6r   iè  )r&   r'   Ú
batch_sizerD   rE   r£   c                óŠ  ‡— 	 ddl mŠ ddlm}m} n"# t
          $ r}	t          d¦  «        |	‚d}	~	ww xY w|p| j        }
|
€t          d¦  «        ‚|p| j        }|€t          d¦  «        ‚g }t          ||¬¦  «        D ]Ç}‰ 
                    ‰                     ˆfd	„|D ¦   «         ¬
¦  «        ¬¦  «        }‰                     ‰j                             |
|¬¦  «        ¬¦  «        }|r | ||¬¦  «        ¬¦  «        nd}|                     | j                             ‰                     ||||d¬¦  «        ¦  «        ¦  «         ŒÈ|S )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*   Nrx   z0A Document AI processor name should be provided.)ÚsizeÚiterablec                 óV   •— g | ]%}‰                      |j        |j        pd ¬¦  «        ‘Œ&S )rR   rS   )ro   rf   rp   )rg   r>   rI   s     €r   r}   z+DocAIParser.docai_parse.<locals>.<listcomp>O  sP   ø€ ð ð ð ð
 !ð	 #×.Ò.Ø$(¤IØ&*¤mÐ&HÐ7Hð /ñ ô ðð ð r   )Ú	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ÚGcsDocumentsÚDocumentOutputConfigÚGcsOutputConfigÚappendr5   Úbatch_process_documentsÚBatchProcessRequest)r9   rt   r&   r'   r£   rD   rE   rK   rL   r;   r‰   r   ÚbatchÚinput_configÚoutput_configrZ   rI   s                   @r   r€   zDocAIParser.docai_parse  s  ø€ ð6	Ø/Ð/Ð/Ð/Ð/Ð/ØRÐRÐRÐRÐRÐRÐRÐRÐRøÝð 	ð 	ð 	Ýð9ñô ð ðøøøøð	øøøð &Ð>¨Ô)>ˆØÐÝØLñô ð ð (Ð?¨4Ô+?ˆØÐ!ÝÐOÑPÔPÐPàˆ
Ý"¨
¸UÐCÑCÔCð &	ð &	ˆEØ%×?Ò?Ø(×5Ò5ðð ð ð ð
 %*ðñ ô ð 6ñ ô ð @ñ 
ô 
ˆLð '×;Ò;Ø",Ô"A×"QÒ"QØ'°Jð #Rñ #ô #ð <ñ ô ˆMð -ð��Ø(˜yØ2Kð ñ  ô  ðñ ô ð ð ð ð ×ÒØ”×4Ò4Ø×2Ò2Ø+Ø(4Ø/<Ø(7Ø*.ð 3ñ ô ñô ñ
ô 
ð 
ð 
ð Ðs   ƒ ’
1œ,¬1c                 ót   ‡— 	 ddl mŠ n"# t          $ r}t          d¦  «        |‚d }~ww xY wˆfd„|D ¦   «         S )Nr   )ÚBatchProcessMetadatar*   c                 óÖ   •— g | ]e}t          |j        ‰¦  «        r|j        j        n#‰                     |j        j        ¦  «        j        D ]}t          |j        |j        ¬ ¦  «        ‘ŒŒfS ))r   r   )Ú
isinstancera   Úindividual_process_statusesÚdeserializeÚvaluer   Úinput_gcs_sourceÚoutput_gcs_destination)rg   r|   Ústatusr¸   s      €r   r}   z+DocAIParser.get_results.<locals>.<listcomp>~  s™   ø€ ð 
ð 
ð 
ð
 õ ˜bœkÐ+?Ñ@Ô@ð.�”Ô7Ð7à)×5Ò5Ø”KÔ%ñô ä-ð
ð 
ð õ  Ø"Ô3Ø"Ô9ðñ ô ð
ð 
ð 
ð 
r   )Úgoogle.cloud.documentai_v1r¸   r8   )r9   r   r;   r¸   s      @r   r‡   zDocAIParser.get_resultsu  s…   ø€ ð	ØGÐGÐGÐGÐGÐGÐGøÝð 	ð 	ð 	Ýð9ñô ð ðøøøøð	øøøð
ð 
ð 
ð 
ð
 !ð
ñ 
ô 
ð 	
s   ƒ
 Š
)”$¤))TNN)Nrr   rs   )r   r   r   r   r   r   r=   r   r   r
   rC   r/   r   Úintrq   r   rB   r   rˆ   rž   rƒ   r€   r‡   r   r   r   r#   r#   &   sÊ  € € € € € ðð ð >BØ"&Ø)-Ø(,ð8ð 8ð 8ð Ð9Ô:ð8ð ˜3”-ð	8ð
 " #œð8ð ! œð8ð 8ð 8ð 8ðt	S˜tð 	S¨°Ô(:ð 	Sð 	Sð 	Sð 	Sð +/Ø$(Ø*.ðF
ð F
àðF
ð $(ðF
ð ˜S”Mð	F
ð
 ˜T #œYÔ'ðF
ð 
�(Ô	ðF
ð F
ð F
ð F
ðV *.ØØ%'ð/4ð /4à˜Œ~ð/4ð " #œð/4ð ð	/4ð
  #ð/4ð 
�(Ô	ð/4ð /4ð /4ð /4ðbØÐ/Ô0ðà	�(Ô	ðð ð ð ð4
°T¸#´Yð 
À4ÈÔCTð 
ð 
ð 
ð 
ð"7 T¨+Ô%6ð 7¸4ð 7ð 7ð 7ð 7ð *.Ø(,ØØ*.Ø$(ðUð Uð Uà˜Œ~ðUð " #œð	Uð
 ! œðUð ðUð $(ðUð ˜S”MðUð 
ˆkÔ	ðUð Uð Uð 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Ð DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dà 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø -Ð -Ð -Ð -Ð -Ð -Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à DÐ DÐ DÐ DÐ DÐ DØ BÐ BÐ BÐ BÐ BÐ BØ BÐ BÐ BÐ BÐ BÐ Bàð GØ3Ð3Ð3Ð3Ð3Ð3ØFÐFÐFÐFÐFÐFð 
ˆÔ	˜8Ñ	$Ô	$€ð ðð ð ð ð ñ ô ñ „ðð €Ø
ØØ?ðñ ô ð
`
ð `
ð `
ð `
ð `
�.ñ `
ô `
ñô ð
`
ð `
ð `
r   