
    7|hf                        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y)    )annotationsN)TYPE_CHECKINGDictIterableIteratorListOptionalUnioncast)BaseChatLoader)ChatSession)loadClientRunc                  `    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	y)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.
    Nc                >    ddl m} || _        |xs  |       | _        y)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   runsclient)selfr   r   r   s       i/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_loaders/langsmith.py__init__zLangSmithRunChatLoader.__init__   s     	,	(    c                h    t         j                  |       }t         j                  |       }|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)llm_runchat_sessionr   s      r   _load_single_chat_sessionz0LangSmithRunChatLoader._load_single_chat_session)   s7     .HHQ*FFwO	(1L%r   c                V   | j                   dk7  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$>w?O?O>PQRRW^^+A'..AQRSS9::'
3W__-m<Q?	JH$>??r   c                    | j                   dk7  rt        d| j                          | j                  xs i j                  di       j                  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   sT     u$>w?O?O>PQRR#(()<bAEEkRRr   c           
   #  B  K   ddl m} | j                  D ]L  }	 t        |d      r|}n| j                  j                  |      }| j                  t        ||            }| N y# t        $ r.}t        j                  d| dt        |              Y d}~d}~ww xY ww)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      	*yy 
	G	7D)!C++..w7C88c3H
	  !4WIRQyIJs/   BA	A%"B%	B.$BBBB)N)r   zIterable[Union[str, Run]]r   Optional['Client'])r!   'Run'returnr   )r!   rA   rB   zOptional[List[Dict]]rB   zIterator[ChatSession])
__name__
__module____qualname____doc__r   staticmethodr#   r   r    r?    r   r   r   r      sh     MQ)-)7I)   @ @" 	S 	Sr   r   c                  &    e Zd ZdZddddZddZy)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   c               z    	 ddl m} || _        |xs  |       | _        y# t        $ r}t        d      |d}~ww xY w)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   ImportErrordataset_namer   )r   rN   r   r   r>   s        r   r   z#LangSmithDatasetChatLoader.__init__v   sL    	/ )(  	A 	s     	:5:c           	   #    K   ddl m} | j                  j                  | j                        }|D ]M  }t        |j                  dg       D cg c]  }|j                  |       c}|j                  d             O yc c}w w)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)rN   r'   r   )r'   r   N)langchain_community.adaptersrP   r   read_dataset_openai_finetuningrN   r   r2   convert_dict_to_message)r   oai_adapterdata
data_pointms        r   r?   z$LangSmithDatasetChatLoader.lazy_load   s      	G{{99** : 
  	J (^^J;  77: %..5 	s   ABB
%"B)rN   strr   r@   rC   )rD   rE   rF   rG   r   r?   rI   r   r   rK   rK   m   s     KO )&r   rK   )
__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   r5   r   	getLoggerrD   r8   r   rK   rI   r   r   <module>r`      sS    "  W W W 6 4 )'%			8	$Y^ Yx2 2r   