+
    Ki                        R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtHtH	t	H
t
Ht ^ RIHt ^ RIHt ^ RIt]! RRR	7      t]P$                  P'                  R
R4      t]! RRR7      tR R lt]P.                  ! 4       R,          R,          R,          t]R,          t]R,          t]R,          t]]]]3 F  t]P;                  RRR7       K  	  R R ltR R ltR R lt ]P'                  R4      R  4       t!]PE                  R!4      ]! ]4      3R" R# ll4       t#]PE                  R$4      ]! ]4      3R% R& ll4       t$]PE                  R'4      ]! ]4      3R( R) ll4       t%]PE                  R*4      ]! ]4      3R+ R, ll4       t&]'R-8X  d;   ](! R24       ](! R4       ](! R.] 24       ](! R24       ]PR                  ! ]R/R0R17       R# R# )3z
Omi Webhook Receiver
Receives transcripts and memory data from Omi app in real-time.
Stores locally for Tony to access and learn from.
N)datetime)Path)FastAPIRequestHTTPExceptionSecurityDepends)JSONResponse)APIKeyHeaderOmi Webhook Receiver1.0.0)titleversionOMI_WEBHOOK_SECRET X-Webhook-SecretF)name
auto_errorc                $    V ^8  d   QhR\         /#    requestr   )formats   "J/Users/tonyclaw/.openclaw/workspace/services/omi-webhook/webhook_server.py__annotate__r      s     D D D    c                    "   \         '       g   R # V P                  P                  R4      ;'       g    V P                  P                  R4      pV\         8w  d   \	        RRR7      hR # 5i)Nr   secreti  Unauthorizedstatus_codedetail)
OMI_SECRETheadersgetquery_paramsr   )r   tokens   & r   verify_tokenr(      sV     :OO 23YYw7K7K7O7OPX7YE
NCC s
   0A)6A)z	.openclaw	workspacezomi-datatranscriptsmemoriesrawT)parentsexist_okc                <    V ^8  d   QhR\         R\        R\        /# )r   data
event_typereturndictstr)r   s   "r   r   r   )   s!      4 S S r   c           	     $   \         P                  ! 4       P                  R4      pV RV R2p\        V,          p\	        VR4      ;_uu_ 4       p\
        P                  ! W^\        R7       RRR4       \        V4      #   + '       g   i     L; i)z&Save raw webhook payload for debuggingz%Y%m%d_%H%M%S_%f_.jsonwindentdefaultN)r   nowstrftimeRAW_DIRopenjsondumpr5   )r0   r1   	timestampfilenamefilepathfs   &&    r   save_rawrG   )   sl    ''(:;IQyk/H!H	h				$!S1 
x= 
	s   A??B	c                0    V ^8  d   QhR\         R\        /# r   r0   r2   r3   )r   s   "r   r   r   3   s      $ 3 r   c                P   \         P                  ! 4       P                  R4      p\        \         P                  ! 4       P                  R4      ,          pVP	                  RR7       R\         P                  ! 4       P                  4       RV P                  R4      RV P                  R. 4      RV P                  R. 4      R	V /pR
V R2pW$,          p\        VR4      ;_uu_ 4       p\        P                  ! W6^\        R7       RRR4       \        V4      #   + '       g   i     L; i)z(Save transcript data in organized format%Y%m%d_%H%M%S%Y-%m-%dTr.   received_at
session_idsegmentstranscript_segmentsr,   transcript_r8   r9   r:   N)r   r=   r>   TRANSCRIPTS_DIRmkdir	isoformatr%   r@   rA   rB   r5   )r0   rC   date_foldertranscript_datarD   rE   rF   s   &      r   save_transcriptrX   3   s    ''8I!HLLN$;$;J$GGKt$ 	x||~//1dhh|,DHHZ,txx(=rBtO YKu-H%H	h				/Q< 
 x= 
	s   $DD%	c                0    V ^8  d   QhR\         R\        /# rI   r3   )r   s   "r   r   r   J   s      d s r   c                   \         P                  ! 4       P                  R4      p\        \         P                  ! 4       P                  R4      ,          pVP	                  RR7       R\         P                  ! 4       P                  4       RV P                  R4      ;'       g    V P                  R4      RV P                  R	/ 4      P                  R4      ;'       g    V P                  R4      R
