ó
    lQj´Á  ã                  óö  • S SK Jr  S SKrS SKJs  Jr  S SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SKJr  S SKJr  S SKJrJrJ r J!r!J"r"J#r#J$r$  S SK%J&r&  S SK'J(r)  S S	K'J*r+  S S
K'J,r-  S SK'J.r.  S SK'J.r/  S SK'J0r1  S SK'J2r3  S SK4J5r5  S SK6J7r7  S SK8J9r9   S SK:r:\:Rv                  Rx                  r=\R~                  " \@5      rA\R„                  " S5      rC\!" S5      rD\!" S5      rES=S jrF\$    S>S j5       rG\$SSSSSSSSSS.	                   S?S jj5       rGS@S jrGSAS jrHSBS jrI      SCS jrJ SD       SES jjrK SD       SFS jjrL        SGS  jrMSHS" jrN\!" S#\ \O   S$9rPSIS% jrQ " S& S!5      rR " S' S(5      rS\
R¨                  \ \S      " S)SS*9rU " S+ S,\&S-S.9rV            SJS/ jrW            SKS0 jrX            SKS1 jrY\GrZSLS2 jr[SMS3 jr\SNS4 jr] SDSSS5.           SOS6 jjjr^\	R¾                  S7S8.   SPS9 jj5       r`SQS: jraSRS; jrb\RÆ                  SSS< j5       rdg! \> a     " S S\<5      r= GN¨f = f)Té    )ÚannotationsN)Ú	GeneratorÚSequence)ÚFuture)ÚPath)ÚAnyÚCallableÚOptionalÚTypeVarÚUnionÚcastÚoverload)Ú	TypedDict)Úclient)Úenv)Úrun_helpers)Ú	run_trees)Úschemas)Úutils)Ú_orjson)Ú
dumps_json)ÚID_TYPEc                  ó   • \ rS rSrSrg)ÚSkipExceptioné1   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/langsmith/testing/_internal.pyr   r   1   s   † Úr"   r   z$6ba7b810-9dad-11d1-80b4-00c04fd430c8ÚTÚUc                ó|   • [        U 5      n[        R                  " UR                  5       5      R	                  5       $ )z4Hash an object to generate a consistent hash string.)Ú
_stringifyÚhashlibÚsha256ÚencodeÚ	hexdigest)ÚobjÚ
serializeds     r#   Ú_object_hashr.   >   s.   € ô ˜C“€JÜ�>Š>˜*×+Ñ+Ó-Ó.×8Ñ8Ó:Ð:r"   c                ó   • g ©Nr   )Úfuncs    r#   Útestr2   E   s   € ð r"   ©	ÚidÚoutput_keysr   Útest_suite_nameÚmetadataÚexperiment_metadataÚrepetitionsÚsplitÚcached_hostsc        	        ó   • g r0   r   r3   s	            r#   r2   r2   K   s   € ð &)r"   c                 óê  ^^• UR                  SS5      n[        R                  " UR                  SS5      5      nU(       a  U(       d  [        S5      e[	        UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UUR                  S	S5      UR                  S
S5      UR                  SS5      UR                  SS5      US9
mU(       a'  [
        R                  " SUR                  5        35        [        R                  " 5       mT(       a  [        R                  S5        SUU4S jjnU (       a  [        U S   5      (       a  U" U S   5      $ U$ )aq  Trace a pytest test case in LangSmith.

This decorator is used to trace a pytest test to LangSmith. It ensures
that the necessary example data is created and associated with the test function.
The decorated function will be executed as a test case, and the results will be
recorded and reported by LangSmith.

Args:
    - id (Optional[uuid.UUID]): A unique identifier for the test case. If not
        provided, an ID will be generated based on the test function's module
        and name.
    - output_keys (Optional[Sequence[str]]): A list of keys to be considered as
        the output keys for the test case. These keys will be extracted from the
        test function's inputs and stored as the expected outputs.
    - client (Optional[ls_client.Client]): An instance of the LangSmith client
        to be used for communication with the LangSmith service. If not provided,
        a default client will be used.
    - test_suite_name (Optional[str]): The name of the test suite to which the
        test case belongs. If not provided, the test suite name will be determined
        based on the environment or the package name.
    - cached_hosts (Optional[Sequence[str]]): A list of hosts or URL prefixes to
        cache requests to during testing. If not provided, all requests will be
        cached (default behavior). This is useful for caching only specific
        API calls (e.g., ["api.openai.com"] or ["https://api.openai.com"]).

Returns:
    Callable: The decorated test function.

Environment:
    - `LANGSMITH_TEST_CACHE`: If set, API calls will be cached to disk to
        save time and costs during testing. Recommended to commit the
        cache files to your repository for faster CI/CD runs.
        Requires the 'langsmith[vcr]' package to be installed.
    - `LANGSMITH_TEST_TRACKING`: Set this variable to the path of a directory
        to enable caching of test results. This is useful for re-running tests
        without re-executing the code. Requires the 'langsmith[vcr]' package.

Example:
    For basic usage, simply decorate a test function with `@pytest.mark.langsmith`.
    Under the hood this will call the `test` method:

    ```python
    import pytest


    # Equivalently can decorate with `test` directly:
    # from langsmith import test
    # @test
    @pytest.mark.langsmith
    def test_addition():
        assert 3 + 4 == 7
    ```


    Any code that is traced (such as those traced using `@traceable`
    or `wrap_*` functions) will be traced within the test case for
    improved visibility and debugging.

    ```python
    import pytest
    from langsmith import traceable


    @traceable
    def generate_numbers():
        return 3, 4


    @pytest.mark.langsmith
    def test_nested():
        # Traced code will be included in the test case
        a, b = generate_numbers()
        assert a + b == 7
    ```

    LLM calls are expensive! Cache requests by setting
    `LANGSMITH_TEST_CACHE=path/to/cache`. Check in these files to speed up
    CI/CD pipelines, so your results only change when your prompt or requested
    model changes.

    Note that this will require that you install langsmith with the `vcr` extra:

    `pip install -U "langsmith[vcr]"`

    Caching is faster if you install libyaml. See
    https://vcrpy.readthedocs.io/en/latest/installation.html#speed for more details.

    ```python
    # os.environ["LANGSMITH_TEST_CACHE"] = "tests/cassettes"
    import openai
    import pytest
    from langsmith import wrappers

    oai_client = wrappers.wrap_openai(openai.Client())


    @pytest.mark.langsmith
    def test_openai_says_hello():
        # Traced code will be included in the test case
        response = oai_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": "Say hello!"},
            ],
        )
        assert "hello" in response.choices[0].message.content.lower()
    ```

    You can also specify which hosts to cache by using the `cached_hosts` parameter.
    This is useful when you only want to cache specific API calls:

    ```python
    @pytest.mark.langsmith(cached_hosts=["https://api.openai.com"])
    def test_openai_with_selective_caching():
        # Only OpenAI API calls will be cached, other API calls will not
        # be cached
        response = oai_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": "Say hello!"},
            ],
        )
        assert "hello" in response.choices[0].message.content.lower()
    ```

    LLMs are stochastic. Naive assertions are flakey. You can use langsmith's
    `expect` to score and make approximate assertions on your results.

    ```python
    import pytest
    from langsmith import expect


    @pytest.mark.langsmith
    def test_output_semantically_close():
        response = oai_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": "Say hello!"},
            ],
        )
        # The embedding_distance call logs the embedding distance to LangSmith
        expect.embedding_distance(
            prediction=response.choices[0].message.content,
            reference="Hello!",
            # The following optional assertion logs a
            # pass/fail score to LangSmith
            # and raises an AssertionError if the assertion fails.
        ).to_be_less_than(1.0)
        # Compute damerau_levenshtein distance
        expect.edit_distance(
            prediction=response.choices[0].message.content,
            reference="Hello!",
            # And then log a pass/fail score to LangSmith
        ).to_be_less_than(1.0)
    ```

    The `@test` decorator works natively with pytest fixtures.
    The values will populate the "inputs" of the corresponding example in LangSmith.

    ```python
    import pytest


    @pytest.fixture
    def some_input():
        return "Some input"


    @pytest.mark.langsmith
    def test_with_fixture(some_input: str):
        assert "input" in some_input
    ```

    You can still use `pytest.parametrize()` as usual to run multiple test cases
    using the same test function.

    ```python
    import pytest


    @pytest.mark.langsmith(output_keys=["expected"])
    @pytest.mark.parametrize(
        "a, b, expected",
        [
            (1, 2, 3),
            (3, 4, 7),
        ],
    )
    def test_addition_with_multiple_inputs(a: int, b: int, expected: int):
        assert a + b == expected
    ```

    By default, each test case will be assigned a consistent, unique identifier
    based on the function name and module. You can also provide a custom identifier
    using the `id` argument:

    ```python
    import pytest
    import uuid

    example_id = uuid.uuid4()


    @pytest.mark.langsmith(id=str(example_id))
    def test_multiplication():
        assert 3 * 4 == 12
    ```

    By default, all test inputs are saved as "inputs" to a dataset.
    You can specify the `output_keys` argument to persist those keys
    within the dataset's "outputs" fields.

    ```python
    import pytest


    @pytest.fixture
    def expected_output():
        return "input"


    @pytest.mark.langsmith(output_keys=["expected_output"])
    def test_with_expected_output(some_input: str, expected_output: str):
        assert expected_output in some_input
    ```


    To run these tests, use the pytest CLI. Or directly run the test functions.

    ```python
    test_output_semantically_close()
    test_addition()
    test_nested()
    test_with_fixture("Some input")
    test_with_expected_output("Some input", "Some")
    test_multiplication()
    test_openai_says_hello()
    test_addition_with_multiple_inputs(1, 2, 3)
    ```
r;   NÚcachea2  cached_hosts parameter requires caching to be enabled. Please set the LANGSMITH_TEST_CACHE environment variable to a cache directory path, or pass a cache parameter to the test decorator. Example: LANGSMITH_TEST_CACHE='tests/cassettes' or @pytest.mark.langsmith(cache='tests/cassettes', cached_hosts=[...])r4   r5   r   r6   r7   r8   r9   r:   )
r4   r5   r   r6   r>   r7   r8   r9   r:   r;   zUnexpected keyword arguments: zLLANGSMITH_TEST_TRACKING is set to 'false'. Skipping LangSmith test tracking.c                ó&  >^ ^• TR                  SS5      =(       d    Sm[        R                  " T 5      (       a/  [        R                  " T 5      S S.     SUU UU4S jjj5       nU$ [        R                  " T 5      S S.SUU UU4S jjj5       nU$ )Nr9   é   )Úrequestc              Ÿ  óÂ   >#   • T(       a  T" U0 UD6I S h  v•N $ [        T5       H0  nTR                  5       n[        T/UQ7SU 0UDSU0D6I S h  v•N   M2     g  ND N7f©NÚpytest_requestÚlangtest_extra)ÚrangeÚcopyÚ
_arun_test©	rA   Ú	test_argsÚtest_kwargsÚiÚrepetition_extraÚdisable_trackingr1   rE   r9   s	        €€€€r#   Úasync_wrapperÚ.test.<locals>.decorator.<locals>.async_wrapperx  s„   øé € ö $Ù!% yÐ!@°KÑ!@×@Ð@ô ˜{Ö+�AØ'5×':Ñ':Ó'<Ð$Ü$Øðà"òð (/ðð &ñ	ð
 (8ò÷ ò ò ,ñ Añ
ùs!   ƒA–A—:AÁAÁ
AÁAc                ó’   >• T(       a  T" U0 UD6$ [        T5       H(  nTR                  5       n[        T/UQ7SU 0UDSU0D6  M*     g rC   )rF   rG   Ú	_run_testrI   s	        €€€€r#   ÚwrapperÚ(test.<locals>.decorator.<locals>.wrapperŒ  sg   ø€ æÙ˜YÐ6¨+Ñ6Ð6ô ˜;Ö'�Ø#1×#6Ñ#6Ó#8Ð ÜØðàòð $+ðð "ñ	ð
 $4õò (r"   )rJ   r   rA   r   rK   r   )ÚgetÚinspectÚiscoroutinefunctionÚ	functoolsÚwraps)r1   rO   rS   r9   rN   rE   s   `  @€€r#   Ú	decoratorÚtest.<locals>.decoratorr  s˜   ú€ à$×(Ñ(¨¸Ó:×?¸aˆä×&Ò& t×,Ñ,ä�_Š_˜TÓ"à04ñØðØ*-ðØEH÷ò ó #ðð" !Ð ä	�Š˜Ó	Ø48÷ 	ô 	ó 
