
    	j}                     H   U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl%m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dlm2Z2m3Z3m4Z4  ejj                  dd      Z6 ejj                  dd      Z7 ejj                  dd      Z8 ejj                  dd      Z9 ejj                  dd       Z: ejj                  dd      Z; ejj                  dd      Z< ejj                  dd      Z= ejj                  dd      Z> e j~                  dd       Z@dd!ZA	 	 dd"ZBd dlCmDc mEc mFZG  eHeGj                  d#      reGj                  j                  ndZKd dlLmDc mEc mMZN d$ ZOd dlCmDc mEc mFZP  eQePj                        j                         ZTd%eTvr<eTj                  d&d'      ZT eQePj                  d(      j                  eT        eWd)       d dlXmYZZ  eQeZj                        j                         Z[d*e[vr@d+e[v r<e[j                  d+d*      Z[ eQeZj                  d(      j                  e[        eWd,        G d- d.e-      Z\ G d/ d0e/      Z] G d1 d2e"      Z^ ed3d45      Z_e_j                  ed6gd6gd6g7        e j~                  d8d9      Za e j~                  d:d;      Zb e j~                  d<d=      Zc e j~                  d>      xs  e j~                  d?d      Zd e j~                  d@dA      Ze e j~                  dBdC      Zf e j~                  dDdE      Zg eh e j~                  dFdG            Zi eh e j~                  dHdI            Zj eh e j~                  dJdK            Zk eh e j~                  dLdM            Zl eh e j~                  dNdO            Zm eh e j~                  dPdQ            Zn eh e j~                  dRdS            Zo eh e j~                  dTdS            Zp eh e j~                  dUdM            Zq eh e j~                  dVdM            Zr es e j~                  dWdX            Zt eh e j~                  dYdG            Zu eh e j~                  dZdG            Zvdawee   exd[<   d\ayd\az G d] d^ej                        Z|d_ Z}e_j                  d`      da        Z G db dce      Z e j~                  ddde      Z e j~                  dfdg      Zdh ZddiZddjZ e       j                          dk Zdl Zdm Zdn Z G do dpe      Ze_j                  dq      dr        Ze_j                  ds      dt        Ze_j!                  du      dvedwefdx       Ze_j!                  dy      dzefd{       Ze_j                  d|      d}        Ze_j!                  d~      dzefd       Ze_j                  d      defd       Zy# e$ r Y w xY w)    N)Path)datetimetimezone	timedelta)Optional)FastAPIHTTPExceptionRequest)JSONResponse)CORSMiddleware)	BaseModel)Graphiti)EpisodeType)OpenAIClient)	LLMConfig)AsyncOpenAI)RateLimitErrorAuthenticationErrorAPITimeoutError)Timeout)EmbedderClient)CrossEncoderClient)TextEmbedding)IterableListTuplegraphiti_request_id)defaultgraphiti_run_id graphiti_phaselast_graphiti_phasellm_call_indexworker_deadline_monotonic
edge_index
edge_totaledge_operationGRAPHITI_PROCESSING_EVENTSz)/var/lib/graphiti/processing-events.jsonlc           
         t        j                  t        j                        j	                         }| ||||t        j                         t        j                         d|d	}	|rN||	d<   t        t        j                  |      t        j                  |      z
  j                         dz  d      |	d<   |rt        |      d d |	d<   |r|	j                  |       	 t        t         d	d
      5 }
|
j#                  t%        j&                  |	d      dz          d d d        |S # t        $ r Y xw xY w# 1 sw Y   |S xY w# t        $ r Y |S w xY w)NT)	
request_idrun_idphaseoutcome	timestamp	thread_id
process_idevent_loop_availabletimeout_seconds
started_at     duration_ms  errorautf-8encodingFensure_ascii
)r   nowr   utc	isoformat	threading	get_identosgetpidroundfromisoformattotal_seconds	ExceptionstrupdateopenPROCESSING_EVENTSwritejsondumps)r*   r+   r,   r-   r3   r2   r8   detailsr@   eventfs              &/opt/struktur/graphiti/service/main.py_emit_eventrV   +   sQ   X\\",,.C"F57_box  pC  pC  pE  SU  S\  S\  S^  vz  M\  ]E&l"')?)?)DXE[E[\fEg)g(v(v(xy}(}~  #AU=!SZ-eGnW%#C9rQ

SXfkHlmqHq@rrJ $ 	sJ dJ sC   )A	D D; +*D.D; 	D+*D+.D83D; 8D; ;	EEc                 "   |t         n
t        |      }|t        n
t        |      }|t        n
t        |      }| | |t	        j
                         n|z
  nd }|t        |||z
        n|}	|d u xs |	|k\  }
|
|t        d|	      ||||
rd dS ddS )N        insufficient_deadline_budget)allowedconfigured_timeouteffective_timeoutremaining_seconds_at_startcompletion_reserveminimum_call_budgettimeout_reason)PROVIDER_CALL_TIMEOUT_SECONDSfloat#GRAPHITI_COMPLETION_RESERVE_SECONDS$GRAPHITI_MIN_LLM_CALL_BUDGET_SECONDStime	monotonicminmax)worker_deadliner[   r@   r^   r_   
configuredreserveminimum	remaining	effectiverZ   s              rU   calculate_llm_budgetro   9   s    2D2L.RWXjRkJ5G5O1UZ[mUnG6I6Q2W\]pWqGRaRmDNN$4MswI8A8MJ	G 34S]I479#7GjWZ[^`iWj*37#*&-dS S 4RS S    __wrapped__c                 J    t        | t              r| S | j                  ||      S N)
isinstancelistget)responsekeyr   s      rU   	_safe_getry   L   s"    (D!<<W%%rp   zisinstance(llm_response, list)zBcontradicted_edge_data = llm_response.get('invalidated_edges', [])zvcontradicted_edge_data = llm_response if isinstance(llm_response, list) else llm_response.get('invalidated_edges', [])wz(Patch angewendet: temporal_operations.pyzlast_n=0zlast_n=3z&Patch angewendet: graphiti.py last_n=0c                   ,    e Zd ZddefdZdee   fdZy)LocalEmbedder
model_namec                 &    t        |      | _        y )Nr}   )r   _model)selfr}   s     rU   __init__zLocalEmbedder.__init__f   s    #z:rp   returnc                   K   t        |t              r|g}n1t        |t              rt        d |D              r|}nt        |      g}t        | j                  j                  |            }|d   j                         S w)Nc              3   <   K   | ]  }t        |t                y wrs   )rt   rK   ).0xs     rU   	<genexpr>z'LocalEmbedder.create.<locals>.<genexpr>l   s     1Y*Q2D1Ys   r   )rt   rK   ru   allr   embedtolist)r   
input_datatexts
embeddingss       rU   createzLocalEmbedder.createi   sk     j#&LE
D)c1Yj1Y.YE_%E$++++E23
!}##%%s   A=A?N)z;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2)__name__
__module____qualname__rK   r   ru   rb   r    rp   rU   r|   r|   e   s    ;3 ;&$u+ &rp   r|   c            	       6    e Zd Zdedee   deeeef      fdZy)PassthroughCrossEncoderquerypassagesr   c                 8   K   |D cg c]  }|df c}S c c}w w)Ng      ?r   )r   r   r   ps       rU   rankzPassthroughCrossEncoder.rankt   s     "*+QC+++s   N)r   r   r   rK   r   r   rb   r   r   rp   rU   r   r   s   s.    , ,tCy ,T%U
BS=T ,rp   r   c                       e Zd Z G d dej                        Z G d dej                        Z G d de      Z G d de      Z	d	 Z
ddZd Zy
)OpenRouterClientc                        e Zd Z fdZ xZS )OpenRouterClient.LLMCallTimeoutc                     t         |   | d       || _        || _        || _        || _        || _        || _        || _        d| _	        y )Nz:: child LLM process timed out after its effective deadlinellm_call_timeout)
superr   r!   r#   	child_pidtermination_signalr3   completed_atr6   r`   )	r   r,   
call_indexr   r   r3   r   r6   	__class__s	           rU   r   z(OpenRouterClient.LLMCallTimeout.__init__y   sV    Gw&`ab"'D",D&DN&8D#(DO ,D*D"4Drp   r   r   r   r   __classcell__r   s   @rU   LLMCallTimeoutr   x   s    		5 		5rp   r   c                        e Zd Z fdZ xZS )'OpenRouterClient.DeadlineBudgetExceededc           
      v    t         |   | d| d|dd|d       || _        || _        || _        || _        y )Nz: z; remaining_seconds=z.3fz; effective_timeout=)r   r   r!   remaining_secondsr\   r`   )r   r,   r   r\   reasonr   s        rU   r   z0OpenRouterClient.DeadlineBudgetExceeded.__init__   se    Gwb0DEVWZD[[o  qB  CF  pG  H  I"'D%6D"%6D""(Drp   r   r   s   @rU   DeadlineBudgetExceededr      s    	) 	)rp   r   c                       e Zd Zy)(OpenRouterClient.InvalidProviderResponseN)r   r   r   r   rp   rU   InvalidProviderResponser      s    rp   r   c                        e Zd Z fdZ xZS )'OpenRouterClient.ProviderRateLimitErrorc                 \    t         |   t        j                  |d             || _        y )NFr=   )r   r   rP   rQ   rR   )r   rR   r   s     rU   r   z0OpenRouterClient.ProviderRateLimitError.__init__   s"    GTZZeDE"DLrp   r   r   s   @rU   ProviderRateLimitErrorr      s    	# 	#rp   r   c           	      \  K   t        d      }t        d      }	 d}|j                  d      5 }t        j                  |t        j                         	 t        j
                         }t        j                  |j                               }t        |j                  dd      xs d      }||kD  r||z
  }n|j                  dg       D cg c]  }||z
  dk  s| }	}|	rd	||	d
   z
  z
  gng }
