
    +#h8              
          d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlZd dlmZmZmZ dej,                  fdZdefd	Z G d
 d ee            Z G d dee      Zdde
ee	e   f   defdZ	 	 dde
eeeeeef   f   f   dedede	e   fdZdedee	ef   fdZddedeeef   fdZ ddefdZ!dedefdZ"y)    N)deepcopy)AnyDictTupleTypeUnion)	BaseModelFieldcreate_model)	FieldInfo)
InputFieldOutputFieldnew_to_old_fieldreturnc                     t        j                  | j                  fi | j                  j	                         D ci c]  \  }}|t        |       c}}S c c}}w )z"Convert from new to legacy format.)dspTemplateinstructionsfieldsitemsr   )	signaturenamefields      V/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/signatures/signature.pysignature_to_templater      sP    <<<E<L<L<R<R<T
U[T54!%((
U 
Us   Ac                     dj                  | j                  D cg c]  }d| d
 c}      }dj                  | j                  D cg c]  }d| d
 c}      }d| d| dS c c}w c c}w )N, `zGiven the fields z, produce the fields .)joininput_fieldsoutput_fields)clsr   inputs_outputs_s       r   _default_instructionsr&      so    ii33C3CD%1UG1DEGyyC4E4EF5AeWA,FGHwi'<XJaHH EFs   A$A)c            
       T    e Zd Z fdZ fdZd Zedefd       Zedefd       Z	dede
d   fd	Zedeeef   fd
       Zdde
d   fdZedeeef   fd       Zedeeef   fd       Zdeeef   fdZdde
d   fdZdde
d   fdZddedede
de
d   fdZdefdZd Z xZS )SignatureMetac                 H    | t         u rt        |i |S t        |   |i |S N)	Signaturemake_signaturesuper__call__)r#   argskwargs	__class__s      r   r.   zSignatureMeta.__call__   s0    )!42622w000    c                    |j                  di       }|j                         D ]6  \  }}t        |t              s|j	                  d      r)||vs.t
        ||<   8 ||d<   t        |   | |||fi |}|j                  2|D ]-  }	t        |	t              st        |	dd      }
|
dk7  s'|
|_        / |j                  t        |      |_        |j                          |j                  j                         D ]P  \  }}d|j                  vrt        |      dz   |j                  d<   d|j                  vs>d| d	|j                  d<   R |S )
N__annotations______doc__ prefix:descz${})getr   
isinstancer   
startswithstrr-   __new__r6   r(   getattrr&   _validate_fieldsmodel_fieldsjson_schema_extrainfer_prefix)mcssignature_namebases	namespacer0   raw_annotationsr   r   r#   basedocr1   s              r   r@   zSignatureMeta.__new__#   sb   #--(92>$??, 	,KD%eY/??4(T-H(+%		,
 (7	#$ goc>5)NvN ;; *dM2!$	26Cby&)	* ;;/4CK 	 ++113 	AKD%u6664@4F4L''1U44447vR.''/		A 
r2   c           	          | j                   j                         D ]R  \  }}|j                  xs i }|j                  d      }|dvs,t	        d| d| j
                   d|j                         y )N__dspy_field_type)inputoutputzField 'z' in 'zK' must be declared with InputField or OutputField. field.json_schema_extra=)rC   r   rD   r<   	TypeError__name__)r#   r   r   extra
field_types        r   rB   zSignatureMeta._validate_fieldsJ   s    ++113 	KD%++1rE#67J!44dV6#,,  8Dkp  lC  lC  kE  F 		r2   r   c                     dj                  | j                  j                               }dj                  | j                  j                               }| d| S )Nr   z -> )r    r!   keysr"   )r#   in_argsout_argss      r   r   zSignatureMeta.signatureS   sM    ))C,,113499S..3356$xj))r2   c                     t        | dd      S )Nr6   r7   )rA   r#   s    r   r   zSignatureMeta.instructionsY   s    sIr**r2   r   r+   c                 .    t        | j                  |      S r*   )r+   r   )r#   r   s     r   with_instructionszSignatureMeta.with_instructions]   s    \22r2   c                 6    i | j                   | j                  S r*   )r!   r"   rZ   s    r   r   zSignatureMeta.fields`   s      9#""8c&7&788r2   c                     t        | j                        }i ||   j                  |||   _        |
|||   _        t	        || j
                        S )zUpdate the field, name, in a new Signature type.

        Returns a new Signature type with the field, name, updated
        with fields[name].json_schema_extra[key] = value.
        )r   r   rD   