ð	ð ˆr"   r   ©r1   r	   Úreturnr	   )ÚpopÚls_utilsÚget_cache_dirÚ
ValueErrorÚ_UTExtraÚwarningsÚwarnÚkeysÚtest_tracking_is_disabledÚloggerÚinfoÚcallable)ÚargsÚkwargsr;   Ú	cache_dirrZ   rN   rE   s        @@r#   r2   r2   Z   sD  ù€ ðj —:‘:˜n¨dÓ3€LÜ×&Ò& v§z¡z°'¸4Ó'@ÓA€Iö žIÜðUó
ð 	
ô Ø�:‰:�d˜DÓ!Ø—J‘J˜}¨dÓ3Ø�z‰z˜( DÓ)ØŸ
™
Ð#4°dÓ;ØØ—‘˜J¨Ó-Ø"ŸJ™JÐ'<¸dÓCØ—J‘J˜}¨dÓ3Ø�j‰j˜ $Ó'Ø!ñ€Nö Ü�ŠÐ6°v·{±{³}°oÐFÔGÜ×9Ò9Ó;ÐÞÜ�‰ð1ô	
÷
*ð *öX ”˜˜a™×!Ñ!Ù˜˜a™Ó!Ð!àÐr"   c                óL  • [         R                  R                  S5      (       av  [        R                  R                  S5      (       aR  U [         R                  S   -   n[        [        R                  " [        R                  U5      R                  S S 5      nO+[        [        R                  " 5       R                  S S 5      n[         R                  R                  S5      (       a  [         R                  S   nO[        R                  " S5      =(       d    SnU SU 3nU$ )NÚPYTEST_XDIST_TESTRUNUIDÚxdisté   ÚLANGSMITH_EXPERIMENTFÚTestSuiteResultÚ:)ÚosÚenvironrU   Ú	importlibÚutilÚ	find_specÚstrÚuuidÚuuid5ÚNAMESPACE_DNSÚhexÚuuid4r_   Úget_tracer_project)r6   Úid_nameÚid_ÚprefixÚnames        r#   Ú_get_experiment_namer„   §  sÓ   € ô 
‡z�z‡~�~Ð/×0Ñ0´Y·^±^×5MÑ5MÈg×5VÑ5VØ!¤B§J¡JÐ/HÑ$IÑIˆÜ”$—*’*œT×/Ñ/°Ó9×=Ñ=¸b¸qÐAÓB‰ä”$—*’*“,×"Ñ" 2 AÐ&Ó'ˆä	‡z�z‡~�~Ð,×-Ñ-Ü—‘Ð2Ñ3‰ä×,Ò,¨UÓ3×HÐ7HˆØˆX�Q�s�eÐ€DØ€Kr"   c                ó0  • [         R                  " S5      nU(       a  U$ [        R                  " 5       S   n [        R
                  " U 5      nU(       a  U SUR                   3$  [        S5      e! [         a    [        R                  S5         N,f = f)NÚ
TEST_SUITEÚ	repo_nameÚ.z3Could not determine test suite name from file path.z9Please set the LANGSMITH_TEST_SUITE environment variable.)r_   Úget_env_varÚls_envÚget_git_inforV   Ú	getmoduler   ÚBaseExceptionrg   Údebugra   )r1   r6   r‡   Úmods       r#   Ú_get_test_suite_namer�   ¹  s�   € Ü×*Ò*¨<Ó8€OÞØÐÜ×#Ò#Ó% kÑ2€IðLÜ×Ò Ó%ˆÞØ�[  #§,¡, Ð0Ð0ð ô
 ÐPÓ
QÐQøô ó LÜ�‰ÐJÖKðLús   ¹-A3 Á3BÂBc                ó>  • U R                  US9(       a  U R                  US9$ [        R                  " 5       R	                  S5      =(       d    SnSnU(       a  USU 3-  n U R                  UUSS0S9$ ! [        R                   a    U R                  US9s $ f = f)	N)Údataset_nameÚ
remote_urlÚ z
Test suitez for Ú__ls_runnerÚpytest)r’   Údescriptionr7   )Úhas_datasetÚread_datasetrŠ   r‹   rU   Úcreate_datasetr_   ÚLangSmithConflictError)r   r6   Úrepor—   s       r#   Ú_get_test_suiter�   È  s¸   € ð ×Ñ ÐÖ7Ø×"Ñ"°Ð"Ð@Ð@ä×"Ò"Ó$×(Ñ(¨Ó6×<¸"ˆØ"ˆÞØ˜U 4 &˜>Ñ)ˆKð	EØ×(Ñ(Ø,Ø'Ø'¨Ð2ð )ð ð øô
 ×.Ñ.ó 	EØ×&Ñ&°OÐ&ÐDÒDð	Eús   Á#A6 Á6#BÂBc                ó   • [        UR                  5      n0 U=(       d    0 E[        R                  " 5       R	                  S5      SS.En U R                  UUR                  SUS9$ ! [        R                   a    U R                  US9s $ f = f)NÚrevision_idr–   )rŸ   r•   zTest Suite Results.)Úreference_dataset_idr—   r7   )Úproject_name)
