1. 项目概述:从“疯狂科学家”的奇想到可落地的智能家居中枢

我一直热衷于动手制作各种玩意儿,每年万圣节派对我都会设定一个主题词,让大家围绕它来装扮。去年的主题是“疯狂”,我立刻想到了《瑞克和莫蒂》里那位既天才又暴躁的瑞克。光穿件白大褂、染个蓝头发可不够“瑞克”,他那些天马行空的发明才是精髓。于是,一个想法诞生了:做一个能像瑞克那样,从任何地方、用任何方式控制我整个智能家居的“万能遥控器”。

这个项目的核心,我称之为“远程的遥控器”(Remote Remote)。它不仅仅是一个手机App的替代品,而是一个集成了 Blues无线技术 本地语音识别 云端AI决策 自定义硬件控制 的综合性中枢。其根本目的是解决两个痛点:一是摆脱对家庭Wi-Fi网络的绝对依赖,实现真正的、无地理限制的远程控制;二是超越预设场景的局限,通过AI理解复杂的自然语言指令,动态生成控制逻辑。想象一下,在回家路上说一句“我半小时后要录音”,系统就能自动安排好空调、电脑等设备,这种体验才是智能家居应有的样子。

整个系统由三大部分组成:一个随身携带的、基于UNIHIKER的语音命令终端(我戏称为“管家”);一个部署在家中的、基于Flask构建的命令与逻辑处理服务器;以及通过各种方式(Wi-Fi、MQTT、厂商API)接入的智能设备。Blues Notecard负责在终端和服务器之间建立一条稳定、低功耗的远程数据通道,而AI(这里用的是OpenAI的GPT-4o)则充当了高级指令的“翻译官”和“策略师”。无论是调节Nest恒温器,还是控制一个自己用ESP8266做的“米西克斯盒子”玩具,所有指令都经由这个中枢协调分发。

2. 系统架构设计与核心组件选型

2.1 整体架构解析:为什么是“中心化服务器+边缘终端”?

在构思架构时,我放弃了让终端设备直接与所有智能家居设备通信的分布式方案,也否决了完全依赖某个云平台(如Home Assistant Cloud)的托管方案,而是选择了 中心化服务器+边缘终端 的混合架构。原因如下:

  1. 复杂逻辑本地化 :AI指令解析、定时任务调度、多设备联动场景(如“录音模式”)涉及复杂的逻辑和状态管理。将这些功能放在家庭内部的Flask服务器上运行,可以保证低延迟、高可靠性,且不受外部云服务中断的影响。服务器“坐镇”家中,拥有稳定的电源和网络,是处理重逻辑的理想场所。
  2. 安全性边界清晰 :所有来自外部的指令(通过Blues或AI)都首先到达我的Flask服务器。我可以在这里实现统一的身份验证、指令过滤和日志记录,相当于为我的智能家居网络设置了一个 安全网关 。避免了将每个智能设备的API密钥或控制端口直接暴露在公网的风险。
  3. 最大化终端灵活性 :终端设备(UNIHIKER)的职责被简化为“采集指令”和“显示反馈”。它不需要强大的算力,也不需要存储复杂的设备逻辑,因此可以做得更小巧、更省电。未来我可以轻松更换终端设备(比如换成手机App或其他硬件),而无需改动核心控制逻辑。
  4. 技术栈自由 :Flask是一个轻量级但极其灵活的Python Web框架。我可以自由地集成任何Python库,无论是调用OpenAI API、操作GPIO控制本地硬件,还是与Nest、Philips Hue等第三方服务交互。这种自由度是许多成品智能家居平台所不具备的。

整个数据流可以概括为: 语音/按键指令 -> UNIHIKER终端 -> Blues Notecard -> 公网 -> Flask服务器 -> (AI解析/逻辑处理)-> 目标设备(通过Wi-Fi/MQTT/HTTP API)

