
    i<                         d Z ddlZddlZddlZddlmZmZ ddlZddlm	Z	 ddl
mZmZ ddlmZ ddlmZ  G d	 d
e      Zy)z
Qdrant Semantic Cache implementation

Has 4 methods:
    - set_cache
    - get_cache
    - async_set_cache
    - async_get_cache
    N)Anycast)print_verbose)QDRANT_SCALAR_QUANTILEQDRANT_VECTOR_SIZE)EmbeddingResponse   )	BaseCachec                   T    e Zd Z	 	 	 	 	 	 	 	 ddZdefdZd Zd Zd Zd Z	d	 Z
d
 Zy)QdrantSemanticCacheNc	                    dd l }	ddlm}
m}m} ddlm} |t        d      || _        t        d| j                          |t        d      || _
        || _        ||nt        | _        i }|r)t        |t              r|j!                  d      r ||      }|r)t        |t              r|j!                  d      r ||      }|xs$ |	j#                  d      xs |	j#                  d	      }|xs |	j#                  d
      }ddi}|r||d<   |t%        d      || _        || _        t        d| j&                          || _         |
       | _         ||j.                        | _        |t        d       | j,                  j3                  | j&                   d| j                   d| j*                        }|j4                  dk7  rt%        d|j6                         |j9                         d   d   rn| j,                  j3                  | j&                   d| j                   | j*                        }|j9                         | _        t        d| j:                          y ||dk(  rdddii}n*|dk(  rddt<        ddi}n|d k(  rd d!dd"i}nt        d#      | j,                  j?                  | j&                   d| j                   | j                  d$d%|d&| j*                  '      }|j9                         d   rn| j,                  j3                  | j&                   d| j                   | j*                        }|j9                         | _        t        d(| j:                          y t        d)      )*Nr   )_get_httpx_clientget_async_httpx_clienthttpxSpecialProvider)get_secret_strz-collection_name must be provided, passed Nonez0qdrant semantic-cache initializing COLLECTION - z2similarity_threshold must be provided, passed Nonezos.environ/
QDRANT_URLQDRANT_API_BASEQDRANT_API_KEYzContent-Typezapplication/jsonzapi-keyzQdrant url must be providedz'qdrant semantic-cache qdrant_api_base: )llm_providerzNQuantization config is not provided. Default binary quantization will be used./collections/z/exists)urlheaders   z1Error from qdrant checking if /collections exist resultexistsz.Collection already exists.
Collection details:binary
always_ramFscalarint8)typequantiler   productx16)compressionr   zBQuantization config must be one of 'scalar', 'binary' or 'product'Cosine)sizedistance)vectorsquantization_config)r   jsonr   z+New collection created.
Collection details:z#Error while creating new collection) os&litellm.llms.custom_httpx.http_handlerr   r   r   litellm.secret_managers.mainr   	Exceptioncollection_namer   similarity_thresholdembedding_modelr   vector_size
isinstancestr
startswithgetenv
ValueErrorqdrant_api_baseqdrant_api_keyr   sync_clientCachingasync_clientgetstatus_codetextr*   collection_infor   put)selfr8   r9   r/   r0   r)   r1   	host_typer2   r+   r   r   r   r   r   collection_existscollection_detailsquantization_paramsnew_collection_statuss                      v/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/caching/qdrant_semantic_cache.py__init__zQdrantSemanticCache.__init__   s    		
 	

 	@"KLL.>t?S?S>TU	
  'PQQ$8!.&2K8J 	  /3/O4N4N5 #1"A.#.>3L3L4 "0!? Vryy6V"))DU:V 	 (F2995E+F!#56!/GI":;;.,?@T@T?UVW,.2-55
 &` !,,00''(d6J6J5K7SLL 1 
 ((C/CDUDZDZC[\  !!#H-h7!%!1!1!5!5++,M$:N:N9OP "6 " $6#:#:#<D A$BVBVAWX #*.AX.M$e'#
 %0 &$:&+'# %	1uEJ'#  X  %)$4$4$8$8++,M$:N:N9OP(,(8(8hO+>  %9 %! %))+H5%)%5%5%9%9//0d>R>R=ST LL &: &" (:'>'>'@$B4CWCWBXY   EFF    cached_responsec                     ||S 	 t        j                  |      }|S # t        $ r t        j                  |      }Y |S w xY wN)r*   loadsr.   astliteral_eval)rB   rK   s     rH   _get_cache_logicz$QdrantSemanticCache._get_cache_logic   sV    """	@"jjO
   	@!..?O	@s    ??c           
         t        d|        ddlm} |d   }d}|D ]
  }||d   z  } t        t        t        j                  | j                  |ddd	            }|d
   d   d   }	t        |      }t        |t              sJ dt        |j                               |	||ddgi}
| j                  j                  | j                   d| j                   d| j                  |
       y )Nz)qdrant semantic-cache set_cache, kwargs: r   uuidmessages contentTzno-storezno-cachemodelinputcachedata	embeddingpointsr?   responseidvectorpayloadr   /pointsr   r   r*   )r   litellm._uuidrT   r   r   litellmr^   r1   r4   r3   uuid4r:   rA   r8   r/   r   )rB   keyvaluekwargsrT   rU   promptmessageembedding_responser^   r]   s              rH   	set_cachezQdrantSemanticCache.set_cache   s   A&JK& *%Ggi((F   "**#'T:
 'v.q1+>	E
%%%% djjl+' &$) 	
 	''(d6J6J5K7SLL 	 	

 	rJ   c           
         t        d|        |d   }d}|D ]
  }||d   z  } t        t        t        j                  | j
                  |ddd            }|d   d	   d
   }|dddddiddd}| j                  j                  | j                   d| j                   d| j                  |      }	|	j                         d   }
|
y t        |
t              rt        |
      d	k(  ry |
d	   d   }|
d	   d   d   }t        d| j                   d| d| d|        || j                  k\  r1|
d	   d   d   }t        d| d| d|        | j!                  |       S y )!Nz.sync qdrant semantic-cache get_cache, kwargs: rU   rV   rW   TrX   rY   r]   r   r^   quantizationF      @ignorerescoreoversamplingr	   rd   paramslimitwith_payloadr   /points/searchrg   r   scorere   r?   &semantic cache: similarity threshold: , similarity: 
, prompt: , closest_cached_prompt: ra   got a cache hit, similarity: , Current prompt: , cached_prompt: rK   )r   r   r   ri   r^   r1   r:   postr8   r/   r   r*   r3   listlenr0   rQ   )rB   rk   rm   rU   rn   ro   rp   r^   r]   search_responseresults
similaritycached_promptcached_values                 rH   	get_cachezQdrantSemanticCache.get_cache   s   FvhOP *%Ggi((F   "**#'T:
 'v.q1+>	  ##$'!  
 **//''(d6J6J5K>ZLL 0 

 "&&(2?gt$7|q QZ(

9-f5 	4T5N5N4O~^h]iistzs{  |U  Vc  Ud  e	
 222"1:i0<L/
|;MfXUfgtfuv (((FF rJ   c                 :  K   ddl m} ddlm}m} t        d|        |d   }d}|D ]
  }	||	d   z  } ||D 
cg c]  }
|
d   	 c}
ng }|| j                  |v rq|j                  d	i       j                  d
d      }|j                  | j                  |ddd|d|j                  d	i       j                  dd       d       d {   }n-t        j                  | j                  |ddd       d {   }|d   d   d   }t        |      }t        |t              sJ dt        |j                               |||ddgi}| j                  j                  | j                   d| j                    d| j"                  |       d {    y c c}
w 7 7 7 w)Nr   rS   llm_model_list
llm_routerz/async qdrant semantic-cache set_cache, kwargs: rU   rV   rW   
model_namemetadatauser_api_keyTrX   trace_idr   zsemantic-cache-embeddingr   rZ   r[   r\   r   rY   r]   r^   r_   r`   rb   r   rf   rg   )rh   rT   litellm.proxy.proxy_serverr   r   r   r1   r=   
aembeddingri   r4   r3   rj   r<   rA   r8   r/   r   )rB   rk   rl   rm   rT   r   r   rU   rn   ro   mrouter_model_namesr   rp   r^   r]   s                   rH   async_set_cachez#QdrantSemanticCache.async_set_cache  s    &IGxPQ *%Ggi((F  
 ) '55nQ|_n5 	
 !d&:&:>P&P!::j"599."ML'1'<'<**#'T:$004 &

