Skip to main content
Glama

xigua-MCP

by xiguaxiaome
vision.cpython-310.pyc13.8 kB
o �EhfJ�@s�ddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z mZe�d�Ze�ej�e��Ze�d�Ze�e�e�e�ej�d�ZGdd �d �ZGd d �d �ZGd d �d �Zde fdd�ZdS)�N)�Optional)�FastMCP)�OpenAI�APIConnectionError�APIErrorZ VisionToolz4%(asctime)s - %(name)s - %(levelname)s - %(message)s�DASHSCOPE_API_KEYcsjeZdZdZe��ZdZdZ�fdd�Z dd�Z dd �Z d e e fd d �Zd d�Zdd�Zdd�Z�ZS)� CameraManagerNr�cs�|j�5|jdur/t��|�|_d|j_d|j_d|j_d|j_t� �|j_ Wd�|jSWd�|jS1s;wY|jS)NrF) �_lock� _instance�super�__new__�_capZ _init_time�_is_preview_active�_preview_thread� threading�Event�_preview_stop_event��cls�� __class__��E:\xiaozhi-mcp\tools\vision.pyr s  �� ��zCameraManager.__new__cCsvt��}|jdus|j��s|��n"||j|jkr5|js5|jdus(|j��s5t � d�|� �|��||_|jS)u<获取摄像头实例,如果闲置超时则重新初始化Nu'摄像头闲置超时,重新初始化) �timer�isOpened� _init_camera� _last_used� IDLE_TIMEOUTrr�is_alive�logger�info�release)�self� current_timerrr� get_camera's  zCameraManager.get_cameracCs�t��dkr dtjd<t�d�|_|j��st� d�t d��|j� tj d�|j� tj d�|j� tjd �|j� tjd �t�d �d S) u初始化摄像头�Darwin�YESZ#OBJC_DISABLE_INITIALIZE_FORK_SAFETYru0摄像头访问被拒绝,请检查系统权限zCamera access deniedi�i���u摄像头初始化完成N)�platform�system�os�environ�cv2� VideoCapturerrr �error�PermissionError�set�CAP_PROP_FRAME_WIDTH�CAP_PROP_FRAME_HEIGHT� CAP_PROP_FPS�CAP_PROP_BUFFERSIZEr!�r#rrrr8s     zCameraManager._init_camera�returncCsT|��}td�D]}|��q|��\}}|sdSt�d|tjdtjdg�\}}|S)u9获取当前帧,确保刷新缓冲区获取最新图像�N�.jpg�Kr))r%�range�grab�readr.�imencode�IMWRITE_JPEG_QUALITY�IMWRITE_JPEG_OPTIMIZE)r#�cap�_�ret�frame�bufferrrr� get_frameJs    �zCameraManager.get_framecCs |��}|��\}}|sdS|S)u!获取原始帧(用于预览)N)r%r>)r#rBrDrErrr� get_raw_frame]s  zCameraManager.get_raw_framecCs6|jr|j��r|j��d|_t�d�dSdSdS)u释放摄像头资源Nu摄像头资源已释放)rrr"r r!r7rrrr"es  �zCameraManager.releasecCs |��dS�N)r"r7rrr�__del__ls zCameraManager.__del__)�__name__� __module__� __qualname__r r�Lockr rrr r%rr�bytesrGrHr"rJ� __classcell__rrrrrs  rcsFeZdZdZe��Z�fdd�Zdd�Zde de de fd d �Z �Z S) �VisionAnalyzerNcsd|j�$|jdurt��|�|_|j��Wd�|jSWd�|jS1s*wY|jSrI)r r r r � _init_clientrrrrr ts   �� ��zVisionAnalyzer.__new__cCs<t}|std��t|dd�|_i|_t��|_t� d�dS)Nu未设置DASHSCOPE_API_KEYz1https://dashscope.aliyuncs.com/compatible-mode/v1)�api_key�base_urluAPI客户端初始化完成) r� ValueErrorr�client�cacherrN� cache_lockr r!)r#rSrrrrR{s� zVisionAnalyzer._init_client� image_data� timestampr8c Cs�t|��d|��}|j�||jvr#t�d�|j|Wd�SWd�n1s-wYzvt��}|jjjj ddddd�d d d |��id �gd �gdd�}|j dj j dd�}d|vrid|� d�}d|d�}|j�||j|<t|j�dkr�|j�tt|j���Wd�n1s�wYt�dt��|d�d��|WSttfy�}zt�dt|����dt|�d�WYd}~Sd}~wty�}zt�dt|����ddd�WYd}~Sd}~ww) u带时间验证的图像分析�-u使用缓存结果Nz qwen-vl-plus�user�textu*用可爱的语气简单描述图片内容)�typer]� image_url�urlzdata:image/jpeg;base64,)r^r_)�role�content�)�model�messages�timeoutri�u 这不就是u害,这不就是u这是T��success�result�uAPI调用耗时: �.2f�su API错误: F�rhr0u分析异常: u 分析失败)�hashrXrWr �debugrrVZchatZ completions�create�choices�messagerb�lstrip�len�pop�next�iterr!rrr0�str� Exception) r#rYrZZ cache_key� start_time�responseZ result_textri�errr� analyze_image�sX  ��  ���� � �����zVisionAnalyzer.analyze_image)rKrLrMr rrNr r rRrx�float�dictr}rPrrrrrQps  rQc@sPeZdZdd�Zddedeefdd�Zdd �Zde fd d �Z de fd d �Z dS)� VisionSystemcCst�|_t�|_d|_dS)NzCamera Preview)r�camerarQ�analyzer�preview_window_namer7rrr�__init__�s zVisionSystem.__init__r �countdown_secondsr8c Cs`z�|jjrt�d�|��t�d�|j��}|��s$t� d�WdSd|j_t � |j t j �t �|j t jd�t �d�t��}d} |��\}}|sSt�d�nyt��}||}td|t|��} t j} d } d } d } d }| dkr�t �|d | �d�| | | | |�n t �|d| | | d|�t �|j |�| dkr�|dur�t �d|t jdt jdg�\}}|}t�d�nt �d�d@}|td�ks�|dkr�t�d�nqEt �|j �d|j_|dur�t�|��d�}t�dt��|d�d��|WSt�d�WdSt �y/}z(tj dt!|���dd�t �"|j t j#�dk�r t �|j �d|j_WYd}~dSd}~ww) uT 显示实时预览窗口,进行倒计时,然后捕获图像。 uE检测到活跃的预览窗口,正在关闭以进行图像捕获。g�������?u3摄像头未打开,无法进行预览和捕获。NTr)u无法读取摄像头帧。r)�2r�g�?)rr��r9zCapturing in: rlzSMILE!)rr�rr:r;g�?r��q�u用户取消了图像捕获。Fzutf-8u图像捕获耗时: rku s (含预览)u未捕获到图像。u捕获异常: ��exc_info)$r�rr r!�close_camera_previewr�sleepr%rr0r.� namedWindowr��WINDOW_AUTOSIZE�setWindowProperty�WND_PROP_TOPMOST�waitKeyr>�warning�max�int�FONT_HERSHEY_SIMPLEX�putText�imshowr?r@rA�ord� destroyWindow�base64� b64encode�decoderyrx�getWindowProperty�WND_PROP_VISIBLE)r#r�rBrzZcaptured_frame_bufferrDrEr$Z elapsed_timeZremaining_time�fontZ text_positionZ font_scaleZ font_color� line_typerCrF�keyrYr|rrr�capture_image_with_preview�sz         �  � )  ��z'VisionSystem.capture_image_with_previewcCs|j��}|��st�d�d|j_dSt�|jtj �t� |jtj d�t� d�t� d�|jjr|jj��s|��\}}|sGt�d�n8t�|j|�t� d�d@}|td�ks_|d kret� d �nt�|jtj�dkrut� d �n |jjr|jj��r9t� d �|��dS) uE 在单独线程中运行的摄像头预览循环。 u$预览线程:摄像头未打开。FNr)u-预览线程:摄像头预览循环启动。u<预览线程:无法读取摄像头帧,预览将关闭。r�r�r�u3预览线程:用户通过按键关闭了预览。u'预览线程:窗口被用户关闭。u-预览线程:摄像头预览循环结束。)r�r%rr r0rr.r�r�r�r�r�r�r!r�is_setr>r�r�r�r�r�r�)r#rBrDrEr�rrr� _preview_loops2        �  zVisionSystem._preview_loopc CsNz_|jjr|jjr|jj��rt�d�ddd�WS|j��}|��s.t�d�ddd�WS|jjr;|� �t � d �d|j_|jj � �tj|jdd �|j_|jj��t�d �dd d�WSty�}z;tjd t|���dd�d|j_|jj ��t�|jtj�dkr�t�|j�|j��ddt|���d�WYd}~Sd}~ww)uo 打开摄像头实时预览窗口。此函数会立即返回成功,预览在后台运行。 u*摄像头预览已打开且正在运行。Tu摄像头预览已打开rgu*摄像头未打开,无法打开预览。Fu摄像头未打开rm皙�����?)�target�daemonu3摄像头预览已成功启动(后台线程)。u摄像头预览已成功打开u打开摄像头预览异常: r�r)u打开预览失败: N)r�rrrr r!r%rr0r�rr�r�clearr�Threadr��startryrxr2r.r�r�r�r�r")r#rBr|rrr�open_camera_preview<s6              ��z VisionSystem.open_camera_previewc Csze|jjst�d�ddd�WS|jj��|jjr8|jj��r8t�d�|jjjdd�|jj��r8t� d�t � |j t j �dkrRt �|j �t �d�t�d �d |j_|j��t�d �dd d�WSty�}ztjd t|���dd�d dt|���d�WYd}~Sd}~ww)uE 关闭摄像头实时预览窗口并释放资源。 u摄像头预览未打开。Tu摄像头预览未打开rgu等待预览线程结束...r))rfu!预览线程未能及时停止。r�Fu3摄像头预览窗口已关闭,资源已释放。u摄像头预览已成功关闭u关闭摄像头预览异常: r�u关闭预览失败: rmN)r�rr r!rr2rr�joinr�r.r�r�r�r�r�rr�r"ryr0rx)r#r|rrrr�ds.             ��z!VisionSystem.close_camera_previewN)r ) rKrLrMr�r�rrxr�r�rr�r�rrrrr��s T%(r��mcpcCsJ|��dtdtfdd��}|��dtfdd��}|��dtfdd��}dS) N�commandr8c s�d}t�fdd�|D��sddd�Sz3t�}t��}|jdd�}r@t��}|j�||�}t��|}t�d |d �d ��|WSdd d�WStyh}ztj d t |���dd�ddd�WYd}~Sd}~ww)uN 视觉感知系统 命令示例:看看这是什么/描述当前场景/睁开眼看看 返回格式: { "success": bool, # 是否执行成功 "result": str, # 分析结果文本 "error": str # 错误信息(可选) } )u看u查看u睁开u描述u什么u东西c3s�|]}|�vVqdSrIr)�.0�kw�r�rr� <genexpr>�s�zBregister_vision_tools.<locals>.vision_assistant.<locals>.<genexpr>Fu 无效命令rmr )r�u总处理时间: rkrlu!图像捕获失败或用户取消u系统错误: Tr�u 内部错误N) �anyr�rr�r�r}r r!ryr0rx) r��keywords�vsrzrYrZriZ total_timer|rr�r�vision_assistant�s$   ��z/register_vision_tools.<locals>.vision_assistantcS�t�}|��S)u� 打开摄像头实时预览窗口。此工具会立即返回成功,预览在后台运行。 当用户说“打开摄像头”、“打开预览”等时调用。 返回格式: { "success": bool, # 是否执行成功 "result": str, # 操作结果文本 "error": str # 错误信息(可选) } )r�r��r�rrr�open_camera_preview_tool�� z7register_vision_tools.<locals>.open_camera_preview_toolcSr�)ua 关闭摄像头实时预览窗口。 当用户说“关闭摄像头”、“关闭预览”等时调用。 返回格式: { "success": bool, # 是否执行成功 "result": str, # 操作结果文本 "error": str # 错误信息(可选) } )r�r�r�rrr�close_camera_preview_tool�r�z8register_vision_tools.<locals>.close_camera_preview_tool)�toolrxr)r�r�r�r�rrr�register_vision_tools�s #r�) r,r.r��loggingr*rr�typingr�mcp.server.fastmcprZopenairrr� getLoggerr �setLevel�INFO� StreamHandler�handler� Formatter� formatter� setFormatter� addHandlerr-�getrrrQr�r�rrrr�<module>s,        ZMI

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/xiguaxiaome/xigua-MCP'

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