2.2 硬件组件选型:平衡性能、成本与易用性

  • 控制终端:DFRobot UNIHIKER

    • 选择理由 :我需要一个集成了屏幕、麦克风、扬声器、按键和Wi-Fi,且能运行Python的便携设备。树莓派加一堆外设也能实现,但UNIHIKER提供了一个开箱即用的整合方案,其触摸屏对于显示识别到的语音指令文本非常友好。它的性能足以流畅运行一个本地语音识别库(如 SpeechRecognition )和Blues的Python SDK。
    • 替代方案 :树莓派Zero 2 W配合一个小型触摸屏和USB麦克风是可行的,但需要更多的组装和配置工作。对于追求快速原型和一体化的项目,UNIHIKER更胜一筹。
  • 远程通信模块:Blues Notecarrier F + Notecard

    • 选择理由 :这是实现“从任何地方控制”的关键。Blues Notecard是一种蜂窝(Cat-1)通信模块,它内置了SIM卡和全球流量(需订阅),通过Notehub.io云服务进行数据中转。其最大优势是 开发者体验 :你几乎不用关心蜂窝网络的复杂性(APN设置、信号注册等),它通过USB或I2C连接到主机后,就像一个串口设备,使用简单的JSON指令进行通信。 note-python 库让集成变得非常简单。
    • 核心价值 :它解决了动态公网IP、端口转发、DDNS等传统远程访问方案的麻烦。即使家里的路由器没有公网IP,也能稳定建立连接。对于智能家居这种数据量小但要求连接可靠的应用场景非常合适。
    • 成本考量 :硬件本身有一定成本,且Notehub服务根据数据量有分级收费。但对于个人项目或小规模部署,其免费套餐和开发者友好的模式很有吸引力。
  • 家庭服务器:树莓派 4B 或 M5Stack CM4Stack

    • 选择理由 :Flask服务器需要7x24小时运行,功耗和稳定性是关键。树莓派4B是经久不衰的选择,性能足够,社区支持强大。我项目中使用了M5Stack CM4Stack,因为它将树莓派CM4模块与一个漂亮的壳子、屏幕和电池管理集成在一起,更适合作为一个小型“家电”摆放在桌面上。
    • 配置建议 :至少4GB内存,使用高速MicroSD卡或更好的是SSD(通过USB3.0连接)来提升系统寿命和响应速度。
  • 自定义设备:ESP8266(如NodeMCU)

    • 选择理由 :对于像“米西克斯盒子”这样的简单执行器(控制一个舵机),ESP8266是性价比之王。它价格低廉,支持Wi-Fi和MQTT,Arduino生态完善。通过MQTT协议与中心服务器通信,实现了松耦合,新增此类设备非常方便。

2.3 软件栈构建:每一层的技术考量

  • 终端软件 (UNIHIKER) :

    • 语音识别 :采用Python的 SpeechRecognition 库,后端引擎选择 Google Web Speech API (需联网)或 Vosk (离线,需下载模型)。我选择了在线方案,因为识别准确率更高,且终端本身通过Blues联网。
    • 本地交互 :使用UNIHIKER的 unihiker 库来驱动屏幕显示和读取物理按键。当识别到唤醒词“butler”后,将后续语音转为文本,通过Blues Notecard发送。
    • 与Blues通信 :使用 note-python 库。核心操作就是初始化Notecard,然后向指定 topic (主题)添加一个包含指令文本的 note (笔记)。Notecard会自动将其同步到Notehub云端。
  • 服务器软件 (Flask) :

    • Web框架 :Flask。轻量,路由定义清晰,非常适合构建RESTful API。它运行了一个本地Web服务(默认端口5000),等待接收指令。
    • 指令路由 :设计一个 /command 的API端点,接收来自Blues Webhook的POST请求。请求体中包含从终端发来的原始指令文本。
    • AI集成 :使用 openai Python库。当指令以“ai”开头时,服务器会构造一个包含系统提示词、设备列表和用户指令的请求,发送给GPT-4o模型,请求其返回结构化的JSON操作序列。
    • 设备控制层
      • Nest恒温器 :使用Google的 google.oauth2 googleapiclient 库,通过OAuth 2.0和Smart Device Management API进行控制。
      • MQTT设备 :使用 paho-mqtt 库。服务器作为MQTT客户端,订阅命令反馈主题,并向特定设备主题发布控制指令(如 home/meeseeks_box/set )。
      • 其他HTTP设备 :使用 requests 库调用第三方智能家居设备的本地或云API。
    • 任务调度 :使用Python内置的 threading schedule 库来处理像“定时录音准备”这样的延迟任务。
  • 穿透工具:LocalTunnel

    • 为什么不用Ngrok或FRP? LocalTunnel是一个极其简单的工具, npm install -g localtunnel 即可安装。它的命令 lt --port 5000 --subdomain myuniquehost 能瞬间生成一个 https://myuniquehost.loca.lt 的公网地址,并指向你本地的5000端口。对于快速原型和测试,它比配置Ngrok的Auth Token或自建FRP服务器要方便得多。当然,对于生产环境,建议使用更稳定、可自定义域名的方案。

