o
    RTh!                  	   @   s@  d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ zddlZddlZdZW n ey9   dZY nw d)d
ededeeef fddZdedeeef fddZdedeeef fddZd*ddZd+ddZdedefddZdedefddZg dZG d d! d!ZG d"d# d#ZG d$d% d%Zd,d'd(ZdS )-zl
Creates user and system messages as context for ChatGPT, using the history of the current IPython session.
    )TracebackException)TracebackType)AnyDictOptionalTypeUnion)GenaiMarkdownNTFusertextrolereturnc                 C   s
   | |dS )N)contentr    )r   r   r   r   P/home/air/segue/gemini/backup/venv/lib/python3.10/site-packages/genai/context.pycraft_message      
r   codec                 C   s
   t | dS Nr
   )r   )r   r   r   r   craft_user_message   r   r   outputc                 C   s   t t| dS )z0Craft a message from the output of an execution.system)r   
repr_genair   r   r   r   craft_output_message   s   r         c                 C   st  | j \}}tj|   dgd}|d | d |d< tj| j|gdd }g d|_|d 	t
|d< | jtjgd	j jd
did}t| jg dd	j}|rg| jg dd	}	|	j jd
did}
ntjdgd}
t|| j d }t|| j d }| j|ddj|dd}d}d|dd|dd|j|d d|j|d d|
j|d d| d| d|j|d }|S )aK  
    Create a summary of a Pandas DataFrame for ChatGPT.

    Parameters:
        df (Pandas DataFrame): The dataframe to be summarized.
        sample_rows (int): The number of rows to sample
        sample_columns (int): The number of columns to sample

    Returns:
        A markdown string with a summary of the dataframe
    Missing Values)columnsd   	% Missing   )axis)Column Name	Data Typer   r    r$   )includeindexr#   )categorydatetime	timedeltar   githubz&## Dataframe Summary

Number of Rows: ,z

Number of Columns: z

### Column Information

tablefmtz

### Numerical Summary

z

### Categorical Summary



### Sample Data (x)

)shapepd	DataFrameisnullsumconcatdtypesreset_indexr   astypestrdescribenpnumberTrenameanyselect_dtypesminsampleto_markdown)dfsample_rowssample_columnsnum_rowsnum_colsmissing_valuescolumn_infonumerical_summaryhas_categoricalscategorical_describecategorical_summarysampledr-   r   r   r   r   summarize_dataframe    sL   

 





rQ   c           
      C   s   t | }| j}|   }|| d }t|tjr"|   j	}nt
jj|r3| jdd j	}n|   j	}| t||}d}d|dd| d|dd	|d
d|j|d d| d| j|d }	|	S )a  
    Create a summary of a Pandas Series for ChatGPT.

    Parameters:
        series (pd.Series): The series to be summarized.
        sample_size (int): The number of values to sample

    Returns:
        A markdown string with a summary of the series
    r   T)datetime_is_numericr*   z%## Series Summary

Number of Values: r+   z

Data Type: z

Missing Values: z (z.2fz%)

### Summary Statistics

r,   r.   r0   )lendtyper4   r5   r<   
issubdtyper=   r;   to_framer>   r2   apitypesis_string_dtyperC   rB   rD   )
seriessample_size
num_values	data_typenum_missingpercent_missingsummary_statisticsrP   r-   r   r   r   r   summarize_series\   s8   
	ra   c                 C   s   t st| S t| tjr)ttjjj| j	d }ttjjj
| j	d }t| ||dS t| tjr@ttjjj
| j	d }t| |dS t| S )Nr!   r   )rF   rG   )r[   )PANDAS_INSTALLEDrepr
isinstancer2   r3   rB   optionsdisplaymax_columnsr1   max_rowsrQ   Seriesra   )r   num_columnsrH   r   r   r   repr_genai_pandas   s   rk   c                 C   sL   t st| S tdddddd t| W  d   S 1 sw   Y  dS )z{Compute a GPT-3.5 friendly representation of the output of a cell.

    For DataFrames and Series this means Markdown.
    zdisplay.max_rowsr   zdisplay.html.table_schemaFzdisplay.max_columnsr   N)rb   rc   r2   option_contextrk   r   r   r   r   r      s   $r   )z# genai:ignorez#genai:ignorez#ignorez# ignoreget_ipythonz	%load_extz%pip installz%%promptc                	   @   sv   e Zd ZU dZi Zeeef ed< ede	de
e dedefddZed	d
 Zedee	ef dee fddZdS )
PastErrorsz%Tracks previous errors in the sessionerrorsexecution_countetypeevaluetbc                 C   s0   d t|||ddjdd}|| jt|< d S )N
   )limitT)chain)joinr   formatro   r:   )clsrp   rq   rr   rs   condensed_errorr   r   r   add   s   zPastErrors.addc                 C   
   i | _ d S N)ro   rz   r   r   r   clear      
zPastErrors.clearr   c                 C      | j t|S r~   )ro   getr:   rz   rp   r   r   r   r         zPastErrors.getN)__name__
__module____qualname____doc__ro   r   r:   __annotations__classmethodintr   BaseExceptionr   r|   r   r   r   r   r   r   r   r   rn      s"   
 
$rn   c                   @   sj   e Zd ZU dZi Zeeef ed< e	de
defddZe	dd Ze	dee
ef d	ee fd
dZdS )PastAssistsz&Tracks previous assists in the sessionassistsrp   assistc                 C   s   || j t|< d S r~   )r   r:   )rz   rp   r   r   r   r   r|      s   zPastAssists.addc                 C   r}   r~   )r   r   r   r   r   r      r   zPastAssists.clearr   c                 C   r   r~   )r   r   r:   r   r   r   r   r      r   zPastAssists.getN)r   r   r   r   r   r   r:   r	   r   r   r   r|   r   r   r   r   r   r   r   r   r      s   
 
$r   c                   @   s@   e Zd ZdZdd Zddedee defd	d
Ze	dd Z
dS )ContextzFUtility class to build the context for ChatGPT from an IPython sessionc                 C   s
   g | _ d S r~   _contextselfr   r   r   __init__   r   zContext.__init__Nr
   r   rp   r   c                 C   s"   t ||d|d}| j| d S )N)r   )messagerp   )r   r   append)r   r   rp   r   contextual_messager   r   r   r      s   
zContext.appendc                 C   s   dd | j D S )Nc                 S   s   g | ]}|d  qS )r   r   ).0r   r   r   r   
<listcomp>   s    z$Context.messages.<locals>.<listcomp>r   r   r   r   r   messages   r   zContext.messagesr   )r   r   r   r   r   r:   r   r   r   propertyr   r   r   r   r   r      s    r   r!   c           	         s   t  }| jd||dD ]P\}} t fddtD rq|j d|d t|}|d ur5|j|d|d t|}|d urG|j|jd|d | j	|}|d ur[|jt
|d|d q|S )	Nr   )sessionstartstopc                 3   s    | ]}  |V  qd S r~   )
startswith)r   token	cell_textr   r   	<genexpr>   s    z build_context.<locals>.<genexpr>r
   )r   rp   r   	assistant)r   	get_ranger@   ignore_tokensr   rn   r   r   r   output_histr   )	history_managerr   r   contextr   execution_counter
past_errorpast_assistr   r   r   r   build_context   s$   

r   )r
   )r   r   )r   )r!   N) r   	tracebackr   rX   r   typingr   r   r   r   r   genai.displayr	   numpyr<   pandasr2   rb   ImportErrorr:   r   r   r   rQ   ra   rk   r   r   rn   r   r   r   r   r   r   r   <module>   s0     

<+