Ë
    uPêjp  ã                   óÒ  — U 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
 d dlmZmZm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 d dlmZ  edd¬«       G d„ d«      «       Z	 	 dGdee    ded   de!dz  dedz  def
d„Z"	 	 	 dHdeded   de!dz  de dz  dedz  defd„Z# G d„ de
«      Z$ edd¬«       G d„ d«      «       Z%dee    ded    de!dz  dedz  dee%e$z     f
d!„Z&d"ee!ef   ded    de!dz  dedz  de%dz  f
d#„Z'd"ee!ef   ded    de!dz  dedz  de%f
d$„Z(d%ee!ef   d&eded    de!dz  d'e!dz  dedz  de)fd(„Z*	 	 dGdee    ded    de!dz  dedz  def
d)„Z+	 dId*ee    de!dz  defd+„Z,d,e!de!fd-„Z-	 	 dJd.e!ded   de dz  de.fd/„Z/	 	 dJdeded   de dz  de.fd0„Z0deded   de dz  de1fd1„Z2de dz  de fd2„Z3d3e.dee    fd4„Z4d3e.dee.   fd5„Z5d3e.dee    fd6„Z6d7e.de dz  fd8„Z7d9Z8ee9d:<   d;e.de1fd<„Z:	 dId"e de!dz  de1fd=„Z;d>e!d?ede1fd@„Z<	 dKd%ee!ef   de!defdA„Z=dBee!ef   dee!ef   fdC„Z>	 dKdDee!ef   de!dee!ef   fdE„Z?	 dKdDee!ef   de!de@fdF„ZAy)Lé    N)ÚIterableÚIteratorÚMapping)Ú	dataclass)Úreplace)ÚEnum)ÚAnyÚFinalÚLiteral)Úverbose_logger©ÚAWS_CREDENTIAL_KWARGS_KEYS)Úparse_prompt_tokens_details)ÚBatch)Ú	CallTypesÚ	ModelInfoÚUsage)Útoken_counterT)ÚfrozenÚslotsc                   óJ   — e Zd ZU dZeed<   eed<   ee   ed<   e	ed<   e	ed<   y)ÚBatchCostUsageResultzKAggregate cost, usage, and per-line pass/fail counts for a completed batch.ÚcostÚusageÚmodelsÚsuccessful_requestsÚfailed_requestsN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚfloatÚ__annotations__r   ÚlistÚstrÚint© ó    ú`/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/batches/batch_utils.pyr   r      s%   … áUà
ƒKØƒLØ�‰IÓØÓØÔr(   r   Úfile_content_dictionaryÚcustom_llm_provider)ÚopenaiÚazureÚ	vertex_aiÚhosted_vllmÚ	anthropicÚ
model_nameÚ
model_infoÚreturnc              ƒ   óp   K  — |dk(  r|rt        t        dd«      rt        | |«      S t        | |||¬«      S ­w)aO  
    Calculate the cost and usage of a batch.

    Args:
        model_info: Optional deployment-level model info with custom batch
            pricing. Threaded through to batch_cost_calculator so that
            deployment-specific pricing (e.g. input_cost_per_token_batches)
            is used instead of the global cost map.
    r.   Ú*disable_vertex_batch_output_transformationF©Úentriesr+   r1   r2   )ÚgetattrÚlitellmÚ(calculate_vertex_ai_batch_cost_and_usageÚ"_aggregate_batch_cost_usage_models)r*   r+   r1   r2   s       r)   Úcalculate_batch_cost_and_usager<      sH   è ø€ ð  	˜{Ò*ÙÜ”GÐIÈ5ÔQä7Ð8OÐQ[Ó\Ð\ä-Ø'Ø/ØØô	ð ùs   ‚46ÚbatchÚlitellm_paramsc              ƒ   ó¬  K  — | j                   €0t        dt        ddd¬«      g dt        | ||¬«      ƒ d{  –—† ¬«      S t	        | ||¬«      ƒ d{  –—† }t        | ||¬«      ƒ d{  –—† }|dk(  r(|r&t        t        d	d
«      rt        t        |«      |«      nt        t        |«      |||¬«      }|s|S t        ||j                  |z   ¬«      S 7 Œ˜7 Œ7 Œk­w)a]  Fetch a completed batch's output file and aggregate its cost, usage, and
    models in a single pass over the JSONL lines, so the parsed file content is
    never materialized in memory.

    Args:
        batch: The batch object
        custom_llm_provider: The LLM provider
        model_name: Optional model name
        litellm_params: Optional litellm parameters containing credentials (api_key, api_base, etc.)
        model_info: Optional deployment-level model info with custom pricing,
            threaded through so a deployment's configured rates win over the
            global cost map.
    Nç        r   ©Úprompt_tokensÚcompletion_tokensÚtotal_tokens©r+   r>   ©r   r   r   r   r   )r>   r.   r5   Fr6   )r   )Úoutput_file_idr   r   Ú count_error_file_failed_requestsÚ _fetch_batch_output_file_contentr8   r9   r:   Ú_get_file_content_as_dictionaryr;   Ú_iter_batch_output_entriesÚdataclasses_replacer   )r=   r+   r1   r>   r2   Úfile_contentÚerror_file_failed_requestsÚoutput_file_results           r)   Ú_handle_completed_batchrP   :   s  è ø€ ð8 ×ÑÐ#Ü#ØÜ a¸1È1ÔMØØ !Ü"BØÐ+>È~ô#÷ ô
