Ë
    ´Œjy×  ã                  ó8  — d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
m
Z
mZ ddl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mZ dd
lmZmZ ddlm Z m!Z!m"Z" ddlm#Z$ ddlm%Z& ddl'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl1m4Z5 ddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZH ddlImJZJmKZKmLZL ddlMmNZO ddlPm#ZQ ddlPmRZRmSZS erddlTZU ej¬                  eW«      ZXeeg eeFe f   f   eeeYgef   e eFf   ZZeeg eeFe f   f   ef   Z[ G d„ de\«      Z] G d „ d!eY«      Z^ G d"„ d#eY«      Z_	 dM	 	 	 	 	 dNd$„Z`dOd%„Za G d&„ d'eD«      ZbdPd(„Zc	 	 	 	 	 	 dQd)„Zd	 	 	 	 	 	 	 	 dRd*„Ze	 	 	 	 	 	 	 	 dSd+„Zf	 	 	 	 	 	 	 	 	 	 dTd,„Zg	 	 	 	 	 	 dUd-„Zh	 	 	 	 	 	 dVd.„Zi	 	 	 	 	 	 dWd/„Zj	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dXd0„Zk	 	 	 	 	 	 	 	 	 	 dYd1„Zl	 	 	 	 	 	 	 	 	 	 	 	 	 	 dZd2„Zmddddd3œ	 	 	 	 	 	 	 	 	 	 	 	 	 d[d4„Zndddd5œ	 	 	 	 	 	 	 	 	 	 	 	 	 d\d6„Zodd7œ	 	 	 	 	 	 	 	 	 d]d8„Zpdddd5œ	 	 	 	 	 	 	 	 	 	 	 	 	 d^d9„Zqdddd5œ	 	 	 	 	 	 	 	 	 	 	 	 	 d\d:„Zrdd7œ	 	 	 	 	 	 	 	 	 d]d;„Zs	 	 	 d_	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d`d<„Zt G d=„ d>eDd?¬@«      Zuejì                   G dA„ dB«      «       ZwdadC„ZxdbdD„ZydEZzdddFddd?ddGœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dcdH„Z{dddFddd?ddGœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dcdI„Z|dJZ}e}e|_         e}jý                  dKdL«      e{_         y)dz>Utilities for running language models or Chains over datasets.é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚUnionÚcast)Úwarn_deprecated)Ú	Callbacks)ÚBaseLanguageModel)ÚBaseMessageÚmessages_from_dict)Ú
ChatResultÚ	LLMResult)ÚRunnableÚRunnableConfigÚRunnableLambda©Úconfig)Úutils)ÚEvaluatorCallbackHandlerÚwait_for_all_evaluators)ÚLangChainTracer)ÚClient)Úget_git_infoÚget_langchain_env_var_metadata)ÚEvaluationResultÚRunEvaluator)Úrun_evaluator)Úas_runnableÚis_traceable_function)ÚDatasetÚDataTypeÚExampleÚRunÚTracerSession)ÚLangSmithError)Ú	HTTPError)Ú	TypedDict)ÚChain)Úload_evaluator)ÚEvaluatorTypeÚPairwiseStringEvaluatorÚStringEvaluator)Ú
evaluation)Úname_generationÚprogressc                  ó   — e Zd ZdZy)ÚInputFormatErrorz(Raised when the input format is invalid.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úq/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/smith/evaluation/runner_utils.pyr5   r5   K   s   „ Ú2r;   r5   c                  ó$   — e Zd ZdZ	 	 dd„Zdd„Zy)Ú
TestResultz1A dictionary of the results of a single test run.c                óÎ   — | j                  «       }|j                  D �cg c]  }|j                  d«      s|dv r|‘Œ }}|j                  d¬«      j	                  |d¬«      S c c}w )zÿReturn quantiles for the feedback scores.

        This method calculates and prints the quantiles for the feedback scores
        across all feedback keys.

        Returns:
            A DataFrame containing the quantiles for each feedback key.
        )úinputs.úoutputs.Ú	reference>   ÚinputÚoutputÚall)Úincludeé   )Úaxis)Úto_dataframeÚcolumnsÚ
startswithÚdescribeÚdrop)ÚselfÚdfÚcolÚto_drops       r<   Úget_aggregate_feedbackz!TestResult.get_aggregate_feedbackU   sv   € ð ×ÑÓ ˆð —z’zó
á!�Ø�~‰~ÐBÔCØÐ)Ñ)ò Ø!ð 	ð 
ð �{‰{ 5ˆ{Ó)×.Ñ.¨w¸QÐ.Ó?Ð?ùò
s   ŸA"c           	     ó   — 	 ddl }g }g }| d   j                  «       D �]e  \  }}|d   }|j                  d«      }	t	        |	t
        «      r'|	j                  «       D �
�ci c]  \  }
}d|
› �|“Œ }}
}n	|	€i }nd|	i}i |d   j                  «       D �
�ci c]  \  }
}d	|
› �|“Œ c}}
¥|¥}d
|v rUt	        |d
   t
        «      r:|j                  |d
   j                  «       D �
�ci c]  \  }
}d|
› �|“Œ c}}
«       n|d
   |d
