
    +#h,                         d dl Z d dlZd dlmZ d dlZd dlZd Z G d de      Z G d de      Z	 G d d	      Z
 G d
 de
      Z G d de
      Zd Zd Zd Zd ZddZd ZeZefdZy)    N)Anyc                 J    dj                  | D cg c]  }| c}      S c c}w )z8Build an error message from a list of feedback messages.
)join)feedback_msgsmsgs     W/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/primitives/assertions.py_build_error_msgr
      s    99]3cc3443s   	 c                   D     e Zd ZdZ	 	 	 d
dedededededdf fd	Z xZS )DSPyAssertionErrorz3Custom exception raised when a DSPy `Assert` fails.Nidr   target_modulestate	is_metricreturnc                 j    t         |   |       || _        || _        || _        || _        || _        y Nsuper__init__r   r   r   r   r   selfr   r   r   r   r   	__class__s         r	   r   zDSPyAssertionError.__init__   6     	*
"    NNF	__name__
__module____qualname____doc__strr   boolr   __classcell__r   s   @r	   r   r      sU    = "## # 	#
 # # 
# #r   r   c                   D     e Zd ZdZ	 	 	 d
dedededededdf fd	Z xZS )DSPySuggestionErrorz4Custom exception raised when a DSPy `Suggest` fails.Nr   r   r   r   r   r   c                 j    t         |   |       || _        || _        || _        || _        || _        y r   r   r   s         r	   r   zDSPySuggestionError.__init__)   r   r   r   r   r%   s   @r	   r'   r'   &   sU    > "## # 	#
 # # 
# #r   r'   c                   (    e Zd Z	 	 	 ddededefdZy)
ConstraintNresultr   r   c                     t        t        j                               | _        || _        || _        || _        || _        | j                          y r   )	r"   uuiduuid4r   r+   r   r   r   __call__)r   r+   r   r   r   s        r	   r   zConstraint.__init__=   s<     djjl#*"r   ) NF)r   r   r    r#   r"   r    r   r	   r*   r*   <   s.      
 r   r*   c                       e Zd ZdZdefdZy)AssertzDSPy Assertionr   c                    t        | j                  t              r| j                  ryt        j                  j
                  r-t        j                  j                  d| j                          yt        j                  j                  d| j                          t        | j                  | j                  | j                  t        j                  j                  | j                        t        d      )NTzAssertionError: r   r   r   r   r   z.Assertion function should always return [bool])
isinstancer+   r#   dspysettingsbypass_assertloggererrorr   r   r   r   dsptracer   
ValueErrorr   s    r	   r/   zAssert.__call__P   s    dkk4({{,,!!$4TXXJ"?@!!$4TXXJ"?@(ww"&"4"4,,,,"nn  MNNr   N)r   r   r    r!   r#   r/   r1   r   r	   r3   r3   M   s    O$ Or   r3   c                       e Zd ZdZdefdZy)SuggestzDSPy Suggestionr   c                    t        | j                  t              r| j                  ryt        j                  j
                  r-t        j                  j                  d| j                          yt        j                  j                  d| j                          t        | j                  | j                  | j                  t        j                  j                  | j                        t        d      )NTzSuggestionFailed: r5   z/Suggestion function should always return [bool])r6   r+   r#   r7   r8   bypass_suggestr:   r;   r   r'   r   r   r<   r=   r   r>   r?   s    r	   r/   zSuggest.__call__g   s    dkk4({{--!!$6txxj"AB!!$6txxj"AB)ww"&"4"4,,,,"nn  NOOr   N)r   r   r    r!   r   r/   r1   r   r	   rA   rA   d   s    P# Pr   rA   c                       fd}|S )znHandler to bypass assertions and suggestions.

    Now both assertions and suggestions will become noops.
    c                      t         j                  j                  dd      5   | i |cd d d        S # 1 sw Y   y xY w)NT)r9   rC   r7   r8   contextargskwargsfuncs     r	   wrapperznoop_handler.<locals>.wrapper   s<    ]]""d"K 	)((	) 	) 	)   5>r1   rK   rL   s   ` r	   noop_handlerrO   ~   s    ) Nr   c                       fd}|S )zHandler to bypass suggest only.

    If a suggestion fails, it will be logged but not raised.
    And If an assertion fails, it will be raised.
    c                      t         j                  j                  dd      5   | i |cd d d        S # 1 sw Y   y xY w)NTF)rC   r9   rF   rH   s     r	   rL   z'bypass_suggest_handler.<locals>.wrapper   s<    ]]""$e"L 	)((	) 	) 	)rM   r1   rN   s   ` r	   bypass_suggest_handlerrR          ) Nr   c                       fd}|S )zHandler to bypass assertion only.

    If a assertion fails, it will be logged but not raised.
    And If an assertion fails, it will be raised.
    c                      t         j                  j                  d      5   | i |cd d d        S # 1 sw Y   y xY w)NTr9   rF   rH   s     r	   rL   z&bypass_assert_handler.<locals>.wrapper   s:    ]]"""6 	)((	) 	) 	)s   4=r1   rN   s   ` r	   bypass_assert_handlerrW      rS   r   c                       fd}|S )z4Handler to ignore assertion failure and return None.c                  4    	  | i |S # t         $ r Y y w xY wr   )r   rH   s     r	   rL   z)assert_no_except_handler.<locals>.wrapper   s*    	(((! 		s    	r1   rN   s   ` r	   assert_no_except_handlerrZ      s     Nr   c                       fd}|S )zHandler for backtracking suggestion and assertion.

    Re-run the latest predictor up to `max_backtracks` times,
    with updated signature if an assertion fails. updated signature adds a new
    input field to the signature, which is the feedback.
    c            	      f	   d\  }}t         j                  j                  5  d t         j                  _        dt         j                  _        dt         j                  _        i t         j                  _        d }t        dz         D ]  }|dkD  rpt         j                  j                  Vt        t         j                  j                  t         j                  j                           }|dt         j                  _	        |k(  rQt        |t              r|t        j                  j                  j                          r t              | i |nd } n4	 t        j                  j                  j                           | i |} n |cd d d        S # t         t        f$ r}|s|}|j"                  |j$                  |j&                  |j(                  d   f\  }	}}
}t        |t               r0|j*                  r$t         j                  xj                  dz  c_        n?t        |t              r/|j*                  r#t         j                  xj
                  dz  c_        t        j                  j                  r|
