
    +#hj                     N    d dl Z d dlZd dlmZ ddlmZ ddlmZ  G d de      Zy)	    N)ensure_signature   )Module   )Predictc                   2     e Zd Zd fd	Zd Zd Zd Z xZS )ReActc                    t         |           t        |      x| _        }|| _        |xs t        j                  |      g| _        | j                  D ci c]  }|j                  | c}| _        | j                  j                  | _	        | j                  j                  | _
        t        | j                        dk(  sJ d       dj                  | j                  j                         D cg c]  }d| d
 c}      }dj                  | j                  j                         D cg c]  }d| d
 c}      }d| d| dd	d
g}	t        j                  d|j                  d      d| d      | j                  d<   t!        | j                        D ]R  \  }
}| j                  |   }|	j#                  d|
dz    d|j                   d|j$                   d|j&                          T dj                  |	      }	t)        d|dz         D cg c]0  }t+        t        j,                  | j/                  |      |	            2 c}| _        y c c}w c c}w c c}w c c}w )N)kr   z%ReAct only supports one output field.z, `zYou will be given z and you will respond with z.
zHTo do this, you will interleave Thought, Action, and Observation steps.
zWThought can reason about the current situation, and Action can be the following types:
Finishzreturns the final z and finishes the task)nameinput_variabledesc(z) [z	], which 
)super__init__r   	signature	max_itersdspyRetrievetoolsr   input_fieldsoutput_fieldslenjoinkeysExamplestrip	enumerateappendr   r   ranger   	Signature_generate_signaturereact)selfr   r   num_resultsr   toolr   inputs_outputs_instridxi	__class__s               O/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/predict/react.pyr   zReAct.__init__   s"   %5i%@@"<t}}{;<
26**=$diio=
 NN77!^^994%%&!+T-TT+))t/@/@/E/E/GH!q1XHI990B0B0G0G0IJ1!AhJK !	)DXJcRWf
  $||#>>#.%hZ/EF 


8 #4::. 	IC::d#DLLCE7"TYYKq)<)<(=YtyykR	 		%  1i!m,
 DNN4#;#;A#>FG

; > IJ*
s   I/I*I5Ic           
      B   i }| j                   j                         D ]
  \  }}|||<    t        d|dz         D ]  }t        j                  d| dd      |d| <   dj                  | j                  j                         D cg c]-  }|j                  dk7  r|j                   d	|j                   d
/ c}      }t        j                  d| dd| d      |d| <   ||k  st        j                  d| ddt        j                        |d| <    |S c c}w )Nr   zThought :z,next steps to take based on last observation)prefixr   Thought_z or r   r   ]zAction zalways either z or, when done, Finish[answer]Action_zObservation zobservations based on action)r4   r   formatObservation_)r   itemsr$   r   OutputFieldr   r   valuesr   r   dsppassages2text)r(   iterssignature_dictkeyvaljr*   	tool_lists           r1   r&   zReAct._generate_signature7   sP   ))//1 	&HC"%N3	& q%!)$ 	A-1-=-=!!AC.NXaS>*
  !%

 1 1 3yyH, yyk4#6#6"7q9I -1,<,< 1~%i[0NO-NWQC=)
 5y595E5E)!A.7,,6aS12'	2 %s   2D
c                 H   	 |d|dz       }|j                         j                  d      d   j                  dd      \  }}|j                  dd      d   }|dk(  r|S  | j                  |   |      }t	        |d|      |d	|dz    <   y # t
        $ r d
|d	|dz    <   Y y w xY w)Nr7   r   r   r   r   r6   r   passagesr9   z@Failed to parse action. Bad formatting or incorrect action name.)r!   splitrsplitr   getattr	Exception)r(   outputhopactionaction_name
action_valresults          r1   actz	ReAct.actW   s    	gc!eW-.F&,lln&:&:4&@&C&I&I#q&Q#K#**3215Jh&!!,TZZ,Z8F-4VZ-PF\#a%)* 	R \#a%)*	s   AB
 +B
 
B! B!c                    | j                   j                         D ci c]  }||v s|||    }}t        | j                        D ]>  } | j                  |   di |}| j                  ||      x}r n|j                  |       @ |D cg c]  }|j                  d      s||    }}t        j                  dd|it        | j                  j                               d   xs diS c c}w c c}w )NObservationobservationsr     )r   r   r$   r   r'   rQ   update
startswithr   
Predictionlistr   )r(   kwargsrA   argsrL   rK   rO   rT   s           r1   forwardzReAct.forwardj   s    ,0,=,=,B,B,DVSvVC[ VV( 	 C$TZZ_,t,F!XXfc22z2KK	  .2ScS^^M5RS	SS sLsT$BTBTBYBYB[=\]^=_akaqoq<rss W Ts   	C,C,C1"C1)      N)__name__
__module____qualname__r   r&   rQ   r]   __classcell__)r0   s   @r1   r	   r	      s    &
P@&t    r	   )	r=   r   dspy.signatures.signaturer   primitives.programr   predictr   r	   rV   rd   r1   <module>rh      s$    
  6 ' jtF jtrd   