t        |	      dk\  r|
j                  d||	d   z
  z
         t        dg|
z         }|dk  rh|	j                  |       |j                  t        j                   d|	dd  i             	 t        j                  |t        j"                         d d d        y t        j                  |t        j"                         	 d d d        t%        j&                  |       d {    # t        $ r dg i}Y bw xY wc c}w # t        j                  |t        j"                         w xY w# 1 sw Y   jxY w7 Tw)N(/tmp/openrouter-graphiti-rate-limit.json(/tmp/openrouter-graphiti-rate-limit.lockrX   a+requestspause_untilr   <         i)r   rM   fcntlflockLOCK_EXre   rP   loads	read_textrJ   rb   rv   lenappendrh   
write_textrQ   LOCK_UNasynciosleep)r   pathlockpathwaitlockr@   stater   r   recentwaitss              rU   _rate_limit_gatez!OpenRouterClient._rate_limit_gate   s    >?BCDt$ 5D%--05))+C!%DNN,<!="'		-(C(Hq"IK"S(*S0-2YYz2-F!U#a%RT*!!U!U8>Cr
N!3 4Bv;",ell2s6!9};M.N"A3u9~19"MM#. OODJJ
F34L7Q,RS"KKemm4'5 5& KKemm4'5( --%%%-  %>z2.>e>
 "V KKemm4'5 5( &s   +H,%HG5'#G
>G5G0G0BG5#$H	H,$H5 H,H*H,G-)G5,G--G55&HHH'#H,Nc           	      t  K   t        j                         }t        j                  t        j
                        j                         }|xs t        j                  dg}t        j                  |t        j                  j                  t        j                  j                  t        j                  j                  d d {   }|j                  }	|r ||	       t        j                  |j                  t!        j"                  |d      j%                  d                  }
d }	 |
j'                         s%|t        j                         |z
  z
  }|dk  rd}|j)                          	 t        j*                  t        j,                  |
      d	       d {    t        j                  t        j
                        j                         }t3        t        j                         |z
  dz  d      }| j5                  |d   |d   |	||||      	 t        j*                  t        j,                  |
      t7        d|      	       d {    |
j'                         s%|
j9                         \  }}|j:                  .|j1                          t        j,                  |
       d {    	 dt=        fdt?        |jA                               D        d       }|!tC        d|jE                  d      dd  z         t!        jF                  |tI              d  jE                               }|	||t        j                  t        j
                        j                         t3        t        j                         |z
  dz  d      d|d<   |S 7 7 # t        j.                  $ r4 d
}|j1                          t        j,                  |
       d {  7   Y 8w xY w7 # t        j.                  $ r Y w xY w7 Q# |j:                  /|j1                          t        j,                  |
       d {  7   w w xY ww)Nz/app/llm_call_worker.pystdinstdoutstderrFr=   r:   r   SIGTERMg      @timeoutSIGKILLr4   r5   r!   r#   g      ?s   LLM_CHILD_RESULT=c              3   F   K   | ]  }|j                        s|  y wrs   
startswithr   linemarkers     rU   r   z:OpenRouterClient._run_llm_child_process.<locals>.<genexpr>   s     fTdoo^dNeDf   !!zllm_child_no_result: replaceerrors)r   r   r3   r   r6   _child_meta)%re   rf   r   r@   r   rA   rB   sys
executabler   create_subprocess_exec
subprocessPIPEpidcreate_taskcommunicaterP   rQ   encodedone	terminatewait_forshieldTimeoutErrorkillrG   r   rg   result
returncodenextreversed
splitlinesRuntimeErrordecoder   r   )r   payloadr\   
on_startedargvstarted_monor3   commandprocr   communicate_taskr   rm   r   r6   r   r   result_liner   r   s                      @rU   _run_llm_child_processz'OpenRouterClient._run_llm_child_process   s    ~~'\\(,,/99;
E3>>+DE33$$))'2D2D2I2I%%**, , HH	y!"..TZZeDKKGTUW!	7&++--1AL1PQ	>)2&NN$?%..w~~>N/OY\]]]
 $,<<#=#G#G#IL"')9L)HD(PRS"TK--g6F.GQaIb.79KZ.:KI I!**7>>:J+K36tY3GI I I# '++-* .446NFF&		nn%5666%fXf6G6G6I-Jfhlm6i9XY]Y^9__``KF5<<>?.7Oa/919hll1K1U1U1W05t~~7G,7VZ^6^`a0b!d} ]," ^"// ?-6*		%nn-=>>>?I++  7 &		nn%5666 's   B>P8NA$P8'AO8 *-N NN A2O8 7O OO O8 O8 04P8$O5%C$P8N =OOOO8 OO8 O O2.O8 1O22O8 5P885P5-P0.P55P8c                   )*+,-./012345K   |D cg c]  }|j                   |j                  d }}|d   dxx   dz  cc<   t        j                         }i }t        dd      D ]  }d| 0d 1t        j                         3t        j                         xs d.t        j                  .       t        j                         dz   /t        j                  /       t        j                         }t        |      }|d	   ,|d
   +|d   }	|d   2|d   -|d   5|d   st        3xs dt        j                         ddd/.,t        d-      t        d2      +|	t        j                   t"        j$                        j'                         t        j                   t"        j$                        j'                         5d
       | j)                  .t        d2      t        d-      5      t+        t-        j.                  | j0                  |ddddiddd      j3                  d            4t        j                   t"        j$                        j'                         )	 t        j                   t"        j$                        j'                         }
/.t4        j                         t6        j                         t8        j                         |
|
d}t        3xs dt        j                         d d!|"       | j;                          d {    t        j                   t"        j$                        j'                         }t=        t        j>                  |      t        j>                  |
      z
  jA                         d#      }t        3xs dt        j                         d$d%|
