§
    œŠtj×%  ã                  óf  — d 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mZmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZmZ dZeee         gef         Z  G d„ de¦  «        Z! ed¬¦  «         G d„ de!¦  «        ¦   «         Z" G d„ deee         eef         ¦  «        Z#ddgZ$dS )a  Context editing middleware.

Mirrors Anthropic's context editing capabilities by clearing older tool results once the
conversation grows beyond a configurable token threshold.

The implementation is intentionally model-agnostic so it can be used with any LangChain
chat model.
é    )Úannotations)Ú	AwaitableÚCallableÚIterableÚSequence)Údeepcopy)Ú	dataclass)ÚLiteral)Ú	AIMessageÚ
AnyMessageÚBaseMessageÚToolMessage©Úcount_tokens_approximately)ÚProtocol)ÚAgentMiddlewareÚ
AgentStateÚContextTÚModelRequestÚModelResponseÚ	ResponseTz	[cleared]c                  ó   — e Zd ZdZd
d„Zd	S )ÚContextEditz/Protocol describing a context editing strategy.Úmessagesúlist[AnyMessage]Úcount_tokensÚTokenCounterÚreturnÚNonec               ó   — dS )z+Apply an edit to the message list in place.N© )Úselfr   r   s      úi/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain/agents/middleware/context_editing.pyÚapplyzContextEdit.apply/   s	   € ð 	ˆó    N©r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r!   r%   r#   r   r   ,   s.   € € € € € Ø9Ð9ðð ð ð ð ð r%   r   T)Úslotsc                  ó”   — e Zd ZU dZdZded<   	 dZded<   	 dZded<   	 d	Zd
ed<   	 dZ	ded<   	 e
Zded<   	 dd„Zedd„¦   «         ZdS )ÚClearToolUsesEditzGConfiguration for clearing tool outputs when token limits are exceeded.i † ÚintÚtriggerr   Úclear_at_leasté   ÚkeepFÚboolÚclear_tool_inputsr!   zSequence[str]Úexclude_toolsÚstrÚplaceholderr   r   r   r   r   r   c          
     óx  ‡—  ||¦  «        }|| j         k    rdS d„ t          |¦  «        D ¦   «         }| j        t          |¦  «        k    rg }n| j        r|d| j         …         }d}t	          | j        ¦  «        }|D �];\  }Š‰j                             di ¦  «                             d¦  «        rŒ5t          d„ t          |d|…         ¦  «        D ¦   «         d¦  «        }|€Œgt          ˆfd„|j
        D ¦   «         d¦  «        }	|	€Œ‹‰j        p|	d         |v rŒ�‰                     d| j        i ‰j        ¥dd	d
dœi¥dœ¬¦  «        ||<   | j        r1|                      |‰j        ¦  «        ||                     |¦  «        <   | j        dk    r+ ||¦  «        }
t'          d||
z
  ¦  «        }|| j        k    r n�Œ=dS )z#Apply the clear-tool-uses strategy.Nc                óF   — g | ]\  }}t          |t          ¦  «        ¯||f‘ŒS r!   )Ú