V P                  R	/ 4      P                  R
4      ;'       g    V P                  R
4      RV P                  R	/ 4      P                  R. 4      RV P                  R	/ 4      P                  R4      RV P                  R4      RV /pRV R2pW$,          p\        VR4      ;_uu_ 4       p\        P                  ! W6^\        R7       RRR4       \        V4      #   + '       g   i     L; i)z Save memory/conversation summaryrK   rL   TrM   rN   	memory_ididr   
structuredoverviewaction_itemscategory
transcriptr,   memory_r8   r9   r:   N)r   r=   r>   MEMORIES_DIRrT   rU   r%   r@   rA   rB   r5   )r0   rC   rV   memory_datarD   rE   rF   s   &      r   save_memoryre   J   ss   ''8I!8!8!DDKt$ 	x||~//1TXXk*<<dhhtn,+//8MMDHHW<MDHH\2.22:>VV$((:BVr266~rJDHH\2.22:>dhh|,t	K 5)H%H	h				+C8 
 x= 
	s   !GG"	/c            
     8   "   RRRRRRR\        \        4      /# 5i)zHealth check endpointstatusokservicer   r   r   storage)r5   DATA_DIR r   r   rootrn   c   s*      	$)73x=	 s   z/webhookc                $    V ^8  d   QhR\         /# r   r   )r   s   "r   r   r   o   s     " "7 "r   c                  "    V P                  4       G Rj  xL
 p\        R\        P
                  ! 4       P                  4        R24       \        TR4      pRT9   g   R	T9   d   \        T4      pR
pM RT9   g   RT9   d   \        T4      pRpMTpRp\        RT 24       \        RT 24       \        RRRTRT/^R7      #  L  \         d   p\        RRT 2R7      hRp?ii ; i5i)zMain webhook endpoint for OmiN  Invalid JSON: r    [z] Webhook receivedwebhookrP   rQ   ra   r]   r[   memoryunknownz  Type: 	  Saved: rh   receivedtypesaved_to)contentr!   )rA   	Exceptionr   printr   r=   rU   rG   rX   re   r	   )r   _authr0   eraw_pathrE   r1   s   &&     r   receive_webhookr   n   s    J\\^#
 
Ahlln&&());
<= i(H T2d:"4(!
		!4t$

	HZL
!"	IhZ
 !jJ

  1 $ JnQC4HIIJs8   C(C CC B'C(C C%C  C%%C(z/webhook/transcriptc                $    V ^8  d   QhR\         /# r   r   )r   s   "r   r   r      s     8 8g 8r   c                <  "    V P                  4       G Rj  xL
 p\        R\        P
                  ! 4       P                  4        R24       \        TR4       \        T4      p\        RT 24       R	R
RT/#  L_  \         d   p\        RRT 2R7      hRp?ii ; i5i)zDedicated transcript endpointNrq   rr   r    rs   z] Transcript receivedra   rw   rh   rx   rz   )	rA   r|   r   r}   r   r=   rU   rG   rX   )r   r~   r0   r   rE   s   &&   r   receive_transcriptr      s     J\\^# 
Ahlln&&())>
?@T< t$H	IhZ
 !j*h77 $ JnQC4HIIJs8   BA9 A7A9 AB7A9 9BBBBz/webhook/memoryc                $    V ^8  d   QhR\         /# r   r   )r   s   "r   r   r      s     8 8' 8r   c                  "    V P                  4       G Rj  xL
 p\        R\        P
                  ! 4       P                  4        R24       \        TR4       \        T4      pTP                  R/ 4      P                  R	4      ;'       g    TP                  R	R
4      p\        RT 24       \        RT 24       RRRT/#  L  \         d   p\        RRT 2R7      hRp?ii ; i5i)zDedicated memory endpointNrq   rr   r    rs   z] Memory receivedru   r]   r   Untitledz	  Title: rw   rh   rx   rz   )
rA   r|   r   r}   r   r=   rU   rG   re   r%   )r   r~   r0   r   rE   r   s   &&    r   receive_memoryr      s     J\\^# 
Ahlln&&()):
;<T84 H HH\2&**73TTtxx7TE	IeW
	IhZ
 !j*h77 $ JnQC4HIIJs8   C%C C C B$C% C C"CC""C%z/webhook/realtimec                $    V ^8  d   QhR\         /# r   r   )r   s   "r   r   r      s     " "G "r   c                   "    V P                  4       G Rj  xL
 pTP                  RR4      R,          p\	        RT R	24       R
R/#  L0  \         d   p\        RRT 2R7      hRp?ii ; i5i)zReal-time streaming endpointNrq   rr   r    textr   :N2   Nz[RT] z...rh   rx   )rA   r|   r   r%   r}   )r   r~   r0   r   segment_texts   &&   r   receive_realtimer      sv     J\\^# 88FB',L	E,s
#$j!! $ JnQC4HIIJs7   A-A
 AA
 ,A-A
 
A*A%%A**A-__main__zData directory: z0.0.0.0i="  )hostportz2==================================================)*__doc__rA   osr   pathlibr   fastapir   r   r   r   r   fastapi.responsesr	   fastapi.security.api_keyr
   uvicornappenvironr%   r#   api_key_headerr(   homerl   rS   rc   r?   drT   rG   rX   re   rn   postr   r   r   r   __name__r}   runrm   r   r   <module>r      s    	   F F * 1 *G< ZZ^^0"5
#5%HD 99;${2Z?]**$
U
 O\7	;AGGD4G( 
<.2   *29,2G " "J 
 5<\5J 8 !8 
181F 8 8& 
3:<3H " " z	(O	
 !	XJ
'(	(OKK)$/ r   