r„   rƒ   rŠ   Úget_langchain_env_var_metadatarU   Úcreate_projectr4   r_   r›   Úread_project)r   Ú
test_suiter8   Úexperiment_namer7   s        r#   Ú_start_experimentr§   Ü  s    € ô
 +¨:¯?©?Ó;€OðØ×$ "ðä×<Ò<Ó>×BÑBÀ=ÓQØò€Hð
AØ×$Ñ$ØØ!+§¡Ø-Øð	 %ð 
ð 	
øô ×*Ñ*ó AØ×"Ñ"°Ð"Ð@Ò@ðAús   ÁA' Á'#BÂBc                óŽ   • U [        U5      [        U=(       d    0 5      4n[        U5      n[        R                  " [        U5      $ )z=Generate example ID based on inputs, outputs, and dataset ID.)r.   r'   rz   r{   ÚUUID5_NAMESPACE)Ú
dataset_idÚinputsÚoutputsÚidentifier_objÚ
identifiers        r#   Ú_get_example_idr¯   ô  s:   € ð !¤,¨vÓ"6¼ÀWÇ]ÐPRÓ8SÐT€NÜ˜NÓ+€JÜ�:Š:”o zÓ2Ð2r"   c                óî  •  [        [        [        R                  " U 5      5      R	                  [        R
                  " 5       5      5      nU U SU R                   3n[        U S5      (       a/  [        S U R                   5       5      (       a  U[        U5      -  n[        R                  " [        R                  U5      U[!        [        U5      5      S  4$ ! [         a    U R                  n N§f = f)Nz::Ú
pytestmarkc              3  ó>   #   • U  H  oR                   S :H  v •  M     g7f)ÚparametrizeN©rƒ   )Ú.0Úms     r#   Ú	<genexpr>Ú)_get_example_id_legacy.<locals>.<genexpr>	  s   é € ð +Ú)8 A�‰�-Öªùs   ‚)ry   r   rV   ÚgetfileÚrelative_toÚcwdra   r   r   ÚhasattrÚanyr±   r'   rz   r{   r|   Úlen)r1   r«   Úsuite_idÚ	file_pathr®   s        r#   Ú_get_example_id_legacyrÁ   ÿ  sÌ   € ð$ÜœœWŸ_š_¨TÓ2Ó3×?Ñ?ÄÇÂÃ
ÓKÓLˆ	ð �:˜i˜[¨¨4¯=©=¨/Ð:€Jäˆt�\×"Ñ"¤sñ +Ø)-¯ªó+÷ (ñ (ð 	”j Ó(Ñ(ˆ
Ü�:Š:”d×(Ñ(¨*Ó5°zÄ#ÄcÈ(ÃmÓBTÐBVÐ7WÐWÐWøô ó $à—O‘OŠ	ð$ús   ‚A
C ÃC4Ã3C4Ú_LangSmithTestSuitec                ó.  • [         R                  " 5       =(       d    0 nU R                  5         U R                  5       nU R                  R
                  nU R                  R                  U R                  0 U R                  =(       d    0 EUEU[         R                  " 5       R                  S5      SS.ES9  U(       a'  US   b!  U R                  R                  UUSUS    3S9  U(       a)  US   b"  U R                  R                  UUS	US    3S9  g g g )
NrŸ   r–   )Údataset_versionrŸ   r•   )r7   Úcommitzgit:commit:)rª   Úas_ofÚtagÚbranchzgit:branch:)rŠ   r‹   ÚshutdownÚget_dataset_versionÚ_datasetr4   r   Úupdate_projectÚexperiment_idr8   r¢   rU   Úupdate_dataset_tag)r¥   Úgit_inforÄ   rª   s       r#   Ú
_end_testsrÐ     s+  € Ü×"Ò"Ó$×*¨€HØ×ÑÔØ ×4Ñ4Ó6€OØ×$Ñ$×'Ñ'€Jð ×Ñ×$Ñ$Ø× Ñ ð
Ø×-Ñ-×3°ð
àð
ð  /Ü!×@Ò@ÓB×FÑFÀ}ÓUØ#ò
ð %ñ 	ö ˜8 HÑ-Ñ9Ø×Ñ×,Ñ,Ø!Ø!Ø˜h xÑ0Ð1Ð2ð 	-ñ 	
ö
 ˜8 HÑ-Ñ9Ø×Ñ×,Ñ,Ø!Ø!Ø˜h xÑ0Ð1Ð2ð 	-ò 	
ð :€r"   ÚVT)Úboundc                ó€   • U c  [        [        U 5      $ [        R                  " U 5      n[        R
                  " U5      $ r0   )r   rÑ   Ú	ls_clientÚ_dumps_jsonr   Úloads)ÚvaluesÚbtss     r#   Ú_serde_example_valuesrÙ   2  s3   € Ø�~Ü”B˜ÓÐÜ
×
Ò
 Ó
'€CÜ�=Š=˜ÓÐr"   c                  ó–  • \ rS rSr% SrS\S'   \R                  " 5       r S       SS jjr	\
S 5       r\
S 5       r\
S 5       r\  S         SS	 jj5       r\
S
 5       rS r    S           SS jjrSS jrSSSSSSS.           SS jjr  S         SS jjrSS jrS r  S S S jjr  S!S jrSrg)"rÂ   i9  NúOptional[dict]Ú
_instancesc                óú   • U=(       d    [         R                  " 5       U l        X l        X0l        UR
                  U l        [        R                  " 5       U l	        X@l
        [        R                  " [        U 5        g r0   )ÚrtÚget_cached_clientr   Ú_experimentrË   Úmodified_atÚ_dataset_versionr_   ÚContextThreadPoolExecutorÚ	_executorr8   ÚatexitÚregisterrÐ   )Úselfr   Ú
experimentÚdatasetr8   s        r#   Ú__init__Ú_LangSmithTestSuite.__init__=  sV   € ð ×6¤× 4Ò 4Ó 6ˆŒØ%ÔØŒØ=D×=PÑ=PˆÔÜ!×;Ò;Ó=ˆŒØ#6Ô Ü�Šœ
 DÕ)r"   c                ó.   • U R                   R                  $ r0   )rË   r4   ©rç   s    r#   r4   Ú_LangSmithTestSuite.idL  s   € à�}‰}×ÑÐr"   c                ó.   • U R                   R                  $ r0   )rà   r4   rí   s    r#   rÍ   Ú!_LangSmithTestSuite.experiment_idP  s   € à×Ñ×"Ñ"Ð"r"   c                ó   • U R                   $ r0   )rà   rí   s    r#   rè   Ú_LangSmithTestSuite.experimentT  s   € à×ÑÐr"   c                óx  • U=(       d    [         R                  " 5       nU=(       d    [        U5      nU R                     U R                  (       d  0 U l        X0R                  ;  a-  [        X5      n[        XU5      nU " XXT5      U R                  U'   S S S 5        U R                  U   $ ! , (       d  f       N= fr0   )rÞ   rß   r�   Ú_lockrÜ   r�   r§   )Úclsr   r1   r6   r8   r¥   rè   s          r#   Ú	from_testÚ_LangSmithTestSuite.from_testX  s“   € ð ×1œ2×/Ò/Ó1ˆØ)×GÔ-AÀ$Ó-GˆØ�Y‹YØ—>—>Ø!#�”Ø§n¡nÓ4Ü,¨VÓE�
Ü.¨vÐCVÓW�
Ù25Ø¨
ó3�—‘˜Ñ/÷ ð �~‰~˜oÑ.Ð.÷ �Yús   ¿AB+Â+
B9c                ó.   • U R                   R                  $ r0   )rà   rƒ   rí   s    r#   rƒ   Ú_LangSmithTestSuite.namem  s   € à×Ñ×$Ñ$Ð$r"   c                ó   • U R                   $ r0   )râ   rí   s    r#   rÊ   Ú'_LangSmithTestSuite.get_dataset_versionq  s   € Ø×$Ñ$Ð$r"   c                óÌ   • U(       a  S nSnOU(       a  SnSnOSnSnU(       a  U(       a  UR                  USU05        U R                  R                  U R                  X5        g )NÚskippedr   Úfailedr@   ÚpassedÚstatus)Úupdate_process_statusrä   ÚsubmitÚ_submit_result)rç   Úrun_idÚerrorrý   Úpytest_pluginÚpytest_nodeidÚscorer   s           r#   Úsubmit_resultÚ!_LangSmithTestSuite.submit_resultt  s\   € ö ØˆEØ‰FÞØˆEØ‰FàˆEØˆFÞž]Ø×/Ñ/°ÀÈ&Ð?QÔRØ�‰×Ñ˜d×1Ñ1°6ÕAr"   c                ó:   • U R                   R                  USX!S9  g )NÚpass)Úkeyr  Útrace_id©r   Úcreate_feedback)rç   r  r  s      r#   r  Ú"_LangSmithTestSuite._submit_result‰  s   € ð 	�‰×#Ñ# F°¸eÐ#ÒUr"   )r«   r¬   r7   r:   r  r  c               ó^  • U=(       d    0 nU(       aE  U(       a>  X#S.nUR                  5        V	V
s0 s H  u  pšU
c  M
  Xš_M     nn	n
UR                  Xx5        U(       a  UR                  5       OUn[        U5      n[        U5      n U R                  R                  US9nUn[        U[        5      (       a  U/nU(       a  U(       a  XÄS'   UR                  =(       d    0 R                  S5      nX+R                  :w  dX  Ub  X;R                  :w  dF  Ub  XKR                  :w  d4  [        UR                  5      [        U R                  5      :w  d  UbZ  XÜ:w  aU  U R                  R                  UR                  UUUUU R                  S9  U R                  R                  UR                  S9nU R*                  c  UR,                  U l        g UR,                  (       a?  U R*                  (       a-  UR,                  U R*                  :”  a  UR,                  U l        g g g g s  sn
n	f ! [        R                    au     U R                  R#                  UUUU R                  UUU R$                  R&                  S9n NÊ! [        R(                   a    U R                  R                  US9n  Núf = ff = f)N)r«   Úreference_outputs)Ú
example_idÚdataset_split)r  r«   r¬   r7   r:   rª   )r  r«   r¬   rª   r7   r:   Ú
created_at)Úitemsr  rG   rÙ   r   Úread_exampleÚ
isinstancery   r7   r^   r«   r¬   rª   r4   Úupdate_exampler_   ÚLangSmithNotFoundErrorÚcreate_examplerà   Ú
start_timer›   râ   rá   )rç   r  r«   r¬   r7   r:   r  r  ÚupdateÚkÚvÚexampleÚnormalized_splitÚexisting_dataset_splits                 r#   Úsync_exampleÚ _LangSmithTestSuite.sync_exampleŽ  sf  € ð —˜2ˆÞž]Ø &ÑEˆFØ'-§|¡|¤~ÔG¢~™t˜q¸“d�a’d¡~ˆFÑGØ×/Ñ/°ÔFÞ&.�8—=‘=”?°HˆÜ& vÓ.ˆÜ'¨Ó0ˆð*	JØ—k‘k×.Ñ.¸*Ð.ÐEˆGð"  %ÐÜÐ*¬C×0Ñ0Ø$4Ð#5Ð Þ¦HØ,<˜Ñ)Ø&-×&6Ñ&6×&<¸"×%AÑ%AÀ/Ó%RÐ"àŸ>™>Ó)ØÑ'¨G·±Ó,FØÑ(¨X×9IÑ9IÓ-IÜ�w×)Ñ)Ó*¬c°$·'±'«lÓ:à$Ñ0Ø.ÓBð —‘×*Ñ*Ø&Ÿz™zØ!Ø#Ø%ØØ#Ÿw™wð +ñ ð Ÿ+™+×2Ñ2¸g¿j¹jÐ2ÐI�Ø× Ñ Ñ(Ø$+×$7Ñ$7ˆDÕ!à××Ø×%×%Ø×#Ñ# d×&;Ñ&;Ó;à$+×$7Ñ$7ˆDÕ!ð <ð &ð  ùóg Høô ×.Ñ.ó 	JðJØŸ+™+×4Ñ4Ø)Ø!Ø#Ø#Ÿw™wØ%ØØ#×/Ñ/×:Ñ:ð 5ð ’øô ×2Ñ2ó Jð Ÿ+™+×2Ñ2¸jÐ2ÐI“ðJúð	Jús4   ±	H¾HÂH# È#J,È8=I7É7-J(Ê$J,Ê'J(Ê(J,c                ó
  • [        U[        5      (       a  UOU/nU Hc  nU(       a0  U(       a)  SU;   a  US   OUS   nUR                  USUS   U005        U R                  R                  " U R
                  4XS.UD6  Me     g )Nr  ÚvalueÚfeedbackr  )r  r(  )r  Úlistr  rä   r  Ú_create_feedback)rç   r  r(  r  r  rk   ÚfbÚvals           r#   Ú_submit_feedbackÚ$_LangSmithTestSuite._submit_feedbackÕ  s‹   € ô  *¨(´D×9Ñ9‘8À¸zˆÛˆBÞ¦Ø%,°£]�b˜’k¸¸7¹�Ø×3Ñ3Ø! J°°E±¸CÐ0@Ð#Aôð �N‰N×!Ò!Ø×%Ñ%ðØ.4ñØEKôò r"   c                óJ   • U R                   R                  " U40 UDUDSU0D6  g )Nr  r  )rç   r  r(  rk   s       r#   r*  Ú$_LangSmithTestSuite._create_feedbackè  s%   € ð 	�‰×#Ò# FÑR¨hÐR¸&ÑRÈ6ÔRr"   c                ó8   • U R                   R                  5         g r0   )rä   rÉ   rí   s    r#   rÉ   Ú_LangSmithTestSuite.shutdowní  s   € Ø�‰×ÑÕ!r"   c	                óX   • U R                   R                  U R                  UUUUUUUUS9	$ )N)Úrun_treer  r¬   r  r7   r:   r  r  )rä   r  Ú_end_run©	rç   r4  r  r¬   r  r7   r:   r  r  s	            r#   Úend_runÚ_LangSmithTestSuite.end_runð  s?   € ð �~‰~×$Ñ$Ø�M‰MØØ!ØØ/ØØØ'Ø'ð %ð 

ð 
	
r"   c	                óŽ   • U R                  UUR                  UUUS9  X!l        UR                  USU0S9  UR	                  5         g )N)r«   r¬   r:   r7   Úreference_example_id)r¬   r7   )r$  r«   r:  ÚendÚpatchr6  s	            r#   r5  Ú_LangSmithTestSuite._end_run  sR   € ð 	×ÑØØ—?‘?Ø%ØØð 	ñ 	
ð )3Ô%Ø�‰˜WÐ0FÈ
Ð/SˆÑTØ�‰Õr"   )rË   râ   rä   rà   r   r8   r0   )r   úOptional[ls_client.Client]rè   úls_schemas.TracerSessionré   úls_schemas.Datasetr8   rÛ   )NN)
r   r>  r1   r	   r6   úOptional[str]r8   rÛ   r]   rÂ   )NFNN)r  ú	uuid.UUIDr  rA  rý   Úboolr  r   r  r   r]   ÚNone)r  rB  r  úOptional[int]r]   rD  )r  rB  r«   rÛ   r¬   rÛ   r7   rÛ   r:   úOptional[Union[str, list[str]]]r]   rD  )
r  r   r(  zUnion[dict, list]r  r   r  r   rk   r   )r  r   r(  Údictrk   r   r]   rD  )r]   r   ©r]   rD  )r   r   r   r    rÜ   Ú__annotations__Ú	threadingÚRLockrô   rê   Úpropertyr4   rÍ   rè   Úclassmethodrö   rƒ   rÊ   r	  r  r$  r-  r*  rÉ   r7  r5  r!   r   r"   r#   rÂ   rÂ   9  s  ‡ Ø!%€J�Ó%Ø�OŠOÓ€Eð /3ð*à*ð*ð -ð*ð $ð	*ð
 ,õ*ð ñ ó ð ð ñ#ó ð#ð ñ ó ð ð ð
 *.Ø.2ð/à*ð/ð ð/ð 'ð	/ð
 ,ð/ð 
