Metadata-Version: 2.4
Name: hermes-agent-iot
Version: 0.22.5.post3
Summary: IoT and low-resource packaging of Hermes Agent, maintained as a native-compatible fork
Author: Nous Research
License-Expression: MIT
Project-URL: Homepage, https://github.com/matttest0080-prog/hermes-agent-iot
Project-URL: Repository, https://github.com/matttest0080-prog/hermes-agent-iot
Project-URL: Documentation, https://github.com/matttest0080-prog/hermes-agent-iot/blob/pi2-lite/README_PI2.md
Project-URL: Upstream project, https://github.com/NousResearch/hermes-agent
Requires-Python: <3.15,>=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: openai==2.24.0
Requires-Dist: certifi==2026.10.19
Requires-Dist: truststore==0.10.4
Requires-Dist: python-dotenv==1.2.2
Requires-Dist: fire==0.7.1
Requires-Dist: httpx[socks]==0.28.1
Requires-Dist: rich==14.3.3
Requires-Dist: tenacity==9.1.4
Requires-Dist: tomli-w==1.2.0
Requires-Dist: ruamel.yaml==0.18.16
Requires-Dist: ruamel.yaml.clib==0.2.15; python_version >= "3.14" and platform_python_implementation == "CPython" and (sys_platform == "darwin" or (sys_platform == "linux" and platform_machine in "x86_64 aarch64 i686") or (sys_platform == "win32" and platform_machine in "AMD64 x86"))
Requires-Dist: requests==2.33.0
Requires-Dist: jinja2==3.1.6
Requires-Dist: firecrawl-anydoc==0.2.4
Requires-Dist: pydantic==2.13.4
Requires-Dist: prompt_toolkit==3.0.52
Requires-Dist: croniter==6.0.0
Requires-Dist: snowballstemmer==3.1.1
Requires-Dist: packaging==26.0
Requires-Dist: Markdown==3.10.2
Requires-Dist: PyJWT[crypto]==2.15.1
Requires-Dist: urllib3<3,>=2.8.0
Requires-Dist: cryptography==50.0.1
Requires-Dist: tzdata==2025.3; sys_platform == "win32"
Requires-Dist: psutil==7.2.2; sys_platform != "android"
Requires-Dist: psutil==7.2.2; sys_platform == "android"
Requires-Dist: websockets==15.0.1
Requires-Dist: browser-harness-hermes-compat==0.1.13.post1
Requires-Dist: pathspec==1.1.1
Requires-Dist: fastapi<1,>=0.104.0
Requires-Dist: uvicorn<1,>=0.31.0
Requires-Dist: httptools<0.9,>=0.6.3
Requires-Dist: watchfiles<2,>=0.20
Requires-Dist: python-multipart<1,>=0.0.9
Requires-Dist: ptyprocess<1,>=0.7.0; sys_platform != "win32"
Requires-Dist: pywinpty<4,>=3.0.5; sys_platform == "win32"
Requires-Dist: pywin32<312,>=306; sys_platform == "win32"
Requires-Dist: winrt-windows-applicationmodel<4,>=3.2.1; sys_platform == "win32"
Requires-Dist: winrt-windows-foundation<4,>=3.2.1; sys_platform == "win32"
Requires-Dist: winrt-windows-foundation-collections<4,>=3.2.1; sys_platform == "win32"
Requires-Dist: winrt-windows-services-store<4,>=3.2.1; sys_platform == "win32"
Requires-Dist: Pillow==13.0.0
Requires-Dist: resvg-py==0.4.0
Requires-Dist: concurrent-log-handler==0.9.29; sys_platform == "win32"
Requires-Dist: nemo-relay<0.11,>=0.10; (sys_platform == "darwin" and platform_machine == "arm64") or (sys_platform == "linux" and platform_machine == "x86_64" and "android" not in platform_release) or (sys_platform == "linux" and platform_machine == "aarch64" and "android" not in platform_release) or (sys_platform == "win32" and platform_machine == "AMD64") or (sys_platform == "win32" and platform_machine == "ARM64")
Provides-Extra: uvloop
Requires-Dist: uvloop<0.24,>=0.15.1; (sys_platform != "win32" and sys_platform != "cygwin" and sys_platform != "android" and platform_machine != "armv7l" and platform_python_implementation != "PyPy") and extra == "uvloop"
Provides-Extra: anthropic
Requires-Dist: anthropic==0.87.0; extra == "anthropic"
Provides-Extra: exa
Requires-Dist: exa-py==2.10.2; extra == "exa"
Provides-Extra: firecrawl
Requires-Dist: firecrawl-py==4.17.0; extra == "firecrawl"
Provides-Extra: parallel-web
Requires-Dist: parallel-web==0.4.2; extra == "parallel-web"
Provides-Extra: ddgs
Requires-Dist: ddgs==9.16.0; extra == "ddgs"
Provides-Extra: fal
Requires-Dist: fal-client==0.13.1; extra == "fal"
Provides-Extra: edge-tts
Requires-Dist: edge-tts==7.2.7; extra == "edge-tts"
Provides-Extra: neutts
Requires-Dist: neutts[all]==1.4.1; python_version < "3.14" and extra == "neutts"
Provides-Extra: kittentts
Requires-Dist: soundfile==0.14.0; (sys_platform != "android" and platform_machine != "armv7l" and (platform_machine != "ARM64" or sys_platform != "win32") and (platform_machine != "x86_64" or sys_platform != "darwin")) and extra == "kittentts"
Provides-Extra: piper
Requires-Dist: piper-tts==1.8.0; (sys_platform != "android" and platform_machine != "armv7l" and (platform_machine != "ARM64" or sys_platform != "win32") and (platform_machine != "x86_64" or sys_platform != "darwin")) and extra == "piper"
Provides-Extra: modal
Requires-Dist: modal==1.5.5; extra == "modal"
Requires-Dist: cbor2==5.9.0; platform_machine == "armv7l" and extra == "modal"
Provides-Extra: daytona
Requires-Dist: daytona==0.155.0; extra == "daytona"
Provides-Extra: vercel
Requires-Dist: vercel==0.7.2; extra == "vercel"
Provides-Extra: hindsight
Requires-Dist: hindsight-client==0.6.1; extra == "hindsight"
Provides-Extra: google-meet
Requires-Dist: playwright==1.62.0; (sys_platform != "android" and platform_machine != "armv7l" and ((sys_platform in "linux darwin" and platform_machine in "x86_64 aarch64 arm64") or (sys_platform == "win32" and platform_machine in "AMD64 x86_64 ARM64 arm64 x86 i386 i686"))) and extra == "google-meet"
Provides-Extra: messaging
Requires-Dist: python-telegram-bot[webhooks]==22.8; extra == "messaging"
Requires-Dist: discord.py==2.7.1; extra == "messaging"
Requires-Dist: PyNaCl==1.6.2; extra == "messaging"
Requires-Dist: davey==0.1.4; extra == "messaging"
Requires-Dist: aiohttp==3.14.5; extra == "messaging"
Requires-Dist: brotlicffi==1.2.1.0; extra == "messaging"
Requires-Dist: slack-bolt==1.30.0; extra == "messaging"
Requires-Dist: slack-sdk==3.44.1; extra == "messaging"
Requires-Dist: qrcode==7.4.2; extra == "messaging"
Provides-Extra: cron
Provides-Extra: slack
Requires-Dist: slack-bolt==1.30.0; extra == "slack"
Requires-Dist: slack-sdk==3.44.1; extra == "slack"
Requires-Dist: aiohttp==3.14.5; extra == "slack"
Provides-Extra: matrix
Requires-Dist: mautrix[encryption]==0.21.1; sys_platform == "linux" and extra == "matrix"
Requires-Dist: aiosqlite==0.22.1; sys_platform == "linux" and extra == "matrix"
Requires-Dist: asyncpg==0.31.0; sys_platform == "linux" and extra == "matrix"
Requires-Dist: aiohttp-socks==0.11.0; sys_platform == "linux" and extra == "matrix"
Requires-Dist: aiohttp==3.14.5; sys_platform == "linux" and extra == "matrix"
Provides-Extra: wecom
Requires-Dist: defusedxml==0.7.1; extra == "wecom"
Provides-Extra: tts-premium
Requires-Dist: elevenlabs==1.59.0; extra == "tts-premium"
Provides-Extra: voice
Requires-Dist: faster-whisper==1.2.1; (sys_platform != "android" and platform_machine != "armv7l" and (platform_machine != "ARM64" or sys_platform != "win32") and (platform_machine != "x86_64" or platform_system != "Darwin")) and extra == "voice"
Requires-Dist: sounddevice==0.5.5; extra == "voice"
Requires-Dist: numpy==2.4.3; extra == "voice"
Provides-Extra: wake
Requires-Dist: pyopen-wakeword==1.1.0; (sys_platform != "android" and platform_machine != "armv7l" and (platform_machine != "ARM64" or sys_platform != "win32") and (platform_machine != "x86_64" or sys_platform != "darwin")) and extra == "wake"
Requires-Dist: sherpa-onnx==1.13.8; extra == "wake"
Requires-Dist: sherpa-onnx-core==1.13.8; extra == "wake"
Requires-Dist: sentencepiece==0.2.2; extra == "wake"
Requires-Dist: pypinyin==0.55.0; extra == "wake"
Requires-Dist: pvporcupine==4.0.3; extra == "wake"
Requires-Dist: sounddevice==0.5.5; extra == "wake"
Requires-Dist: numpy==2.4.3; extra == "wake"
Provides-Extra: telegram
Requires-Dist: python-telegram-bot[webhooks]==22.8; extra == "telegram"
Provides-Extra: discord
Requires-Dist: discord.py[voice]==2.7.1; extra == "discord"
Provides-Extra: stt-whisper
Requires-Dist: faster-whisper==1.2.1; (sys_platform != "android" and platform_machine != "armv7l" and (platform_machine != "ARM64" or sys_platform != "win32") and (platform_machine != "x86_64" or platform_system != "Darwin")) and extra == "stt-whisper"
Provides-Extra: audio-io
Requires-Dist: sounddevice==0.5.5; extra == "audio-io"
Requires-Dist: numpy==2.4.3; extra == "audio-io"
Provides-Extra: silk
Requires-Dist: pilk==0.2.4; extra == "silk"
Provides-Extra: wake-openwakeword
Requires-Dist: pyopen-wakeword==1.1.0; (sys_platform != "android" and platform_machine != "armv7l" and (platform_machine != "ARM64" or sys_platform != "win32") and (platform_machine != "x86_64" or sys_platform != "darwin")) and extra == "wake-openwakeword"
Provides-Extra: wake-sherpa
Requires-Dist: sherpa-onnx==1.13.8; extra == "wake-sherpa"
Requires-Dist: sherpa-onnx-core==1.13.8; extra == "wake-sherpa"
Requires-Dist: sentencepiece==0.2.2; extra == "wake-sherpa"
Requires-Dist: pypinyin==0.55.0; extra == "wake-sherpa"
Provides-Extra: wake-porcupine
Requires-Dist: pvporcupine==4.0.3; extra == "wake-porcupine"
Provides-Extra: google-chat
Requires-Dist: google-cloud-pubsub==2.39.2; (platform_machine != "ARM64" or sys_platform != "win32") and extra == "google-chat"
Provides-Extra: doc-extract
Requires-Dist: firecrawl-anydoc==0.2.4; extra == "doc-extract"
Provides-Extra: trace-upload
Requires-Dist: huggingface-hub==1.24.0; extra == "trace-upload"
Provides-Extra: honcho
Requires-Dist: honcho-ai==2.2.0; extra == "honcho"
Provides-Extra: supermemory
Requires-Dist: supermemory==3.50.0; extra == "supermemory"
Provides-Extra: mem0
Requires-Dist: mem0ai==2.0.18; (platform_machine != "ARM64" or sys_platform != "win32") and extra == "mem0"
Provides-Extra: vision
Provides-Extra: pty
Provides-Extra: cli
Provides-Extra: mcp
Requires-Dist: mcp==2.3.0; extra == "mcp"
Requires-Dist: httpx2==2.12.0; extra == "mcp"
Requires-Dist: starlette==1.3.1; extra == "mcp"
Provides-Extra: nemo-relay
Provides-Extra: homeassistant
Requires-Dist: aiohttp==3.14.5; extra == "homeassistant"
Provides-Extra: mqtt
Requires-Dist: paho-mqtt==2.1.0; extra == "mqtt"
Provides-Extra: sms
Requires-Dist: aiohttp==3.14.5; extra == "sms"
Provides-Extra: teams
Requires-Dist: microsoft-teams-apps==2.0.13.4; extra == "teams"
Requires-Dist: aiohttp==3.14.5; extra == "teams"
Provides-Extra: computer-use
Requires-Dist: mcp==2.3.0; extra == "computer-use"
Requires-Dist: httpx2==2.12.0; extra == "computer-use"
Requires-Dist: starlette==1.3.1; extra == "computer-use"
Provides-Extra: acp
Requires-Dist: agent-client-protocol==0.9.0; extra == "acp"
Provides-Extra: mistral
Requires-Dist: mistralai==2.10.1; extra == "mistral"
Provides-Extra: otlp
Requires-Dist: opentelemetry-sdk==1.45.1; extra == "otlp"
Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.45.1; extra == "otlp"
Provides-Extra: bedrock
Requires-Dist: boto3==1.42.89; extra == "bedrock"
Provides-Extra: vertex
Requires-Dist: google-auth==2.55.1; extra == "vertex"
Provides-Extra: azure-identity
Requires-Dist: azure-identity==1.25.3; extra == "azure-identity"
Provides-Extra: termux
Requires-Dist: python-telegram-bot[webhooks]==22.8; extra == "termux"
Requires-Dist: hermes-agent-iot[cron]==0.22.5.post3; extra == "termux"
Requires-Dist: hermes-agent-iot[mcp]==0.22.5.post3; extra == "termux"
Requires-Dist: hermes-agent-iot[honcho]==0.22.5.post3; extra == "termux"
Requires-Dist: hermes-agent-iot[acp]==0.22.5.post3; extra == "termux"
Provides-Extra: termux-all
Requires-Dist: hermes-agent-iot[termux]==0.22.5.post3; extra == "termux-all"
Requires-Dist: hermes-agent-iot[google]==0.22.5.post3; extra == "termux-all"
Requires-Dist: hermes-agent-iot[homeassistant]==0.22.5.post3; extra == "termux-all"
Requires-Dist: hermes-agent-iot[sms]==0.22.5.post3; extra == "termux-all"
Requires-Dist: hermes-agent-iot[web]==0.22.5.post3; extra == "termux-all"
Requires-Dist: hermes-agent-iot[pty]==0.22.5.post3; extra == "termux-all"
Provides-Extra: dingtalk
Requires-Dist: dingtalk-stream==0.24.3; extra == "dingtalk"
Requires-Dist: alibabacloud-dingtalk==2.2.42; extra == "dingtalk"
Requires-Dist: qrcode==7.4.2; extra == "dingtalk"
Provides-Extra: feishu
Requires-Dist: lark-oapi==1.6.8; extra == "feishu"
Requires-Dist: qrcode==7.4.2; extra == "feishu"
Provides-Extra: google
Requires-Dist: google-api-python-client==2.194.0; extra == "google"
Requires-Dist: google-auth==2.55.1; extra == "google"
Requires-Dist: google-auth-oauthlib==1.3.1; extra == "google"
Requires-Dist: google-auth-httplib2==0.3.1; extra == "google"
Requires-Dist: httplib2==0.32.0; extra == "google"
Requires-Dist: pyasn1==0.6.5; extra == "google"
Provides-Extra: youtube
Requires-Dist: youtube-transcript-api==1.2.4; extra == "youtube"
Provides-Extra: web
Requires-Dist: fastapi==0.133.1; extra == "web"
Requires-Dist: uvicorn==0.41.0; extra == "web"
Requires-Dist: starlette==1.3.1; extra == "web"
Requires-Dist: python-multipart==0.0.32; extra == "web"
Provides-Extra: all
Requires-Dist: hermes-agent-iot[cron]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[pty]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[mcp]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[uvloop]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[sms]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[acp]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[google]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[web]==0.22.5.post3; extra == "all"
Requires-Dist: hermes-agent-iot[youtube]==0.22.5.post3; extra == "all"
Provides-Extra: minimal
Requires-Dist: hermes-agent-iot[cli,pty]==0.22.5.post3; extra == "minimal"
Provides-Extra: iot
Requires-Dist: hermes-agent-iot[acp,homeassistant,mcp,minimal,mqtt,sms]==0.22.5.post3; extra == "iot"
Provides-Extra: rag
Requires-Dist: hermes-agent-iot[honcho,iot]==0.22.5.post3; extra == "rag"
Provides-Extra: full
Requires-Dist: hermes-agent-iot[all]==0.22.5.post3; extra == "full"
Dynamic: license-file

