
    j
i'<                       d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZmZ erdd
lmZ e	d         ZdZ G d de          Z G d deee         ef                   Z ddgZ!dS )z>Agent middleware that integrates OpenAI's moderation endpoint.    )annotationsN)Sequence)TYPE_CHECKINGAnyLiteralcast)AgentMiddleware
AgentStatehook_config)	AIMessageBaseMessageHumanMessageToolMessage)AsyncOpenAIOpenAI)
ModerationModerationModel)Runtime)inputoutputtoolzQI'm sorry, but I can't comply with that request. It was flagged for {categories}.c                  $     e Zd ZdZd fdZ xZS )OpenAIModerationErrorzKRaised when OpenAI flags content and `exit_behavior` is set to ``"error"``.contentstrstageViolationStageresultr   messagereturnNonec               t    t                                          |           || _        || _        || _        dS )a  Initialize the error with violation details.

        Args:
            content: The content that was flagged.
            stage: The stage where the violation occurred.
            result: The moderation result from OpenAI.
            message: The error message.
        N)super__init__r   r   r   )selfr   r   r   r   	__class__s        C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_openai/middleware/openai_moderation.pyr$   zOpenAIModerationError.__init__   s6      	!!!
    )
r   r   r   r   r   r   r   r   r    r!   )__name__
__module____qualname____doc__r$   __classcell__r&   s   @r'   r   r      sC        UU         r(   r   c            	      p    e Zd ZdZddddddddddD fdZ edg          dEd            Z edg          dEd             Z edg          dEd!            Z edg          dEd"            Z	dFd%Z
dFd&ZdFd'ZdFd(ZdFd)ZdFd*ZdFd+ZdFd,ZdGd5ZdHd7ZdHd8ZdId:ZdJd<ZdKd=ZdLd@ZdMdCZ xZS )NOpenAIModerationMiddlewarez:Moderate agent traffic using OpenAI's moderation endpoint.zomni-moderation-latestTFendN)modelcheck_inputcheck_outputcheck_tool_resultsexit_behaviorviolation_messageclientasync_clientr2   r   r3   boolr4   r5   r6   "Literal['error', 'end', 'replace']r7   
str | Noner8   OpenAI | Noner9   AsyncOpenAI | Noner    r!   c                   t                                                       || _        || _        || _        || _        || _        || _        || _        || _	        dS )a  Create the middleware instance.

        Args:
            model: OpenAI moderation model to use.
            check_input: Whether to check user input messages.
            check_output: Whether to check model output messages.
            check_tool_results: Whether to check tool result messages.
            exit_behavior: How to handle violations
                (`'error'`, `'end'`, or `'replace'`).
            violation_message: Custom template for violation messages.
            client: Optional pre-configured OpenAI client to reuse.
                If not provided, a new client will be created.
            async_client: Optional pre-configured AsyncOpenAI client to reuse.
                If not provided, a new async client will be created.
        N)
r#   r$   r2   r3   r4   r5   r6   r7   _client_async_client)
r%   r2   r3   r4   r5   r6   r7   r8   r9   r&   s
            r'   r$   z#OpenAIModerationMiddleware.__init__4   s_    6 	
