
    ; iG                       d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ eej        ej        gef         Zd%dZd&dZej         G d d                      Zd'dZ G d deeej        df         gej        f         ej                    Z! G d! d"e!          Z" G d# d$e!          Z#dS )(zLLMFunction.    )annotationsN)AbstractSetAnyCallableIterableMappingOptionalSequenceUnion)llmfn_input_utils)llmfn_output_row)llmfn_outputs)llmfn_post_process)llmfn_post_process_cmds)model)prompt_utilslhs#llmfn_output_row.LLMFnOutputRowViewrhsreturnboolc                V    |                                  |                                 k    S )z-Default function used when comparing outputs.)result_value)r   r   s     /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/google/generativeai/notebook/lib/llm_function.py_is_equal_fnr   4   s'    
 !1!1!3!333    fnYCallable[[llmfn_output_row.LLMFnOutputRowView, llmfn_output_row.LLMFnOutputRowView], Any]4llmfn_post_process.LLMCompareFnPostProcessBatchAddFnc                     d fd}|S )z1Vectorize a single-row-based comparison function.lhs_and_rhs_rowsYSequence[tuple[llmfn_output_row.LLMFnOutputRowView, llmfn_output_row.LLMFnOutputRowView]]r   Sequence[Any]c                     fd| D             S )Nc                .    g | ]\  }} ||          S  r&   ).0r   r   r   s      r   
