
    `gj-                        d Z ddlmZ ddlmZmZ ddlmZ  G d de      ZddZ	 G d d	e      Z
 G d
 de      Z G d de      Zy)z4Backend abstraction for Mem0 Platform and OSS modes.    )annotations)ABCabstractmethod)Anyc                      e Zd ZdZeddddd       Zeddd	 	 	 	 	 	 	 	 	 	 	 dd       Zedd	       Zedd
       ZddZ	y)Mem0BackendzIUnified interface over Platform (MemoryClient) and OSS (Memory) backends.
   Ftop_krerankc                    y N )selfqueryfiltersr   r   s        O/root/.hermes/venv/lib/python3.12/site-packages/plugins/memory/mem0/_backend.pysearchzMem0Backend.search           Ninfermetadatac                    y r   r   )r   messagesuser_idagent_idr   r   s         r   addzMem0Backend.add   s     	r   c                     y r   r   r   	memory_idtexts      r   updatezMem0Backend.update   r   r   c                     y r   r   r   r!   s     r   deletezMem0Backend.delete    r   r   c                     y r   r   r   s    r   closezMem0Backend.close$   s    r   
r   strr   dictr   intr   boolreturnz
list[dict]r   listr   r+   r   r+   r   r.   r   zdict | Noner/   r,   r!   r+   r"   r+   r/   r,   r!   r+   r/   r,   r/   None)
__name__
__module____qualname____doc__r   r   r   r#   r&   r)   r   r   r   r   r   	   s    S@BSX     $		 		
 	 	 	 
	 	    r   r   c                n    t        | t              r| j                  dg       S t        | t              r| S g S )uJ   Normalize API response — extract results list from dict or pass through.results)
isinstancer,   getr1   )responses    r   _unwrap_resultsr?   (   s1    (D!||Ir**(D!Ir   c                  ^    e Zd ZdZddZdddddZddd	 	 	 	 	 	 	 	 	 	 	 dd	Zdd
ZddZy)PlatformBackendz6Wraps mem0.MemoryClient for Mem0 Platform (cloud API).c                ,    ddl m}  ||      | _        y )Nr   )MemoryClient)api_key)mem0rC   _client)r   rD   rC   s      r   __init__zPlatformBackend.__init__4   s    %#G4r   r	   Fr
   c               V    | j                   j                  ||||      }t        |      S )N)r   r   r   )rF   r   r?   r   r   r   r   r   r>   s         r   r   zPlatformBackend.search8   s+    <<&&ugUSY&Zx((r   Nr   c               V    |||d}|r||d<    | j                   j                  |fi |S N)r   r   r   r   )rF   r   r   r   r   r   r   r   kwargss          r   r   zPlatformBackend.add<   :     .5(UZ![!)F:t||3F33r   c                F    | j                   j                  ||       d|dS )N)r!   r"   Memory updated.resultr!   )rF   r#   r    s      r   r#   zPlatformBackend.updateJ   s$    id;+)DDr   c                D    | j                   j                  |       d|dS )N)r!   Memory deleted.rQ   )rF   r&   r%   s     r   r&   zPlatformBackend.deleteN   s"    i0+)DDr   )rD   r+   r*   r0   r2   r3   )	r6   r7   r8   r9   rG   r   r   r#   r&   r   r   r   rA   rA   1   sl    @5 ACSX )  $44 	4
 4 4 4 
4EEr   rA   c                  p    e Zd ZdZdddZddZdddddZddd		 	 	 	 	 	 	 	 	 	 	 dd
ZddZddZ	ddZ
y)SelfHostedBackendu  Direct HTTP backend for a self-hosted Mem0 server (the FastAPI ``server/``).

    mem0.MemoryClient can't be reused for self-hosted: it is hardwired to the
    cloud API — ``Authorization: Token`` auth and a ``GET /v1/ping/`` validation
    call in ``__init__`` that the self-hosted server does not expose (it would
    404 before any real request). This client talks to that server directly,
    using its actual contract: ``X-API-Key`` auth and the ``/memories`` /
    ``/search`` routes.
    Nc                    dd l }ddi}|r||d<   ||j                  d      }|j                  |j                  d      |d|	      | _        y )
Nr   zContent-Typezapplication/jsonz	X-API-Key   )retries/g      >@)base_urlheaderstimeout	transport)httpxHTTPTransportClientrstriprF   )r   rD   hostr^   r_   r\   s         r   rG   zSelfHostedBackend.__init__^   s`    !#56#*GK  ++A+6I||[[%w $ 
r   c                     | j                   j                  ||fi |}|j                          |j                  r|j	                         S i S r   )rF   requestraise_for_statuscontentjson)r   methodpathrM   resps        r   _jsonzSelfHostedBackend._jsonn   sB    #t||##FD;F;"lltyy{22r   r	   Fr
   c               T    ||d}|r||d<   t        | j                  dd|            S )N)r   r   r   POSTz/searchrh   )r?   rl   )r   r   r   r   r   bodys         r   r   zSelfHostedBackend.searchs   s2    ).?%DOtzz&)$zGHHr   r   c               F    ||||d}|r||d<   | j                  dd|      S )N)r   r   r   r   r   rn   z	/memoriesro   rl   )r   r   r   r   r   r   rp   s          r   r   zSelfHostedBackend.addz   s;     ! 	 
 'Dzz&+Dz99r   c                >    | j                  dd| d|i       d|dS )NPUT
