Skip to main content
Glama

MCP Agent Platform

base_agent.cpython-312.pyc17.5 kB
� �$�g;7���dZddlZddlZddlZddlmZmZmZmZm Z m Z ddl Z ddl m Z ejejd��Gd�d�Zy) u 基础智能体类 �N)�Dict�Any�Callable� Coroutine�Optional�List)� MCPMessagez4%(asctime)s - %(name)s - %(levelname)s - %(message)s)�level�formatc�L�eZdZdZdedededefd�Zdedeeee ffd�Z d �Z d �Z dededefd �Z defd �Zd �Zd�Zdedeee ffd�Zdedeeee fgeffd�Zdeee ffd�Zdeee ffd�Zdeee ffd�Zdeee ffd�Zdefd�Zd�Zdeefd�Zdedefd�Zy)� BaseAgentu基础智能体类�agent_id� agent_type�host�portc��||_||_||_||_t j d|���|_i|_i|_d|_ d|_ i|_ y)NzAgent:F) rrrr�logging� getLogger�logger� connections�message_handlers�server� is_running�agent_addresses)�selfrrrrs �-D:\AIProject\mcpTest\src\agents\base_agent.py�__init__zBaseAgent.__init__s]�� �� �$����� ��� ��'�'�&�� �(;�<�� ���� "����� ����!����returnc���||jvr||j|d�S||jvr|j|Sddd�ddd�ddd�ddd�d�}||vr|||j|<||Sy ) u获取智能体的地址信息)r� connection� localhostiJ)rriKiLiM)�brain�eye�ear�mouthN)rr)rr�default_addressess r�get_agent_addresszBaseAgent.get_agent_addresss��� �t�'�'� '� (��8H�8H��8R�S� S� �t�+�+� +��'�'��1� 1�*�4�8�'��6�'��6�)�4�8�  �� �(� (�->�x�-H�D� � �� *�$�X�.� .�rc���K�d|_tj|j|j|j ��d{���|_|jjd|j�d|j�d|j ���|jd|j�|jd|j�|jd|j�y7���w) u启动智能体服务器TN�Agent z started on �:�text�command�status)r� websockets�serve�_handle_connectionrrrr�infor�register_handler�_handle_text_message�_handle_command_message�_handle_status_message�rs r�startzBaseAgent.start7s��������&�,�,� � #� #�T�Y�Y�� � � � �� � � � ���6�$�-�-�� �T�Y�Y�K�q���� �T�U� ���f�d�&?�&?�@� ���i��)E�)E�F� ���h��(C�(C�D� �s�AC%�C#�B!C%c��K�|jr<|jj�|jj��d{���d|_|jj d|j �d��y7�5�w)u停止智能体服务器NFr*z stopped)r�close� wait_closedrrr2rr7s r�stopzBaseAgent.stopDs^���� �;�;� �K�K� � � ��+�+�)�)�+� +� +���� � � ���6�$�-�-���9�:� ,�s�AA>�A<�6A>c ��K�d}d}t|�D]�} d|�d|��}tj|dd���d{���}||j|<|jj d |�d |���d |j |d d |jid�d�} |jtj| ���d{���tj|j||��yy7��7�/#t$r[} |jjd|dz�d|�d|�d| ���||dz krtj |��d{���7Yd} ~ ��4d} ~ wwxYw�w)u连接到其他智能体��zws://r+�� )� ping_interval� ping_timeoutNzConnected to agent z at r.� connectedr�r.�details�� message_type� sender_id� receiver_id�contentTzAttempt ��/z failed to connect to agent �: F)�ranger/�connectrrr2rr�send�json�dumps�asyncio� create_task�_receive_messages� Exception�error�sleep) rrrr� max_retries� retry_delay�attempt�urir!� status_msg�es r�connect_to_agentzBaseAgent.connect_to_agentLsj����� �� ��[�)� 5�G� 5��d�V�1�T�F�+��#-�#5�#5��"$�!#�$�� � .8�� � ��*�� � � � �#6�x�j��S�E�!J�K�%-�!%���#+�"-�(�$�/�/�$� � � �!�o�o�d�j�j��&<�=�=�=��#�#�D�$:�$:�8�Z�$P�Q��7 5�B�=��(>�� � 5�� � �!�!�H�W�q�[�M��;�-�Gc�dl�cm�mo�pq�or�"s�t��[�1�_�,�!�-�-� �4�4�4��� 5�s^�E�#C'�C#�A;C'�5C%�6)C'�E�#C'�%C'�' E �0A E�:D=�;E�E�E � Ec��pK� |j��d{���}|j|��d{����37�7�#tjj$r�|j j d|�d��||jvr |j|=|j||j|j��d{���7r|j j d|���Yyt$rI}|j jd|�d|���tjd��d{���7Yd}~��d}~wwxYw�w)u!接收来自特定连接的消息NzConnection to agent z closedzReconnected to agent zError receiving messages from rNrL)�recv�_process_messager/� exceptions�ConnectionClosedrr2rr`rrrWrXrTrY)rrr!�messager_s rrVzBaseAgent._receive_messagests����� '� *��� 1�1���+�+�G�4�4�4��1��4���(�(�9�9� �� � � � �#7��z��!I�J��t�/�/�/��(�(��2��.�.�x����D�I�I�N�N�N��K�K�$�$�'<�X�J�%G�H��� '�� � �!�!�$B�8�*�B�q�c�"R�S��m�m�A�&�&�&�� '�sh�D6�;�7�;�9�;�D6�;�;�BD3�<B?�=#D3� D6�"D3�*9D.�#D&�$D.�)D6�.D3�3D6c��8K� |j��d{���}tj|�}|jd�dk(r�|jdi�jd�dk(r�|jd�}||j|<|j j d|�d��d|j|d d |jid �d �}|jtj|���d{��� |j��d{���}|j|��d{����2|j jd |���|j��d{���y7��G7�q7�Z7�C7�#tjj $rbt#|jj%��D]9\}}||k(s� |j|=|j j d|�d��YyYyt&$r(} |j j)d| ���Yd} ~ yd} ~ wwxYw�w)u处理新的WebSocket连接NrHr.rKrDrIr*z connected�acceptedrrErGz%Received invalid connection message: � disconnectedzError handling connection: )rbrR�loads�getrrr2rrrQrSrc�warningr:r/rdre�list�itemsrWrX) r� websocket�pathrf�datarI�responser�connr_s rr1zBaseAgent._handle_connection�s�����' A�%�N�N�,�,�G��:�:�g�&�D��x�x��'�8�3�����B�8O�8S�8S�T\�8]�al�8l� �H�H�[�1� �.7�� � ��+�� � � � �6�)��J�!?�@�%-�!%���#,�",�(�$�/�/�$� � �� �n�n�T�Z�Z��%9�:�:�:��$-�N�N�$4�4�G��/�/��8�8�8��� � �#�#�&K�D�6�$R�S��o�o�'�'�'�9-��(;��5��8��(���$�$�5�5� �"&�t�'7�'7�'=�'=�'?�"@� ���$��9�$��(�(��2��K�K�$�$�v�h�Z�}�%E�F��  � � A� �K�K� � � ;�A�3�?� @� @�� A�s��H�E)�E�CE)�/E!�0E)�E#� E)�!E%�"6E)�E'�E)�H�E)�!E)�#E)�%E)�'E)�)A H�5-H�"H�$H�%H�'H�/H� H�H�Hc��K� t|t�rtj|�}n|}|j d�}||j vr|j ||��d{���y|j jd|���y7�$#t$r(}|j jd|���Yd}~yd}~wwxYw�w)u处理接收到的消息rHNzNo handler for message type: zError processing message: ) � isinstance�strrRrjrkrrrlrWrX)r� message_datarqrHr_s rrczBaseAgent._process_message�s����� @��,��,��z�z�,�/��#���8�8�N�3�L��t�4�4�4�9�d�+�+�L�9�$�?�?�?�� � �#�#�&C�L�>�$R�S�@��� @� �K�K� � � :�1�#�>� ?� ?�� @�sM�B>�AB �#B�$B �(B>�)B �B>�B � B;�B6�1B>�6B;�;B>rJrfc ���K� |j|�}|s|jjd|���yt|t�r|j �}nDt|t �r2d|vr|j|d<d|vr||d<tj|�}n|}||jvr( |j|j|��d{���yd |vr�d |vr�|jjd |�d |d �d |d �d��|j||d |d ��d{���r|j||��d{���S|jjd|���y|jj!d|�d��y7��#t$r+}|jjd|�d|���Yd}~yd}~wwxYw7��7�~#t$r(}|jjd|���Yd}~yd}~wwxYw�w)u发送消息到指定智能体u未找到智能体: FrIrJNTzError sending message to rNrru尝试连接到智能体 z (r+�)u无法连接到智能体 zNo connection to agent z and no address informationu发送消息失败: )r(rrXrur �to_json�dictrrRrSrrQrWr2r`� send_messagerl)rrJrf�receiverrwr_s rr|zBaseAgent.send_message�s����, ��-�-�k�:�H��� � �!�!�$8�� �"F�G���'�:�.�&���0� ��G�T�*��g�-�+/�=�=�G�K�(� ��/�-8�G�M�*�#�z�z�'�2� �&� ��d�.�.�.�!��*�*�;�7�<�<�\�J�J�J�� �X�%�&�H�*<��K�K�$�$�'@�� �R�PX�Y_�P`�Oa�ab�ck�lr�cs�bt�tu�%v�w�!�2�2�;���@P�RZ�[a�Rb�c�c�c�%)�%6�%6�{�G�%L�L�L�� � �)�)�,E�k�]�*S�T�$��K�K�'�'�*A�+��Ni�(j�k� �%K��!�!��K�K�%�%�(A�+��b�QR�PS�&T�U� ��!��d��L��� � �K�K� � � 4�Q�C�8� 9��� �s��G/�1F;�G/�A3F;�*!F� E>� F�G/�AF;� F7�!F;�:F9�;F;�>G/�?F;�G/�F;�=G/�>F� F4� !F/�*F;�.G/�/F4�4F;�9F;�; G,�G'�"G/�'G,�,G/rH�handlerc�^�||j|<|jjd|���y)u注册消息处理器z%Registered handler for message type: N)rrr2)rrHr~s rr3zBaseAgent.register_handler�s,��.5����l�+� � � ���@���O�Prc ��zK�|jjd|d�d|djdd����y�w)u!处理文本消息的默认方法zReceived text message from rIrNrKr,�N)rr2rk)rrfs rr4zBaseAgent._handle_text_message�sB���� � � ���6�w�{�7K�6L�B�w�W`�Oa�Oe�Oe�fl�np�Oq�Nr�s�t�s�9;c��~K�|djdd�}|jjd|d�d|���y�w)u!处理命令消息的默认方法rKr-r�zReceived command from rIrNN)rkrr2)rrfr-s rr5z!BaseAgent._handle_command_message�sC�����)�$�(�(��B�7�� � � ���1�'�+�2F�1G�r�'��S�T�s�;=c ���K�|djdd�}|jjd|d�d|���|dk(rG|jjd|d�d |djd i�jd ����y|d k(r"|jjd |d���y|dk(rD|d|jvr|j|d=|jjd|d�d��yy�w)u!处理状态消息的默认方法rKr.r�zReceived status update from rIrNrDr*z connected with type: rFrrhzConnection accepted by � disconnectedriN)rkrr2r)rrfr.s rr6z BaseAgent._handle_status_messages������#�'�'��"�5�� � � ���7�� �8L�7M�R�PV�x�X�Y� �[� � �K�K� � �v�g�k�&:�%;�;Q�%�i�0�4�4�Y��C�G�G� �U�V�X� Y� �z� !� �K�K� � �6�w�{�7K�6L�M� N� �~� %��{�#�t�'7�'7�7��$�$�W�[�%9�:� �K�K� � �v�g�k�&:�%;�=�I� J�&�s�C7C9c��K�g}|jD]/}|j||��d{���}|j||f��1|S7��w)u'广播消息到所有连接的智能体N)rr|�append)rrf�resultsr�results r�broadcast_messagezBaseAgent.broadcast_messagesS�������(�(� /�H��,�,�X�w�?�?�F� �N�N�H�f�-� .� /���@�s�'A�A�Ac��K�||jvr� d|j|dddid�d�}|j||��d{���|j|j��d{���|j|=|jj d|���y y 7�V7�3#t $r+}|jjd |�d |���Yd}~y d}~wwxYw�w) u!断开与指定智能体的连接r.r��reason�client_disconnectrErGNzDisconnected from agent TzError disconnecting from agent rNF)rrr|r:rr2rWrX)rrr^r_s r�disconnect_from_agentzBaseAgent.disconnect_from_agents����� �t�'�'� '� �%-�!%���#+�"0�$�&9�$� � � ��'�'��*�=�=�=��&�&�x�0�6�6�8�8�8��$�$�X�.�� � � � �#;�H�:�!F�G���>��9��� �� � �!�!�$C�H�:�R�PQ�s�"S�T��� �sP�C�+B�B�$B�"B�#/B�C�B�B� C �!!C�C�C � Cc���K�t|jj��}g}|D].}|j|��d{���}|j ||f��0|S7��w)u!断开与所有智能体的连接N)rmr�keysr�r�)r� agent_idsr�rr�s r�disconnect_allzBaseAgent.disconnect_all5sd������)�)�.�.�0�1� ���!� /�H��5�5�h�?�?�F� �N�N�H�f�-� .� /���@�s�?A�A�Ac�H�t|jj��S)u)获取所有已连接的智能体ID列表)rmrr�r7s r�get_connected_agentszBaseAgent.get_connected_agents>s���D�$�$�)�)�+�,�,rc��||jvS)u*检查是否与指定智能体保持连接)r)rrs r�is_connected_tozBaseAgent.is_connected_toBs���4�+�+�+�+rN)�__name__� __module__� __qualname__�__doc__rv�intrrrrr(r8r<r`rVr1rcr|rrr3r4r5r6r�r�r�rr��boolr��rrr r sW��� "�� "�#� "�S� "�� "��#��(�4��S��>�2J��0 E�;�&�s�&�#�&�S�&�P'��'�$)A�V@�".�c�.�D��c��N�.�`Q�S�Q�8�T�#�s�(�^�DT�V_�D_�;`�Q� u�$�s�C�x�.�u�U�T�#�s�(�^�U� K�D��c��N�K� �t�C��H�~���C��8�-�d�3�i�-�,��,��,rr )r�rTrRr�typingrrrrrrr/�src.utils.mcp_protocolr � basicConfig�INFOr r�rr�<module>r�sG���� ��A�A��-�����'�,�,�Q�S�u,�u,r

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