Every piece of all creatures in this freezing world, are racing for freedom.
通过MCP实现长调用结果的多次流式返回
要求： 大模型请求1分钟内每10秒钟的温度，MCP server每10秒返回一次温度给大模型。 通过Server Notification的方式返回，MCP Server示例代码如下(这个任务千问3.6没有完成，让google ai完成的)： import asyncio import random from fastmcp import FastMCP, Context 初始化 FastMCP 服務，並為其命名 mcp = FastMCP("TemperatureStreamer") @mcp.tool() async def monitor_temperature(duration_seconds: int = 60, interval_seconds: int = 10, ctx: Context = None) -> str: """ 在指定的時間內，每隔固定秒數監測並返回一次環境溫度。 Args: duration_seconds: 總監測時長（秒），預設 60 秒 interval_seconds: 數據採集間隔（秒），預設 10 秒 """ # 計算總共需要採集幾次數據 total_steps = duration_seconds // interval_seconds temperatures_log = [] print(f"開始溫度監控任務：預計執行 {duration_seconds} 秒，每 {interval_seconds} 秒採集一次...") for step in range(1, total_steps + 1): # 模擬讀取硬體傳感器溫度 current_temp = round(random.uniform(22.0, 28.0), 2) temperatures_log.append(current_temp) # 構造本次採集的進度訊息 status_msg = f"第 {step * interval_seconds} 秒 - 當前實時溫度: {current_temp}°C" print(f"[Server Log] {status_msg}") # 【核心】如果客戶端支持並傳入了 Context，則通過 SSE 通道即時推送進度通知 if ctx: # report_progress 參數: (當前進度值, 總進度值, 附帶的文本訊息) await ctx.report_progress( progress=step, total=total_steps, message=status_msg ) # 異步等待下一次採集 if step < total_steps: await asyncio.sleep(interval_seconds) # 任務結束，返回最終的標準 Response avg_temp = round(sum(temperatures_log) / len(temperatures_log), 2) return f"【監控任務完成】共採集 {total_steps} 次數據。歷史溫度: {temperatures_log}。平均溫度: {avg_temp}°C" if name == "main": 以 sse 傳輸模式啟動服務，默認會掛載在 http://127.0.0 # 備註：新版 FastMCP 也支持 "http" (Streamable HTTP)，兩者在網路層皆可實現流式推送 mcp.run(transport="sse", host="127.0.0.1", port=8000) 在Inpector中，仍然是采用常规的tools调用方式，不同的是，每过10秒在右下角会出现`notifications/progress`的返回结果，例如： ```json { "method": "notifications/progress", "params": { "progress": 1, "total": 6, "message": "第 10 秒 - 當前實時溫度: 23.22°C" } } 在此期间，工具一直是Running状态，在60秒结束后，才会返回正常的结果。
这两天学习了一下YOLO，也就是You Only Look Once。学习这个模型的原因是GitHub上有一个激光打蚊子的项目，有不少的Star数目，就是用的这个模型。这个项目已经好多年没有更新了，使用的还是 YOLO v4 模型。 这个模型是快速的视频实时目标识别的模型，发展至今已经历了很多代。YOLOv4模型使用的是CNN框架，也就是卷积神经网络，基于一个叫做Darknet的神经网络实现。这个版本的模型还有比较多问题，第一，它是有锚框的，也就是Anchor-based，主要是增加了很多运算量，然后无法实时处理特别长或者扁的物体，另外就是只能进行目标识别，不能做其他的工作。第二是建立了NMS非极大值抑制的后处理方式，不要在一个物体上圈好多个框。 在后面的版本 V8 11，26这些版本中都增加了更多的功能，并且从C++转向了PyTorch，维护者也变成了ultralytics。首先就是取消了锚框，变成了无锚框的方式，其次除了目标识别，还增加了图片分类/实例分割（就是把目标抠图出来而不是只画个框）。其次还有多目标检测/姿态检测等。 YOLO26这是一个轻量化的版本，还取消了NMS，进一步降低运算量，使其可以在嵌入式设备上或者说是运算能力比较差的设备上运行。 YOLO模型有不同的规模，从小到大有nano/small/medium/large/extra large。 其中nano只有几兆大，extra large也不到300M，经过FP16或者INT8量化还能进一步降低体积和运算量。 YOLO模型的原始格式是.pt（pytorch），可以导出为不同的格式，最重要的是onnx，这个格式支持openCV中的dnn（深度神经网络）来调取，也支持在浏览器中/ios/android/react native/flutter中调取。最重要的一个项目是微软的https://github.com/microsoft/onnxruntime 跨平台项目，对多端调用提供了可能。 还支持tflite格式，是谷歌tensorflow的一种格式，官方维护了 https://github.com/tensorflow/tfjs 这个js库，支持node和浏览器等环境调用。在安卓手机上由特别的性能优化。 其他巨头也有自己的格式，如英伟达GPU上有TensorRT (.engine 或 .trt）格式，苹果手机上有CoreML (.mlpackage 或 .mlmodel) 格式，Intel有OpenVINO (_openvino_model/)，国产的瑞芯微也有rknn格式。 介绍下原始训练的模型格式，最重要的是pytorch保存的pt模型，以及pytorch延伸框架（如 PyTorch Lightning）的ckpt（checkpoint)模型。 这两种模型除了权重数据还打包了python代码，所以被认为是不安全的，后来huggingface等社区就推出了只有权重数据的safesensor模型，并且做了内存映射，加载更快。
测试了driodCam和iriun webcam, 两者都有水印，其中iriun webcam没有画面，driodcam会更好用些。需要注意的是，PC和手机要在同一个路由器下。 免费无水印的方案里面， OBS studio就有虚拟相机功能，结合scrcpy就可以。 另外还有vdo.ninja 通过网页读取摄像头，传输给obs。然而清晰度不是很好，并且摄像头参数要反复调整，比较麻烦。 另外，github上有一个开源项目 VCamDriod ,然而它需要在android app中扫PC APP上的QR码来配置，然而就是死活扫不出来。不推荐。 推荐方案： droidCam 连接方便，但是免费版有水印。 scrcpy + OBS studio, 功能强大但是连接麻烦。