Ë
    uPêjk-  ã                  ót  — d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZmZ dd„Zdd„Zd d	„Zd!d
„Zd"d„Zd#d„Zd$d„Zd$d„Zd%d„Z	 	 	 	 d&d„Z	 	 	 	 d&d„Z	 	 	 	 	 	 d'd„Zd(d„Zddœ	 	 	 	 	 	 	 	 	 d)d„Z	 	 	 	 	 	 	 	 	 	 d*d„Z e
d«      Zd+d„Z d,d„Z!d+d„Z"	 	 	 	 	 	 	 	 d-d„Z#	 	 	 	 	 	 	 	 d.d„Z$y)/é    )ÚannotationsN)ÚCallableÚIteratorÚSequence)ÚAnyÚFinalÚTypeVar)ÚAnthropicUsage)ÚAllMessageValuesÚResponseAPIUsagec                ó&  — t        | t        «      r| gS t        | t        «      r| j                  dd¬«      }nt        | t        «      r| }ng S g }|j                  d«      D ]•  }|j                  «       D ]€  }|j                  «       }|j                  d«      sŒ%|t        d«      d  j                  «       }|r|dk(  rŒI	 t        j                  |«      }t        |t        «      sŒp|j                  |«       Œ‚ Œ— |S # t        j                  $ r Y Œœw xY w)Nzutf-8Úreplace)Úerrorsz

zdata:z[DONE])Ú
isinstanceÚdictÚbytesÚdecodeÚstrÚsplitÚ
splitlinesÚstripÚ
startswithÚlenÚjsonÚloadsÚJSONDecodeErrorÚappend)ÚitemÚchunkÚeventsÚblockÚlineÚstrippedÚpayloadÚparseds           úv/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/base_llm/guardrail_translation/utils.pyÚ_anthropic_stream_chunk_eventsr'      s  € Ü�$œÔØˆvˆÜ�$œÔØ—‘˜G¨I�Ó6‰Ü	�Dœ#Ô	Ø‰àˆ	à "€FØ—‘˜VÓ$ò &ˆØ×$Ñ$Ó&ò 	&ˆDØ—z‘z“|ˆHØ×&Ñ& wÔ/ØØœs 7›|˜~Ð.×4Ñ4Ó6ˆGÙ˜g¨Ò1ØðÜŸ™ GÓ,�ô ˜&¤$Õ'Ø—‘˜fÕ%ñ	&ð&ð €Møô	 ×'Ñ'ò Ùðús   Â=C:Ã:DÄDc                ó   — d}d}d}| D ]ä  }t        |«      D ]Ô  }|j                  d«      }|dk(  r+|j                  d«      xs i }|j                  d«      xs i }n|dk(  r|j                  d«      xs i }ni }t        |t        «      sŒr|j                  d«      � t	        |j                  d«      xs d«      }d	}|j                  d
«      €Œµt	        |j                  d
«      xs d«      }d	}ŒÖ Œæ |sy t        ||¬«      S )Nr   FÚtypeÚmessage_startÚmessageÚusageÚmessage_deltaÚinput_tokensTÚoutput_tokens©r.   r/   )r'   Úgetr   r   Úintr
   )	Úoriginal_responser.   r/   Úfound_usager   ÚeventÚ