annotationr+   r   )r#   r   type_r0   fields_copys        r   with_updated_fieldsz!SignatureMeta.with_updated_fieldse   sd     szz*/
$11/
/
D+ +0K(c&6&677r2   c                 $    | j                  d      S )NrO   _get_fields_with_typerZ   s    r   r!   zSignatureMeta.input_fieldst   s    ((11r2   c                 $    | j                  d      S )NrP   rd   rZ   s    r   r"   zSignatureMeta.output_fieldsx   s    ((22r2   c                     | j                   j                         D ci c]  \  }}|j                  d   |k(  s|| c}}S c c}}w )NrN   )rC   r   rD   )r#   rT   kvs       r   re   z#SignatureMeta._get_fields_with_type|   sA    !$!1!1!7!7!9tAQ=P=PQd=eis=s1ttts
   AAc                 *    | j                  d|||      S )Nr   insertr#   r   r   r`   s       r   prependzSignatureMeta.prepend   s    zz!T5%00r2   c                 *    | j                  d|||      S )Nrk   rm   s       r   appendzSignatureMeta.append   s    zz"dE511r2   indexr   r`   c                    ||j                   }|t        }t        | j                  j	                               }t        | j
                  j	                               }|j                  d   dk(  r|n|}|dk  r|t        |      dz   z  }|dk  s|t        |      kD  rt        d|       |j                  ||||ff       t        ||z         }t        || j                        S )NrN   rO   r      zInvalid index: )r_   r?   listr!   r   r"   rD   len
ValueErrorrl   dictr+   r   )	r#   rr   r   r   r`   r!   r"   lst
new_fieldss	            r   rl   zSignatureMeta.insert   s     =$$E=EC,,2245S..4467 $556IJgUl[h19SX\!E19C(ug677

54%01,67
S%5%566r2   c                 *   t        |t              rt        |t              sy| j                  |j                  k7  ry| j
                  j                         |j
                  j                         z  D ]   }||j
                  vs|| j
                  vs  y y)z/Compare the JSON schema of two Pydantic models.FT)r=   type
issubclassr	   r   r   rV   )r#   otherr   s      r   equalszSignatureMeta.equals   sz    %&j	.Ju111JJOO%(9(9(;; 	D5<<'4szz+A	 r2   c                    g }| j                   j                         D ]  \  }}|j                  | d| d        dj                  |      }| j                   d| j
                   dt        | j                         d| dS )a#  Output a representation of the signature.

        Uses the form:
        Signature(question, context -> answer
            question: str = InputField(desc="..."),
            context: List[str] = InputField(desc="..."),
            answer: int = OutputField(desc="..."),
        ).
        z	 = Field()z
    (z
    instructions=z
))r   r   rq   r    rR   r   reprr   )r#   field_reprsr   r   
field_reprs        r   __repr__zSignatureMeta.__repr__   s     ::++- 	;KD%$yq9:	;]];/
,,q/B4HXHXCYBZZ`ak`lloppr2   r*   )rR   
__module____qualname__r.   r@   rB   propertyr?   r   r   r   r\   rx   r   r   rb   r!   r"   re   rn   rq   intrl   boolr   r   __classcell__)r1   s   @r   r(   r(      sO   1
%N *# * *
 +S + +3S 3T+5F 3 9tCN+ 9 98[@Q 8 2T#y.1 2 2 3d3	>2 3 3u$sI~2F u1k1B 12[0A 273 7c 7 7kIZ 7.
d 
qr2   r(   c                       e Zd ZdZy)r+   r7   N)rR   r   r   r6    r2   r   r+   r+      s
     	r2   r+   )	metaclassr   c                 ^    | y t        | t              rt        | |      S |t        d      | S )Nz=Don't specify instructions when initializing with a Signature)r=   r?   r+   rw   )r   r   s     r   ensure_signaturer      s:    )S!L11XYYr2   r   rG   c                    t        | t              rt        |       n| }i }|j                         D ]  \  }}t        |t              st	        dt        |             t        |t              r|j                  }|}n,t        |t              st	        dt        |             |\  }}|t        }t        |t
        t        j                  t        j                  f      st	        dt        |             t        |t              st	        dt        |             ||f||<    t        |j                               t        |j                               k(  sJ |t        | d      }	t!        |	      }t#        |ft        |d|S )a  Create a new Signature type with the given fields and instructions.

    Note:
        Even though we're calling a type, we're not making an instance of the type.
        In general, instances of Signature types are not allowed to be made. The call
        syntax is provided for convenience.

    Args:
        signature: The signature format, specified as "input1, input2 -> output1, output2".
        instructions: An optional prompt for the signature.
        signature_name: An optional name for the new signature type.
    z!Field names must be strings, not z!Field values must be tuples, not zField types must be types, not z*Field values must be Field instances, not r7   )__base__r6   )r=   r?   _parse_signaturer   rw   r|   r   r_   tupletyping_GenericAliastypesGenericAliasru   rV   r+   r&   r   )
