Reachy_OpenWebUI / README.md
Jacid23's picture
Upload 344 files
cf1f373 verified
|
Raw
History Blame Contribute Delete
9.98 kB

A newer version of the Gradio SDK is available: 6.22.0

Upgrade
metadata
title: Reachy OpenWebUI
emoji: 🐞
colorFrom: gray
colorTo: blue
sdk: gradio
app_file: app.py
pinned: false
short_description: Phone-style OpenWebUI conversations for Reachy Mini.
tags:
  - reachy_mini
  - reachy_mini_python_app
sdk_version: 6.18.0
license: apache-2.0

Reachy OpenWebUI icon

Reachy OpenWebUI

Reachy OpenWebUI is a phone-style conversation app for Reachy Mini. OpenWebUI owns the model, transcription, chat behavior, user context, and TTS. This app owns the robot-side runtime: settings, no-wake-word listening, camera buffering, local Reachy tools, avatars, chat state, and motion.

This Hugging Face Space is a project page. The real app runs inside the Reachy Mini app environment where it can access the robot daemon, microphone, speaker, camera, and movement APIs.

Highlights

  • Phone-inspired settings and conversation UI served by the Reachy Mini app webserver.
  • OpenWebUI model/workspace picker shown as contacts.
  • OpenWebUI conversation list support for returning to saved chats.
  • Model and user avatar proxying from OpenWebUI profile image endpoints.
  • No-wake-word voice loop using Reachy audio, Silero VAD, OpenWebUI STT, OpenWebUI chat, and OpenWebUI TTS.
  • Sentence-by-sentence speech streaming so audio starts before the full model answer is finished.
  • Reachy-side tools for dance, recorded emotions, camera, head tracking, head movement, and speech.
  • Speech-reactive head motion blended with queued robot moves.
  • Robot attitudes that can shape idle motion, speaking motion, and which dance/emotion moves the model can choose.

Runtime Flow

Reachy microphone
  -> audio startup tuning and SDK record loop
  -> Silero VAD and level fallback
  -> OpenWebUI audio transcription
  -> OpenWebUI chat stream with optional Reachy tool specs
  -> optional Reachy-side tool execution
  -> OpenWebUI speech
  -> Reachy speaker output plus speech-reactive motion

OpenWebUI may accept requests at /api/chat/completions while returning either classic chat-completion chunks (chat.completion.chunk) or Responses-style events (response.output_text.delta, response.output_text.done, response.completed). The runtime reader must support both formats because the selected OpenWebUI model/contact can route through different providers even when the model id shown in the UI is unchanged.

Install

This repo currently has no uv.lock, so do not use uv sync --frozen.

uv venv --python python3.12 .venv
source .venv/bin/activate
uv sync

Editable pip install:

python -m venv .venv
source .venv/bin/activate
pip install -e .

Optional local vision extra:

uv sync --extra local_vision
pip install -e .[local_vision]

Developer tools:

uv sync --group dev

requirements.txt is only for this Hugging Face Space project page. The robot app dependencies live in pyproject.toml.

Configuration

The app reads ~/.config/settings/.env first, then a local .env if present. The settings UI writes the stable file at ~/.config/settings/.env.

Core OpenWebUI settings:

Variable Purpose
OPENWEBUI_URL OpenWebUI base URL. Values ending in /api are accepted.
OPENWEB_LOADED_LLM Selected OpenWebUI model, workspace, or contact id.
OPENWEBUI_API_KEY API key for HTTP requests when your OpenWebUI server accepts API-key bearer auth.
OPENWEBUI_TOKEN Browser/session JWT. Preferred for chat, Socket.IO, transcription, and speech.
OPENWEBUI_CHAT_ID Saved OpenWebUI chat id. Leave blank on first launch.
MIC_GAIN Digital gain applied before VAD and transcription upload.
HF_HOME Hugging Face cache directory.
HF_TOKEN Optional token for gated or private assets.

User/context variables sent to OpenWebUI:

Variable Purpose
OPENWEBUI_USER_ID Optional user id. If blank, the app tries to derive it from the JWT.
OPENWEBUI_USER_NAME User name supplied to OpenWebUI variables and socket context.
OPENWEBUI_USER_EMAIL User email supplied to OpenWebUI variables and socket context.
OPENWEBUI_USER_LANGUAGE User language variable.
OPENWEBUI_USER_LOCATION User location variable.
OPENWEBUI_USER_TIMEZONE User timezone variable.

Audio and timing settings:

