ó
    ýÞ j%<  ã                  óø   • S r SSKJr  SSKrSSKJr  SSKJrJrJ	r	J
r
  SSKJrJrJr  SSKJrJrJrJr  SSKJrJr  SS	KJrJr  \(       a  SS
KJr  \	S   rSr " S S\5      r " S S\\\   \4   5      r SS/r!g)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                  óD   ^ • \ rS rSrSr          SU 4S jjrSrU =r$ )ÚOpenAIModerationErroré   zIRaised when OpenAI flags content and `exit_behavior` is set to `"error"`.c               óH   >• [         TU ]  U5        Xl        X l        X0l        g)zá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__ÚcontentÚstageÚresult)Úselfr   r   r    ÚmessageÚ	__class__s        €Úg/var/www/html/gaurav/venv/lib/python3.13/site-packages/langchain_openai/middleware/openai_moderation.pyr   ÚOpenAIModerationError.__init__   s!   ø€ ô  	‰Ñ˜Ô!ØŒØŒ
Ø�ó    )r   r    r   )
r   Ústrr   ÚViolationStager    r   r"   r'   ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classcell__©r#   s   @r$   r   r      sB   ø† ÙSðð ðð ð	ð
 ðð ðð 
÷õ r&   r   c            	      ó  ^ • \ rS rSrSrSSSSSSSSS.                 S U 4S	 jjjr\" S/S
9      S!S j5       r\" S/S
9      S!S j5       r\" S/S
9      S!S j5       r	\" S/S
9      S!S j5       r
    S"S jr    S"S jr    S"S jr    S"S jr    S"S jr    S"S jr    S"S jr    S"S jr            S#S jrS$S jrS$S jrS%S jrS&S jrS'S jr      S(S jrS)S jrSrU =r$ )*ÚOpenAIModerationMiddlewareé1   z: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_clientc               ó‚   >• [         T	U ]  5         Xl        X l        X0l        X@l        XPl        X`l        Xpl        X€l	        g)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   r7   r8   r9   r:   r;   r<   Ú_clientÚ_async_client)
r!   r7   r8   r9   r:   r;   r<   r=   r>   r#   s
            €r$   r   Ú#OpenAIModerationMiddleware.__init__4   s>   ø€ ô6 	‰ÑÔØŒ