r   r   rG   r   fixed_fieldsr   
type_fieldr`   r   sigs
             r   r,   r,      s}   " -7y#,Fi(IF L"LLN ,j$$@dMNNj),))EEj%0 #DT*EUDV!WXX%LE5 =E%$(<(<e>P>P!QR>tE{mLMM%+I$u+WXX#U^T',, !!#$V[[](;;;; 	2&,S1 	 r2   c                     | j                  d      dk7  rt        d|  d      | j                  d      \  }}i }t        |      D ]  \  }}|t	               f||<    t        |      D ]  \  }}|t               f||<    |S )Nz->rt   zInvalid signature format: 'z!', must contain exactly one '->'.)countrw   split_parse_arg_stringr   r   )r   
inputs_stroutputs_strr   r   r`   s         r   r   r     s    t!6ykAbcdd'ood3JF(4 -ez|,t-(5 .e{}-t. Mr2   stringc                 @   t        j                  d| z   dz         j                  d   j                  j                  }|D cg c]  }|j                   }}|D cg c])  }|j
                  t        nt        |j
                        + }}t        ||      S c c}w c c}w )Nzdef f(z): passr   )	astparsebodyr/   argr_   r?   _parse_type_nodezip)r   namesr/   r   r   s        r   r   r   %  s    99X&2388;@@EED $%SWW%E%\`aUXCNN*S0@0PPaEaue &as   B.Bc           
         t         j                  t        | t        j                        r7| j
                  }t        |      dk7  rt        d|        t        |d         S t        | t        j                        r| j                  }t        |      S t        | t        j                        r`| j                  }|v r|   S t        t        t        t         t"        t$        t&        fD ]  }|j(                  |k(  s|c S  t        d|       t        | t        j*                        r1t        | j                        }t        | j,                        }||   S t        | t        j.                        r | j0                  }t%        fd|D              S t        | t        j2                        r| j4                  j                  dk(  rn| j6                  D 	cg c]  }	|	j8                   }
}	| j6                  D 	cg c]  }	|	j                  j                   }}	t;        di t'        t=        |
|            S t        d|        c c}	w c c}	w )zRecursively parse an AST node representing a type annotation.

    without using structural pattern matching introduced in Python 3.10.
    rt   z!Code is not syntactically valid: r   zUnknown name: c              3   6   K   | ]  }t        |        y wr*   )r   ).0eltr   s     r   	<genexpr>z#_parse_type_node.<locals>.<genexpr>N  s     Bc%c51Bs   r
   r   )r   __dict__r=   r   Moduler   rv   rw   r   ExprvalueNameidr   r?   floatr   ru   r   rx   rR   	Subscriptslicer   eltsCallfunckeywordsr   r
   r   )noder   r   r   id_r`   	base_typearg_typer   kwrV   valuess    `          r   r   r   ,  s   
 }$

#yyt9>@GHHQ//$!

u--$!gg%<:3tT5$? 	E~~$	 >#/00$&$TZZ7	#DJJ6""$		"yyBTBBB$!99<<7"%)]]3rBFF3D3/3}}=bhhnn=F=34D& 1233
8?
@@	 4=s   I:I
attribute_namec                    t        j                  dd|       }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }|j                  d      }g }|D ]C  }|j                         r|j	                  |       %|j	                  |j                                E dj                  |      S )z&Infer a prefix from an attribute name.z(.)([A-Z][a-z]+)z\1_\2z([a-z0-9])([A-Z])z([a-zA-Z])(\d)z(\d)([a-zA-Z])_ )resubr   isupperrq   
capitalizer    )r   s1intermediate_namewith_underscores_around_numberswordstitle_cased_wordswords          r   rE   rE   Y  s     
"Hn	=B2HbA ')ff'#
 ')ff''# ,11#6E 8<<>$$T*$$T__%67	8 88%&&r2   r*   )NStringSignature)#r   r   r   r   copyr   r   r   r   r   r   pydanticr	   r
   r   pydantic.fieldsr   r   dspy.signatures.fieldr   r   r   r   r   r?   r&   r|   r(   r+   r   r,   r   r   r   rE   r   r2   r   <module>r      s;   
 	    0 0 3 3 % 
 K K I# IYqDO YqX		] 	c4	?&: ; S\  +8S$sE$	/$::;;<88 8 
)_	8v dEk(: c $sCx. *A# *AZ' ' 'r2   