
    +#h                     R    d dl Z d dlZd dlmZ ddlmZ ddlmZmZ  G d de      Z	y)    N)ensure_signature   )Module)
CodePromptPythonInterpreterc                   >     e Zd Zd fd	Zd Zd Zd Zd Zd Z xZ	S )ProgramOfThoughtc                    t         |           t        |      x| _        }|| _        || _        |j                  | _        |j                  | _        t        | j                        dk(  sJ d       t        t        | j                              | _        dj                  | j                  j                         D cg c]  }d| d
 c}      }d| j                   d}t        | j                        dk(  sJ d       g }|j                  d| d| d       |j                  d| d       |j                  d	| d       d
j                  |      }t        j                   t        j"                  | j%                  d      j&                  | j)                  d                  | _        t        j                   t        j"                  | j%                  d      j&                  | j)                  d                  | _        t        j                   t        j"                  | j%                  d      j&                  | j)                  d                  | _        y c c}w )N   z#PoT only supports one output field., `You will be given  and you will respond with .MGenerating executable Python code that programmatically computes the correct pAfter you're done with the computation, make sure the last line in your code evaluates to the correct value for 
generate
regenerateanswer)super__init__r   	signature	max_itersimport_white_listinput_fieldsoutput_fieldslennextiteroutput_field_namejoinkeysappenddspyChainOfThought	Signature_generate_signaturefields_generate_instructioncode_generatecode_regenerategenerate_answer)	selfr   r   r   
field_nameinputs_outputs_instr	__class__s	           \/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/predict/program_of_thought.pyr   zProgramOfThought.__init__   s5   %5i%@@"!2%22&444%%&!+R-RR+!%d4+=+=&>!?))151B1B1G1G1IJ:qAJ
 t--.a04%%&!+R-RR+ 	)DXJaP	
 	[\d[eefg	
 	~  @H  I  IJ  K	
 		% !00NN((4;;**:6
  $22NN((6==**<8 
  $22NN((299**84 
= Ks   ;Ic           	         t        | j                        }dt        j                  ddt              it        j
                  ddt              t        j
                  dd	      t        j                  ddt              d
dt        j
                  ddt              dt        j
                  dd	      | j                  | j                  j                  | j                     id}|j                  ||          t        j                  |      S )Ngenerated_codezCode:z%python code that answers the question)prefixdescformatzPrevious Code:z-previously-generated python code that erroredzError:z3error message from previously-generated python code)r7   r8   )previous_codeerrorr6   final_generated_codecode_outputzCode Output:z*output of previously-generated python code)r   r   r   )dictr   r%   OutputFieldstr
InputFieldr!   r   r)   updater'   )r.   modesignature_dictfields_for_modes       r4   r(   z$ProgramOfThought._generate_signature<   s    d//0 !$"2"2"@# "&+H"
 #N #'"2"2"@#" '"@)
 t)E  &&(=(=d>T>T(U1$
J 	od34~~n--    c                 *   dj                  | j                  |      j                  D cg c]  }d| d
 c}      }d| j                   d}|dk(  rd| d| dd| dd| dg}n|d	k(  r	d
| ddg}n
d| d| dg}dj                  |      S c c}w )Nr   r   r   r   r   r   r   r   r   zYou are given z" due to an error in previous code.zGYour task is to correct the error and provide the new `generated_code`.zGiven the final code z, provide the final r   )r"   r(   r   r!   )r.   rC   r/   mode_inputsmode_outputsr2   s         r4   r*   z&ProgramOfThought._generate_instructionf   s    ii #'":":4"@"M"M J<q!
 4112!4:$[M1L\NZ[\_`l_mmno C  DP  CQ  QR  SE
 \! -OPYE (}4HVWXE yy-s   Bc                 t   |j                  dd      j                  dd      d   j                  dd      d   }t        j                  d|t        j                        }|r|j                  d      n|j                  dd	      }|s|d
fS d	|vr|j                  d      dkD  r|dfS |j                  d	      }t        j                  d|d   j                               }|r)t        |      dkD  r|d	|j                  d      z   z  }|d fS t        j                  dd|      }t        j                  dd|      }|d fS )Nr6    z---r   r   z


z```python[ \n](.*?)[ \n]```?z\nr   z Error: Empty code after parsing.=z"Error: Code format is not correct.z
^(\w+)\s*=z'([a-zA-Z_]\w* *=.*?)(?=[a-zA-Z_]\w* *=)z\1\nz#([a-zA-Z_]\w* *=.*?)([a-zA-Z_]\w*)$z\1\n\2)getsplitresearchDOTALLgroupreplacecountmatchstripr   sub)r.   	code_datacode
code_match
code_blocklineslast_line_matchs          r4   
parse_codezProgramOfThought.parse_code   sF   MM*B/55eQ?BHHSTUVWX 	 YY>biiP
-7j&&q)TJJ5RVW
;;;z!j&6&6s&;a&?===  &((=%)//2CDs5zA~$!6!6q!999J 4 :GZJ 6	:J 4rF   c                     |s|d dfS t        |d      }t        dt        i| j                        }	 t	        |j                  |      d         }t         ||d fS # t        $ r}|d t	        |      fcY d }~S d }~ww xY w)Nz#Error: Empty code before execution.python)	code_typeprint)action_spacer   )interpreterr   )r   r   rc   r   r@   execute	Exception)r.   rZ   code_promptre   outputes         r4   execute_codezProgramOfThought.execute_code   s    DDD :'gu5EY]YoYop	&,,,EaHIF%% 	&s1v%%	&s   (A 	A=%A82A=8A=c                 J   | j                   D ci c]  }|||   
 }} | j                  di |}| j                  |      \  }}| j                  |      \  }}}d}	|	| j                  k  r|rt        d       |j                  ||d        | j                  di |}| j                  |      \  }}| j                  |      \  }}}|	dz  }	|	| j                  k(  rt        d       y |	| j                  k  r|r|j                  ||d        | j                  di |}
|
S c c}w )Nr   zError in code execution)r:   r;   r   z!Max hops reached. Error persists.)r<   r=    )	r   r+   r_   rk   r   rc   rB   r,   r-   )r.   kwargsr/   input_kwargsrY   parsed_coder;   rZ   ri   hopanswer_gen_results              r4   forwardzProgramOfThought.forward   sB   =A=N=N
/9Jz**
 
 'D&&66	!__Y7U"//<feDNN"u+,$ GH,,,<|<I!%!;K"&"3"3K"@D&%1HCdnn$9: DNN"u 	T&QR0D00@<@  +
s   D )   N)
__name__
__module____qualname__r   r(   r*   r_   rk   rs   __classcell__)r3   s   @r4   r	   r	   
   s#    0
b(.T 6 .
&!rF   r	   )
rP   r%   dspy.signatures.signaturer   primitives.programr   primitives.python_interpreterr   r   r	   rm   rF   r4   <module>r|      s"    	  6 ' Io!v o!rF   