&("4*!2)r(   )can_jump_tostateAgentState[Any]runtimeRuntime[Any]dict[str, Any] | Nonec                    | j         s	| j        sdS t          |                    dg                     }|sdS |                     |          S )a  Moderate user input and tool results before the model is called.

        Args:
            state: Current agent state containing messages.
            runtime: Agent runtime context.

        Returns:
            Updated state with moderated messages, or `None` if no changes.
        Nmessages)r3   r5   listget_moderate_inputsr%   rC   rE   rI   s       r'   before_modelz'OpenAIModerationMiddleware.before_modelZ   sZ      	(? 	4		*b1122 	4$$X...r(   c                    | j         sdS t          |                    dg                     }|sdS |                     |          S )a  Moderate model output after the model is called.

        Args:
            state: Current agent state containing messages.
            runtime: Agent runtime context.

        Returns:
            Updated state with moderated messages, or `None` if no changes.
        NrI   )r4   rJ   rK   _moderate_outputrM   s       r'   after_modelz&OpenAIModerationMiddleware.after_modelp   sP       	4		*b1122 	4$$X...r(   c                   K   | j         s	| j        sdS t          |                    dg                     }|sdS |                     |           d{V S )zAsync version of before_model.

        Args:
            state: Current agent state containing messages.
            runtime: Agent runtime context.

        Returns:
            Updated state with moderated messages, or `None` if no changes.
        NrI   )r3   r5   rJ   rK   _amoderate_inputsrM   s       r'   abefore_modelz(OpenAIModerationMiddleware.abefore_model   sp        	(? 	4		*b1122 	4++H555555555r(   c                   K   | j         sdS t          |                    dg                     }|sdS |                     |           d{V S )zAsync version of after_model.

        Args:
            state: Current agent state containing messages.
            runtime: Agent runtime context.

        Returns:
            Updated state with moderated messages, or `None` if no changes.
        NrI   )r4   rJ   rK   _amoderate_outputrM   s       r'   aafter_modelz'OpenAIModerationMiddleware.aafter_model   sf         	4		*b1122 	4++H555555555r(   rI   Sequence[BaseMessage]c                $   t          |          }d}| j        r5|                     |          }|rd|v r|S t          d|d                   }d}| j        r5|                     |          }|rd|v r|S t          d|d                   }d}|rd|iS d S NFjump_tolist[BaseMessage]rI   T)rJ   r5   _moderate_tool_messagesr   r3   _moderate_user_messager%   rI   workingmodifiedactions        r'   rL   z+OpenAIModerationMiddleware._moderate_inputs   s     x.." 	 11'::F  &&!M2F:4FGG 	 0099F  &&!M2F:4FGG 	)((tr(   c                @  K   t          |          }d}| j        r;|                     |           d {V }|rd|v r|S t          d|d                   }d}| j        r;|                     |           d {V }|rd|v r|S t          d|d                   }d}|rd|iS d S rZ   )rJ   r5   _amoderate_tool_messagesr   r3   _amoderate_user_messager_   s        r'   rS   z,OpenAIModerationMiddleware._amoderate_inputs   s       x.." 	 88AAAAAAAAF  &&!M2F:4FGG 	 77@@@@@@@@F  &&!M2F:4FGG 	)((tr(   c                    |                      |t                    }|d S ||         }|                     |          }|sd S |                     |          }|j        sd S |                     ||d||          S Nr   indexr   r   r   )_find_last_indexr   _extract_text	_moderateflagged_apply_violationr%   rI   last_ai_idx
ai_messagetextr   s         r'   rP   z+OpenAIModerationMiddleware._moderate_output   s     ++Hi@@4k*
!!*-- 	4%%~ 	4$$Kxf % 
 
 	
r(   c                  K   |                      |t                    }|d S ||         }|                     |          }|sd S |                     |           d {V }|j        sd S |                     ||d||          S rg   )rj   r   rk   
_amoderaterm   rn   ro   s         r'   rV   z,OpenAIModerationMiddleware._amoderate_output   s       ++Hi@@4k*
!!*-- 	4t,,,,,,,,~ 	4$$Kxf % 
 
 	
r(   c                   |                      |t                    }|d S t          |          }d}t          |dz   t	          |                    D ]}||         }t          |t                    s |                     |          }|s8|                     |          }|j	        sU| 
                    ||d||          }	|	r d|	v r|	c S t          d|	d                   }d}|rd|iS d S 	NF   r   rh   r[   r\   rI   T)rj   r   rJ   rangelen
