
    h;                         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                   R    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      || _
        || _        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(                  j/                  | j"                   d| j                   d| j&                        }|j0                  dk7  rt!        d|j2                         |j5                         d   d   rn| j(                  j/                  | j"                   d| j                   | j&                        }|j5                         | _        t        d| j6                          y ||dk(  rdddii}n*|dk(  rddt8        ddi}n|d k(  rd d!dd"i}nt        d#      | j(                  j;                  | j"                   d| j                   t<        d$d%|d&| j&                  '      }|j5                         d   rn| j(                  j/                  | j"                   d| j                   | j&                        }|j5                         | _        t        d(| j6                          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_model
isinstancestr
startswithgetenv
ValueErrorqdrant_api_baseqdrant_api_keyr   sync_clientCachingasync_clientgetstatus_codetextr*   collection_infor   putr   )selfr7   r8   r/   r0   r)   r1   	host_typer+   r   r   r   r   r   collection_existscollection_detailsquantization_paramsnew_collection_statuss                     a/var/www/Befach/backend/env/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!. /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(:Q+>  %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)rA   rJ   s     rG   _get_cache_logicz$QdrantSemanticCache._get_cache_logic   sV    """	@"jjO
   	@!..?O	@s    ??c           
         t        d|        dd l}|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   messages contentTzno-storezno-cachemodelinputcachedata	embeddingpointsr>   responseidvectorpayloadr   /pointsr   r   r*   )r   uuidr   r   litellmr[   r1   r3   r2   uuid4r9   r@   r7   r/   r   )rA   keyvaluekwargsre   rR   promptmessageembedding_responser[   rZ   s              rG   	set_cachezQdrantSemanticCache.set_cache   s   A&JK *%Ggi((F   "**#'T:
 'v.q1+>	E
%%%% djjl+' &$) 	
 	''(d6J6J5K7SLL 	 	

 	rI   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: rR   rS   rT   TrU   rV   rZ   r   r[   quantizationF      @ignorerescoreoversamplingr	   ra   paramslimitwith_payloadr   /points/searchrd   r   scorerb   r>   &semantic cache: similarity threshold: , similarity: 
, prompt: , closest_cached_prompt: r^   got a cache hit, similarity: , Current prompt: , cached_prompt: rJ   )r   r   r   rf   r[   r1   r9   postr7   r/   r   r*   r2   listlenr0   rP   )rA   rh   rj   rR   rk   rl   rm   r[   rZ   search_responseresults
similaritycached_promptcached_values                 rG   	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 rI   c                 6  K   dd l }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   llm_model_list
llm_routerz/async qdrant semantic-cache set_cache, kwargs: rR   rS   rT   
model_namemetadatauser_api_keyTrU   trace_idr   zsemantic-cache-embeddingr   rW   rX   rY   r   rV   rZ   r[   r\   r]   r_   r   rc   rd   )re   litellm.proxy.proxy_serverr   r   r   r1   r<   
aembeddingrf   r3   r2   rg   r;   r@   r7   r/   r   )rA   rh   ri   rj   re   r   r   rR   rk   rl   mrouter_model_namesr   rm   r[   rZ   s                   rG   async_set_cachez#QdrantSemanticCache.async_set_cache  s    IGxPQ *%Ggi((F  
 ) '55Q|_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   7FFB FF-F3F4B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   rR   rS   rT   r   r   r   TrU   r   r   r   rV   rZ   r[   rp   Frq   rr   r	   rv   r   rz   rd   r   g        zsemantic-similarityr{   rb   r>   r|   r}   r~   r   r^   r   r   r   r   )r   r   r   r   r1   r<   r   rf   r;   r   r7   r/   r   r*   
setdefaultr2   r   r   r0   rP   )rA   rh   rj   r   r   rR   rk   rl   r   r   r   rm   r[   rZ   r   r   r   r   r   s                      rG   async_get_cachez#QdrantSemanticCache.async_get_cacheY  s    GxPQI *%Ggi((F  
 ) '55Q|_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rL   )r?   )rA   s    rG   _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)rA   
cache_listrj   tasksvals        rG   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-002N)__name__
__module____qualname__rH   r   rP   rn   r   r   r   r   r    rI   rG   r   r      sQ     ! 0CGJ	 	+ZAF>@Xt$%rI   r   )__doc__rN   r   r*   typingr   r   rf   litellm._loggingr   litellm.constantsr   r   litellm.types.utilsr   
base_cacher
   r   r   rI   rG   <module>r      s5         * H 1 !b%) b%rI   