<   |j                  i |D �ci c]  }d|j                  › �|j                  “Œ c}¥|j                  d«      |d   |j                  d«      dœ¥«       |j                  |«       |j                  |«       �Œh  |j                  ||¬«      S # t        $ r}d}t        |«      |‚d}~ww xY wc c}}
w c c}}
w c c}}
w c c}w )z#Convert the results to a dataframe.r   NzfPandas is required to convert the results to a dataframe. to install pandas, run `pip install pandas`.ÚresultsÚfeedbackrD   rA   rC   r@   rB   z
reference.z	feedback.ÚErrorÚexecution_timeÚrun_id)ÚerrorrW   rX   )Úindex)ÚpandasÚImportErrorÚitemsÚgetÚ
isinstanceÚdictÚupdateÚkeyÚscoreÚappendÚ	DataFrame)rN   ÚpdÚeÚmsgÚindicesÚrecordsÚ
example_idÚresultrU   Úoutput_ÚkÚvrD   ÚrÚfs                  r<   rI   zTestResult.to_dataframej   s  € ð	*Ûð ˆØˆØ"& y¡/×"7Ñ"7×"9ÑˆJ˜Ø˜jÑ)ˆHØ—j‘j Ó*ˆGÜ˜'¤4Ô(Ø8?¿¹¼ÔH¹±°°1˜H Q C˜.¨!Ñ+¸�ÒHØ�Ø‘à" GÐ,�ðØ06°w±×0EÑ0EÔ0GÔHÑ0G©¨¨1�W˜Q˜C�= !Ñ#Ð0GÒHðàðˆAð ˜fÑ$Ü˜f [Ñ1´4Ô8Ø—H‘HØ9?ÀÑ9L×9RÑ9RÔ9TÔUÑ9T±°°A˜: a SÐ)¨1Ñ,Ð9TÒUõð &,¨KÑ%8�A�k‘NØ�H‰HðÙ=EÓF¹X¸˜ 1§5¡5 'Ð*¨A¯G©GÑ3¸XÑFðà#ŸZ™Z¨Ó0Ø&,Ð-=Ñ&>Ø$Ÿj™j¨Ó2ò	ôð �N‰N˜1ÔØ�N‰N˜:Ö&ð= #:ð@ ˆr�|‰|˜G¨7Ô3Ð3øôS ò 	*ð@ð ô ˜cÓ"¨Ð)ûð	*üó Iùó Iùó Vùò Gs/   ‚F ÁF9ÂF?
Ã GÄ!GÆ	F6Æ#F1Æ1F6N)Úreturnúpd.DataFrame)r6   r7   r8   r9   rR   rI   r:   r;   r<   r>   r>   R   s   „ Ù;ð@à	ó@ô*-4r;   r>   c                  ó,   ‡ — e Zd ZdZdˆ fd„Zdd„Zˆ xZS )Ú	EvalErrorz"Your architecture raised an error.c                ó(   •— t        ‰| �  dd|i|¤Ž y )NrV   r:   )ÚsuperÚ__init__)rN   rV   ÚkwargsÚ	__class__s      €r<   rx   zEvalError.__init__�   s   ø€ Ü‰ÑÑ/˜uÐ/¨Ó/r;   c                óT   — 	 | |   S # t         $ r}d|› d�}t        |«      |‚d }~ww xY w)Nz%'EvalError' object has no attribute 'Ú')ÚKeyErrorÚAttributeError)rN   Únamerg   rh   s       r<   Ú__getattr__zEvalError.__getattr__    s<   € ð	-Ø˜‘:ÐøÜò 	-Ø9¸$¸¸qÐAˆCÜ  Ó%¨1Ð,ûð	-ús   ‚ ‡	'�"¢')rV   ÚBaseExceptionry   r   rr   ÚNone)r   Ústrrr   r   )r6   r7   r8   r9   rx   r€   Ú__classcell__)rz   s   @r<   ru   ru   š   s   ø„ Ù,õ0÷-r;   ru   c                óN  ‡‡	‡
‡‡— t        | t        «      r`| Š‰j                  j                  }| j                  �7‰j                  j                  j                  }d|› d|› d|› d�}t        |«      ‚ˆfd„S t        | t        «      r| S t        | t        «      r| Š
ˆ
fd„S t        | «      r¡t        | «      rt        t        t        | «      «      Šˆfd„S 	  | «       }t        t        | «      Š	t        |t        «      r|S t        t        t        |«      «      rt        t        t        |«      «      Šˆfd
„S t        |t        «      sˆ	fd„S ‰	S | S # t        $ rN t        t        | «      }t        j                  |«      }t         j#                  d|«       t%        |«      Šˆfd	„cY S w xY w)zšForgive the user if they pass in a chain without memory instead of a chain
    factory. It's a common mistake. Raise a more helpful error message as well.a$  Cannot directly evaluate a chain with stateful memory. To evaluate this chain, pass in a chain constructor that initializes fresh memory each time it is called.  This will safegaurd against information leakage between dataset examples.
For example:

def chain_constructor():
    new_memory = z(...)
    return z*(memory=new_memory, ...)

run_on_dataset("z", chain_constructor, ...)c                 ó   •— ‰ S ©Nr:   )Úchains   €r<   Ú<lambda>z(_wrap_in_chain_factory.<locals>.<lambda>Á   s   ø€ ‘ur;   c                 ó   •— ‰ S r‡   r:   )Úlcfs   €r<   r‰   z(_wrap_in_chain_factory.<locals>.<lambda>Ç   s   ø€ ‘sr;   c                 ó   •— ‰ S r‡   r:   ©Ú	runnable_s   €r<   r‰   z(_wrap_in_chain_factory.<locals>.<lambda>Ë   ó   ø€ ™9r;   z'Wrapping function %s as RunnableLambda.c                 ó   •— ‰ S r‡   r:   )Úwrappeds   €r<   r‰   z(_wrap_in_chain_factory.<locals>.<lambda>Ô   s   ø€ ™7r;   c                 ó   •— ‰ S r‡   r:   r�   s   €r<   r‰   z(_wrap_in_chain_factory.<locals>.<lambda>Ü   r�   r;   c                 ó   •— t        ‰ «      S r‡   )r   )Úconstructors   €r<   r‰   z(_wrap_in_chain_factory.<locals>.<lambda>ß   s
   ø€ œ>¨+Ô6r;   )r_   r,   rz   r6   ÚmemoryÚ
ValueErrorr   r   Úcallabler#   r"   r   r   Ú	TypeErrorÚinspectÚ	signatureÚloggerÚinfor   )Úllm_or_chain_factoryÚdataset_nameÚchain_classÚmemory_classrh   Ú_modelÚ	user_funcÚsigrˆ   r”   r‹   rŽ   r‘   s           @@@@@r<   Ú_wrap_in_chain_factoryr¤   ¨   s”  ü€ ô Ð&¬Ô.Ø$ˆØ—o‘o×.Ñ.ˆØ×&Ñ&Ð2Ø Ÿ<™<×1Ñ1×:Ñ:ˆLð$ð %1 >ð 2Ø)˜]ð#Ø#/ .Ð0Jð
Lð ô ˜S“/Ð!ÛÐÜÐ&Ô(9Ô:Ø#Ð#ÜÐ&¬Ô1à"ˆÛÐÜÐ$Ô%Ü Ð!5Ô6Ü#¤D¬Ð3GÓ$HÓIˆIÛ$Ð$ð	#Ù)Ó+ˆFô œ8Ð%9Ó:ˆÜ�fÔ/Ô0ð ˆMÜ ¤¤h°Ó!7Ô8Ü#¤D¬°6Ó$:Ó;ˆIÛ$Ð$Ü˜&¤(Ô+ã6Ð6àÐØÐøô) ò 	#äœXÐ';Ó<ˆIÜ×#Ñ# IÓ.ˆCÜ�K‰KÐAÀ3ÔGÜ$ YÓ/ˆGÛ"Ò"ð	#ús   ÃE ÅAF$Æ#F$c                óÈ  — | sd}t        |«      ‚g }d| v r@t        | d   t        «      s&dt        | d   «      j                  › �}t        |«      ‚| d   g}nád| v rTt        | d   t
        «      rt        d„ | d   D «       «      s&dt        | d   «      j                  › �}t        |«      ‚| d   }n‰t        | «      dk(  rkt        t        | j                  «       «      «      }t        |t        «      r|g}nEt        |t
        «      rt        d„ |D «       «      r|}n d	| › �}t        |«      ‚d
| › �}t        |«      ‚t        |«      dk(  r|d   S dt        |«      › d�}t        |«      ‚)zºGet prompt from inputs.

    Args:
        inputs: The input dictionary.

    Returns:
        A string prompt.
    Raises:
        InputFormatError: If the input format is invalid.
    úInputs should not be empty.Úpromptz"Expected string for 'prompt', got Úpromptsc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‡   ©r_   rƒ   ©Ú.0Úis     r<   Ú	<genexpr>z_get_prompt.<locals>.<genexpr>û   s   è ø€ ð >
Ù(9 1ŒJ�qœ#×Ñ(9ùó   ‚z,Expected list of strings for 'prompts', got rG   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‡   rª   r«   s     r<   r®   z_get_prompt.<locals>.<genexpr>  s   è ø€ Ð.SÉ7Àa¬z¸!¼S×/AÉ7ùr¯   z)LLM Run expects string prompt input. Got z5LLM Run expects 'prompt' or 'prompts' in inputs. Got r   z)LLM Run expects single prompt input. Got z	 prompts.)r5   r_   rƒ   Útyper6   ÚlistrE   ÚlenÚnextÚiterÚvalues)Úinputsrh   r¨   Úprompt_s       r<   Ú_get_promptr¹   å   sƒ  € ñ Ø+ˆÜ˜sÓ#Ð#à€GØ�6ÑÜ˜& Ñ*¬CÔ0Ø6´t¸FÀ8Ñ<LÓ7M×7VÑ7VÐ6WÐXˆCÜ" 3Ó'Ð'Ø˜(Ñ#Ð$‰Ø	�fÑ	Ü˜& Ñ+¬TÔ2¼#ñ >
Ø(.¨yÒ(9ó>
ô ;
ðÜ˜V IÑ.Ó/×8Ñ8Ð9ð;ð ô # 3Ó'Ð'Ø˜Ñ#‰Ü	ˆV‹˜Ò	Ü”t˜FŸM™M›OÓ,Ó-ˆÜ�gœsÔ#Ø�i‰GÜ˜¤Ô&¬3Ñ.SÉ7Ó.SÔ+SØ‰Gà=¸f¸XÐFˆCÜ" 3Ó'Ð'àEÀfÀXÐNˆÜ˜sÓ#Ð#Ü
ˆ7ƒ|�qÒØ�q‰zÐØ5´c¸'³l°^À9Ð
M€CÜ
˜3Ó
Ðr;   c                  ó   — e Zd ZU dZded<   y)ÚChatModelInputzVInput for a chat model.

    Parameters:
        messages: List of chat messages.
    zlist[BaseMessage]ÚmessagesN©r6   r7   r8   r9   Ú__annotations__r:   r;   r<   r»   r»     s   … ñð  Ôr;   r»   c                ó°  — | sd}t        |«      ‚| j                  «       }d| v r|j                  d«      |d<   n3t        | «      dk(  r%t	        t        | j                  «       «      «      |d<   d|v rX|d   }t        |t        «      rt        d„ |D «       «      r|g}t        |«      dk(  rt        |d   «      |d<   |S d}t        |«      ‚d| › �}t        |«      ‚)	zÉGet Chat Messages from inputs.

    Args:
        inputs: The input dictionary.

    Returns:
        A list of chat messages.
    Raises:
        InputFormatError: If the input format is invalid.
    r¦   r¼   rC   rG   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‡   )r_   r`   r«   s     r<   r®   z _get_messages.<locals>.<genexpr>5  s   è ø€ ð 2
