RisalDash RisalDash

Гайд · ИИ · ESP32

Дай ESP32 лицо, которое думает

ESP32 не потянет большую языковую модель — но станет идеальным фронтендом для неё. Чип принимает вопрос, размещённая модель думает, а лицо-робот реагирует на всём пути: слушает → размышляет → говорит → готово. Вот архитектура, единственное важное правило безопасности и приём, что всё связывает.

ИИ-агентLLMESP32ПроксиRisalDash
Пайплайн ИИ-агента на ESP32: лицо-робот проходит стадии слушает, размышляет, говорит, успех
Лицо — это машина состояний агента: у каждой стадии запроса своё выражение.

Схема: ESP спереди, модель сзади

Не пытайся крутить ИИ на самом чипе. Выигрышное разделение простое: ESP32 держит интерфейс — принимает ввод (текст, кнопку, позже микрофон), показывает, что происходит, и рисует ответ — а размещённая модель делает язык. Между ними — крошечный сервер под твоим контролем. Запрос уходит в одну сторону и возвращается:

ты пишешь  →  ESP32  →  твой прокси  →  LLM  →  ответ + настроение  →  лицо ESP32

Всё, что видит и трогает пользователь, живёт на ESP и отдаётся живым веб-дашбордом — так у «агента» есть тело задолго до голоса.

Правило одно: ключ API никогда не касается ESP

Тут чаще всего ошибаются. Никогда не зашивай ключ LLM в прошивку. Любой, кто снимет .bin с флеша, прочитает его — см. где ESP32 хранит данные — да и микроконтроллер всё равно не может безопасно «пинить» ротируемую TLS-цепочку вендора. Вместо этого подними тонкий прокси (Cloudflare Worker, маленький Node-роут), который держит секрет. ESP зовёт твой URL с обычным сообщением; прокси добавляет ключ, зовёт модель и возвращает маленький JSON. Это примерно пятнадцать строк — и заодно позволяет менять модели, ставить лимиты и кэш, не перепрошивая ни одного устройства.

Лицо — это машина состояний

Вот приём, от которого всё оживает: у сетевого запроса есть состояния — отправка, ожидание, пришёл-ответ, ошибка — и они один-в-один ложатся на выражения. Ты не описываешь прогресс текстом; лицо и есть прогресс-бар. Ставишь одну связанную переменную — и отданное лицо (и любой экран на устройстве) следует за ней по WebSocket:

mood = FACE_LISTENING;   // спросили
mood = FACE_PONDERING;   // передали модели
reply = askAgent(msg);   // вызов прокси
mood = FACE_SPEAKING;    // ответ пришёл
mood = replyMood;        // осесть в настроение самой модели

Последняя строка — самая интересная: пусть модель сама выберет настроение. Попроси её закончить ответ индексом настроения — и лицо отразит содержание ответа, а не только «трубопровод»: довольное, неуверенное, извиняющееся. У лица десятки состояний на выбор (собраны и превью в BoardLab); агенту, чтобы казаться живым, хватает горстки.

Кто что делает

СлойГде крутитсяЗадача
Лицо + UIна ESP32принять ввод, показать состояние, нарисовать ответ
Прокситвой сервер / Workerдержать ключ, звать модель, формировать JSON
Модельв облакепонять, ответить, выбрать настроение

Держи границу чистой — и каждый кусок остаётся заменяемым: меняешь модель в прокси, перекрашиваешь лицо в прошивке, и одно не трогает другое.

Куда двигаться дальше

Текст в браузере — простейший фронтенд, но тот же пайплайн так же примет кнопку или микрофон — меняешь ввод, машину состояний оставляешь. Добавь правильное радио и источник питания — и говорящее лицо станет настоящим устройством на полке. Полный скетч (вместе с контрактом прокси) идёт примером AI-Agent в репозитории RisalDash.

Сначала тело? Полный живой дашборд — лицо, датчики, управление — в пару строк C++.

Лицо агента вживую

Несколько состояний из тех, что ведёт этот пайплайн — анимируются сами.

neutral
listening
pondering
speaking
happy
success
worried
error
Собрать полный набор в BoardLab →