ô/ó ð/ð( ñ%ó ð%ò%ð  $ØØ!Ø!ðBàðBð ðBð ð	Bð
 ðBð ðBð 
õBô*Vð "&Ø"&Ø#'Ø15ØØñE8àðE8ð ð	E8ð
  ðE8ð !ðE8ð /ðE8ð 
õE8ðV "Ø!ðàðð $ðð ð	ð
 ðð õô&Sò
"ð Øð
ð 
õ
ð.ð 
÷r"   c                  ó¸   • \ rS rSr       S                   SS jjrSS jrSS jrSS jrSS jr  S     SS jjr	SS	 jr
SS
 jrSS jrSrg)Ú	_TestCasei   Nc
                óZ  • Xl         X0l        X l        X@l        XPl        X`l        Xpl        X€l        X�l        S U l	        S U l
        U(       a`  U(       aX  UR                  UR                  R                  U5        U(       a  U R                  U5        U	(       a  U R                  U	5        g g g g r0   )r¥   r  r  r7   r:   r  r  r«   r  Ú_logged_reference_outputsÚ_logged_outputsÚadd_process_to_test_suiterË   rƒ   Ú
log_inputsÚlog_reference_outputs)
rç   r¥   r  r  r7   r:   r  r  r«   r  s
             r#   rê   Ú_TestCase.__init__!  s—   € ð %ŒØ$ŒØŒØ ŒØŒ
Ø*ÔØ*ÔØŒØ!2ÔØ9=ˆÔ&Ø/3ˆÔæž]Ø×3Ñ3Ø×#Ñ#×(Ñ(¨-ôö Ø—‘ Ô'Þ Ø×*Ñ*Ð+<Õ=ð !ð +ˆ=r"   c           
     ó|   • U R                   R                  " U0 0 UE[        U R                  U R                  S9ED6  g )N)r  r  )r¥   r-  rG  r  r  )rç   rj   rk   s      r#   Úsubmit_feedbackÚ_TestCase.submit_feedbackB  sH   € Ø�‰×(Ò(Øð		
ðØðäØ"&×"4Ñ"4Ø"&×"4Ñ"4ñðó		
r"   c                ó¨   • Xl         U R                  (       a;  U R                  (       a)  U R                  R                  U R                  SU05        g g g )Nr«   )r«   r  r  r  )rç   r«   s     r#   rT  Ú_TestCase.log_inputsN  sD   € ØŒØ×× $×"4×"4Ø×Ñ×4Ñ4Ø×"Ñ" X¨vÐ$6õð #5Ðr"   c                ó¨   • Xl         U R                  (       a;  U R                  (       a)  U R                  R                  U R                  SU05        g g g )Nr¬   )rR  r  r  r  )rç   r¬   s     r#   Úlog_outputsÚ_TestCase.log_outputsU  sE   € Ø&ÔØ×× $×"4×"4Ø×Ñ×4Ñ4Ø×"Ñ" Y°Ð$8õð #5Ðr"   c                ó¨   • Xl         U R                  (       a;  U R                  (       a)  U R                  R                  U R                  SU05        g g g )Nr  )rQ  r  r  r  )rç   r  s     r#   rU  Ú_TestCase.log_reference_outputs\  sG   € Ø):Ô&Ø×× $×"4×"4Ø×Ñ×4Ñ4Ø×"Ñ"Ð%8Ð:KÐ$Lõð #5Ðr"   c                óx   • U R                   R                  U R                  UUU R                  U R                  S9$ )N)r  rý   r  r  )r¥   r	  r  r  r  )rç   r  rý   s      r#   Úsubmit_test_resultÚ_TestCase.submit_test_resultc  s?   € ð
 �‰×,Ñ,Ø�K‰KØØØ×,Ñ,Ø×,Ñ,ð -ð 
ð 	
r"   c                óÂ   • U R                   (       aN  U R                  (       a<  U R                   R                  U R                  S[        R                  " 5       05        g g g )Nr  ©r  r  r  Útimerí   s    r#   r  Ú_TestCase.start_timep  sE   € Ø×× $×"4×"4Ø×Ñ×4Ñ4Ø×"Ñ" \´4·9²9³;Ð$?õð #5Ðr"   c                óÂ   • U R                   (       aN  U R                  (       a<  U R                   R                  U R                  S[        R                  " 5       05        g g g )NÚend_timere  rí   s    r#   ri  Ú_TestCase.end_timev  sE   € Ø×× $×"4×"4Ø×Ñ×4Ñ4Ø×"Ñ" Z´·²³Ð$=õð #5Ðr"   c                ó|  • Ub  [        U[        5      (       d  SU0nU R                  =(       d;    [        [	        U R
                  R                  5      U R                  =(       d    0 US9nU R
                  R                  UUUU R                  U R                  U R                  U R                  U R                  S9  g )NÚoutput)rª   r«   r¬   )r  r7   r:   r  r  )r  rG  r  r¯   ry   r¥   r4   r«   r7  rQ  r7   r:   r  r  )rç   r4  r¬   r  s       r#   r7  Ú_TestCase.end_run|  sž   € Ø‘¤:¨g´t×#<Ñ#<Ø Ð)ˆGØ—_‘_÷ 
¬Ü˜4Ÿ?™?×-Ñ-Ó.Ø—;‘;×$ "Øñ)
ˆ
ð
 	�‰×ÑØØØØ"×<Ñ<Ø—]‘]Ø—*‘*Ø×,Ñ,Ø×,Ñ,ð 	 ò 		
r"   )rR  rQ  r  r«   r7   r  r  r  r  r:   r¥   )NNNNNNN)r¥   rÂ   r  rB  r  úOptional[uuid.UUID]r7   rÛ   r:   rF  r  r   r  r   r«   rÛ   r  rÛ   r]   rD  )rk   r   ©r«   rG  r]   rD  ©r¬   rG  r]   rD  ©r  rG  r]   rD  )NF)r  rA  rý   rC  r]   rD  rH  )r¬   r   r]   rD  )r   r   r   r    rê   rX  rT  r]  rU  rb  r  ri  r7  r!   r   r"   r#   rO  rO     sÍ   † ð
 +/Ø#'Ø15Ø!Ø!Ø!%Ø,0ð>à'ð>ð ð>ð (ð	>ð
 !ð>ð /ð>ð ð>ð ð>ð ð>ð *ð>ð 
õ>ôB

ôôôð  $Øð
àð
ð ð
ð 
õ	
ôô÷
r"   rO  Ú
_TEST_CASE)Údefaultc                  óz   • \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S\S
'   S\S'   S\S'   S\S'   S\S'   S\S'   Srg)rb   i“  r>  r   rn  r4   úOptional[Sequence[str]]r5   rA  r6   r>   rÛ   r7   r8   rE  r9   rF  r:   r;   r   N)r   r   r   r    rI  r!   r   r"   r#   rb   rb   “  s>   ‡ Ø&Ó&ØÓØ(Ó(Ø"Ó"ØÓØÓØ'Ó'ØÓØ*Ó*Ø)Ö)r"   rb   F)Útotalc               óÆ  • US   =(       d    [         R                  " 5       nUS   nUS   nUS   nUR                  S5      n	U	c=  [        R                  R                  S5      n
U
(       a   [
        R                  " U
5      n	[        R                  " U 5      n[        R                  " U/UQ70 UD6=(       d    S nS nU(       a4  0 nU(       d  Sn[        U5      eU H  nUR                  US 5      UU'   M     [        R                  XPUR                  S	5      U	5      nUS
   nUR                   R"                  =(       aa    UR                   R"                  R                  S5      =(       a5    UR                   R"                  R                  S0 5      R                  S5      nU(       a  [$        R&                  " US5      (       d$  [)        XUR*                  5      u  nnU=(       d    UnU(       a%  UR,                  R.                  R1                  S5      OS nU(       a  UR2                  R4                  OS nU(       a^  [7        [8        UR                   R:                  5      S-   [9        UR<                  5      -   UR>                  UR                   R@                  '   [C        U[D        RF                  " 5       UUUUUUUS9	nU$ ! [         a  nSU 3n[        U5      UeS nAff = f)Nr   r5   r7   r:   r8   ÚLANGSMITH_EXPERIMENT_METADATAz9LANGSMITH_EXPERIMENT_METADATA env var is not valid JSON: zU'output_keys' should only be specified when marked test function has input arguments.r6   r4   ÚruntimeÚsdk_versionz0.4.33Úlangsmith_output_pluginz/compare?selectedSessions=)r  r  r7   r:   r«   r  r  r  )$rÞ   rß   rU   rt   ru   r   rÖ   Ú	Exceptionra   rV   Ú	signatureÚrhÚ_get_inputs_safer^   rÂ   rö   rË   r7   r_   Úis_version_greater_or_equalrÁ   r4   ÚconfigÚpluginmanagerÚ
get_pluginÚnodeÚnodeidr   ry   ÚurlrÍ   Útest_suite_urlsrƒ   rO  rz   r~   )r1   rD   rE   rj   rk   r   r5   r7   r:   r8   Úenv_valÚeÚmsgr}  r«   r¬   r  r¥   r  Údataset_sdk_versionÚlegacy_example_idÚexample_namer  r  Ú	test_cases                            r#   Ú_create_test_caser�     s»  € ð ˜HÑ%×?¬×)=Ò)=Ó)?€FØ  Ñ/€KØ˜jÑ)€HØ˜7Ñ#€Eà(×,Ñ,Ð-BÓCÐØÑ"Ü—*‘*—.‘.Ð!@ÓAˆÞð-Ü&-§m¢m°GÓ&<Ð#ô ×!Ò! $Ó'€IÜ× Ò  Ð<¨TÒ<°VÑ<×DÀ€FØ€GÞØˆÞð#ð ô ˜S“/Ð!ÛˆAØŸ™ A tÓ,ˆG�A‹Jñ ä$×.Ñ.Ø�n×(Ñ(Ð):Ó;Ð=Pó€Jð   Ñ%€Jà×Ñ×$Ñ$÷ 	OØ×Ñ×(Ñ(×,Ñ,¨YÓ7÷	Oà×Ñ×(Ñ(×,Ñ,¨Y¸Ó;×?Ñ?ÀÓNð ö
 ¤h×&JÒ&JØ˜X÷'ñ 'ô +AØ˜*Ÿ-™-ó+
Ñ'Ð˜<ð  ×4Ð#4ˆ
ö ð 	×Ñ×+Ñ+×6Ñ6Ð7PÔQàð ö
 3A�N×'Ñ'×.Ò.Àd€MÞä”�j×)Ñ)×-Ñ-Ó.Ø*ñ+ä�*×*Ñ*Ó+ñ,ð 	×%Ñ% j×&9Ñ&9×&>Ñ&>Ñ?ô
 ØÜ�zŠz‹|ØØØØØ!Ø#Ø#ñ
€Ið Ðøôo ó -ØQÐRSÐQTÐU�Ü  “o¨1Ð,ûð-ús   Á,K  Ë 
K Ë
KËK c               ó¶  ^ ^^^• [        T /TQ70 TDUUS.D6m[        R                  T5        U UUU4S jnUS   (       a)  [        US   5      TR                  R
                   S3-  nOS n[        R                  " 5       n0 US   =(       d    0 ESTR                  R                  R                  0EnTR                  R                  R                  /n	UR                  S5      =(       d    S n
[        R                  " S	0 0 UESU0ED6   [        R                  " XiU
S9   U" 5         S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)
N©rD   rE   c                 ó   >• TR                  5         [        R                  " [        TSS5      TR                  TR
                  TR                  =(       d    0 R                  5        V Vs0 s H  u  pSU  3U_M     snn TR                  R                  [        4SS9 n T" T0 TD6nTR                  X#5         TR                  5          S S S 5         TR                  5         g s  snn f ! [         a=  nTR                  [        U5      SS9  TR                  US[        U5      05        UeS nAf[         a1  nTR                  [        U5      S	9  TR                  US 5        UeS nAff = f! TR                  5         f = f! , (       d  f       N¾= f! [         a/  n[         R#                  S
TR                   SU 35         S nAg S nAff = f)Nr   ÚTestÚls_example_F)rƒ   r  r«   r7   r¡   Úexceptions_to_handleÚ_end_on_exitT©r  rý   Úskipped_reason©r  ú%Failed to create feedback for run_id ú:
)r  r~  ÚtraceÚgetattrr  r«   r7   r  r¥   rƒ   r   r7  rb  Úreprr�   ri  rg   Úwarning©	r  r   r4  Úresultr‰  r1   rJ   rŽ  rK   s	        €€€€r#   Ú_testÚ_run_test.<locals>._testü  s³  ø€ Ø×ÑÔÜ�XŠXÜ˜˜z¨6Ó2Ø×#Ñ#Ø×#Ñ#ð '×/Ñ/×5°2×<Ñ<Ô>ôò ?‘D�Að ˜a˜SÐ! 1Ò$Ù>òð #×-Ñ-×2Ñ2Ü"/Ð!1Øò
ð ð%Ù˜yÐ8¨KÑ8�ð ×!Ñ! (Õ3à×"Ñ"Õ$÷;
ð<	Ø×(Ñ(Õ*ùó7øô !ó Ø×,Ñ,´4¸³7ÀDÐ,ÑIØ×!Ñ! (Ð-=¼tÀA»wÐ,GÔHØ�ûÜ ó Ø×,Ñ,´4¸³7Ð,Ñ;Ø×!Ñ! (¨DÔ1Ø�ûðûð ×"Ñ"Õ$ú÷;
õ 
ûô@ ó 	Ü�N‰NØ7¸	×8HÑ8HÐ7IÈÈQÈCÐP÷ñ ûð	úsl   Á*C%ÂFÂ C+Â(E.Â:FÃF Ã+
E+Ã58D-Ä-E+Ä:,E&Å&E+Å+E.Å.F Æ FÆ
FÆ
GÆ%GÇGr>   ú.yamlr7   rè   r;   ©Úignore_hostsÚallow_hostsr   )r�  rr  Úsetr   r¥   r4   r~  Úget_tracing_contextrè   rƒ   r   Úapi_urlrU   Útracing_contextr_   Úwith_optional_cache)r1   rD   rE   rJ   rK   r¢  Ú
cache_pathÚcurrent_contextr7   r¦  r§  rŽ  s   `  ``      @r#   rR   rR   ì  sZ  û€ ô "Øðà	òð ðð &Ø%ó€Iô ‡N�N�9Ô÷%ð %ðN �g×Ü˜.¨Ñ1Ó2¸	×8LÑ8L×8OÑ8OÐ7PÐPUÐ5VÑV‰
àˆ
Ü×,Ò,Ó.€OðØ˜:Ñ&×,¨"ðð ˜)×.Ñ.×9Ñ9×>Ñ>ð
ð€Hð ×(Ñ(×/Ñ/×7Ñ7Ð8€LØ ×$Ñ$ ^Ó4×<¸€Kô 	×ÒÑGÐF ÐF°¸XÑFÓGÜ×$Ò$Ø¸{ó	
ñ 	Œ÷		
÷ 	HÐG÷	
õ 	
ú÷ 	HÕGús$   Ä
E
Ä D9Ä(E
Ä9
E	ÅE
Å

Ec             �  óþ  ^ ^^^#   • [        T /TQ70 TDUUS.D6m[        R                  T5        U UUU4S jnUS   (       a)  [        US   5      TR                  R
                   S3-  nOS n[        R                  " 5       n0 US   =(       d    0 ETR                  R                  R                  [        TR                  5      S.EnTR                  R                  R                  /n	UR                  S5      n
U
(       a  U
OS n[        R                  " S	0 0 UESU0ED6   [         R"                  " XiUS9   U" 5       I S h  v•N   S S S 5        S S S 5        g  N! , (       d  f       N= f! , (       d  f       g = f7f)
Nr‘  c               “  óÒ  >#   • TR                  5         [        R                  " [        TSS5      TR                  TR
                  TR                  TR                  =(       d    0 R                  5        V Vs0 s H  u  pSU  3U_M     snn TR                  R                  [        4SS9 n T" T0 TD6I S h  v•N nTR                  X#5         TR!                  5          S S S 5         TR                  5         g s  snn f  NG! [         a=  nTR                  [        U5      SS9  TR                  US[        U5      05        UeS nAf[         a1  nTR                  [        U5      S	9  TR                  US 5        UeS nAff = f! TR!                  5         f = f! , (       d  f       NÀ= f! [         a/  n["        R%                  S
TR                   SU 35         S nAg S nAff = f7f)Nr   r“  r”  F)rƒ   r  r:  r«   r7   r¡   r•  r–  Tr—  r˜  r™  rš  r›  )r  r~  rœ  r�  r  r  r«   r7   r  r¥   rƒ   r   r7  rb  rž  r�   ri  rg   rŸ  r   s	        €€€€r#   r¢  Ú_arun_test.<locals>._testK  sÄ  øé € Ø×ÑÔÜ�XŠXÜ˜˜z¨6Ó2Ø×#Ñ#Ø!*×!5Ñ!5Ø×#Ñ#ð '×/Ñ/×5°2×<Ñ<Ô>ôò ?‘D�Að ˜a˜SÐ! 1Ò$Ù>òð #×-Ñ-×2Ñ2Ü"/Ð!1Øò
ð  ð%Ù# YÐ>°+Ñ>×>�ð ×!Ñ! (Õ3à×"Ñ"Õ$÷=
ð>	Ø×(Ñ(Õ*ùó7ñ ?øÜ ó Ø×,Ñ,´4¸³7ÀDÐ,ÑIØ×!Ñ! (Ð-=¼tÀA»wÐ,GÔHØ�ûÜ ó Ø×,Ñ,´4¸³7Ð,Ñ;Ø×!Ñ! (¨DÔ1Ø�ûðûð ×"Ñ"Õ$ú÷=
õ 
ûôB ó 	Ü�N‰NØ7¸	×8HÑ8HÐ7IÈÈQÈCÐP÷ñ ûð	üs¨   ƒA4G'Á7C:Â	"G'Â+FÂ-DÂ8D Â9DÂ=FÃFÃ G'Ã)F+ Ã9G'Ä DÄ
FÄ8EÅFÅ,E=Å=FÆFÆFÆFÆ
F(Æ$G'Æ+
G$Æ5%GÇG'ÇG$Ç$G'r>   r¤  r7   )rè   r:  r;   r¥  r   )r�  rr  r¨  r   r¥   r4   r~  r©  rè   rƒ   ry   r  r   rª  rU   r«  r_   r¬  )r1   rD   rE   rJ   rK   r¢  r­  r®  r7   r¦  r;   r§  rŽ  s   `  ``       @r#   rH   rH   ;  su  ûé € ô "Øðà	òð ðð &Ø%ó€Iô ‡N�N�9Ô÷&ð &ðP �g×Ü˜.¨Ñ1Ó2¸	×8LÑ8L×8OÑ8OÐ7PÐPUÐ5VÑV‰
àˆ
Ü×,Ò,Ó.€OðØ˜:Ñ&×,¨"ðð $×.Ñ.×9Ñ9×>Ñ>Ü$'¨	×(<Ñ(<Ó$=ñ
ð€Hð ×(Ñ(×/Ñ/×7Ñ7Ð8€LØ!×%Ñ% nÓ5€LÞ".‘,°D€Kô 	×ÒÑGÐF ÐF°¸XÑFÓGÜ×$Ò$Ø¸{ó	
ñ ‹g�ˆ÷		
÷ 	HÐGñ
 	÷		
õ 	
ú÷ 	HÕGüsH   †DE=Ä"E,Ä8EÅEÅEÅE,Å	E=ÅEÅ
E)	Å%E,Å,
E:Å6E=c               óD  • [         R                  " 5       (       a  [        R                  S5        g[        R
                  " 5       n[        R                  5       nU(       a  U(       d  Sn[        U5      eUR                  U 5        UR                  UR                  5        g)a}  Log run inputs from within a pytest test run.

Should only be used in pytest tests decorated with @pytest.mark.langsmith.

Args:
    inputs: Inputs to log.

Example:
    ```python
    from langsmith import testing as t


    @pytest.mark.langsmith
    def test_foo() -> None:
        x = 0
        y = 1
        t.log_inputs({"x": x, "y": y})
        assert foo(x, y) == 2
    ```
z?LANGSMITH_TEST_TRACKING is set to 'false'. Skipping log_inputs.Nz¸log_inputs should only be called within a pytest test decorated with @pytest.mark.langsmith, and with tracing enabled (by setting the LANGSMITH_TRACING environment variable to 'true').)r_   rf   rg   rh   r~  Úget_current_run_treerr  rU   ra   Ú
add_inputsrT  r«   )r«   r4  rŽ  rŠ  s       r#   rT  rT  ‘  sy   € ô* ×)Ò)×+Ñ+Ü�‰ÐUÔVØÜ×&Ò&Ó(€HÜ—‘Ó €IÞž9ðAð 	ô
 ˜‹oÐØ×Ñ˜ÔØ×Ñ˜Ÿ™Õ)r"   c               óF  • [         R                  " 5       (       a  [        R                  S5        g[        R
                  " 5       n[        R                  5       nU(       a  U(       d  Sn[        U5      e[        U 5      n UR                  U 5        UR                  U 5        g)a˜  Log run outputs from within a pytest test run.

Should only be used in pytest tests decorated with @pytest.mark.langsmith.

Args:
    outputs: Outputs to log.

Example:
    ```python
    from langsmith import testing as t


    @pytest.mark.langsmith
    def test_foo() -> None:
        x = 0
        y = 1
        result = foo(x, y)
        t.log_outputs({"foo": result})
        assert result == 2
    ```
z@LANGSMITH_TEST_TRACKING is set to 'false'. Skipping log_outputs.Nz¹log_outputs should only be called within a pytest test decorated with @pytest.mark.langsmith, and with tracing enabled (by setting the LANGSMITH_TRACING environment variable to 'true').)r_   rf   rg   rh   r~  r³  rr  rU   ra   Ú_dumpdÚadd_outputsr]  )r¬   r4  rŽ  rŠ  s       r#   r]  r]  ¶  s~   € ô, ×)Ò)×+Ñ+Ü�‰ÐVÔWØÜ×&Ò&Ó(€HÜ—‘Ó €IÞž9ðAð 	ô
 ˜‹oÐÜ�W‹o€GØ×Ñ˜Ô!Ø×Ñ˜'Õ"r"   c               óÖ   • [         R                  " 5       (       a  [        R                  S5        g[        R                  5       nU(       d  Sn[        U5      eUR                  U 5        g)aË  Log example reference outputs from within a pytest test run.

Should only be used in pytest tests decorated with @pytest.mark.langsmith.

Args:
    reference_outputs: Reference outputs to log.

Example:
    ```python
    from langsmith import testing


    @pytest.mark.langsmith
    def test_foo() -> None:
        x = 0
        y = 1
        expected = 2
        testing.log_reference_outputs({"foo": expected})
        assert foo(x, y) == expected
    ```
zJLANGSMITH_TEST_TRACKING is set to 'false'. Skipping log_reference_outputs.Nzglog_reference_outputs should only be called within a pytest test decorated with @pytest.mark.langsmith.)r_   rf   rg   rh   rr  rU   ra   rU  )r  rŽ  rŠ  s      r#   rU  rU  Ý  s[   € ô, ×)Ò)×+Ñ+Ü�‰ØXô	
ð 	Ü—‘Ó €IÞð5ð 	ô ˜‹oÐØ×#Ñ#Ð$5Õ6r"   )r  r'  c              ó  • [         R                  " 5       (       a  [        R                  S5        gU (       a  [	        XU45      (       a  Sn[        U5      eU (       d  U(       d  Sn[        U5      eU(       a  SU0n Ub  X S'   Ub  X0S'   O [        R                  " 5       n[        R                  5       nU(       a  U(       d  Sn[        U5      eUR                  S	:X  ai  UR                  R                  S
5      (       aI  UR                  S
   nUR                  [        U [        5      (       a  U OSU 05        UR                  US'   OUR                   nUR"                  " U[%        [&        [(        [        4   U 5      40 UD6  g)aa  Log run feedback from within a pytest test run.

Should only be used in pytest tests decorated with @pytest.mark.langsmith.

Args:
    key: Feedback name.
    score: Numerical feedback value.
    value: Categorical feedback value
    kwargs: Any other Client.create_feedback args.

Example:
    ```python
    import pytest
    from langsmith import testing as t


    @pytest.mark.langsmith
    def test_foo() -> None:
        x = 0
        y = 1
        expected = 2
        result = foo(x, y)
        t.log_feedback(key="right_type", score=isinstance(result, int))
        assert result == expected
    ```
úALANGSMITH_TEST_TRACKING is set to 'false'. Skipping log_feedback.NzGMust specify one of 'feedback' and ('key', 'score', 'value'), not both.zDMust specify at least one of 'feedback' or ('key', 'score', value').r  r  r'  zºlog_feedback should only be called within a pytest test decorated with @pytest.mark.langsmith, and with tracing enabled (by setting the LANGSMITH_TRACING environment variable to 'true').Ú
evaluatorsÚreference_run_idr(  Úsource_run_id)r_   rf   rg   rh   r½   ra   r~  r³  rr  rU   Úsession_namer7   r·  r  rG  r4   r  rX  r   r   r)  )	r(  r  r  r'  rk   rŠ  r4  rŽ  r  s	            r#   Úlog_feedbackr¿    s[  € ôF ×)Ò)×+Ñ+Ü�‰ÐWÔXØÞ”C˜ UÐ+×,Ñ,ØWˆÜ˜‹oÐÞž#ØTˆÜ˜‹oÐÞ	Ø˜3�<ˆØÑØ %�WÑØÑØ %�WÑøàä×&Ò&Ó(€HÜ—‘Ó €IÞž9ðAð 	ô
 ˜‹oÐØ×Ñ Ó,°×1BÑ1B×1FÑ1FØ÷2ñ 2ð ×"Ñ"Ð#5Ñ6ˆØ×ÑÜ" 8¬T×2Ñ2‰H¸ÀXÐ8Nô	
ð #+§+¡+ˆˆÒà×"Ñ"ˆØ×Ò˜f¤d¬5´´t°Ñ+<¸hÓ&GÑRÈ6ÓRr"   ÚFeedbackr´   c              #  ó´  #   • [         R                  " 5       (       a  [        R                  S5        Sv •  g[        R                  5       nU(       d  Sn[        U5      eUR                  R                  R                  UR                  UR                  S.n[        R                  " U UR                  SSUS9 nUv •  SSS5        g! , (       d  f       g= f7f)an  Trace the computation of a pytest run feedback as its own run.

Args:
    name: Feedback run name. Defaults to "Feedback".

Example:
    ```python
    import openai
    import pytest

    from langsmith import testing as t
    from langsmith import wrappers

    oai_client = wrappers.wrap_openai(openai.Client())


    @pytest.mark.langsmith
    def test_openai_says_hello():
        # Traced code will be included in the test case
        text = "Say hello!"
        response = oai_client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": text},
            ],
        )
        t.log_inputs({"text": text})
        t.log_outputs({"response": response.choices[0].message.content})
        t.log_reference_outputs({"response": "hello!"})

        # Use this context manager to trace any steps used for generating evaluation
        # feedback separately from the main application logic
        with t.trace_feedback():
            grade = oai_client.chat.completions.create(
                model="gpt-4o-mini",
                messages=[
                    {
                        "role": "system",
                        "content": "Return 1 if 'hello' is in the user message and 0 otherwise.",
                    },
                    {
                        "role": "user",
                        "content": response.choices[0].message.content,
                    },
                ],
            )
            # Make sure to log relevant feedback within the context for the
            # trace to be associated with this feedback.
            t.log_feedback(
                key="llm_judge", score=float(grade.choices[0].message.content)
            )

        assert "hello" in response.choices[0].message.content.lower()
    ```
rº  Nz¼trace_feedback should only be called within a pytest test decorated with @pytest.mark.langsmith, and with tracing enabled (by setting the LANGSMITH_TRACING environment variable to 'true').)rè   r:  r¼  Úignorer»  )rƒ   r«   Úparentr¡   r7   )r_   rf   rg   rh   rr  rU   ra   r¥   rè   rƒ   r  r  r~  rœ  rR  )rƒ   rŽ  rŠ  r7   r4  s        r#   Útrace_feedbackrÄ  M  s¼   é € ôx ×)Ò)×+Ñ+Ü�‰ÐWÔXØŠ
ØÜ—‘Ó €IÞðAð 	ô
 ˜‹oÐà×*Ñ*×5Ñ5×:Ñ:Ø )× 4Ñ 4Ø%×,Ñ,ñ€Hô
 
�ŠØØ×(Ñ(ØØ!Øò
ð 
ØŠ÷
÷ 
ö 
üs   ‚B7CÂ9CÂ>	CÃ
CÃCc                ól   •  [        U 5      R                  SSS9$ ! [         a    [        U 5      s $ f = f)Nzutf-8Úsurrogateescape)Úerrors)r   Údecoder|  ry   )Úxs    r#   r'   r'   ¤  s:   € ðÜ˜!‹}×#Ñ# GÐ4EÐ#ÐFÐFøÜó Ü�1‹vŠðús   ‚ ›3²3c                ób   • [        5       nU(       d  U $  U" U 5      nU$ ! [         a    U s $ f = f)z)Serialize LangChain Serializable objects.)Ú_get_langchain_dumpdr|  )rÉ  Údumpdr-   s      r#   r¶  r¶  «  s:   € ä Ó"€EÞØˆðÙ˜1“Xˆ
ØÐøÜó ØŠðús   •	 Ÿ.­.c                 ó4   •  SSK Jn   U $ ! [         a     g f = f)Nr   ©rÌ  )Úlangchain_core.loadrÌ  ÚImportErrorrÎ  s    r#   rË  rË  ·  s!   € ðÝ-àˆøÜó Ùðús   ‚
 Š
–)r,   r   r]   ry   r\   )r4   rn  r5   ru  r   r>  r6   rA  r7   rÛ   r8   rÛ   r9   rE  r:   z Optional[Union[str | list[str]]]r;   ru  r]   zCallable[[Callable], Callable])rj   r   rk   r   r]   r	   )r6   ry   r]   ry   )r1   r	   r]   ry   )r   úls_client.Clientr6   ry   r]   r@  r0   )r   rÑ  r¥   r@  r8   rÛ   r]   r?  )rª   ry   r«   rG  r¬   rÛ   r]   rB  )r1   r	   r«   rÛ   r¿   rB  r]   ztuple[uuid.UUID, str])r¥   rÂ   )r×   rÑ   r]   rÑ   )r1   r	   rj   r   rD   r   rE   rb   rk   r   r]   rO  )r1   r	   rJ   r   rD   r   rE   rb   rK   r   r]   rD  ro  rp  rq  )r(  z!Optional[Union[dict, list[dict]]]r  ry   r  z!Optional[Union[int, bool, float]]r'  z&Optional[Union[str, int, float, bool]]rk   r   r]   rD  )rƒ   ry   r]   z2Generator[Optional[run_trees.RunTree], None, None])rÉ  r   r]   ry   )rÉ  r   r]   r   )r]   zOptional[Callable])eÚ
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arrå   Ú
contextlibÚcontextvarsÚdatetimerX   r(   rv   rV   Úloggingrt   rJ  rf  rz   rc   Úcollections.abcr   r   Úconcurrent.futuresr   Úpathlibr   Útypingr   r	   r
   r   r   r   r   Útyping_extensionsr   Ú	langsmithr   rÔ   r   rŠ   r   r~  r   rÞ   r   Ú
ls_schemasr   r_   Úlangsmith._internalr   Úlangsmith._internal._serder   Úlangsmith.clientr   r–   Úskipr|  r   rÐ  Ú	getLoggerr   rg   ÚUUIDr©   r$   r%   r.   r2   r„   r�   r�   r§   r¯   rÁ   rÐ   rG  rÑ   rÙ   rÂ   rO  Ú
ContextVarrr  rb   r�  rR   rH   ÚunitrT  r]  rU  r¿  ÚcontextmanagerrÄ  r'   r¶  Ú	lru_cacherË  r   r"   r#   Ú<module>rî     sW  ðÝ "ç  „ ƒÛ Û Û Û Û Û Û Û Û 	Û Û Û Û ß /Ý %Ý ÷÷ ñ õ (å )Ý #Ý 'Ý Ý %Ý +Ý 'Ý 'Ý 1Ý $ðÛà—K‘K×)Ñ)€Mð 
×	Ò	˜8Ó	$€ð —)’)ÐBÓC€áˆCƒL€ÙˆCƒL€ô;ð 
ðØ
ðàóó 
ðð
 
ð #Ø+/Ø)-Ø%)Ø#Ø*.Ø!%Ø.2Ø,0ñ)àð)ð )ð)ð 'ð	)ð
 #ð)ð ð)ð (ð)ð ð)ð ,ð)ð *ð)ð $ô)ó 
ð)ôGôZ
ô$RðEØðEØ/2ðEàôEð. +/ðAØðAà"ðAð (ðAð õ	Að6 #ð3Øð3àð3ð ð3ð õ	3ðXØ
ðXØ*ðXØ6?ðXàôXô"
ñ> ˆT˜ $™Ñ(€ô÷dñ d÷Nm
ñ m
ð` ×#Ñ# H¨YÑ$7Ò8¸ÈtÑT€
ô
*ˆy ò 
*ðIØ
ðIàðIð ðIð ð	Ið
 ðIð ôIðXLØ
ðLàðLð ðLð ð	Lð
 ðLð 
ôLð^OØ
ðOàðOð ðOð ð	Oð
 ðOð 
ôOðf €ô"*ôJ$#ôN"7ðL 37ðHSð
 04Ø48ñHSØ/ðHSð 
ð	HSð
 -ðHSð 2ðHSð ðHSð 
öHSðV ×ÑàñSØðSà7ôSó ðSôlô	ð ×Ñóó ñøðS, ó ô˜	÷ ðús   Â5I# É#I8É7I8