U
    h(                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZ ejejdd eeZeejZe	e
eeee	e f f  ddd	d
ZG dd dZddddZddddZedkre  dS )    N)Path)DictListMappingOptionalUnioncastenv)utilsz%(message)s)levelformat)services_statusreturnc                 C   s  g }| D ]Z}t |d t |d d}ttt |dg }|rXddd |D |d< || qtd	d
 |D }tdd
 |D }dd|d  d|d  d g}|D ]F}|d |d }|d |d }	|dd}
|||	 |
  q|d t	
d| d S )NServiceStatus)r   r   Z
Publishersz, c                 S   s   g | ]}t |d  qS )ZPublishedPort)str).0Z	publisher r   6/tmp/pip-unpacked-wheel-cqvhoa9t/langsmith/cli/main.py
<listcomp>   s     z#pprint_services.<locals>.<listcomp>ZPublishedPortsc                 s   s   | ]}t |d  V  qdS )r   Nlenr   servicer   r   r   	<genexpr>"   s     z"pprint_services.<locals>.<genexpr>c                 s   s   | ]}t |d  V  qdS )r   Nr   r   r   r   r   r   #   s     
   zPublished Ports z
To connect, set the following environment variables in your LangChain application:
LANGSMITH_TRACING_V2=true
LANGSMITH_ENDPOINT=http://localhost:80/api)r   r   r   r   getjoinappendmaxljustloggerinfo)r   Zservicesr   Zservice_statusZ
publishersZmax_service_lenZmax_state_lenZservice_messageZservice_strZ	state_strZ	ports_strr   r   r   pprint_services   s<    

r&   c                   @   s   e Zd ZdZddddZeee dddZeddd	d
Z	ddddZ
ddeddddZdddee eeddddZdeddddZddddZddddZdS )LangSmithCommandz$Manage the LangSmith Tracing server.Nr   c                 C   s   t t jd | _d S )Nzdocker-compose.yaml)r   __file__absoluteparentdocker_compose_fileselfr   r   r   __init__<   s    zLangSmithCommand.__init__c                 C   s   t  S N)ls_utilsZget_docker_compose_commandr-   r   r   r   docker_compose_commandA   s    z'LangSmithCommand.docker_compose_command)urlr   c                 C   s,   zt d|g W n tk
r&   Y nX d S )Nopen)
subprocessrunFileNotFoundError)r.   r3   r   r   r   _open_browserE   s    zLangSmithCommand._open_browserc                 C   sN   | j dt| jf}t|d	 td td td | d d S )
N-fup--quiet-pull--waita  LangSmith server is running at http://localhost:80/api.
To view the app, navigate your browser to http://localhost:80

To connect your LangChain application to the server locally,
set the following environment variable when running your LangChain application.
z	LANGSMITH_TRACING=truez,	LANGSMITH_ENDPOINT=http://localhost:80/api
zhttp://localhost)r:   r;   r<   )r2   r   r,   r5   r6   r$   r%   r8   )r.   commandr   r   r   _start_localK   s"       

zLangSmithCommand._start_local0.5.7version)rA   r   c                C   s*   |t jd< t| jdt| jdf dS )zPull the latest LangSmith images.

        Args:
            version: The LangSmith version to use for LangSmith. Defaults to 0.5.7
        Z_LANGSMITH_IMAGE_VERSIONr9   pullN)osenvironr5   r6   r2   r   r,   )r.   rA   r   r   r   rB   e   s    

zLangSmithCommand.pull)openai_api_keyrA   )rE   langsmith_license_keyrA   r   c                C   s<   |dk	r|t jd< |dk	r$|t jd< | j|d |   dS )a  Run the LangSmith server locally.

        Args:
            openai_api_key: The OpenAI API key to use for LangSmith
                If not provided, the OpenAI API Key will be read from the
                OPENAI_API_KEY environment variable. If neither are provided,
                some features of LangSmith will not be available.
            langsmith_license_key: The LangSmith license key to use for LangSmith
                If not provided, the LangSmith license key will be read from the
                LANGSMITH_LICENSE_KEY environment variable. If neither are provided,
                Langsmith will not start up.
            version: The LangSmith version to use for LangSmith. Defaults to latest.
        NOPENAI_API_KEYLANGSMITH_LICENSE_KEYr@   )rC   rD   rB   r>   )r.   rE   rF   rA   r   r   r   starty   s    

