Inference 3.21 — Android

Android replica of the desktop Inference.py client.
Endpoint is preconfigured:
https://152-44-32-243.nip.io:8081/v1

⬇ Download & install inference-3.21.apk

Since 3.16: live voice-to-voice conversation — tap 🎤 once and the phone keeps the conversation going like a phone call: you speak, the model's reply is spoken back, and the phone listens for your next sentence automatically (no re-tapping). While it's listening the button shows 🎙, while the AI is speaking or thinking it shows ⏹ (tap to interrupt it / stop the answer), and while waiting it shows ⏸ — tap at any time to end the conversation. Silence is just a pause; a dead mic ends the session with a message. 3.15: live talk — tap 🎤 (next to the send button) and speak; the transcript sends exactly like a typed message (an attached photo is included). The model's final reply is then spoken back on your device (code blocks and other markdown are never read aloud); tap 🎤 while it's talking to stop it (barge-in), or ⋯ → Voice replies to switch speaking off. The first tap asks for the microphone permission. 3.14: fixes the “I can’t see the photo” reply — the agent's history pipeline was stripping the attached picture before sending, so the model only ever received the caption; the photo now stays attached for the whole conversation (image-only messages included). 3.13: fixes photo attach — camera pictures now load (3.12 wrongly rejected every image); pictures are also sent in their camera orientation (not sideways), and HEIF photos (the “high efficiency” format some cameras save) are now readable on recent Android. 3.12: image understanding — tap 📷 to attach a photo (or “Share…” an image from any other app into Inference) and the hosted vision model answers about it: colors, shapes, text, diagrams, photos. The picture shows as a thumbnail in the chat and survives restarts; image-only messages are allowed; if the current model can’t see images the app says so before sending instead of failing. 3.11: fixes the 500 error on agent tool calls — the model server's chat template requires tool arguments in a different format than the OpenAI standard; the app now sends what the server expects (same handling as the desktop client), so the agent's tool loop works again. 3.10: the tools key now configures itself — install or update, and the app fetches the current tools key automatically (the bootstrap token is preconfigured in this build, and the key re-fetches itself after every scheduled rotation). No setup step, no pasting anything. 3.9: ⚙ Settings… lives in the ⋯ menu and the top-bar buttons no longer overflow on portrait screens. 3.8: full security-audit release — tool calls ask for approval by default (opt back into full-auto with ⋯ → ⚙ Settings… → Auto-approve tools); the Stop button now reliably stops every in-flight request and never writes into a switched or cleared transcript; chat history is saved atomically (a mid-write crash can no longer corrupt it — the previous save is kept as an automatic backup); the Settings screen no longer overwrites a custom endpoint on every open; the ⋯ → Terminal screen auto-reconnects when a session dies; the to-do list now behaves exactly like the desktop (no more junk lists from name typos). Same signing key — install straight over any 3.x (in-place update, chats kept). Includes 3.7/3.6/3.5 (in-app update checker), 3.4 (live filesystem view with per-tool green/red diff accounting), 3.3 (hardened tools server, key rotation), 3.2 (loop detection, X-Tools-Key) and 3.1 (auto-approve, ⋯ → Terminal): full 3.0 feature set — streaming with stop · multi-conversation · per-message copy / regenerate / edit & resend · markdown-lite with click-to-copy code · model picker · agent tools (20-tool suite + shell) · thinking display · tool activity · Markdown export · status bar.

Already on 3.7–3.15? You do not need this file — the app's built-in update checker offers 3.21 automatically at startup (or ⋯ → Check for updates). The conversation loop works from the next launch after the update; allow the microphone prompt the first time you tap 🎤.

From a 1.x/2.x install: uninstall first (old key was lost).