Ù)5 AŒJ�qœ$×©ùr¯   r   zGBatch messages not supported. Please provide a single list of messages.zMChat Run expects single List[dict] or List[List[dict]] 'messages' input. Got )r5   ÚcopyÚpopr³   r´   rµ   r¶   r_   r²   rE   r   )r·   rh   Ú
input_copyÚraw_messagess       r<   Ú_get_messagesrÅ      sü   € ñ Ø+ˆÜ˜sÓ#Ð#Ø—‘“€JØ�VÑØ(Ÿn™n¨ZÓ8ˆ
�7ÒÜ	ˆV‹˜Ò	Ü"¤4¨¯©«Ó#8Ó9ˆ
�7ÑØ�*ÑØ! 'Ñ*ˆÜ�l¤DÔ)¬cñ 2
Ù)5ó2
ô /
ð )˜>ˆLÜˆ|Ó Ò!Ü"4°\À!±_Ó"EˆJ�wÑð Ðð	,ð ô # 3Ó'Ð'ðØ�hð	 ð ô ˜3Ó
Ðr;   c                ó¶  — |rg || j                   xs i «      }t        |t        «      s@t        |t        «      rt	        d„ |D «       «      sd|› dt        |«      › d�}t        |«      ‚y y 	 t        | j                   xs i «       y # t        $ rJ 	 t        | j                   xs i «       Y y # t        $ r!}d| j                   › d�}t        |«      |‚d }~ww xY ww xY w)Nc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‡   ©r_   r   ©r¬   rh   s     r<   r®   z>_validate_example_inputs_for_language_model.<locals>.<genexpr>R  s   è ø€ ÐI¹L°S”J˜s¤K×0¹Lùr¯   z˜When using an input_mapper to prepare dataset example inputs for an LLM or chat model, the output must a single string or a list of chat messages.
Got: ú	 of type Ú.zvExample inputs do not match language model input format. Expected a dictionary with messages or a single prompt. Got: z› Please update your dataset OR provide an input_mapper to convert the example.inputs to a compatible format for the llm or chat model you wish to evaluate.)	r·   r_   rƒ   r²   rE   r±   r5   r¹   rÅ   )Úfirst_exampleÚinput_mapperÚprompt_inputrh   Úerr2s        r<   Ú+_validate_example_inputs_for_language_modelrÐ   J  sû   € ñ Ù# M×$8Ñ$8Ò$>¸BÓ?ˆÜ˜,¬Ô,Ü�|¤TÔ*ÜÑI¹LÓIÔIðð '˜ y´°lÓ1CÐ0DÀAðGð ô # 3Ó'Ð'ð Jð -ð	6Ü˜×,Ñ,Ò2°Õ3øÜò 	6ð6Ü˜m×2Ñ2Ò8°bÖ9øÜ#ò 	6ðà*×1Ñ1Ð2ðGðGð ô ' sÓ+°Ð5ûð	6úð	6ús*   Á+B Â	CÂB*Â*	CÂ3CÃCÃCc                ó:  — |r• || j                   xs i «      }t        |j                  «      j                  |«      }t	        |t
        «      sd|› dt        |«      › d�}t        |«      ‚|r+d|j                  › d|j                  «       › �}t        |«      ‚y| j                   }t        |j                  «      j                  |«      }t        |«      dk(  rt        |j                  «      dk(  ry|r+d|j                  › d|j                  «       › �}t        |«      ‚y)	z<Validate that the example inputs match the chain input keys.zvWhen using an input_mapper to prepare dataset example inputs for a chain, the mapped value must be a dictionary.
Got: rÊ   rË   zAMissing keys after loading example using input_mapper.
Expected: z. Got: rG   z³Example inputs missing expected chain input keys. Please provide an input_mapper to convert the example.inputs to a compatible format for the chain you wish to evaluate.Expected: N)
r·   ÚsetÚ
input_keysÚ
differencer_   r`   r±   r5   Úkeysr³   )rÌ   rˆ   rÍ   Úfirst_inputsÚmissing_keysrh   s         r<   Ú"_validate_example_inputs_for_chainrØ   m  sD  € ñ Ù# M×$8Ñ$8Ò$>¸BÓ?ˆÜ˜5×+Ñ+Ó,×7Ñ7¸ÓEˆÜ˜,¬Ô-ðà&˜ y´°lÓ1CÐ0DÀAðGð ô
 # 3Ó'Ð'ÙðØ$×/Ñ/Ð0°¸×8IÑ8IÓ8KÐ7LðNð ô # 3Ó'Ð'ð ð %×+Ñ+ˆÜ˜5×+Ñ+Ó,×7Ñ7¸ÓEˆÜˆ|Ó Ò!¤c¨%×*:Ñ*:Ó&;¸qÒ&@ð Ùðð #×-Ñ-Ð.ð /Ø$×)Ñ)Ó+Ð,ð	.ð ô # 3Ó'Ð'ð r;   c                óÖ   — t        |t        «      rt        | |«       y |«       }t        |t        «      rt	        | ||«       yt        |t
        «      rt        j                  d|«       yy)z9Validate that the example inputs are valid for the model.z Skipping input validation for %sN)r_   r   rÐ   r,   rØ   r   r›   Údebug)Úexampler�   rÍ   rˆ   s       r<   Ú_validate_example_inputsrÜ   •  sV   € ô Ð&Ô(9Ô:Ü3°G¸\ÕJá$Ó&ˆÜ�eœUÔ#ä.¨w¸¸|ÕLÜ˜œxÔ(Ü�L‰LÐ;¸UÕCð )r;   c           	     ó:  — |r–t        | t        «      rd\  }}d}nEd} | «       }t        |t        «      r|j                  nd}t        |t        «      r|j                  nd}t        ||||d   j                  rt        |d   j                  «      nd||«      }|S d}|S )z<Configure the evaluators to run on the results of the chain.)NNÚllmrˆ   Nr   )r_   r   r,   rÓ   Úoutput_keysÚ_load_run_evaluatorsÚoutputsr²   )	r�   Úexamplesr1   Ú	data_typeÚ
run_inputsÚrun_outputsÚrun_typerˆ   Úrun_evaluatorss	            r<   Ú_setup_evaluationrè   ©  s©   € ñ ÜÐ*Ô,=Ô>Ø&0Ñ#ˆJ˜Ø‰HàˆHÙ(Ó*ˆEÜ-7¸¼uÔ-E˜×)Ò)È4ˆJÜ/9¸%ÄÔ/G˜%×+Ò+ÈTˆKÜ-ØØØØ)1°!©×)<Ò)<ŒD�˜!‘×$Ñ$Ô%À$ØØó
ˆð Ðð ˆØÐr;   c                óò   — d }| j                   r+| j                   }|r||vrt        j                  d||«       |S |rt        |«      dk(  r|d   }|S |�$t        |«      dkD  rt        j                  d|«       |S )NzZInput key %s not in chain's specified input keys %s. Evaluation behavior may be undefined.rG   r   zªChain expects multiple input keys: %s, Evaluator is likely to fail. Evaluation behavior may be undefined. Specify an input_key in the RunEvalConfig to avoid this warning.)Ú	input_keyr›   Úwarningr³   )r   rä   rê   s      r<   Ú_determine_input_keyrì   Ç  s™   € ð €IØ×ÒØ×$Ñ$ˆ	Ù˜)¨:Ñ5Ü�N‰Nð8àØô	ð  Ðñ 
œ˜J›¨1Ò,Ø˜q‘Mˆ	ð Ðð 
Ð	¤C¨
£O°aÒ$7Ü�‰ðPð ô		
ð Ðr;   c                óò   — d }| j                   r+| j                   }|r||vrt        j                  d||«       |S |rt        |«      dk(  r|d   }|S |�$t        |«      dkD  rt        j                  d|«       |S )Nz`Prediction key %s not in chain's specified output keys %s. Evaluation behavior may be undefined.rG   r   z’Chain expects multiple output keys: %s, Evaluation behavior may be undefined. Specify a prediction_key in the RunEvalConfig to avoid this warning.)Úprediction_keyr›   rë   r³   )r   rå   rî   s      r<   Ú_determine_prediction_keyrï   â  sš   € ð €NØ×ÒØ×.Ñ.ˆÙ˜>°Ñ<Ü�N‰Nð8àØô	ð Ðñ 
œ˜[Ó)¨QÒ.Ø$ Q™ˆð Ðð 
Ð	 ¤S¨Ó%5¸Ò%9Ü�‰ð;ð ô		
ð Ðr;   c                ó¼   — | j                   r'| j                   }|r||vrd|› d|› �}t        |«      ‚|S |r$t        |«      dk(  rt        t	        |«      «      }|S d }|S )NzReference key z! not in Dataset example outputs: rG   )Úreference_keyr–   r³   r´   rµ   )r   Úexample_outputsrñ   rh   s       r<   Ú_determine_reference_keyró   ü  s‡   € ð ×ÒØ×,Ñ,ˆÙ˜}°OÑCà   ð 0%Ø%4Ð$5ð7ð ô ˜S“/Ð!ð
 Ðñ	 
œS Ó1°QÒ6ÜœT /Ó2Ó3ˆð Ðð ˆØÐr;   c           	     ó~  — t        | t        «      r| S t        | t        t        f«      r5t        | t        «      st        | «      } t	        | |¬«      }| j
                  }	nÔt        | t        j                  «      r‹d|i| j                  «       ¥}