Variable Purpose
OPENWEBUI_TTS_READ_TIMEOUT Read timeout for OpenWebUI speech responses.
OPENWEBUI_CONVERSATION_IDLE_RESET_SECONDS Optional idle reset. 0 disables it.
VAD_THRESHOLD Silero speech probability threshold.
VAD_FALLBACK_THRESHOLD RMS fallback threshold.
VAD_SPEECH_ONSET_CHUNKS Speech chunks required before a turn starts.
VAD_SILENCE_END_CHUNKS Silence chunks required before a turn ends.
VAD_MIN_SPEECH_CHUNKS Minimum speech chunks before sending audio to OpenWebUI transcription.
SILERO_VAD_ONNX_PATH Optional path for the Silero ONNX model.

TTS Voices

Set TTS voices in OpenWebUI. This app reads the selected model/contact voice metadata and sends that voice back to the OpenWebUI speech endpoint.

If a model/contact has no voice set in OpenWebUI, the app sends no voice value and lets OpenWebUI use its default TTS behavior. There is intentionally no app-level voice picker because every OpenWebUI install can expose different TTS engines and voice names.

Running

The normal runtime path is the Reachy Mini Apps launcher. It provides the FastAPI settings app and serves the phone UI declared by:

custom_app_url = "http://0.0.0.0:7860/"

Console entry point:

reachy-mini-conversation-app-openwebui

CLI options:

Option Default Description
--no-camera False Skip camera frame buffering.
--smolvlm False Try to initialize the optional local SmolVLM vision manager.
--robot-name <name> None Connect to a daemon started with the same robot name.
--debug False Enable verbose app logging.

Settings UI

The phone-style UI lives in src/Reachy_OpenWebUI/static/.

It includes:

  • Power-on screen while the backend is getting ready.
  • Home screen with contacts, conversations, quick connect, and settings.
  • Contacts page backed by OpenWebUI models.
  • Conversations page backed by OpenWebUI chat history.
  • Call screen with transcript bubbles, typing indicators, model avatar, user avatar, mute, end call, and back navigation.
  • Settings for OpenWebUI URL, model/contact, credentials, mic gain, vision-only contacts, attitude, and Reachy-side tools.

Tools

Default Reachy-side tool allow-list:

src/Reachy_OpenWebUI/profiles/default/tools.txt

Enabled by default:

Tool Behavior
dance Queue a named or random dance from reachy_mini_dances_library.
stop_dance Clear the dance queue.
play_emotion Queue a recorded emotion from reachy-mini-emotions-library.
stop_emotion Clear the emotion queue.
camera Read the latest buffered camera frame and pass it to an optional vision manager.
idle_do_nothing Explicit idle no-op for idle turns.
head_tracking Attempt to toggle camera-worker head tracking.
move_head Queue a head pose change: left, right, up, down, or front.
speak Send text through the same OpenWebUI speech path used by normal assistant responses.

The settings page can enable or disable Reachy-side tools. OpenWebUI tools are still managed in OpenWebUI.

Attitudes

Attitude is one user-facing movement setting. It is designed to control:

  • idle motion
  • speech-reactive motion
  • which dance and emotion moves are offered to the model

The goal is simple: a serious model should not move like a silly one, and a playful model should not be stuck with the same tiny idle pattern as a formal one.

Chat State

OpenWebUI chat state is stored in the stable settings file and recorded in:

~/.config/settings/openwebui_chat_history.json

The conversation window rolls over at local 7 AM. Callback and conversation selection clear or replace the saved chat id so OpenWebUI can attach the next turn to the right conversation.

Vision Status

Camera frame buffering is bundled and enabled unless --no-camera is passed. The optional local vision manager expects Reachy_OpenWebUI.vision.processors, which is not present in this checkout. If that module is absent, startup logs a warning and the camera tool returns an unavailable-vision error.

Project Layout

app.py                                    Hugging Face Space project page
pyproject.toml                            package metadata, dependencies, app entry points
requirements.txt                          Space-only dependency file
src/Reachy_OpenWebUI/main.py              Reachy Mini App entry point
src/Reachy_OpenWebUI/console.py           settings routes and media loop
src/Reachy_OpenWebUI/local/               OpenWebUI chat, speech, transcription, VAD
src/Reachy_OpenWebUI/tools/               Reachy-side tools
src/Reachy_OpenWebUI/static/              phone-style UI
src/Reachy_OpenWebUI/profiles/default/    default tool allow-list
external_content/                         starter external profile/tool examples

Development Checks

Run the checks available in this checkout:

uv run ruff check .
uv run ruff format . --check
uv run mypy --pretty --show-error-codes
uv run python -m compileall src app.py

There is no tests/ directory in this checkout. Add focused tests when adding behavior that can be tested off-robot.

License

Apache 2.0