Skip to content

Labushuya/so-mi

Repository files navigation

So-Mi

So-Mi — Offline-First Android-Assistentin

Persönliche KI. Vollständig lokal. Kein Account. Keine Cloud.

Version Platform License Phase LLM Build Kotlin Compose NDK Privacy


Persönlichkeit angelehnt an Songbird / So-Mi aus Cyberpunk 2077: Phantom Liberty — als tägliche Begleiterin, nicht als 1:1-Kopie. Deutsche Primärsprache mit Englisch/Koreanisch-Codeswitching.


Was ist So-Mi?

So-Mi ist eine offline-first Android-App die ein lokales Sprachmodell direkt auf deinem Gerät ausführt. Gespräche, Erinnerungen, Persönlichkeit — alles bleibt auf dem Gerät. Keine Nutzerdaten verlassen das Handy, außer du nutzt explizit Online-Tools wie Web-Suche oder Wetter.

Zielgerät: HONOR Magic V2 (16 GB RAM)
Verteilung: Sideload via GitHub Releases
Keine Play-Store-Veröffentlichung geplant.


Features

🧠 Lokales LLM

  • llama.cpp via ARM InferenceEngine (NDK r27, arm64-v8a)
  • Standardmodell: Qwen2.5 7B Q4_K_M (~4.5 GB)
  • Optional: Mistral-Nemo 12B, weitere GGUF-Modelle
  • Sliding-Window Gesprächskontext (14 Nachrichten)
  • Glitch-Shader-Effekte, immersiver Vollbild-Modus

💾 Gedächtnis & RAG

  • /merke Ich bin SRE #Arbeit cloud,sre → gespeichert in Kategorie "Arbeit"
  • Inline-Kategorie mit #Tag + Keywords kw1,kw2 — neue Kategorien auto-erstellt
  • LLM-gestützte Faktklassifizierung (Personen / Vorlieben / Termine / Technik / Notizen)
  • HNSW-Vektorsuche (ObjectBox + 384-dim-Embedder)
  • 50+ natürlichsprachliche Trigger: "Das ist wichtig:", "FYI:", "Ach ja:" etc.
  • Strukturiertes Gedächtnis (OKF): YAML-Frontmatter, automatische Entitäts-Extraktion, 1-Hop Graph-Recall
  • Supersedes-Semantik: Widersprüche erkennen — ähnliche Fakten werden überschrieben statt abgelehnt

🎙 Voice

  • Spracheingabe via Android SpeechRecognizer (de-DE, kein Modell-Download)
  • Mikrofon-Button im Composer — Ergebnis ins Textfeld zur Kontrolle vor dem Senden
  • Sprachausgabe (Piper TTS): 🔊-Button an jeder Antwort + Auto-Vorlesen + 3 Stimmen wählbar (Eva K / Kerstin / Ramona)
  • So-Mi Originalstimme (Cyberpunk 2077) — aufgeschoben, erfordert eigenes Audiomaterial für Piper-Training

🛠 Tool-System

  • 11 aktive Tools, jedes einzeln de-/aktivierbar
  • Tool-Routing via Regex (50+ Patterns pro Tool)
  • Klarer Hinweis wenn ein Tool deaktiviert ist

💬 Chat & UI

  • Multi-Chat: mehrere Gespräche, umbenennen / archivieren
  • Slash-Commands mit Autocomplete: /merke, /suche, /umbenennen, /leeren
  • Status-Bänder (Error / Warning / Success / Info)
  • Backup & Import als ZIP (Erinnerungen + Chat-Verlauf)

🔄 In-App-Updater

  • Update-Banner beim Start, manueller Check in Einstellungen → Diagnose
  • DownloadManager-basiert: kein Browser-Umweg, direkte PackageInstaller-Integration

🔒 Datenschutz

  • 100 % lokale Verarbeitung — standardmäßig kein Netzwerk
  • Keine Telemetrie, kein Analytics, kein Crashlytics
  • Claude API optional, hinter BiometricPrompt gesichert

