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.
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.
|
|
| 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]" |
| 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 |
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.
/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
@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
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 nurcore-commonimportieren. Cross-Modul-Wiring läuft über Interfaces oderapp/.
# 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.
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=localDer 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).
| 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 | 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
Copyright © 2024–2026 Christopher Bott (Labushuya | MindsourcesDOTnet). Alle Rechte vorbehalten.
Siehe LICENSE für Details.