i ||||d&"       3rtC        3d| j0                  d'd(       3./| j0                  |-tD        tF        d)}d *)*+,-./012345fd*}| jI                  |-|       d {   }|j                  d+i       }|j                  d,g       }|j                  d-      sbtK        t-        j.                  |j                  d.      |j                  d/      |j                  d0      |j                  d1      |d2d3            |j                  d4      }tM        |tN              rt+        |j3                  d            nd}|j                  d5      |j                  d6      d7}|j                  d1      }i d8d9d:|j                  d:      d;tM        |tN              rt+        |      ndd5|j                  d<      d6|j                  d=      d>4d?|d@|j                  d@      dA|j                  dA      xs dBdC|j                  dC      dDdEdF|dnddG|d udHtM        |tN              rtQ        |       ndIdJtM        |tN              r|jS                  dK      nddLtM        |tN              r|jU                  dM      nddN|i dO|d1|dP/dQ.dRddSddT-d	,d-d2d
+d5dU)dV|j                  dV      dW|j                  dW      dX|j                  dX      dY|j                  dZ      |t=        t        j                         |z
  d#      d[}t        3xs dt        j                         0d%1i dP/dQ.d1|d@|j                  d@      dA|j                  dA      xs dBd,|d5|j                  d<      d6|j                  d=      d>4d?|dRddSddT-d	,d-d2d
+5|j                  dW      |j                  dX      |j                  dV      |j                  dZ      t4        j                         t6        j                         t8        j                         d\"       tM        |tN              r|jW                         sd]|d^<   d_|d`<   |}tY        dadb      5 }|j[                  t-        j.                  |      dcz          d d d        |d#k  r't]        dd      j_                  de|z         d {    | ja                  t-        j.                  |d3            	 t-        jb                  |      }tY        dadb      5 }|j[                  t-        j.                  |      dcz          d d d        |c S  y c c}w 7 7 # 1 sw Y   xY w7 # td        $ rr}|jg                  tO        |      |d df |dgd  dh       tY        dadb      5 }|j[                  t-        j.                  |      dcz          d d d         # 1 sw Y    xY wd }~ww xY w# 1 sw Y   xY w# | j`                  $ r3 t        3xs dt        j                         0d1di/.-,-2+didjk        th        $ r}tk        tk        |dld       dmi       xs i }dndo|j                  dp      |j                  dq      |j                  dr      |j                  ds      d'| j0                  dt}	 tm        |j                  du      xs d      }tm        |j                  dv      xs d      }t        t        j                         |z   |t        j                         dwz         }to        dx      } to        dy      }!|!jY                  dz      5 }"tq        jr                  |"tp        jt                         	 t-        jb                  | jw                               }#n# td        $ r d{g i}#Y nw xY w||#d|<   | jy                  t-        j.                  |#             tq        jr                  |"tp        jz                         n)# tq        jr                  |"tp        jz                         w xY w	 d d d        n# 1 sw Y   nxY w||d|<   n# td        $ r Y nw xY wtY        dadb      5 }|j[                  t-        j.                  |      dcz          d d d        n# 1 sw Y   nxY wt        3xs dt        j                         0d1d}/.-,-2+d}djk       | j}                  |      |d }~wtd        $ rG}d }tk        |dld       }$|$tk        |$dmi       j                  d~      }tM        |t~        j                        rdnt        |      j                  5tk        |dWdWt               v r*nd       }%tk        |dXd       }&tk        |dVt        j                   t"        j$                        j'                               }'tk        |dZd       }(t        3xs dt        j                         0d1|i dP/dQ.d1|dT-d	,d-d2d
+d5d^t        |      j                  dW|%dX|&dV|'dZ|(dt4        j                         dt6        j                         dt8        j                         k       dt               vrtY        dadb      5 }|j[                  t-        j.                  i d8tk        tk        |dld       dd       d/tO        |      d df dAd'dt=        t        j                         |z
  d#      dP/dQ.d1|d>4dT-d	,d-d2d
+d5dW|%dX|&dU)|'|(d      dcz          d d d         # 1 sw Y    xY w d }~ww xY ww)Nrolecontentr   r  z

Return ONLY valid JSON. Extract at most 10 relevant nodes. Keep each summary under 300 characters. Use short labels. Do not use Markdown or explanations.      	llm_call_unknownr[   r^   r_   r]   r\   r`   rZ   unbound
llm_budgetfailedr   rX   )
r#   r!   r[   r\   r]   r^   r_   r3   r   r`   r2   rR      typejson_object)modelmessagestemperature
max_tokensresponse_formatF),:)r>   
separatorsr:   )r#   r!   r%   r&   	operationrate_gate_enter_atlast_progress_atllm_rate_gate_wait_startstart)rR      llm_rate_gate_wait_end	completed)rate_gate_exit_atrate_gate_wait_secondsr"  Nvidia)llm_request_count_incrementr  providercost)r*   r!   r#   r  r  r\   api_keybase_urlc                     | t        xs dt        j                         ddd
| t        j                         t        j                         t
        j                         d      	y )Nr  r$  r  r  )r#   r!   r  r  input_bytesr3   r[   r\   r]   r^   r`   r   r%   r&   r   r  )rV   CURRENT_RUN_IDrv   CURRENT_EDGE_INDEXCURRENT_EDGE_TOTALCURRENT_EDGE_OPERATION)r   call_startedr   r^   r[   r\   r!   r#   r,   phase_startedr   r*   request_payload_bytesr`   s    rU   r  z7OpenRouterClient._generate_response.<locals>.on_started  sx    	 +J,C)^EWEWEY[`bi$5Q_%3mae"7\);Pa1BXj%3!3!7!7!9GYG]G]G_ 6 : : <@>!?rp   r   fallback_attemptsok
error_typer8   statusprovider_request_id)r;  r8   r<  r=  r9  r=   rawinput_tokensoutput_tokens)prompt_tokenscompletion_tokenshttp_status   finish_reasonresponse_lengthrA  rB  r1  output_bytesr  r,  
OpenRouternative_finish_reasonchoices_typechild_processchoices_countmessage_presentemptyTstarts_with_object{ends_with_object}r*   attemptr#   r!   r  r  r2   r3   r   r   r   child_duration_msr6   )r9  seconds)r`   r   r   r   r6   r%   r&   r   r   error_classllm_response_validationerror_phasez#/tmp/graphiti-llm-diagnostics.jsonlr9   r?   r   r5   ,  r   )parse_error	first_300last_500invalid_provider_response)r#   r!   r2   r[   r\   r]   r^   r`   r8   rR   rw   headers  zfree-models-per-minzx-ratelimit-limitzx-ratelimit-remainingzx-ratelimit-resetzretry-after)r<  
error_codelimitrm   resetretry_afterr,  r  rc  rd  r   r   r   r   r   r   provider_rate_limitzx-request-idindividual_call_timeoutr%   r&   r   metastatus_coderU  )r   r6   )Dr  r  re   rangeCURRENT_REQUEST_IDrv   CURRENT_GRAPHITI_PHASELAST_GRAPHITI_PHASEsetCURRENT_LLM_CALL_INDEXCURRENT_WORKER_DEADLINEro   rV   r2  rh   r   r@   r   rA   rB   r   r   rP   rQ   r  r   r3  r4  r5  r   rG   rH   rI   _touch_requestLLM_API_KEYLLM_BASE_URLr  r   rt   rK   boolr   endswithstriprM   rO   
__import__r   r   r   rJ   rL   r   getattrrb   r   r   r   r   r   r   r   r   r   r   r  r   locals)6r   r  mopenai_messagesstarted	last_metarS  ri   budgetr_   gate_started_atgate_detailsgate_exit_atgate_wait_secondschild_payloadr  child_result
child_metar9  r>  rG  usager=  rg  rT   parsedexchrR   rc  retryr   r   r   r   r   response_objerror_child_piderror_termination_signalerror_completed_aterror_duration_msr6  r   r^   r[   r\   r!   r#   r,   r7  r   r*   r8  r`   s6                                            @@@@@@@@@@@@@rU   _generate_responsez#OpenRouterClient._generate_response   s    KSTaAFFqyyATTI& ,m 	n&))+	Q{ }	G7)$(,,.0446C)		 	 	00446:		#	#N	32668&7$%9:	$%9:	%&;<	#$@A	#$78	 !12y!0y.2D2D2FV^)*n*8N`-06G-H69#?P6Q.@Wj&.ll8<<&@&J&J&L]e]i]ijrjvjv]w  ^B  ^B  ^D*85:; ..~s3HY?Z\_`cev\w  zH  I  I!$TZZ$**RaABRVFLmE\1^ ?DPZ&\ ]c\bcj\k"m	 !X\\2<<>^
&ll8<<8BBDO.<P^*<*@*@*BRdRhRhRj)?)C)C)E]l0?AL 
/i1C1C1EGacj ,.'')))#<<5??AL %x'='=l'KHLbLbcrLs's  'C  'C  'E  GH  !I
/i1C1C1EG_al' 2gL 2gWc2CYe2gh zq%)ZZ(L+5/=

)8O`(3OM I? ? ? "&!<!<]L]_i!jjL%))-<J , 0 01Db I##D)"4::L<L<L\<Z7C7G7G7P8D8H8H8REQEUEUVkElCT	/V ej	$k l l
 ""5)C7A#s7K3szz'23QRL&2&6&6~&F]i]m]mn}]~E"."2"23H"I>M3 >9I9I/9Z >%:c33Gs3xQ>P^`e`i`ijy`z>#UYY/B%C>ERTi> #L> 3:<;K;KG;T>  0 0 < L	> Oefrfvfv  xN  gO	>
 #O>
 6E3?a`a> &s$> 9@R\]`beRfT#Ylp> )CQTAU#..*=[`> cu  LV  WZ  \_  L`vy  wC  wC  DG  wH  fk> !"5> 8A'> *+>> %n> 7G> &}> 7CD> &'8> ;OOa> ((9> ;WWh> ));> =M^> !,>  #JNN>$B!>  EPPZP^P^_jPk!>" )8L)M#>" Pccmcqcqr  dA#>$ ):$TYY[%8!<'>D( 
/i0B0B0DU;Wd!K!1. !KAQR` !K!67J!K!()9)9')B!K ",L,<,<Z,H,XL!K "55F	!K
 "0		/0J!K
 L[[`[d[dex[y!K "//D!K FTT`!K "3=!K BNd!K "33D!K FZZl!K "55F!K Hddu!K "66H!K [i-7^^K-H^h^l^l  nB  _C0:~0N]g]k]kly]z.@.D.D.FTfTjTjTl-C-G-G-I!KL  c3'syy{$=]#SltM?Rx|nw?ElAGGTXT^T^_cTdgkTkLllQ;j&;&A&A!w,&O O OQY224::dQV3WXXC
 ;SAhQPTPZPZ[_P`cgPgHhhM}}	 UX *4 kf ml O  CH3t9Z]^b^cZdef?ElAGGTXT^T^_cTdgkTkLll m ih,, 

/i0B0B0DU8Ta  iD2@R`  tE6H]n>Oew2M!OP
  