/memories/r"   ro   rP   rQ   rr   r    s      r   r#   zSelfHostedBackend.update   s*    

5Jyk2&$
H+)DDr   c                6    | j                  dd|        d|dS )NDELETEru   rT   rQ   rr   r%   s     r   r&   zSelfHostedBackend.delete   s"    

8z)56+)DDr   c                X    	 | j                   j                          y # t        $ r Y y w xY wr   )rF   r)   	Exceptionr(   s    r   r)   zSelfHostedBackend.close   s)    	LL  		s    	))r   )rD   r+   rc   r+   )ri   r+   rj   r+   r/   r   r*   r0   r2   r3   r4   )r6   r7   r8   r9   rG   rl   r   r   r#   r&   r)   r   r   r   rV   rV   S   sy    
 3
 ACSX I  $:: 	:
 : : : 
:&EEr   rV   c                  v    e Zd ZdZddZedd       ZdddddZddd		 	 	 	 	 	 	 	 	 	 	 dd
ZddZ	ddZ
d Zy)
OSSBackendz-Wraps mem0.Memory for self-hosted (OSS) mode.c                .   dd l }ddlm} dfd}t        d         }t        |j	                  di             }d|v r!|j
                  j                  |d         |d<   j	                  di       j	                  di       }|j	                  d      }|s)d	d
lm}	 |j	                  dd      }
|	j	                  |
      }|r(||d<   | j                  |j	                  dd      ||       ||d<   | |d       |d      dd}|j                  |      | _        y )Nr   )Memoryc                   t        	|          }t        |j                  d      xs d      j                         j	                         }t        |j                  di             }|j                  dd       }|rFddlm}m} | dk(  r|n|j                  |i       }|j                  d      }|r|j                  ||       ||d<   |S )	Nprovider configapi_base   )EMBEDDER_PROVIDERSLLM_PROVIDERSllmbase_url_key)
r,   r+   r=   striplowerpop_oss_providersr   r   
setdefault)
nameblockr   provider_configlegacy_baser   r   provider_defcanonical_key
oss_configs
            r   _provider_blockz,OSSBackend.__init__.<locals>._provider_block   s    D)*E599Z06B7==?EEGH"599Xr#:;O)--j$?KM &*U]M8J#h#  !- 0 0 @ #..}kJ-E(OLr   vector_storer   rj   embedderembedding_dimsr   )
KNOWN_DIMSmodelr   embedding_model_dimsr   qdrantr   zv1.1)r   r   r   version)r   r+   r/   r,   )osrE   r}   r,   r=   rj   
expanduserr   r   $_recreate_collection_if_dims_changedfrom_config_memory)r   r   r   r}   r   r   	vs_configembedder_configdimsr   r   r   s    `          r   rG   zOSSBackend.__init__   s   	" J~67))(B78	Y " 2 29V3D EIf$..R8<<XrJ""#342#''4E>>%(D04I,-55  X6	4 "+X )"5)'
3	
 ))&1r   c                J   |j                  dd      }| dk(  r!	 ddlm} |j                  d      }|j                  d      }|r
 ||      }n|r |||j                  d	      
      }ny	 |j                  |      s	 |j	                          y|j                  |      }|j                  j                  j                  }	t        |	t              r4t        t        |	j                               d      }
|
r|
j                  nd}nt        |	dd      }|||k7  r|j!                  |       |j	                          y| dk(  r	 ddl}ddlm} i }dD ]  }|j                  |      s||   ||<    |j                  d      r|d   |d<    |j(                  di |}d|_        	 |j-                         }	 |j/                  d|f       |j1                         }|rN|d   dkD  rF|d   |k7  r>|j/                  |j3                  d      j5                  |j7                  |                   |j	                          	 |j	                          yy# |j	                          w xY w# t"        $ r Y yw xY w# |j	                          w xY w# |j	                          w xY w# t"        $ r Y yw xY w)z@Delete stale vector collection when embedding dimensions change.collection_namerE   r   r   )QdrantClientrj   url)rj   rD   )r   rD   Nsizepgvector)sql)rc   portuserpassworddbnamesslmodeTzWSELECT atttypmod FROM pg_attribute WHERE attrelid = %s::regclass AND attname = 'vector'zDROP TABLE IF EXISTS {}r   )r=   qdrant_clientr   collection_existsr)   get_collectionr   paramsvectorsr<   r,   nextitervaluesr   getattrdelete_collectionry   psycopg2r   connect
autocommitcursorexecutefetchoneSQLformat
Identifier)r   r   expected_dimsr   r   rj   r   clientinfor   firstcurrent_dimsr   pgsqlconn_paramskconncurrows                      r   r   z/OSSBackend._recreate_collection_if_dims_changed   sn    $--(96Bx6 }}V,mmE*)t4F)c9==;STF#!33OD LLN "00AD"kk0088G!'40 $T'..*:%;T B5:uzz'.w'E#/LM4Q00ALLN #1 G 6A }}Q')21A6 ==+-6y-AK	*'x''6+6"&!++-C$S,.
 "lln3q6A:#a&M2IKK		2K(L(S(S % 0 0 A)  		JJL9 $ LLN 8 		JJL s   AI ,I >I BI )I "J $<J !J 2A3I, %J 6J II 	I)(I),I>>J JJ 	J"!J"r	   Fr
   c               T    | j                   j                  |||      }t        |      S )N)r   r   )r   r   r?   rI   s         r   r   zOSSBackend.search  s(    <<&&ugU&Kx((r   Nr   c               V    |||d}|r||d<    | j                   j                  |fi |S rK   )r   r   rL   s          r   r   zOSSBackend.add  rN   r   c                F    | j                   j                  ||       d|dS )N)datarP   rQ   )r   r#   r    s      r   r#   zOSSBackend.update"  s$    ID1+)DDr   c                B    | j                   j                  |       d|dS )NrT   rQ   )r   r&   r%   s     r   r&   zOSSBackend.delete&  s    I&+)DDr   c                   	 t        | j                  dd       }|r't        |d      r	 |j                  j	                          t        | j                  d      r| j                  j                          t        | j                  dd       }|rt        |d      r|j                          t        |dd       }|rt        |d      r|j                          y y y # t
        $ r Y w xY w# t
        $ r Y y w xY w)N	telemetryposthogr)   r   r   )r   r   hasattrr   shutdownry   r)   )r   r   vsr   s       r   r)   zOSSBackend.close*  s    	k4@IWY	:%%..0 t||W-""$~t<Bgb'*
R40F'&'2 3v !   		s5   %C$ C BC$ 	C!C$  C!!C$ $	C0/C0)r   r,   )r   r+   r   r,   r   r-   r/   r5   r*   r0   r2   r3   )r6   r7   r8   r9   rG   staticmethodr   r   r   r#   r&   r)   r   r   r   r{   r{      s    7/2b = =~ ACSX )  $44 	4
 4 4 4 
4EEr   r{   N)r>   r   r/   r1   )r9   
__future__r   abcr   r   typingr   r   r?   rA   rV   r{   r   r   r   <module>r      sN    : " # # >Ek EDF FR_ _r   