
    +#h                         d Z ddlmZmZmZmZ ddlZddlmZ 	 ddl	m
Z
 dee   fdZ G d	 d
ej                        Zy# e$ r	  ed      w xY w)z,
Retriever model for Milvus or Zilliz Cloud
    )CallableListOptionalUnionN)dotdict)MilvusClientz_The pymilvus library is required to use MilvusRM. Install it with `pip install dspy-ai[milvus]`textsc                     ddl m}  |       }|j                  j                  | d      }|j                  D cg c]  }|j
                   c}S c c}w )Nr   )OpenAIztext-embedding-3-small)inputmodel)openair   
embeddingscreatedata	embedding)r	   r   clientresponsexs        T/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/retrieve/milvus_rm.pyopenai_embedding_functionr      sK    XF  ''& ( H "*/AAKK///s   Ac                       e Zd ZdZ	 	 	 	 	 ddedee   dee   dee   dee   defd	Zdd
e	ee
e   f   dee   dej                  fdZy)MilvusRMa  
    A retrieval module that uses Milvus to return passages for a given query.

    Assumes that a Milvus collection has been created and populated with the following field:
        - text: The text of the passage

    Args:
        collection_name (str): The name of the Milvus collection to query against.
        uri (str, optional): The Milvus connection uri. Defaults to "http://localhost:19530".
        token (str, optional): The Milvus connection token. Defaults to None.
        db_name (str, optional): The Milvus database name. Defaults to "default".
        embedding_function (callable, optional): The function to convert a list of text to embeddings. 
            The embedding function should take a list of text strings as input and output a list of embeddings.
            Defaults to None. By default, it will get OpenAI client by the environment variable OPENAI_API_KEY 
            and use OpenAI's embedding model "text-embedding-3-small" with the default dimension.
        k (int, optional): The number of top passages to retrieve. Defaults to 3.

    Returns:
        dspy.Prediction: An object containing the retrieved passages.

    Examples:
        Below is a code snippet that shows how to use this as the default retriever:
        ```python
        llm = dspy.OpenAI(model="gpt-3.5-turbo")
        retriever_model = MilvusRM(
            collection_name="<YOUR_COLLECTION_NAME>",
            uri="<YOUR_MILVUS_URI>",
            token="<YOUR_MILVUS_TOKEN>"
            )
        dspy.settings.configure(lm=llm, rm=retriever_model)
        ```

        Below is a code snippet that shows how to use this in the forward() function of a module
        ```python
        self.retrieve = MilvusRM(k=num_passages)
        ```
    Ncollection_nameuritokendb_nameembedding_functionkc                     t        |||      | _        || j                  j                         vrt        d|       || _        |xs t
        | _        || _        y )N)r   r   r   zMilvus collection not found: )r   milvus_clientlist_collectionsAttributeErrorr   r   r   top_k)selfr   r   r   r   r   r   s          r   __init__zMilvusRM.__init__D   s_     *cP $"4"4"E"E"GG #@@Q!RSS."4"Q8Q
    query_or_queriesreturnc           
         t        |t              r|g}| j                  |      }|xs | j                  }| j                  j                  | j                  |dg|      }i }|D ]  }|D ]  }|d   ||d   d   <     t        |j                         d d      d | }t        j                  |D 	
cg c]  \  }	}
t        d|	i       c}
}		      S c c}
}	w )
Ntext)r   r   output_fieldslimitdistanceentityc                     | d   S )N    )r   s    r   <lambda>z"MilvusRM.forward.<locals>.<lambda>i   s
    !A$ r'   T)keyreverse	long_text)passages)
isinstancestrr   r$   r!   searchr   sorteditemsdspy
Predictionr   )r%   r(   r   query_embeddings
milvus_respassage_scoresresrsorted_passagespassage_s              r   forwardzMilvusRM.forwardW   s    &, 01223CDO''.. 00!!(	 / 

  	DC D67
mq{623D	D !  "

1 [j(kZWVW+w1G)H(kll(ks   1C
)zhttp://localhost:19530NdefaultN   )N)__name__
__module____qualname____doc__r9   r   r   intr&   r   r   r=   r>   rG   r2   r'   r   r   r      s    $R 6#!*15 c] }	
 # %X. &mc49n(= m(3- m[_[j[j mr'   r   )rM   typingr   r   r   r   r=   	dsp.utilsr   pymilvusr   ImportErrorr9   r   Retriever   r2   r'   r   <module>rT      se    3 2  %0T#Y 0Nmt}} Nm#  
i s	   ? A