参考资料:
cnblogs上一篇讲解:https://www.cnblogs.com/iini/p/18009504
st matter测试和演示: https://wiki.st.com/stm32mcu/wiki/Connectivity:Matter_test_and_demonstrate
esp-matter 文档: https://github.com/espressif/esp-matter
csa matter协议: https://csa-iot.org/all-solutions/matter/
官方matter sdk开源: https://github.com/project-chip/connectedhomeip/blob/master/docs/guides/BUILDING.md#prerequisites
开发工具:
esp matter开发需要在linux或者MacOS上安装esp-idf和esp-matter
官方 chip-tool 运行于支持BLE的linux和MacOS上
android上由NXP开发的NXP Matter Tool可以替代chip-tool

配网

Matter的配网又叫commission任命(和provision又不同),过程叫commissioning, 给配网信息的叫任命者commissioner,一般就是controller手机,被任命的叫commissionee,一般就是设备。
matter的设备(不包括设备本身)内有三级结构,分别时node节点->endpoint终端->cluster功能簇,cluster分为server和client,其中server提供attributes, Commands和Events, client可以发起交互命令interactions, 包括 read, write, invoke, subscribe(读/写/调用/订阅)

为了完成配网,commissionee必须提供如下onboarding信息:
16-bit Vendor ID and 16-bit Product ID
12-bit device discriminator
27-bit setup passcode
8-bit Discovery Capabilities Bitmask

通过以上信息可以生成一下两种方式来配网(可以用NXP matter tool来生成):
手动配对码(Manual Pairing Code)
二维码(QR Code)

如果上述配网流程成功,那么设备将得到如下信息:

由fabric ID(64bit)和node ID(64bit)组成的实例名
Node Operational Certificate(NOC)
NOC对应的私钥
Access Control List
操作网络的其他信息
不同的node组成一个group,并用16bit的group id来标识

尝试

我用Esp-matter中example的light项目编译到C3上测试。串口是可以直接回车命令行交互的。输入matter help可以查看。
重要命令:

matter ble adv start
matter config
matter onboardingcodes ble
matter device factoryreset

设备不会一直在ble广播commissioning状态,过段时间会退出。

我是用NXP matter tool完成配网后,生成了一个QR码,然后再google home中扫描,然而google home提示必须有支持matter的hub才能控制,包括音箱(google home/mini, next mini, nest audio), 显示屏(nest hub 1代/2代/max), WLAN(nest wifi pro), 流媒体播放器(google tv streamer)。

使用matter device factoryreset后,我用ESP rainmaker home也配网成功,并且“雨作”配网可以自动发送ssid和密码过去(不知道是怎么获取的)。但是NXP就控制不了了。

根据AI的回复,matter优先使用ble配网,局域网控制,部分高级功能才会用到互联网。
并且从google home情况来看,matter可以适配各自的IOT生态,比如google home就要求购买支持matter的hub,而乐鑫和NXP可以直接加入控制。

DPP

WIFI Easy connect(也叫Device Provisioning Protocol)简称DPP,在idf的examples中有个dpp-enrollee目录就是示例。
乐鑫基本全系支持的。我在C3上试运行是可以的。会从串口打印出一个二维码。接下来就遇到问题了,据AI和乐鑫说,Android 10 以上都默认支持,可是我的手机是Android15(IQOO), 却找不到所说的扫码入口
官方文档
https://github.com/espressif/esp-idf/tree/fb14a3e7/examples/wifi/wifi_easy_connect/dpp-enrollee

To run the example with an Android 10+ device follow below steps -
Compile and flash the example on ESP device, a QR code will appear on your console.
Connect your phone to the network, say named "Example-AP".
Now go to Settings->WiFi & Internet->Wi-Fi->Example-AP->Advanced->Add Device.
Scan QR Code using the scanner, which will make ESP device connect to Example-AP.

然后就此事问了谷歌ai。谷歌说,确实DPP的推广不利,在iOS上根本不被支持。而且苹果不支持WiFi联盟的配网协议,包括上一代配网协议WPS是老传统了。
所以这个网最后也没配起来。
从手机端向设备端传出WiFi信号,走的是专用的一个配网的信道,设备端监听,由手机端发送过去。似乎在二维码中会填写频段和信道,以供手机端发送。

