88 lines
3.8 KiB
Markdown
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).
|