zLangSmithCommand.startF)clear_volumesr   c                 C   sR   | j dt| jdf}|rDtd}| dkr:td dS |d t| dS )Stop the LangSmith server.r9   ZdownzYou are about to delete all the locally cached LangSmith containers and volumes. This operation cannot be undone. Are you sure? [y/N]yz	Aborting.Nz	--volumes)	r2   r   r,   inputlowerprintr!   r5   r6   )r.   rJ   cmdZconfirmr   r   r   stop   s    
zLangSmithCommand.stopc                 C   s    t | jdt| jdf dS )z)Print the logs from the LangSmith server.r9   logsN)r5   r6   r2   r   r,   r-   r   r   r   rR      s    zLangSmithCommand.logsc                 C   s   | j dt| jdddf}tj|tjtjd}z|jd}t	|}W n" tj
k
rj   td Y dS X |rtd	 t| ntd
 dS dS )z6Provide information about the status LangSmith server.r9   Zpsz--formatjson)stdoutstderrzutf-8z'Error checking LangSmith server status.Nz*The LangSmith server is currently running.z$The LangSmith server is not running.)r2   r   r,   r5   r6   PIPErT   decoderS   loadsJSONDecodeErrorr$   errorr%   r&   )r.   r=   resultZcommand_stdoutr   r   r   r   status   s.    	



zLangSmithCommand.status)F)__name__
__module____qualname____doc__r/   propertyr   r   r2   r8   r>   rB   r   rI   boolrQ   rR   r\   r   r   r   r   r'   9   s,   r'   r(   c                  C   sr   t  } | t   | t   tdd |  D }td | 	 D ] \}}t|| d|  qLdS )z*Print the runtime environment information.c                 s   s   | ]}t |V  qd S r0   r   )r   keyr   r   r   r      s     zenv.<locals>.<genexpr>zLangChain Environment:z: N)
ls_envZget_runtime_environmentupdateZget_docker_environmentZget_langchain_env_varsr"   keysr$   r%   items)r
   Zmax_key_lengthkvr   r   r   r
      s    
r
   c            	         sx  t d t d t } | jdd}t  |jddd}|jdtdd	d
 |jdtddd
 |jdddd
 |j	 fddd |jddd}|jdddd |j	 fddd |jddd}|jdddd
 |j	 fddd |jddd}|j	 fd dd |jd!d"d}|j	 fd#dd |d$}|j	d%d d | 
 }t|d&sj|   d'S || d'S )(zMain entrypoint for the CLI.z<BY USING THIS SOFTWARE YOU AGREE TO THE TERMS OF SERVICE AT:z0https://smith.langchain.com/terms-of-service.pdfzLangSmith CLI commands)descriptionrI   zStart the LangSmith server.z--openai-api-keyrG   zThe OpenAI API key to use for LangSmith. If not provided, the OpenAI API Key will be read from the OPENAI_API_KEY environment variable. If neither are provided, some features of LangSmith will not be available.)defaulthelpz--langsmith-license-keyrH   zThe LangSmith license key to use for LangSmith. If not provided, the LangSmith License Key will be read from the LANGSMITH_LICENSE_KEY environment variable. If neither are provided, the Langsmith application will not spin up.z	--versionr?   z>The LangSmith version to use for LangSmith. Defaults to 0.5.7.c                    s    j | j| j| jdS )N)rE   rF   rA   )rI   rE   rF   rA   argsZserver_commandr   r   <lambda>  s   zmain.<locals>.<lambda>)funcrQ   rK   z--clear-volumes
store_truez?Delete all the locally cached LangSmith containers and volumes.)actionrl   c                    s    j | jdS )N)rJ   )rQ   rJ   rm   ro   r   r   rp         rB   z!Pull the latest LangSmith images.c                    s    j | jdS )Nr@   )rB   rA   rm   ro   r   r   rp     rt   rR   zShow the LangSmith server logs.c                    s      S r0   )rR   rm   ro   r   r   rp   #  rt   r\   z!Show the LangSmith server status.c                    s      S r0   )r\   rm   ro   r   r   rp   '  rt   r
   c                 S   s   t  S r0   r	   rm   r   r   r   rp   )  rt   rq   N)rO   argparseArgumentParseradd_subparsersr'   
add_parseradd_argumentrC   getenvset_defaults
parse_argshasattr
print_helprq   )	parserZ
subparsersZserver_start_parserZserver_stop_parserZserver_pull_parserZserver_logs_parserZserver_status_parserZ
env_parserrn   r   ro   r   main   s     
 
 
  
r   __main__)ru   rS   loggingrC   r5   pathlibr   typingr   r   r   r   r   r   Z	langsmithr
   rd   r   r1   basicConfigINFO	getLoggerr]   r$   r)   r+   Z_DIRr   r&   r'   r   r   r   r   r   <module>   s$    

(' R