@Z6	2FL"A!$4I !&9 :OfIg !&9 :155Q^K_#+djjBGgkk'27a8gkk-8=A>!$))+"5udiikB>NOFG JK]]4( >DKKemm4>%)ZZ0@%AU(B:r2B%B/:m,

5(9:"[[u}}=U[[u}}==> > > *5& ;SAkQPTPZPZ[bPcfjPjHkkkk
/i0B0B0DU8Tah}2@R`  tE6H]n>Oew2G!IJ
 --g6C? 
"&"3
D9L'&-lIr&J&N&N~&^#:DS'J^J^:_6eijmenewewN%c;[TZT\E\	bfgO'.s4H$'O$!(nhll8<<>X>b>b>d!e ']D A
/i0B0B0DU8Tahk	!K!1. 	!KAQR` 	!K!67J	!K!23D	!KEYZl	!K "55F	!K Hddu	!K "66H		!K
 "2.	!K
 BOtTWyOaOa	!K "-_	!K >RRj	!K "00B	!K DQQb	!K "..@.D.D.F	!K HTTfTjTjTl	!K "--C-G-G-I	!K
L VX%?E  {AGGTXT^T^  `r`movw~  @C  EO  QU  xV  Xe  gk  pl  `r  nu  wz  {~  w  @D  AD  wE  `r  GQ  S[  `r  ]f  hm  nr  nw  nw  ny  zA  nA  CD  hE  `r  GW  Xf  `r  hx  yG  `r  I^  _r  `r  tA  BW  `r  Yj  k|  `r  ~R  Se  `r  gz  {L  `r  Nj  k|  `r  ~R	  S	e	  `r  g	w	  x	F
  `r  H
S
  T
c
  `r  e
y
  z
R  `r  T`  am  `r  ~P  `q  `r  Us  vz  Uz  M{  { {E/
s  {
 c3H-{
"B*fc8D	fc;Pf(c>-f.d
/f3{
5&fd1f=(f
%	f.
{
8f;f>d	f	f0f(e6-	f6e?;fff
f	fA
{ A-q3Bo(%o#l21n2m	?nm	,n.%o&n9	9o=	oooq3	o$!q3#o$$q33(p$	q3$p-)A
q33{ F{B!z5,	{5z>:{{{
)NN)r   r   r   r   r   r   r   r   r   r   r   r  r  r   rp   rU   r   r   w   sO    
5-- 
5)!5!5 ), # #
&62hCrp   r   zGraphiti Knowledge Servicez1.0.0)titleversion*)allow_originsallow_methodsallow_headers	NEO4J_URIzbolt://graphiti-neo4j:7687
NEO4J_USERneo4jNEO4J_PASSWORDgraphiti2026OPENROUTER_API_KEYDEEPSEEK_API_KEYrr  zhttps://api.deepseek.com/v1	LLM_MODELzdeepseek/deepseek-chatEMBED_MODELzintfloat/multilingual-e5-smallGRAPHITI_WORK_DEADLINE_SECONDS300!GRAPHITI_REQUEST_DEADLINE_SECONDS330#GRAPHITI_HEARTBEAT_INTERVAL_SECONDS12 PROVIDER_CONNECT_TIMEOUT_SECONDS20PROVIDER_READ_TIMEOUT_SECONDS240ra   120rc   30rd   PROVIDER_WRITE_TIMEOUT_SECONDSPROVIDER_POOL_TIMEOUT_SECONDSPROVIDER_MAX_RETRIES0(GRAPHITI_EDGE_RESOLUTION_TIMEOUT_SECONDS1GRAPHITI_EDGE_RESOLUTION_PROGRESS_TIMEOUT_SECONDSgraphiti_clientFc                   $     e Zd ZdZd fd	Z xZS )EdgeResolutionTimeoutz:The edge-resolution stage exceeded its own bounded budget.c                 |    t         |   dt        dd       d| _        d| _        || _        || _        || _        y )Nzedge_resolution exceeded z.1fsedge_resolutionedge_resolution_timeout)r   r   r  r!   r`   elapsed_secondsr&   last_edge_index)r   r  r&   r  r   s       rU   r   zEdgeResolutionTimeout.__init__  sG    45]^a4bbcde/7.$.rp   rs   )r   r   r   __doc__r   r   r   s   @rU   r  r    s    D/ /rp   r  c                  .   t        t        t        t        t        d      t        t        t        t        t        t        t        t        t              t                    } t        t              }t        t        t         t"        | |t%                     S )Ni   )r.  r  r/  r  )connectreadrO   pool)r.  r/  r   max_retries)configclientr   )
llm_clientembeddercross_encoder)r   r   rq  r  rr  r   r   r  r  r  r  r  r|   r  r   r  r  r  r   )llmr  s     rU   build_graphiti_clientr    sp    
)9|PT#+")*GQq/LTr/L#N[oqrC 4HIz>"X"9";= =rp   startupc                  B  K   t         j                         st        d      t               at        j
                  } t        j                          d {    t                d {    	 | j                          d {    | j                  j                  j                  j                  t        dddgdd       d {    dad	at)        t+        j,                  dt2        t4        t6        t8        t:        t<        t>        t@        tB        d
             t)        d       y 7 7 7 7 g# t         j"                  $ r dadaY zt$        $ r dadaY t&        $ rB}d	ad	at)        t+        j,                  d
t/        |      j0                  d             Y d }~d }~ww xY ww)NzCprovider_authentication_not_configured: OPENROUTER_API_KEY is emptyuserzReply with OK.r
  r   r5   )r  r  r  r  TFprovider_readiness_failed)rS   rV  timeout_configuration)
rS   graphiti_work_deadline_seconds!graphiti_request_deadline_secondsheartbeat_interval_seconds provider_connect_timeout_secondsprovider_read_timeout_secondsprovider_call_timeout_secondsprovider_write_timeout_secondsprovider_pool_timeout_secondsprovider_max_retrieszGraphiti bereit.)"rq  ru  r   r  r  r  build_indices_and_constraintsrecover_requestsr   r  chatcompletionsr   r  provider_authenticatedprovider_rate_limitedr   r   r   rJ   printrP   rQ   r  r   r  r  r  r  r  ra   r  r  r  )r  r  s     rU   r  r    s     `aa+-O

$
$C

7
7
999

b""$$$jjoo))00$/?@Aa 1 
 	
 	

 "& % 
$**5Wu  [|  Z}  aA  b  `}  _}  ^{  S	g	  h	  i	  j		
- :$	
 22 %!% $ %!% $ b!& %djj"=DQTIL^L^_`aabs   AFD#F%D%&F+D+ >D'?AD+ D)D+ 
AF%F'D+ )D+ +FFFFF8FFFFc                   j    e Zd ZU eed<   dZeed<   dZeed<   dZeed<   dZe	e   ed	<   dZ
e	e   ed
<   y)Episoder  manualsourcesystemactorr    contextNr.   name)r   r   r   rK   __annotations__r  r  r  r.   r   r  r   rp   rU   r  r    sA    LFCE3GS#Ix}#D(3-rp   r  GRAPHITI_REQUEST_DBz/var/lib/graphiti/requests.dbGRAPHITI_MAINTENANCE_LOCKz&/run/graphiti-control/maintenance.lockc                  R   t        j                  t              } t         j                  | _        | j                  d       | j                  d       | j                  d       dD ]  }| j                  d| d        | j                          | S # t         j                  $ r Y Aw xY w)Nzpragma journal_mode=WALzpragma busy_timeout=5000a}  create table if not exists graphiti_requests(request_id text primary key,run_id text,source_system text,source_id text,queue_id text,import_key text,episode_name text,episode_uuid text,started_at text,completed_at text,status text,http_status integer,client_disconnected integer default 0,server_completed integer default 0,llm_request_count integer default 0,error_phase text,error_message text,heartbeat_at text,deadline_at text,worker_id text,process_id text,container_instance_id text,recovery_checked_at text,recovery_result text,terminal_reason text,updated_at text,model text,provider text,cost real,last_provider_contact_at text))heartbeat_atdeadline_at	worker_idr0   container_instance_idrecovery_checked_atrecovery_resultterminal_reason
updated_atr  r,  r-  last_provider_contact_atz)alter table graphiti_requests add column z text)sqlite3r  
REQUEST_DBRowrow_factoryexecuteOperationalErrorcommit)ccols     rU   _request_dbr    s    ooj!A1=II'(!))4N*OII  R
  S
 [ .YYB3%uMN. HHJq ''--s   'BB&%B&c                     t               }t        j                  t        j                        j                         }|j                  d|||||||||| f
       |j                          |j                          y )Naj  update graphiti_requests set heartbeat_at=?,updated_at=?,llm_request_count=llm_request_count+?,model=coalesce(?,model),provider=coalesce(?,provider),cost=coalesce(?,cost),last_provider_contact_at=case when ? > 0 then ? else last_provider_contact_at end,client_disconnected=coalesce(?,client_disconnected) where request_id=? and status in ('started','processing')	r  r   r@   r   rA   rB   r  r  close)r*   r+  r  r,  r-  disconnectedr  r@   s           rU   rp  rp    s    mAhll3==?SII  {  }@  AD  E`  af  go  pt  uP  QT  Ua  bl  |m  n  pq  px  px  pz  |}  |C  |C  |Erp   c	                     t               }	t        j                  t        j                        j                         }
|	j                  d|
|
||||||||| f       |	j                          |	j                          y )NaZ  update graphiti_requests set completed_at=?,updated_at=?,status=?,http_status=?,error_phase=?,error_message=?,terminal_reason=?,server_completed=?,episode_uuid=coalesce(?,episode_uuid),client_disconnected=coalesce(?,client_disconnected) where request_id=? and status not in ('completed','timed_out','cancelled','abandoned','error','rate_limited')r  )r*   r<  rC  rX  error_messager  server_completedepisode_uuidclient_disconnectedr  r@   s              rU   _finish_requestr    s    mAhll3==?SII  k  mp  qt  u{  |G  HS  Ta  bq  rB  CO  Pc  dn  lo  p  rs  rz  rz  r|  ~  ~E  ~E  ~Grp   c                   K   	 t        j                  t               d {    |j                          d {   r|j	                          y t        |        t        | t        j                         ddt               |7 _7 Iw)N	heartbeatr'  r2   )	r   r   r  is_disconnectedrm  rp  rV   r2  rv   )r*   requestdisconnected_events      rU   _heartbeat_loopr    sn     
mm?@@@((***""$z"J~113K\  	A @*s    BB BBABBc                 n  K   | d   }| j                  dd      }t        ||ddt              }t        j                  t
        j                  dt        j                  j                  t        j                  j                  t        j                  j                         d {   }t        j                  |j                  t        j                  | d	
      j                                     }d }d }d	}	 |j                         sVt        j                  d       d {    	 t!        t"        d      5 }	t%        |	j'                         dd        D ]  }
t        j(                  |
      }|j                  d      |k7  r.|j                  d      }|dk(  ro|j                  d      dk(  r[|j                  d      dk(  rGt+        j,                  |d         }t+        j,                  |j                  d      xs |d         }d	} nb|dv r1|+t+        j,                  |j                  d      xs |d         }d	} n-|dk(  rd} n$|dk(  s|j                  d      dv sd }d }d	} n d d d        |||st+        j0                  t2        j4                        |z
  j7                         }|t8        k\  rt        ||dd|j;                         ddt=        |d      |j;                         ddd !       |j>                  B|jA                          t        jB                  t        jD                  |      d"#       d {    tK        |d       |j                         sV|jM                         \  }}t        ||d$|j>                  d(k(  rd)nd*||j>                  d(k(  rd n|jQ                  d+,      d-d  '       d.tS        fd/t%        |jU                               D        d       }|stW        d0      t        j(                  |tY              d  jQ                               }|j                  d1      s|j                  d2      d3v rxt        jF                  |j                  d4d5            }|j                  d6      xs d7|_-        |j                  d8      xs |j                  d2      d9k(  r	d:|_.        |d7|_.        |tW        d;t_        |j                  d4d<            z         |S 7 B7 # 1 sw Y   xY w# t.        $ r Y w xY w7 # t        jF                  $ r2 |jI                          t        jD                  |       d {  7   Y w xY w# t        jN                  $ rM |j>                  .|jI                          t        jD                  |       d {  7   t        ||d$d%|d&'        w xY ww)=Nr*   r+   r    worker_process_startr$  r  z/app/graphiti_worker.pyr   Fr=   r  r:   r;   ipr,   r  r-   substageedge_resolution_enterr.   r"  )
edge_startedge_operation_startedge_operation_completededge_completedr&  r#  T)r'  r   r  r   EdgeResolutionProgressTimeoutservice_watchdogr%  service_processprogress)r  r  r"  watchdogwatchdog_moder^  r   r   worker_process	cancelledzworker process killed)r8   r   r'  r  r   r   r   s   GRAPHITI_WORKER_RESULT=c              3   F   K   | ]  }|j                        s|  y wrs   r   r   s     rU   r   z)_run_processing_worker.<locals>.<genexpr>]  s     `tX^H_d`r   graphiti_worker_no_resultr:  r;  )r   r   r   r   r  r8   zprovider call timed outrX  provider_timeoutr`   r   rY   zgraphiti_worker_failed: r  )0rv   rV   r  r   r   r   r   r   r   r   r   rP   rQ   r   r   r   rM   rN   r   	readlinesr   r   rH   rJ   r@   r   rA   rI   r  rB   rG   r   r   r   r   r   r   r  r   CancelledErrorr   r   r   r   r   r!   r`   rK   )r   r*   r+   r{  r  r  edge_started_atedge_progress_atedge_gate_waitingrT   r   rS   r,   elapsedr   r   r  r   timeout_errorr   s                      @rU   _run_processing_workerr&    s    |$JW[["-Ef
6*@YwxG--cnn=V]d]o]o]t]t  }D  }O  }O  }T  }T  \c  \n  \n  \s  \s  t  
tD(()9)9$**WZ_:`:g:g:i)jkO3"'')--"""+g> "! (tu)= > ""jj. 99\2j@$ %		' 2 $55%))I:NRY:Y^c^g^ghr^s  xO  _O,4,B,B5CU,VO-5-C-CEIIN`DaDwejkvew-x,.3-!   %O  O.:191G1G		RdHeH{inozi{1| 0.3-! $>>.2-! $55%))I:NRr:r,0O42B[`IZ!)""0 */?/KTe!hll34DDSSUOO
62CI / 9 9 ;Ba4FY^_fghYi<L<V<V<X4EV`)bc
 .(#*#3#3GNNCS4T]^#___ 0>>W #'')X '--/v 
6"2$//STBT;Zbcjy}  zI  zI  KL  zLqu  RX  R_  R_  gp  R_  Rq  rv  rw  Rx  y%F`x0A0A0C'D`aefK677::k#f+,/6689F::d::l#  (P  P#00GE^1_`M+1::m+D+ZHZM(+1::6F+G  ,|ntnxnx  zF  oG  Kc  ocLjM( i{M(5c&**WY:W6XXYYMM 
t #
" ",   `&33 P IIKw~~>N/O)O)OP !! ??"IIK..!1222Jv&6{7Qhis   BV5"S$#AV55)U S'U $S7 5DS*	S*	S*'S7 /BU -T
 9T:T
 >U U /E6V5'U *S4/S7 7	T U TU T
 
;UUUU UU AV2VV22V5c                    K   t               } | j                  d      j                         }t        j                  t
        j                        j                         }|D ]  }d }|d   rNt        rH	 t        j                  t        j                  j                  d|d         d       d {   \  }}}|}|rt        |      dk(  rdn|rt        |      dkD  rd	nd
}|dk(  rdn|d	k(  rdnd}|dk(  rt        |d   d         nd }	| j                  d|||dk(  rdnd|	|||||d   f	        | j!                          | j#                          y 7 # t        $ r d }Y w xY ww)NzHselect * from graphiti_requests where status in ('started','processing')episode_namezRMATCH (n:Episodic) WHERE n.name=$name RETURN n.uuid AS uuid,n.name AS name LIMIT 2)r  r   r   r  	recoveredr  	abandonedepisode_found_after_restartmultiple_episodes_foundprocess_lost_no_episoder   uuidzupdate graphiti_requests set status=?,completed_at=?,server_completed=?,episode_uuid=coalesce(?,episode_uuid),recovery_checked_at=?,recovery_result=?,terminal_reason=?,updated_at=?,http_status=coalesce(http_status,500) where request_id=?r*   )r  r  fetchallr   r@   r   rA   rB   r  r   r   driverexecute_queryrJ   r   rK   r  r  )
r  rowsr@   repisoderecs_r<  r   
uuid_values
             rU   r  r  j  s    mA!))$noxxzTX\\",,.C a^+&//0F0F0T0T  Vj  pq  r@  pA0T  1B  KL   M  MQq%#g,/{7WZ[bWcdeWexkv060C,flnvfvIb  }V.4k.A3wqz&)*t
			  B  DJ  KN  TZ  \g  Tg  OP  mn  oy  z}  ~D  EK  LO  PQ  R^  P_  C`  	aa HHJ	 M*dg*s=   A-E 0<E,E-