乐鑫的统一配网Provisioning

同样,我在C3上运行起来了,也是通过串口打印了二维码。
通过乐鑫官方的APP ESP BLE Prov也成功配网了。另一个APP ESP Soft AP Prov应该是给没有蓝牙的设备用的。
真的,这个操作略显蛋疼,就是本来通过BluFi已经可以扫描到周围的设备了。统一配网却还需要额外的信道,也就是打印出来二维码,通过摄像头去扫描来传输信息。这整个过程对于生产来说也是很麻烦的。
唯一的好处就是之前我做培训的时候遇到的配网的问题,多个学员同时去做配网的话。配网的话,会扫出来太多的设备,不知道哪个是自己的。不过这种的话也同样可以解决,如果统一配网和DPP可以打印二维码,那我也可以打印,甚至我只需要打印出来MAC地址的尾号就可以。
乐鑫统一配网的示例还不在idf默认的examples里面,而是在 idf-extra-components中, 位置:
https://github.com/espressif/idf-extra-components/tree/master/network_provisioning

所以还是不如BluFi好用。

matter

据某个AI说,matter也支持配网,所以想安装matter环境编译试一下。
然而esp-matter仅支持linux和macos, 我在WSL(Ubuntu 24.04)上安装测试,还要先装idf再装matter,安装matter到编译这一步的时候,就会导致wsl崩溃退出。

Done. Made 13083 targets from 819 files in 14765ms
ninja: Entering directory /home/a/esp/esp-matter/connectedhomeip/connectedhomeip/out/host' [0/49] c++ obj/examples/common/tracing/commandline.TracingCommandLineArgument.cpp.oTerminated a@J:~/esp/esp-matter$ ninja: build stopped: interrupted by user. 发现是ninja使用了所有CPU内核和内存导致系统卡死被系统杀进程了。每个ninja编译线程占用1个CPU和约1.5~2G内存。如果内存不足,需要限制CPU的核心数。否则几个ninja线程之间抢内存和swap虚拟内存,最后一个都没编译。 在用户目录下修改.wslconfig`, 增加:

[wsl2]
processors=2
memory=6GB   

就可以编译过了。
通过后又遇到ubuntu24不允许pip安装系统包的问题:


Installing python dependencies for Matter

Installing requirements from requirements.txt

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.

If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.

If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.