rt        t-        t        j                  j                        dz
  dd      D ]Y  }t        j                  j                  |   }|d   }|j.                  |
k(  s5|j(                  |   }|t         j                  _         n5 n3t        j                  j                  d   d   t         j                  _        t         j                  j                  t         j0                  j3                  d       |t         j                  j                  j5                  t         j                  j                  g       vrDt         j                  j                  t         j                  j                     j7                  |       |d   j.                  j8                  }i }|j;                         D ]  }t=        |d   |d       ||<    |d   }|d   j>                  d   }|jA                  d	d        |jA                  d
d        nt         j0                  j3                  d       Y d }~d }~ww xY w# 1 sw Y   y xY w)N)NNr      )feedbackpast_outputsz#Specified module not found in trace   _store_assert_feedback_assert_traceszJUNREACHABLE: No trace available, this should not happen. Is this run time?)!r7   r8   lockbacktrack_tosuggest_failuresassert_failurespredictor_feedbacksranger
   backtrack_to_argsr6   r   r<   r=   clearrR   r'   r   r   r   r   r   len	signaturer:   r;   
setdefaultappendoutput_fieldskeysgetattr__dict__pop)rI   rJ   	error_msgr+   current_errorifeedback_msgr_   eerror_iderror_target_moduleerror_statetrace_elementmodrq   
field_nameerror_iperror_oprC   rK   max_backtrackss                     r	   rL   z"backtrack_handler.<locals>.wrapper   s   &	6]] \	)-DMM&-.DMM*,-DMM) 13DMM- M>A-. Qq5T]]77C#399$--:T:TU$L
 %1(47DMM3 &!-1CD++LL&&,,.N\93D94J6JbfF=**002!%t!6v!6/Qf y\	 \	B 01CD 9,,-MDDEEOOGGBK	QM)-@+ &a)<=!++ MM::a?:'+=>1;; MM99Q>9<<--2).s3<<3E3E/F/JBPR)S !.A47LL4F4Fq4IM*7*:C'*}}8K'K67ggajEH(B(-!. >A\\=O=OPR=STU=V :#}}99A $ 1 12W X  )0Q0Q0\0\ $ : : "1   !% A A$--B\B\ ] d den o -8N,D,D,R,RM+-L.;.@.@.B "
;B$/N$.$(<"Z 8" (31~H'21~'>'>x'HH$LL);TB$LL)94@ !KK-- lo9C\	 \	s>   D3R'0FR'R$#D;RF:RR'R$$R''R0r1   )rK   rC   r   rL   s   ``` r	   backtrack_handlerr      s    ^@ Nr   c                       fd}|S )Nc                     t        j                  | j                  g|i |}d|v r#t        j                  j                  |d           | j                  fi } ||i |S )Nr9   rV   )inspectgetcallargs_forwardr7   r8   	configure)r   rI   rJ   args_to_valswrapped_forwardassertion_handlerhandler_argss        r	   forwardz&handle_assert_forward.<locals>.forward  sh    **4==J4J6J l*MM##,2O#P+DMMJ\J///r   r1   )r   r   r   s   `` r	   handle_assert_forwardr     s    0 Nr   c                 ,   t        | dd      st        d      t        | dd      r8t        j                  j	                  d| j
                  j                   d       	 | j                  | _        t        |fi |j                  |       | _        t        t        d | j                                     rnYt        t        d | j                                     r*| j                  t        j                  j                          nt#        d	      d
| _        | S )z2
    Transform a module to handle assertions.
    r   Fz=Module must have a forward method to have assertions handled.r   zModule z+ already has a _forward method. Skipping...c                 P    t        | d   t        j                  j                        S Nr]   r6   r7   retryRetryps    r	   <lambda>z)assert_transform_module.<locals>.<lambda>G  s    j1tzz'7'78 r   c                 R    t        | d   t        j                  j                         S r   r   r   s    r	   r   z)assert_transform_module.<locals>.<lambda>K  s    *QqT4::+;+;<< r   z7Module has mixed predictors, can't apply Retry mapping.T)rs   r>   r7   r:   infor   r   r   r   r   __get__allmapnamed_predictorsmap_named_predictorsr   r   RuntimeError_assert_transformed)moduler   r   s      r	   assert_transform_moduler   /  s     69e,K
 	
 vz5)f&&//00[\	
 	nnFO*+<MMUUFN 8&:Q:Q:ST 		<f>U>U>WX
 	##DJJ$4$45TUU!%FMr   )Tra   )r   r-   typingr   r<   r7   r
   AssertionErrorr   r'   r*   r3   rA   rO   rR   rW   rZ   r   r   default_assertion_handlerr   r1   r   r	   <module>r      s       
 
5# #&#. #, "OZ O.Pj P4
	hV . 
 0$r   