Skip to main content
Glama

MCP Agent Platform

person_database.cpython-312.pyc22.1 kB
� R��gF��`�dZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl Z Gd�d�Z y)uD人物数据库模块 用于存储和加载已识别的人物信息 �N)�Dict�List�Any�Optional�Tuplec �0�eZdZdZddefd�Zdd�Zdd�Zdeddfd �Z d ed e jd edefd �Z ddede d eddfd�Zdd e jde deefd�Zdedeeeeffd�Zdeeeeefffd�Zde jde jde fd�Zy)�PersonDatabaseuI人物数据库类 用于存储和加载已识别的人物信息 � database_pathc���tjd�|_||_i|_d|_t j|jd��|j�y)Nr �T)�exist_ok) �logging� getLogger�loggerr �persons�next_id�os�makedirs� load_persons)�selfr s �1D:\AIProject\mcpTest\src\utils\person_database.py�__init__zPersonDatabase.__init__sO���'�'�(8�9�� �*����� ��� � � � �D�&�&��6� �����returnNc��� tjj|jd�}tjj |�s|j j d�yt|dd��5}tj|�}|jdd�|_ |jd g�}ddd�D]�}tjj|j|�}tjj |�s�Mt|dd��5}tj|�}d |vr |d rtj|d �|d <||j|d <ddd���|j j d t|j��d ��y#1swY��xYw#1swY��xYw#t $r(}|j j#d|���Yd}~yd}~wwxYw)u$加载所有已保存的人物数据� index.jsonu-人物索引文件不存在,创建新索引N�r�utf-8��encodingrr r� face_encoding�idu 成功加载u个人物数据u加载人物数据时出错: )r�path�joinr �existsr�info�open�json�load�getr�np�arrayr�len� Exception�error) r� index_path�f� index_data� person_files� person_file� person_path� person_data�es rrzPersonDatabase.load_personss��� C������d�&8�&8�,�G�J��7�7�>�>�*�-�� � � � �!P�Q���j�#��8� =�A�!�Y�Y�q�\� �)�~�~�i��;�� �)�~�~�i��<� � =� ,� F� � �g�g�l�l�4�+=�+=�{�K� ��7�7�>�>�+�.��k�3��A�F�Q�&*�i�i��l� �*�k�9�k�/�>Z�;=�8�8�K�P_�D`�;a�K��8�:E�� � �[��%6�7� F�F� F� �K�K� � �|�C�� � �,=�+>�o�N� O�! =� =��F�F��� C� �K�K� � � =�a�S�A� B� B�� C�sV�A$F:�'F:�5?F"�4AF:� F:�A F.�%<F:�"F+�'F:�.F7 �3F:�: G+�G&�&G+c�� |j|jj�D�cgc]}d|�d��� c}d�}tjj |j d�}t|dd��5}tj||dd � �d d d �y cc}w#1swYy xYw#t$r(}|jjd |���Yd }~y d }~wwxYw) u保存人物索引�person_�.json)rrr�wrrF��� ensure_ascii�indentNu保存人物索引时出错: ) rr�keysrr#r$r r'r(�dumpr.rr/)r� person_idr2r0r1r7s r� save_indexzPersonDatabase.save_index:s��� C��<�<�HL� � �HY�HY�H[�\�9�g�i�[��6�\��J� �����d�&8�&8�,�G�J��j�#��8� G�A�� � �*�a�e�A�F� G� G�� ]� G� G��� C� �K�K� � � =�a�S�A� B� B�� C�sE�'B'� B�=B'�3B� B'�B'�B$� B'�$B'�' C�0C�CrBc�6� ||jvr |jjd|�d��y|j|j�}d|vr|d�|dj �|d<t j j|jd|�d��}t|dd� �5}tj||d d � �ddd�|j�y#1swY�xYw#t$r(}|jjd |���Yd}~yd}~wwxYw)u保存单个人物数据� 人物ID � 不存在Nr!r9r:r;rrFr<r=u保存人物数据时出错: )rr�warning�copy�tolistrr#r$r r'r(rArCr.r/)rrBr6r5r1r7s r� save_personzPersonDatabase.save_personIs �� C��� � �,�� � �#�#�i� �{�*�$E�F���,�,�y�1�6�6�8�K��+�-�+�o�2N�2Z�/:�?�/K�/R�/R�/T� �O�,��'�'�,�,�t�'9�'9�W�Y�K�u�;U�V�K��k�3��9� H�Q�� � �+�q�u�Q�G� H� �O�O� �  H� H�� � C� �K�K� � � =�a�S�A� B� B�� C�s5�-C'�A8C'�(C�C'�C$� C'�' D�0D�D�namer!� face_imagec�(�|j}|xjdz c_||||tj�tj�dd�}||j|<|j|�|jj d|�d|�d��|S)u�添加新人物 Args: name: 人物名称 face_encoding: 人脸特征向量 face_image: 人脸图像的base64编码 Returns: 新添加的人物ID r )r"rKr!rL� first_seen� last_seen� seen_countu添加新人物: � (ID: �))r�timerrJrr&)rrKr!rLrBr6s r� add_personzPersonDatabase.add_person`s����L�L� � � � ��� ���*�$��)�)�+������ � �#.�� � �Y�� ����#� � � ���,�T�F�&�� �1�E�F��rrOc�H�||jvr |jjd|�d��y|j|}|�tj�}||d<|dxxdz cc<|r||d<|j |�|jj d|d �d |�d ��y) u�更新人物信息 Args: person_id: 人物ID last_seen: 最后一次见到的时间戳 face_image: 新的人脸图像base64编码 rErFNrOrPr rLu更新人物信息: rKrQrR)rrrGrSrJr&)rrBrOrL�persons r� update_personzPersonDatabase.update_person�s��� �D�L�L� (� �K�K� � �)�I�;�j� A� B� ����i�(�� � �� � � �I�'��{�� �|���!�� �#-�F�<� � ����#� � � ���/��v��/?�v�i�[�PQ�R�Sr� thresholdc �t �|jjd|j�d|j���|jjd|�dt |����|j s|jj d�yd}d}|jjdt|j ��d ��|j j�D�]�\}}d |vs|d � |jjd |�d ���0|jjd |�d|d j�d|d j��� |j||d �}|jjd|�d|�dt |����t|tj�r�|jjd|j�d|j�d|���|jdk(r=|}t|j��}|jjd|�d|���n�|}t|j!��}|jj#d|j�d|���n�t|t$ttj&f�s+|jj#dt |��d��d}n3|}t|�}||k7r!|jjd|�d|���|jjd|�d|���|jjd|�dt |��d|�dt |��d � �t|�} t|�} | | kDr%|jjd!| �d"| ���| }|}���|jjd&|�dt |��d'|���t|�} t|�} |jjd(| �d)| ���| | k\r:|�8|jj d*|j |d+�d,|�d-| d.�d ��|S|jj d/| d.���y#t($r\} |jj+d |�d#| ���d$dl} |jj+d%| j/����Yd} ~ ���d} ~ wwxYw)0u查找相似的人物 Args: face_encoding: 人脸特征向量 threshold: 相似度阈值,默认为0.8 Returns: 如果找到相似人物,返回人物ID;否则返回None u5开始查找相似人物,输入特征向量形状: �, 数据类型: u相似度阈值: � , 类型: u0人物数据库为空,无法查找相似人物N�u人物数据库中共有u 个人物r!rEu" 没有人脸特征向量,跳过u计算与人物ID u* 的相似度,人物特征向量形状: u 与人物ID u 的原始相似度: �"相似度是NumPy数组,形状: �, 值: r u'将单元素数组转换为标量: 从 u 到 �,相似度结果是多元素数组,大小: �, 取平均值: u%相似度不是数值类型,而是 u ,设置为0u将相似度从 u 转换为浮点数: u 的最终相似度: u比较相似度: 当前值 u (类型: u) vs 最大值 rRu找到更高相似度: z > u 的相似度时出错: r�错误详情: u最大相似度: u), 最相似人物ID: u阈值比较: z >= u找到相似人物: rKrQu , 相似度: z.2fu;未找到相似度超过阈值的人物,最大相似度: )r�debug�shape�dtype�typerr&r-�items�_cosine_similarity� isinstancer+�ndarray�size�float�item�meanrG�int�numberr.r/� traceback� format_exc)rr!rX�max_similarity�most_similar_idrBrV� similarity�original_similarity�similarity_float�max_similarity_floatr7rp�threshold_floats r�find_similar_personz"PersonDatabase.find_similar_person�s��� � � ���Q�R_�Re�Re�Qf�fv�xE�xK�xK�wL�M� N� � � ���-�i�[� �4� �?�BS�T�U��|�|� �K�K� � �O� P������ � � ���4�S����5F�4G�y�Q�R�!%���!3�!3�!5�3 � �I�v��f�,���0G�0O�� � �!�!�I�i�[�8Z�"[�\�� �K�K� � � 2�9�+�=g�hn�o~�h�iF�iF�hG�GW�X^�_n�Xo�Xu�Xu�Wv�w� x�+ �!�4�4�]�F�?�D[�\� �� � �!�!�L�� �;P�Q[�P\�\f�gk�lv�gw�fx�"y�z��j�"�*�*�5��K�K�%�%�(J�:�K[�K[�J\�\l�mw�m}�m}�l~�F�GQ�FR�'S�T�!���!�+�.8�+�%*�:�?�?�+<�%=� �� � �)�)�,S�Tg�Sh�hm�nx�my�*z�{�.8�+�%*�:�?�?�+<�%=� �� � �+�+�.Z�[n�[s�[s�Zt�uE�FP�EQ�-R�S�#�J��e�R�Y�Y�0G�H��K�K�'�'�*O�PT�U_�P`�Oa�an�(o�p�!$�J�+5�'�!&�z�!2�J�*�j�8�� � �)�)�,<�=P�<Q�Qf�gq�fr�*s�t�� � �!�!�L�� �;P�Q[�P\�"]�^�� � �!�!�$?� �|�:�VZ�[e�Vf�Ug�gv�xF�wG�GQ�RV�We�Rf�Qg�gh�#i�j�#(��#4� �',�^�'<�$�#�&:�:��K�K�%�%�(?�@P�?Q�QT�Ui�Tj�&k�l�%5�N�&/�O��]3 �l � � ���-�n�-=�Z��^�H\�G]�]s�uD�tE�F� G� � �*��$�^�4�� � � ���N�+?�*@��_�DU�V�W� �?� 2��7R� �K�K� � �3�D�L�L��4Q�RX�4Y�3Z�Z`�ap�`q�q~�@T�UX�Y�YZ�[� \�"� "� �K�K� � �Z�[o�ps�Zt�u� v���'� �� � �!�!�$6�y�k�AY�Z[�Y\�"]�^� �� � �!�!�N�9�3G�3G�3I�2J�"K�L���  �s�IQ� R7�AR2�2R7c�8�|jj|�S)u�获取人物信息 Args: person_id: 人物ID Returns: 人物信息字典,如果不存在则返回None )rr*)rrBs r� get_personzPersonDatabase.get_person�s���|�|��� �*�*rc��|jS)uc获取所有人物信息 Returns: 所有人物信息的字典 )r)rs r�get_all_personszPersonDatabase.get_all_personss�� �|�|�r�vec1�vec2c �V� |jjd|j�d|j���|jjdt|��dt|����|jjd|j�d|j���|j|jk7r�|jj d|j�d|j���|j |j k(rD|j|j�}|jjd|j���n6|jj d |j �d|j ���y |j�}|j�}|jjd |j�d |j���|jjd |j dk\r|ddn|���|jjd|j dk\r|ddn|���tj||z�}tjj|�}tjj|�}|jjd|�dt|��dt|tj����t|tj�r5|jjd|j�d|j���|jjd|�dt|��d|�dt|����t|tj�r5|jjd|j�d|j���t|tj�r5|jjd|j�d|j���t|tj�ru|jjd|���t|j dk(r|j!�n|j#��}|jjd|���n t|�}t|tj�ru|jjd|���t|j dk(r|j!�n|j#��}|jjd|���n t|�}t|tj�ru|jjd|���t|j dk(r|j!�n|j#��}|jjd |���n t|�}|d k(s|d k(r|jj d!�y |||zz }|jjd"|�dt|����t|tj�r�|jjd#|j�d|j�d$|���|j dk(r8t|j!��}|jjd%|���n�|jj d&|j �d'|j#����t|j#��}|jjd(|���n)t|�}|jjd)|���|d ks|d*kDr|jj d+|�d,��tt%d t'd*|���} |jjd-| �dt| ����| S#t($rX} |jj+d.| ���d/dl} |jj+d0| j/����Yd} ~ y d} ~ wwxYw)1u�计算两个向量的余弦相似度 Args: vec1: 向量1 vec2: 向量2 Returns: 余弦相似度,范围为[0, 1] u输入向量形状: vec1=z, vec2=u输入向量类型: vec1=u%输入向量数据类型: vec1.dtype=z , vec2.dtype=u向量形状不匹配: z vs u调整vec1形状为: u,向量大小不匹配,无法调整形状: r\u!展平后向量形状: vec1_flat=z , vec2_flat=u.展平后向量数据: vec1_flat前5个元素=�Nu.展平后向量数据: vec2_flat前5个元素=u点积结果: r[u, 是否为数组: u点积数组形状: rZu范数结果: norm1=z, norm2=unorm1数组形状: unorm2数组形状: u4将点积从NumPy数组转换为标量,原始值: r u转换后的点积值: u3将norm1从NumPy数组转换为标量,原始值: u转换后的norm1值: u3将norm2从NumPy数组转换为标量,原始值: u转换后的norm2值: u%向量范数为零,返回相似度0u初始相似度计算结果: r]r^u#将单元素数组转换为标量: r_r`u转换后的相似度值: u)确保相似度为Python原生浮点数: g�?u相似度超出[0,1]范围: u,将进行裁剪u最终相似度结果: u 计算余弦相似度时出错: rra)rrbrcrerdrGrj�reshape�flattenr+�sum�linalg�normrhrirkrlrm�max�minr.r/rprq) rr~r� vec1_flat� vec2_flat�dot�norm1�norm2rt�final_similarityr7rps rrgz!PersonDatabase._cosine_similaritys ��c � �K�K� � � 9�$�*�*��W�T�Z�Z�L�Y� Z� �K�K� � � 9�$�t�*��W�T�RV�Z�L�Y� Z� �K�K� � � E�d�j�j�\�Q^�_c�_i�_i�^j�k� l��z�z�T�Z�Z�'�� � �#�#�&=�d�j�j�\��d�j�j�\�$Z�[��9�9�� � �)��<�<�� � �3�D��K�K�%�%�(=�d�j�j�\�&J�K��K�K�'�'�*V�W[�W`�W`�Va�ae�fj�fo�fo�ep�(q�r��� � ��I�� � ��I� �K�K� � � A�)�/�/�AR�R^�_h�_n�_n�^o�p� q� �K�K� � � N�`i�`n�`n�rs�`s�y�Y[�Z[�}�zC�OD�E� F� �K�K� � � N�`i�`n�`n�rs�`s�y�Y[�Z[�}�zC�OD�E� F��&�&��Y�.�/�C��I�I�N�N�9�-�E��I�I�N�N�9�-�E� �K�K� � ��s�e�:�d�3�i�[�H[�\f�gj�ln�lv�lv�\w�[x�y� z��#�r�z�z�*�� � �!�!�$8���� �CS�TW�T]�T]�S^�"_�`� �K�K� � � 4�U�G�:�d�5�k�]�RZ�[`�Za�ak�lp�qv�lw�kx�y� z��%����,�� � �!�!�$7�� � �}�DT�UZ�U`�U`�Ta�"b�c��%����,�� � �!�!�$7�� � �}�DT�UZ�U`�U`�Ta�"b�c��#�r�z�z�*�� � �!�!�$X�Y\�X]�"^�_��#�(�(�a�-�C�H�H�J�S�X�X�Z�H��� � �!�!�$;�C�5�"A�B��C�j���%����,�� � �!�!�$W�X]�W^�"_�`��e�j�j�A�o�e�j�j�l�5�:�:�<�P��� � �!�!�$:�5�'�"B�C��e� ���%����,�� � �!�!�$W�X]�W^�"_�`��e�j�j�A�o�e�j�j�l�5�:�:�<�P��� � �!�!�$:�5�'�"B�C��e� ����|�u��|�� � �#�#�$K�L����� �.�J� �K�K� � � =�j�\��TX�Yc�Td�Se�f� g��*�b�j�j�1�� � �!�!�$F�z�GW�GW�FX�Xh�is�iy�iy�hz�{B�CM�BN�#O�P��?�?�a�'�!&�z���'8�!9�J��K�K�%�%�(K�J�<�&X�Y��K�K�'�'�*V�Wa�Wf�Wf�Vg�gw�yC�yH�yH�yJ�xK�)L�M�!&�z���'8�!9�J��K�K�%�%�(B�:�,�&O�P�#�:�.� �� � �!�!�$M�j�\�"Z�[��C��:��#3�� � �#�#�&B�:�,�N`�$a�b�$�S��c�#�z�.B�%C�D� � �K�K� � � 7�8H�7I��TX�Yi�Tj�Sk�l� m�#� #��� � �K�K� � � @���D� E� � �K�K� � ��y�/C�/C�/E�.F�G� H���  �s'�E=_�Q-_�.G_� `(�A`#�#`()z data/persons)rN)NN)g�?)�__name__� __module__� __qualname__�__doc__�strrrrCrnrJr+rirTrkrWrryrrr{r}rg�rrr r s��� �c� �C�> C�C�S�C�T�C�. �s� �2�:�:� �3� �SV� �DT�s�T�u�T�QT�T�`d�T�>X����X��X�X`�ad�Xe�X�t +�C� +�H�T�#�s�(�^�,D� +���c�4��S��>�&9�!:��m�r�z�z�m����m��mrr )r�rr(�numpyr+r�typingrrrrrrSr r�rr�<module>r�s-��� � ���3�3� �p�pr

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rolenet/McpAgentRobot'

If you have feedback or need assistance with the MCP directory API, please join our Discord server