t	        | j                  fi |
¤Ž}| j                  j
                  }	t        | t        j                  «      r`| j                  xs |}| j                  xs |}| j                  xs |}n/t        | «      rt        | «      S dt!        | «      › �}t#        |«      ‚t        |t$        «      rK|j&                  r|€d|	› d|› d�}t#        |«      ‚t(        j*                  j-                  |||||||	g¬«      }|S t        |t.        «      rd|	› d	�}t1        |«      ‚d|	› d
�}t1        |«      ‚)N)rÞ   rÞ   zUnknown evaluator type: zPMust specify reference_key in smith_eval.RunEvalConfig to use evaluator of type z) with dataset with multiple output keys: rË   )rê   rî   rñ   ÚtagszRun evaluator for zó is not implemented. PairwiseStringEvaluators compare the outputs of two different models rather than the output of a single model. Did you mean to use a StringEvaluator instead?
See: https://python.langchain.com/docs/guides/evaluation/string/z is not implemented)r_   r    r.   rƒ   r-   ÚvalueÚsmith_eval_configÚ
EvalConfigÚ
get_kwargsÚevaluator_typeÚSingleKeyEvalConfigrê   rî   rñ   r—   Úrun_evaluator_decr±   r–   r0   Úrequires_referenceÚ
smith_evalÚStringRunEvaluatorChainÚfrom_run_and_data_typer/   ÚNotImplementedError)Úeval_configÚeval_llmræ   rã   rò   rñ   rê   rî   Ú
evaluator_Úeval_type_tagry   rh   r!   s                r<   Ú_construct_run_evaluatorr    sÜ  € ô �+œ|Ô,ØÐÜ�+¤¬sÐ3Ô4Ü˜+¤}Ô5Ü'¨Ó4ˆKÜ# K°XÔ>ˆ
Ø#×)Ñ)‰Ü	�KÔ!2×!=Ñ!=Ô	>Ø˜Ð> [×%;Ñ%;Ó%=Ð>ˆÜ# K×$>Ñ$>ÑIÀ&ÑIˆ
Ø#×2Ñ2×8Ñ8ˆä�kÔ#4×#HÑ#HÔIØ#×-Ñ-Ò:°ˆIØ(×7Ñ7ÒI¸>ˆNØ'×5Ñ5ÒF¸‰MÜ	�+Ô	ä  Ó-Ð-à(¬¨kÓ):Ð(;Ð<ˆÜ˜‹oÐä�*œoÔ.Ø×(Ò(¨]Ð-Bð&Ø&3 _ð 57Ø7FÐ6GÀqðJð ô
 ˜S“/Ð!Ü"×:Ñ:×QÑQØØØØØ)Ø'Ø�ð Ró 
ˆð, Ðô 
�JÔ 7Ô	8à   ð 0Qð Qð 	ô " #Ó&Ð&ð # = /Ð1DÐEˆÜ! #Ó&Ð&r;   c                óT   — t        | |«      }t        | |«      }t        | |«      }|||fS r‡   )rì   rï   ró   )r   rä   rå   rò   rê   rî   rñ   s          r<   Ú	_get_keysr  T  s5   € ô % V¨ZÓ8€IÜ.¨v°{ÓC€NÜ,¨V°_ÓE€MØ�n mÐ3Ð3r;   c                ó†  — g }d\  }}}	| j                   s(| j                  r.t        d„ | j                  D «       «      rt        | |||«      \  }}}	| j                   D ]/  }
t	        |
| j
                  ||||	||«      }|j                  |«       Œ1 | j                  xs g }|D ]Ÿ  }t        |t        «      r|j                  |«       Œ%t        |t        «      r5|j                  t        j                  j                  ||||||	¬«      «       Œjt        |«      r|j                  t        |«      «       Œ�d|› d�}t        |«      ‚ |S )z¤
    Load run evaluators from a configuration.

    Args:
        config: Configuration for the run evaluators.

    Returns:
        A list of run evaluators.
    ©NNNc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‡   )r_   r0   )r¬   rg   s     r<   r®   z'_load_run_evaluators.<locals>.<genexpr>u  s   è ø€ ÐQÑ8P°1”
˜1œo×.Ñ8Pùr¯   )rê   rî   rñ   zUnsupported custom evaluator: z+. Expected RunEvaluator or StringEvaluator.)Ú
evaluatorsÚcustom_evaluatorsÚanyr  r  r  rd   r_   r    r0   rþ   rÿ   r   r—   rü   r–   )r   ræ   rã   rò   rä   rå   rç   rê   rî   rñ   r  r!   r  Úcustom_evaluatorrh   s                  r<   rà   rà   `  sl  € ð" €NØ/?Ñ,€Iˆ~˜}Ø×ÒØ× Ò ÜÑQ¸×8PÒ8PÓQÔQä3<ØØØØó	4
Ñ0ˆ	�> =ð ×(Ô(ˆÜ0ØØ�O‰OØØØØØØó	
ˆð 	×Ñ˜mÕ,ð )ð ×0Ñ0Ò6°BÐÛ-ÐÜÐ&¬Ô5Ø×!Ñ!Ð"2Õ3ÜÐ(¬/Ô:Ø×!Ñ!Ü×2Ñ2×IÑIØ$ØØØ'Ø#1Ø"/ð Jó õ	ô Ð&Ô'Ø×!Ñ!Ô"3Ð4DÓ"EÕFð 1Ð1AÐ0Bð C=ð >ð ô ˜S“/Ð!ð+ .ð. Ðr;   ©rõ   Ú	callbacksrÍ   Úmetadatac             ƒ  ó   K  — |�z ||«      }t        |t        «      s"t        |t        «      rAt        d„ |D «       «      r/| j	                  |t        ||xs g |xs i ¬«      ¬«      ƒ d{  –—† S d|› d�}t        |«      ‚	 t        |«      }| j	                  |t        ||xs g |xs i ¬«      ¬«      ƒ d{  –—† }	|	S 7 ŒR7 Œ# t        $ rB t        |«      }
 | j                  di |
¤dt        ||xs g |xs i ¬«      i¤Žƒ d{  –—†7  }	Y |	S w xY w­w)	aë  Asynchronously run the language model.

    Args:
        llm: The language model to run.
        inputs: The input dictionary.
        tags: Optional tags to add to the run.
        callbacks: Optional callbacks to use during the run.
        input_mapper: Optional function to map inputs to the expected format.

    Returns:
        The LLMResult or ChatResult.
    Raises:
        ValueError: If the LLM type is unsupported.
        InputFormatError: If the input format is invalid.
    Nc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‡   rÈ   rÉ   s     r<   r®   z_arun_llm.<locals>.<genexpr>Ã  ó   è ø€ ÐOÑ<N°S”J˜s¤K×0Ñ<Nùr¯   ©r  rõ   r  r   z%Input mapper returned invalid format ú3
Expected a single string or list of chat messages.r   r:   )	r_   rƒ   r²   rE   Úainvoker   r5   r¹   rÅ   )rÞ   r·   rõ   r  rÍ   r  Úprompt_or_messagesrh   r§   Ú
llm_outputÚ
llm_inputss              r<   Ú	_arun_llmr  §  sU  è ø€ ð0 ÐÙ)¨&Ó1ÐÜÐ(¬#Ô.ÜÐ)¬4Ô0ÜÑOÑ<NÓOÔOàŸ™Ø"Ü%Ø'Øš Ø%š^¨ôð %ó ÷ ð ðØ"Ð#ØBðCð 	ô
 ˜sÓ#Ð#ð
Ü˜VÓ$ˆØ47·K±KØÜ!Ø#Ø’Z˜RØ!š Rôð 5@ó 5
÷ /
ˆ
ð$ ÐðGøð"/
ùô ò 	
Ü" 6Ó*ˆ
Ø&˜3Ÿ;™;ñ 
Øñ
ä!Ø#Ø’Z˜RØ!š Rôò
÷ 
ð 
‰
ð Ðð	
üsU   ‚A'DÁ)B<Á*DÂ 5C  Â5B>Â6C  Â:DÂ>C  Ã ADÄDÄDÄDÄ
DÄD©rõ   rÍ   r  c          	   ƒ  óª  K  — |€|n ||«      }t        | t        «      r}t        |t        «      rmt        |«      dk(  r_| j                  rSt        t        |j                  «       «      «      }| j                  |t        ||xs g |xs i ¬«      ¬«      ƒ d{  –—† }|S t        |xs g ||xs i ¬«      }	| j                  ||	¬«      ƒ d{  –—† }|S 7 Œ97 Œ­w)z%Run a chain asynchronously on inputs.NrG   r  r   ©rõ   r  r  )
r_   r,   r`   r³   rÓ   r´   rµ   r¶   r  r   ©
rˆ   r·   r  rõ   rÍ   r  Úinputs_ÚvalrD   Úrunnable_configs
             r<   Ú_arun_chainr$  ë  sØ   è ø€ ð %Ð,‰f±,¸vÓ2F€Gä�5œ%Ô Ü�w¤Ô%Ü�‹L˜AÒØ×Òä”4˜Ÿ™Ó(Ó)Ó*ˆØ—}‘}ØÜ!Ø#Ø’Z˜RØ!š Rôð %ó 
÷ 
ˆð €Mô )Ø’˜ØØ’^ ô
ˆð
 —}‘} W°_�}ÓE×EˆØ€Mð
øð Fús$   ‚BCÂCÂ2CÃCÃ	CÃC)rÍ   c          
   ƒ  ó  K  — t        |t        «      rdnd}d}	 t        |t        «      r=t        || j                  xs i |d   |d   ||j	                  d«      ¬«      ƒ d{  –—† }nC |«       }t        || j                  xs i |d   |d   ||j	                  d«      ¬«      ƒ d{  –—† }|}|S 7 ŒL7 Œ
# t        $ rD}t        j                  d|| j                  | j                  |«       t        |¬	«      }Y d}~|S d}~ww xY w­w)
a˜  Asynchronously run the Chain or language model.

    Args:
        example: The example to run.
        llm_or_chain_factory: The Chain or language model constructor to run.
        tags: Optional tags to add to the run.
        callbacks: Optional callbacks to use during the run.
        input_mapper: Optional function to map the input to the expected format.

    Returns:
        A list of outputs.
    ÚLLMr,   Nrõ   r  r  r  z*%s failed for example %s with inputs %s
%s©rV   )r_   r   r  r·   r^   r$  Ú	Exceptionr›   rë   Úidru   )	rÛ   r   r�   rÍ   Úchain_or_llmrl   rD   rˆ   rg   s	            r<   Ú_arun_llm_or_chainr+    s  è ø€ ô( Ð0Ô2CÔD‰È'ð ð €Fð$ÜÐ*Ô,=Ô>Ü )Ø$Ø—‘Ò$ "Ø˜F‘^Ø  Ñ-Ø)ØŸ™ JÓ/ô!÷ ‰Fñ )Ó*ˆEÜ&ØØ—‘Ò$ "Ø˜F‘^Ø  Ñ-Ø)ØŸ™ JÓ/ô÷ ˆFð ˆð €Mð9øðùô ò $Ü�‰Ø9ØØ�J‰JØ�N‰NØô	
ô  Ô#ŒØ€Mûð$üsT   ‚DšAB2 Á!B.Á"AB2 Â%B0Â&B2 Â,DÂ.B2 Â0B2 Â2	C?Â;9C:Ã4DÃ:C?Ã?Dc               óØ  — |�t ||«      }t        |t        «      s"t        |t        «      r;t        d„ |D «       «      r)| j	                  |t        ||xs g |xs i ¬«      ¬«      }|S d|› d�}t        |«      ‚	 t        |«      }	| j	                  |	t        ||xs g |xs i ¬«      ¬«      }|S # t        $ r4 t        |«      }
 | j                  di |
¤dt        ||xs i ¬«      i¤Ž}Y |S w xY w)	aë  
    Run the language model on the example.

    Args:
        llm: The language model to run.
        inputs: The input dictionary.
        callbacks: The callbacks to use during the run.
        tags: Optional tags to add to the run.
        input_mapper: function to map to the inputs dictionary from an Example
    Returns:
        The LLMResult or ChatResult.
    Raises:
        ValueError: If the LLM type is unsupported.
        InputFormatError: If the input format is invalid.
    c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‡   rÈ   rÉ   s     r<   r®   z_run_llm.<locals>.<genexpr>g  r  r¯   r  r   z'Input mapper returned invalid format:  r  r   )r  r  r:   )	r_   rƒ   r²   rE   Úinvoker   r5   r¹   rÅ   )rÞ   r·   r  rõ   rÍ   r  r  r  rh   Úllm_promptsr  s              r<   Ú_run_llmr0  J  s-  € ð2 ÐÙ)¨&Ó1ÐÜÐ(¬#Ô.ÜÐ)¬4Ô0ÜÑOÑ<NÓOÔOà25·*±*Ø"Ü%Ø'Øš Ø%š^¨ôð 3=ó 3ˆJð@ Ðð-Ø&Ð'ØFðGð ô
 # 3Ó'Ð'ð	Ü% fÓ-ˆKØŸ™ØÜ%Ø'Øš Ø%š^¨ôð $ó ˆJð Ðøô  ò 	Ü& vÓ.ˆJØ#˜Ÿ™ñ Øñä%°	ÀHÂNÐPRÔSò‰Jð Ðð	ús   Á82B, Â,9C)Ã(C)c          	     óz  — |€|n ||«      }t        | t        «      rut        |t        «      ret        |«      dk(  rW| j                  rKt        t        |j                  «       «      «      }| j                  |t        ||xs g |xs i ¬«      ¬«      }|S t        |xs g ||xs i ¬«      }	| j                  ||	¬«      }|S )zRun a chain on inputs.rG   r  r   r  )
r_   r,   r`   r³   rÓ   r´   rµ   r¶   r.  r   r   s
             r<   Ú