isinstancer   )Ú.0ÚidxÚmsgs      r#   ú
<listcomp>z+ClearToolUsesEdit.apply.<locals>.<listcomp>[   s?   € ð 
ð 
ð 
Ù#˜3 ½jÈÍkÑ>ZÔ>Zð
Ø�#ˆJð
ð 
ð 
r%   r   Úcontext_editingÚclearedc              3  óD   K  — | ]}t          |t          ¦  «        ¯|V — Œd S ©N)r:   r   )r;   Úms     r#   ú	<genexpr>z*ClearToolUsesEdit.apply.<locals>.<genexpr>l   s1   è è € ÐQÐQ�q½
À1ÅiÑ8PÔ8PÐQ�ÐQÐQÐQÐQÐQÐQr%   c              3  óX   •K  — | ]$}|                      d ¦  «        ‰j        k    ¯ |V — Œ%dS )ÚidN)ÚgetÚtool_call_id)r;   ÚcallÚtool_messages     €r#   rD   z*ClearToolUsesEdit.apply.<locals>.<genexpr>s   sG   øè è € ð ð àØ—x’x ‘~”~¨Ô)BÒBÐBð àBÐBÐBÐBðð r%   ÚnameTÚclear_tool_uses)r@   Ústrategy)ÚartifactÚcontentÚresponse_metadata©Úupdate)r/   Ú	enumerater2   ÚlenÚsetr5   rP   rG   ÚnextÚreversedÚ
tool_callsrK   Ú
model_copyr7   r4   Ú!_build_cleared_tool_input_messagerH   Úindexr0   Úmax)r"   r   r   ÚtokensÚ
candidatesÚcleared_tokensÚexcluded_toolsr<   Ú
ai_messageÚ	tool_callÚnew_token_countrJ   s              @r#   r$   zClearToolUsesEdit.applyO   sa  ø€ ð �˜hÑ'Ô'ˆà�T”\Ò!Ð!ØˆFð
ð 
Ý'0°Ñ':Ô':ð
ñ 
ô 
ˆ
ð Œ9�˜J™œÒ'Ð'ØˆJˆJØŒYð 	2Ø# L t¤y j LÔ1ˆJàˆÝ˜TÔ/Ñ0Ô0ˆà!+ð 2	ñ 2	ÑˆC�ØÔ-×1Ò1Ð2CÀRÑHÔH×LÒLÈYÑWÔWð ØåØQÐQ�H X¨d¨s¨d¤^Ñ4Ô4ÐQÑQÔQÐSWñô ˆJð Ð!Øåðð ð ð à *Ô 5ðñ ô ð
 ñô ˆIð Ð ØàÔ!Ð6 Y¨vÔ%6¸>ÐIÐIØà(×3Ò3à $Ø#Ô/ð*Ø&Ô8ð*à)Ø'+Ø(9ð,ð ,ð*ð *ð
ð 
ð 4ñ ô ˆH�S‰Mð Ô%ð Ø7;×7]Ò7]ØØ Ô-ñ8ô 8�˜Ÿš¨
Ñ3Ô3Ñ4ð
 Ô" QÒ&Ð&Ø". ,¨xÑ"8Ô"8�Ý!$ Q¨°Ñ(@Ñ!AÔ!A�Ø! TÔ%8Ò8Ð8Ø�Eùàˆr%   Úmessager   rH   c                óü  — g }d}| j         D ]F}t          |¦  «        }|                     d¦  «        |k    ri |d<   d}|                     |¦  «         ŒGt          t	          | di ¦  «        ¦  «        }t          |                     di ¦  «        ¦  «        }|rOt          |                     dg ¦  «        ¦  «        }|                     |¦  «         t          |¦  «        |d<   ||d<   |                      ||dœ¬	¦  «        S )
NFrF   ÚargsTrP   r?   Úcleared_tool_inputs)rX   rP   rQ   )	rX   ÚdictrG   ÚappendÚgetattrrU   ÚaddÚsortedrY   )	rd   rH   Úupdated_tool_callsÚcleared_anyrb   Úupdated_callÚmetadataÚcontext_entryÚcleared_idss	            r#   rZ   z3ClearToolUsesEdit._build_cleared_tool_input_message�   s$  € ð
  ÐØˆØ Ô+ð 	4ð 	4ˆIÝ 	™?œ?ˆLØ×Ò Ñ%Ô%¨Ò5Ð5Ø')�˜VÑ$Ø"�Ø×%Ò% lÑ3Ô3Ð3Ð3å� Ð)<¸bÑAÔAÑBÔBˆÝ˜XŸ\š\Ð*;¸RÑ@Ô@ÑAÔAˆØð 	8Ý˜m×/Ò/Ð0EÀrÑJÔJÑKÔKˆKØ�OŠO˜LÑ)Ô)Ð)Ý39¸+Ñ3FÔ3FˆMÐ/Ñ0Ø*7ˆHÐ&Ñ'à×!Ò!à0Ø%-ðð ð "ñ 