ð 	
ô :¸%ÐATÐesÔt×t€LÜ.NØÐ#6À~ô/÷ )Ðð   ;Ò.ÙÜœÐ!MÈuÔUô	 	1Ô1PÐQ]Ó1^Ð`jÔkô 0Ü.¨|Ó<Ø 3Ø!Ø!ô	
ð ñ &Ø!Ð!ÜØÐ,>×,NÑ,NÐQkÑ,kôð ð7øð
 uøð)ús4   ‚3CµC¶CÁCÁCÁ&CÁ'A(CÃCÃCc                   ó   — e Zd ZdZdZdZy)Ú_LineOutcomez3A batch output line that yielded no billable stats.Úprovider_failedÚ
uncostableN)r   r   r    r!   ÚPROVIDER_FAILEDÚ
UNCOSTABLEr'   r(   r)   rR   rR   |   s   „ Ù=à'€OØ�Jr(   rR   c                   ód   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   edz  ed	<   y)
Ú_BatchOutputLineStatsr   rB   rC   rD   Úcache_read_tokensÚcache_creation_tokensÚreasoning_tokensNÚmodel)r   r   r    r"   r#   r&   r%   r'   r(   r)   rX   rX   ƒ   s5   … à
ƒKØÓØÓØÓØÓØÓØÓØ�‰:Ôr(   rX   r7   )r,   r-   r.   r/   r0   Úbedrockc              #   ó    K  — | D ]E  }t        ||«      st        j                  –— Œ"t        ||||«      }|�|nt        j                  –— ŒG y­w)a”  Classify every output line in a single pass, so counting failures never needs
    a second read of a potentially huge output file. A line the provider reported as
    failed yields ``PROVIDER_FAILED``; a successful line litellm could not price
    yields ``UNCOSTABLE`` and still counts as a successful request billed at $0, so
    the counts stay reconcilable with the provider's own ``request_counts``.N)Ú_batch_response_was_successfulrR   rU   Ú_safe_output_line_statsrV   )r7   r+   r1   r2   ÚentryÚstatss         r)   Ú_classify_output_line_statsrc   �   sX   è ø€ ð ò FˆÜ-¨eÐ5HÔIÜ×.Ñ.Ò.ØÜ'¨Ð/BÀJÐPZÓ[ˆØÐ(‰e¬l×.EÑ.EÓEñFùs   ‚AAra   c                 óÒ   — t        | t        «      r| j                  d«      nd}	 t        | |||«      S # t        $ r*}t        j                  d|t        |«      «       Y d}~yd}~ww xY w)z®Return the stats for one provider-successful batch output line, or None when
    it cannot be costed, so a single bad line never aborts the whole batch's cost
    accounting.Ú	custom_idNz}batch output line could not be costed, so it is billed at $0 and the rest of the batch is still billed. custom_id=%s error=%s)Ú
isinstanceÚdictÚgetÚ_compute_output_line_statsÚ	Exceptionr   Úwarningr%   )ra   r+   r1   r2   re   Úes         r)   r`   r`   ¢   sg   € ô 2<¸EÄ4Ô1H�u—y‘y Ô-Èd€Ið	Ü)¨%Ð1DÀjÐR\Ó]Ð]øÜò Ü×Ñð5àÜ�‹Fô		
ô ûðús   ¥3 ³	A&¼ A!Á!A&c           
      ó^  — t        | |«      }t        ||«      }t        |«      }|j                  d«      }t	        |t
        «      r|r|nd }|j                  }	t        t        ||||||¬«      |j                  |j                  |j                  |d   |d   |	r|	j                  nd xs d|¬«      S )Nr\   )Úresponse_bodyr   r+   r1   Úresponse_modelr2   Úcache_hit_tokensrZ   r   )r   rB   rC   rD   rY   rZ   r[   r\   )Ú(_get_response_from_batch_job_output_fileÚ'_get_batch_job_usage_from_response_bodyr   rh   rf   r%   Úcompletion_tokens_detailsrX   Ú_output_line_costrB   rC   rD   r[   )
ra   r+   r1   r2   rn   r   Úprompt_detailsÚ	raw_modelro   Úcompletion_detailss
             r)   ri   ri   ¸   sÆ   € ô DÀEÐK^Ó_€MÜ:¸=ÐJ]Ó^€EÜ7¸Ó>€NØ$×(Ñ(¨Ó1€IÜ)3°I¼sÔ)CÉ	™IÐW[€NØ %× ?Ñ ?ÐÜ ÜØ'ØØ 3Ø!Ø)Ø!ô
ð ×)Ñ)Ø×1Ñ1Ø×'Ñ'Ø(Ð);Ñ<Ø,Ð-DÑEÙASÐ,×=Ò=ÐY]ÒcÐbcØôð r(   rn   r   ro   c                 óÈ   — ddl m} |€4|dvr0t        j                  | |t        j
                  j                  ¬«      S |dk(  r|r|n	|xs |xs d} |||||¬«      \  }}	||	z   S )Nr   ©Úbatch_cost_calculator©r0   r]   )Úcompletion_responser+   Ú	call_typer]   Ú )r   r\   r+   r2   )Úlitellm.cost_calculatorrz   r9   Úcompletion_costr   Úaretrieve_batchÚvalue)
rn   r   r+   r1   ro   r2   rz   Ú
cost_modelÚprompt_costr€   s
             r)   rt   rt   ×   s‰   € õ >àÐÐ1Ð9QÑQÜ×&Ñ&Ø -Ø 3Ü×/Ñ/×5Ñ5ô
ð 	
ð *¨YÒ6¹:‰
È>ÒKmÐ]gÒKmÐkmð ñ $9ØØØ/Øô	$Ñ €K�ð ˜Ñ(Ð(r(   c           
      óœ  — t        t        | |||«      «      }t        d„ |D «       «      }t        d„ |D «       «      }t        |«      |z
  }dt        d„ |D «       «      fdt        d„ |D «       «      ffD ��	ci c]  \  }}	|	dkD  r||	“Œ }
}}	t	        dt        d„ |D «       «      t        d	„ |D «       «      t        d
„ |D «       «      t        d„ |D «       «      dœ|
¤Ž}|r|gn&|D �cg c]  }|j
                  sŒ|j
                  ‘Œ c}}t        d„ |D «       d«      }t        j                  d|||||«       t        |||||¬«      S c c}	}w c c}w )z«Aggregate cost, usage, models, and pass/fail counts from batch output
    entries in a single pass, holding one small stats record per line instead
    of the parsed file.c              3   óB   K  — | ]  }t        |t        «      sŒ|–— Œ y ­w©N)rf   rX   ©Ú.0Úresults     r)   ú	<genexpr>z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>ý   s   è ø€ Òl¨Ä*ÈVÔUjÕBkœfÑlùs   ‚˜c              3   óF   K  — | ]  }|t         j                  u sŒd –— Œ y­w©é   N)rR   rU   rˆ   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>þ   s   è ø€ Ò g vÀÌ,×JfÑJfÒ@f¤Ñ gùs   ‚!š!Úcache_read_input_tokensc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr‡   )rY   ©r‰   rb   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>  s   è ø€ Ò+\È¨E×,CÕ,CÑ+\ùó   ‚Úcache_creation_input_tokensc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr‡   )rZ   r‘   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>  s   è ø€ Ò/dÐPU°×0KÕ0KÑ/dùr’   r   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr‡   )rD   r‘   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>
  s   è ø€ ÒD°˜×+Õ+ÑDùr’   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr‡   )rB   r‘   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>  s   è ø€ ÒF°%˜%×-Õ-ÑFùr’   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr‡   )rC   r‘   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>  s   è ø€ ÒN¸%˜e×5Õ5ÑNùr’   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr‡   )r[   r‘   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>  s   è ø€ ÒL¸˜U×3Õ3ÑLùr’   )rD   rB   rC   r[   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr‡   )r   r‘   s     r)   r‹   z5_aggregate_batch_cost_usage_models.<locals>.<genexpr>  s   è ø€ Ò@¨E˜UŸZ�ZÑ@ùr’   r@   zJbatch output aggregate: cost=%s usage=%s models=%s successful=%d failed=%drF   r'   )	Útuplerc   ÚsumÚlenr   r\   r   Údebugr   )r7   r+   r1   r2   Úall_resultsÚ
line_statsr   r   ÚkeyÚtokensÚcache_token_paramsÚbatch_usagerb   Úbatch_modelsÚ
total_costs                  r)   r;   r;   ó   s|  € ô Ô:¸7ÐDWÐYcÐeoÓpÓq€KÜÑl°;ÔlÓl€JÜ Ñ g°Ô gÓg€OÜ!$ [Ó!1°OÑ!CÐð
 '¬Ñ+\ÐQ[Ô+\Ó(\Ð]Ø*¬CÑ/dÐYcÔ/dÓ,dÐeð
÷!áˆC�ð �AŠ:ð 	ˆV‰ð!Ðñ !ô ð ÜÑD¸ÔDÓDÜÑF¸:ÔFÓFÜÑNÀ:ÔNÓNÜÑLÀÔLÓLñ	ð
 ñ€Kñ +5˜:™,ÐT^Ö:nÈ5Ðbg×bmÓbm¸5¿;»;Ò:n€LÜÑ@°ZÔ@À#ÓF€JÜ×ÑØTØØØØØôô  ØØØØ/Ø'ôð ùó3!ùò ;os   Á5EÃ#E	Ã5E	Úvertex_ai_batch_responsesc           	      ól  — ddl m} d}d}d}d}d}d}|xs d}	| D ]«  }
|
j                  d«      }|€|dz  }Œ|dz  }|j                  di «      }|j                  d	d«      xs d}|j                  d
d«      xs d}|j                  dd«      xs ||z   }t        |||¬«      }	  |||	d¬«      \  }}|||z   z  }||z  }||z  }||z  }Œ­ t        j                  d||||||«       t        |t        |||¬«      |	g||¬«      S # t        $ r)}t        j                  dt        |«      «       Y d}~Œvd}~ww xY w)a¢  
    Calculate both cost and usage from raw Vertex AI batch responses.

    Used only when ``litellm.disable_vertex_batch_output_transformation = True``.
    In that case the GCS predictions.jsonl is returned as-is, with each line in
    the native Vertex format:

      {"request": ..., "response": {"candidates": [...], "usageMetadata": {...}}}

    usageMetadata contains promptTokenCount, candidatesTokenCount, totalTokenCount.

    A row with no ``response`` is counted as failed - the same signal already
    used to skip it from cost/usage aggregation, since Vertex batch prediction
    output doesn't establish a distinct error shape in this (non-default) path.
    r   ry   r@   zgemini-2.0-flash-001ÚresponseNrŽ   ÚusageMetadataÚpromptTokenCountÚcandidatesTokenCountÚtotalTokenCountrA   r.   )r   r\   r+   z3vertex_ai batch cost calculation error for line: %sz[vertex_ai batch cost: cost=%s, prompt=%d, completion=%d, total=%d, successful=%d, failed=%d)rD   rB   rC   rF   )
r   rz   rh   r   rj   r   r�   r%   Úinfor   )r¦   r1   rz   r¥   rD   rB   rC   r   r   Úactual_model_namer¨   rn   Úusage_metadataÚ_promptÚ_completionÚ_totalÚ
line_usageÚp_costÚc_costrl   s                       r)   r:   r:   #  s´  € õ& >à€JØ€LØ€MØÐØÐØ€OØ)ÒCÐ-CÐà-ò ˆØ Ÿ™ ZÓ0ˆØÐ Ø˜qÑ ˆOØØ˜qÑ Ðà&×*Ñ*¨?¸BÓ?ˆØ ×$Ñ$Ð%7¸Ó;Ò@¸qˆØ$×(Ñ(Ð)?ÀÓCÒHÀqˆØ×#Ñ#Ð$5°qÓ9ÒT¸gÈÑ>SˆäØ!Ø)Øô
ˆ
ð	`Ù2Ø Ø'Ø$/ô‰NˆF�Fð
 ˜& 6™/Ñ)ˆJð 	˜Ñ ˆØ˜[Ñ(ÐØ˜Ñ‰ð=ô@ ×ÑØeØØØØØØôô  ØÜØ%Ø'Ø/ô
ð
 "Ð"Ø/Ø'ô
ð 
øô# ò 	`Ü× Ñ Ð!VÔX[Ð\]ÓX^×_Ñ_ûð	`ús   Â"DÄ	D3Ä
D.Ä.D3rG   c                 ó  — ddl m}m}  || «      }|s || «      S 	 |j                  d«      d   j                  d«      d   }t        j                  d|«       |S # t        t
        f$ r#}t        j                  d| |«       | cY d}~S d}~ww xY w)	zº
    Resolve the file id the provider actually knows: unified ids yield their embedded
    llm_output_file_id, model-encoded ids decode to the raw provider id, raw ids pass through.
    r   )Ú"_is_base64_encoded_unified_file_idÚget_original_file_idzllm_output_file_id,rŽ   ú;zHFailed to extract LLM output file ID from unified file ID: %s, error: %sNz5Extracted LLM output file ID from unified file ID: %s)	Ú1litellm.proxy.openai_files_endpoints.common_utilsr·   r¸   ÚsplitÚ
IndexErrorÚAttributeErrorr   Úerrorr�   )rG   r·   r¸   Úunified_file_idÚ	extractedrl   s         r)   Ú_provider_output_file_idrÁ   w  sŸ   € ÷
ñ
 @ÀÓO€OÙÙ# NÓ3Ð3ðØ*×0Ñ0Ð1FÓGÈÑJ×PÑPÐQTÓUÐVWÑXˆ	ô ×ÑÐPÐR[Ô\ØÐøô œÐ'ò Ü×ÑØVØØô	
ð
 Õûðús   œ&A ÁBÁ)BÂBÂBÚfile_idc              ƒ   ó¦   K  — ddl m} t        | «      |dœ}t        |«      }|j	                  |«        |di |¤Žƒ d{  –—† }|j
                  S 7 Œ­w)a�  
    Fetch a batch's output or error file and return its raw JSONL bytes.

    Args:
        file_id: The provider or unified (litellm-managed) file id to fetch
        custom_llm_provider: The LLM provider
        litellm_params: Optional litellm parameters containing credentials (api_key, api_base, etc.)
                       Required for Azure and other providers that need authentication
    r   )Úafile_content)rÂ   r+   Nr'   )Úlitellm.files.mainrÄ   rÁ   Ú _extract_file_access_credentialsÚupdateÚcontent)rÂ   r+   r>   rÄ   Úfile_content_kwargsÚcredentialsÚ_file_contents          r)   Ú!_fetch_batch_managed_file_contentrÌ   ‘  s]   è ø€ õ 1ô ,¨GÓ4Ø2ñ"Ðô :¸.ÓI€KØ×Ñ˜{Ô+á!.Ñ!EÐ1DÑ!E×E€MØ× Ñ Ð ð Fús   ‚<A¾A¿Ac              ƒ   ó|   K  — | j                   €t        d«      ‚t        | j                   ||¬«      ƒ d{  –—† S 7 Œ­w)aY  
    Fetch the batch output file and return its raw JSONL bytes

    Args:
        batch: The batch object
        custom_llm_provider: The LLM provider
        litellm_params: Optional litellm parameters containing credentials (api_key, api_base, etc.)
                       Required for Azure and other providers that need authentication
    Nz3Output file id is None cannot retrieve file contentrE   )rG   Ú
ValueErrorrÌ   )r=   r+   r>   s      r)   rI   rI   ¯  sF   è ø€ ð ×ÑÐ#ÜÐNÓOÐOä2Ø×ÑÐ2EÐVdô÷ ð ð ús   ‚3<µ:¶<c              ƒ   ó  K  — | j                   €y	 t        | j                   ||¬«      ƒ d{  –—† }t        d„ t        |«      D «       «      S 7 Œ# t        $ r+}t        j                  d| j                   |«       Y d}~yd}~ww xY w­w)as  Count failed requests reported only in the batch's separate error file.

    OpenAI-shaped batch providers write successful lines to ``output_file_id``
    and per-request failures (e.g. a rejected param) to a distinct
    ``error_file_id`` - they never appear in the output file at all, so
    counting failures from the output file alone silently undercounts them.
    Nr   rE   z'Failed to fetch batch error file %s: %sc              3   ó    K  — | ]  }d –— Œ y­wr�   r'   )r‰   Ú_s     r)   r‹   z3count_error_file_failed_requests.<locals>.<genexpr>Ú  s   è ø€ ÒF�QŒqÑFùs   ‚)Úerror_file_idrÌ   rj   r   r�   r›   Ú_iter_batch_input_lines)r=   r+   r>   Úerror_file_contentrl   s        r)   rH   rH   Å  sˆ   è ø€ ð ×ÑÐ"ØðÜ#DØ×ÑÐ5HÐYgô$
÷ 
Ðô ÑFÔ1Ð2DÓEÔFÓFÐFð
ùô ò Ü×ÑÐFÈ×H[ÑH[Ð]^Ô_Üûðüs=   ‚B‘A ¬A­A ±BÁA Á	BÁ!A=Á8BÁ=BÂBc                 ód   — i }| r+ddddddddd	d
ddddgt         ¢­}|D ]  }|| v sŒ| |   ||<   Œ |S )a¥  
    Extract credentials from litellm_params for file access operations.

    This method extracts relevant authentication and configuration parameters
    needed for accessing files across different providers (Azure, Vertex AI, etc.).

    Args:
        litellm_params: Dictionary containing litellm parameters with credentials

    Returns:
        Dictionary containing only the credentials needed for file access
    Úapi_keyÚapi_baseÚapi_versionÚorganizationÚazure_ad_tokenÚazure_ad_token_providerÚvertex_projectÚvertex_locationÚvertex_credentialsÚgcs_bucket_nameÚbucket_nameÚtimeoutÚmax_retriesÚ#_litellm_internal_model_credentialsr   )r>   rÊ   Úcredential_keysr    s       r)   rÆ   rÆ   Ý  sy   € ð €Káð ØØØØØ%ØØØ ØØØØØ1ð"
ô (ñ"
ˆð" #ò 	7ˆCØ�nÒ$Ø#1°#Ñ#6�˜CÒ ð	7ð Ðr(   rM   c                 ó*   — t        t        | «      «      S )zm
    Get the file content as a list of dictionaries from JSON Lines format,
    skipping malformed lines
    )r$   rK   )rM   s    r)   rJ   rJ     s   € ô
 Ô*¨<Ó8Ó9Ð9r(   c              #   óÒ   K  — dt        | «      t        d«      }}}||k  rF| j                  ||«      }|dk(  r| |d |}}n
| || |dz   }}|j                  «       }|r|–— ||k  rŒEyy­w)zæ
    Yield non-empty JSONL lines (unparsed) one at a time, so a caller can parse
    each row in its own try/except and a single malformed line cannot abort the
    whole pass. Peak memory stays bounded for large batch files.
    r   ú
éÿÿÿÿNrŽ   )rœ   ÚordÚfindÚstrip)rM   ÚstartÚlengthÚnewlineÚidxÚchunkÚlines          r)   rÓ   rÓ     s~   è ø€ ð ¤ LÓ 1´3°t³9�7ˆ6€EØ
�&Š.Ø×Ñ ¨Ó/ˆØ�"Š9Ø'¨¨Ð/°�5‰Eà'¨¨cÐ2°C¸!±G�5ˆEØ�{‰{‹}ˆÙØŠJð �&�.ùs   ‚A"A'Á%A'c              #   óP   K  — t        | «      D ]  }t        |«      }|€Œ|–— Œ y­w)a  
    Yield parsed batch output JSONL entries one at a time without materializing
    the whole file as a list, so peak memory stays bounded. A malformed or
    non-object line is skipped with a warning so one bad line never aborts the
    whole batch's cost accounting.
    N)rÓ   Ú_parse_batch_output_line)rM   rñ   ra   s      r)   rK   rK      s1   è ø€ ô (¨Ó5ò ˆÜ(¨Ó.ˆØÑØ‹Kñùs   ‚&Ÿ&rñ   c                 ó  — 	 t        j                  | «      }t        |t        «      r|S t        j                  dt        |«      j                  «       y # t        $ r)}t        j                  dt        |«      «       Y d }~y d }~ww xY w)Nz(skipping malformed batch output line: %sz0skipping non-object batch output line of type %s)
ÚjsonÚloadsrÎ   r   rk   r%   rf   rg   Útyper   )rñ   Úparsedrl   s      r)   ró   ró   -  so   € ðÜŸ
™
 4Ó(ˆô �&œ$ÔØˆÜ×ÑÐMÌtÐTZË|×OdÑOdÔeØøô ò Ü×ÑÐIÌ3ÈqË6ÔRÜûðús   ‚A Á	BÁB Â Bé   Ú%_BATCH_TOKEN_ESTIMATE_BYTES_PER_TOKENÚraw_linec                 ó:   — t        dt        | «      t        z  «      S )zíConservative token estimate for a batch row the token counter cannot measure
    (or that cannot be parsed). Keeps the batch token total non-zero so a crafted
    row cannot evade the TPM limit, without hard-rejecting a legitimate batch.rŽ   )Úmaxrœ   rú   )rû   s    r)   Ú_estimate_batch_entry_tokensrþ   >  s   € ô ˆq”#�h“-Ô#HÑHÓIÐIr(   c                 ó  — | j                  di «      xs i }|j                  d|xs d«      }|j                  d«      }|rt        ||¬«      S |j                  d«      }|rt        ||¬«      S |j                  d«      }|rt        ||¬«      S y	)
zHToken-count a single batch input entry's body (chat / text / embedding).Úbodyr\   r~   Úmessages)r\   r  Úprompt)r\   r‚   Úinputr   )rh   r   Ú_count_prompt_or_input_tokens)ra   r1   r   r\   r  r  Ú
input_datas          r)   Ú_count_entry_tokensr  E  s‹   € ð
 —)‘)˜F BÓ'Ò-¨2€DØ—8‘8˜G ZÒ%5°2Ó6€Eà—h‘h˜zÓ*€HÙÜ 5°8Ô<Ð<à—H‘H˜XÓ&€FÙÜ,°5ÀÔGÐGàŸ™ Ó)€JÙÜ,°5À
ÔKÐKàr(   r\   r‚   c                 ó^  ‡ — t        |t        «      rt        ‰ |¬«      S t        |t        «      rd}|D ]v  }t        |t        «      r|t        ‰ |¬«      z  }Œ$t        |t        «      r|dz  }Œ:t        |t        «      sŒK|t        d„ |D «       «      z  }|t        ˆ fd„|D «       «      z  }Œx |S y)aö  Token-count a ``prompt`` / ``input`` field that the OpenAI batch
    schema allows in four shapes:

    - ``str``: a single text prompt.
    - ``list[str]``: multiple text prompts.
    - ``list[int]``: a pre-tokenized prompt (each int counts as 1 token).
    - ``list[list[int]]``: multiple pre-tokenized prompts.

    Pre-fix only the string shapes were counted, so a caller could send
    a large ``list[list[int]]`` payload and slip past TPM rate limits
    with a recorded cost of zero tokens.
    ©r\   Útextr   rŽ   c              3   óD   K  — | ]  }t        |t        «      rd nd–— Œ y­w)rŽ   r   N)rf   r&   )r‰   Úts     r)   r‹   z0_count_prompt_or_input_tokens.<locals>.<genexpr>w  s   è ø€ ÒKÀ¤*¨Q´Ô"4™Q¸!Ó;ÑKùs   ‚ c              3   óZ   •K  — | ]"  }t        |t        «      sŒt        ‰|¬ «      –— Œ$ y­w)r  N)rf   r%   r   )r‰   r  r\   s     €r)   r‹   z0_count_prompt_or_input_tokens.<locals>.<genexpr>x  s'   øè ø€ ÒeÀAÔR\Ð]^Ô`cÕRdœ]°¸Q×?Ð?Ñeùs   ƒ+™+)rf   r%   r   r$   r&   r›   )r\   r‚   Útotalrð   s   `   r)   r  r  \  s¬   ø€ ô �%œÔÜ 5¨uÔ5Ð5Ü�%œÔØˆØò 	fˆEÜ˜%¤Ô%Øœ¨U¸Ô?Ñ?‘Ü˜E¤3Ô'ð ˜‘
‘Ü˜E¤4Õ(ð œÑKÀUÔKÓKÑK�ØœÓeÈÔeÓeÑe‘ð	fð ˆØr(   c                 óî  — |dv r§ddl m} ddlm} | j	                  dd«      xs i }|dk(  r'|j                  |«      r |«       j                  |«      S  |«       j                  |d¬«      }|r=|j                  dk(  r.t        j                  d	|t        |j                  «       «      «       |S dd
lm} | j	                  dd«      xs i }|j                  |«      r|j!                  |«      S t#        di |¤Ž}|S )z>
    Get the tokens of a batch job from the response body
    r{   r   )ÚAnthropicConfig)ÚAmazonConverseConfigr   Nr]   )Úusage_objectÚreasoning_contentzwbatch output line reported usage this parser does not understand, so it will be billed at $0. provider=%s usage_keys=%s)ÚResponseAPILoggingUtilsr'   )Ú*litellm.llms.anthropic.chat.transformationr  Ú1litellm.llms.bedrock.chat.converse_transformationr  rh   Úis_converse_usage_shapeÚusage_from_batch_outputÚcalculate_usagerD   r   rk   ÚsortedÚkeysÚlitellm.responses.utilsr  Ú_is_response_api_usageÚ+_transform_response_api_usage_to_chat_usager   )	rn   r+   r  r  r  Úanthropic_usager  Ú_usage_dictr   s	            r)   rr   rr   }  s  € ð Ð6Ñ6ÝNÝZà+×/Ñ/°¸Ó>ÒDÀ"ˆØ )Ò+Ð0D×0\Ñ0\Ð]iÔ0jÙ'Ó)×AÑAÀ,ÓOÐOÙ!0Ó!2×!BÑ!BØ%Ø"ð "Có "
ˆñ ˜O×8Ñ8¸AÒ=Ü×"Ñ"ð,à#Ü�|×(Ñ(Ó*Ó+ô	ð ÐÝ?à&×*Ñ*¨7°DÓ9Ò?¸R€KØ×5Ñ5°kÔBØ&×RÑRÐS^Ó_Ð_ÜÑ. +Ñ.€EØ€Lr(   Úbatch_results_linec                 ó.   — | j                  dd«      xs i S )zí
    Get the ``result`` object from a line of an Anthropic message batch results JSONL file.

    Anthropic batch results lines look like:
    ``{"custom_id": ..., "result": {"type": "succeeded", "message": {..., "usage": {...}}}}``
    rŠ   N)rh   )r   s    r)   Ú-_get_anthropic_result_from_batch_results_liner"  Ÿ  s   € ð ×!Ñ! (¨DÓ1Ò7°RÐ7r(   Úbatch_job_output_filec                 óÜ   — |dk(  rt        | «      j                  dd«      xs i S |dk(  r| j                  dd«      xs i S | j                  dd«      xs i }|j                  dd«      xs i }|S )z9
    Get the response from the batch job output file
    r0   ÚmessageNr]   ÚmodelOutputr¨   r   ©r"  rh   )r#  r+   Ú	_responseÚ_response_bodys       r)   rq   rq   ©  s   € ð ˜kÒ)Ü<Ð=RÓS×WÑWÐXaÐcgÓhÒnÐlnÐnØ˜iÒ'Ø$×(Ñ(¨¸Ó=ÒCÀÐCØ2×6Ñ6°zÀ4ÓHÒNÈB€IØ%ŸM™M¨&°$Ó7Ò=¸2€NØÐr(   c                 óö   — |dk(  rt        | «      j                  d«      dk(  S |dk(  r(| j                  d«      duxr | j                  d«      du S | j                  dd«      xs i }|j                  d	d«      d
k(  S )a  
    Check if the batch job response was successful

    OpenAI-shaped output rows report ``response.status_code == 200``; Anthropic
    message batch results lines report ``result.type == "succeeded"``; Bedrock
    batch output lines report ``modelOutput`` (and no ``error``).
    r0   r÷   Ú	succeededr]   r&  Nr¾   r¨   Ústatus_codeéÈ   r'  )r#  r+   r(  s      r)   r_   r_   ¸  s�   € ð ˜kÒ)Ü<Ð=RÓS×WÑWÐX^Ó_ÐcnÑnÐnØ˜iÒ'Ø$×(Ñ(¨Ó7¸tÐCÒrÐH]×HaÑHaÐbiÓHjÐnrÐHrÐrØ2×6Ñ6°zÀ4ÓHÒNÈB€IØ�=‰=˜¨Ó-°Ñ4Ð4r(   )NN)NNNr‡   )r,   N)r,   )Brõ   Úcollections.abcr   r   r   Údataclassesr   r   rL   Úenumr   Útypingr	   r
   r   r9   Úlitellm._loggingr   Ú-litellm.litellm_core_utils.get_litellm_paramsr   Ú.litellm.litellm_core_utils.llm_cost_calc.utilsr   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   r   r   Úlitellm.utilsr   r   r$   rg   r%   r<   rP   rR   rX   rc   r`   ri   r"   rt   r;   r:   rÁ   ÚbytesrÌ   rI   r&   rH   rÆ   rJ   rÓ   rK   ró   rú   r#   rþ   r  r  rr   r"  rq   Úboolr_   r'   r(   r)   ú<module>r:     s\  ðÜ ß 7Ñ 7Ý !Ý 6Ý ß &Ñ &ã Ý +Ý TÝ VÝ +ß ;Ñ ;Ý 'ñ �$˜dÔ#÷ð ó $ðð "Ø#'ñ	Ø! $™Zðà Ð![Ñ\ðð �d‘