:r : > >z4 P	 (= 	( 	" (/'9'9**#'T:( " 'v.q1+>	E
%%%% djjl+' &$) 	
 ##''(d6J6J5K7SLL $ 
 	
 	

 	a 6	""2	
sB   9FFB FF-F5F6BF
FFFFc                   K   t        d|        ddlm}m} |d   }d}|D ]
  }||d   z  } ||D cg c]  }|d   	 c}ng }	|| j                  |	v rq|j                  di       j                  d	d      }
|j                  | j                  |d
d
d|
d
|j                  di       j                  dd       d       d {   }n-t        j                  | j                  |d
d
d       d {   }|d   d   d   }|ddd
ddidd
d}| j                  j                  | j                   d| j                   d| j                  |       d {   }|j                         d   }|d|j                  di       d<   y t        |t               r$t#        |      dk(  rd|j                  di       d<   y |d   d   }|d   d   d    }t        d!| j$                   d"| d#| d$|        ||j                  di       d<   || j$                  k\  r1|d   d   d%   }t        d&| d'| d(|        | j'                  |)      S y c c}w 7 7 X7 w)*Nz/async qdrant semantic-cache get_cache, kwargs: r   r   rU   rV   rW   r   r   r   TrX   r   r   r   rY   r]   r^   rs   Frt   ru   r	   ry   r   r}   rg   r   g        zsemantic-similarityr~   re   r?   r   r   r   r   ra   r   r   r   r   )r   r   r   r   r1   r=   r   ri   r<   r   r8   r/   r   r*   
setdefaultr3   r   r   r0   rQ   )rB   rk   rm   r   r   rU   rn   ro   r   r   r   rp   r^   r]   r   r   r   r   r   s                      rH   async_get_cachez#QdrantSemanticCache.async_get_cache]  s    GxPQI *%Ggi((F  
 ) '55nQ|_n5 	
 !d&:&:>P&P!::j"599."ML'1'<'<**#'T:$004 &