_run_chainr2  Œ  sÀ   € ð %Ð,‰f±,¸vÓ2F€Gä�5œ%Ô Ü�w¤Ô%Ü�‹L˜AÒØ×Òä”4˜Ÿ™Ó(Ó)Ó*ˆØ—‘ØÜ!Ø#Ø’Z˜RØ!š Rôð ó 
ˆð €Mô )Ø’˜ØØ’^ ô
ˆð
 —‘˜g¨o�Ó>ˆØ€Mr;   c          
     ó  — t        |t        «      rdnd}d}	 t        |t        «      r5t        || j                  xs i |d   |d   ||j	                  d«      ¬«      }n; |«       }t        || j                  xs i |d   |d   ||j	                  d«      ¬«      }|}|S # t        $ rZ}t        |«      j                  }	t        j                  d|| j                  | j                  |	|«       t        |¬	«      }Y d}~|S d}~ww xY w)
a¦  
    Run the Chain or language model synchronously.

    Args:
        example: The example to run.
        llm_or_chain_factory: The Chain or language model constructor to run.
        tags: Optional tags to add to the run.
        callbacks: Optional callbacks to use during the run.

    Returns:
        Union[List[dict], List[str], List[LLMResult], List[ChatResult]]:
          The outputs of the model or chain.
    r&  r,   Nr  rõ   r  r  zC%s failed for example %s with inputs %s
Error Type: %s, Message: %sr'  )r_   r   r0  r·   r^   r2  r(  r±   r6   r›   rë   r)  ru   )
rÛ   r   r�   rÍ   r*  rl   rD   rˆ   rg   Ú
error_types
             r<   Ú_run_llm_or_chainr5  °  s  € ô* Ð0Ô2CÔD‰È'ð ð €Fð$ÜÐ*Ô,=Ô>Ü"Ø$Ø—‘Ò$ "Ø�{Ñ#Ø˜F‘^Ø)ØŸ™ JÓ/ô‰Fñ )Ó*ˆEÜØØ—‘Ò$ "Ø�{Ñ#Ø˜F‘^Ø)ØŸ™ JÓ/ôˆFð ˆð €Møô ò 
$Ü˜!“W×%Ñ%ˆ
Ü�‰ØRØØ�J‰JØ�N‰NØØô	
ô  Ô#ŒØ€Mûð
$ús   ˜BB Â	C?Â%AC:Ã:C?c           
     ó  — t        ||«      }| j                  |¬«      }t        | j                  |j                  |¬«      «      }	|	sd|› d�}
t        |
«      ‚|	D �cg c]  }|j                  sŒ|j                  ‘Œ }}|rt        |«      nd }|r|j                  «       nd }	 |xs i }t        «       }|ri |¥d|i¥}||d<   | j                  ||j                  |rd|ini |¬«      }|j                   d|j                  › �z   }t#        d|› d|› d|› d|j                   › �d¬«       ||||	fS c c}w # t        t
        t        f$ rG}d	t        |«      vr‚ t        j                  «       }d
|› d|› d|› d�}d|› d|› �}
t        |
«      |‚d }~ww xY w)N)rž   )Ú
dataset_idÚas_ofzDataset z has no example rows.ÚgitÚdataset_versionrõ   )Úreference_dataset_idÚproject_extrar  zalready exists z+
run_on_dataset(
    ...
    project_name="z - z", # Update since z already exists
)
zTest project z/ already exists. Please use a different name:

z/compare?selectedSessions=z)View the evaluation results for project 'z' at:
z

