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

3.8 KiB

Changelog

Alle Änderungen werden hier dokumentiert. Format orientiert an Keep a Changelog, Versionierung nach Semver.

[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).