mana-swift-llm/CHANGELOG.md
2026-06-04 21:44:02 +02:00

88 lines
3.8 KiB
Markdown

# Changelog
Alle Änderungen werden hier dokumentiert. Format orientiert an
[Keep a Changelog](https://keepachangelog.com), Versionierung nach
[Semver](https://semver.org).
## [Unreleased]
## [0.3.0] — 2026-06-04
### Hinzugefügt — BYOK (Bring Your Own Key)
Neue Quelle `LLMBackendID.byok`: der Nutzer hinterlegt einen **eigenen**
Dritt-API-Key (OpenAI / Anthropic / Gemini / Mistral); der Call geht
**direkt vom Gerät** zum Anbieter — der Key berührt mana-Infrastruktur
nie. Symmetrisch zum Web-Pendant `@mana/browser-llm` + `@mana/byok-providers`.
- `Sources/ManaLLM/Byok/`:
- `ByokTypes.swift` — `ByokProviderID`, `ByokSelection`, `ByokMessage`,
`ByokKeyResolver`, `ByokProvider`-Protocol, `ByokError`.
- `ByokProviders.swift` — vier `URLSession`-Streaming-Adapter (SSE),
OpenAI/Mistral via gemeinsamen OpenAI-compat-Pfad, Anthropic + Gemini
mit ihren eigenen Schemas.
- `ByokKeyVault.swift` — Keychain-Speicher, **bewusst app-privat, NICHT**
in `group.ev.mana.session`; keine Cross-Device-Sync. `makeResolver(…)`.
- `ByokBackend.swift` — `LLMBackend`-Konformität; ohne Resolver
`unavailable`; Prompt/Key werden nie geloggt.
- `LLMRouter`: `setByokResolver(_:defaultProvider:)`, `setAllowByokInPick(_:)`.
BYOK wird **nie still gewählt** (Datenschutz-Disziplin, analog Web) —
direkt nutzbar über `backend(for: .byok)`.
- `LLMBackendID.byok.isOnDeviceLLM == false` (Inhalt geht zu Dritt-SaaS).
**Apps müssen anpassen:** `LLMBackendID` hat einen neuen Case `.byok` —
`switch` über alle Cases (z.B. in Settings-UI) muss ihn behandeln.
Compliance-Regel (sensible Inhalte per Default nicht über BYOK) siehe
`mana/docs/COMPLIANCE.md §5`. 11 neue Tests (netzwerk-/keychain-frei),
`swift build` + `swift test` grün (23 gesamt).
## [0.2.0] — 2026-05-22
Minor — **Preference-Stores nach `ManaLLM` geliftet** + UI-Konsoldierung
in `mana-swift-ui` möglich gemacht.
### Hintergrund
Vorher lebten `LLMBackendPreferenceStore` und
`LLMDownloadOverCellularStore` mit Memoro-spezifischen UserDefaults-Keys
(`memoro.llmBackend`, `memoro.llmDownloadOverCellular`) ausschließlich
in `memoro-native`. Damit die anderen ManaLLM-Konsumenten (Pageta,
Comicello, Herbatrium) ebenfalls eine Settings-UI bekommen können
(siehe `mana-swift-ui` 0.8.0 / `ManaLLMUI`), wandern die Stores hier
ins Package und nutzen App-übergreifende Keys (`mana.llm.*`).
### Neu
- `LLMBackendPreferenceStore` — UserDefaults-Store für die On-Device-
LLM-Wahl (`mana.llm.backend`). Default: `.appleFM`.
- `LLMDownloadOverCellularStore` — WiFi-only-Default für Modell-
Downloads (`mana.llm.allowCellular`). Default: `false`.
- Beide Stores migrieren beim ersten Read einmalig aus Legacy-Keys:
- `memoro.llmBackend` → `mana.llm.backend`
- `memoro.onDeviceLLMEnabled` (alter Bool-Toggle) → mapped zu
`.appleFM` / `.noOp`, dann `mana.llm.backend`
- `memoro.llmDownloadOverCellular` → `mana.llm.allowCellular`
- `LLMBackend.removeCachedModel()` — neue Protocol-Methode mit
Default-No-Op-Impl. `GemmaBackend` überschreibt (löscht
HF-Repo-Pfad im App-Group-Container). Apple FM und NoOp bleiben
No-Op.
- Test-Suite `LLMPreferenceStoresTests` (13 Tests, `.serialized`
wegen `UserDefaults.standard`).
### Geändert
- `GemmaBackend.removeCachedModel()`-Signatur: `throws` → `async throws`
(für Protocol-Konformität). Caller müssen `try await` schreiben statt
`try`.
### Migration für Apps
Apps die schon `ManaLLM` konsumieren brauchen nichts zu ändern —
Symbol-Namen bleiben identisch, Defaults bleiben identisch, alte
UserDefaults-Keys werden transparent migriert. Memoro hat seine
lokalen Store-Duplikate gelöscht; der Build bleibt grün, weil
Memoro `import ManaLLM` schon hatte.
Apps die heute keine LLM-Settings-UI haben können jetzt
`ManaLLMUI` aus `mana-swift-ui` 0.8.0 einhängen (drop-in).