o
    i&                     @   s  d dl Z d dlmZ d dl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
 d d	lmZ d d
lmZ d dlmZ d dlm  mZ d dlmZ eeZdZdefddZdd ZdefddZdefddZdededefddZdedefddZdedefdd Z d!e!e de!e	 fd"d#Z"defd$d%Z#defd&d'Z$defd(d)Z%defd*d+Z&defd,d-Z'defd.d/Z(dS )0    N)Any)Sequence)AIGuardAbortError)AIGuardClient)Function)Message)Options)ToolCall)unwrap)wrap)get_argument_value)zagents.Agentzagents.xml.base.XMLAgentzagents.agent.RunnableAgentz%agents.agent.RunnableMultiActionAgentz!agents.agent.LLMSingleActionAgentz7agents.openai_functions_agent.base.OpenAIFunctionsAgentzBagents.openai_functions_multi_agent.base.OpenAIMultiFunctionsAgentclientc                 C   sr   zdd l }W n ty   td Y d S w ddlm} tD ]}td|d |t|  td|d |t	|  qd S )Nr   zCFailed to import langchain.agents, tool calls won't be instrumented)partial	langchainz.planz.aplan)
langchain.agentsImportErrorloggererror	functoolsr   action_agents_classesr   _langchain_agent_plan_langchain_agent_aplan)r   r   r   class_ r   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/appsec/_ai_guard/_langchain.py_langchain_patch    s   
r   c                  C   sz   zdd l } W n ty   td Y d S w tD ]"}|dd\}}td| |gd}t||}t|d t|d qd S )	Nr   z"Failed to unpatch langchain.agents.   z
langchain.)fromlistplanaplan)	r   r   r   debugr   rsplit
__import__getattrr
   )r   r   module_path
class_namemoduleagent_classr   r   r   _langchain_unpatch.   s   


r)   c                 C   s   ||i |}t | |||S N_handle_agent_action_resultr   funcinstanceargskwargsactionr   r   r   r   =   s   r   c                    s$   ||i |I d H }t | |||S r*   r+   r-   r   r   r   r   B   s   r   value	attributereturnc                 C   s@   |  |d }|d u rd S zt|W S  ty   ||i Y S w r*   )getjsonloads	Exception)r3   r4   json_strr   r   r   _try_parse_jsonG   s   r;   c                 C   s0   | sdS zt | W S  ty   t|  Y S w )N )r7   dumpsr9   str)r3   r   r   r   _try_format_jsonQ   s   r?   msgc                 C   s6   t | jtr	| jS dd | jD }ddd |D S )Nc                 S   s8   g | ]}t |ts|d dkrt |dtr|qS )typetext)
isinstancer>   r6   .0blockr   r   r   
<listcomp>^   s    z%_get_message_text.<locals>.<listcomp>r<   c                 s   s&    | ]}t |tr|n|d  V  qdS )rB   N)rC   r>   rD   r   r   r   	<genexpr>c   s   $ z$_get_message_text.<locals>.<genexpr>)rC   contentr>   join)r@   blocksr   r   r   _get_message_textZ   s   rL   messagesc              	   C   s  ddl m} ddl m} ddl m} ddlm} ddlm} ddlm	} g }| D ]}zt
||r<|tdt|d	 nt
||rM|td
t|d	 nt
||r_|t|jt|d	 ntt
||rt|jdkr|dd |jD }	|td|	d d|jv r|jd }
tdt|
d|
ddd}|td|gd |jr|tdt|d	 n$t
||r|td|jt|d nt
||r|tddt|d W q( ty   tjddd Y q(w |S )Nr   )ChatMessageHumanMessage)SystemMessage)	AIMessage)FunctionMessage)ToolMessageuserrolerI   systemc                 S   s<   g | ]}t |d dt|ddt|di ddqS )idr<   namer0   rZ   	argumentsrY   function)r	   r6   r   r?   )rE   callr   r   r   rG   y   s    
z%_convert_messages.<locals>.<listcomp>	assistantrW   
tool_callsfunction_callr<   rZ   r\   r[   r]   toolrW   tool_call_idrI   zFailed to convert messageTexc_info)langchain_core.messagesrN   rP   rQ   langchain_core.messages.airR    langchain_core.messages.functionrS   langchain_core.messages.toolrT   rC   appendr   rL   rW   lenrb   additional_kwargsr	   r   r6   rI   rf   r9   r   r!   )rM   rN   rP   rQ   rR   rS   rT   resultmessagerb   rc   	tool_callr   r   r   _convert_messagesf   sT   



	



rs   c                 C   s  zddl m} ddl m} W n ty#   ddlm} ddlm} Y nw t|tr+|n|gD ]}t||r|jrzd|v rA|d ng }t|}d|v rO|d nd }	|	r\|	t
d|	d t||dd}
|
r|
D ];\}}t||rtt }t|t|jt|jd	d
}|	t
d|gd |rt|nd}|r|	t
d||d qg|	t
dtdt|jt|jd	d
gd | |tdd W q. ty     ty   tjddd Y q.w q.|S )Nr   )AgentAction)AgentActionMessageLogchat_historyinputrU   rV   intermediate_stepsr[   r]   r`   ra   r<   rd   re   TrF   zFailed to evaluate tool callrg   )langchain_core.agentsrt   ru   r   r   rC   r   rd   rs   rm   r   r   r>   uuiduuid4r	   r   r?   
tool_inputevaluater   r   r9   r   r!   )r   rp   r0   r1   rt   ru   r2   rv   rM   promptrx   intermediate_stepoutputrf   rr   tool_outputr   r   r   r,      sd   
r,   c                 C   s$   |D ]}t | |}|r|  S qd S r*   )_evaluate_langchain_messages)r   message_listsrM   rp   r   r   r   $_langchain_chatmodel_generate_before   s   
r   c                 C   s8   ddl m} |D ]}t| ||dg}|r|  S qd S )Nr   rO   rI   )ri   rP   r   )r   promptsrP   r   rp   r   r   r   _langchain_llm_generate_before   s   r   c                 C   s&   t ||dd}|| }t| |S )Nr   rw   )r   _convert_inputto_messagesr   )r   r/   r0   r1   	input_argrM   r   r   r   "_langchain_chatmodel_stream_before   s   
r   c                 C   s:   ddl m} t||dd}|| }t| ||dgS )Nr   rO   rw   r   )ri   rP   r   r   	to_stringr   )r   r/   r0   r1   rP   r   r   r   r   r   _langchain_llm_stream_before   s   r   c              
   C   s   ddl m} t|dkrFt|d |rFz| t|tdd W d S  ty5 } z|W  Y d }~S d }~w tyE   t	j
ddd Y d S w d S )Nr   rO   Try   z$Failed to evaluate chat model promptrg   )ri   rP   rn   rC   r~   rs   r   r   r9   r   r!   )r   rM   rP   er   r   r   r      s   r   ))r7   typingr   r   r{   ddtrace.appsec.ai_guardr   r   r   r   r   r	   $ddtrace.contrib.internal.trace_utilsr
   r   ddtrace.internal.loggerinternalr   ddloggerddtrace.internal.utilsr   
get_logger__name__r   r   r)   r   r   dictr>   r;   r?   rL   listrs   r,   r   r   r   r   r   r   r   r   r   <module>   s<    

	26