<listcomp>zD_convert_compare_fn_to_batch_add_fn.<locals>._fn.<locals>.<listcomp>O   s'    >>>c3>>>r   r&   )r!   r   s    r   _fnz0_convert_compare_fn_to_batch_add_fn.<locals>._fnG   s      ?>>>-=>>>>r   )r!   r"   r   r#   r&   )r   r)   s   ` r   #_convert_compare_fn_to_batch_add_fnr*   <   s(    ? ? ? ? ? ? Jr   c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	S )
_PromptInfoint
prompt_numstrprompt	input_numzMapping[str, str]prompt_varsmodel_inputN)__name__
__module____qualname____annotations__r&   r   r   r,   r,   T   sE         OOOKKKNNN""""r   r,   promptsSequence[str]inputs*llmfn_input_utils.LLMFunctionInputs | NoneIterable[_PromptInfo]c           	   #     K   g }|t          j        |          }|si g}t          |           D ]=\  }}t          |          D ](\  }} |j        di |}t	          |||||          V  )>dS )a  Generate a tuple of fields needed for processing prompts.

    Args:
      prompts: A list of prompts, with optional keyword placeholders.
      inputs: A list of key/value pairs to substitute into placeholders in
        `prompts`.

    Yields:
      A _PromptInfo instance.
    N)r.   r0   r1   r2   r3   r&   )r   to_normalized_inputs	enumerateformatr,   )r8   r:   normalized_inputsr.   r0   r1   r2   r3   s           r   _generate_promptsrB   ]   s       68-B6JJ  !D'00 
 

F&/0A&B&B 		 		"I{'&-66+66K%#''      		
 
r   c                      e Zd ZdZ	 dddZej        dd            Zej        dd            Z	 dddZ	ddZ
ddZddZdS ) LLMFunctionz6Base class for LLMFunctionImpl and LLMCompareFunction.Noutputs_ipython_display_fn3Callable[[llmfn_outputs.LLMFnOutputs], None] | Nonec                "    g | _         || _        dS )a  Constructor.

        Args:
          outputs_ipython_display_fn: Optional function that will be used to
            override how the outputs of this LLMFunction will be displayed in a
            notebook (See further documentation in LLMFnOutputs.__init__().)
        N)_post_process_cmds_outputs_ipython_display_fn)selfrE   s     r   __init__zLLMFunction.__init__   s     Z\+E(((r   r   AbstractSet[str]c                    dS )zLReturns the placeholders that should be present in inputs for this function.Nr&   rJ   s    r   get_placeholderszLLMFunction.get_placeholders         r   r:   r;   (Sequence[llmfn_outputs.LLMFnOutputEntry]c                    dS )z&Concrete implementation of __call__().Nr&   )rJ   r:   s     r   
_call_implzLLMFunction._call_impl   rP   r   llmfn_outputs.LLMFnOutputsc                b    |                      |          }t          j        || j                  S )z+Runs and returns results based on `inputs`.)outputsipython_display_fn)rS   r   LLMFnOutputsrI   )rJ   r:   rV   s      r   __call__zLLMFunction.__call__   s7     //&)))0P
 
 
 	
r   namer/   r   1llmfn_post_process.LLMFnPostProcessBatchReorderFnc                b    | j                             t          j        ||                     | S NrZ   r   )rH   appendr   LLMFnPostProcessReorderCommandrJ   rZ   r   s      r   add_post_process_reorder_fnz'LLMFunction.add_post_process_reorder_fn   s:     	&&#BQSTTT	
 	
 	
 r   -llmfn_post_process.LLMFnPostProcessBatchAddFnc                b    | j                             t          j        ||                     | S r]   )rH   r_   r   LLMFnPostProcessAddCommandra   s      r   add_post_process_add_fnz#LLMFunction.add_post_process_add_fn   s9    
 	&&#>DRPPP	
 	
 	
 r   1llmfn_post_process.LLMFnPostProcessBatchReplaceFnc                b    | j                             t          j        ||                     | S r]   )rH   r_   r   LLMFnPostProcessReplaceCommandra   s      r   add_post_process_replace_fnz'LLMFunction.add_post_process_replace_fn   s:    
 	&&#BQSTTT	
 	
 	
 r   N)rE   rF   r   rL   r:   r;   r   rQ   )r:   r;   r   rT   )rZ   r/   r   r[   r   rD   )rZ   r/   r   rc   r   rD   )rZ   r/   r   rg   r   rD   )r4   r5   r6   __doc__rK   abcabstractmethodrO   rS   rY   rb   rf   rj   r&   r   r   rD   rD      s         A@ [_F F F F F 	[ [ [ [ 	5 5 5 5 DH
 
 
 
 
           r   rD   )	metaclassc                  B     e Zd ZdZ	 	 dd fdZddZddZddZ xZS )LLMFunctionImpla  Callable class that executes the contents of a Magics cell.

    An LLMFunction is constructed from the Magics command line and cell contents
    specified by the user. It is defined by:
    - A model instance,
    - Model arguments
    - A prompt template (e.g. "the opposite of hot is {word}") with an optional
      keyword placeholder.

    The LLMFunction takes as its input a sequence of dictionaries containing
    values for keyword replacement, e.g. [{"word": "hot"}, {"word": "tall"}].

    This will cause the model to be executed with the following prompts:
      "The opposite of hot is"
      "The opposite of tall is"

    The results will be returned in a LLMFnOutputs instance.
    Nr   model_lib.AbstractModelr8   r9   
model_argsmodel_lib.ModelArguments | NonerE   rF   c                >   t                                          |           || _        || _        |t	          j                    n|| _        t          i           | _        | j        D ]3}| j        	                    t          j        |                    | _        4dS )a  Constructor.

        Args:
          model: The model that the prompts will execute on.
          prompts: A sequence of prompt templates with optional placeholders. The
            placeholders will be replaced by the inputs passed into this function.
          model_args: Optional set of model arguments to configure how the model
            executes the prompts.
          outputs_ipython_display_fn: See documentation in LLMFunction.__init__().
        rE   N)superrK   _model_prompts	model_libModelArguments_model_args	frozenset_placeholdersunionr   rO   )rJ   r   r8   ru   rE   r0   	__class__s         r   rK   zLLMFunctionImpl.__init__   s    " 	4NOOO9C9K93555Q[ 'r]]m 	a 	aF!%!3!9!9,:WX^:_:_!`!`D	a 	ar   results)Sequence[llmfn_output_row.LLMFnOutputRow]r   c           
        | j         D ]}	 t          |t          j                  r|                    |          }n4t          j        d                    t          |                              h# t
          j        $ r  t          $ rR}t          j        d                    |
                                t          |          j        |                    d}~ww xY w|S z-Runs post-processing commands over `results`.z)Unsupported post-process command type: {}z Error executing "{}", got {}: {}N)rH   
isinstancer   LLMFnImplPostProcessCommandrunr   PostProcessExecutionErrorr@   typeRuntimeErrorrZ   r4   )rJ   r   cmdes       r   _run_post_processing_cmdsz)LLMFunctionImpl._run_post_processing_cmds   s     * 	 	Cc#:#VWW !ggg..GG,FCJJ4PS99UU   
 &?      (B6==chhjj$q''JZ\]^^   s   A$A00C	ACCrL   c                    | j         S rk   r   rN   s    r   rO   z LLMFunctionImpl.get_placeholders
      !!r   r:   r;   rQ   c                   g }t          | j        |          D ]}| j                            |j        | j                  }g }t          |j                  D ]U\  }}|                    t          j
        t          j        j        |t          j        j        |it                               V|                    t          j        |j        |j        |j        |j        |j        ||                     |                               |S )N)r8   r:   )r3   ru   dataresult_type)r.   r1   r0   r2   r3   model_resultsoutput_rows)rB   r{   rz   
call_modelr3   r~   r?   text_resultsr_   r   LLMFnOutputRowr   ColumnNames
RESULT_NUMTEXT_RESULTr/   LLMFnOutputEntryr.   r1   r0   r2   r   )rJ   r:   r   infor   r   
result_numtext_results           r   rS   zLLMFunctionImpl._call_impl  s0    9;%dmFKKK 	 	D K22 ,9I 3  M BDK+4]5O+P+P 	 	'
K""$3)5@*)5A; %(      NN.#"n; $ 0 $ 0"/ $ > >{ K K  
 
 
 
 r   NN)r   rt   r8   r9   ru   rv   rE   rF   )r   r   r   r   rl   rm   )	r4   r5   r6   rn   rK   r   rO   rS   __classcell__r   s   @r   rs   rs      s         . 7;Z^a a a a a a a6   (" " " "       r   rs   c                  J     e Zd ZdZ	 	 dd fd
ZddZd dZd!dZd"dZ xZ	S )#LLMCompareFunctionzLLMFunction for comparisons.

    LLMCompareFunction runs an input over a pair of LLMFunctions and compares the
    result.
    Nlhs_name_and_fntuple[str, LLMFunction]rhs_name_and_fncompare_name_and_fns&Sequence[tuple[str, CompareFn]] | NonerE   rF   c                &   t                                          |           |d         | _        |d         | _        |d         | _        |d         | _        t          | j                                                                      | j                                                  | _	        |sd| _
        t          | _        dS |d         \  }}|| _
        || _        |dd         D ])\  }}|                     |t          |                     *dS )a  Constructor.

        Args:
          lhs_name_and_fn: Name and function for the left-hand side of the
            comparison.
          rhs_name_and_fn: Name and function for the right-hand side of the
            comparison.
          compare_name_and_fns: Optional names and functions for comparing the
            results of the left- and right-hand sides.
          outputs_ipython_display_fn: See documentation in LLMFunction.__init__().
        rx   r      is_equalNr^   )ry   rK   	_lhs_name_lhs_fn	_rhs_name_rhs_fnr   rO   r   r   _result_namer   _result_compare_fnadd_compare_post_process_add_fnr*   )	rJ   r   r   r   rE   rZ   r   cmp_fnr   s	           r   rK   zLLMCompareFunction.__init__5  s(   $ 	4NOOO-a0$3A$6-a0$3A$6&t|'D'D'F'FGGMML))++
 
 $ 	 *D&2D### ,B/HD" $D&(D# !5SbS 9  f44"Ef"M"M 5     r   lhs_output_rowsr   rhs_output_rowsr   r   c           
     P   | j         D ]}	 t          |t          j                  r|                    |          }n{t          |t          j                  r2|                    t          t          |||                              }n/t          d	                    t          |                              # t          j        $ r  t          $ rR}t          j        d	                    |                                t          |          j        |                    d}~ww xY w|S r   )rH   r   r   r   r   LLMCompareFnPostProcessCommandlistzipr   r@   r   r   r   rZ   r4   )rJ   r   r   r   r   r   s         r   r   z,LLMCompareFunction._run_post_processing_cmds`  s)    * 	 	Cc#:#VWW !ggg..GG%<%[\\ !ggd3QX+Y+Y&Z&Z[[GG&CJJ4PS99UU   &?      (B6==chhjj$q''JZ\]^^   s   B+B88D#ADD#rL   c                    | j         S rk   r   rN   s    r   rO   z#LLMCompareFunction.get_placeholdersy  r   r   r:   r;   rQ   c                   |                      |          }|                     |          }g }t          ||          D ]\  }}|j        |j        k    r-t	          d                    |j        |j                            |j        |j        k    r-t	          d                    |j        |j                            |j        |j        k    r-t	          d                    |j        |j                            t          t          |j
                  t          |j
                            }|j
        d |         }|j
        d |         }	g }
t          t          ||	                    D ]\  }}|\  }}t          j        j        || j        |                     ||          i}t#          j        |t&                    }|                    t          j        j        |j                   | j        |f| j        |ffD ]^\  }}|                                D ]D\  }}|t          j        j        k    r*|                    d                    ||          |           E_|
                    |           |                    t          j        |j        |j        |j        |                     ||	|
                               |S )NzPrompt num mismatch: {} vs {}zInput num mismatch: {} vs {}zPrompt vars mismatch: {} vs {}r   z{}_{})r   r   r   )r.   r1   r2   r   )r   r   r   r.   r   r@   r1   r2   minlenr   r?   r   r   r   r   r   r   r   r   addPROMPT_VARSr   r   itemsr_   r   r   )rJ   r:   lhs_resultsrhs_resultsrV   	lhs_entry	rhs_entrynum_output_rowsr   r   r   r   lhs_and_rhs_output_rowlhs_output_rowrhs_output_rowrow_data
output_rowrZ   rowkvs                        r   rS   zLLMCompareFunction._call_impl|  s    ll6**ll6** 9;$'[$A$A E	 E	 Iy#y';;;"3::!,i.B   
 "i&999"299):MyObcc   $	(==="4;;!-y/D    "#i&;"<"<c)BW>X>XYYO'34D_4DEO'34D_4DEOACK6?O_557 7 / /2
2 2H. "-8*%t'>'>~~'^'^, .<(X[\\\
 }8DiF[\\\ ^^4^^4" G GID# !$		 G G1 9 DDD 'NN7>>$+B+BAFFF	G "":....NN.(3'1 ) 5 $ > >(7(7 + !? ! !		 	 	    r   rZ   r/   r   r   rD   c                b    | j                             t          j        ||                     | S r]   )rH   r_   r   !LLMCompareFnPostProcessAddCommandra   s      r   r   z2LLMCompareFunction.add_compare_post_process_add_fn  s:    
 	&&#E4TVWWW	
 	
 	
 r   r   )r   r   r   r   r   r   rE   rF   )r   r   r   r   r   r   r   r   rl   rm   )rZ   r/   r   r   r   rD   )
r4   r5   r6   rn   rK   r   rO   rS   r   r   r   s   @r   r   r   .  s          HLZ^) ) ) ) ) ) )V   2" " " "N N N N`       r   r   )r   r   r   r   r   r   )r   r   r   r   )r8   r9   r:   r;   r   r<   )$rn   
__future__r   ro   dataclassestypingr   r   r   r   r   r	   r
   r    google.generativeai.notebook.libr   r   r   r   r   r   r|   r   LLMFnOutputRowView	CompareFnr   r*   	dataclassr,   rB   LLMFunctionInputsrX   ABCMetarD   rs   r   r&   r   r   <module>r      s     " " " " " " 



    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ? > > > > > = = = = = = : : : : : : ? ? ? ? ? ? D D D D D D ? ? ? ? ? ? 9 9 9 9 9 9 (*:*MN		4 4 4 4   0           DE E E E E	 2D8	9:"	$ kE E E EPd d d d dk d d dNf f f f f f f f f fr   