o
    Zhf                     @  s   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eZG d	d
 d
eZG dd deZdS )    )annotationsN)TYPE_CHECKINGDictIterableIteratorListOptionalUnioncast)BaseChatLoader)ChatSession)loadClientRunc                   @  sR   e Zd ZdZ	ddddZedddZedddZedddZd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                 C  s"   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    r   a/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_loaders/langsmith.py__init__   s   
zLangSmithRunChatLoader.__init__llm_run'Run'returnr   c                 C  s$   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   Zchat_sessionr   r   r   r   _load_single_chat_session)   s
   

z0LangSmithRunChatLoader._load_single_chat_sessionc                 C  sv   | 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 d	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 runZgenerationsr   message)r%   )run_type
ValueErrorZinputsZoutputsr   r   )r   r%   Zmessage_chunkr   r   r   r    7   s   

z1LangSmithRunChatLoader._get_messages_from_llm_runOptional[List[Dict]]c                 C  s2   | 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$   Zinvocation_paramsr   )r'   r(   extraget)r   r   r   r   r!   I   s   
z2LangSmithRunChatLoader._get_functions_from_llm_runIterator[ChatSession]c                 c  s    ddl m} | jD ]<}zt|dr|}n| j|}| t||}|V  W q
 tyF } zt	
d| dt|  W Y d}~q
d}~w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   Zread_runr"   r
   r(   loggerwarningrepr)r   r   Zrun_objrunsessioner   r   r   	lazy_loadU   s   	


z LangSmithRunChatLoader.lazy_load)N)r   r   r   r   )r   r   r   r   )r   r   r   r)   r   r,   )
__name__
__module____qualname____doc__r   staticmethodr"   r    r!   r6   r   r   r   r   r      s    	r   c                   @  s*   e Zd ZdZddddd	Zd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             
   C  sJ   zddl m} W n ty } ztd|d}~w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   ImportErrorr>   r   )r   r>   r   r   r5   r   r   r   r   v   s   z#LangSmithDatasetChatLoader.__init__r   r,   c                 #  sV    ddl m  | jj| jd}|D ]}t fdd|dg D |ddV  qd	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)r>   c                   s   g | ]}  |qS r   )Zconvert_dict_to_message).0mZoai_adapterr   r   
<listcomp>   s    z8LangSmithDatasetChatLoader.lazy_load.<locals>.<listcomp>r%   r   )r%   r   N)Zlangchain_community.adaptersrA   r   Zread_dataset_openai_finetuningr>   r   r+   )r   dataZ
data_pointr   rD   r   r6      s   



z$LangSmithDatasetChatLoader.lazy_load)r>   r?   r   r   r7   )r8   r9   r:   r;   r   r6   r   r   r   r   r=   m   s    r=   )
__future__r   loggingtypingr   r   r   r   r   r   r	   r
   Zlangchain_core.chat_loadersr   Zlangchain_core.chat_sessionsr   Zlangchain_core.load.loadr   r   r   r.   r   	getLoggerr8   r0   r   r=   r   r   r   r   <module>   s    (
\