View all tests for Dataset z at:
T)Úflush)r¤   Úread_datasetr²   Úlist_examplesr)  r–   Úmodified_atÚmaxÚ	isoformatr   Úcreate_projectr*   r)   rƒ   ÚuuidÚuuid4ÚurlÚprint)Úclientrž   r�   Úproject_nameÚproject_metadatarõ   r:  Úwrapped_modelÚdatasetrâ   rh   Úexr@  Úmax_modified_atÚinferred_versionÚgit_infoÚprojectrg   ÚuidÚexample_msgÚcomparison_urls                        r<   Ú_prepare_eval_runrU  ë  s   € ô +Ð+?ÀÓN€MØ×!Ñ!¨|Ð!Ó<€Gä�F×(Ñ(°G·J±JÀoÐ(ÓVÓW€HÙØ˜˜Ð&;Ð<ˆÜ˜‹oÐÙ,4ÓG©H b¸¿»�2—>“>¨H€KÐGñ +6”c˜+Ô&¸4€OÙ6E�×0Ñ0Ô2È4Ðð%Ø+Ò1¨rÐÜ“>ˆÙð Ø"ð à�xñ Ðð
 /?ÐÐ*Ñ+Ø×'Ñ'ØØ!(§¡Ù,0˜6 4™.°bØ%ð	 (ó 
ˆð* —[‘[Ð%?ÀÇ
Á
¸|Ð#LÑL€NÜ	Ø
3°L°>ð BØÐ ð !&Ø&2 ^°6¸'¿+¹+¸ð	Hð õ	ð ˜' 7¨HÐ4Ð4ùòY Høô, ”z¤>Ð2ò %Ø¤C¨£FÑ*ØÜ�j‰j‹lˆðð  �.  C 5Ð(:¸<¸.ð Iðˆð ˜L˜>ð *Ø�-ð!ð 	ô ˜‹o 1Ð$ûð%ús&   ÁD+Á.D+Â"AD0 Ä0FÅAFÆFc                  ó0   — e Zd ZU dZded<   ded<   ded<   y)	Ú
_RowResultz5A dictionary of the results for a single example row.z Optional[list[EvaluationResult]]rU   zOptional[float]rW   úOptional[str]rX   Nr½   r:   r;   r<   rW  rW  *  s   … Ù?à.Ó.Ø#Ó#ØÔr;   rW  F)Útotalc                  óì   — e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   dZded<   	 	 	 	 	 	 dd„Zdd„Zdd„Z	 	 	 	 dd„Z		 d	 	 	 	 	 dd„Z
e	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zy)Ú_DatasetRunContainerz3A container to help manage the state of a eval run.r   rH  r(   rQ  ÚMCFrK  úlist[Example]râ   zlist[RunnableConfig]ÚconfigsNz6Optional[list[smith_eval_config.BATCH_EVALUATOR_LIKE]]Úbatch_evaluatorsc           	     ó`  — i }t        | j                  |«      D �]  \  }}t        t        |j	                  t        |j                  «      i «      «      }|j                  |j	                  dg «      |j	                  d«      |j	                  d«      dœ|t        |j                  «      <   t        |t        «      r&|j                  |t        |j                  «         d<   n||t        |j                  «         d<   |j                  sŒí|j                  |t        |j                  «         d<   �Œ |S )NrU   rW   rX   )rC   rU   rW   rX   rV   rD   rB   )Úziprâ   r   rW  r^   rƒ   r)  r·   r_   ru   rV   rá   )rN   Úbatch_resultsÚall_eval_resultsrT   rÛ   rD   Ú
row_results          r<   Ú_merge_test_outputsz(_DatasetRunContainer._merge_test_outputs=  sï   € ð
 ˆÜ" 4§=¡=°-×@‰OˆG�VÜœjÐ*:×*>Ñ*>¼sÀ7Ç:Á:»ÐPRÓ*SÓTˆJà Ÿ™Ø&ŸN™N¨:°rÓ:Ø",§.¡.Ð1AÓ"BØ$Ÿ.™.¨Ó2ñ	(ˆG”C˜Ÿ
™
“OÑ$ô ˜&¤)Ô,Ø4:·L±L�œ˜GŸJ™J›Ñ(¨Ò1à5;�œ˜GŸJ™J›Ñ(¨Ñ2Ø�‹Ø8?¿¹�œ˜GŸJ™J›Ñ(¨Ó5ð  Að ˆr;   c           	     óŒ  — | j                   }|sg S | j                  D �cg c]  }|t        |j                  «         ‘Œ }}g }t        j
                  j                  «       5 }|D ]•  }	  ||| j                  «      }t        |t        «      r|j                  «       }|j                  t        t        |«      «        |j                  | j                  j                  fi |¤d | j                  j                  dœ¤Ž Œ— 	 d d d «       |S c c}w # t         $ r" t"        j%                  dt'        |«      «       Y ŒÒw xY w# 1 sw Y   |S xY w)N)rX   Ú
project_idz Error running batch evaluator %s)r_  râ   rƒ   r)  Ú
concurrentÚfuturesÚThreadPoolExecutorr_   r   r`   rd   r   ÚsubmitrH  Úcreate_feedbackrQ  r(  r›   Ú	exceptionÚrepr)	rN   Úrunsr  rÛ   Ú	runs_listÚaggregate_feedbackÚexecutorÚ	evaluatorrl   s	            r<   Ú_run_batch_evaluatorsz*_DatasetRunContainer._run_batch_evaluatorsS  s  € Ø×*Ñ*ˆ
ÙØˆIØ:>¿-º-ÓH¹-¨w�Tœ#˜gŸj™j›/Ó*¸-ˆ	ÐHØÐÜ×Ñ×2Ñ2Ô4¸Û'�	ðÙ& y°$·-±-Ó@�FÜ! &Ô*:Ô;Ø!'§¡£˜Ø&×-Ñ-¬d´4¸Ó.@ÔAØ#�H—O‘OØŸ™×3Ñ3ñà ðð  $Ø#'§<¡<§?¡?õ	ñ (÷ 5ð" "Ð!ùò' Iøô !ò Ü×$Ñ$Ø:¼DÀ»Oöðú÷ 5ð" "Ð!ús6   ŸDÁ D9Á'BDÃ9D9Ä(D6Ä3D9Ä5D6Ä6D9Ä9Ec                óä  — i }i }| j                   D �]>  }t        t        |d   «      D �]$  }t        |t        «      rT|j
                  }|j                  «       D ]4  \  \  }}}|j                  t        |«      i «      j                  d|i«       Œ6 Œht        |t        «      sŒy|j                  }	|	r3|	j                  r'|	j                  |	j                  z
  j                  «       nd }
|	rt        |	j                  «      nd }|j                  t        |j                   «      i «      j                  |
||	dœ«       |	|t        |j                   «      <   �Œ' �ŒA t        t"        t        t$        f   |«      |fS )Nr  rU   )rW   rX   Úrun)r^  r   r²   r_   r   Úlogged_eval_resultsr]   Ú
setdefaultrƒ   ra   r   Ú
latest_runÚend_timeÚ
start_timeÚtotal_secondsr)  rk   r`   rW  )rN   rc  Úall_runsÚcÚcallbackÚeval_resultsÚ_rk   ro   rv  rW   rX   s               r<   Ú_collect_metricsz%_DatasetRunContainer._collect_metricsl  sJ  € Ø!#ÐØˆØ—•ˆAÜ ¤ q¨¡~×6�Ü˜hÔ(@ÔAØ#+×#?Ñ#?�LØ.:×.@Ñ.@Ö.BÑ*™˜˜J¨Ø(×3Ñ3´C¸
³OÀRÓH×OÑOØ'¨˜Oõñ /Cô   ¬/Õ:Ø"×-Ñ-�Cñ  3§<¢<ð Ÿ™¨¯©Ñ6×EÑEÔGà!ð #ñ
 -0œS §¡œ[°T�FØ$×/Ñ/´°H×4GÑ4GÓ0HÈ"ÓM×TÑTà.<Ø&,Ø#&ñôð :=�HœS ×!4Ñ!4Ó5Ó6ò- 7ð ô0 ”Dœœj˜Ñ)Ð+;Ó<¸hÐFÐFr;   c                ó6  — t         j                  d«       t        «        | j                  «       \  }}d }| j                  r&t         j                  d«       | j                  |«      }| j                  ||«      }t        | j                  j                  ||¬«      S )Nz#Waiting for evaluators to complete.zRunning session evaluators.)rI  rT   Úaggregate_metrics)
r›   rœ   r   r‚  r_  rt  re  r>   rQ  r   )rN   rb  rc  r}  rq  rT   s         r<   Ú_collect_test_resultsz*_DatasetRunContainer._collect_test_results‰  s‹   € ô 	�‰Ð9Ô:ÜÔ!Ø%)×%:Ñ%:Ó%<Ñ"Ð˜(Ø!ÐØ× Ò Ü�K‰KÐ5Ô6Ø!%×!;Ñ!;¸HÓ!EÐØ×*Ñ*¨=Ð:JÓKˆÜØŸ™×*Ñ*ØØ0ô
ð 	
r;   c                óÄ  — | j                  |«      }|r	 |j                  «       }t        |«       	 | j                  j                  | j                  j                  t        j                  t        j                  «      ¬«       |S # t        $ r"}t        j                  d|d¬«       Y d }~Œ{d }~ww xY w# t        $ r#}t        j                  d|d¬«       Y d }~|S d }~ww xY w)Nz&Failed to print aggregate feedback: %sT)Úexc_info)rz  zFailed to close project: %s)r…  rR   Ú_display_aggregate_resultsr(  r›   rÚ   rH  Úupdate_projectrQ  r)  r   Únowr   Úutc)rN   rb  ÚverboserT   Úagg_feedbackrg   s         r<   Úfinishz_DatasetRunContainer.finish›  sË   € ð
 ×,Ñ,¨]Ó;ˆÙðYØ&×=Ñ=Ó?�Ü*¨<Ô8ð	Jà�K‰K×&Ñ&Ø—‘—‘Ü!Ÿ™¤h§l¡lÓ3ð 'ô ð ˆøô ò YÜ—‘ÐEÀqÐSW�×XÑXûðYûô ò 	JÜ�L‰LÐ6¸ÀDˆL×IÐIØˆûð	Jús/   •B ±AB3 Â	B0ÂB+Â+B0Â3	CÂ<CÃCc                ó,  — |xs t        j                  «       }|
r|	si }	|	j                  d|
i«       t        |||||	||¬«      \  }}}}|xs g }|j                  j                  d«      xs i j                  «       D ]  \  }}|j                  d|› d|› �«       Œ d|j                  d   i}|
r|
|d<   t        |«      }t        ||||j                  xs t        j                  «      }t        |d   ||«       t        j                  t!        |«      «      }|D �cg c]O  }t#        t%        |j&                  ||j(                  ¬«      t+        |xs g ||j(                  d¬	«      |g|||¬
«      ‘ŒQ }} | ||||||r|j,                  ¬«      S d ¬«      S c c}w )NÚrevision_id)rJ  rõ   r:  r9  zgit:Ú=r:  r   )rI  rH  rk   )r  rH  rk   Úmax_concurrency)r  rõ   r’  r  )rH  rQ  rK  râ   r^  r_  )r2   Úrandom_namera   rU  r  r^   r]   rd   r¤   rè   rã   r%   ÚkvrÜ   r3   ÚProgressBarCallbackr³   r   r   r   r)  r   r_  )ÚclsrH  rž   r�   rI  r1   rõ   rÍ   Úconcurrency_levelrJ  r�  r:  rK  rQ  rL  râ   rn   ro   Úrun_metadatarç   Úprogress_barrÛ   r^  s                          r<   Úpreparez_DatasetRunContainer.prepare±  sß  € ð $ÒD¤×'BÑ'BÓ'DˆÙÙ#Ø#%Ð Ø×#Ñ# ]°KÐ$@ÔAÜ4EØØØ ØØ-ØØ+ô5
Ñ1ˆ�w ¨ð Šz�rˆØ×%Ñ%×)Ñ)¨%Ó0Ò6°B×=Ñ=Ö?‰DˆAˆqØ�K‰K˜$˜q˜c  1 #˜Õ'ð @à)¨7×+;Ñ+;Ð<MÑ+NÐOˆÙØ*5ˆL˜Ñ'Ü.Ð/CÓDˆÜ*ØØØØ×ÑÒ,¤§¡ó	
ˆô 	! ¨!¡¨m¸\ÔJÜ×3Ñ3´C¸³MÓBˆñ* $ó)
ñ( $�ô' ä#Ø%,§\¡\Ø%Ø#*§:¡:ôô
 -Ø#1Ò#7°RØ%Ø#*§:¡:Ø()ô	ð !ðð Ø 1Ø%ö#ð& $ð) 	ð 
ñ, ØØØ'ØØÙ<F˜Z×8Ñ8ô
ð 	
ð MQô
ð 	
ùò-
s   ÄAF)rb  r²   rc  zdict[str, _RowResult]rr   r`   )ro  zdict[str, Run]rr   z
list[dict])rr   z,tuple[dict[str, _RowResult], dict[str, Run]])rb  z-list[Union[dict, str, LLMResult, ChatResult]]rr   r>   )F)rb  r²   rŒ  Úboolrr   r>   )NNNé   NNN)rH  r   rž   rƒ   r�   ÚMODEL_OR_CHAIN_FACTORYrI  rX  r1   ú"Optional[smith_eval.RunEvalConfig]rõ   úOptional[list[str]]rÍ   úOptional[Callable[[dict], Any]]r—  ÚintrJ  úOptional[dict[str, Any]]r�  rX  r:  úOptional[Union[datetime, str]]rr   r[  )r6   r7   r8   r9   r¾   r_  re  rt  r‚  r…  rŽ  Úclassmethodrš  r:   r;   r<   r[  r[  2  sF  … á=àƒNØÓØÓØÓØ!Ó!ØOSÐÐLÓSðàðð 0ðð 
ó	ó,"ó2Gð:
àDð
ð 
ó
ð* ðàðð ðð 
ó	ð, ð :>Ø$(Ø8<Ø!"Ø59Ø%)Ø:>ðH
àðH
ð ðH
ð 5ð	H
ð
 $ðH
ð 7ðH
ð "ðH
ð 6ðH
ð ðH
ð 3ðH
ð #ðH
ð 8ðH
ð 
òH
ó ñH
r;   r[  c                 ó~   — 	 ddl m}   | «       } | «       d uxr dt        t        |«      «      v S # t        $ r Y yw xY w)Nr   )Úget_ipythonÚzmqshellF)ÚIPython.core.getipythonr¦  rƒ   r±   r\   )r¦  Úress     r<   Ú_is_jupyter_environmentrª  ý  sB   € ðÝ7á‹mˆÙ‹} DÐ(ÒI¨Z¼3¼tÀC»y»>Ð-IÐIøÜò Ùðús   ‚-0 °	<»<c                óª   — t        «       rddlm}m}  | |d«      «        || «       y | j	                  d„ d¬«      }t        d«       t        |«       y )Nr   )ÚHTMLÚdisplayz<h3>Experiment Results:</h3>c                ó
   — | d›S )Nz.2fr:   )Úxs    r<   r‰   z,_display_aggregate_results.<locals>.<lambda>  s
   €  a¨ W :r;   Úright)Úfloat_formatÚjustifyz
 Experiment Results:)rª  ÚIPython.displayr¬  r­  Ú	to_stringrG  )Úaggregate_resultsr¬  r­  Úformatted_strings       r<   rˆ  rˆ    sR   € ÜÔ ß1á‘Ð3Ó4Ô5ÙÐ!Õ"à,×6Ñ6Ù-Øð 7ó 
