a
    bgf                     @  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                   @  sl   e Zd ZdZddddddZedd	d
ddZedd	d
ddZeddd
ddZd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.
    NzIterable[Union[str, Run]]Optional['Client'])runsclientc                 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   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_loaders/langsmith.py__init__   s    
zLangSmithRunChatLoader.__init__z'Run'r   )llm_runreturnc                 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r4td| j | jsBt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
ValueErrorinputsoutputsr   r   )r   r#   Zmessage_chunkr   r   r   r   7   s    

z1LangSmithRunChatLoader._get_messages_from_llm_runz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]r   c                 c  s   ddl m} | jD ]}z6t|dr(|}n| j|}| t||}|V  W q ty } z2t	
d| dt|  W Y d}~qW Y d}~qd}~0 0 q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)
__name__
__module____qualname____doc__r   staticmethodr    r   r   r6   r   r   r   r   r      s   	 r   c                   @  s4   e Zd ZdZdddddddZd	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   strr   )dataset_namer   c             
   C  sV   zddl m} W n. ty> } ztd|W Y d}~n
d}~0 0 || _|pN| | _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                 #  sT   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.adaptersr@   r   Zread_dataset_openai_finetuningr>   r   r*   )r   dataZ
data_pointr   rC   r   r6      s    


z$LangSmithDatasetChatLoader.lazy_load)r7   r8   r9   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   	getLoggerr7   r0   r   r<   r   r   r   r   <module>   s   (
\