Tool-Übersicht

Tool Beschreibung Trigger-Beispiele
🌤 get_weather Wetter via Open-Meteo (kein Key) "Wetter morgen in Berlin", "Wetter am Wochenende"
🔍 search_web Web-Suche via SearXNG (kein Key) "@web EU AI Act aktuell"
🧠 search_memory Eigene Erinnerungen semantisch suchen "@erinnerung Familie", "Was weißt du über mich?"
set_alarm Alarm / Benachrichtigung setzen "Erinner mich in 20 Minuten"
💱 get_exchange_rate Echtzeit-Wechselkurse "Wie viel sind 100 EUR in USD?"
📰 news_briefing RSS-Feeds (Tagesschau, Spiegel, Heise) "@news", "Aktuelle Nachrichten"
📅 read_calendar Google Kalender & Systemkalender "Zeig meine Termine diese Woche"
create_event Kalendertermin anlegen "Meeting morgen 14 Uhr eintragen"
🔎 search_notes Notizen semantisch durchsuchen "@notizen Rezept", "Meine Notizen zu Kotlin"
📝 save_note Notiz speichern "Notiz: [Text]", "Schreib auf: [Text]"
📋 summarize Text lokal zusammenfassen "TL;DR: [langer Text]", "@zusammenfassung [Text]"

Technologie-Stack

Schicht Technologie
LLM llama.cpp · ARM InferenceEngine · Qwen2.5 7B Q4_K_M
Embedding paraphrase-multilingual-MiniLM-L12-v2 · ONNX Runtime 1.18
Vektorspeicher ObjectBox 4.0.3 · HNSW-Index (384 dim, Cosine)
Persistenz Room 2.7 (SQLite WAL) · DataStore · EncryptedSharedPreferences
UI Jetpack Compose · Material3 · GLSL Glitch-Shader
DI Hilt 2.52 · KSP
Build AGP 8.5.2 · Kotlin 2.0.21 · NDK r27 · Gradle 8.10
CI/CD GitHub Actions · release-please · apksigner

Command-Referenz

So-Mi nutzt eine einheitliche Command-Sprache: / für App-Funktionen, @ für Tools. Beide mit Smart-Autocomplete und Syntax-Hints im Textfeld. Spracheingabe via 🎤-Button im Composer.

/ — App-Funktionen (kein LLM-Call)

/merke [fakt] #Kategorie kw1,kw2   Fakt speichern · Kategorie + Keywords optional
/merke Ich bin SRE #Arbeit cloud   → In "Arbeit" gespeichert, Keyword "cloud" eingetragen
/merke Ich spiele Gitarre #Hobby   → Neue Kategorie "Hobby" wird automatisch erstellt

/suche [Begriff]                   Nachrichten im Chat durchsuchen
/umbenennen                        Gespräch umbenennen
/archivieren                       Gespräch ausblenden
/leeren                            Alle Nachrichten löschen

@ — Tool-Aufrufe (LLM verarbeitet das Ergebnis)

@wetter [Ort]                      @wetter Berlin morgen
@web [Anfrage]                     @web KI-Regulierung 2026
@alarm [Zeit] [Text]               @alarm 15min Fenster schließen
@kurs [Anfrage]                    @kurs 250 EUR in USD
@news                              Aktuelle Nachrichten (Tagesschau, Spiegel, Heise)
@kalender [Zeitraum]               @kalender diese Woche
@termin [Titel] [Zeit]             @termin Meeting morgen 14 Uhr
@erinnerung [Begriff]              Erinnerungen semantisch suchen
@notizen [Begriff]                 Notizen durchsuchen
@zusammenfassung [Text]            Text lokal zusammenfassen

Architektur