ðð ˜DÑ ð	ð
 óðB "Ø"&Ø#'ñ?Øð?à Ð![Ñ\ð?ð �d‘
ð?ð ˜4‘Kð	?ð
 ˜DÑ ð?ð ó?ôD�4ô ñ �$˜dÔ#÷ð ó $ððFØ�d‰^ðFà Ð!fÑgðFð �d‘
ðFð ˜DÑ ð	Fð
 Ð# lÑ2Ñ3óFð&Ø�3˜�8Ñðà Ð!fÑgðð �d‘
ðð ˜DÑ ð	ð
 ˜TÑ!óð,Ø�3˜�8Ñðà Ð!fÑgðð �d‘
ðð ˜DÑ ð	ð
 óð>)Ø˜3 ˜8Ñ$ð)àð)ð !Ð!fÑgð)ð �d‘
ð	)ð
 ˜$‘Jð)ð ˜DÑ ð)ð ó)ð> "Ø#'ñ	-Ø�d‰^ð-à Ð!fÑgð-ð �d‘
ð-ð ˜DÑ ð	-ð
 ó-ðd "ñQØ# D™zðQà�d‘
ðQð óQðh¨Sð °Só ð8 `hØ"&ñ!Øð!à Ð![Ñ\ð!ð ˜4‘Kð!ð ó	!ð@ `hØ"&ñØðà Ð![Ñ\ðð ˜4‘Kðð ó	ð,GØðGà Ð![Ñ\ðGð ˜4‘KðGð 	ó	Gð0&°T¸D±[ð &ÀTó &ðR:°%ð :¸DÀ¹Jó :ð¨%ð °H¸U±Oó ð$
¨Uð 
°xÀ±~ó 
ð	 5ð 	¨T°D©[ó 	ð 01Ð % uÓ 0ðJ¨5ð J°Só Jð "ñØðà�d‘
ðð 	óð.¨ð °Sð ¸Só ðD BJñØ˜3 ˜8Ñ$ðØ;>ðà
óðD8ÀgÈcÐSVÈhÑFWð 8Ð\cÐdgÐilÐdlÑ\mó 8ð JRñØ" 3¨ 8Ñ,ðØCFðàˆS�#ˆXÑóð  JRñ5Ø" 3¨ 8Ñ,ð5ØCFð5à	ô5r(   