Ðô 	Ð&Ô'ÜÐÕr;   aè  The input_mapper argument is deprecated and will be removed in a future release. Please add a  RunnableLambda to your chain to map inputs to the expected format instead. Example:
def construct_chain():
    my_chain = ...
    input_mapper = {'other_key': 'MyOtherInput', 'my_input_key': x}
    return input_mapper | my_chain
run_on_dataset(..., llm_or_chain_factory=construct_chain)
(See https://api.python.langchain.com/en/latest/schema/langchain.schema.runnable.base.RunnableLambda.html)rœ  )r1   r:  r—  rI  rJ  rŒ  r�  c             ‹  ó”  K  — |
j                  dd «      }|rt        dt        d¬«       |	€t        «       j	                  d«      }	|
j                  dd «      }|rt        ddd¬«       |
r t        dd	|
j                  «       › d
�d¬«       | xs
 t        «       } t        j                  | |||||||||	|¬«      }t        j                  |j                  d   j	                  d«      gt        t        j                  t        |j                   |¬«      |j"                  |j                  «      ¢­Ž ƒ d {  –—† }|j%                  ||¬«      S 7 Œ­w)NrÍ   ú0.0.305T©ÚmessageÚpendingr�  rõ   ú0.1.9úqThe tags argument is deprecated and will be removed in a future release. Please specify project_metadata instead.úPThe following arguments are deprecated and will be removed in a future release: rË   ©rº  Úremoval©rJ  r�  r:  r   r’  ©r�   rÍ   ©rŒ  )rÂ   r   Ú_INPUT_MAPPER_DEP_WARNINGr   r^   rÕ   r   r[  rš  Úrunnable_utilsÚgather_with_concurrencyr^  ÚmapÚ	functoolsÚpartialr+  rK  râ   rŽ  )rH  rž   r�   r1   r:  r—  rI  rJ  rŒ  r�  ry   rÍ   rõ   Ú	containerrb  s                  r<   Úarun_on_datasetrË  '  sd  è ø€ ð —:‘:˜n¨dÓ3€LÙÜ˜	Ô+DÈdÕSØÐÜ4Ó6×:Ñ:¸=ÓIˆØ�:‰:�f˜dÓ#€DÙÜØðUàõ		
ñ ÜØð4à�{‰{‹}ˆo˜Qð ð õ	
ð Ò”v“x€FÜ$×,Ñ,ØØØØØØØØØ)ØØ'ð -ó €Iô )×@Ñ@Ø×Ñ˜!Ñ× Ñ Ð!2Ó3ðä	Ü×ÑÜ"Ø%.×%<Ñ%<Ø)ôð
 ×ÑØ×Ñó

ò÷ €Mð ×Ñ˜M°7ÐÓ;Ð;ðús   ‚D,EÄ.EÄ/Ec               óN  — |
j                  dd «      }|rt        dt        d¬«       |
j                  dd «      }|rt        ddd¬«       |	€t        «       j	                  d«      }	|
r t        dd	|
j                  «       › d
�d¬«       | xs
 t        «       } t        j                  | |||||||||	|¬«      }|dk(  rJt        |j                  |j                  «      D ��cg c]  \  }}t        |||j                  |¬«      ‘Œ  }}}nt        j                  |j                  d   «      5 }t!        |j#                  t%        j&                  t        |j                  |¬«      |j                  |j                  «      «      }d d d «       |j)                  |¬«      S c c}}w # 1 sw Y   Œ"xY w)NrÍ   r¸  Tr¹  rõ   r¼  r½  r�  r¾  rË   r¿  rÁ  r   rÂ  rÃ  )rÂ   r   rÄ  r   r^   rÕ   r   r[  rš  ra  râ   r^  r5  rK  r#  Úget_executor_for_configr²   rÇ  rÈ  rÉ  rŽ  )rH  rž   r�   r1   r:  r—  rI  rJ  rŒ  r�  ry   rÍ   rõ   rÊ  rÛ   r   rb  rr  s                     r<   Úrun_on_datasetrÎ  h  sÅ  € ð —:‘:˜n¨dÓ3€LÙÜ˜	Ô+DÈdÕSØ�:‰:�f˜dÓ#€DÙÜØðUàõ		
ð ÐÜ4Ó6×:Ñ:¸=ÓIˆáÜØð4à�{‰{‹}ˆo˜Qð ð õ	
ð Ò”v“x€FÜ$×,Ñ,ØØØØØØØØØ)ØØ'ð -ó €Ið ˜AÒô $' y×'9Ñ'9¸9×;LÑ;LÔ#Mô
ñ $N‘�˜ô ØØØ%.×%<Ñ%<Ø)ö	ð $Nð 	ò 
ô ×4Ñ4°Y×5FÑ5FÀqÑ5IÔJÈhÜ Ø—‘Ü×%Ñ%Ü)Ø-6×-DÑ-DØ%1ôð
 ×&Ñ&Ø×%Ñ%óó
ˆM÷ Kð ×Ñ˜M°7ÐÓ;Ð;ùó/
÷ KÐJús   Ã#FÄ%AFÆF$a1  
Run the Chain or language model on a dataset and store traces
to the specified project name.

Args:
    dataset_name: Name of the dataset to run the chain on.
    llm_or_chain_factory: Language model or Chain constructor to run
        over the dataset. The Chain constructor is used to permit
        independent calls on each example without carrying over state.
    evaluation: Configuration for evaluators to run on the
        results of the chain
    concurrency_level: The number of async tasks to run concurrently.
    project_name: Name of the project to store the traces in.
        Defaults to {dataset_name}-{chain class name}-{datetime}.
    project_metadata: Optional metadata to add to the project.
        Useful for storing information the test variant.
        (prompt version, model version, etc.)
    client: LangSmith client to use to access the dataset and to
        log feedback and run traces.
    verbose: Whether to print progress.
    tags: Tags to add to each run in the project.
    revision_id: Optional revision identifier to assign this test run to
        track the performance of different versions of your system.