E7BE EEE EE c                    i }	 t        t        d      5 }|D ]  }t        j                  |      }|j                  d      | k7  s*t        |j                  dd            j                  d      sW|j                  dd      |j                  d      |j                  d      f}|j                  d	      d
k(  r|||<   |j                  d	      dv s|j                  |d         	 d d d        |sy t        |j                         d       j                  d      S # t        $ r Y w xY w# 1 sw Y   GxY w# t        $ r Y y w xY w)Nr:   r;   r*   r,   r    r  r+   r#   r-   r$  )r'  r  c                 &    | j                  dd      S )Nr.   r    )rv   )r   s    rU   <lambda>z#_active_llm_phase.<locals>.<lambda>  s    aeeK.C rp   )rx   r!   )rM   rN   rP   r   rJ   rv   rK   r   poprh   values)r*   activerT   r   erx   s         rU   _active_llm_phaser?  {  s.   F
#g6 	W! Wzz$'Q55&*4Cgb@Q<R<]<]^i<jltUU8B'/?)@!%%.Q55#w.AsUU9%)??CQUAVW	W $v}}$CDHHIYZZ !*(*	W 	W  sQ   D7 D+DBD+D+%D7 	D($D+'D((D++D40D7 7	EEc                   &    e Zd ZU eed<   dZeed<   y)SearchRequestr   
   rb  N)r   r   r   rK   r  rb  intr   rp   rU   rA  rA    s    JE3Orp   rA  z/healthc            
      v  K   t         st        dddd      S 	 t         j                  j                  d       d {    t	        t
        xr t        xr t        xr t              } t        t              j                         }t               }|j                  d      j                         d   }|j                  d	t        j                   t"        j$                        j'                         f      j                         d   }|j)                          i d