android/
├── app/               Compose UI · Navigation · ViewModels · Hilt-Wiring
│                      Voice: VoiceInputHelper (SpeechRecognizer) · TtsHelper (Piper TTS)
├── core-llm/          LlamaContext Interface
├── core-llm-llama/    ARM InferenceEngine JNI-Wrapper (NDK, llama.cpp)
├── core-rag/          ObjectBox HNSW · ONNX Embedder · RagOrchestrator
│                      OKF-Memory: FrontmatterWriter · EntityExtractor · RelationIndex
├── core-tools/        Tool-Router (Regex) · 11 Tools
├── core-voice/        Piper TTS (sherpa-onnx) · 3 deutsche Stimmen wählbar
├── core-data/         Room · DataStore · BackupManager · StorageRoots
├── core-ui/           ChatViewModel · Slash-Commands · RAG-Integration
└── core-common/       Shared Interfaces (TextEmbedder · MemorySearchPort · LlmCaller)

soul/soul.md           Persönlichkeit — fester System-Prefix, nie via RAG
keystore/ci.keystore   CI-Signatur (öffentlich committed — Sideload, Update-Kontinuität)

Modul-Regel: core-* darf nur core-common importieren. Cross-Modul-Wiring läuft über Interfaces oder app/.


Installation

# 1. APK herunterladen
# → github.com/Labushuya/so-mi/releases/latest → app-release.apk

# 2. Auf Android: Unbekannte Quellen erlauben → APK tippen

# 3. Beim ersten Start: Benachrichtigungs-, Kalender- & Mikrofon-Berechtigung erlauben

# 4. Modell laden: Settings → Modelle → Qwen2.5 7B (WLAN empfohlen, ~4.5 GB)

Updates werden automatisch via In-App-Banner angezeigt — tippe "⬆ Installieren" und So-Mi lädt die neue APK direkt herunter.


Lokal bauen

git clone https://github.com/Labushuya/so-mi
cd so-mi/android

# SDK-Pfad setzen
echo "sdk.dir=/path/to/Android/Sdk" > local.properties

# Debug-Build
./gradlew :app:assembleDebug

# Release-Build (versionCode höher als installierte Version)
./gradlew :app:assembleRelease -PversionCode=99999 -PversionName=local

Der Release-Build verwendet keystore/ci.keystore mit dem öffentlichen Passwort ci-password-public — bewusst im Klartext, da Sideload-only und Update-Kontinuität wichtiger ist als Signing-Geheimhaltung (siehe SPEC.md §5).


Roadmap

Phase Stand Details
Phase 0–2: Bootstrap, Pipeline, LLM + Chat ✅ Abgeschlossen
Phase 3: RAG + Persona-Memory ✅ Abgeschlossen HNSW, Backfill, Multi-Chat, Backup
Phase 4: Tool-System + OKF-Memory ✅ Abgeschlossen 11 Tools · YAML-Frontmatter · Graph-Recall · Supersedes
Phase 5: In-App-Updater ✅ Abgeschlossen DownloadManager · PackageInstaller · Update-Banner
Phase 5: Voice-Eingabe ✅ Abgeschlossen SpeechRecognizer (de-DE) · Mikrofon-Button
Phase 5: TTS Placeholder ✅ Abgeschlossen 🔊-Button · Auto-Vorlesen · Android TTS
Phase 5: Piper TTS ⚠️ Deaktiviert Memory-Conflict mit llama.cpp — Re-Implementierung mit Prozess-Isolation geplant
Phase 5: So-Mi Originalstimme ❌ Aufgeschoben Piper-Training auf Spielaudio — erfordert eigenes Audiomaterial
Phase 6: Performance + Ladebalken 🟡 In Arbeit Ladebalken ✓ · KV-Cache Warmup bereits aktiv · Piper TTS Prozess-Isolation

→ Detaillierter Fortschritt: ROADMAP.md


Lizenz

Copyright © 2024–2026 Christopher Bott (Labushuya | MindsourcesDOTnet). Alle Rechte vorbehalten.
Siehe LICENSE für Details.


So-Mi ist ein persönliches Sideload-Projekt · Kein Play-Store · Kein Support-Versprechen

About

Personal AI Assistant local-first offline LLM + RAG + KIWIX + soul.md + Extending knowledge

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors