
    +#h                        d dl Z d dlmZmZ d dlZd dlmZmZmZm	Z	m
Z
 d dlZ	 d dlmZ d dlmZmZmZmZmZ dedee   d	ed
edeeeef      f
dZ G d d      Z G d dej6                        Zy# e$ r	  ed      w xY w)    N)AnyList)APITimeoutErrorInternalServerErrorOpenAIRateLimitErrorUnprocessableEntityError)MongoClient)ConfigurationErrorConnectionFailure
InvalidURIOperationFailureServerSelectionTimeoutErrorzLPlease install the pymongo package by running `pip install dspy-ai[mongodb]`
index_namequery_vectornum_candidateslimitreturnc                 *    d| d|||didddddid	igS )
Nz$vectorSearch	embedding)indexpathqueryVectornumCandidatesr   z$projectr      z$metavectorSearchScore)_idtextscore r   r   r   r   s       [/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/retrieve/mongodb_atlas_rm.pybuild_vector_search_pipeliner#      sA    
 ##+!/	
 
QW>Q4RST     c                   t    e Zd ZdedefdZ ej                  ej                  ee	e
efd      defd       Zy)	Embedderprovidermodelc                     |dk(  r9t        j                  d      }|st        d      t               | _        || _        y y )NopenaiOPENAI_API_KEYz/Environment variable OPENAI_API_KEY must be set)osgetenv
ValueErrorr   clientr(   )selfr'   r(   api_keys       r"   __init__zEmbedder.__init__0   s=    xii 01G !RSS (DKDJ  r$      )max_timer   c                     | j                   j                  j                  || j                        }|j                  D cg c]  }|j
                   c}S c c}w )N)inputr(   )r/   
embeddingscreater(   datar   )r0   queriesr   results       r"   __call__zEmbedder.__call__8   sE     KK**11tzz1R	/8~~>V  >>>s    AN)__name__
__module____qualname__strr2   backoffon_exceptionexpor   r   r   r	   r   r<   r    r$   r"   r&   r&   /   sZ     S  W$		
 	?3 ?	?r$   r&   c                   d     e Zd Z	 	 	 ddedededededef fdZded	ej                  fd
Z xZ	S )MongoDBAtlasRMdb_namecollection_namer   kembedding_providerembedding_modelc                    t         |   |       || _        || _        || _        t        j                  d      | _        t        j                  d      | _        t        j                  d      | _	        | j                  st        d      | j                  st        d      | j                  st        d      	 t        d| j                   d	| j                   d
| j                   d| j                   d	      | _        t'        ||      | _        y # t        t        t        t         t"        f$ r}t%        d      |d }~ww xY w)N)rH   ATLAS_USERNAMEATLAS_PASSWORDATLAS_CLUSTER_URLz/Environment variable ATLAS_USERNAME must be setz/Environment variable ATLAS_PASSWORD must be setz2Environment variable ATLAS_CLUSTER_URL must be setzmongodb+srv://:@/z?retryWrites=true&w=majorityz"Failed to connect to MongoDB Atlas)r'   r(   )superr2   rF   rG   r   r,   r-   usernamepasswordcluster_urlr.   r
   r/   r   r   r   r   r   ConnectionErrorr&   embedder)	r0   rF   rG   r   rH   rI   rJ   e	__class__s	           r"   r2   zMongoDBAtlasRM.__init__H   s+    	1.$		"23		"2399%89}}NOO}}NOOQRR	O% qqAQAQ@RRSTXT`T`Sa./DK !*<OT '
 	O ""FGQN	Os   ;AD E1D==Equery_or_queriesr   c                 4   | j                  |g      }t        | j                  |d   | j                  dz  | j                        }| j                  | j
                     | j                     j                  |      }t        j                  t        |            S )Nr   
   r!   )passages)rW   r#   r   rH   r/   rF   rG   	aggregatedspy
Predictionlist)r0   rZ   r   pipelinecontentss        r"   forwardzMongoDBAtlasRM.forwardn   s{    }}&6%78/%a66B;&&	
 ;;t||,T-A-ABLLXVX77r$   )   r*   ztext-embedding-ada-002)
r=   r>   r?   r@   intr2   r_   r`   rd   __classcell__)rY   s   @r"   rE   rE   G   sl     "*7$U$U $U 	$U
 $U  $U $UL	8 	8 	8r$   rE   )r,   typingr   r   rA   r*   r   r   r   r   r	   r_   pymongor
   pymongo.errorsr   r   r   r   r   ImportErrorr@   floatrf   dictr#   r&   RetrieverE   r    r$   r"   <module>ro      s    	    # #';@CLO	$sCx."? ?008T]] 08_  
V s   A1 1A?