ô 
ð 	
r%   Nr&   )rd   r   rH   r6   r   r   )r'   r(   r)   r*   r/   Ú__annotations__r0   r2   r4   r5   ÚDEFAULT_TOOL_PLACEHOLDERr7   r$   ÚstaticmethodrZ   r!   r%   r#   r-   r-   9   sÊ   € € € € € € àQÐQà€GÐÐÐÑØ-à€NÐÐÐÑØAà€D€M€M€M�MØDà#ÐÐ#Ð#Ð#Ñ#ØRà#%€MÐ%Ð%Ð%Ñ%Ø6à/€KÐ/Ð/Ð/Ñ/Ø=ðLð Lð Lð Lð\ ð
ð 
ð 
ñ „\ð
ð 
ð 
r%   r-   c                  óR   ‡ — e Zd ZU dZded<   ded<   dddœdˆ fd„Zdd„Zdd„Zˆ xZS )ÚContextEditingMiddlewarea‹  Automatically prune tool results to manage context size.

    The middleware applies a sequence of edits when the total input token count exceeds
    configured thresholds.

    Currently the `ClearToolUsesEdit` strategy is supported, aligning with Anthropic's
    `clear_tool_uses_20250919` behavior [(read more)](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool).
    zlist[ContextEdit]ÚeditsúLiteral['approximate', 'model']Útoken_count_methodNÚapproximate)rx   rz   úIterable[ContextEdit] | Noner   r   c               óœ   •— t          ¦   «                              ¦   «          t          |pt          ¦   «         f¦  «        | _        || _        dS )aµ  Initialize an instance of context editing middleware.

        Args:
            edits: Sequence of edit strategies to apply.

                Defaults to a single `ClearToolUsesEdit` mirroring Anthropic defaults.
            token_count_method: Whether to use approximate token counting
                (faster, less accurate) or exact counting implemented by the
                chat model (potentially slower, more accurate).
        N)ÚsuperÚ__init__Úlistr-   rx   rz   )r"   rx   rz   Ú	__class__s      €r#   r   z!ContextEditingMiddleware.__init__È   sG   ø€ õ  	‰Œ×ÒÑÔÐÝ˜%Ð9Õ$5Ñ$7Ô$7Ð#9Ñ:Ô:ˆŒ