See /usr/share/doc/python3.12/README.venv for more information.
google ai建议:
設定全域允許 pip 安裝(推薦)在終端機執行以下指令,為你的 Linux 用戶建立 pip 設定檔,允許覆蓋系統套件限制:
```bash
mkdir -p ~/.config/pip
echo -e "[global]\nbreak-system-packages = true" > ~/.config/pip/pip.conf

git repo: https://github.com/espressif/esp-matter
doc: https://docs.espressif.com/projects/esp-matter/en/latest/esp32/developing.html#host-setup

文档中确实示例了如何配网,并且演示了三种配网方式:

Use chip-tool in interactive mode to commission the device:

chip-tool interactive start
pairing ble-wifi 0x7283 <ssid> <passphrase> 20202021 3840

In the above commands:
0x7283 is the randomly chosen node_id
20202021 is the setup_passcode
3840 is the discriminator

Above method commissions the device using setup passcode and discriminator. Device can also be commissioned using manual pairing code or QR code.
To Commission the device using manual pairing code 34970112332

pairing code-wifi 0x7283 <ssid> <passphrase> 34970112332

Above default manual pairing code contains following values:
Version: 0
Custom flow: 0 (STANDARD)
Discriminator: 3840
Passcode: 20202021
To commission the device using QR code MT:Y.K9042C00KA0648G00

pairing code-wifi 0x7283 <ssid> <passphrase> MT:Y.K9042C00KA0648G00

要求:

大模型请求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, 功能强大但是连接麻烦。

是可以的。但要给AI一个良好的编程环境。

  • 在训练阶段,这种编程语言有大量的参考数据。
  • 编程语言设计时,考虑了代码解耦/代码量少/不容易出错。据说typescript由于有强类型约束,更适合AI,不容易出错。
  • 结果容易验证。分为console和GUI两种结果都容易验证。目前GUI验证是个难题,且很耗费资源。假如GUI能通过console或者TUI方式验证,则可以大大加快AI自我编程的速度。基于此,有可能TUI会有很大发展。
  • 不会的时候能够快速请教人类,而不是产生幻觉或者死磕到底。
  • 所基于的平台有完整的源码,因为这样才能确定某些BUG是哪儿造成的。这比较适合linux。

KiCAD主工作区黑屏一般是由于显卡配置问题(如双显卡默认在集显上显示),KSCD默认是打开了硬件加速的,在设置-偏好设置-通用中,修改为软件渲染看看是否就恢复了。
如果恢复了,在Windows系统设置搜索“图形设置”,添加桌面应用,选择pcbnew.exe, GPU首选项指定为自己的独立显卡。关闭pcbnew再重新打开。

现在有公账、私账、平台账。这些都是内部账.
这三种账户都可能直接和外部进行交易. 交易主要就分收入和支出.
这三个账户之间可以进行互转.

三种账户之间互转的类型,以及通常的称呼和方式

首先,三种账户之间互转都存在一种借款和还款的类型。除借还款之外,下面的是单向的,也就是转过之后不需要再还回来。
私账转公账可以称之为投资;
公账转私账可以称之为报销(需要票),或工资(不需要票);
公司账转平台账可以称之为预存;
平台账转公司账称之为提现;

第一个问题是内部账之间的互转可以被视为一种交易吗?

如果内部账之间的互转被视为一种交易的话,那么从A账转B账的话,就需要同时记收入和支出,只记收入或者只记支出都会导致总资金的增加或者减少,那么帐肯定就不平了。
所以不能被视为一种交易,就是有专门的转账类型。

第二个问题是一笔采购交易,如何被看成私账支出还是公账支出?

如果有私账先采购没有开票的情况下,就是私账的支出,如果有开票的情况下,就变成公账支出,需要转给私人的报销款。所以一批私账采购交易是否要报销就看是否开票。

淘宝和支付宝该怎么说呢,就对商家非常的不厚道。把保证金管理入口藏得非常深。
位置如下:

电脑端登录 b.alipay.com 商家中心-对账中心-左侧资金账户-支付宝账户-保证金

以前保证金的入口跟支付宝账户同级,现在竟然把它隐藏在支付宝账户之下了。

Protobuf 3 和 gRPC 是 Google 开发并开源的一对“黄金搭档”,它们共同构成了现代高性能微服务通信的基石。简单来说,Protobuf 3 负责高效地“打包”数据,而 gRPC 则负责快速地“运输”这些数据。

📦 什么是 Protobuf 3?

Protobuf 3(Protocol Buffers 3)是 Google 开发的一种轻量级、高效的结构化数据存储格式,可以把它理解成一种数据序列化工具。

它的核心工作流程是:

  1. 定义数据结构:你使用一种接口定义语言(IDL),在一个 .proto 文本文件中定义你的数据结构(称为“消息”)。
  2. 生成代码:通过 protoc 编译器,根据 .proto 文件自动生成多种编程语言(如 Go, Java, Python, C++ 等)的数据访问类。
  3. 序列化与反序列化:在你的代码中,使用生成的类来创建、填充数据对象,并将其序列化为紧凑的二进制格式进行传输或存储;接收方则能高效地将其反序列化回对象。

Protobuf 3 的核心优势

  • 高性能:与 JSON 或 XML 等基于文本的格式相比,Protobuf 将数据序列化为二进制,因此消息体积更小(通常只有 JSON 的 1/3 到 1/2),解析和序列化速度也更快(可快 50% 以上)。
  • 强类型与语言无关:通过 .proto 文件定义一份明确的数据契约,可以生成各种语言的代码,确保了不同服务间数据交互的强类型安全和一致性。
  • 易于演进:Protobuf 3 的设计哲学强调简单和向后兼容。它移除了 required 字段,所有字段默认为 optional,并提供了 reserved 关键字来保护已删除字段的编号,这使得在不破坏现有客户端的情况下对数据结构进行升级变得非常容易。
  • 标准化 JSON 支持:Protobuf 3 提供了标准化的 JSON 映射,方便在需要人类可读或与 Web API 交互的场景下进行调试和通信。

🚀 什么是 gRPC?

gRPC 是一个现代、开源、高性能且通用的远程过程调用(RPC)框架。它让一个应用程序能够像调用本地函数一样,去调用另一个远程服务器上的函数,极大地简化了分布式系统间的通信复杂性。

gRPC 的核心特性包括:

  • 基于 HTTP/2:gRPC 默认使用 HTTP/2 作为传输协议,这带来了多路复用(在单个连接上并行处理多个请求)、头部压缩、双向流等高级功能,显著提升了网络效率。
  • 以 Protobuf 为默认数据格式:gRPC 使用 Protobuf 作为其默认的接口定义语言(IDL)和消息序列化机制,继承了其高性能、强类型的优点。
  • 代码生成:通过 .proto 文件定义服务接口(包括方法、参数和返回类型),gRPC 可以自动生成客户端和服务端的桩代码,开发者只需关注业务逻辑的实现,无需手动处理底层的网络通信、序列化等细节。

gRPC 的四种通信模式

gRPC 提供了灵活的通信模型,以满足不同场景的需求:

通信模式 描述 方法定义示例
一元 RPC (Unary RPC) 最普通的调用模式,客户端发送一个请求,服务器返回一个响应。 rpc SayHello(HelloRequest) returns (HelloReply);
服务器流式 RPC (Server streaming RPC) 客户端发送一个请求,服务器返回一个数据流(一系列消息)。 rpc LotsOfReplies(HelloRequest) returns (stream HelloReply);
客户端流式 RPC (Client streaming RPC) 客户端发送一个数据流(一系列消息),服务器在处理完所有消息后返回一个响应。 rpc LotsOfGreetings(stream HelloRequest) returns (HelloReply);
双向流式 RPC (Bidirectional streaming RPC) 客户端和服务器各自通过独立的流互相发送一系列消息,双方可以按任意顺序读写。 rpc BidiHello(stream HelloRequest) returns (stream HelloReply);

总而言之,Protobuf 3 和 gRPC 共同提供了一个完整的解决方案,用于构建高效、可靠且易于演进的分布式系统和微服务架构。

将目录中的所有图片按从名称从左到右合并到一张大的精灵图里。
新建: sprite_combine.py

#!/usr/bin/env python3
"""
Sprite Combine Tool
Combine all PNG images in a directory into a single horizontal strip.
"""

import argparse
import os
import sys
from pathlib import Path
from PIL import Image


def main():
    parser = argparse.ArgumentParser(
        description="Combine PNG images from a directory into a single horizontal image."
    )
    parser.add_argument(
        "directory",
        help="Directory containing PNG images to combine"
    )
    parser.add_argument(
        "-o", "--output",
        default="combined.png",
        help="Output filename (default: combined.png)"
    )
    parser.add_argument(
        "-s", "--spacing",
        type=int,
        default=0,
        help="Spacing between images in pixels (default: 0)"
    )
    parser.add_argument(
        "-b", "--background",
        default=None,
        help="Background color (hex format like #FFFFFF or transparent for none)"
    )

    args = parser.parse_args()

    dir_path = Path(args.directory)

    if not dir_path.exists():
        print(f"Error: Directory '{args.directory}' does not exist.", file=sys.stderr)
        sys.exit(1)

    if not dir_path.is_dir():
        print(f"Error: '{args.directory}' is not a directory.", file=sys.stderr)
        sys.exit(1)

    # Get all PNG files and sort by name
    png_files = sorted(dir_path.glob("*.png"), key=lambda x: x.name)

    if not png_files:
        print(f"Error: No PNG files found in '{args.directory}'.", file=sys.stderr)
        sys.exit(1)

    print(f"Found {len(png_files)} PNG image(s):")
    for f in png_files:
        print(f"  - {f.name}")

    # Load images
    images = []
    for filepath in png_files:
        try:
            img = Image.open(filepath)
            # Convert to RGBA to handle transparency properly
            img = img.convert("RGBA")
            images.append(img)
        except Exception as e:
            print(f"Warning: Could not load '{filepath}': {e}", file=sys.stderr)
            continue

    if not images:
        print("Error: No valid images could be loaded.", file=sys.stderr)
        sys.exit(1)

    # Calculate dimensions
    spacing = args.spacing
    max_height = max(img.height for img in images)
    total_width = sum(img.width for img in images) + spacing * (len(images) - 1)

    print(f"\nOutput dimensions: {total_width} x {max_height} pixels")

    # Parse background color
    bg_color = None
    if args.background:
        if args.background.lower() == "transparent":
            bg_color = None
        else:
            # Parse hex color
            hex_color = args.background.lstrip("#")
            if len(hex_color) == 6:
                bg_color = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) + (255,)
            else:
                print(f"Warning: Invalid hex color '{args.background}', using transparent.", file=sys.stderr)

    # Create combined image
    if bg_color is not None:
        combined = Image.new("RGBA", (total_width, max_height), bg_color)
    else:
        combined = Image.new("RGBA", (total_width, max_height), (255, 255, 255, 0))

    # Paste images
    x_offset = 0
    for img in images:
        # Center vertically if different heights
        y_offset = (max_height - img.height) // 2
        combined.paste(img, (x_offset, y_offset), img)
        x_offset += img.width + spacing

    # Save result
    output_path = Path(args.output)
    combined.save(output_path, "PNG")
    print(f"\nSaved combined image to: {output_path.resolve()}")


if __name__ == "__main__":
    main()

依赖文件 requirements.txt

Pillow>=10.0.0

安装依赖:

pip install -r requirements.txt

运行方式:

python sprite_combine.py <folder_name>

可以改为bat文件spcomb.bat方便执行:

python sprite_combine.py %1

使用纯净css运行合并后的精灵图动画,可用于微信小程序:
wxml如下:

<view class="shutu-animation"></view>

wxss如下,假设精灵图为150x150px,合并后大小为9150x150px:


.shutu-animation {
  width: 150rpx;
  height: 150rpx;
  background-image: url('https://xxxxx/combine.png'); /* 单行图 */
  background-size: 9150rpx 150rpx; /* 总宽 x 高 */
  animation: play 6s steps(61) infinite; /* 30帧需要走29步 */
}

@keyframes play {
  100% {
    background-position: -9150rpx 0; 
  }
}

我发现一个问题,要AI使用框架的话,一定要让AI用最流行的框架,而不要用所谓AI自己觉得最合适你项目的框架。原因是最流行的框架有最丰富的文档,AI在前期训练的时候会对该框架有更多的了解。流行程度不佳的框架文档缺失,AI自己在编程的时候也会遇到更多的阻力,踩更多的坑。
刚刚让AI去编写一个贪吃蛇的游戏,当然我使用了superpowers这个插件来去编写,意图让他长时间的去运行编码任务并且可以编写一个比较复杂的程序。贪吃蛇游戏本身逻辑很简单,然后superpowers在进行问答的过程中,我有意采取了一些更加复杂的游戏设计,看它是否能够实现。
然后我用的是GLM4.7,它就开始提示我用框架的事情,我让他给了几个选择,他说phaser和kaboom都可以用,但是前者的框架太复杂,学习曲线太陡峭了,而后者也就是Kaboom这种轻量级的框架更适合我这种轻量级的小游戏。
phaser我之前是用过的,但是既然他说kaboom可以就让他用吧。没想到后面编码的时候竟然出现将API完全用错的情况。他自己发现错误之后就回过头去重构,然后还要再去理解到底这个API该怎么用。
其中还出现了一个问题,就是它总是要使用8000端口启动游戏的网页服务器。然而,8000端口已经被我的其他内部服务占用了,他对此毫不知情,弃而不舍的去启动这个服务。我只好中断它的运行,让它更换为其他端口。这就不适合用作长期自主运行的agent了。