
    ʭj!                        d 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mZm	Z	m
Z
 ddlmZ ddlZddlZ ej                   e      Z G d d      Z G d d      Z G d	 d
      Zd Zedk(  r ej.                   e              yy)uf   
WeMM 视觉-语言融合模块
支持：语义检索、知识记忆、异常检测、上下文理解
    N)OptionalListDictAny)dequec                   b    e Zd ZdZddedefdZdedee   fdZ	de
dee   fd	Zd
e
dedefdZy)
WeMMClientu   WeMM-Embedding 远程客户端api_url	dimensionc                 >    |j                  d      | _        || _        y )N/)rstripr
   r   )selfr
   r   s      </Users/leo/.hermes/workspace/livekit-agents/vision_fusion.py__init__zWeMMClient.__init__   s    ~~c*"    textreturnc                   K   t        j                         4 d{   }|j                  | j                   d|| j                  d      4 d{   }|j
                  dk(  rB|j                          d{   }|d   d   cddd      d{    cddd      d{    S t        d|j
                         7 7 o7 J7 47 %# 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY ww)	u   编码文本N/embed)inputsr   )json   
embeddingsr   API error: )aiohttpClientSessionpostr
   r   statusr   	Exception)r   r   sessionrespresults        r   encode_textzWeMMClient.encode_text   s     ((**g||<<.' $4>>B $   ;;#%#'99;.F!,/2   +**  +dkk] ;<< +
 / +   +****s   DB?D2C0CC0#C	8C9C	C0CC0D!C"D'C	?DC0C	C0D	C	CC	C0D)C,*D0D6C97D>D	img_bytesc                   K   t        j                         4 d{   }t        j                         }|j                  d|dd       |j                  dt	        | j
                               |j                  | j                   d|      4 d{   }|j                  d	k(  rB|j                          d{   }|d
   d   cddd      d{    cddd      d{    S t        d|j                         7 7 o7 J7 47 %# 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY ww)u   编码图像Nfile	frame.jpg
image/jpegfilenamecontent_typer   r   datar   r   r   r   )r   r   FormData	add_fieldstrr   r   r
   r   r   r    )r   r%   r!   r.   r"   r#   s         r   encode_imagezWeMMClient.encode_image'   s    ((**g##%DNN69{Q]N^NN;DNN(;<||t||nF$;$|GG4;;#%#'99;.F!,/2 HGG +**  +dkk] ;<< +
 H. H +
 HGG +****s   ED EA3D1DD1#D
9D:D
D1DD1E"D#E(D
 ED1D
D1E
D	DD	D1E*D-+E1E7D:8E?Eimage_bytesc                   K   t        j                         4 d{   }t        j                         }|j                  d|dd       |j                  d|       |j                  dt	        | j
                               |j                  | j                   d|	      4 d{   }|j                  d
k(  r|j                          d{   }|j                  dg       }t        |      dk\  rlt        j                  |d         }t        j                  |d         }	t        j                  ||	      }
|
|fcddd      d{    cddd      d{    S 	 ddd      d{    ddd      d{    y7 c7 7 7 ?7 07  7 # 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY ww)u%   编码图像+文本，返回相似度Nr'   r(   r)   r*   queryr   r   r-   r   r      r      )NN)r   r   r/   r0   r1   r   r   r
   r   r   getlennparraydot)r   r3   r   r!   r.   r"   r#   r   img_embtext_emb
similaritys              r   encode_mixedzWeMMClient.encode_mixed4   se    ((**g##%DNN6;S_N`NN7D)NN;DNN(;<||t||nF$;$|GG4;;#%#'99;.F!'L"!=J:!+"$((:a="9#%88JqM#:%'VVGX%>
):5 HGG +** " HG +** H. H + H + HGG +****s   G	E>G	BF4$F%F4(#FFA-F9F4FF4
G	FG	FF4(F	)F4-G	8F9G	F4FF4G		F4G	F	FF	F4"G	-F0.G	4G:F=;GG	N)i   )__name__
__module____qualname____doc__r1   intr   r   floatr$   bytesr2   tupler@    r   r   r	   r	      s`    (# # #
=c 
=d5k 
==E =d5k ="e "3 "5 "r   r	   c                   b    e Zd ZdZddefdZddedee   defdZ	dd	ee   d
edee
   fdZd Zy)MultimodalMemoryu   视觉知识记忆库max_entriesc                 &    t        |      | _        y )N)maxlen)r   entries)r   rL   s     r   r   zMultimodalMemory.__init__K   s    #;7r   Nlabel	embedding	timestampc                     | j                   j                  |t        j                  |      |xs t	        j                         d       y)u   添加记忆条目)rP   rQ   rR   N)rO   appendr:   r;   time)r   rP   rQ   rR   s       r   addzMultimodalMemory.addN   s6    ),"1diik
 	r   query_embeddingtop_kr   c                     t        j                  |      }g }| j                  D ]?  }t        j                  ||d         }|j	                  |d   t        |      |d   d       A |j                  d d       |d| S )	u   相似度搜索rQ   rP   rR   )rP   r?   rR   c                     | d   S )Nr?   rI   )xs    r   <lambda>z)MultimodalMemory.search.<locals>.<lambda>c   s    1\?r   T)keyreverseN)r:   r;   rO   r<   rT   rF   sort)r   rW   rX   r5   resultsentryr?   s          r   searchzMultimodalMemory.searchV   s    )\\Eu['9:JNNw#J/";/  " 	2DAvr   c                 8    | j                   j                          y)u   清空记忆N)rO   clear)r   s    r   rd   zMultimodalMemory.clearf   s    r   )d   N)   )rA   rB   rC   rD   rE   r   r1   r   rF   rV   r   rb   rd   rI   r   r   rK   rK   H   sV    8C 8 e  d5k # d4j  r   rK   c                       e Zd ZdZdedefdZdedefdZ	deded	e
eef   fd
Zded	ee
   fdZdeded	e
fdZdeded	ee   fdZy)VisualLanguageFusionu   视觉-语言融合引擎wemm_clientmemoryc                 V    || _         || _        dddddddddd	d
dddddg| _        y )Nu   有人跌倒或需要帮助g      ?u   跌倒检测)r   	thresholdalertu   长时间静止的人gffffff?u   静止检测u   陌生人出现在画面g?u   陌生人检测u   紧急求助场景u   求助检测)wemmrk   alert_patterns)r   rj   rk   s      r   r   zVisualLanguageFusion.__init__n   sD    	2P^_,4.Y/dM^_)~V	
r   frame_bytesrP   c                    K   | j                   j                  |       d{   }| j                  j                  ||       t        j                  d|        y7 9w)u$   学习场景（建立视觉记忆）Nu   ✅ 已学习场景: )ro   r2   rk   rV   loggerinfo)r   rq   rP   rQ   s       r   learn_scenez VisualLanguageFusion.learn_scenex   sH     ))00==	y)+E734 >s   AA:Aquestionr   c                 n  K   | j                   j                  |       d{   }| j                   j                  |       d{   }t        j                  t        j
                  |      t        j
                  |            }| j                  j                  |d      }t        |      ||dS 7 7 nw)u   回答关于视频的问题Nrg   )rX   )r?   relevant_scenesrv   )	ro   r$   r2   r:   r<   r;   rk   rb   rF   )r   rq   rv   	query_embr=   r?   rx   s          r   answer_video_queryz'VisualLanguageFusion.answer_video_query~   s      ))//99			..{;; VVBHHY/'1BC
 ++,,Ya,@  
+. 
 	
 :;s"   B5B1"B5B3A-B53B5c                   K   | j                   j                  |       d{   }g }| j                  D ]  }| j                   j                  |d          d{   }t	        j
                  t	        j                  |      t	        j                  |            }||d   kD  sn|j                  |d   t        |      |d   d        |S 7 7 sw)u   检测多种异常模式Nr   rm   rn   )typer?   rm   )	ro   r2   rp   r$   r:   r<   r;   rT   rF   )r   rq   r=   
detectionspatternr>   r?   s          r   detect_anomaliesz%VisualLanguageFusion.detect_anomalies   s     		..{;;
**G!YY2276?CCH 1288H3EFJGK00!!#G,"'
"3!(!5#  +  < Ds(   CC
6CCAC")CCconversation_historyc                    K   g d}t        fd|D              }|r1| j                  j                  |       d{   }d|dd dd d}|S dd	iS 7 w)
u$   结合对话历史的上下文理解)u   看u	   看哪里u   检查u   观察u   画面u   视频u   监控c              3   &   K   | ]  }|v  
 y wrf   rI   ).0kwr   s     r   	<genexpr>z@VisualLanguageFusion.contextual_understanding.<locals>.<genexpr>   s     P"2!55s   NT
   i8)needs_visionrQ   conversationr   F)anyro   r2   )r   rq   r   visual_keywordsr   r=   contexts     `    r   contextual_understandingz-VisualLanguageFusion.contextual_understanding   sr      a PPP II22;??G !%$Sb\ 4TU ;G
 N&& @s   9AAAuser_speechc                    K   | j                  |       d{   }|r.t        fd|D              s|d   d   }|d   d   }d| d|dd	S y7 5w)
u'   主动介入（结合语音和视觉）Nc              3   ,   K   | ]  }|d    v   yw)r|   NrI   )r   ar   s     r   r   z>VisualLanguageFusion.proactive_intervention.<locals>.<genexpr>   s      M9a6k!99s   r   r|   r?   u   ⚠️ 检测到u   （置信度：z.2fu   ），需要帮助吗？)r   r   )r   rq   r   	anomalies
alert_typer?   s     `   r   proactive_interventionz+VisualLanguageFusion.proactive_intervention   sk      //<<	 S M9 MM"1f-J"1l3J%j\C@PPhii =s   AA6AN)rA   rB   rC   rD   r	   rK   r   rG   r1   ru   r   r   rz   r   r   r   r   r   rI   r   r   ri   ri   k   s    #
J 
8H 
5U 53 5
E 
S 
TRUWZRZ^ 
$% DJ $'% '>A'FJ'. 36;CC=r   ri   c                     K   t        d      } t               }t        | |      }t        d       t        d       t	        j
                  d      }t        d       d}t        d       yw)	u   测试 multimodal fusionzhttp://localhost:8765u   
=== 1. 学习场景 ===u   
=== 2. 异常检测 ===i'  u   
=== 3. 上下文理解 ===u!   帮我看看厨房里有没有人u   
✅ 模块加载成功N)r	   rK   ri   printosurandom)ro   rk   fusiondummy_imager   s        r   mainr      sf      -.DF!$/F 

%&
 

%&**U#K
 

()6L 

$%s   A&A(__main__)rD   asynciologgingr   rU   base64typingr   r   r   r   collectionsr   numpyr:   r   	getLoggerrA   rs   r	   rK   ri   r   runrI   r   r   <module>r      s      	   , ,   			8	$1" 1"h   F[ [~&: zGKK r   