Ø"4ˆÔÐÐr%   ÚrequestúModelRequest[ContextT]Úhandlerú<Callable[[ModelRequest[ContextT]], ModelResponse[ResponseT]]ú$ModelResponse[ResponseT] | AIMessagec                ó<  ‡‡— ‰j         s |‰¦  «        S | j        dk    rd
d„}n‰j        r‰j        gng Šd
ˆˆfd„}t          t	          ‰j         ¦  «        ¦  «        }| j        D ]}|                     ||¬¦  «         Œ |‰                     |¬	¦  «        ¦  «        S )ár  Apply context edits before invoking the model via handler.

        Args:
            request: Model request to execute (includes state and runtime).
            handler: Async callback that executes the model request and returns
                `ModelResponse`.

        Returns:
            The result of invoking the handler with potentially edited messages.
        r{   r   úSequence[BaseMessage]r   r.   c                ó    — t          | ¦  «        S rB   r   ©r   s    r#   r   z>ContextEditingMiddleware.wrap_model_call.<locals>.count_tokensð   ó   € Ý1°(Ñ;Ô;Ð;r%   c                ód   •— ‰j                              ‰t          | ¦  «        z   ‰j        ¦  «        S rB   ©ÚmodelÚget_num_tokens_from_messagesr€   Útools©r   r‚   Ú
system_msgs    €€r#   r   z>ContextEditingMiddleware.wrap_model_call.<locals>.count_tokensö   ó/   ø€ Ø”}×AÒAØ¥ h¡¤Ñ/°´ñô ð r%   ©r   r‹   ©r   r‰   r   r.   ©r   rz   Úsystem_messager   r€   rx   r$   Úoverride©r"   r‚   r„   r   Úedited_messagesÚeditr“   s    `    @r#   Úwrap_model_callz(ContextEditingMiddleware.wrap_model_callÜ   sí   øø€ ð Ôð 	$Ø�7˜7Ñ#Ô#Ð#àÔ" mÒ3Ð3ð<ð <ð <ð <ð <ð 6=Ô5KÐS˜'Ô0Ð1Ð1ÐQSˆJðð ð ð ð ð ð õ
 #¥4¨Ô(8Ñ#9Ô#9Ñ:Ô:ˆØ”Jð 	Cð 	CˆDØ�JŠJ�°\ˆJÑBÔBÐBÐBàˆw�w×'Ò'°Ð'ÑAÔAÑBÔBÐBr%   úGCallable[[ModelRequest[ContextT]], Awaitable[ModelResponse[ResponseT]]]c              ƒ  óX  ‡‡K  — ‰j         s |‰¦  «        ƒ d{V —†S | j        dk    rdd„}n‰j        r‰j        gng Šdˆˆfd„}t          t	          ‰j         ¦  «        ¦  «        }| j        D ]}|                     ||¬	¦  «         Œ |‰                     |¬
¦  «        ¦  «        ƒ d{V —†S )rˆ   Nr{   r   r‰   r   r.   c                ó    — t          | ¦  «        S rB   r   r‹   s    r#   r   z?ContextEditingMiddleware.awrap_model_call.<locals>.count_tokens  rŒ   r%   c                ód   •— ‰j                              ‰t          | ¦  «        z   ‰j        ¦  «        S rB   rŽ   r’   s    €€r#   r   z?ContextEditingMiddleware.awrap_model_call.<locals>.count_tokens  r”   r%   r•   r‹   r–   r—   rš   s    `    @r#   Úawrap_model_callz)ContextEditingMiddleware.awrap_model_call  s  øøè è € ð Ôð 	*Ø ˜ Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)àÔ" mÒ3Ð3ð<ð <ð <ð <ð <ð 6=Ô5KÐS˜'Ô0Ð1Ð1ÐQSˆJðð ð ð ð ð ð õ
 #¥4¨Ô(8Ñ#9Ô#9Ñ:Ô:ˆØ”Jð 	Cð 	CˆDØ�JŠJ�°\ˆJÑBÔBÐBÐBà�W˜W×-Ò-°Ð-ÑGÔGÑHÔHÐHÐHÐHÐHÐHÐHÐHr%   )rx   r|   rz   ry   r   r   )r‚   rƒ   r„   r…   r   r†   )r‚   rƒ   r„   rž   r   r†   )	r'   r(   r)   r*   rs   r   r�   r¢   Ú__classcell__)r�   s   @r#   rw   rw   »   sª   ø€ € € € € € ðð ð ÐÐÑØ7Ð7Ð7Ñ7ð
 /3Ø>Kð	5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð(#Cð #Cð #Cð #CðJ#Ið #Ið #Ið #Ið #Ið #Ið #Ið #Ir%   rw   N)%r*   Ú
__future__r   Úcollections.abcr   r   r   r   Úcopyr   Údataclassesr	   Útypingr
   Úlangchain_core.messagesr   r   r   r   Úlangchain_core.messages.utilsr   Útyping_extensionsr   Ú!langchain.agents.middleware.typesr   r   r   r   r   r   rt   r.   r   r   r-   rw   Ú__all__r!   r%   r#   ú<module>r®      s.  ððð ð #Ð "Ð "Ð "Ð "Ð "à CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð EÐ DÐ DÐ DÐ DÐ DØ &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 'Ð ð ØˆkÔÐØð	ô€ð
ð 
ð 
ð 
ð 
�(ñ 
ô 
ð 
ð €�ÐÑÔð~
ð ~
ð ~
ð ~
ð ~
˜ñ ~
ô ~
ñ Ôð~
ðBiIð iIð iIð iIð iI˜¨z¸)Ô/DÀhÐPYÐ/YÔZñ iIô iIð iIðZ Øð€€€r%   