3. 核心环节实现与实操要点

3.1 Blues Notecard的配置与远程通道建立

这是打通内外网的关键一步,很多人在此卡壳。以下是详细步骤和避坑指南:

  1. 硬件连接 :将Blues Notecard插入Notecarrier F载板,然后通过USB线连接到UNIHIKER或树莓派。系统应自动识别为串口设备(如 /dev/ttyACM0 )。
  2. 创建Notehub项目
    • 登录Notehub.io,在右上角点击你的用户名,进入“View Projects”,然后“Create Project”。记下生成的 Project UID
    • 这个UID是设备(Notecard)与云端项目绑定的唯一标识。
  3. 设备端初始化代码
    import notecard
    from notecard import card, hub, note
    
    port = '/dev/ttyACM0'  # 根据你的系统调整
    card = notecard.OpenSerial(port)
    
    req = {"req": "hub.set"}
    req["product"] = "你的 Product UID"  # 这里填 Notehub 项目的 Product UID
    req["mode"] = "periodic"  # 或 "continuous", periodic更省电
    req["outbound"] = 30  # 每30秒检查一次外发数据
    rsp = hub.set(card, req)
    
    这段代码告诉Notecard:“你属于哪个项目,以及如何连接网络”。 mode 设为 periodic 适合低频数据, continuous 则保持长连接,延迟更低。
  4. 设置路由(Webhook)
    • 在Notehub项目的“Routes”页面,点击“Add Route”。
    • 选择“HTTP/S”类型,即通用Webhook。
    • 在“URL”栏,填入你的LocalTunnel地址加上服务器端点,例如: https://myproject.loca.lt/command
    • 关键一步 :在“Filter”部分,设置 WHERE topic = 'your_topic_name' 。这确保了只有特定主题的数据才会被转发到你的服务器,避免无关数据干扰。我在终端和服务器代码中统一使用 topic = "home.cmd.v1"
  5. 发送第一条远程指令 : 在UNIHIKER的代码中,当语音识别到指令后,执行:
    cmd_text = "butler, set living room temperature to 22"  # 示例指令
    req = {"req": "note.add"}
    req["file"] = "home.cmd.q"  # 队列文件,Notecard内部管理
    req["body"] = {"command": cmd_text}
    rsp = note.add(card, req)
    
    Notecard会将这条 note 加入队列,并在下一个同步周期(或立即,取决于模式)将其发送到Notehub,Notehub再根据路由规则,POST到你的Flask服务器。

实操心得:网络切换与重连 在实际测试中,当终端设备(如UNIHIKER)从家庭Wi-Fi移动到蜂窝网络(通过Blues)时,本地语音识别可能因无法访问Google服务而失败。我的解决方案是:在终端代码中,先尝试通过本地网络直接调用服务器API(延迟更低),如果失败(超时或网络不可达),则自动切换到通过Blues Notecard发送指令。这实现了一个简单的 网络降级策略 ,保证了控制功能的可用性。

3.2 Flask服务器的指令处理与AI集成

服务器是大脑,其 app.py 的核心结构如下:

from flask import Flask, request, jsonify
import openai
import paho.mqtt.client as mqtt
from nest_control import set_nest_temperature  # 自定义的Nest控制模块
from device_registry import get_all_devices  # 设备注册表

app = Flask(__name__)
openai.api_key = '你的API密钥'
mqtt_client = mqtt.Client()
mqtt_client.connect("localhost", 1883)  # 假设MQTT broker运行在同一台服务器

