ó
    Í>j­O  ã                   óh  • S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJrJ	r	J
r
JrJr  SSKrSSKJr  SSKJrJr  \(       a  SSKJrJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSK J!r!  SSK"J#r#J$r$  SSK%J&r&  SSS\\'   4S jr( " S S\5      r) " S S\5      r* " S S\5      r+ " S S5      r,g)z¥
Table Inference with LLM

Uses PydanticAI with various model providers to analyze tables and generate
meaningful titles and descriptions based on document context.
é    N)Údatetime)ÚPath)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptional)Úlogger)Ú	BaseModelÚField)ÚDoclingDocumentÚNodeItem)ÚAgentFactory)ÚModelProvider)ÚHeaderConsolidator)ÚTableMetadata)Úparser_for_preset)Úload_prompt)ÚSettingsÚget_settings)Úsetup_loggingÚitemr   Úreturnc                 óJ   • [        U SS5      nU(       d  gUS   R                  $ )aÞ  The 1-indexed page an item sits on, taken from its docling provenance.

docling records an item's location in `item.prov` (a list of provenance
spans, each with a `page_no`); the page lives there, not on a `_page`
attribute. An item may carry several spans when it straddles a page break;
the first span's page is used. Structural group nodes have no provenance
and return None. `prov` is read via getattr because the base node type does
not declare it (only laid-out items do).ÚprovNr   )ÚgetattrÚpage_no)r   r   s     Ú>/home/mande/repo/quber/src/quber/processors/table_inference.pyÚprovenance_pager       s&   € ô �4˜ Ó&€DÞØØ�‰7�?‰?Ðó    c                   óè   • \ rS rSr% Sr\" SS9r\\S'   \" SS9r	\\S'   \" SS9r
\\   \S	'   \" S
SS9r\\   \S'   \" SS9r\\S'   \" S
SS9r\\   \S'   \" S
SS9r\\   \S'   \" SS9r\\S'   Srg
)ÚTableContexté/   z!Input context for table analysis.z#3-4 sentence document-level summary©ÚdescriptionÚexecutive_summaryz#Title generated by procedural rulesÚprocedural_titlezIndividual headers foundÚheadersNzText that describes the table)Údefaultr%   Údescriptive_textzFirst few rows of the tableÚtable_previewzText before the tableÚpreceding_textz-Extended page-level context including headersÚpage_contextzPage where table appearsÚpage_number© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r&   ÚstrÚ__annotations__r'   r(   r   r*   r	   r+   r,   r-   r.   ÚintÚ__static_attributes__r/   r    r   r"   r"   /   s¥   ‡ Ù+á"Ð/TÑUÐ�sÓUÙ!Ð.SÑTÐ�cÓTÙÐ+EÑF€GˆT�#‰YÓFÙ&+°DÐFeÑ&fÐ�h˜s‘mÓfÙÐ+HÑI€M�3ÓIÙ$)°$ÐD[Ñ$\€N�H˜S‘MÓ\Ù"'ØÐ"Qñ#€L�(˜3‘-ó ñ Ð)CÑD€K�ÖDr    r"   c                   óF   • \ rS rSr% Sr\" SS9r\\S'   \" SS9r	\\S'   Sr
g	)
Ú	TableInfoé>   z'LLM-inferred information about a table.z"Clear, concise title for the tabler$   ÚtitlezJFunctional description of what the table contains and how it might be usedr%   r/   N)r0   r1   r2   r3   r4   r   r<   r5   r6   r%   r8   r/   r    r   r:   r:   >   s)   ‡ Ù1áÐ#GÑH€Eˆ3ÓHÙØ`ñ€K�ö r    r:   c                   ó0   • \ rS rSr% Sr\" SS9r\\S'   Sr	g)ÚExecutiveSummaryéG   z Executive summary of a document.z.3-4 sentence executive summary of the documentr$   Úsummaryr/   N)
r0   r1   r2   r3   r4   r   r@   r5   r6   r8   r/   r    r   r>   r>   G   s   ‡ Ù*áÐ%UÑV€GˆSÖVr    r>   c                   óš  • \ rS rSrSr    S%S\\   S\\   S\\   S\4S jjr	  S&S	\
S
\\   S\\   S\\\4   4S jjr   S'S\\
   S\\\\4      S\\   S\\   S\\\\4      4
