2025年12月

Windows 10电脑上出现了用鼠标选择任意文本就会自动复制的问题。这个很头痛,因为我很习惯选择后进行一些其他操作,而不是复制。尤其是选择后直接粘贴,预期的结果是用剪切板的内容覆盖掉选择的内容,然而这个神秘的自动复制,让这个操作就失效了。并且是在任意窗口都会这样。
先是让AI写了一个自动的Python脚本去检测按键输入。很顺利的检测到了,在鼠标选择文本之后,会有一个虚拟按键输入,左Ctrl加Insert。
接下来就要去找到底是哪个程序输入的,这个过程千难万阻,最终也没有成功。依次尝试了Process Monitor、Spy++、API Monitor、Inside clipboard等等这些方法。但是由于Windows它不会记录虚拟按键发送者的名称,所以找起来真是大海捞针。Spy++ 和API Monitor可能更接近于成功,但是这两者都只能监控一个控件或者一个窗口,无法做全系统的监控,这也可以理解,因为全系统的这种消息实在是太多了。
最后想到一个办法,是不是可以拦截左Ctrl加Insert键,让它不再复制?发现微软官方的PowerToys就可以做到。在它的键盘管理器里面可以去重新映射快捷键。将左Ctrl加Insert键映射为Disable就解决了。
郁闷的是,一直不知道这个在背后捣鬼的程序是谁。AI都猜测是某个类似于画词翻译的程序。

使用的qiniu服务器,也就是小智ESP32 Server开源服务器。对于意图识别,似乎必须是从用户端的话语中判断的,无法从系统提示词中进行意图识别。也无法进行条件判断式的意图识别。举例如下。
如果在系统提示词中写入满足一定的条件,便进行MCP调用的时候,那MCP永远不会调用;但是如果系统提示词中写入满足一定的条件,大模型进行特定的回复的时候,却是可以进行的。
在用户下达的指令中,提出满足一定的条件去调用MCP工具的时候,大模型听到这句话不等这个条件达成,便立即进行了调用。
因此我估计,这是属于MCP Client端也就是服务器端实现的问题,而不完全是大模型本身的问题。可能需要看一下服务器端对MCP Client实现的源码。

小程序开发时 wx.showActionSheet 这个函数, 在点击对应选项后,有时候ActionSheet不会自动隐藏,是什么原因,如何改进为必然自动隐藏?
在小程序开发中,wx.showActionSheet 通常在点击选项后由系统自动收起。如果出现不自动隐藏的情况,通常是由于逻辑阻塞或系统/版本差异导致的。

  1. 常见原因分析
    回调函数内存在阻塞逻辑:在 success 回调中执行了耗时过长的同步操作(如复杂的循环计算),导致 UI 线程响应滞后。
    并发冲突:在 success 回调中立即触发了另一个模态框(如 wx.showModal 或 wx.showLoading),部分 Android 版本下,新的 UI 层可能会干扰 ActionSheet 的正常销毁流程。
    Android 版本特异性:在旧版 Android(6.7.2 以下)中,点击背景蒙层或取消按钮的行为与 iOS 不同,若逻辑依赖于 fail 回调执行清理,可能会出现异常。
    itemList 溢出或限制:如果 itemList 长度超过 6 个,或者在点击后立即执行了页面跳转/重载,可能导致组件状态未能正确更新.

我的小程序中是因为立即调用了showModal导致的, modal显示后actionSheet没有消失反而叠加在其上. 并且只有第一次会出现, 第二次就不再出现了(我猜测可能showActionSheet所有已经加载到了内存中).
需要使用延时的方法来解决(100ms足够), 如果是用await调用wx.showActionSheet, 也需要在调用后进行延时再处理其他逻辑.

wx.showActionSheet({
  itemList: ['选项A', '选项B'],
  success(res) {
    // 先让 ActionSheet 消失,再处理逻辑
    setTimeout(() => {
      // 这里放置业务代码,如打开 Loading 或 跳转
      console.log('点击了第', res.tapIndex, '项');
    }, 100); 
  }
});

首先要把mcp库升级到最新的版本, 旧版本是不支持的.

pip install --upgrade mcp

关键代码:


from mcp.server.fastmcp import FastMCP, Context

@mcp.tool()
def change_agent(apidataId: str, roleName: str, ctx: Context) -> object:
    pprint(ctx.request_context.request.headers)

这会打印一个headers对象, 例如:


({'host': 'mcpserver.url.cn:port', 'accept': '*/*', 'accept-encoding': 'gzip, deflate', 'connection': 'keep-alive', 'user-agent': 'python-httpx/0.27.2', 'x-linx-device-id': 'xx:xx:xx:xx:xx:xx', 'x-linx-agent-id': 'xxxxxxxxxxxxxxxxxx', 'content-length': '176', 'content-type': 'application/json'})

在小程序中是不能借助客户端能力实现MCP inspector的, 因为要和服务器建立websocket连接, 而小程序建立socket连接或者http请求都要在后台添加url, 并且必须是ssl的形式(https/wss), 这样就无法对任意MCP服务进行inspect. 如果要对任意MCP服务进行inspect, 只能通过云服务的方式, 并且不能是小程序云函数, 因为小程序云函数不支持sse和WebSocket.
如果已经在云端建立了MCP inspector服务, 那么似乎是否一定是小程序载体就没有必要了, web似乎是更好的载体.

