
    6_is                     L   d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
mZ d dlmZ  e j                  dd      Ze j                   j#                  de       e j                   j#                  de       e j                   j#                  d	 e j                  d
d             d dlmZ  e
dd      Z e       Z e j                  dd      ZdZefdededee   fdZdee   dee   defdZdej:                  fdZ G d de      Z G d de      Z  G d d e      Z! G d! d"e      Z"ejG                  d#      d$e"fd%       Z$ejK                  d&      d'        Z&ejG                  d(      d$e fd)       Z'd*ee   de(fd+Z)de(dee   fd,Z*ejG                  d-      d$e!fd.       Z+y)/    N)AnyDictListOptional)FastAPIHTTPException)	BaseModelMEM0_OPENAI_BASE_URLzhttp://127.0.0.1:5004/v1OPENAI_BASE_URLOPENAI_API_BASEOPENAI_API_KEYMEM0_OPENAI_API_KEYlocal)Memoryzeventheodds-mem0z0.2.0)titleversionMEM0_SQLITE_PATHz2/var/www/html/eventheodds/mem0-service/mem0.sqlitei   textdimsreturnc                 |   dg|z  }t        j                  d| xs dj                               }|D ]V  }d}|D ]  }|dz  |z
  t        |      z   }|dz  } t	        t        |            }||z  }|dz  dk(  rdnd	}||xx   |z  cc<   X t        d
 |D              dz  }	|	dk  r|S |D 
cg c]  }
|
|	z  	 c}
S c c}
w )N        z	[a-z0-9]+ r      l       g      ?g      c              3   &   K   | ]	  }||z    y wN ).0vs     6/var/www/html/eventheodds/mem0-service/mem0_service.py	<genexpr>z"_hash_embedding.<locals>.<genexpr>)   s     "q1u"s   g      ?)refindalllowerordabsintsum)r   r   vectokenstokhchidxsignnormr    s              r!   _hash_embeddingr2      s    %$,CZZtzr&8&8&:;F  	Bq&AR(AOA	 AK$h1ulsCD "c""c)Dqy
!"AH"""s   *B9abc           	          | r|rt        |       t        |      k7  ryt        t        d t        | |      D                    S )Nr   c              3   ,   K   | ]  \  }}||z    y wr   r   )r   xys      r!   r"   z_cos.<locals>.<genexpr>2   s     1tq!QU1s   )lenfloatr)   zip)r3   r4   s     r!   _cosr<   /   s5    AQ3q6)1s1ay1122    c                      t        j                  t         j                  j                  t              d       t        j                  t              } | j                  d       | S )NT)exist_okz
        CREATE TABLE IF NOT EXISTS memories (
          user_id TEXT NOT NULL,
          memory  TEXT NOT NULL,
          embedding BLOB NOT NULL,
          created_at INTEGER NOT NULL,
          PRIMARY KEY (user_id, memory)
        )
        )osmakedirspathdirnameDB_PATHsqlite3connectexecute)conns    r!   _dbrI   5   sC    KK(48??7#DLL	
 Kr=   c                   "    e Zd ZU eed<   eed<   y)ChatMsgrolecontentN)__name__
__module____qualname__str__annotations__r   r=   r!   rK   rK   F   s    
ILr=   rK   c                   F    e Zd ZU eed<   ee   ed<   dZee	ee
f      ed<   y)
AddRequestuser_idmessagesNmetadata)rN   rO   rP   rQ   rR   r   rK   rW   r   r   r   r   r=   r!   rT   rT   K   s(    L7m)-HhtCH~&-r=   rT   c                   0    e Zd ZU eed<   eed<   dZeed<   y)SearchRequestrU   queryr   limitN)rN   rO   rP   rQ   rR   r[   r(   r   r=   r!   rY   rY   Q   s    LJE3Nr=   rY   c                   6    e Zd ZU eed<   eed<   dZee   ed<   y)AddRawRequestrU   memoryN
created_at)rN   rO   rP   rQ   rR   r_   r   r(   r   r=   r!   r]   r]   X   s    LK $J$r=   r]   z/memories/add_rawreqc           
      0   	 | j                   xs dj                         }|sdddS | j                  t        | j                        nt        t	        j                               }t               }	 t        |      }|j                  d| j                  |t        j                  t        |            |f       |j                          |j                          dddS # |j                          w xY w# t        $ r}t        dt!        |            d }~ww xY w)Nr   TF)okstoredXINSERT OR IGNORE INTO memories (user_id, memory, embedding, created_at) VALUES (?,?,?,?)  status_codedetail)r^   stripr_   r(   timerI   r2   rG   rU   rE   Binaryfloat_to_bytescommitclose	Exceptionr   rQ   )r`   memnowrH   embes         r!   add_memory_rawrt   ^   s    <zzR&&(%00%(^^%?c#..!SEUu	!#&CLLjc7>>.2E#FL KKMJJLd++ JJL  <CF;;<s6   $C1 AC1 0AC C1 C..C1 1	D:DDz/healthc                      dt         t        dS )NT)rb   base_urldb)BASErD   r   r=   r!   healthry   v   s    D88r=   z/memories/addc                 l   	 | j                   D cg c]  }|j                  |j                  d }}t        j	                  || j
                        }g }|xs i j                  dg       D ]X  }|xs i j                  d      }t        |t              s)|j                         s:|j                  |j                                Z t        t        j                               }|rt               }	 |D ][  }t        |      }	|j                  d| j
                  |t!        j"                  t%        t'        t)        |	                        |f       ] |j+                          |j-                          d|dS c c}w # |j-                          w xY w# t.        $ r}