S jjrS\S\4S jrS(S\\   S\S\4S jjr S)SSS\S\S\4S jjrSSS\4S jrSSS\\\4   4S jrS \\\4   S!\4S" jrS \\\4   S!\4S# jrS$rg)*ÚTableInferenceProcessoréM   z8Process tables with LLM inference for enhanced metadata.NÚproviderÚmodelÚsettingsÚpresetc                 óè  • U=(       d
    [        5       U l        Xl        X l        X@l        [        SU R                  R                  R                  U R                  R                  S9  [        SS5      n[        U R                  R                  R                  S9U l        U R                  R                  [        UUUS9U l        [        R                   " SU=(       d    S S	U=(       d    S
 35        g)a  
Initialize the processor with specified configuration.

Args:
    provider: Model provider to use (auto-detected if not specified)
    model: Specific model to use (uses default if not specified)
    settings: Settings object (uses the cached get_settings() if not
        provided). The optional-injection seam lets callers/tests pass
        an overridden Settings (e.g. CLI flags).
    preset: DoclingParser preset to use ("tuned-financial" canonical
        default, or "legacy" for the pre-QUE-218 configuration).
ztable-inference)Úservice_nameÚenable_logfireÚ	log_levelÚtable_inferenceÚsystem)rJ   ©Úoutput_typeÚsystem_promptrD   rE   z3Initialized TableInferenceProcessor with provider: Úautoz	, model: r)   N)r   rF   rD   rE   rG   r   ÚobsrJ   rK   r   r   Úagent_factoryÚcreate_agentr:   Úagentr
   Údebug)ÚselfrD   rE   rF   rG   rP   s         r   Ú__init__Ú TableInferenceProcessor.__init__P   sÔ   € ð& !×2¤L£NˆŒØ ŒØŒ
ØŒô 	Ø*ØŸ=™=×,Ñ,×;Ñ;Ø—m‘m×-Ñ-ò	
ô $Ð$5°xÓ@ˆô *¸¿¹×9JÑ9J×9YÑ9YÑZˆÔð ×'Ñ'×4Ñ4Ü!Ø'ØØð	 5ð 
ˆŒ
ô 	�ŠØAÀ(×BTÈfÐAUÐU^Ð_d×_qÐhqÐ^rÐsõ	
r    Úmetadatar-   r&   r   c              ƒ   óÔ  #   • [        U=(       d    SUR                  =(       d    SUR                  =(       d    / UR                  UR                  =(       d    SUR
                  UUR                  S9n U R                  U5      nU R                  R                  R                  (       ac  [        R                  " SUR                  UR                  S9   U R                  R                  U5      I Sh  v•N nUR                   nSSS5        O/U R                  R                  U5      I Sh  v•N nUR                   n["        R$                  " SUR                   35        UR                  UR                  UR                  UR                  UR                  UR
                  WR,                  UR.                  UR                  UR0                  UR2                  UR4                  S.S.
$  Nô! , (       d  f       N¼= f NÏ! [&         a^  n["        R(                  " S	UR                   S
U 35        [+        UR                  =(       d    SUR                  S-    3SS9n SnAGNSnAff = f7f)a  
Analyze a single table with LLM inference.

Args:
    metadata: Table metadata from enhanced parser
    page_context: Extended context from the page
    executive_summary: Document-level executive summary

Returns:
    Dictionary with both procedural and LLM-inferred information
zNo document summary availablezUntitled TableÚ )r&   r'   r(   r*   r+   r,   r-   r.   Úanalyze_table)Útable_idÚpageNzSuccessfully analyzed table zLLM inference failed for table z: zTable é   zUnable to generate description)r<   r%   )ÚrowsÚcolsÚ
first_cell)
r^   r_   r'   r(   r*   r,   Ú	llm_titleÚllm_descriptionÚtable_markdownrZ   )r"   Úconsolidated_headerr(   r*   rf   r,   r.   Úformat_promptrF   rR   rJ   ÚlogfireÚspanÚtable_indexrU   ÚrunÚoutputr
   rV   Ú	ExceptionÚerrorr:   r<   r%   ra   rb   Úfirst_cell_content)	rW   rZ   r-   r&   ÚcontextÚpromptÚresultÚllm_infoÚes	            r   r]   Ú%TableInferenceProcessor.analyze_table�   sù  é € ô$ Ø/×RÐ3RØ%×9Ñ9×MÐ=MØ×$Ñ$×*¨Ø%×6Ñ6Ø"×1Ñ1×7°RØ#×2Ñ2Ø%Ø ×,Ñ,ñ	
ˆð	Ø×'Ñ'¨Ó0ˆFà�}‰}× Ñ ×/×/Ü—\’\ /¸H×<PÑ<PÐW_×WkÑWkÓlØ#'§:¡:§>¡>°&Ó#9×9�FØ%Ÿ}™}�H÷ mÐlð  $Ÿz™zŸ~™~¨fÓ5×5�Ø!Ÿ=™=�ä�LŠLÐ7¸×8LÑ8LÐ7MÐNÔOð !×,Ñ,Ø×(Ñ(Ø (× <Ñ <Ø×'Ñ'Ø (× 9Ñ 9Ø&×5Ñ5Ø!Ÿ™Ø'×3Ñ3Ø&×5Ñ5à Ÿ™Ø Ÿ™Ø&×9Ñ9ññ
ð 	
ñ! :÷ mÕlúñ 6øô
 ó 	Ü�LŠLÐ:¸8×;OÑ;OÐ:PÐPRÐSTÐRUÐVÔWÜ Ø×2Ñ2×Y¸¸x×?SÑ?SÐVWÑ?WÐ>XÐ6YØ<ñŽHûð	üsi   ‚A1I(Á4A G= ÃG*Ã3G(Ã4G*Ä'G= Ä+G;Ä,3G= ÅB	I(Ç(G*Ç*
G8Ç4G= Ç=
I%ÈAI ÉI(É I%É%I(Úmetadata_listÚpage_contextsÚmax_concurrentc              ƒ   óž  ^ ^^^	#   • U=(       d    T R                   R                  nT=(       d    0 m[        R                  " U5      m	S[        4UUU U	4S jjnU Vs/ s H
  oe" U5      PM     nn[
        R                  " S[        U5      US9   [        R                  " U6 I Sh  v•N nSSS5        U$ s  snf  N! , (       d  f       W$ = f7f)ak  
Analyze multiple tables concurrently with rate limiting.

Args:
    metadata_list: List of table metadata to analyze
    page_contexts: Optional dict mapping table indices to page contexts
    executive_summary: Document-level executive summary
    max_concurrent: Maximum concurrent analyses (uses config default if None)

Returns:
    List of analysis results
rZ   c              “   óî   >#   • T IS h  v•N   TR                  U R                  5      nTR                  XT5      I S h  v•N sS S S 5      IS h  v•N   $  NJ N N	! , IS h  v•N  (       d  f       g = f7f)N)Úgetrk   r]   )rZ   r-   r&   rx   rW   Ú	semaphores     €€€€r   Úanalyze_with_limitÚHTableInferenceProcessor.analyze_tables_batch.<locals>.analyze_with_limitÞ   sL   øé € ß ’yØ,×0Ñ0°×1EÑ1EÓF�Ø!×/Ñ/°ÐHYÓZ×Z÷ !—y“yáZ÷ !—y—y�yüsU   ƒA5ŠA‹A5Ž1A¿AÁ AÁA5ÁAÁA5ÁAÁA5ÁA2Á!A$Á"A2Á.A5Úanalyze_tables_batch)Útotal_tablesry   N)	rF   Úmax_concurrent_tablesÚasyncioÚ	Semaphorer   ri   rj   ÚlenÚgather)
rW   rw   rx   r&   ry   r~   rZ   ÚtasksÚresultsr}   s
   ` ``     @r   r€   Ú,TableInferenceProcessor.analyze_tables_batchÅ   s½   ûé € ð& (×N¨4¯=©=×+NÑ+NˆØ%×+¨ˆô ×%Ò% nÓ5ˆ	ð	[¬}÷ 	[ò 	[ñ ?LÓLºm°(Ð# HÖ-¹mˆÐLä�\Š\Ø"´°]Ó1CÐTbó
ô $ŸNšN¨EÐ2×2ˆG÷
ð
 ˆùò Mñ
 3÷
ô 
ð
 ˆüs<   †ACÁB4Á-!CÂB;Â%B9Â&B;Â*CÂ9B;Â;
C
ÃCrq   c                 ó&  • SUR                    SUR                   SUR                  =(       d    S SUR                   SUR                  (       a  SR                  UR                  5      OS S	UR                  =(       d    S S
UR                   S3$ )z-Format the context as a prompt for the agent.z
Analyze this table from page z&:

=== DOCUMENT EXECUTIVE SUMMARY ===
z 

=== EXTENDED PAGE CONTEXT ===
z"No extended page context availablez4

=== IMMEDIATE TABLE CONTEXT ===
Procedural Title: z
Headers Found: ú, ÚNonez=

Preceding Text (chronological order, furthest to closest):
z¹

Note: The LAST element in preceding text may be a footnote from the previous table.
[Table] markers indicate preceding tables.

=== TABLE DATA (may be truncated at page boundary) ===
zÕ

Based on ALL context levels (document summary, page context, procedural headers, and table data),
extract the most appropriate title and provide a functional description for what this COMPLETE table represents.
)r.   r&   r-   r'   r(   Újoinr,   r+   )rW   rq   s     r   rh   Ú%TableInferenceProcessor.format_promptí   s­   € ðØ%×1Ñ1Ð2ð 3ð 	×ÑÐ ð ð 	×Ñ×=Ð=Ð >ð ?ð ×+Ñ+Ð,ð -Ø.5¯o¯o�—	‘	˜'Ÿ/™/Ô*À6ÐJð Kð 	×Ñ×!˜6Ð "ð #ð 	×ÑÐ ð ð)ð 	r    ÚmarkdownÚmax_rowsc                 ó¨   • U(       d  gUR                  5       R                  S5      nUS[        US-   [        U5      5       nSR	                  U5      $ )z$Get preview of table (first N rows).zNo table content availableÚ
Né   )ÚstripÚsplitÚminr…   r�   )rW   r�   r�   ÚlinesÚpreview_liness        r   Úget_table_previewÚ)TableInferenceProcessor.get_table_preview	  sJ   € æØ/à—‘Ó ×&Ñ& tÓ,ˆØÐ=¤ H¨q¡L´#°e³*Ó =Ð>ˆØ�y‰y˜Ó'Ð'r    Údocumentr   r.   Ú
char_limitc                 ól  • / nSn/ nUR                  5        H‘  u  px[        U5      U:w  a  M  [        USS5      =(       d    SR                  5       n	U	(       d  MC  [        USS5      n
U
b  UR	                  SU
 SU	 35        OUR	                  U	5        U[        U	5      -  nXS:¼  d  M‘    O   XSS-  :  a»  US	:”  aµ  US	-
  n/ nUR                  5        HT  u  px[        U5      U:w  a  M  [        USS5      =(       d    SR                  5       n	U	(       d  MC  UR	                  U	5        MV     U(       a?  S
R                  USS 5      n[        U5      S:”  a  SUSS -   nUR	                  SU-   5        U(       a&  UR	                  SS
R                  USS 5      -   5        U(       a  SR                  U5      $ S$ )aH  
Extract extended context from the page containing the table.

Args:
    document: The Docling document object
    page_number: The page number (1-indexed) where the table appears
    char_limit: Maximum characters to extract for context

Returns:
    String containing page-level context including headers and surrounding text
r   Útextr\   ÚlevelNz	[Header Lz] gffffffæ?r`   r’   éûÿÿÿiô  ú...iþÿÿz=== Previous Page Context ===
z=== Current Page Content ===
é   z

zNo page context available)Úiterate_itemsr   r   r”   Úappendr…   r�   )rW   r›   r.   rœ   Úcontext_partsÚ
char_countÚcurrent_page_textr   Ú_levelrž   rŸ   Ú	prev_pageÚprev_page_textÚ	prev_texts                 r   Úextract_page_contextÚ,TableInferenceProcessor.extract_page_context  s·  € ð $&ˆØˆ
ð (*ÐØ$×2Ñ2Ö4‰LˆDÜ˜tÓ$¨Ó3ÙÜ˜D &¨"Ó-×3°×:Ñ:Ó<ˆDÞÙÜ˜D '¨4Ó0ˆEØÑ Ø!×(Ñ(¨9°U°G¸2¸d¸VÐ)DÕEà!×(Ñ(¨Ô.Øœ#˜d›)Ñ#ˆJØÕ'Ùñ 5ð"  SÑ(Ó(¨[¸1«_Ø# a™ˆIØ(*ˆNØ (× 6Ñ 6Ö 8‘�Ü" 4Ó(¨IÓ5ÙÜ  f¨bÓ1×7°R×>Ñ>Ó@�ß�4Ø"×)Ñ)¨$Ö/ñ !9ö Ø ŸI™I n°R°SÐ&9Ó:�	Ü�y“> CÓ'Ø %¨	°$°%Ð(8Ñ 8�IØ×$Ñ$Ð%FÈÑ%RÔSö Ø× Ñ Ø0°4·9±9Ð=NÈsÐPRÐ=SÓ3TÑTôö .;ˆv�{‰{˜=Ó)Ð[Ð@[Ð[r    c              ƒ   óp  #   • UR                  5       nU R                  R                  [        SU R                  U R
                  S9nSU S3n U R                  R                  R                  (       aO  [        R                  " S5         UR                  U5      I Sh  v•N nUR                  R                  sSSS5        $ UR                  U5      I Sh  v•N nUR                  R                  $  NR! , (       d  f       g= f N-! [         a#  n[        R                   " SU 35         SnAgSnAff = f7f)	z›
Generate a 3-4 sentence executive summary of the entire document.

Args:
    document: The Docling document object

Returns:
    Executive summary string
zCYou are analyzing business documents to create executive summaries.rN   a5  
Analyze this complete document and provide a 3-4 sentence executive summary.

The summary should describe:
1. What this document is (type of document, purpose)
2. Who it is about (company, organization, or subject)
3. What are the major points being made (key metrics, themes, or findings)

=== DOCUMENT ===
zg

Provide a concise executive summary that captures the essential nature and content of this document.
Úgenerate_executive_summaryNz&Failed to generate executive summary: z#Unable to generate document summary)Úexport_to_markdownrS   rT   r>   rD   rE   rF   rR   rJ   ri   rj   rl   rm   r@   rn   r
   ro   )rW   r›   Údocument_markdownÚsummary_agentrr   rs   ru   s          r   r¯   Ú2TableInferenceProcessor.generate_executive_summaryR  s  é € ð %×7Ñ7Ó9Ðð ×*Ñ*×7Ñ7Ü(Ø_Ø—]‘]Ø—*‘*ð	 8ð 
ˆð	ð Ð ð ðˆð	9Ø�}‰}× Ñ ×/×/Ü—\’\Ð">Õ?Ø#0×#4Ñ#4°VÓ#<×<�FØ!Ÿ=™=×0Ñ0÷ @Ñ?ð  -×0Ñ0°Ó8×8�Ø—}‘}×,Ñ,Ð,ñ	 =÷ @Õ?úñ 9øô ó 	9Ü�LŠLÐAÀ!ÀÐEÔFÜ8ûð	9üs~   ‚AD6Á;D Â	C3ÂC1ÂC3Â8	D ÃD6ÃD ÃDÃD Ã0D6Ã1C3Ã3
DÃ=D Ä D6ÄD Ä
D3ÄD.Ä)D6Ä.D3Ä3D6Úpdf_pathzstr | os.PathLike[str]c              ƒ   ój  #   • [         R                  R                  [        U5      5      n[        R
                  " SU 35        [        U R                  5      n[        SSSS9n[        R                  " S[        U5      S9   UR                  [        U5      5      R                  nUR                  U5      nSSS5        [        R
                  " S	U 35        [        R
                  " S
U 35        U R                  W5      I Sh  v•N n[        R                   " SUSS  S35        [#        W5      S:”  af  U R$                  =(       d    SnU R&                  (       a  U R&                  R(                   SU 3n[        R
                  " S[#        U5       SU 35        0 n	U H*  n
U R+                  XZR,                  5      XšR.                  '   M,     U R1                  XiU5      I Sh  v•N n[#        U5      S:”  a#  [        R
                  " S[#        U5       S35        U[2        R4                  " 5       R7                  5       [#        UR8                  5      [#        U5      U R&                  (       a  U R&                  R(                  OSU R$                  =(       d    SUS.$ ! , (       d  f       GNë= f GN¨ NÌ7f)a6  
Process all tables in a document.

Args:
    pdf_path: Path to PDF document. Accepts a local path string or any
        os.PathLike (e.g. a cloudpathlib S3Path); Path(pdf_path)
        materializes the latter to a local cached file before parsing.

Returns:
    Dictionary with document and table information
zStarting document processing: z ^ TF)Ú	separatorÚenable_consolidationrV   Úparse_document)r›   NzDocument parsed successfully: z!Generating executive summary for zExecutive summary: éd   r¡   r   r)   Ú:z
Analyzing z tables using zAnalysis complete: z tables processedzauto-detected)r›   Úextraction_dateÚtotal_pagesr�   Úmodel_providerrE   Útables)ÚosÚpathÚbasenamer5   r
   Úinfor   rG   r   ri   rj   Úparser   r›   Úconsolidater¯   rV   r…   rE   rD   Úvaluer¬   r.   rk   r€   r   ÚnowÚ	isoformatÚpages)rW   r´   Údoc_nameÚparserÚconsolidatorr›   Útable_metadatar&   Ú
model_inforx   rZ   r¾   s               r   Úprocess_documentÚ(TableInferenceProcessor.process_documentƒ  s/  é € ô —7‘7×#Ñ#¤C¨£MÓ2ˆô 	�ŠÐ4°X°JÐ?Ô@ô # 4§;¡;Ó/ˆÜ)°EÐPTÐ\aÑbˆä�\Š\Ð*´S¸³]ÓCØ—|‘|¤D¨£NÓ3×<Ñ<ˆHØ)×5Ñ5°hÓ?ˆN÷ Dô
 	�ŠÐ4°X°JÐ?Ô@ô 	�ŠÐ7¸°zÐBÔCØ"&×"AÑ"AÀ(Ó"K×KÐÜ�ŠÐ*Ð+<¸T¸cÐ+BÐ*CÀ3ÐGÔHô ˆ~Ó Ó"ØŸ™×0 yˆJØ�}�}Ø $§¡× 3Ñ 3Ð4°A°j°\ÐB�
Ü�KŠK˜*¤S¨Ó%8Ð$9¸È
À|ÐTÔUð ˆÛ&ˆHØ26×2KÑ2KÈH×VjÑVjÓ2kˆM×.Ñ.Ó/ñ 'ð ×0Ñ0°ÐPaÓb×bˆäˆv‹;˜‹?Ü�KŠKÐ-¬c°&«k¨]Ð:KÐLÔMð !Ü'Ÿ|š|›~×7Ñ7Ó9Ü˜xŸ~™~Ó.Ü ›KØ59·]·]˜dŸm™m×1Ò1ÈØ—Z‘Z×, 9Øñ
ð 	
÷? DÖCúò Lñ  cùs?   ‚B J3Â6JÂ8AJ3ÄJ.ÄCJ3Ç$J1Ç%B7J3Ê
J+Ê&	J3Ê1J3ÚdataÚoutput_pathc                 ó¬   • [        USSS9 n[        R                  " XSSS9  SSS5        [        R                  " SU 35        g! , (       d  f       N(= f)	zSave results as JSON.Úwúutf-8©Úencodingr“   F)ÚindentÚensure_asciiNzJSON results saved to: )ÚopenÚjsonÚdumpr
   rV   )rW   rÐ   rÑ   Úfs       r   Ú	save_jsonÚ!TableInferenceProcessor.save_jsonÄ  sB   € ä�+˜s¨WÒ5¸Ü�IŠI�d a°eÒ<÷ 6ä�ŠÐ.¨{¨mÐ<Õ=÷ 6Õ5ús   ŒAÁ
Ac           	      ó®  • / nUR                  S5        UR                  S5        UR                  SUS    35        UR                  S5        UR                  SUS    35        UR                  S5        UR                  SUR                  SS	5       S
UR                  SS	5       35        UR                  S5        UR                  SUS    35        UR                  S5        US    GH	  nUR                  SUS   S-    SUS    S35        UR                  S5        UR                  SUS   =(       d    S 35        UR                  S5      (       a&  UR                  SSR                  US   5       35        UR                  S5      (       a  UR                  SUS   SS  S 35        UR                  S!5        UR                  S"US#    35        UR                  S$US%    35        UR                  S&5        UR                  S'US(   S)    S*US(   S+    S,35        US(   R                  S-5      (       a  UR                  S.US(   S-   SS/  S 35        UR                  S05      (       at  UR                  S15        US0   R                  S25      SS3 nU H  nUR                  U5        M     [	        US0   R                  S25      5      S3:”  a  UR                  S45        UR                  S55        GM     [        US6S7S89 nUR                  S2R                  U5      5        SSS5        [        R                  " S9U 35        g! , (       d  f       N(= f):zSave human-readable summary.z# Table Analysis Reportr\   z**Document:** r›   z
**Date:** r»   z**Model:** r½   ÚunknownÚ/rE   z**Total Tables:** r�   r¾   z

## Table r^   r`   z (Page r_   Ú)z
### Procedural Extraction:z- **Consolidated Headers:** r'   rŒ   r(   z- **Individual Headers:** r‹   r*   z- **Descriptive Text:** NéÈ   r¡   z
### LLM Analysis:z- **Title:** rd   z- **Description:** re   z
### Metadata:z- **Size:** rZ   ra   u	    rows Ã— rb   z columnsrc   z- **First Cell:** é2   rf   z
### Table Preview:r’   é   z)| ... | ... | (additional rows omitted) |z
---rÓ   rÔ   rÕ   zSummary saved to: )	r¤   r|   r�   r•   r…   rÙ   Úwriter
   rV   )rW   rÐ   rÑ   r—   Útabler˜   ÚlinerÜ   s           r   Úsave_summaryÚ$TableInferenceProcessor.save_summaryÊ  s@  € àˆØ�‰Ð.Ô/Ø�‰�RÔØ�‰�~ d¨:Ñ&6Ð%7Ð8Ô9Ø�‰�RÔØ�‰�z $Ð'8Ñ"9Ð!:Ð;Ô<Ø�‰�RÔØ�‰�{ 4§8¡8Ð,<¸iÓ#HÐ"IÈÈ4Ï8É8ÐT[Ð]fÓKgÐJhÐiÔjØ�‰�RÔØ�‰Ð)¨$¨~Ñ*>Ð)?Ð@ÔAØ�‰�RÔà˜(•^ˆEØ�L‰L˜; u¨ZÑ'8¸1Ñ'<Ð&=¸WÀUÈ6Á]ÀOÐSTÐUÔVð �L‰LÐ7Ô8Ø�L‰LÐ7¸Ð>PÑ8Q×8[ÐU[Ð7\Ð]Ô^Ø�y‰y˜×#Ñ#Ø—‘Ð9¸$¿)¹)ÀEÈ)ÑDTÓ:UÐ9VÐWÔXØ�y‰yÐ+×,Ñ,Ø—‘Ð7¸Ð>PÑ8QÐRVÐSVÐ8WÐ7XÐX[Ð\Ô]ð �L‰LÐ.Ô/Ø�L‰L˜=¨¨{Ñ);Ð(<Ð=Ô>Ø�L‰LÐ.¨uÐ5FÑ/GÐ.HÐIÔJð �L‰LÐ*Ô+Ø�L‰LØ˜u ZÑ0°Ñ8Ð9¸À5ÈÑCTÐU[ÑC\ÐB]Ð]eÐfôð �ZÑ ×$Ñ$ \×2Ñ2Ø—‘Ð1°%¸
Ñ2CÀLÑ2QÐRUÐSUÐ2VÐ1WÐWZÐ[Ô\ð �y‰yÐ)×*Ñ*Ø—‘Ð3Ô4Ø %Ð&6Ñ 7× =Ñ =¸dÓ CÀBÀQÐ G�Û)�DØ—L‘L Ö&ñ *ä�uÐ-Ñ.×4Ñ4°TÓ:Ó;¸aÓ?Ø—L‘LÐ!LÔMà�L‰L˜×!ñC $ôF �+˜s¨WÒ5¸Ø�G‰G�D—I‘I˜eÓ$Ô%÷ 6ä�ŠÐ)¨+¨Ð7Õ8÷ 6Õ5ús   Ì!MÍ
M)rU   rS   rE   rG   rD   rF   )NNNztuned-financial)NN)NNN)é
   )iÐ  )r0   r1   r2   r3   r4   r	   r   r5   r   rX   r   r   r   r]   r   r7   r€   r"   rh   r™   r¬   r¯   rÎ   rÝ   ré   r8   r/   r    r   rB   rB   M   sÍ  † ÙBð -1Ø#Ø'+Ø'ñ/
à˜=Ñ)ð/
ð ˜‰}ð/
ð ˜8Ñ$ð	/
ð
 õ/
ðh '+Ø+/ñ	B
àðB
ð ˜s‘mðB
ð $ C™=ð	B
ð
 
ˆc�3ˆh‰õB
ðN 37Ø+/Ø(,ñ&à˜MÑ*ð&ð    S¨# X¡Ñ/ð&ð $ C™=ð	&ð
 ! ™ð&ð 
ˆd�3˜�8‰nÑ	õ&ðP \ð °cô ñ8(¨(°3©-ð (À3ð (ÐPSõ (ð PTñ>\Ø)ð>\Ø8;ð>\ØILð>\à	õ>\ð@/9Ð9Jð /9Èsô /9ðb?
Ð/Gð ?
ÈDÐQTÐVYÐQYÉNô ?
ðB>˜d 3¨ 8™nð >¸3ô >ð39  c¨3 h¡ð 39¸c÷ 39r    rB   )-r4   rƒ   rÚ   r¿   r   Úpathlibr   Útypingr   r   r   r   r	   ri   Úlogurur
   Úpydanticr   r   Údocling_core.types.doc.documentr   r   Úquber.agentsr   Úquber.agents.factoryr   Úquber.core.consolidationr   Úquber.core.modelsr   Úquber.core.parsersr   Úquber.promptsr   Úquber.settingsr   r   Úquber.utilsr   r7   r   r"   r:   r>   rB   r/   r    r   Ú<module>rù      s“   ðñó Û Û 	Ý Ý ß ;Õ ;ã Ý ß %æßIå %Ý .Ý 7Ý +Ý 0Ý %ß 1Ý %ð˜*ð ¨°#©ô ôE�9ô Eô�	ô ôW�yô W÷p9ò p9r    