| rdndddd| d| dddddt        dt	        t
        xr t        xr t              dt        dt*        d|d|d|dkD  d|dt        d| S 7 ?# t,        $ r/}t        ddddt/        |      j0                  d      cY d }~S d }~ww xY ww)N  startinggraphiti)r<  servicerh  r  zRETURN 1 AS readyzOselect count(*) from graphiti_requests where status in ('started','processing')r   z|select count(*) from graphiti_requests where status in ('started','processing') and (deadline_at is null or deadline_at < ?)r<  r:  	not_readyrH  readyservice_readyneo4j_readyTr  provider_readyprovider_configuredr  r  active_request_countstale_request_countrecovery_requiredmaintenance_modemaintenance_lock_pathwrite_requests_allowedF)r<  rH  rK  r8   )r  r   r0  r1  rs  rq  rr  r  r  r   MAINTENANCE_LOCKexistsr  r  fetchoner   r@   r   rA   rB   r  r  rJ   r  r   )rK  maintenancer  r=  staler  s         rU   healthr[    s
    zT^5_``K$$223FGGG;X<XIXBXY)*113
-		*{ |  !F  !F  !H  IJ  !K  ST  S\  S\  ][  ]e  ]i  ]i  jr  jv  jv  ]w  ]A  ]A  ]C  \E  SF  SO  SO  SQ  RS  ST  MR  VW  V]  V]  V_ fK  f	*  fWUZ  f[jkp  fq~  @D  f  EL  MQ  f  Rb  cy  f  zO  PT  U`  U  eq  U  v  P@  f  AY  Zp  f  qH  I^  f  _u  v|  f  }R  SX  f  Yl  mr  st  mt  f  uG  HS  f  Tk  l|  f  }U  Ze  Ve  f  	f	 	H
  K{U_hmvz{~v  wI  wI  6J  K  	KKsE   F9"E> E;D=E> :F9;E> >	F6$F1+F6,F91F66F9z/maintenance/statusc                  \   K   t        t              j                         } | |  t        | dS w)N)rS  rU  	lock_pathlock_exists)r   rV  rW  )rW  s    rU   maintenance_statusr_    s-      !((*F%6zVfu{||s   *,	/episodesepr	  c                   K   t        t        j                               }t        t              j                         rt        t        j                  dt        j                  t        j                        j                         t        j                         |dddt        d      d       t!        ddd|d	d
      S t"        st%        dd      | j&                  rt        j(                  | j&                        n"t        j                  t        j                        }| j*                  xs5 | j,                   d| j.                   dt1        |j'                                }d}i }	 | j2                  rt        j4                  | j2                        ni }|j7                  d|      }|j7                  dd      }t        j                  t        j                        }|t;        t<              z   j                         }t?               }	|	jA                  d|||j7                  d| j,                        |j7                  d      t        |j7                  dd            |j7                  d      ||j                         d|j                         |t        t        j                               |j                         tB        ddf       |	jE                          |	jG                          tI        ||dd|       tI        ||dd|d       tJ        jM                  |      }
tO        jP                         }tO        jR                  tU        |||            }|||| jV                  | j,                   d| j2                   |j                         tY        jZ                         t\        z   d }tO        jR                  t_        |            }tO        jR                  |ja                               }	 tO        j`                  ||ht\        tN        jb                  !       d {   \  }}|s|je                          tO        jf                  |d"       d {    ti        |      xs d#}tk        |d$d%|d&d'dd d	       t!        d%d(|||ddd d)      tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {    S ||v r|je                          tO        jf                  |d"       d {    tk        |d*d+d,d-d.dd d/	       t!        d+d0d,||ddd d)      tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {    S |jo                         }	 tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {    tI        ||dNdO      }tk        |ddPd d dd/t        |dQ         d	       tI        ||dNd|       dR| j,                  |t        |dQ         |j7                  dSd      |j7                  dTd      dUS # t8        $ r Y w xY w7 f7 57 7 |7 # tp        jr                  $ r}tk        |d1d2d3t        |      d d4 d3dd d	       t!        d2d5d3i|jt                        cY d }~tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {  7   S d }~wtN        jv                  $ r tk        |d*d+d,d6d7dd d/	        tN        jx                  $ r}t{        |d8d       xs d9}t{        |d:d       xs d9}tk        |d$d%|t        |      d d4 |dd d	       |d;k(  s|d<k(  rd=nd>}t!        d%|||||ddd d?      cY d }~tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {  7   S d }~wt8        $ r}t        |      }d@|v xs d3|v xs
 dA|v xs dB|v }|rtk        |d1d2d3dCd3dd d	       t!        d2d3d3||ddd dD      cY d }~tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {  7   S t}        |t~              rd%nt}        |t              rdEndF}t}        |t              rdGn|d%k(  rd9ndH}tk        |d5|||d d4 |dd d	       t!        |t        |      j                  |t{        t{        |dId       dJd       xs t}        |t              rdKnd t}        |t              rdLnd |d dF ||ddd dd dM      cY d }~tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {  7   S d }~ww xY w7 # tJ        jm                  |
       |je                          |je                          tO        jf                  ||d"       d {  7   w xY ww)VNwrite_rejected_maintenancer`  TF)rS   rA   r   r*   endpointmaintenance_valuerU  r]  )flushrE  rS  z*Graphiti write path is in maintenance mode)r;  	retryabler*   messagerI  Graphiti nicht initialisiertr6  r    r*   r+   )rU  zinsert or replace into graphiti_requests(request_id,run_id,source_system,source_id,queue_id,import_key,episode_name,started_at,status,heartbeat_at,deadline_at,process_id,updated_at,model,provider,cost) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)source_system	source_idqueue_id