Returns:
    A dictionary containing the run's project name and the resulting model outputs.


For the (usually faster) async version of this function, see :func:`arun_on_dataset`.

Examples
--------

.. code-block:: python

    from langsmith import Client
    from langchain_openai import ChatOpenAI
    from langchain.chains import LLMChain
    from langchain.smith import smith_eval.RunEvalConfig, run_on_dataset

    # Chains may have memory. Passing in a constructor function lets the
    # evaluation framework avoid cross-contamination between runs.
    def construct_chain():
        llm = ChatOpenAI(temperature=0)
        chain = LLMChain.from_string(
            llm,
            "What's the answer to {your_input_key}"
        )
        return chain

    # Load off-the-shelf evaluators via config or the EvaluatorType (string or enum)
    evaluation_config = smith_eval.RunEvalConfig(
        evaluators=[
            "qa",  # "Correctness" against a reference answer
            "embedding_distance",
            smith_eval.RunEvalConfig.Criteria("helpfulness"),
            smith_eval.RunEvalConfig.Criteria({
                "fifth-grader-score": "Do you have to be smarter than a fifth grader to answer this question?"
            }),
        ]
    )

    client = Client()
    run_on_dataset(
        client,
        dataset_name="<my_dataset_name>",
        llm_or_chain_factory=construct_chain,
        evaluation=evaluation_config,
    )

You can also create custom evaluators by subclassing the
:class:`StringEvaluator <langchain.evaluation.schema.StringEvaluator>`
or LangSmith's `RunEvaluator` classes.

.. code-block:: python

    from typing import Optional
    from langchain.evaluation import StringEvaluator

    class MyStringEvaluator(StringEvaluator):

        @property
        def requires_input(self) -> bool:
            return False

        @property
        def requires_reference(self) -> bool:
            return True

        @property
        def evaluation_name(self) -> str:
            return "exact_match"

        def _evaluate_strings(self, prediction, reference=None, input=None, **kwargs) -> dict:
            return {"score": prediction == reference}


    evaluation_config = smith_eval.RunEvalConfig(
        custom_evaluators = [MyStringEvaluator()],
    )

    run_on_dataset(
        client,
        dataset_name="<my_dataset_name>",
        llm_or_chain_factory=construct_chain,
        evaluation=evaluation_config,
    )
zrun_on_dataset(zawait arun_on_dataset()z<my_dataset>)r�   r�  rž   rƒ   rr   r\  )r·   údict[str, Any]rr   rƒ   )r·   rÏ  rr   r`   )rÌ   r&   rÍ   r   rr   r‚   )rÌ   r&   rˆ   r,   rÍ   r   rr   r‚   )rÛ   r&   r�   r\  rÍ   r   rr   r‚   )
r�   r\  râ   r]  r1   rž  rã   r%   rr   zOptional[list[RunEvaluator]])r   úsmith_eval.RunEvalConfigrä   rŸ  rr   rX  )r   rÐ  rå   rŸ  rr   rX  )r   rÐ  rò   rŸ  rr   rX  )r  zYUnion[smith_eval_config.SINGLE_EVAL_CONFIG_TYPE, smith_eval_config.CUSTOM_EVALUATOR_TYPE]r  zOptional[BaseLanguageModel]ræ   rƒ   rã   r%   rò   rŸ  rñ   rX  rê   rX  rî   rX  rr   r    )
r   rÐ  rä   rŸ  rå   rŸ  rò   rŸ  rr   z2tuple[Optional[str], Optional[str], Optional[str]])r   rÐ  ræ   rƒ   rã   r%   rò   rŸ  rä   rŸ  rå   rŸ  rr   zlist[RunEvaluator])rÞ   r   r·   rÏ  rõ   rŸ  r  r   rÍ   r   r  r¢  rr   úUnion[str, BaseMessage])rˆ   zUnion[Chain, Runnable]r·   rÏ  r  r   rõ   rŸ  rÍ   r   r  r¢  rr   zUnion[dict, str])
rÛ   r&   r   r   r�   r\  rÍ   r   rr   z'Union[dict, str, LLMResult, ChatResult])rÞ   r   r·   rÏ  r  r   rõ   rŸ  rÍ   r   r  r¢  rr   rÑ  r
  )rH  r   rž   rƒ   r�   r�  rI  rƒ   rJ  r¢  rõ   rŸ  r:  zOptional[Union[str, datetime]]rr   z1tuple[MCF, TracerSession, Dataset, list[Example]])rr   r›  )rµ  rs   rr   r‚   )rH  zOptional[Client]rž   rƒ   r�   r�  r1   rž  r:  r£  r—  r¡  rI  rX  rJ  r¢  rŒ  r›  r�  rX  ry   r   rr   rÏ  )r9   Ú
__future__r   Úconcurrent.futuresrh  ÚdataclassesrÈ  r™   ÚloggingrD  r   r   Útypingr   r   r   r	   r
   r   Úlangchain_core._apir   Úlangchain_core.callbacksr   Úlangchain_core.language_modelsr   Úlangchain_core.messagesr   r   Úlangchain_core.outputsr   r   Úlangchain_core.runnablesr   r   r   r   r#  r   rÅ  Ú!langchain_core.tracers.evaluationr   r   Ú langchain_core.tracers.langchainr   Úlangsmith.clientr   Úlangsmith.envr   r   Úlangsmith.evaluationr   r    r!   rü   Úlangsmith.run_helpersr"   r#   Úlangsmith.schemasr$   r%   r&   r'   r(   Úlangsmith.utilsr)   Úrequestsr*   Útyping_extensionsr+   Úlangchain.chains.baser,   Úlangchain.evaluation.loadingr-   Úlangchain.evaluation.schemar.   r/   r0   Úlangchain.smithr1   rþ   Úlangchain.smith.evaluationr÷   r2   r3   r[   rf   Ú	getLoggerr6   r›   r`   r�  r\  r(  r5   r>   ru   r¤   r¹   r»   rÅ   rÐ   rØ   rÜ   rè   rì   rï   ró   r  r  rà   r  r$  r+  r0  r2  r5  rU  rW  Ú	dataclassr[  rª  rˆ  rÄ  rË  rÎ  Ú_RUN_ON_DATASET_DOCSTRINGÚreplacer:   r;   r<   Ú<module>rð     s+  ðÙ Då "ã Û Û Û Û Û ß '÷÷ õ 0Ý .Ý <ß Cß 8ß MÑ MÝ >Ý <÷õ =Ý #ß F÷õ÷ Eß LÕ LÝ *Ý Ý 'å 'Ý 7÷ñ õ
 5Ý Bß @áÛà	ˆ×	Ñ	˜8Ó	$€àØˆR��u˜h�Ñ'Ð'Ñ(ØØˆdˆV�Sˆ[ÑØØ	ð	ñÐ ð ˆH�R˜˜u h˜Ñ/Ð/Ñ0Ð2CÐCÑD€ô3�yô 3ôE4�ô E4ôP-�ô -ð  'ð: Ø0ð: àð: ð 	ó: óz. ôb �Yô  ó& ðT 6Øð 6à1ð 6ð 
ó 6ðF%(Øð%(àð%(ð 2ð%(ð 
ó	%(ðPDØðDàðDð 2ðDð 
ó	Dð(Øðàðð 3ðð ð	ð
 "óð<Ø$ðà#ðð óð6Ø$ðà$ðð óð4Ø$ðà(ðð óð&BððBð
 *ðBð ðBð ðBð )ðBð !ðBð ðBð "ðBð óBðJ	4Ø$ð	4à#ð	4ð %ð	4ð )ð		4ð
 8ó	4ðAØ$ðAàðAð ðAð )ð	Að
 $ðAð %ðAð óAðV !%ØØ48Ø)-ñAØ	ðAàðAð ð	Að
 ðAð 2ðAð 'ðAð óAðR !%Ø48Ø)-ñ!Ø!ð!àð!ð ð!ð
 ð!ð 2ð!ð 'ð!ð ó!ðR 59ñ5Øð5àð5ð ð	5ð
 2ð5ð -ó5ð@ !%Ø48Ø)-ñ?Ø	ð?àð?ð ð?ð
 ð?ð 2ð?ð 'ð?ð ó?ðN !%Ø48Ø)-ñ!Ø!ð!àð!ð ð!ð
 ð!ð 2ð!ð 'ð!ð ó!ðR 59ñ8Øð8àð8ð ð	8ð
 2ð8ð -ó8ð@ 26Ø $Ø6:ð<5Øð<5àð<5ð 1ð<5ð ð	<5ð
 /ð<5ð ð<5ð 4ð<5ð 7ó<5ô~� %õ ð ×Ñ÷G
ð G
ó ðG
óTó ð 
:ð ð, 6:Ø6:ØØ"&Ø15ØØ!%ñ><Øð><àð><ð 1ð><ð
 3ð><ð 4ð><ð ð><ð  ð><ð /ð><ð ð><ð ð><ð ð><ð ó><ðL 6:Ø6:ØØ"&Ø15ØØ!%ñJ<ØðJ<àðJ<ð 1ðJ<ð
 3ðJ<ð 4ðJ<ð ðJ<ð  ðJ<ð /ðJ<ð ðJ<ð ðJ<ð ðJ<ð óJ<ðZjÐ ðV 3€Ô Ø3×;Ñ;ØØó€Õ r;   