<p align="center">
  <img src="assets/banner.png" alt="Hermes Agent IoT" width="100%">
</p>

# Hermes Agent IoT

> Lightweight Hermes Agent for Raspberry Pi 2 / ARMv7, MQTT, Home Assistant, robotics, and low-resource edge AI.

<p align="center">
  <a href="https://pypi.org/project/hermes-agent-iot/"><img src="https://img.shields.io/badge/PyPI-hermes--agent--iot-blue?style=for-the-badge" alt="PyPI"></a>
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-green?style=for-the-badge" alt="License: MIT"></a>
  <a href="https://github.com/NousResearch/hermes-agent"><img src="https://img.shields.io/badge/Upstream-NousResearch%2Fhermes--agent-blueviolet?style=for-the-badge" alt="Upstream Hermes Agent"></a>
  <a href="README_PI2.md"><img src="https://img.shields.io/badge/Raspberry%20Pi%202-ARMv7-C51A4A?style=for-the-badge&logo=raspberrypi&logoColor=white" alt="Raspberry Pi 2"></a>
</p>

Hermes Agent IoT is an IoT/robotics-focused fork of [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent). The maintained `pi2-lite` branch focuses on constrained Raspberry Pi and edge deployments while preserving the upstream Hermes Agent runtime and ecosystem.