import_keyr{  r*  r   request_acceptedr'  provider_preflight   r  z | )r*   r+   r  r  source_descriptionr.   r$   )r   return_when)return_exceptionsgraphiti_request_timeout	timed_out  zGraphiti work deadline exceededserver_deadlineGraphitiRequestTimeout)r;  rX  r*   r+   rg  episode_createdr  r  i  r  zClient connection closedclient_disconnectr  ClientDisconnectedrate_limitedr`  re  i  r8   zRequest task cancelledclient_cancelledr!   r  r`   r  r  r  ProviderTimeout)r;  rX  r  r*   r+   rg  ry  r  r   ztemporarily rate-limitedz"code": 429zProvider rate limit)r8   rX  r*   r+   rg  ry  r  i  r7   provider_authenticationgraphiti_processingrw   rh  i  missing_authentication_header)r;  rX  provider_http_statusprovider_error_codeprovider_messager*   r+   llm_call_numberrg  rate_limit_resetry  r  response_serializationr$  rD  r.  gespeichertnodesedges)r<  r  r  r.  r  r  )CrK   r.  uuid4r   rV  rW  r  rP   rQ   r   r@   r   rA   rB   rE   rF   r   r  r	   r.   rH   r  r  r  rC  r  r   rv   rJ   r   r  r  r  r  r  r  rV   rj  rm  r   Eventr   r  r  re   rf   r  r&  r   FIRST_COMPLETEDcancelgatherr?  r  rc  r   r   r   rR   r   r   rw  rt   r   r   r  r   )ra  r	  r*   tsstable_namer+   rg  r@   deadliner  tokenr
  heartbeat_taskworker_payloadworker_taskdisconnected_waitr   r6  r,   r   r  r   r;  	raw_erroris_rate_limitr<  serialization_starteds                              rU   add_episoder    s    4::< J$$&djj">X\\RZR^R^E_EiEiEkrtr{r{r}  LV  bm  BF  `e  rB  C  D  LP  	QCUbft~  Jv  6w  x  	xC!?@@13			-8<<PXP\P\C]B''L		{!BHH:Qs2<<>7J6KLKFBt')zzTZZ

#rdhh|\fFg:ptpxpx  zB  CE  qFioX\\"Cc)De2f.f-q-q-sH  xC  xEuv  GH  GP  GP  QD  FP  QW  X\  X`  X`  ap  qs  qz  qz  X{  |@  |D  |D  EP  |Q  RU  VZ  V^  V^  _i  jl  Vm  Rn  os  ow  ow  xD  oE  FQ  RU  R_  R_  Ra  bk  lo  ly  ly  l{  |D	  E	H	  I	K	  I	R	  I	R	  I	T	  E	U	  V	Y	  V	c	  V	c	  V	e	  f	o	  p	x	  y	z	  E{	  G|	  ~		  ~	F
  ~	F
  ~	H
  J
K
  J
Q
  J
Q
  J
S

6"4[E
6"6{3WZ[

 
 
,E}}&&z'J\']^N!+V;Y[YcYc|~  }F  }F  |G  GJ  KM  KU  KU  JV  zW  df  dp  dp  dr040@A_0_aN##$:>$JKK))*<*A*A*CD'K\\;/@"AJhu|  vM  vM  N  NQ {UY(Z"Z"Z#J/M3MEJ{3u=^_pqrswxyzCF^mr  AK  U[  hl  D  TX  9Y  Z@ 	  '!2!9!9!;7>>R`ar  FJ  DK  >K  >KA $ {UY(Z"Z"ZJ{37LMgh{|}  C  DE  FCFZi~  MW  ag  tx  KP  `d  9e  f8 	  '!2!9!9!;7>>R`ar  FJ  DK  >K  >K9 !!#6 	  '!2!9!9!;7>>R`ar  FJ  DK  >K  >K%j8PQXYJ{3tDQs6RX>GZ[\]
6":;G\]#ryy+v'&**WQ2GRXR\R\]defRgi im d N"ZH >K? #[> >K7 22 f
>#6KCPSHUZVZO\qrstxyz{g?T5dX[XcXc5dee0 	  '!2!9!9!;7>>R`ar  FJ  DK  >K  >K1 !! 
;s3HIabtuvw{|}~ a-t4J8J.5K9K
;s5S%4PQRVWXY06:S0SW\`qWq,  xI
*[`sy  HR  \b  os  FK  [_  5`  a  	a 	  '!2!9!9!;7>>R`ar  FJ  DK  >K  >K  Uc(	 *Y6 _:OS\:\ _3y@_DQU^D^ 	J~c:OPef{|}  C  DE  FCBWf{  JT  ^d  qu  HM  ]a  :b  c  c 	  '!2!9!9!;7>>R`ar  FJ  DK  >K  >K !_5s*SQdBe3kn+5c:M+N'jprujuTf  |Q
76%	%48HqQUVWXd3iFXFXgl  EL  MT  UX  Yc  dh  Mi  jw  x|  E}  Ew  IS  TW  Xk  Il  BE  rv  q{  |  @S  qT  Nm  Z^  r{  |@  }@  rA  OY  ci  |}  JO  cg  z  OS  9T  U  	U  '!2!9!9!;7>>R`ar  FJ  DK  >K  >KU >K 	  '!2!9!9!;7>>R`ar  FJ  DK  >K  >Ks  E"i %AY$ 6H(i /Z Y43Z Y7:Z =Ai Y:i .Z Y=+Z -Ai =Z >i Z Ai $h%A?i $	Y1-i 0Y11i 4Z 7Z :i =Z  i g?9\+g?h Ai $\'%i +<g?'A$`'g?h Ai  `#!i 'g?4A
g:>g??h Ai ci Cg:g?h #Ai 3g64i :g??h i Aiiii z/episodes/checkreqc                 l  K   t         st        dd      t        t        j                               }t        j
                         }| j                  dd      }| j                  dd      }| j                  dd      }| j                  dd      }d}	 t        j                  t         j                  j                  |||||	      d
       d {   \  }}	}	g }