t1        dt        |
      	      d }
~
ww xY w)
N)rL   rM   )rU   resultsr^   rd   Trb   resultre   rf   )rV   rL   rM   	extractoraddrU   get
isinstancerQ   ri   appendr(   rj   rI   r2   rG   rE   rk   bytes	bytearrayrl   rm   rn   ro   r   )r`   mmsgsres	extractedrrp   rq   rH   rr   rs   s              r!   add_memoriesr   {   se   <@CM1AII6MMmmD#++m6 	)B/ 	.A7--)C#s#		  -	.
 $))+5D	$ C)#.CLLrc7>>%	.Y\J]@^:_+`bef 

c**1 N, 

  <CF;;<sN   F  E5A#F F %A
F 0A0E:  F 5F :FF 	F3F..F3r*   c                 @    dd l dj                  fd| D              S )Nr   r=   c              3   T   K   | ]  }j                  d t        |             ! yw)z<fN)packr:   )r   r7   structs     r!   r"   z!float_to_bytes.<locals>.<genexpr>   s      =AFKKeAh/=s   %()r   join)r*   r   s    @r!   rl   rl      s    88====r=   c           	      t    dd l }t        |       dz  }t        |j                  dd|z  z   | d |dz               S )Nr      <f)r   r9   listunpack)r4   r   ns      r!   bytes_to_floatr      s:    A!AcC!GmQwQZ899r=   z/memories/searchc           	      J   	 t        | j                        }t               }	 |j                  d| j                  f      }|j                         }|j                          g }|D ]3  \  }}}	 t        |      }	t        ||	      }
|j                  ||
|d       5 |j                  d d       |d t        dt        | j                  xs d             }dd|id	S # |j                          w xY w# t        $ r Y w xY w# t        $ r}t        d
t!        |            d }~ww xY w)NzDSELECT memory, embedding, created_at FROM memories WHERE user_id = ?)r^   scorer_   c                     | d   S )Nr   r   )r7   s    r!   <lambda>z!search_memories.<locals>.<lambda>   s
    !G* r=   T)keyreverse   r   r{   r|   re   rf   )r2   rZ   rI   rG   rU   fetchallrn   r   ro   r<   r   sortmaxr(   r[   r   rQ   )r`   qrH   currowsscoredrp   emb_blobr_   rr   r   outrs   s                r!   search_memoriesr      s"   <CII&u	,,ehkhshsguvC<<>DJJL)- 	U%C:$X. CLEMMS5
ST	U 	,d;2s1c#)).q123y#&677 JJL    <CF;;<sS   C> -C C> +C/6A#C> C,,C> /	C;8C> :C;;C> >	D"DD"),r@   rE   rj   r#   typingr   r   r   r   fastapir   r   pydanticr	   getenvrx   environ
setdefaultmem0r   appr~   rD   DIMSrQ   r(   r:   r2   r<   
ConnectionrI   rK   rT   rY   r]   postrt   r   ry   r   r   rl   r   r   r   r=   r!   <module>r      s   	   	 , , *  ryy')CD 

  ' . 

  ' . 

  &			2G(Q R &8 H	
"))&(\
] ,0 ## #S #DK #&3DK 3DK 3E 3W "i 
. .I %I % 
< < <. 9 9 /<j < <>>U > >:e :U : 
< < <r=   