
    Ngf                        d dl mZ d dlZd dlmZmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ erd dlmZ d dlmZ  ej        e          Z G d	 d
e          Z G d de          ZdS )    )annotationsN)TYPE_CHECKINGDictIterableIteratorListOptionalUnioncast)BaseChatLoader)ChatSession)loadClientRunc                  n    e Zd ZdZ	 dddZedd            Zedd            Zedd            ZddZ	dS )LangSmithRunChatLoaderz
    Load chat sessions from a list of LangSmith "llm" runs.

    Attributes:
        runs (Iterable[Union[str, Run]]): The list of LLM run IDs or run objects.
        client (Client): Instance of LangSmith client for fetching data.
    NrunsIterable[Union[str, Run]]clientOptional['Client']c                B    ddl m} || _        |p	 |            | _        dS )z
        Initialize a new LangSmithRunChatLoader instance.

        :param runs: List of LLM run IDs or run objects.
        :param client: An instance of LangSmith client, if not provided,
            a new client instance will be created.
        r   r   N)langsmith.clientr   r   r   )selfr   r   r   s       f/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_loaders/langsmith.py__init__zLangSmithRunChatLoader.__init__   s3     	,+++++	(    llm_run'Run'returnr   c                |    t                               |           }t                               |           }|r||d<   |S )z
        Convert an individual LangSmith LLM run to a ChatSession.

        :param llm_run: The LLM run object.
        :return: A chat session representing the run's data.
        	functions)r   _get_messages_from_llm_run_get_functions_from_llm_run)r   chat_sessionr#   s      r   _load_single_chat_sessionz0LangSmithRunChatLoader._load_single_chat_session)   sB     .HHQQ*FFwOO	 	2(1L%r   c                Z   | j         dk    rt          d| j                    d| j        vrt          d| j                   | j        st          d          t	          | j                  d         }t	          | j                  d         d         d         }t          ||gz   	          S )
z
        Extract messages from a LangSmith LLM run.

        :param llm_run: The LLM run object.
        :return: ChatSession with the extracted messages.
        llmExpected run of type llm. Got: messagesz"Run has no 'messages' inputs. Got zCannot convert pending rungenerationsr   message)r+   )run_type
ValueErrorinputsoutputsr   r   )r   r+   message_chunks      r   r$   z1LangSmithRunChatLoader._get_messages_from_llm_run7   s     u$$Qw?OQQRRRW^++R'.RRSSS 	;9:::''
3W_--m<Q?	JH$>????r   Optional[List[Dict]]c                    | j         dk    rt          d| j                    | j        pi                     di                               d          S )z
        Extract functions from a LangSmith LLM run if they exist.

        :param llm_run: The LLM run object.
        :return: Functions from the run or None.
        r)   r*   invocation_paramsr#   )r.   r/   extraget)r   s    r   r%   z2LangSmithRunChatLoader._get_functions_from_llm_runI   sX     u$$Qw?OQQRRR#(()<bAAEEkRRRr   Iterator[ChatSession]c           
   #  \  K   ddl m} | j        D ]}	 t          |d          r|}n| j                            |          }|                     t          ||                    }|V  X# t          $ r7}t          
                    d| dt          |                      Y d}~d}~ww xY wdS )a	  
        Lazy load the chat sessions from the iterable of run IDs.

        This method fetches the runs and converts them to chat sessions on-the-fly,
        yielding one session at a time.

        :return: Iterator of chat sessions containing messages.
        r   r   idzCould not load run z: N)langsmith.schemasr   r   hasattrr   read_runr'   r   r/   loggerwarningrepr)r   r   run_objrunsessiones         r   	lazy_loadz LangSmithRunChatLoader.lazy_loadU   s       	*)))))y 
	 
	G	7D)) 8!CC+..w77C88c3HH   IWIIQIIJJJ
	 
	s   AA((
B)2-B$$B))N)r   r   r   r   )r   r    r!   r   )r   r    r!   r3   r!   r8   )
__name__
__module____qualname____doc__r   staticmethodr'   r$   r%   rE    r   r   r   r      s          MQ) ) ) ) )    \ @ @ @ \@" 	S 	S 	S \	S     r   r   c                  (    e Zd ZdZddddZddZdS )LangSmithDatasetChatLoaderz
    Load chat sessions from a LangSmith dataset with the "chat" data type.

    Attributes:
        dataset_name (str): The name of the LangSmith dataset.
        client (Client): Instance of LangSmith client for fetching data.
    N)r   dataset_namestrr   r   c                   	 ddl m} n"# t          $ r}t          d          |d}~ww xY w|| _        |p	 |            | _        dS )a  
        Initialize a new LangSmithChatDatasetLoader instance.

        :param dataset_name: The name of the LangSmith dataset.
        :param client: An instance of LangSmith client; if not provided,
            a new client instance will be created.
        r   r   zkThe LangSmith client is required to load LangSmith datasets.
Please install it with `pip install langsmith`N)r   r   ImportErrorrO   r   )r   rO   r   r   rD   s        r   r   z#LangSmithDatasetChatLoader.__init__v   sx    	/////// 	 	 	A  	 )(s   	 
(#(r!   r8   c              #     K   ddl m | j                            | j                  }|D ]H}t          fd|                    dg           D             |                    d                    V  IdS )	a:  
        Lazy load the chat sessions from the specified LangSmith dataset.

        This method fetches the chat data from the dataset and
        converts each data point to chat sessions on-the-fly,
        yielding one session at a time.

        :return: Iterator of chat sessions containing messages.
        r   )openai)rO   c                :    g | ]}                     |          S rL   )convert_dict_to_message).0moai_adapters     r   
<listcomp>z8LangSmithDatasetChatLoader.lazy_load.<locals>.<listcomp>   s7         77::  r   r+   r#   )r+   r#   N)langchain_community.adaptersrT   r   read_dataset_openai_finetuningrO   r   r7   )r   data
data_pointrY   s      @r   rE   z$LangSmithDatasetChatLoader.lazy_load   s       	GFFFFF{99* : 
 
  	 	J   '^^J;;   %..55      	 	r   )rO   rP   r   r   rF   )rG   rH   rI   rJ   r   rE   rL   r   r   rN   rN   m   sW          KO ) ) ) ) ) )&     r   rN   )
__future__r   loggingtypingr   r   r   r   r   r	   r
   r   langchain_core.chat_loadersr   langchain_core.chat_sessionsr   langchain_core.load.loadr   r   r   r;   r   	getLoggerrG   r>   r   rN   rL   r   r   <module>rf      s7   " " " " " "  W W W W W W W W W W W W W W W W W W W W 6 6 6 6 6 6 4 4 4 4 4 4 ) ) ) ) ) ) &''''''%%%%%%		8	$	$Y Y Y Y Y^ Y Y Yx2 2 2 2 2 2 2 2 2 2r   