|D ]  }|j                  d      xs d}i }t        j                  d|      }|r$t        j                  |j                  d            ni }|
j#                  |j                  d      |j                  d      |j                  d      ddD ci c]  }||j                  |       c}        |dt%        |
      t'        t        j
                         |z
  dz  d      d|
d d dS 7 # t         $ r Y w xY wc c}w # t        j(                  $ r; t+        d|ddt'        t        j
                         |z
  dz  d      dg ddd      cY S t         $ rz}t+        dt-        |      j.                  v rdnd|ddt'        t        j
                         |z
  dz  d      dg t-        |      j.                  t        |      d d  d      cY d }~S d }~ww xY ww)!NrE  ri  r  r    rm  obsidian_pathcontent_hasha)  MATCH (n:Episodic) WHERE n.name=$name OR n.source_description CONTAINS $key OR (n.source_description CONTAINS $path AND n.source_description CONTAINS $hash) RETURN n.name AS name, n.uuid AS uuid, n.source_description AS source_description, n.created_at AS created_at ORDER BY n.created_at LIMIT 20)r  rx   r   hashg      @r   rq  z\|\s*(\{.*\})$r  r.  
created_at)r  r.  r  )rm  r  r  source_arearj  rl  episode_checkr4   r5   F)r*   
query_typematched_countr6   ru  episodesr;  r   rv  r   TNeo4jQueryTimeoutz episode check exceeded 5 secondsrI  ServiceUnavailabler7   rY  )r  r	   rK   r.  r  re   rv   r   r   r0  r1  researchrP   r   grouprJ   r   r   rG   r   r   r  r   )r  r*   r{  r  rm  r  r  r   recordsr6  r  r3  sdrg  ry  kr  s                    rU   check_episoder    s    C!?@@4::< J$))+'7762Dr*JGGOR0M77>2.LDEF%../E/E/S/STY_chr  yF  LX/S  0Y  be  f  fA 	\Auu)*0bBr$ii)"-A01djj,rOOAEE&MvTUTYTYZfTg  [  CY  kZ}~klmqmumuvwmxkx  kZ  [  \	\ (_UXYaUbqvx|  yB  yB  yD  EL  yL  NR  xR  ST  rU  bg  s{  IM  ^b  c  	c f "d" kZ c*Ziz{  KP  RV  R[  R[  R]  ^e  Re  gk  Qk  lm  Kn  {  KM  [n  a  5b  c  	c F/CtCyGYGY/Y_b  zD  Ra  rs  BG  IM  IR  IR  IT  U\  I\  ^b  Hb  cd  Be  rw  CE  SW  X[  S\  Se  Se  vy  z}  v~  C  @C  vD  lE  F  	FFs   BJ4<G" G<G" 
(G2AG" 3G?G" J4G" 	GG" GG" "AJ1-J4/J17A/J,&J1'J4,J11J4z/episodes/inventoryc            	         K   t         st        dd      t         j                  j                  d       d {   \  } }}d| D cg c]  }|d   |d   |d   |d   d	 c}iS 7 +c c}w w)
NrE  ri  zMATCH (n:Episodic) RETURN n.name AS name,n.uuid AS uuid,substring(n.source_description,0,2000) AS source_description,n.created_at AS created_at ORDER BY n.created_atr  r  r.  rq  r  )r  r.  rq  r  )r  r	   r0  r1  )r  r6  r3  s      rU   episode_inventoryr    s     -5S"TT%,,::  <c  d  dKGAa  PW  X  KL&	6PQRfPguv  xD  vE  F  X  Y  Y d Xs!   5A*A#A*A%A*%A*z/searchc           
        K   t         st        dd      t         j                  | j                  | j                         d {   }d|D cg c].  }d|j
                  it        |d      rdt        |d      indd i0 c}iS 7 @c c}w w)NrE  ri  num_resultsresultsfactscore)r  r	   r  r   rb  r  hasattrrw  )r  r  r3  s      rU   r  r  	  s     C!?@@#**399#))*LLG  CJ  K}~xgVWY`NaWga6I,Jhoqugvx  K  L  L M Ks$   ABB	B3B BBz/facts/{entity}entityc                    K   t         st        dd      t         j                  | d       d {   }| |D cg c]  }|j                   c}dS 7 !c c}w w)NrE  ri     r  )r  facts)r  r	   r  r  )r  r  r3  s      rU   	get_factsr    sR     C!?@@#**6r*BBG'@1'@AA C'@s    -AA	AAAA)r$  NNNN)NNNN)r   NNNN)NNNr   NN)rE   rP   r  r  r.  re   r   r   contextvarsr   signalrC   pathlibr   r   r   r   typingr   fastapir   r	   r
   fastapi.responsesr   fastapi.middleware.corsr   pydanticr   graphiti_corer   graphiti_core.nodesr   graphiti_core.llm_clientr   graphiti_core.llm_client.configr   openair   r   r   r   httpxr   graphiti_core.embedderr   "graphiti_core.cross_encoder.clientr   	fastembedr   r   r   r   
ContextVarrj  r2  rk  rl  rn  ro  r3  r4  r5  getenvrN   rV   ro   3graphiti_core.utils.maintenance.temporal_operationsutilsrY  temporal_operations	_temporalr  get_edge_contradictionsrq   !_original_get_edge_contradictions/graphiti_core.utils.maintenance.node_operationsnode_operations_nodeopsry   
_to_modulerM   __file__r  _to_srcr   rO   r  graphiti_core.graphitirG  _graphiti_module_g_srcr|   r   r   appadd_middlewarer  r  r  rq  rr  r  r  rb   r  r  r  r  r  ra   rc   rd   r  r  rC  r  r  r  r  r  r  r  r   r  r  on_eventr  r  r  rV  r  rp  r  r  rJ   r  r&  r  r?  rA  rv   r[  r_  postr  dictr  r  r  rK   r  r   rp   rU   <module>r     s   	  	       
    2 2  3 3 * 2  " + 1 5  G G  1 A # ( (+[++,A4P '''(92F///0@"M ,k,,-BBO ///0@!L 0+001LVZ[ +[++L$G +[++L$G ///0@$O BII:;fg  HLFJS H GU\]f]~]~  AN  VOI$E$E$Q$Q  UY ! B B& I H
z""
#
(
(
*#72ooL 	AG 			c"((1	
45 2	''	(	-	-	/V
f 4^^J
3F		"	"C(..v6	
23&N &,0 ,o| ob	 0'B   >#se\_[`  a;(DE	<1
+^</0UIBII>PRT4U>+HI;(@A	=*JK!&yryy1QSX'Y!Z $))"))4WY^*_$` !&+IBII6[]a,b&c ##(3UW[)\#]   %ibii0OQV&W X  %ibii0OQV&W X &+IBII6[]a,b&c #',YRYY7]_c-d'e $!&yryy1QSW'X!Y  %ibii0OQU&V W 9299%;SAB +0;egl1m+n (49)"))Dwy~:  5A 1&*(# *  /G00 /
= i <i  299*+JK
67_` EG ]AIV"[ I  
K 
K 	}  } +Ci' CiG Ci CiJ 
FT F F6 	Y  Y
 )Lm L L 	BC B B{  $ s   5X X! X!