Ø&ÔØ(ÔØ"4ÔØ*ÔØ!2ÔàŒØ)Õr&   )Úcan_jump_toc                ó°   • U R                   (       d  U R                  (       d  g[        UR                  S/ 5      5      nU(       d  gU R	                  U5      $ )zî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)r8   r:   ÚlistÚgetÚ_moderate_inputs©r!   ÚstateÚruntimerE   s       r$   Úbefore_modelÚ'OpenAIModerationMiddleware.before_modelZ   sD   € ð ××¨×(?×(?Øä˜Ÿ	™	 *¨bÓ1Ó2ˆÞØà×$Ñ$ XÓ.Ð.r&   c                óŽ   • U R                   (       d  g[        UR                  S/ 5      5      nU(       d  gU R                  U5      $ )zÞ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.
NrE   )r9   rF   rG   Ú_moderate_outputrI   s       r$   Úafter_modelÚ&OpenAIModerationMiddleware.after_modelp   s<   € ð × × Øä˜Ÿ	™	 *¨bÓ1Ó2ˆÞØà×$Ñ$ XÓ.Ð.r&   c              ƒ  óÌ   #   • U R                   (       d  U R                  (       d  g[        UR                  S/ 5      5      nU(       d  gU R	                  U5      I Sh  v•N $  N7f)zÌAsync 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.
NrE   )r8   r:   rF   rG   Ú_amoderate_inputsrI   s       r$   Úabefore_modelÚ(OpenAIModerationMiddleware.abefore_model†   sM   é € ð ××¨×(?×(?Øä˜Ÿ	™	 *¨bÓ1Ó2ˆÞØà×+Ñ+¨HÓ5×5Ð5Ñ5ùs   ‚AA$ÁA"ÁA$c              ƒ  óª   #   • U R                   (       d  g[        UR                  S/ 5      5      nU(       d  gU R                  U5      I Sh  v•N $  N7f)zËAsync 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.
NrE   )r9   rF   rG   Ú_amoderate_outputrI   s       r$   Úaafter_modelÚ'OpenAIModerationMiddleware.aafter_modelœ   sE   é € ð × × Øä˜Ÿ	™	 *¨bÓ1Ó2ˆÞØà×+Ñ+¨HÓ5×5Ð5Ñ5ùs   ‚A
AÁAÁAc                ó<  • [        U5      nSnU R                  (       a1  U R                  U5      nU(       a  SU;   a  U$ [        SUS   5      nSnU R                  (       a1  U R                  U5      nU(       a  SU;   a  U$ [        SUS   5      nSnU(       a  SU0$ g ©NFÚjump_toúlist[BaseMessage]rE   T)rF   r:   Ú_moderate_tool_messagesr   r8   Ú_moderate_user_message©r!   rE   ÚworkingÚmodifiedÚactions        r$   rH   Ú+OpenAIModerationMiddleware._moderate_inputs²   s£   € ô �x“.ˆØˆà×"×"Ø×1Ñ1°'Ó:ˆFÞØ Ó&Ø!�MÜÐ2°F¸:Ñ4FÓG�Ø�à××Ø×0Ñ0°Ó9ˆFÞØ Ó&Ø!�MÜÐ2°F¸:Ñ4FÓG�Ø�æØ Ð(Ð(àr&   c              ƒ  ól  #   • [        U5      nSnU R                  (       a9  U R                  U5      I S h  v•N nU(       a  SU;   a  U$ [        SUS   5      nSnU R                  (       a9  U R                  U5      I S h  v•N nU(       a  SU;   a  U$ [        SUS   5      nSnU(       a  SU0$ g  Nz N27fr[   )rF   r:   Ú_amoderate_tool_messagesr   r8   Ú_amoderate_user_messager`   s        r$   rS   Ú,OpenAIModerationMiddleware._amoderate_inputsÍ   s¸   é € ô �x“.ˆØˆà×"×"Ø×8Ñ8¸ÓA×AˆFÞØ Ó&Ø!�MÜÐ2°F¸:Ñ4FÓG�Ø�à××Ø×7Ñ7¸Ó@×@ˆFÞØ Ó&Ø!�MÜÐ2°F¸:Ñ4FÓG�Ø�æØ Ð(Ð(àñ% Bñ Aùs"   ‚3B4µB0¶A	B4Á?B2Â 1B4Â2B4c                óØ   • U R                  U[        5      nUc  g X   nU R                  U5      nU(       d  g U R                  U5      nUR                  (       d  g U R                  XSXES9$ ©Nr   ©Úindexr   r   r    )Ú_find_last_indexr   Ú_extract_textÚ	_moderateÚflaggedÚ_apply_violation©r!   rE   Úlast_ai_idxÚ
ai_messageÚtextr    s         r$   rO   Ú+OpenAIModerationMiddleware._moderate_outputè   st   € ð ×+Ñ+¨H´iÓ@ˆØÑØàÑ*ˆ
Ø×!Ñ! *Ó-ˆÞØà—‘ Ó%ˆØ�~�~Øà×$Ñ$Ø¨xÀð %ð 
ð 	
r&   c              ƒ  óô   #   • U R                  U[        5      nUc  g X   nU R                  U5      nU(       d  g U R                  U5      I S h  v•N nUR                  (       d  g U R                  XSXES9$  N'7frj   )rm   r   rn   Ú
_amoderaterp   rq   rr   s         r$   rW   Ú,OpenAIModerationMiddleware._amoderate_outputü   s   é € ð ×+Ñ+¨H´iÓ@ˆØÑØàÑ*ˆ
Ø×!Ñ! *Ó-ˆÞØà—‘ tÓ,×,ˆØ�~�~Øà×$Ñ$Ø¨xÀð %ð 
ð 	
ñ	 -ùó   ‚AA8ÁA6Á(A8c           	     óÂ  • U R                  U[        5      nUc  g [        U5      nSn[        US-   [	        U5      5       H‘  nX5   n[        U[        5      (       d  M  U R                  U5      nU(       d  M8  U R                  U5      nUR                  (       d  M\  U R                  X5SXxS9n	U	(       d  Mv  SU	;   a  U	s  $ [        SU	S   5      nSnM“     U(       a  SU0$ g ©	NFé   r   rk   r\   r]   rE   T)rm   r   rF   ÚrangeÚlenÚ
isinstancer   rn   ro   rp   rq   r   ©
r!   rE   rs   ra   rb   ÚidxÚmsgru   r    rc   s
             r$   r^   Ú2OpenAIModerationMiddleware._moderate_tool_messages  så   € ð ×+Ñ+¨H´iÓ@ˆØÑØä�x“.ˆØˆä˜ q™¬#¨g«,Ö7ˆCØ‘,ˆCÜ˜c¤;×/Ñ/Ùà×%Ñ% cÓ*ˆDÞÙà—^‘^ DÓ)ˆFØ—>—>Ùà×*Ñ*Ø¨&¸$ð +ð ˆF÷ ˆvØ Ó&Ø!’MÜÐ2°F¸:Ñ4FÓG�Ø’ñ) 8ö, Ø Ð(Ð(àr&   c           	   ƒ  óÞ  #   • U R                  U[        5      nUc  g [        U5      nSn[        US-   [	        U5      5       H™  nX5   n[        U[        5      (       d  M  U R                  U5      nU(       d  M8  U R                  U5      I S h  v•N nUR                  (       d  Md  U R                  X5SXxS9n	U	(       d  M~  SU	;   a  U	s  $ [        SU	S   5      nSnM›     U(       a  SU0$ g  N\7fr|   )rm   r   rF   r~   r   r€   r   rn   rx   rp   rq   r   r�   s
             r$   rf   Ú3OpenAIModerationMiddleware._amoderate_tool_messages5  sð   é € ð ×+Ñ+¨H´iÓ@ˆØÑØä�x“.ˆØˆä˜ q™¬#¨g«,Ö7ˆCØ‘,ˆCÜ˜c¤;×/Ñ/Ùà×%Ñ% cÓ*ˆDÞÙàŸ?™?¨4Ó0×0ˆFØ—>—>Ùà×*Ñ*Ø¨&¸$ð +ð ˆF÷ ˆvØ Ó&Ø!’MÜÐ2°F¸:Ñ4FÓG�Ø’ñ) 8ö, Ø Ð(Ð(àñ! 1ùs   ‚BC-ÂC+Â-C-Ã ,C-c                óØ   • U R                  U[        5      nUc  g X   nU R                  U5      nU(       d  g U R                  U5      nUR                  (       d  g U R                  XSXES9$ ©Nr   rk   )rm   r   rn   ro   rp   rq   ©r!   rE   r‚   r"   ru   r    s         r$   r_   Ú1OpenAIModerationMiddleware._moderate_user_messageZ  sr   € ð ×#Ñ# H¬lÓ;ˆØ‰;Øà‘-ˆØ×!Ñ! 'Ó*ˆÞØà—‘ Ó%ˆØ�~�~Øà×$Ñ$Ø w¸ð %ð 
ð 	
r&   c              ƒ  óô   #   • U R                  U[        5      nUc  g X   nU R                  U5      nU(       d  g U R                  U5      I S h  v•N nUR                  (       d  g U R                  XSXES9$  N'7frˆ   )rm   r   rn   rx   rp   rq   r‰   s         r$   rg   Ú2OpenAIModerationMiddleware._amoderate_user_messagen  s}   é € ð ×#Ñ# H¬lÓ;ˆØ‰;Øà‘-ˆØ×!Ñ! 'Ó*ˆÞØà—‘ tÓ,×,ˆØ�~�~Øà×$Ñ$Ø w¸ð %ð 
ð 	
ñ	 -ùrz   c               ó  • U R                  XE5      nU R                  S:X  a  [        UUUUS9eU R                  S:X  a  S[        US9/S.$ Uc  g [	        U5      nXr   n[        [        UR                  SU0S95      Xr'   SU0$ )	NÚerror)r   r   r    r"   r6   )r   )r\   rE   r   )ÚupdaterE   )Ú_format_violation_messager;   r   r   rF   r   r   Ú
model_copy)	r!   rE   rl   r   r   r    Úviolation_textÚnew_messagesÚoriginals	            r$   rq   Ú+OpenAIModerationMiddleware._apply_violation‚  s©   € ð ×7Ñ7¸ÓHˆà×Ñ Ó(Ü'ØØØØ&ñ	ð ð ×Ñ Ó&Ø$´9À^Ñ3TÐ2UÑVÐVà‰=Øä˜H“~ˆØÑ&ˆÜ"Ü˜×,Ñ,°YÀÐ4OÐ,ÐPó
ˆÑð ˜LÐ)Ð)r&   c                óÀ   • U R                   c  U R                  5       U l         U R                   R                  R                  U R                  US9nUR
                  S   $ ©N)r7   r   r   )r@   Ú_build_clientÚmoderationsÚcreater7   Úresults©r!   ru   Úresponses      r$   ro   Ú$OpenAIModerationMiddleware._moderate¢  sP   € Ø�<‰<ÑØ×-Ñ-Ó/ˆDŒLØ—<‘<×+Ñ+×2Ñ2¸¿¹È4Ð2ÐPˆØ×Ñ Ñ"Ð"r&   c              ƒ  óÜ   #   • U R                   c  U R                  5       U l         U R                   R                  R                  U R                  US9I S h  v•N nUR
                  S   $  N7fr—   )rA   Ú_build_async_clientr™   rš   r7   r›   rœ   s      r$   rx   Ú%OpenAIModerationMiddleware._amoderate¨  si   é € Ø×ÑÑ%Ø!%×!9Ñ!9Ó!;ˆDÔØ×+Ñ+×7Ñ7×>Ñ>Ø—*‘* Dð ?ð 
÷ 
ˆð ×Ñ Ñ"Ð"ñ
ùs   ‚AA,ÁA*ÁA,c                ó8   • [        5       U l        U R                  $ ©N)r   r@   ©r!   s    r$   r˜   Ú(OpenAIModerationMiddleware._build_client°  s   € Ü“xˆŒØ�|‰|Ðr&   c                ó8   • [        5       U l        U R                  $ r£   )r   rA   r¤   s    r$   r    Ú.OpenAIModerationMiddleware._build_async_client´  s   € Ü(›]ˆÔØ×!Ñ!Ð!r&   c                óÈ  • UR                   R                  5       nUR                  5        VVs/ sH   u  pEU(       d  M  UR                  SS5      PM"     nnnU(       a  SR	                  U5      OSnU R
                  =(       d    [        n[        R                  " UR                  R                  5       SS9n	 UR                  UU	US9n
U
$ s  snnf ! [         a    Un
 U
$ f = f)NÚ_Ú z, zOpenAI's safety policiesT)Ú	sort_keys)Ú
categoriesÚcategory_scoresÚoriginal_content)r¬   Ú
model_dumpÚitemsÚreplaceÚjoinr<   ÚDEFAULT_VIOLATION_TEMPLATEÚjsonÚdumpsr­   ÚformatÚKeyError)r!   r   r    Úcategories_dictÚnamerp   r¬   Úcategory_labelÚtemplateÚscores_jsonr"   s              r$   r�   Ú4OpenAIModerationMiddleware._format_violation_message¸  sæ   € à ×+Ñ+×6Ñ6Ó8ˆð "1×!6Ñ!6Ô!8ô
á!8‘�Üó #ˆD�L‰L˜˜cÖ"Ù!8ð 	ñ 
ö &0ˆD�I‰I�jÔ!Ð5Oð 	ð ×)Ñ)×GÔ-GˆÜ—j’j ×!7Ñ!7×!BÑ!BÓ!DÐPTÑUˆð	Ø—o‘oØ)Ø +Ø!(ð &ð ˆGð ˆùó%
øô  ó 	Ø‰GØˆð	ús   ®C¾CÂ8C ÃC!Ã C!c                ór   • [        [        U5      S-
  SS5       H  n[        X   U5      (       d  M  Us  $    g )Nr}   éÿÿÿÿ)r~   r   r€   )r!   rE   Úmessage_typer‚   s       r$   rm   Ú+OpenAIModerationMiddleware._find_last_indexÏ  s9   € ô œ˜X›¨Ñ*¨B°Ö3ˆCÜ˜(™-¨×6Ó6Ø’
ñ 4ð r&   c                ó”   • UR                   c  g [        USS 5      nUc  [        UR                   5      $ [        U5      nU(       a  U$ S $ )Nru   )r   Úgetattrr'   )r!   r"   Útext_accessorru   s       r$   rn   Ú(OpenAIModerationMiddleware._extract_text×  sI   € Ø�?‰?Ñ"ØÜ ¨°Ó6ˆØÑ Ü�w—‘Ó'Ð'Ü�=Ó!ˆÞˆtÐ% Ð%r&   )rA   r@   r8   r9   r:   r;   r7   r<   )r7   r   r8   Úboolr9   rÆ   r:   rÆ   r;   z"Literal['error', 'end', 'replace']r<   ú
str | Noner=   zOpenAI | Noner>   zAsyncOpenAI | Noner)   r*   )rJ   zAgentState[Any]rK   zRuntime[Any]r)   údict[str, Any] | None)rE   úSequence[BaseMessage]r)   rÈ   )rE   rÉ   rl   ú
int | Noner   r(   r   r'   r    r   r)   rÈ   )ru   r'   r)   r   )r)   r   )r)   r   )r   r'   r    r   r)   r'   )rE   rÉ   rÀ   ztype[BaseMessage]r)   rÊ   )r"   r   r)   rÇ   )r+   r,   r-   r.   r/   r   r   rL   rP   rT   rX   rH   rS   rO   rW   r^   rf   r_   rg   rq   ro   rx   r˜   r    r�   rm   rn   r0   r1   r2   s   @r$   r4   r4   1   s{  ø† ÙDð
 ":Ø Ø!Ø#(Ø<AØ(,Ø $Ø+/ñ$*ð ð$*ð ð	$*ð
 ð$*ð !ð$*ð :ð$*ð &ð$*ð ð$*ð )ð$*ð 
÷$*ð $*ñL ˜e˜WÑ%ð/Ø$ð/Ø/;ð/à	ó/ó &ð/ñ* ˜e˜WÑ%ð/Ø$ð/Ø/;ð/à	ó/ó &ð/ñ* ˜e˜WÑ%ð6Ø$ð6Ø/;ð6à	ó6ó &ð6ñ* ˜e˜WÑ%ð6Ø$ð6Ø/;ð6à	ó6ó &ð6ð*Ø-ðà	ôð6Ø-ðà	ôð6
Ø-ð
à	ô
ð(
Ø-ð
à	ô
ð(#Ø-ð#à	ô#ðJ#Ø-ð#à	ô#ðJ
Ø-ð
à	ô
ð(
Ø-ð
à	ô
ð(*à'ð*ð ð	*ð
 ð*ð ð*ð ð*ð 
ô*ô@#ô#ôô"ôð.Ø-ðØ=Nðà	ô÷&ò &r&   r4   )"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   r4   Ú__all__© r&   r$   Ú<module>rÖ      s}   ðÙ Då "ã Ý $ß 4Ó 4ç VÑ Vß UÓ Uß &ß 4æÝ)àÐ2Ñ3€ð Xð ô
˜Lô ô2m& °¸C±À#Ð1EÑ!Fô m&ðb Ø ð�r&   