Ë
    uPêjhd  ã                   óx  — U d Z ddlZ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
mZ ddlmZ ddlmZmZmZ ddlZddl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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*m+Z+  e#«       Z,e G d„ d«      «       Z-e G d„ d«      «       Z.h d£Z/ee0d<   de1de	e1e2f   de1dz  de1dz  de3ejh                  z  dz  de1dz  de5e1e2f   dz  de5e1e2f   de-fd„Z6d e-de7fd!„Z8d e-d"ee1ge1dz  f   de5e1e2f   fd#„Z9d e-d"ee1ge1dz  f   de1dz  fd$„Z:d e-d%ee1ge1dz  f   de.fd&„Z;d e-d%ee1ge1dz  f   de dz  fd'„Z<d e-d%ee1ge1dz  f   de dz  fd(„Z=e+	 	 	 	 	 d9de1de	e1e2f   de1dz  de1dz  de3ejh                  z  dz  de1dz  de5e1e2f   dz  de2de fd)„«       Z> ej~                  d*«      Z@ee0d+<   d,d-d.d.d/d0d1d1d2d3œ	ZAee0d4<   d5e1de1fd6„ZBde5e1ef   de5e1e1f   fd7„ZCe+	 	 	 	 	 d9de1de	e1e2f   de1dz  de1dz  de3ejh                  z  dz  de1dz  de5e1e2f   dz  de2de ee2e2e f   z  fd8„«       Z%y):z 
Main OCR function for LiteLLM.
é    N)ÚCallableÚ	CoroutineÚMapping)Ú	dataclass)ÚIOBase)ÚAnyÚFinalÚcast)Úverbose_logger)Úrequest_timeout)ÚLogging)Ú$is_azure_document_intelligence_model)ÚOCR_REQUEST_FORMAT_PARAMÚBaseOCRConfigÚOCRResponseÚparse_ocr_request_format)ÚBaseLLMHTTPHandler)Úocr)ÚGenericLiteLLMParams)ÚProviderConfigManagerÚclientc                   óÐ   — e Zd ZU eed<   eeef   ed<   edz  ed<   edz  ed<   eed<   eeef   dz  ed<   eed<   eeef   ed	<   eeef   ed
<   e	e
j                  z  ed<   eed<   y)Ú_PreparedOCRRequestÚmodelÚdocumentNÚapi_keyÚapi_baseÚcustom_llm_providerÚextra_headersÚprovider_configÚoptional_paramsÚlitellm_paramsÚeffective_timeoutÚlitellm_logging_obj)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Údictr   Úobjectr   ÚfloatÚhttpxÚTimeoutÚLiteLLMLoggingObj© ó    úU/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/ocr/main.pyr   r   (   s|   … àƒJØ�3˜�8‰nÓØ�4‰ZÓØ�D‰jÓØÓØ˜˜V˜Ñ$ tÑ+Ó+Ø"Ó"Ø˜#˜v˜+Ñ&Ó&Ø˜˜f˜Ñ%Ó%Ø˜uŸ}™}Ñ,Ó,Ø*Ô*r1   r   c                   óV   — e Zd ZU edz  ed<   edz  ed<   eeef   ed<   eeef   ed<   y)Ú_PreparedRustOCRCallNr   r   Úheadersr!   )r%   r&   r'   r(   r)   r*   r+   r0   r1   r2   r4   r4   7   s4   … à�4‰ZÓØ�D‰jÓØ�#�v�+ÑÓØ˜#˜v˜+Ñ&Ô&r1   r4   >   ÚmistralÚazure_aiÚ	vertex_aiÚ_RUST_OCR_PROVIDERSr   r   r   r   Útimeoutr   r   ÚkwargsÚreturnc                 óN  — t        t        |j                  d«      «      }t        t        d z  |j	                  dd «      «      }	t        |t        «      st        dt        |«      › �«      ‚|j	                  d«      }
|
dk(  rt        |«      }|j	                  d«      }
|
dvrt        d|
› d�«      ‚|d u}t        j                  | |||¬	«      \  } }}}| xr |d
k(  xr t        | «      }|r|}|r|s|}t        j                  | t        j                  |«      ¬«      }|€t        d|› �«      ‚t!        j"                  d| |«       t%        j&                  |«      }|j)                  | ¬«      }|j	                  t*        «      }|�H	 t-        |«      }t*        |vr4|dk(  r/t        j.                  j1                  dt*        › d|› d| › �| |¬«      ‚i }|D ]  }||v sŒ|j                  |«      ||<   Œ |j3                  |i | ¬«      }t!        j"                  d|«       |xs t4        }|j7                  || ||	|dœ|¬«       t9        | ||||||t        t        t        t:        f   |«      t        |«      ||¬«      S # t        $ r)}t        j.                  j1                  |› | |¬«      |‚d }~ww xY w)Nr$   Úlitellm_call_idz<document must be a dict with 'type' and URL/file field, got ÚtypeÚfile)Údocument_urlÚ	image_urlzInvalid document type: z0. Must be 'document_url', 'image_url', or 'file')r   r   r   r   r7   )r   Úproviderz#OCR is not supported for provider: z"OCR call - model: %s, provider: %s)r   )Úmessager   Úllm_providerÚnativeú`z*='native'` is not supported for provider: z	, model: )Únon_default_paramsr!   r   z%OCR optional_params after mapping: %s)r>   r   )r;   r   r!   r"   r   )r   r   r   r   r   r   r    r!   r"   r#   r$   )r
   r/   Úpopr(   ÚgetÚ
isinstancer*   Ú
ValueErrorr?   Ú%convert_file_document_to_url_documentÚlitellmÚget_llm_providerr   r   Úget_provider_ocr_configÚLlmProvidersr   Údebugr   Úmodel_validateÚget_supported_ocr_paramsr   r   Ú
exceptionsÚUnsupportedParamsErrorÚmap_ocr_paramsr   Úupdate_from_kwargsr   r+   )r   r   r   r   r:   r   r   r;   r$   r>   Údoc_typeÚcaller_supplied_api_baseÚdynamic_api_keyÚdynamic_api_baseÚsuppress_dynamic_api_baseÚocr_provider_configr"   Úsupported_paramsÚrequested_formatÚparsed_formatÚerH   Úparamr!   r#   s                            r2   Ú_prepare_ocr_requestrd   F   s8  € ô "&Ô&7¸¿¹ÐDYÓ9ZÓ![ÐÜ!¤#¨¡*¨f¯j©jÐ9JÈDÓ.QÓR€Oä�h¤Ô%ÜÐWÔX\Ð]eÓXfÐWgÐhÓiÐià�|‰|˜FÓ#€Hà�6ÒÜ8¸ÓBˆØ—<‘< Ó'ˆàÐ4Ñ4ÜÐ2°8°*Ð<lÐmÓnÐnà&.°dÐ&:Ðô 	× Ñ ØØ/ØØô		ñØØØØð %Ð$ò 	8Ø :Ñ-ò	8ä0°Ó7ð ñ
 Ø!ˆÙÑ 9Ø#ˆä!6×!NÑ!NØÜ×%Ñ%Ð&9Ó:ô"Ðð
 Ð"ÜÐ>Ð?RÐ>SÐTÓUÐUä×ÑÐ=¸uÐFYÔZä0×?Ñ?ÀÓG€Nà1×JÑJÐQVÐJÓWÐØ$Ÿj™jÔ)AÓBÐØÐ#ð	Ü#;Ð<LÓ#MˆMô
 $Ð+;Ñ;ÀÐQYÒ@YÜ×$Ñ$×;Ñ;àÔ0Ð1Ð1[Ð\oÐ[pð qØ#˜Wð&ð Ø0ð <ó ð ð !#ÐØ!ò :ˆØ�FŠ?Ø(.¯
©
°5Ó(9Ð˜uÒ%ð:ð 1×?Ñ?Ø-ØØð @ó €Oô ×ÑÐ@À/ÔRà&Ò9¬/Ðà×*Ñ*ØØØ'à.Ø ñ
ð 0ð +ô 	ô ØØØØØ/Ø#Ø+ÜœT¤#¤v +Ñ.°Ó@Ü˜NÓ+Ø+Ø/ôð øôQ ò 	Ü×$Ñ$×;Ñ;Ø˜# eÐ:Mð <ó àðûð	ús   ÆI2 É2	J$É;$JÊJ$Úprepared_requestc                 ól   — | j                   j                  t        «      dk(  ry| j                  t        v S )NrF   F)r!   rJ   r   r   r9   )re   s    r2   Ú_rust_ocr_supportedrg   ¿   s1   € Ø×'Ñ'×+Ñ+Ô,DÓEÈÒQØØ×/Ñ/Ô3FÐFÐFr1   Úresolve_secretc                 óÎ  — t        | j                  «      }| j                  dk(  rÀ| j                  j	                  d«      xs7 | j                  j	                  d«      xs t
        j                  xs  |d«      }| j                  j	                  d«      xsA | j                  j	                  d«      xs$ t
        j                  xs  |d«      xs  |d«      }|�||d<   |�||d<   |S )	Nr8   Úvertex_projectÚvertex_ai_projectÚVERTEXAI_PROJECTÚvertex_locationÚvertex_ai_locationÚVERTEXAI_LOCATIONÚVERTEX_LOCATION)r*   r!   r   r"   rJ   rN   rj   rm   )re   rh   r!   rj   rm   s        r2   Ú_rust_bridge_optional_paramsrq   Å   s  € ô "Ð"2×"BÑ"BÓC€OØ×+Ñ+¨{Ò:à×+Ñ+×/Ñ/Ð0@ÓAò 2Ø×.Ñ.×2Ñ2Ð3FÓGò2ä×%Ñ%ò2ñ Ð0Ó1ð	 	ð ×+Ñ+×/Ñ/Ð0AÓBò 1Ø×.Ñ.×2Ñ2Ð3GÓHò1ä×&Ñ&ò1ñ Ð1Ó2ò1ñ Ð/Ó0ð 	ð Ð%Ø0>ˆOÐ,Ñ-ØÐ&Ø1@ˆOÐ-Ñ.ØÐr1   c                 óœ   — | j                   �| j                   S | j                  dk(  r%t        | j                  «      r |d«      S  |d«      S y )Nr7   Ú$AZURE_DOCUMENT_INTELLIGENCE_ENDPOINTÚAZURE_AI_API_BASE)r   r   r   r   )re   rh   s     r2   Ú_rust_bridge_api_baseru   ß   sT   € ð × Ñ Ð,Ø×(Ñ(Ð(Ø×+Ñ+¨zÒ9Ü/Ð0@×0FÑ0FÔGÙ!Ð"HÓIÐIÙÐ1Ó2Ð2Ør1   Úresolve_api_keyc           	      óf  — | j                   }|j                  «       }| j                  xs |� ||«      nd }|j                  | j                  xs i | j
                  || j                  | j                  ¬«      }|j                  | j                  | j
                  | j                  | j                  ¬«      }t        | |«      }t        | |«      }| j                  j                  d|| j
                  | j                  dœ|¥||dœ¬«       t        ||t!        t"        t$        t&        f   |«      |¬«      S )N)r5   r   r   r   r"   )r   r   r!   r"   zOCR document processing)r   r   )Úcomplete_input_dictr   r5   )Úinputr   Úadditional_args)r   r   r5   r!   )r    Úget_api_key_env_varr   Úvalidate_environmentr   r   r   r"   Úget_complete_urlr!   ru   rq   r$   Úpre_callr   r4   r
   r*   r(   r+   )	re   rv   r    Úapi_key_env_varÚresolved_api_keyÚresolved_headersÚresolved_complete_urlÚrust_api_baseÚrust_optional_paramss	            r2   Ú_prepare_rust_ocr_callr…   ì   sZ  € ð .×=Ñ=€OØ,×@Ñ@ÓB€OØ.×6Ñ6ò Ø,;Ð,G‰˜Ô(ÈTð ð .×BÑBØ ×.Ñ.Ò4°"Ø×$Ñ$Ø Ø!×*Ñ*Ø'×6Ñ6ð Có Ðð $3×#CÑ#CØ!×*Ñ*Ø×$Ñ$Ø(×8Ñ8Ø'×6Ñ6ð	 $Dó $Ðô 1Ð1AÀ?ÓS€MÜ">Ð?OÐQ`Ó"aÐØ×(Ñ(×1Ñ1Ø'Ø ð *×/Ñ/Ø,×5Ñ5ñ$ð 'ð$ð
 .Ø'ñ
ð 2ô ô  Ø ØÜ”Tœ#œv˜+Ñ&Ð(8Ó9Ø,ô	ð r1   c           
      óP  — t        j                  «       €y t        | |¬«      }t        j                  | j                  | j
                  |j                  |j                  | j                  |j                  |j                  | j                  ¬«      }|€y t        j                  |«      S ©N©re   rv   )r   r   r   r   r   r   r!   r:   )Úrust_ocr_bridgeÚload_rust_ocrr…   r   r   r   r   r   r   r5   r!   r#   r   rS   ©re   rv   ÚpreparedÚrust_responses       r2   Ú_run_rust_ocrrŽ     sœ   € ô ×$Ñ$Ó&Ð.ØÜ,Ø)Ø'ô€Hô +×.Ñ.Ø×$Ñ$Ø!×*Ñ*Ø× Ñ Ø×"Ñ"Ø,×@Ñ@Ø×&Ñ&Ø ×0Ñ0Ø ×2Ñ2ô	€Mð ÐØÜ×%Ñ% mÓ4Ð4r1   c           
   ƒ   ól  K  — t        j                  «       €y t        | |¬«      }t        j                  | j                  | j
                  |j                  |j                  | j                  |j                  |j                  | j                  ¬«      ƒ d {  –—† }|€y t        j                  |«      S 7 Œ­wr‡   )r‰   Úload_rust_aocrr…   Úaocrr   r   r   r   r   r5   r!   r#   r   rS   r‹   s       r2   Ú_run_rust_aocrr’   2  sª   è ø€ ô ×%Ñ%Ó'Ð/ØÜ,Ø)Ø'ô€Hô "1×!5Ñ!5Ø×$Ñ$Ø!×*Ñ*Ø× Ñ Ø×"Ñ"Ø,×@Ñ@Ø×&Ñ&Ø ×0Ñ0Ø ×2Ñ2ô	"÷ 	€Mð ÐØÜ×%Ñ% mÓ4Ð4ð	ús   ‚BB4ÂB2ÂB4c              ‹   ó&  K  — | |||||||dœ}	 t        | |||||||¬«      }	|	j                  } |	j                  }|j                  | |dœ«       t	        |	«      rIt        j                  «       r5ddlm}
 t        |	|
¬«      ƒ d{  –—† }|€t        j                  d«       n|S t        j                  |	j                  |	j                  |	j                  |	j                   |	j"                  |	j$                  |	j&                  |	j                  d|	j(                  |	j*                  |	j,                  ¬	«      }t/        j0                  |«      r
|ƒ d{  –—† }|€t3        d
|› �«      ‚|S 7 ŒÞ7 Œ# t4        $ r}t7        j8                  | ||||¬«      ‚d}~ww xY w­w)ar  
    Async OCR function.

    Args:
        model: Model name (e.g., "mistral/mistral-ocr-latest")
        document: Document to process in Mistral format:
            {"type": "document_url", "document_url": "https://..."} for PDFs/docs,
            {"type": "image_url", "image_url": "https://..."} for images, or
            {"type": "file", "file": <path/bytes/file-obj>} for local files
        api_key: Optional API key
        api_base: Optional API base URL
        timeout: Optional timeout
        custom_llm_provider: Optional custom LLM provider
        extra_headers: Optional extra headers
        **kwargs: Additional parameters (e.g., include_image_base64, pages, image_limit)

    Returns:
        OCRResponse in Mistral OCR format with pages, model, usage_info, etc.

    Example:
        ```python
        import litellm

        # OCR with PDF
        response = await litellm.aocr(
            model="mistral/mistral-ocr-latest",
            document={
                "type": "document_url",
                "document_url": "https://arxiv.org/pdf/2201.04234"
            },
            include_image_base64=True
        )

        # OCR with image
        response = await litellm.aocr(
            model="mistral/mistral-ocr-latest",
            document={
                "type": "image_url",
                "image_url": "https://example.com/image.png"
            }
        )

        # OCR with base64 encoded PDF
        response = await litellm.aocr(
            model="mistral/mistral-ocr-latest",
            document={
                "type": "document_url",
                "document_url": f"data:application/pdf;base64,{base64_pdf}"
            }
        )

        # OCR with local file
        response = await litellm.aocr(
            model="mistral/mistral-ocr-latest",
            document={"type": "file", "file": "/path/to/document.pdf"}
        )
        ```
    ©r   r   r   r   r:   r   r   r;   ©r   r   r   ©Úget_secret_strrˆ   Nz>Async Rust OCR bridge unavailable; falling back to Python pathT©r   r   r!   r:   Úlogging_objr   r   r   r‘   r5   r    r"   z2Got an unexpected None response from the OCR API: ©r   r   Úoriginal_exceptionÚcompletion_kwargsÚextra_kwargs)rd   r   r   Úupdaterg   r‰   Úrust_ocr_enabledÚlitellm.secret_managers.mainr—   r’   r   rR   Úbase_llm_http_handlerr   r   r!   r#   r$   r   r   r   r    r"   ÚasyncioÚiscoroutinerL   Ú	ExceptionrN   Úexception_type)r   r   r   r   r:   r   r   r;   rœ   rŒ   r—   r�   Úresponserb   s                 r2   r‘   r‘   K  s±  è ø€ ðL ØØØØØ2Ø&Øñ	3Ðð8
Ü.ØØØØØØ 3Ø'Øô	
ˆð —‘ˆØ&×:Ñ:ÐØ× Ñ ¨5ÐI\Ñ!]Ô^ä˜xÔ(¬_×-MÑ-MÔ-OÝCä)7Ø!)Ø .ô*÷ $ˆMð Ð$Ü×$Ñ$Ð%eÕfà$Ð$ä(×,Ñ,Ø—.‘.Ø×&Ñ&Ø$×4Ñ4Ø×.Ñ.Ø ×4Ñ4Ø×$Ñ$Ø×&Ñ&Ø (× <Ñ <ØØ×*Ñ*Ø$×4Ñ4Ø#×2Ñ2ð -ó 
ˆô ×Ñ˜xÔ(Ø%—~ˆHàÐÜÐQÐRZÐQ[Ð\Ó]Ð]àˆð=$øð2 &ùô ò 
Ü×$Ñ$ØØ 3Ø Ø/Øô
ð 	
ûð
üsZ   ‚F�A4E& ÂE"ÂE& Â!FÂ"B)E& ÅE$ÅE& Å!FÅ"E& Å$E& Å&	FÅ/F	Æ	FÆFz^[\w.+-]+/[\w.+-]+$Ú_MIME_PATTERNzapplication/pdfz	image/pngz
image/jpegz	image/gifz
image/webpz
image/tiffz	image/bmp)	z.pdfz.pngz.jpgz.jpegz.gifz.webpz.tiffz.tifz.bmpÚ_MIME_TYPE_MAPÚ	file_pathc                 óÐ   — t         j                  j                  | «      d   j                  «       }t        j                  |«      }|r|S t        j                  | «      \  }}|xs dS )z„
    Determine MIME type from file path extension.

    Falls back to mimetypes.guess_type, then to 'application/octet-stream'.
    é   úapplication/octet-stream)ÚosÚpathÚsplitextÚlowerr¨   rJ   Ú	mimetypesÚ
guess_type)r©   ÚextÚmimeÚguessedÚ_s        r2   Úget_mime_typer·   è  s^   € ô —‘×!Ñ! )Ó,¨QÑ/×5Ñ5Ó7€CÜ ×$Ñ$ SÓ)€DÙØˆÜ×%Ñ% iÓ0�J€GˆQØÒ0Ð0Ð0r1   c                 óš  — | j                  d«      }|€t        d«      ‚d}d}t        |t        «      rt        d«      ‚t        |t        j
                  «      rˆt        |«      }t        j                  j                  |«      st        d|› �«      ‚t        |«      }t        j                  j                  |«      }t        |d«      5 }|j                  «       }ddd«       nŸt        |t        «      r|}nŒt        |t        «      st        |d«      rXt        |d	«      rt!        |d	d«      }|rt        |«      }|j                  «       }t        |t        «      r*|j#                  d
«      }nt        dt%        |«      › d�«      ‚st        d«      ‚d| v r| d   }t&        j)                  |«      st        d|› �«      ‚t+        j,                  |«      j/                  d
«      }d|› d|› �}|j1                  d«      r&t3        j4                  d|t7        |«      |«       d|dœS t3        j4                  d|t7        |«      |«       d|dœS # 1 sw Y   ŒËxY w)uÎ  
    Convert a file-type document dict to a document_url-type document dict
    with an inline base64 data URI.

    Accepts document dicts like:
        {"type": "file", "file": Path("/path/to/doc.pdf")}       # pathlib.Path
        {"type": "file", "file": <binary file-like object>}      # file-like object (BinaryIO)
        {"type": "file", "file": b"raw bytes"}                   # raw bytes

    Bare ``str`` paths are not accepted â€” pass a ``pathlib.Path`` or
    ``open(path, "rb")`` instead. See the str check below for the rationale.

    Returns:
        {"type": "document_url", "document_url": "data:<mime>;base64,<data>"}
        or {"type": "image_url", "image_url": "data:<mime>;base64,<data>"}
    r@   Nzkdocument with type='file' must include a 'file' field containing a pathlib.Path, file-like object, or bytesr¬   z£OCR file input does not accept bare str values. Pass bytes, a pathlib.Path, or a file-like object. To OCR a local file from a path, call open(path, 'rb') yourself.zFile not found: ÚrbÚreadÚnamezutf-8zUnsupported file input type: z6. Expected pathlib.Path, bytes, or a file-like object.z"File is empty or could not be readÚ	mime_typezInvalid MIME type: zdata:z;base64,zimage/zVOCR file input: Converted file to image_url data URI (mime=%s, size=%s bytes, name=%s)rB   )r?   rB   zYOCR file input: Converted file to document_url data URI (mime=%s, size=%s bytes, name=%s)rA   )r?   rA   )rJ   rL   rK   r(   r­   ÚPathLiker®   ÚisfileÚFileNotFoundErrorr·   ÚbasenameÚopenrº   Úbytesr   ÚhasattrÚgetattrÚencoder?   r§   ÚmatchÚbase64Ú	b64encodeÚdecodeÚ
startswithr   rR   Úlen)	r   Ú
file_inputr¼   Ú	file_namer©   ÚfÚ
file_bytesÚbase64_dataÚdata_uris	            r2   rM   rM   ö  sD  € ð" !Ÿ™ VÓ,€JØÐÜð9ó
ð 	
ð 0€IØ €Iä�*œcÔ"ô ð;ó
ð 	
ô
 �*œbŸk™kÔ*ô ˜z›?ˆ	Ü�w‰w�~‰~˜iÔ(Ü#Ð&6°y°kÐ$BÓCÐCÜ! )Ó,ˆ	Ü—G‘G×$Ñ$ YÓ/ˆ	Ü�)˜TÓ"ð 	" aØŸ™›ˆJ÷	"ð 	"ä	�J¤Ô	&Ø‰
Ü	�J¤Ô	'¬7°:¸vÔ+FÜ�:˜vÔ&Ü 
¨F°DÓ9ˆIÙÜ)¨)Ó4�	Ø—_‘_Ó&ˆ
Ü�j¤#Ô&Ø#×*Ñ*¨7Ó3‰JäØ+¬D°Ó,<Ð+=Ð=sÐtó
ð 	
ñ ÜÐ=Ó>Ð>à�hÑØ˜[Ñ)ˆ	ä×Ñ˜yÔ)ÜÐ.¨y¨kÐ:Ó;Ð;ä×)Ñ)¨*Ó5×<Ñ<¸WÓE€KØ˜i˜[¨°°Ð>€Hà×Ñ˜HÔ%Ü×ÑØdØÜ�
‹OØô		
ð $°(Ñ;Ð;ä×ÑØcØÜˆJ‹Øô	ð #°HÑ=Ð=÷Y	"ð 	"ús   ÃIÉI
c                 óÚ  — | |||||||dœ}	 |j                  dd«      du }	|	|d<   t        | |||||||¬«      }
|
j                  } |
j                  }|j	                  | |dœ«       t        |
«      rAt        j                  «       r-ddlm	} t        |
|¬	«      }|€t        j                  d«       n|S t        j                  |
j                  |
j                  |
j                   |
j"                  |
j$                  |
j&                  |
j(                  |
j                  |	|
j*                  |
j,                  |
j.                  ¬«      }|S # t0        $ r}t3        j4                  | ||||¬«      ‚d
}~ww xY w)aÑ  
    Synchronous OCR function.

    Args:
        model: Model name (e.g., "mistral/mistral-ocr-latest")
        document: Document to process in Mistral format:
            {"type": "document_url", "document_url": "https://..."} for PDFs/docs,
            {"type": "image_url", "image_url": "https://..."} for images, or
            {"type": "file", "file": <path/bytes/file-obj>} for local files
        api_key: Optional API key
        api_base: Optional API base URL
        timeout: Optional timeout
        custom_llm_provider: Optional custom LLM provider
        extra_headers: Optional extra headers
        **kwargs: Additional parameters (e.g., include_image_base64, pages, image_limit)

    Returns:
        OCRResponse in Mistral OCR format with pages, model, usage_info, etc.

    Example:
        ```python
        import litellm

        # OCR with PDF
        response = litellm.ocr(
            model="mistral/mistral-ocr-latest",
            document={
                "type": "document_url",
                "document_url": "https://arxiv.org/pdf/2201.04234"
            },
            include_image_base64=True
        )

        # OCR with image
        response = litellm.ocr(
            model="mistral/mistral-ocr-latest",
            document={
                "type": "image_url",
                "image_url": "https://example.com/image.png"
            }
        )

        # OCR with base64 encoded PDF
        response = litellm.ocr(
            model="mistral/mistral-ocr-latest",
            document={
                "type": "document_url",
                "document_url": f"data:application/pdf;base64,{base64_pdf}"
            }
        )

        # OCR with local file
        response = litellm.ocr(
            model="mistral/mistral-ocr-latest",
            document={"type": "file", "file": "/path/to/document.pdf"}
        )

        # Access pages
        for page in response.pages:
            print(f"Page {page.index}: {page.markdown}")
        ```
    r”   r‘   FT)r   r   r   r   r;   r   r   r:   r•   r   r–   rˆ   Nz8Rust OCR bridge unavailable; falling back to Python pathr˜   rš   )rI   rd   r   r   rž   rg   r‰   rŸ   r    r—   rŽ   r   rR   r¡   r   r   r!   r#   r$   r   r   r   r    r"   r¤   rN   r¥   )r   r   r   r   r:   r   r   r;   rœ   Ú	_is_asyncrŒ   r—   r�   r¦   rb   s                  r2   r   r   U  sŒ  € ðT ØØØØØ2Ø&Øñ	3Ðð4
Ø!Ÿ:™: f¨eÓ4¸Ð<ˆ	Ø$-Ð˜&Ñ!Ü.ØØØØØØ 3Ø'Øô	
ˆð —‘ˆØ&×:Ñ:ÐØ× Ñ ¨5ÐI\Ñ!]Ô^ä˜xÔ(¬_×-MÑ-MÔ-OÝCä#0Ø!)Ø .ô$ˆMð Ð$Ü×$Ñ$Ð%_Õ`à$Ð$ä/×3Ñ3Ø—.‘.Ø×&Ñ&Ø$×4Ñ4Ø×.Ñ.Ø ×4Ñ4Ø×$Ñ$Ø×&Ñ&Ø (× <Ñ <ØØ×*Ñ*Ø$×4Ñ4Ø#×2Ñ2ð 4ó 
ˆð ˆøÜò 
Ü×$Ñ$ØØ 3Ø Ø/Øô
ð 	
ûð
ús   �B#E Â1BE Å	E*ÅE%Å%E*)NNNNN)DÚ__doc__r¢   rÇ   r±   r­   ÚreÚcollections.abcr   r   r   Údataclassesr   Úior   Útypingr   r	   r
   r-   rN   Úlitellm._loggingr   Úlitellm.constantsr   Ú*litellm.litellm_core_utils.litellm_loggingr   r/   Ú&litellm.llms.azure_ai.ocr.common_utilsr   Ú(litellm.llms.base_llm.ocr.transformationr   r   r   r   Ú*litellm.llms.custom_httpx.llm_http_handlerr   Úlitellm.rust_bridger   r‰   Úlitellm.types.routerr   Úlitellm.utilsr   r   r¡   r   r4   r9   r)   r(   r+   r,   r.   r*   rd   Úboolrg   rq   ru   r…   rŽ   r’   r‘   Úcompiler§   r¨   r·   rM   r0   r1   r2   ú<module>rå      s^  ðòó Û Û Û 	Û 	ß 8Ñ 8Ý !Ý ß #Ñ #ã ã Ý +Ý -Ý Sõ÷ó õ JÝ 6Ý 5ß 7ñ +Ó,Ð ð ÷+ð +ó ð+ð ÷'ð 'ó ð'òÐ �Uó ðvØðvà�c˜6�kÑ"ðvð �4‰Zðvð �D‰jð	vð
 �U—]‘]Ñ" TÑ)ðvð ˜t™ðvð ˜˜V˜Ñ$ tÑ+ðvð ��f�Ñðvð óvðrGÐ*=ð GÀ$ó GðØ)ðà˜c˜U C¨$¡JÐ.Ñ/ðð 
ˆ#ˆvˆ+Ñóð4
Ø)ð
à˜c˜U C¨$¡JÐ.Ñ/ð
ð 	ˆ4�Zó
ð*Ø)ð*à˜s˜e S¨4¡ZÐ/Ñ0ð*ð ó*ðZ5Ø)ð5à˜s˜e S¨4¡ZÐ/Ñ0ð5ð �4Ñó5ð25Ø)ð5à˜s˜e S¨4¡ZÐ/Ñ0ð5ð �4Ñó5ð2 ð ØØ,0Ø&*Ø.2ñF
ØðF
à�c˜6�kÑ"ðF
ð �4‰ZðF
ð �D‰jð	F
ð
 �U—]‘]Ñ" TÑ)ðF
ð ˜t™ðF
ð ˜˜V˜Ñ$ tÑ+ðF
ð ðF
ð òF
ó ðF
ðZ "�r—z‘zÐ"8Ó9€ˆuÓ 9ð ØØØØØØØØñ
€�ó 
ð1˜Sð 1 Só 1ð\>°D¸¸c¸±Nð \>ÀtÈCÐQTÈHÁ~ó \>ð~ ð ØØ,0Ø&*Ø.2ñF
ØðF
à�c˜6�kÑ"ðF
ð �4‰ZðF
ð �D‰jð	F
ð
 �U—]‘]Ñ" TÑ)ðF
ð ˜t™ðF
ð ˜˜V˜Ñ$ tÑ+ðF
ð ðF
ð �9˜V V¨[Ð8Ñ9Ñ9òF
ó ñF
r1   