event_typer+   Ú	usage_objs	            r&   Ú#_usage_from_anthropic_stream_chunksr8   '   s
  € Ø€LØ€MØ€Kà!ò #ˆÜ3°DÓ9ò 	#ˆEØŸ™ 6Ó*ˆJØ˜_Ò,ØŸ)™) IÓ.Ò4°"�Ø#ŸK™K¨Ó0Ò6°B‘	Ø˜Ò.Ø!ŸI™I gÓ.Ò4°"‘	à�	Ü˜i¬Ô.ØØ�}‰}˜^Ó,Ð8Ü" 9§=¡=°Ó#@Ò#EÀAÓF�Ø"�Ø�}‰}˜_Ó-Ñ9Ü # I§M¡M°/Ó$BÒ$GÀaÓ H�Ø"‘ñ!	#ð#ñ& ØÜ |À=ÔQÐQó    c                ó„   — t        | t        «      r| j                  d«      S | �t        | t        «      st	        | dd «      S y )Nr,   )r   r   r1   ÚlistÚgetattr)r3   s    r&   Ú_blocked_usage_objr=   D   sA   € ÜÐ#¤TÔ*Ø ×$Ñ$ WÓ-Ð-ØÐ$¬ZÐ8IÌ4Ô-PÜÐ(¨'°4Ó8Ð8Ør9   c                óÊ   — t        | t        «      r/t        | j                  || j                  |d«      «      xs d«      S t        t	        | |t	        | |d«      «      xs d«      S ©Nr   )r   r   r2   r1   r<   )r7   ÚkeyÚfallback_keys      r&   Ú_usage_tokensrB   L   sT   € Ü�)œTÔ"Ü�9—=‘=  i§m¡m°LÀ!Ó&DÓEÒJÈÓKÐKÜŒw�y #¤w¨y¸,ÈÓ'JÓKÒPÈqÓQÐQr9   c                óœ   — t        | t        «      rt        | «      }|�|S t        | «      }t	        t        |dd«      t        |dd«      ¬«      S )aŽ  
    Token usage for a synthetic guardrail-blocked response.

    A post-call block replaces the LLM's response with the violation message,
    but the upstream call already consumed tokens -- report that real usage
    (carried on ``ModifyResponseException.original_response``) rather than
    discarding it. Pre-call blocks never invoked the LLM (no original_response),
    so usage is zero.
    r.   Úprompt_tokensr/   Úcompletion_tokensr0   )r   r;   r8   r=   r
   rB   )r3   Ústream_usager7   s      r&   Úblocked_response_usagerG   R   sW   € ô Ð#¤TÔ*ÜAÐBSÓTˆØÐ#ØÐä)Ð*;Ó<€IÜÜ" 9¨n¸oÓNÜ# I¨Ð@SÓTôð r9   c                ó´   — t        | «      }t        |t        «      r|S t        |dd«      }t        |dd«      }t        |dd«      }t        |||xs ||z   ¬«      S )a{  
    Token usage for a synthetic guardrail-blocked /v1/responses reply.

    Same contract as ``blocked_response_usage`` in Responses API shape: a
    native ``ResponsesAPIResponse`` usage passes through unchanged, a bridged
    chat ``ModelResponse`` usage maps prompt/completion tokens to input/output
    tokens, and a pre-call block (no original_response) reports zeros.
    r.   rD   r/   rE   Útotal_tokens)r.   r/   rI   )r=   r   r   rB   )r3   r7   r.   r/   rI   s        r&   Úblocked_responses_api_usagerJ   h   sk   € ô *Ð*;Ó<€IÜ�)Ô-Ô.ØÐä'¨	°>À?ÓS€LÜ(¨°OÐEXÓY€MÜ'¨	°>À>ÓR€LÜØ!Ø#Ø!ÒA \°MÑ%Aôð r9   c                ój   — t        | dd «      }|�t        |«      S dd l}t        t        |dd«      «      S )NÚ skip_system_message_in_guardrailr   F©r<   ÚboolÚlitellm©Úguardrail_to_applyÚperrO   s      r&   Ú+effective_skip_system_message_for_guardrailrS      s:   € ÜÐ+Ð-OÐQUÓV€CØ