python方案 https://github.com/pupil-labs/pupil
浏览器js方案 https://github.com/brownhci/WebGazer 测试了下,需要校准,并且在比较低分辨率的摄像头上似乎效果很不准确.

AI大模型方案 moondream gaze detection https://moondream.ai/ 2B参数做到相对精准的检测. 今年年初发布的开源模型. 油管上有个视频介绍.但速度太慢了, 22秒的视频在RTX A6000上处理的12分钟.
另一个方案gaze-lle https://github.com/fkryan/gazelle 似乎没有找到视频介绍, 也不知道速度如何. https://huggingface.co/spaces/fffiloni/Gaze-LLE 我在huggingface上运行一张图片的时间要30多秒.

研究这个有个感悟, 就是旧方案解决的不是很好的领域, 使用AI可以得到更好的解决, 然而AI需要大量训练且速度更慢能耗与资源消耗高几个数量级. 已眼动跟踪来说, 旧方案如webgazer使用浏览器js即可运行, 而AI方案要A6000才能运行且效率极低.

对比来说, Tobii的方案能实现虚拟键盘打字确实就很厉害了, 虚拟键盘每行有十几个按键都能准确触发确实很了不起.而七鑫易维也能实现每行十多个按键的识别输入也很厉害. 按豆包的反馈, 高精度方案使用瞳孔角膜反射法, 并使用近红外光辅助摄像头捕捉普洱钦点. 还有高成本方案虹膜追踪, 低成本方案使用巩膜追踪法. 但是, 豆包这个成本说法不可信, 因为红外光和摄像头的成本是不高的, 如果算法在普通计算机上能运行, 那么运行成本也是不高的.

在尝试webgazer后发现其精度太差, 而核心其实是应该更近的拍摄眼睛, 因此想到VR/AR方案中也有眼动跟踪的需求, 于是又搜索到了这个方案:
EyeTrackVR https://github.com/EyeTrackVR/EyeTrackVR , 这个方案还有一个完善的文档网站 https://docs.eyetrackvr.dev/
接着在油管搜索 EyeTrack, 又发现两个项目, 这两个项目不用嵌入VR眼镜, 是独立的眼部跟踪:
基于py的: https://github.com/JEOresearch/EyeTracker
基于C++的: https://github.com/YutaItoh/3D-Eye-Tracker

到这儿就颇有些感悟, 眼动跟踪这个看起来有些高端昂贵的产品(比如tobii要一两万, 其他的价格也不低), 从第一性原理出发(SD分辨率摄像头+红外光), 硬件成本似乎并不高, 剩下的其实只是软件算法而已. 另一个感悟是, 摄像头能产生的价值似乎远比想象的还要高得多.

一般国内物联网平台多选用腾讯云 IOT Explorer/阿里云/涂鸦等, 好处是稳定操心少, 问题是有起订数量(1~10k), 沟通成本和初期投入成本略高.
Home Assistant, 主打本地局域网部署
Fastbee, 国内产品, 个人使用免费但是商用要收费
dgiot, 国内产品, Apache2.0证书,可商用, 5.1k star
thingsboard https://github.com/thingsboard/thingsboard, 国外产品, apache2.0证书, 20.6k star

ghost邮箱配置需要注意,.env中的 mail__auth__usermail__from最好是一模一样,因为部分邮箱供应商(如腾讯企业邮)要求这两个一模一样,否则不给发邮件。而ghost发不出去邮件的提示语焉不详,没有清楚表明这一点。
另一点是,如果要让.env修改过生效,需要删除docker容器再重新做新的容器:

docker compose down -v
docker compose up -d

  1. 有个AI可以语音聊天似乎是很牛的事情,然而大家新鲜过后就很少再继续了。因为聊天是个很累的事情,要不断的搜肠刮肚想如何回复和新的话题。如果从聊天中没有足够的知识收益或者情绪收益,人们就懒得聊下去了。相反,通过音乐、评书、新闻、播客等,用户不需要说话就能持续稳定获得收益,用户就更不愿说话了。所以AI对话需要用户的“主动探索”而不是“被动接受”,花费的精力更多。
  2. 儿童和幼儿似乎有不同,他们的表达欲要高于成人,更愿意去探索和交流,所以会出现某个小孩因为小智音箱坏掉痛哭不已的视频。但现在AI语音似乎又不能很好适配这类用户的需求,因为儿童组织语言能力差,一句话说得比较慢,中间停顿思考的时间长,而Ai语音由于网络和处理延时本身较大,为了更快响应用户,往往用户稍有停顿就开始处理回答了,这样经常听不完整用户的语句。这个可能纯靠语音判断用户是否已经说完就比较难,我跟小朋友打电话的时候也经常搞不清楚他到底有没有说完还只是在思考,但当面看到他们的表情和动作就知道了。
    所以AI需要解决如何提供更多的收益给用户,如何准确识别用户已经讲完话。
    另外AI语音要表现得更像一个完整产品的话,也需要有自己完整的语音控制人机界面。能把所有手机操作变为语音界面。