
    +#h                         d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ  G d	 d
ej&                        Z G d d      Z G d dee      Z G d dej.                        Zy)    N)Extra)Runnable)	Parameter)Predict)
Prediction)
InputFieldOutputField)infer_prefixc                       e Zd ZdZ ej
                  d       Z ej                         Z ej                  d      Z	 ej                  d      Z
y)Template2Signaturea&  You are a processor for prompts. I will give you a prompt template (Python f-string) for an arbitrary task for other LMs.
Your job is to prepare three modular pieces: (i) any essential task instructions or guidelines, (ii) a list of variable names for inputs, (iv) the variable name for output.c                 *    d| j                          dS )Nz```

z.

```

Let's now prepare three modular pieces.)strip)xs    S/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/predict/langchain.py<lambda>zTemplate2Signature.<lambda>   s    '!'')Dv0w     )formatz,comma-separated list of valid variable names)descza valid variable nameN)__name__
__module____qualname____doc__dspyr   templater	   essential_instructions
input_keys
output_key r   r   r   r      sR    p t&wxH-T--/!!!'UVJ!!!'>?Jr   r   c                       e Zd Zd Zd Zd Zy)ShallowCopyOnlyc                     || _         y N)obj)selfr#   s     r   __init__zShallowCopyOnly.__init__   s    TXr   c                 .    t        | j                  |      S r"   )getattrr#   )r$   items     r   __getattr__zShallowCopyOnly.__getattr__   s    $(?!?r   c                 R    t        t        j                  | j                              S r"   )r    copyr#   )r$   memos     r   __deepcopy__zShallowCopyOnly.__deepcopy__   s    4889L)M"Mr   N)r   r   r   r%   r)   r-   r   r   r   r    r       s    +?Mr   r    c                   P    e Zd Z G d d      Zd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zy)LangChainPredictc                   $    e Zd Zej                  Zy)LangChainPredict.ConfigN)r   r   r   r   allowextrar   r   r   Configr1   #   s
    %++%r   r4   c                    t        j                  |        t        j                  |        t        |      | _        dj                  |j                  D cg c]  }|j                  j                   c}      }t        j                  d      j                         | _        | j                  |      \  | _        | _        || _        | j%                          y c c}w # t        $ r |j                  }Y zw xY w)N
   )r   r%   r   r    langchain_llmjoinmessagespromptr   AttributeErrorrandom	randbyteshexstage_build_signature	signatureoutput_field_keyconfigreset)r$   r;   llmrD   msglangchain_templates         r   r%   zLangChainPredict.__init__%   s    $4 ,S1"&))FOO,\SSZZ-@-@,\"] %%a(,,.
040E0EFX0Y--

 -]CFOO1Cs#   C C1C C C32C3c                 <    d | _         g | _        g | _        g | _        y r"   lmtracestraindemos)r$   s    r   rE   zLangChainPredict.reset3   s    

r   c                 J    g d}|D ci c]  }|t        | |       c}S c c}w )NrJ   )r'   )r$   
state_keysks      r   
dump_statezLangChainPredict.dump_state9   s'    7
-7874##888s    c                     |j                         D ]  \  }}t        | ||        | j                  D cg c]  }t        j                  di | c}| _        y c c}w Nr   )itemssetattrrN   r   Example)r$   statenamevaluer   s        r   
load_statezLangChainPredict.load_state=   sN     ;;= 	'KD%D$&	' 26<Adll'Q'<
<s   Ac                 T    t        |      dkD  r	i |d   |} | j                  di |S )Nr   r   )lenforward)r$   argkwargss      r   __call__zLangChainPredict.__call__C   s4    s8a<"6SV"6v"6t||%f%%r   c                    t        j                  ddd      }t        j                  |      5   t        j                  t              |      }d d d        j
                  j                  d      D ci c]  }|j                         t                }}|j                  j                  d      D ci c]  }|j                         t                }}|j                         D ]   \  }}|j                  |t        |             " |j                         D ]"  \  }}|}|j                  |t        |             $ t        j                  |j                   fi ||fS # 1 sw Y   xY wc c}w c c}w )Nzgpt-4-1106-previewi  chat)model
max_tokens
model_type)rK   )r   ,)r   OpenAIcontextr   r   r   splitr   r   r   r	   rU   finalizer
   dspTemplater   )	r$   r   gpt4TpartsrQ   inputsoutputsvrC   s	            r   rA   z!LangChainPredict._build_signatureG   s5   "64TZ[\\U#`-MT\\:L-MW_-`U`383C3C3I3I#3NOa!'')Z\)OO5:5E5E5K5KC5PQ1779km+QQLLN 	+DAqJJq,q/*	+ MMO 	+DAq JJq,q/*	+ ||E88NFNgNP``` 	a`OQs   !E"5 E/4 E4"E,c                    |j                  d| j                        }|j                  d| j                        }t        di | j                  |j                  di       } |t        j                  dd|i|      } | j                  j                  |fi |}|j                  }t        j                  | j                  |ig|      }t        j                  j                   j#                  ||f       t
        j                  j$                  0t
        j                  j$                  }	|	j#                  | i ||f       |S # t        $ r |}Y w xY w)NrB   rN   rD   )rB   r   )poprB   rN   dictrD   rl   rW   r8   invokecontentr<   r   from_completionsrC   r   settingslangchain_historyappendtrace)
r$   r`   rB   rN   rD   r;   outputrw   predr|   s
             r   r^   zLangChainPredict.forwardX   s   JJ{DNN;	

7DJJ/@@vzz(B'?@3;;=U=f=>*##**6<V<~~W **T-B-BG,L+MYbc
 	''..~><<)LL&&ELL$
6
D12 /w/s   E EEc                 &     | j                   di |S rT   )r^   r$   dargsr`   s       r   rv   zLangChainPredict.invokeq   s    t|| a  r   N)r   r   r   r4   r%   rE   rR   r[   ra   rA   r^   rv   r   r   r   r/   r/   "   s1    %%9=&a"2!r   r/   c                   *     e Zd Z fdZd Zd Z xZS )LangChainModulec                    t         |           g }|j                         j                  j	                         D ];  \  }}t        |j                  t              s!|j                  |j                         = || _	        || _
        y r"   )superr%   	get_graphnodesrU   
isinstancedatar/   r{   moduleschain)r$   lcelr   rY   node	__class__s        r   r%   zLangChainModule.__init__   sl    ..*00668 	RJD$$))%56tyy8Q	R 
r   c                    d| j                   d   j                  g}| j                  j                  t	        di |      }|j
                  }t        j                  |D ci c]  }|| c}      S # t        $ r Y /w xY wc c}w )Nr}   r   )	r   rC   r   rv   ru   rw   	Exceptionr   r   )r$   r`   output_keysr}   rQ   s        r   r^   zLangChainModule.forward   so    b!1!B!BC""4>&>2nnV ;?a6	?@@ $?s    A0 
A?0	A<;A<c                 :     | j                   di |j                  S rT   )r^   r}   r   s       r   rv   zLangChainModule.invoke   s    t|| a '''r   )r   r   r   r%   r^   rv   __classcell__)r   s   @r   r   r      s    A(r   r   )r+   r=   langchain_core.pydantic_v1r   langchain_core.runnablesr   rl   r   dspy.predict.parameterr   dspy.predict.predictr   dspy.primitives.predictionr   dspy.signatures.fieldr   r	   dspy.signatures.signaturer
   	Signaturer   r    r/   Moduler   r   r   r   <module>r      se      , - 
  , ( 1 9 2
@ @N NQ!w Q!R(dkk (r   