智能家居语音助手

hassAIClient是一款为Home Assistant用户设计的现代Android语音助手,通过MCP兼容的中继从OpenRouter流式传输响应,默认使用Gemini Flash 2.5模型。

  • by FreedomCoder-dev
  • Kotlin
  • 本地部署
  • 更新于
在 GitHub 查看 FreedomCoder-dev/hassAIClient

使用说明

hassAIClient 可以翻译为“HASS AI 客户端”或“HASS 人工智能客户端”,具体取决于上下文和该客户端的具体功能或用途。这里,“hass”可能代表某个特定的系统、平台或项目名称,而“AIClient”则表明这是一个用于与人工智能交互的客户端

为Home Assistant用户打造的现代Android助手体验,依托兼容MCP的继电器,默认通过OpenRouter流式传输Gemini Flash 2.5的响应。

项目结构

  • android/ – 一个使用Jetpack Compose开发的Android应用程序,注册为助手并可通过电源键启动。用户界面默认开启语音捕捉功能,实时流式传输响应,并在每个会话中持久化对话上下文。
  • backend/ – 一个FastAPI服务器,用于中介聊天请求到OpenRouter,并通过SSE(Server-Sent Events)附加一个Home Assistant MCP(可能是指某种中间件或控制协议)服务器 fastmcp.

Android 客户端

  • 使用Android Gradle插件8.6、Kotlin 2.0和Material 3 Compose UI构建。
  • 实现了一个 VoiceInteractionService 因此,它可以被设置为系统助手(长按电源键)。
  • 默认情况下,语音捕捉已通过(某种方式或设置)开启 SpeechRecognizer部分转录内容会自动填充到文本编辑器中。
  • 通过服务器发送事件(SSE)从后端流式传输助手令牌,并在聊天布局中逐步渲染它们。

配置

更新 android/app/build.gradle.kts 使用后端URL/令牌,或在运行时通过构建配置字段进行覆盖:

buildConfigField("String", "BACKEND_URL", "\"http://10.0.2.2:8000\"")
buildConfigField("String", "BACKEND_TOKEN", "\"local-demo-token\"")

使用随附的 Gradle 包装器进行构建:

cd android
./gradlew assembleDebug

安装生成的APK文件并进行设置 hassAI 客户端 在系统设置中作为默认助手。

Python 后端

后端暴露了一个单一的 /chat 由承载令牌保护的SSE终端。它

  1. 验证请求令牌。
  2. 将对话转发给OpenRouter(默认模型) google/gemini-2.0-flash-001(别名为Gemini Flash 2.5)。
  3. 在处理工具调用的同时,将数据块流式传输回Android客户端。
  4. 用途 fastmcp 通过SSE(承载认证)连接到Home Assistant MCP服务器,并转发模型触发的任何工具调用。

环境变量

变量 用途
BACKEND_ACCESS_TOKEN 期望从Android客户端接收到令牌(默认值为 local-demo-token)。
OPENROUTER_API_KEY 需要OpenRouter API密钥。
OPENROUTER_MODEL 可选覆盖默认的Gemini Flash模型。
OPENROUTER_BASE_URL 覆盖OpenRouter终端点(默认为 https://openrouter.ai/api/v1)。
OPENROUTER_REFERER / OPENROUTER_TITLE OpenRouter 所需的元数据头部信息。
HOME_ASSISTANT_MCP_URL Home Assistant MCP SSE 端点的 URL。
HOME_ASSISTANT_MCP_TOKEN Home Assistant MCP 的承载令牌。

本地运行

创建一个虚拟环境并安装依赖项:

cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

根据上面的信息,执行如下指令:启动API(需要上述环境变量):

uvicorn main:app --reload --port 8000

Android客户端期望后端在 http://10.0.2.2:8000/chat 在模拟器中运行时。

开发小贴士

  • 后端返回的SSE事件格式为 { "type": "token" | "status" | "complete" | "error", "content": "..." } 以支持流式UI更新。
  • 该应用会持续运行语音捕捉功能,除非麦克风权限被拒绝。点击浮动麦克风图标可重新开始监听。