ChatECNU 边缘 AI 智能体对话

介绍了 ESP32 P4 通过 API 接入 ChatECNU 大模型应用平台,实现边缘 AI 部署与智能体对话的项目设计。

介绍

  • 流程图、代码、对话演示;

  • 结合 ChatECNU 开发者平台提供的 API 解决方案,实现 AI 模型的单片机板端调用以及快速对话测试;

API 获取详见:华东师范大学开发者平台 .

硬件

采用 DFRobot FireBeetle 2 ESP32-P4开发板 .
在这里插入图片描述

流程图

在这里插入图片描述

代码

  • 烧录 ESP32 官方提供的 MicroPython 固件;

  • 运行 Thonny IDE 软件,配置解释器和设备端口,新建文件并添加如下代码

# ------------------------------------------------------------------------------
#  MicroPython AI Chat Agent
# ------------------------------------------------------------------------------
import network
import time
import urequests
import ujson
import micropython
import select
import sys
from machine import reset

# ------------------------------------------------------------------------------
#  CONFIGURATION
# ------------------------------------------------------------------------------
WIFI_SSID     = "xxx"
WIFI_PASSWORD = "xxx"

API_ENDPOINT  = "https://chat.ecnu.edu.cn/open/api/v1/chat/completions"
API_KEY       = "sk-4160d6151421480b83fa9f0c264a7xxx"

# ------------------------------------------------------------------------------
#  CONSTANTS
# ------------------------------------------------------------------------------
class SystemStatus:
    WIFI_CONNECTED    = 1
    WIFI_DISCONNECTED = 0

# ------------------------------------------------------------------------------
#  Wi-Fi CONNECTION
# ------------------------------------------------------------------------------
def connect_wifi(max_retries: int = 3) -> int:
    sta = network.WLAN(network.STA_IF)
    sta.active(True)

    for attempt in range(1, max_retries + 1):
        if not sta.isconnected():
            print(f"Connecting to Wi-Fi '{WIFI_SSID}'... (attempt {attempt}/{max_retries})")
            sta.connect(WIFI_SSID, WIFI_PASSWORD)

            timeout = 20
            while not sta.isconnected() and timeout:
                print(".", end="")
                time.sleep(1)
                timeout -= 1

            if sta.isconnected():
                print("\nWi-Fi connected successfully!")
                print("IP address:", sta.ifconfig()[0])
                return SystemStatus.WIFI_CONNECTED

        if attempt < max_retries:
            print("\nConnection failed, retrying in 5 s...")
            time.sleep(5)

    print("\nUnable to connect to Wi-Fi. Please check credentials.")
    return SystemStatus.WIFI_DISCONNECTED

# ------------------------------------------------------------------------------
#  AI CHAT HELPERS
# ------------------------------------------------------------------------------
def chat_with_ai(prompt: str) -> str:
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type":  "application/json"
    }

    payload = ujson.dumps({
        "model":       "ecnu-plus",
        "messages":    [
            {'role': 'system', 'content': 'You are a helpful assistant.'},
            {"role": "user", "content": prompt}],
        "temperature": 0.7,
        "max_tokens":  200
    })

    try:
        resp = urequests.post(
            API_ENDPOINT,
            headers=headers,
            data=payload.encode("utf-8"),
            timeout=15
        )

        if resp.status_code == 200:
            data = resp.json()
            return data["choices"][0]["message"]["content"]
        else:
            return f"API error: HTTP {resp.status_code}\n{resp.text}"

    except Exception as e:
        return f"Request failed: {e}"

    finally:
        try:
            resp.close()
        except:
            pass

# ------------------------------------------------------------------------------
#  MAIN LOOP
# ------------------------------------------------------------------------------
def main_loop():
    print("\n=== AI Agent Ready ===")
    print("Type your question and press <Enter>. Type 'exit' or 'quit' to leave.\n")

    micropython.kbd_intr(-1)  # disable Ctrl-C

    while True:
        # Re-establish Wi-Fi if lost
        sta = network.WLAN(network.STA_IF)
        if not sta.isconnected():
            print("\nWi-Fi lost, attempting to reconnect...")
            if connect_wifi() == SystemStatus.WIFI_DISCONNECTED:
                print("Cannot restore Wi-Fi. Rebooting in 5 s...")
                time.sleep(5)
                reset()

        # Non-blocking keyboard check
        if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
            user_input = sys.stdin.readline().strip()

            if user_input.lower() in {"exit", "quit"}:
                print("\nGood-bye!")
                break

            if user_input:
                print("\nYou:", user_input)
                print("Thinking...")

                t0 = time.time()
                reply = chat_with_ai(user_input)
                elapsed = time.time() - t0

                print(f"AI ({elapsed:.1f} s): {reply}")
                print("\nAsk another question or type 'exit' to leave.")

# ------------------------------------------------------------------------------
#  ENTRY POINT
# ------------------------------------------------------------------------------
print("=== Booting System ===")
if connect_wifi() == SystemStatus.WIFI_CONNECTED:
    try:
        main_loop()
    except KeyboardInterrupt:
        print("\nInterrupted by user — shutting down")
    except Exception as e:
        print(f"Fatal error: {e} — rebooting in 3 s...")
        time.sleep(3)
        reset()
else:
    print("Boot failed — rebooting in 5 s...")
    time.sleep(5)
    reset()
  • 修改配置信息,包括 WiFi 名称和密码、API Key、URL、模型名称等;
  • 保存代码,运行程序;
  • 输入问题并回车,实现对话;
  • 输入 exit 退出程序。

效果

对话演示

在这里插入图片描述

提问演示

在这里插入图片描述

拓展演示

在这里插入图片描述

在这里插入图片描述

总结

介绍了 ESP32 P4 通过 API 接入 ChatECNU 大模型应用平台,实现边缘 AI 部署与智能体对话的项目设计,为该模型在边缘 AI 领域的开发和应用提供了参考。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