@app.route('/command', methods=['POST'])
def handle_command():
    data = request.json
    raw_command = data.get('command', '')
    # 1. 日志记录
    print(f"Received command: {raw_command}")

    # 2. 指令预处理与路由
    if raw_command.startswith('butler ai,'):
        response = handle_ai_command(raw_command)
    elif 'record in' in raw_command:
        response = schedule_recording_prep(raw_command)
    elif 'set temperature' in raw_command:
        response = handle_nest_command(raw_command)
    elif raw_command == 'Halloween 1':
        response = toggle_meeseeks_box()
    else:
        response = {"status": "error", "message": "Unrecognized command"}

    return jsonify(response)

def handle_ai_command(raw_command):
    """处理AI指令"""
    user_query = raw_command.replace('butler ai,', '').strip()
    system_prompt = """
    你是一个智能家居控制AI。请根据用户指令,从以下设备列表中选择合适的设备并生成操作。
    设备列表:{}
    请以JSON格式回复,格式为:{{"actions": [{{"device": "设备名", "action": "操作", "params": {{...}}}}]}}
    只返回JSON,不要有其他文字。
    """.format(get_all_devices())

    try:
        completion = openai.ChatCompletion.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_query}
            ],
            temperature=0.1  # 低随机性,确保输出稳定
        )
        ai_response = completion.choices[0].message.content
        # 解析AI返回的JSON
        actions = json.loads(ai_response).get('actions', [])
        # 逐条执行动作
        for act in actions:
            execute_device_action(act['device'], act['action'], act.get('params'))
        return {"status": "success", "message": f"AI executed {len(actions)} actions."}
    except Exception as e:
        return {"status": "error", "message": f"AI processing failed: {str(e)}"}

def execute_device_action(device_name, action, params):
    """根据设备名和动作执行控制"""
    if device_name == "living_room_light":
        mqtt_client.publish(f"home/light/{device_name}/set", payload=json.dumps({"state": action}))
    elif device_name == "upstairs_nest":
        set_nest_temperature(device_name, params['temperature'])
    # ... 其他设备处理逻辑

注意事项:AI指令的安全性与可靠性

  1. 指令过滤 :在将AI生成的指令发送给真实设备前,务必进行一层 安全校验 。例如,检查目标设备是否存在、操作参数是否在合理范围内(如温度不能设为100度)。可以在 execute_device_action 函数中加入校验逻辑。
  2. JSON解析容错 :AI可能返回非标准JSON。使用 try...except 包裹解析过程,并设置重试或降级策略(如回复“无法理解,请重新表述”)。
  3. 成本控制 :GPT-4o的API调用有成本。可以在服务器端对用户指令进行初步过滤,只有复杂的、无法被预设规则处理的指令才交给AI,简单指令(如“开灯”)直接走规则引擎。

3.3 自定义设备(如Meeseeks盒子)与MQTT集成

为了派对效果,我制作了一个会弹开的“米西克斯盒子”,核心是一个ESP8266和一个舵机。

  1. 硬件连接 :舵机信号线接ESP8266的GPIO引脚(如D1),供电需注意电流,最好外接5V电源。
  2. Arduino代码要点
    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
    const char* ssid = "你的Wi-Fi";
    const char* password = "密码";
    const char* mqtt_server = "你的Flask服务器内网IP"; // MQTT broker地址
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    Servo myservo;
    bool boxOpen = false;
    
    void callback(char* topic, byte* payload, unsigned int length) {
        String message;
        for (int i=0; i<length; i++) message += (char)payload[i];
        if (message == "toggle") {
            if(boxOpen) {
                myservo.write(0); // 关闭位置
                boxOpen = false;
            } else {
                myservo.write(90); // 打开位置
                boxOpen = true;
            }
        }
    }
    
    void setup() {
        myservo.attach(D1);
        setup_wifi();
        client.setServer(mqtt_server, 1883);
        client.setCallback(callback);
        // 订阅一个唯一的主题,避免循环
        client.subscribe("home/meeseeks_box/cmd");
    }
    
    void loop() { client.loop(); }
    
  3. MQTT主题设计避坑
    • 关键点 :我让设备订阅 home/meeseeks_box/cmd ,而服务器向 home/meeseeks_box/set 发布命令。 订阅和发布的主题必须不同 ,否则当服务器发布命令时,如果它自己也订阅了相同的主题(在某些MQTT broker配置下),可能会收到自己发出的消息,导致意料之外的行为甚至循环。
    • 最佳实践 :采用 device/+/cmd (设备订阅)和 device/+/set (服务器发布)的模式,清晰分离控制流。