€Ü�C‹yÐÛä”˜Ð!CÀUÓKÓLÐLr9   c                ój   — t        | dd «      }|�t        |«      S dd l}t        t        |dd«      «      S )NÚskip_tool_message_in_guardrailr   FrM   rP   s      r&   Ú)effective_skip_tool_message_for_guardrailrV   ˆ   s9   € ÜÐ+Ð-MÈtÓT€CØ
€Ü�C‹yÐÛä”˜Ð!AÀ5ÓIÓJÐJr9   c                ób   — t        | xs i j                  d«      xs d«      j                  «       S )NÚroleÚ )r   r1   Úlower)r+   s    r&   Ú_message_roler[   ‘   s*   € Ü�’˜2×"Ñ" 6Ó*Ò0¨bÓ1×7Ñ7Ó9Ð9r9   c                ó&   — t        d„ | D «       «      S )Nc              3  ó>   K  — | ]  }t        |«      d k7  sŒ|–— Œ y­w)ÚsystemN©r[   ©Ú.0Úms     r&   ú	<genexpr>z1openai_messages_without_system.<locals>.<genexpr>˜   s   è ø€ ÒE�q¬°aÓ(8¸HÓ(D”ÑEùó   ‚–©Útuple©Úmessagess    r&   Úopenai_messages_without_systemri   •   s   € ô ÑE˜HÔEÓEÐEr9   c                ó&   — t        d„ | D «       «      S )Nc              3  ó>   K  — | ]  }t        |«      d k7  sŒ|–— Œ y­w)ÚtoolNr_   r`   s     r&   rc   z/openai_messages_without_tool.<locals>.<genexpr>ž   s   è ø€ ÒC�q¬°aÓ(8¸FÓ(B”ÑCùrd   re   rg   s    r&   Úopenai_messages_without_toolrm   ›   s   € ô ÑC˜HÔCÓCÐCr9   c                ó¦   — t        | «      rt        |«      n
t        |«      }t        | «      rt	        |«      n|}|t        |«      t        |«      k7  fS ©N)rS   ri   rf   rV   rm   r   )rQ   rh   Úsystem_filteredÚfully_filtereds       r&   Úfilter_messages_by_skip_flagsrr   ¡   s[   € ô
 7Ð7IÔJô 	' xÔ0ä�8‹_ð ô 5Ð5GÔHô 	% _Ô5àð ð
 œ3˜~Ó.´#°h³-Ñ?Ð?Ð?r9   c                ó    — t        | dd «      du S )NÚscan_only_tool_resultsT)r<   )rQ   s    r&   Ú.effective_scan_only_tool_results_for_guardrailru   ±   s   € ÜÐ%Ð'?ÀÓFÈ$ÐNÐNr9   F)rt   c               ó2   — |r| dk(  ry|r| dk(  ry|xr | dvS )Nr^   Trl   )rl   Úfunction© )rX   Úskip_system_messageÚskip_tool_messagert   s       r&   Úrole_out_of_guardrail_scoper{   µ   s.   € ñ ˜t xÒ/ØÙ˜T Vš^ØØ!ÒF dÐ2FÐ&FÐFr9   c               óF   ‡‡‡— t        ˆˆˆfd„t        | «      D «       «      S )Nc              3  óX   •K  — | ]!  \  }}t        t        |«      ‰‰‰¬ «      s|–— Œ# y­w))ry   rz   rt   N)r{   r[   )ra   Úindexr+   rt   Úskip_systemÚ	skip_tools      €€€r&   rc   z4scoped_structured_message_indices.<locals>.<genexpr>Ê   s6   øè ø€ ò 	áˆE�7Ü*Ü˜'Ó"Ø +Ø'Ø#9õ	
ô 	ñ	ùs   ƒ'*)rf   Ú	enumerate)rh   rt   r   r€   s    ```r&   Ú!scoped_structured_message_indicesr‚   Ã   s$   ú€ ô õ 	ä'¨Ó1ô	ó 	ð 	r9   ÚToolTc                óú   — t        | t        «      sy | j                  d«      }t        |t        «      r%|j                  d«      }t        |t        «      r|S d S | j                  d«      }t        |t        «      r|S d S )Nrw   Úname)r   r   r1   r   )rl   rw   Úfunction_nameÚ	flat_names       r&   Úopenai_tool_namerˆ   Ù   sk   € Ü�dœDÔ!ØØ—h‘h˜zÓ*€HÜ�(œDÔ!Ø'Ÿ|™|¨FÓ3ˆÜ *¨=¼#Ô >ˆ}ÐHÀDÐHØ—x‘x Ó'€IÜ" 9¬cÔ2ˆ9Ð<¸Ð<r9   c                óþ   — t        | t        «      sy| j                  d«      dk(  r| j                  d«      nd}t        |t        «      r|j                  d«      nd}t        d„ | j                  d«      |fD «       «      S )a  Every name a /v1/messages tool dict can act under: the flat Anthropic ``name`` plus
    ``function.name`` for OpenAI-format tools the bridge forwards verbatim. Allowlist checks
    must see both, or a decoy flat name could smuggle a disallowed ``function.name`` through.rx   r)   rw   Nr…   c              3  óH   K  — | ]  }t        |t        «      sŒ|sŒ|–— Œ y ­wro   )r   r   )ra   r…   s     r&   rc   z'anthropic_tool_names.<locals>.<genexpr>ì   s   è ø€ Òf˜$ÄzÐRVÔX[ÕG\Òae”Ñfùs   ‚"˜"›")r   r   r1   rf   )rl   rw   r†   s      r&   Úanthropic_tool_namesr‹   ä   sk   € ô �dœDÔ!ØØ.2¯h©h°vÓ.>À*Ò.L�d—h‘h˜zÔ*ÐRV€HÜ3=¸hÌÔ3M˜8Ÿ<™<¨Ô/ÐSW€MÜÑf 4§8¡8¨FÓ#3°]Ð"CÔfÓfÐfr9   c                ó*   — t        | «      }|r|d   S d S r?   )r‹   )rl   Únamess     r&   Úanthropic_tool_namerŽ   ï   s   € Ü'¨Ó-€EÙˆ5�‰8Ð& $Ð&r9   c                óž   ‡‡‡‡— t        | xs d«      }t        ˆˆfd„|D «       «      Št        ˆˆˆˆfd„t        ‰«      D «       «      }g |¢|¢S )a  Union of the request's tools and guardrail-returned tools, keyed by name.

    Under ``scan_only_tool_results`` the guardrail never saw the request's
    tools, so a returned list can neither replace them (it would drop every
    user-defined function) nor be discarded (it may carry a tool the guardrail
    synthesized and told the model to call, like Compresr's retrieve tool).
    Keep every request tool and append only returned tools whose names aren't
    already taken by a request tool or an earlier returned tool.
    rx   c              3  ó8   •K  — | ]  } ‰|«      xŠ€Œ‰–— Œ y ­wro   rx   )ra   rl   r…   Ú	tool_names     €€r&   rc   z:merge_returned_tools_into_request_tools.<locals>.<genexpr>  s    øè ø€ Ò"g¨DÉ)ÐTXË/ÐBYÀ$ÑAf¤4Ñ"gùs   ƒ“c              3  ót   •K  — | ]/  \  }} ‰|«      xŠ‰vr‰�t        ˆˆfd„‰d | D «       «      r|–— Œ1 y ­w)Nc              3  ó4   •K  — | ]  } ‰|«      ‰k7  –— Œ y ­wro   rx   )ra   Úearlierr…   r‘   s     €€r&   rc   zDmerge_returned_tools_into_request_tools.<locals>.<genexpr>.<genexpr>  s   øè ø€ Ò bÀ¡¨7Ó!3°tÕ!;Ñ bùs   ƒ)Úall)ra   r~   rl   r…   Úreturned_toolsÚtaken_namesr‘   s      €€€€r&   rc   z:merge_returned_tools_into_request_tools.<locals>.<genexpr>  sI   øè ø€ ò áˆE�4Ù˜d“OÐ#ˆD¨KÑ7Øˆ\œSÔ bÈ>ÐZ`Ð[`ÐKaÔ bÔbô 	ñùs   ƒ58)rf   Ú	frozensetr�   )Úrequest_toolsr–   r‘   Ú	originalsÚ	additionsr…   r—   s    ``  @@r&   Ú'merge_returned_tools_into_request_toolsrœ   ô   sR   û€ ô ˜]Ò0¨bÓ1€IÜ"Ô"g°IÔ"gÓg€KÜö ä$ ^Ó4ôó €Ið $ˆYÐ#˜Ð#Ð#r9   c                óØ   ‡ ‡‡‡‡— t        t        ||«      «      Št        |t        |«      d «      Št	        |t        |«      d «      Š|r|d   ndŠdˆˆ ˆˆˆfd„}t         |«       «      S )aí  Substitute guardrail-returned messages back into the full conversation.

    Guardrails only ever see the scoped subset of messages, so a replacement
    list they hand back describes that subset, not the whole request. Writing
    it over ``data["messages"]`` wholesale would silently drop every
    out-of-scope message (system prompt, prior turns). Instead, swap each
    returned message into the position its scoped original came from; extra
    returned messages land after the last scoped position, and scoped
    originals without a counterpart are treated as removed by the guardrail.
    When nothing was filtered out this degenerates to the returned list
    itself, preserving wholesale-replacement behavior for unscoped guardrails.
    Néÿÿÿÿc               3  óŠ   •K  — t        ‰«      D ].  \  } }| ‰v rŒ‰j                  | |«      –— | ‰k(  sŒ%‰E d {  –—†  Œ0 y 7 Œ­wro   )r�   r1   )r~   r+   ÚappendedÚfull_messagesÚlast_scoped_indexÚremovedÚreplacementss     €€€€€r&   Ú_mergedz2merge_guardrailed_scoped_messages.<locals>._merged#  sT   øè ø€ Ü'¨Ó6ò 	$‰NˆE�7Ø˜ÑØØ×"Ñ" 5¨'Ó2Ò2ØÐ)Ó)Ø#×#Ñ#ñ	$ð
 $ús   ƒ0A´A¹AºA)ÚreturnzIterator[AllMessageValues])r   Úzipr˜   r   rf   r;   )r¡   Úscoped_indicesÚguardrailed_scopedr¥   r    r¢   r£   r¤   s   `   @@@@r&   Ú!merge_guardrailed_scoped_messagesrª     sn   ü€ ô" œs >Ð3EÓFÓG€LÜ˜~¬cÐ2DÓ.EÐ.GÐHÓI€GÜÐ.¬s°>Ó/BÐ/DÐEÓF€HÙ5C˜~¨bÒ1ÈÐ÷$ñ $ô ‘“	‹?Ðr9   )r   r   r¦   z
list[dict])r3   z	list[Any]r¦   zAnthropicUsage | None)r3   Úobjectr¦   r«   )r7   r«   r@   r   rA   r   r¦   r2   )r3   z
Any | Noner¦   r
   )r3   r«   r¦   r   )rQ   r   r¦   rN   )r+   r   r¦   r   )rh   úSequence[AllMessageValues]r¦   ztuple[AllMessageValues, ...])rQ   r«   rh   r¬   r¦   z)tuple[tuple[AllMessageValues, ...], bool])rQ   r«   r¦   rN   )
rX   r   ry   rN   rz   rN   rt   rN   r¦   rN   )
rh   r¬   rt   rN   r   rN   r€   rN   r¦   ztuple[int, ...])rl   r«   r¦   z
str | None)rl   r«   r¦   ztuple[str, ...])r™   zSequence[ToolT] | Noner–   zSequence[ToolT]r‘   zCallable[[ToolT], str | None]r¦   zlist[ToolT])r¡   r¬   r¨   zSequence[int]r©   r¬   r¦   zlist[AllMessageValues])%Ú
__future__r   r   Úcollections.abcr   r   r   Útypingr   r   r	   Ú8litellm.types.llms.anthropic_messages.anthropic_responser
   Úlitellm.types.llms.openair   r   r'   r8   r=   rB   rG   rJ   rS   rV   r[   ri   rm   rr   ru   r{   r‚   rƒ   rˆ   r‹   rŽ   rœ   rª   rx   r9   r&   ú<module>r²      sˆ  ðÝ "ã ß 8Ñ 8ß &Ñ &å Sß Hóó8Ró:óRóó,ó.MóKó:ðFØ(ðFà!óFðDØ(ðDà!óDð@Øð@Ø*Dð@à.ó@ó Oð $)ñGØ
ðGð ðGð ð	Gð
 !ðGð 
óGðØ(ðð !ðð ð	ð
 ðð óñ& 	�Ó€ó=ógó'ð
$Ø)ð$à#ð$ð -ð$ð ó	$ð2Ø-ðà!ðð 3ðð ô	r9   