
    >'h                        d Z ddlmZ ddlZddlmZ 	 ddlmZ ddl
mZmZ ddlmZ ddlmZmZ dd	lmZmZ d
Z G d de      Z G d de      Z G d d      Zy# e$ r	 ddl	mZ Y Nw xY w)zN
Directory-based prompt registry implementation that stores prompts as files.
    )annotationsN)Path)Self)	BaseModelField)Prompt)InvalidPromptErrorPromptNotFoundError)DEFAULT_VERSIONPromptModelz
index.jsonc                  @    e Zd ZU dZ ed      Zded<   edd       Zy)	
PromptFilez0Model representing a prompt file stored on disk.T)excluder   pathc                    ||j                    d|j                   dz  }|j                  |j                          | |j                  |j                   |j                  |j                  |      S )a  
        Create a PromptFile instance from a Prompt object and save it to disk.

        Args:
            prompt: The Prompt object to save
            path: Directory path where the prompt file should be stored

        Returns:
            A new PromptFile instance
        .z.jinja)textnameversionmetadatar   )r   r   
write_textrawr   )clspromptr   prompt_files       a/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/banks/registries/directory.pyfrom_prompt_pathzPromptFile.from_prompt_path    sb     }Afnn-=VDDvzz*&++v~~PVP_P_fq
 	
    N)r   z
type[Self]r   r   r   r   returnr   )	__name__
__module____qualname____doc__r   r   __annotations__classmethodr    r   r   r   r      s&    :t$D$$
 
r   r   c                  .    e Zd ZU dZ eg       Zded<   y)PromptFileIndexz1Index tracking all prompt files in the directory.)defaultzlist[PromptFile]filesN)r    r!   r"   r#   r   r*   r$   r&   r   r   r(   r(   3   s    ;#B/E/r   r(   c                  f    e Zd ZdZddddZedd       ZddddZdd	dd
Zd Z	d Z
d ZddZy)DirectoryPromptRegistryz?Registry that stores prompts as files in a directory structure.F)force_reindexc                  t        |      }|j                         sd}t        |      || _        | j                  t        z  | _        | j
                  j                         r|r| j                          y| j                          y)a.  
        Initialize the directory prompt registry.

        Args:
            directory_path: Path to directory where prompts will be stored
            force_reindex: Whether to force rebuilding the index from disk

        Raises:
            ValueError: If directory_path is not a directory
        z%{directory_path} must be a directory.N)	r   is_dir
ValueError_pathDEFAULT_INDEX_NAME_index_pathexists_scan_load)selfdirectory_pathr-   dir_pathmsgs        r   __init__z DirectoryPromptRegistry.__init__<   sf     ' 9CS/!
::(::&&(MJJLJJLr   c                    | j                   S )z0Get the directory path where prompts are stored.)r1   r7   s    r   r   zDirectoryPromptRegistry.pathS   s     zzr   N)r   c                  |xs t         }| j                  j                  D ]W  }|j                  |k(  s|j                  |k(  s#|j
                  j                         s>t        di |j                         c S  t        )a2  
        Retrieve a prompt by name and version.

        Args:
            name: Name of the prompt to retrieve
            version: Version of the prompt (optional)

        Returns:
            The requested Prompt object

        Raises:
            PromptNotFoundError: If prompt doesn't exist
        r&   )
r   _indexr*   r   r   r   r4   r   
model_dumpr
   )r7   r   r   pfs       r   getzDirectoryPromptRegistry.getX   sf     ,_++## 	1Bww$2::#8RWW^^=M000	1 "!r   )	overwritec                  	 |j                   xs t        }| j                  |j                  |      \  }}|rit	        j
                         |j                  d<   t        j                  || j                        | j                  j                  |<   | j                          yd|j                   d}t        |      # t        $ ry t	        j
                         |j                  d<   t        j                  || j                        }| j                  j                  j                  |       | j                          Y yw xY w)a  
        Store a prompt in the registry.

        Args:
            prompt: The Prompt object to store
            overwrite: Whether to overwrite existing prompt

        Raises:
            InvalidPromptError: If prompt exists and overwrite=False
        )r   r   
created_atzPrompt with name 'z1' already exists. Use overwrite=True to overwriteN)r   r   _get_prompt_filer   timectimer   r   r   r1   r?   r*   _saver	   r
   append)r7   r   rC   r   idxrA   r:   s          r   setzDirectoryPromptRegistry.setl   s    	nn7G++g+NGC04

-)3)D)DVTZZ)X!!#&

*6;;-7hi(--" 	,0JJLFOOL),,VTZZ@BKK$$R(JJL		s   BB< !B< <A?D>=D>c                h    t         j                  | j                  j                               | _        y)z Load the prompt index from disk.N)r(   model_validate_jsonr3   	read_textr?   r=   s    r   r6   zDirectoryPromptRegistry._load   s#    %99$:J:J:T:T:VWr   c                j    | j                   j                  | j                  j                                y)zSave the prompt index to disk.N)r3   r   r?   model_dump_jsonr=   s    r   rI   zDirectoryPromptRegistry._save   s#    ##DKK$?$?$ABr   c           	        t               | _        | j                  j                  d      D ]  }d|j                  v r|j                  j                  dd      n|j                  t        f\  }}|j                  d      5 }t        |j                         |||i       }| j                  j                  j                  |       ddd        | j                  j                  | j                  j                                y# 1 sw Y   xY w)z4Scan directory for prompt files and build the index.z*.jinja*r      r)r   r   r   r   r   N)r(   r?   r1   globstemrsplitr   openr   readr*   rJ   r3   r   rQ   )r7   r   r   r   frA   s         r   r5   zDirectoryPromptRegistry._scan   s    '6'8JJOOJ/ 	-D8;tyy8HDII,,S!4tyyZiNjMD'3 -1QVVXD'PT_ab!!((,- -	-
 	##DKK$?$?$AB- -s   >AD  D		c                   t        | j                  j                        D ]*  \  }}|j                  |k(  s|j                  |k(  s&||fc S  d| d| d}t        |      )a(  
        Find a prompt file in the index.

        Args:
            name: Name of the prompt
            version: Version of the prompt

        Returns:
            Tuple of (index position, PromptFile)

        Raises:
            PromptNotFoundError: If prompt doesn't exist in index
        zcannot find prompt with name 'z' and version '')	enumerater?   r*   r   r   r
   )r7   r   r   irA   r:   s         r   rF   z(DirectoryPromptRegistry._get_prompt_file   sf     t{{001 	EArww$2::#8"u	 /tfOG9AN!#&&r   )r8   strr-   bool)r   r   )r   r_   r   
str | Noner   r   )r   r   rC   r`   )r   ra   r   r_   r   ztuple[int, PromptFile])r    r!   r"   r#   r;   propertyr   rB   rL   r6   rI   r5   rF   r&   r   r   r,   r,   9   sL    IEJ .   7; "( 8= 6XCC'r   r,   )r#   
__future__r   rG   pathlibr   typingr   ImportErrortyping_extensionspydanticr   r   banksr   banks.errorsr	   r
   banks.promptr   r   r2   r   r(   r,   r&   r   r   <module>rl      sl    #  ' &  @ 5 " 
 
00i 0s' s'U  '&'s   A A)(A)