isinstancer   rk   rl   rm   rn   r   
r%   rI   rp   r`   ra   idxmsgrr   r   rb   s
             r'   r]   z2OpenAIModerationMiddleware._moderate_tool_messages  s'    ++Hi@@4x..q#g,,77 	  	 C#,Cc;// %%c**D ^^D))F> **s&$v +  F   &&!MMM2F:4FGG 	)((tr(   c                  K   |                      |t                    }|d S t          |          }d}t          |dz   t	          |                    D ]}||         }t          |t                    s |                     |          }|s8|                     |           d {V }|j	        s[| 
                    ||d||          }	|	r d|	v r|	c S t          d|	d                   }d}|rd|iS d S rv   )rj   r   rJ   rx   ry   rz   r   rk   rt   rm   rn   r   r{   s
             r'   rd   z3OpenAIModerationMiddleware._amoderate_tool_messages5  s=      ++Hi@@4x..q#g,,77 	  	 C#,Cc;// %%c**D ??400000000F> **s&$v +  F   &&!MMM2F:4FGG 	)((tr(   c                    |                      |t                    }|d S ||         }|                     |          }|sd S |                     |          }|j        sd S |                     ||d||          S Nr   rh   )rj   r   rk   rl   rm   rn   r%   rI   r|   r   rr   r   s         r'   r^   z1OpenAIModerationMiddleware._moderate_user_messageZ  s     ##Hl;;;43-!!'** 	4%%~ 	4$$CwV % 
 
 	
r(   c                  K   |                      |t                    }|d S ||         }|                     |          }|sd S |                     |           d {V }|j        sd S |                     ||d||          S r   )rj   r   rk   rt   rm   rn   r   s         r'   re   z2OpenAIModerationMiddleware._amoderate_user_messagen  s       ##Hl;;;43-!!'** 	4t,,,,,,,,~ 	4$$CwV % 
 
 	
r(   ri   
int | Noner   r   r   r   r   r   c               B   |                      ||          }| j        dk    rt          ||||          | j        dk    rdt          |          gdS |d S t	          |          }||         }t          t          |                    d|i                    ||<   d|iS )	Nerror)r   r   r   r   r1   )r   )r[   rI   r   )updaterI   )_format_violation_messager6   r   r   rJ   r   r   
model_copy)	r%   rI   ri   r   r   r   violation_textnew_messagesoriginals	            r'   rn   z+OpenAIModerationMiddleware._apply_violation  s     77HH(('&	    &&$9^3T3T3T2UVVV=4H~~&",,Y4O,PP
 
U L))r(   rr   c                    | j         |                                 | _         | j         j                            | j        |          }|j        d         S N)r2   r   r   )r@   _build_clientmoderationscreater2   resultsr%   rr   responses      r'   rl   z$OpenAIModerationMiddleware._moderate  sJ    <--//DL<+2242PP""r(   c                   K   | j         |                                 | _         | j         j                            | j        |           d {V }|j        d         S r   )rA   _build_async_clientr   r   r2   r   r   s      r'   rt   z%OpenAIModerationMiddleware._amoderate  sx      %!%!9!9!;!;D+7>>*D ? 
 
 
 
 
 
 
 
 ""r(   r   c                6    t                      | _        | j        S N)r   r@   r%   s    r'   r   z(OpenAIModerationMiddleware._build_client  s    xx|r(   r   c                6    t                      | _        | j        S r   )r   rA   r   s    r'   r   z.OpenAIModerationMiddleware._build_async_client  s    (]]!!r(   c                t   |j                                         }d |                                D             }|rd                    |          nd}| j        pt
          }t          j        |j                                        d          }	 |	                    |||          }n# t          $ r |}Y nw xY w|S )Nc                D    g | ]\  }}||                     d d          S )_ )replace).0namerm   s      r'   
<listcomp>zHOpenAIModerationMiddleware._format_violation_message.<locals>.<listcomp>  s@     
 
 
g
LLc""
 
 
r(   z, zOpenAI's safety policiesT)	sort_keys)
categoriescategory_scoresoriginal_content)r   
model_dumpitemsjoinr7   DEFAULT_VIOLATION_TEMPLATEjsondumpsr   formatKeyError)	r%   r   r   categories_dictr   category_labeltemplatescores_jsonr   s	            r'   r   z4OpenAIModerationMiddleware._format_violation_message  s     +6688
 
!0!6!6!8!8
 
 

 &0ODIIj!!!5O 	 )G-Gj!7!B!B!D!DPTUUU	oo) +!( &  GG
  	 	 	GGG	s   B& &B54B5message_typetype[BaseMessage]c                    t          t          |          dz
  dd          D ]}t          ||         |          r|c S d S )Nrw   )rx   ry   rz   )r%   rI   r   r|   s       r'   rj   z+OpenAIModerationMiddleware._find_last_index  sS     X*B33 	 	C(3-66 


tr(   r   r   c                    |j         d S t          |dd           }|t          |j                   S t          |          }|r|nd S )Nrr   )r   getattrr   )r%   r   text_accessorrr   s       r'   rk   z(OpenAIModerationMiddleware._extract_text  sR    ?"466 w'''=!!%tt%r(   )r2   r   r3   r:   r4   r:   r5   r:   r6   r;   r7   r<   r8   r=   r9   r>   r    r!   )rC   rD   rE   rF   r    rG   )rI   rX   r    rG   )rI   rX   ri   r   r   r   r   r   r   r   r    rG   )rr   r   r    r   )r    r   )r    r   )r   r   r   r   r    r   )rI   rX   r   r   r    r   )r   r   r    r<   )r)   r*   r+   r,   r$   r   rN   rQ   rT   rW   rL   rS   rP   rV   r]   rd   r^   re   rn   rl   rt   r   r   r   rj   rk   r-   r.   s   @r'   r0   r0   1   sk       DD
 ": !#(<A(, $+/$* $* $* $* $* $* $* $*L [eW%%%/ / / &%/* [eW%%%/ / / &%/* [eW%%%6 6 6 &%6* [eW%%%6 6 6 &%6*   6   6
 
 
 
(
 
 
 
(# # # #J# # # #J
 
 
 
(
 
 
 
(* * * *@# # # ## # # #   " " " "   .   & & & & & & & &r(   r0   )"r,   
__future__r   r   collections.abcr   typingr   r   r   r   !langchain.agents.middleware.typesr	   r
   r   langchain_core.messagesr   r   r   r   openair   r   openai.typesr   r   langgraph.runtimer   r   r   RuntimeErrorr   r0   __all__ r(   r'   <module>r      s|   D D " " " " " "  $ $ $ $ $ $ 4 4 4 4 4 4 4 4 4 4 4 4 V V V V V V V V V V U U U U U U U U U U U U & & & & & & & & 4 4 4 4 4 4 4 4 *))))))23 X 
    L   2m& m& m& m& m&C#1E!F m& m& m&b  r(   