> **版本與升級注意事項：** 本版識別為 `0.22.5.post3`，使用保留 MIT 署名的獨立 `browser-harness-hermes-compat` 與 Pillow 13 修補。請先確認 [對應 PyPI 版本](https://pypi.org/project/hermes-agent-iot/0.22.5.post3/) 已列出後，再執行下方固定版本安裝；若尚未上架，請使用來源 checkout，不把來源合併或輔助套件上架當成 Hermes 已發布。舊 `0.22.2.post1` 不含這輪安全修補。升級建議使用**全新 venv**，不要混裝官方／獨立 browser distributions；見 [相容性與遷移說明](docs/browser-harness-compat.md) 及 [同步驗證紀錄](docs/upstream-review-v0.22.5.md)。

## 相關影片

- [YouTube Shorts](https://www.youtube.com/shorts/8Nqv4ri6gH8)

## Why Hermes Agent IoT?

- **Raspberry Pi 2 / ARMv7:** verified low-resource installation path for 1 GB-class hardware.
- **IoT profiles:** dependency profiles for MQTT, Home Assistant, MCP/ACP, and remote-first RAG.
- **Edge-first deployment:** keep heavy AI inference remote while the Raspberry Pi handles agent orchestration and device integration.
- **Robotics direction:** foundation for GPIO, I2C, PWM, sensors, actuators, and robotics skills.
- **Upstream-aware:** IoT and ARMv7 compatibility changes are reviewed separately from fast-moving upstream development.

## Quick Start — Raspberry Pi 2

Hermes Agent IoT requires Python `>=3.11,<3.15`. Install it in a virtual environment:

```bash
python3 --version
python3 -m venv ~/.venvs/hermes-iot-0.22.5
source ~/.venvs/hermes-iot-0.22.5/bin/activate
python -m pip install --upgrade pip
python -m pip install 'hermes-agent-iot[minimal]==0.22.5.post3'
python -m pip check

hermes-iot setup --profile minimal
hermes-iot profile show
hermes setup model
hermes
```

> Do not use system pip, `sudo pip`, or `--break-system-packages`.

### Source checkout

Use the maintained `pi2-lite` branch when you need the complete repository assets:

```bash
git clone --branch pi2-lite --depth 1 \
  https://github.com/matttest0080-prog/hermes-agent-iot.git
cd hermes-agent-iot
bash setup-pi2-minimal.sh --profile minimal
source ~/.hermes-venv/bin/activate
hermes setup model
hermes
```

> Keep the clone directory. The source installer uses an editable Python installation, so moving or deleting the checkout can break the environment.

## Install Profiles

| Profile | Intended target |
| --- | --- |
| `minimal` | Raspberry Pi 2 / ARMv7 / 1 GB baseline |
| `iot` | MQTT, Home Assistant, MCP/ACP and related IoT integrations |
| `rag` | IoT plus Honcho / remote-first RAG |
| `full` | Stronger Raspberry Pi, ARM64, x86 edge server or VM |
| `dev` | Contributor and development systems |

Keep the PyPI extra and setup profile aligned. For example:

```bash
python -m pip install 'hermes-agent-iot[iot]==0.22.5.post3'
hermes-iot setup --profile iot
```

`full` and `dev` are not recommended for Raspberry Pi 2 / 1 GB systems.

## Project Status

| Capability | Status |
| --- | --- |
| Raspberry Pi 2 / ARMv7 minimal install | ✅ Verified |
| Public PyPI package | ✅ Available |
| Minimal dependency profile | ✅ Available |
| IoT dependency profile | ✅ Available |
| MQTT integration | ✅ Available |
| Home Assistant integration | ✅ Available |
| Remote-first RAG | ✅ Available |
| Robotics documentation | ✅ Available |
| GPIO abstraction | 🛠 Roadmap |
| I2C device layer | 🛠 Roadmap |
| PWM / servo control | 🛠 Roadmap |
| Sensor plugin framework | 🛠 Roadmap |
| ESP32 MQTT bridge | 🛠 Roadmap |

## Documentation

- [IoT Project Overview](IOT_PROJECT.md) — project goals, support status, profiles, and roadmap.
- [Raspberry Pi 2 Quick Start](README_PI2.md) — dependency matrix, configuration profiles, and Pi2 safety guidance.
- [Raspberry Pi 2 Manual](RASPBERRY_PI2_MANUAL.md) — detailed Pi2 deployment documentation.
- [Robotics](ROBOTICS.md) — robotics integration notes.
- [Security Policy](SECURITY.md) — vulnerability reporting and security guidance.
- [Upstream Hermes Agent documentation](https://hermes-agent.nousresearch.com/docs/) — general Hermes Agent features, providers, gateways, desktop/server usage, and integrations.

## Upstream vs Hermes Agent IoT

| Area | Upstream Hermes Agent | Hermes Agent IoT |
| --- | --- | --- |
| General desktop/server agent | Primary target | Uses upstream foundation |
| Raspberry Pi 2 / ARMv7 | Not primary target | Primary compatibility target |
| 1 GB-class minimal profile | General dependency model | Dedicated `minimal` profile |
| MQTT / Home Assistant deployment | General integrations | Dedicated `iot` profile |
| Low-resource edge deployment | General runtime | Primary fork focus |
| Robotics | General agent scope | IoT/robotics-oriented documentation and roadmap |

This fork may intentionally lag upstream `main` while dependency changes, IoT patches, and ARMv7 compatibility are reviewed and validated. For general desktop/server Hermes Agent usage, prefer the upstream project.

## 發行與驗證紀錄

- 本版 package／tag 識別：`hermes-agent-iot 0.22.5.post3`／`iot-v0.22.5.post3`。
- [PyPI 對應版本與正式檔案雜湊](https://pypi.org/project/hermes-agent-iot/0.22.5.post3/#files)／[GitHub release 與 tag](https://github.com/matttest0080-prog/hermes-agent-iot/releases/tag/iot-v0.22.5.post3)。是否已發行以實際頁面與 CI 為準，不以此來源文件取代發布證據。
- Pi 2B 實機基準：Rev 1.1、ARMv7、921 MiB RAM、Python 3.13.5。本輪 registry 相容依賴的隔離候選完成五 profiles hash 解析、正常 minimal 安裝與 `pip check`、10 項 installed-wheel smoke、12 項 SQLite deadline／逐 byte 回滾控制。五個 profiles 不等於全都已實裝；localhost fixture 不是實際模型、MQTT／HA 或長期負載驗收。
- 從舊版升級請使用前述新 venv，保留舊環境與服務供回復。`pip install --upgrade` 不一定移除舊 orphan `browser-harness`，混裝會造成 Pillow 要求衝突或同名模組互相覆寫。

### 歷史已發布驗證：0.22.2.post1

以下保留舊版 receipt，**不是 0.22.5.post3 的 artifact 或安全驗證**：

- PyPI: [`hermes-agent-iot 0.22.2.post1`](https://pypi.org/project/hermes-agent-iot/0.22.2.post1/)
- Tag: `iot-v0.22.2.post1`
- Commit: `2c08f4ec97445d8f26ab5c35515b2f94652aaddf`
- Wheel: `hermes_agent_iot-0.22.2.post1-py3-none-any.whl`
- Wheel SHA-256: `e46b7049940f14928d0dd014f44494126faca261363e9240fa700fb84d13fd8f`
- Workflow: https://github.com/matttest0080-prog/hermes-agent-iot/actions/runs/39356318990
- Python: `>=3.11,<3.15`
- Physical validation: Raspberry Pi 2 Model B Rev 1.1, 32-bit ARMv7, 921 MiB RAM, Python 3.13.5

The `minimal` wheel baseline was clean-installed from public PyPI on physical Raspberry Pi 2 hardware on 2026-10-20: `pip check` clean, `hermes --version` = 0.22.2.post1, wheel SHA-256 matched, and a one-shot agent turn returned `PI2-OK` in 81.6 s using a remote model over SSH. That verifies the Pi 2 client/runtime path, not local inference on the Pi. Heavier optional extras require hardware appropriate to their dependency set.

## Updating a Pi2 Source Installation

Always keep updates pinned to the `pi2-lite` branch:

```bash
cd ~/hermes-agent-iot
source ~/.hermes-venv/bin/activate

git status --short
git switch pi2-lite
git fetch origin pi2-lite
git merge --ff-only origin/pi2-lite

bash setup-pi2-minimal.sh --profile minimal
```

Replace `minimal` with the profile originally installed. In IoT release 0.20.4
and later, a bare `hermes update` detects the `hermes-agent-iot` distribution
and defaults to `pi2-lite`; an explicit `--branch pi2-lite` remains useful in
automation for auditability. Rerun the profile installer after a source update.

## Roadmap

- [x] Raspberry Pi 2 / ARMv7 installation path
- [x] Low-resource dependency profile
- [x] IoT dependency profile
- [x] MQTT / Home Assistant integration path
- [x] Public PyPI package
- [x] Physical Raspberry Pi 2 validation
- [ ] GPIO abstraction
- [ ] I2C device abstraction
- [ ] PWM / servo control
- [ ] Sensor plugin framework
- [ ] Robotics skill framework
- [ ] ESP32 MQTT bridge
- [ ] Raspberry Pi 3 / 4 / 5 validation matrix

## Upstream Desktop / Server Installation

Hermes Agent IoT is primarily for Raspberry Pi and edge deployments. For general desktop or server use, install the upstream Hermes Agent.

### Windows (native PowerShell)

```powershell
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
```

The source installer delegates Python 3.14, Node.js, npm, ripgrep, FFmpeg,
and Python dependencies to PM. If Git is absent, it stages the verified Git
for Windows archive in Hermes' tool store. It does not replace your system Git.
See [installation methods](https://hermes-agent.nousresearch.com/docs/getting-started/installation)
for the separate MSIX/App Installer package and its update ownership.

### Linux / macOS / WSL2

```bash
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
```

> **Android / Termux:** A signed APT repository is available for aarch64 devices, with a `stable` channel (tagged releases) and a prerelease `canary` channel. The package includes Python, Node.js, and the TUI. Use the [Termux guide](https://hermes-agent.nousresearch.com/docs/getting-started/termux), not the desktop/server installer script.

These upstream installers do not install this fork's Pi2-specific profiles or IoT packaging.

## About Hermes Agent

Hermes Agent is the self-improving AI agent developed by [Nous Research](https://nousresearch.com). It provides a terminal interface, persistent learning and memory, scheduled automations, subagents, multiple execution backends, messaging gateways, and support for multiple LLM providers.

Hermes Agent IoT does not replace the upstream project. It adapts that foundation for Raspberry Pi 2, ARMv7, low-resource edge nodes, MQTT/Home Assistant environments, and future robotics integrations.

## License and Attribution

Hermes Agent IoT is derived from [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent) and follows this repository's [MIT License](LICENSE). Preserve upstream copyright and attribution when redistributing derived work.
