llm-sessions-app

Hands-free voice control of your agent fleet through llm-sessions.

Ask the agent fleet how it's doing. Out loud.

LLM toolingAndroid appKotlin, Jetpack Compose, JVM

What it is

A voice client for llm-sessions. I ask about my coding-agent fleet out loud; a model answers by calling the llm-sessions serve API as tools and speaks the result back. It is an Android app plus a Linux desktop CLI over the same JVM core.

It is read-only: it reports on agents, it does not control them.

How it works

There are two voice engines. Cascade, the default, chains on-device speech recognition, a text model with tool calling and platform text-to-speech; on Gemini that is about 0.05¢ a question. Gemini Live does speech in and out through Gemini; it sounds more natural and costs about 1–1.5¢ a question.

The cascade's text, transcription and summary models can each run on their own provider: any OpenAI-compatible Chat Completions API (OpenAI, OpenRouter, Groq, DeepSeek, Mistral, Ollama, LM Studio, llama.cpp, vLLM) or a Gemini API proxy. A Gemini key is only needed when something actually runs on Gemini.

AreaDetails
Fleet toolsserver status, list/search sessions, session details, transcripts, workspaces, usage, live status, follow/unfollow with spoken status changes
Hands-freebarge-in, runs with the screen off as a foreground service, idle reset with an optional summary to keep context costs flat
Serversseveral serve instances, each checked for address and token
Costsper-answer and per-session cost and token counts
Desktoptyped questions, mic, or global push-to-talk on Linux

serve has no TLS; the app allows cleartext HTTP for LAN or Tailscale addresses, and wants a TLS reverse proxy anywhere else.

Build and run

Needs llm-sessions v0.4.0+, JDK 17 and the Android SDK. The app runs on Android 8.0+; offline recognition needs Android 13+.

# On the agent machine
LLMS_TOKEN=$(openssl rand -hex 32) llm-sessions serve --bind 0.0.0.0:8787

# In this repo
./gradlew :app:assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apk

Without any key, ./gradlew :mockloop:run runs the real loop against a scripted Gemini Live server. The desktop CLI reads its config from the environment or .env: make run for typed questions, make ptt for push-to-talk.