
    Poi
                         d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ  e
e          Zej        dz  Ze                    dd            G d	 d
          ZdS )    N)Path)ListDictAnyOptional)setup_logger)configslack_contextT)parentsexist_okc            	           e Zd ZdZdZdefdZdeeee	f                  fdZ
deeee	f                  ddfd	Zdd
ededee         ddfdZdeeee	f                  fdZddZdS )ContextStoragez;Manages persistent conversation history for Slack channels.(   
channel_idc                 8    || _         t          | dz  | _        d S )Nz.json)r   CONTEXT_DIR	file_path)selfr   s     2/root/projects/butler/slack_bot/context/storage.py__init__zContextStorage.__init__   s"    $$*';';';;    returnc                 @   | j                                         sg S 	 t          | j         dd          5 }t          j        |          cd d d            S # 1 swxY w Y   d S # t
          $ r1}t                              d| j         d|            g cY d }~S d }~ww xY w)Nrutf-8encodingzFailed to load context for : )	r   existsopenjsonload	Exceptionloggererrorr   )r   fes      r   _loadzContextStorage._load   s    ~$$&& 	I	dncG<<< $y||$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 	 	 	LLMtMM!MMNNNIIIIII	s@   A" AA" AA" AA" "
B,&BBBcontextNc                    	 t          | j        dd          5 }t          j        ||dd           d d d            d S # 1 swxY w Y   d S # t          $ r0}t
                              d| j         d|            Y d }~d S d }~ww xY w)	Nwr   r   F   )ensure_asciiindentzFailed to save context for r   )r    r   r!   dumpr#   r$   r%   r   )r   r)   r&   r'   s       r   _savezContextStorage._save!   s   	OdncG<<< D	'15CCCCD D D D D D D D D D D D D D D D D D 	O 	O 	OLLMtMM!MMNNNNNNNNN	Os7   A ?A AA AA 
B%BBrolecontentmodelc                    |                                  }||t          j                    d}|r||d<   |                    |           t          |          | j        k    r|| j         d         }|                     |           dS )z
        Add a message to the context.

        Args:
            role: 'user' or 'assistant'
            content: Message content
            model: Model identifier (only for assistant messages, currently always 'gemini')
        )r1   r2   	timestampr3   N)r(   timeappendlenMAX_MESSAGESr0   )r   r1   r2   r3   r)   msgs         r   add_messagezContextStorage.add_message(   s     **,,
 

  	! CLs w<<$+++t00112G

7r   c                     |                                  }g }|D ]&}|                    |d         |d         d           '|S )z
        Get conversation context in standard format.

        Returns messages as [{"role": "user", "content": "..."}, ...]
        r1   r2   )r1   r2   )r(   r7   )r   full_contextfilteredr:   s       r   get_contextzContextStorage.get_contextB   sa     zz||  	 	COOFy>     
 r   c                     | j                                         r| j                                          t                              d| j                    dS )z#Clear all context for this channel.zCleared context for N)r   r   unlinkr$   infor   )r   s    r   clearzContextStorage.clearT   sO    >  "" 	$N!!###<4?<<=====r   )N)r   N)__name__
__module____qualname____doc__r9   strr   r   r   r   r(   r0   r   r;   r?   rC    r   r   r   r      s       EE L<3 < < < <tDcN+    OT$sCx.1 Od O O O O  c (3- SW    4T$sCx.1    $> > > > > >r   r   )r!   r6   pathlibr   typingr   r   r   r   health.utils.logging_configr   healthr	   rD   r$   DATA_DIRr   mkdirr   rI   r   r   <module>rP      s            , , , , , , , , , , , , 4 4 4 4 4 4      	h		o/   $  . . .K> K> K> K> K> K> K> K> K> K>r   