:r : > >z4 P	 (= 	( 	" (/'9'9**#'T:( " 'v.q1+>	  ##$'!  
 !% 1 1 6 6''(d6J6J5K>ZLL !7 !
 
 "&&(2?GJFj"-.CDgt$7|q KN!!*b12GHQZ(

9-f5 	4T5N5N4O~^h]iistzs{  |U  Vc  Ud  e	

 DN*b)*?@222"1:i0<L/
|;MfXUfgtfuv (((FF Y 6	"",
sC   3IH?B II-I/I0A!II
C3II
Ic                 "   K   | j                   S wrM   )r@   )rB   s    rH   _collection_infoz$QdrantSemanticCache._collection_info  s     ###s   c                    K   g }|D ]+  }|j                   | j                  |d   |d   fi |       - t        j                  |  d {    y 7 w)Nr   r	   )appendr   asynciogather)rB   
cache_listrm   tasksvals        rH   async_set_cache_pipelinez,QdrantSemanticCache.async_set_cache_pipeline  sP     CLL---c!fc!fGGH nne$$$s   AA
AA)NNNNNztext-embedding-ada-002NN)__name__
__module____qualname__rI   r   rQ   rq   r   r   r   r   r    rJ   rH   r   r      sT     ! 0GGR	 	+ZAF>@Xt$%rJ   r   )__doc__rO   r   r*   typingr   r   ri   litellm._loggingr   litellm.constantsr   r   litellm.types.utilsr   
base_cacher
   r   r   rJ   rH   <module>r      s5         * H 1 !f%) f%rJ   