3.4 Nest恒温器API集成的深水区

集成Nest是本次项目中最繁琐的部分之一,主要难点在OAuth 2.0授权和设备权限管理。

  1. 创建Google Cloud项目与启用API :这一步相对直接,在Google Cloud Console中创建项目,在“API和服务库”中启用“Smart Device Management API”。
  2. 配置OAuth 2.0同意屏幕 :选择“外部”用户类型,填写应用名称等信息。即使只有你自己用,也需要配置。
  3. 创建OAuth 2.0客户端ID :在“凭据”页面创建。应用类型选择“桌面应用”。下载得到的 client_secret_xxx.json 文件,或记录下 client_id client_secret
  4. 设备访问控制台(Device Access Console)的坑
    • 这是Nest设备管理的专属控制台。你需要用同一个Google账号在这里创建一个项目,并关联你的Google Cloud项目。
    • 获得一个 Project ID (有时也叫Enterprise ID)。
  5. 最关键的授权URL :这是官方文档容易忽略,但却是让设备列表“现身”的关键。你需要手动构造一个授权URL,并在浏览器中访问,以将你的Google账号(即Nest设备的所有者账号)与这个开发项目绑定。
    https://nestservices.google.com/partnerconnections/[YOUR_PROJECT_ID]/auth?redirect_uri=http://localhost:8080&access_type=offline&prompt=consent&client_id=[YOUR_CLIENT_ID]&response_type=code&scope=https://www.googleapis.com/auth/sdm.service
    
    • [YOUR_PROJECT_ID] [YOUR_CLIENT_ID] 替换为你的值。
    • redirect_uri 需要和你在OAuth客户端ID配置中设置的“已授权的重定向URI”之一匹配。本地测试可以用 http://localhost:8080
    • 访问这个URL后,会跳转并显示一个授权页面,同意后,浏览器地址栏会包含一个 code 参数。你需要用这个 code 去交换 refresh_token access_token
  6. 服务器端获取并刷新Token
    from google.oauth2.credentials import Credentials
    from googleapiclient.discovery import build
    
    # 用code交换初始token(通常只需做一次)
    # ... (使用requests库向Google的token端点发送POST请求)
    
    # 将得到的refresh_token持久化存储(如存入文件或数据库)
    creds = Credentials(
        token=access_token,
        refresh_token=refresh_token, # 这个最重要
        token_uri="https://oauth2.googleapis.com/token",
        client_id=client_id,
        client_secret=client_secret
    )
    
    # 构建SDM服务
    service = build('smartdevicemanagement', 'v1', credentials=creds)
    # 列出设备
    devices = service.enterprises().devices().list(parent='enterprises/your-project-id').execute()
    
    refresh_token 是长期有效的(除非用户撤销授权),你的服务器代码需要定期使用它来刷新过期的 access_token

血泪教训:权限与设备发现 我最初按照常规OAuth流程走完,API调用返回成功,但设备列表始终为空。花了大量时间排查才发现,必须通过上述那个特定的授权URL流程,在“设备访问控制台”中完成账号与项目的“伙伴连接”(Partner Connection),你的项目才能真正“看到”并控制你账号下的Nest设备。这一步在Google的SDM文档里藏得比较深。

4. 典型问题排查与实战心得

4.1 Blues Notecard连接与数据同步问题

  • 问题 :UNIHIKER上运行程序,但Notehub.io控制台看不到设备上线或数据。
    • 排查
      1. 检查硬件连接 :USB线是否插好?在终端输入 ls /dev/ttyACM* ls /dev/ttyUSB* 查看设备是否存在。
      2. 检查Product UID :代码中的 hub.set 请求里的 product 字段是否与Notehub项目中的完全一致(包括大小写)?
      3. 检查网络信号 :Notecard需要蜂窝信号。Notecarrier F上的LED指示灯状态能提供线索(常亮/闪烁模式代表不同状态,需查阅手册)。
      4. 查看本地日志 :在Python代码中打印 hub.set note.add 的返回响应 rsp ,看是否有错误信息。
    • 解决 :最有效的方法是使用Blues提供的 note-* 系列命令行工具(如 note-hub )进行交互式测试,这能隔离你的应用代码,直接验证Notecard硬件和Notehub云端的连通性。

4.2 LocalTunnel连接不稳定或中断

  • 问题 :Flask服务器本地运行正常,但通过LocalTunnel的URL访问时断时续,或一段时间后失效。
    • 原因 :LocalTunnel是免费公共服务,连接的稳定性和生命周期有限。长时间不活动或服务端重启都可能导致URL变化。
    • 解决
      1. 使用固定子域名 :启动时加 --subdomain 参数,能一定程度提高URL的持久性。
      2. 实现健康检查与重连 :在Flask服务器启动脚本中,可以添加一个循环,定期检查LocalTunnel连接,如果失效则自动重启 lt 进程。
      3. 生产环境替代方案 :考虑使用更稳定的服务,如 Cloudflare Tunnel (完全免费,且能绑定自定义域名),或者在有公网IP的情况下,配置路由器端口转发+DDNS。

4.3 AI指令执行结果不符合预期

  • 问题 :对AI说“打开客厅的灯”,它却返回了操作空调的指令。
    • 排查
      1. 检查系统提示词 :提供给GPT的 system_prompt 是否清晰列出了所有可用设备及其准确名称?描述是否足够精确?(例如,“living_room_main_light”比“客厅的灯”更明确)。
      2. 检查设备列表更新 get_all_devices() 函数返回的列表是否及时更新了新增的设备?
      3. 审查AI返回的原始内容 :在 handle_ai_command 函数中,打印出 ai_response ,看看GPT到底返回了什么。可能是它理解了,但生成的JSON格式有误。
    • 解决
      1. 优化提示词工程 :在系统提示词中明确约束。例如:“你只能控制以下列表中的设备。如果用户的指令涉及列表外的设备,请回复‘无法控制该设备’。请确保返回的JSON中,‘device’字段的值必须与下列列表中的‘名称’完全一致。”
      2. 加入后处理验证 :在 execute_device_action 前,增加一个校验步骤,检查 device_name 是否在已知设备列表中,不在则丢弃并记录错误。
      3. 使用更低温度的 temperature 参数 :我设置为0.1,这能大幅降低AI的随机性,使其输出更稳定、更符合指令。

4.4 MQTT设备失联或指令不响应

  • 问题 :ESP8266设备上电后,服务器无法控制,或控制一次后失效。
    • 排查
      1. Wi-Fi连接 :ESP8266的代码里, setup_wifi() 函数是否有重连机制?网络不稳定时,简单的 WiFi.begin() 可能不够。
      2. MQTT Keep Alive :在 PubSubClient 中设置 client.setKeepAlive(60) ,并确保在 loop() 函数中定期调用 client.publish() 一个心跳信息,或至少保证 client.loop() 被频繁调用。
      3. 遗嘱消息 :在设备连接时设置遗嘱(Last Will),这样设备异常离线时,Broker会通知服务器。
        client.connect("meeseeks_box", NULL, NULL, "home/meeseeks_box/status", 0, true, "offline");
        
      4. 服务器端Broker :确保你的MQTT Broker(如Mosquitto)在服务器上正常运行,且防火墙开放了1883端口。
    • 解决 :在ESP8266代码中实现健壮的网络和MQTT重连逻辑。
      void reconnect() {
          while (!client.connected()) {
              if (client.connect("meeseeks_box")) {
                  client.subscribe("home/meeseeks_box/cmd");
                  client.publish("home/meeseeks_box/status", "online", true);
              } else {
                  delay(5000);
              }
          }
      }
      void loop() {
          if (!client.connected()) reconnect();
          client.loop();
      }
      

这个项目从万圣节的一个趣味创意,演变成了一个功能相当扎实的智能家居实验平台。它验证了基于中心化服务器整合异构设备、利用低功耗广域网进行远程控制、以及引入大语言模型实现自然语言交互的可行性。最大的收获不是做出了一个“瑞克的手表”,而是在解决一个个具体问题(如Nest授权、MQTT主题设计、AI指令安全)的过程中,对物联网系统架构的复杂性有了更深的理解。如果你也想打造一个高度定制化、不受品牌生态限制的智能家居系统,希望这篇超详细的拆解能帮你避开我踩过的那些坑。下一步,我计划将Flask服务器容器化,并加入更完善的设备状态管理和历史日志功能,让它从一个“玩具”变得更像一件“工具”。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