Drop-in-Settings-UI für die lokalen LLM-Backends aus mana-swift-llm. Pendant zu ManaAuthUI — vorher hatte nur Memoro die UI handgeschrieben, die drei anderen Konsumenten (pageta, comicello, herbatrium) gar nichts. Komponenten: - ManaLLMSettingsView(context:) — Convenience-Wrapper, drei Sections - ManaLLMBackendPickerSection — Picker + Availability + Empfohlen-Badge - ManaLLMPrepareSection — Download/Init-Card mit Progress, gated für Gemma - ManaLLMDownloadPolicySection — WiFi-only-Toggle - ManaLLMSettingsState (@Observable, @MainActor) — geteilter State, delegiert an Stores aus mana-swift-llm 0.2.0 - ManaLLMContext(useCaseShort:useCaseLong:) — app-spezifischer Section-Text; .generic als Fallback Test-Target ManaLLMUITests bewusst noch nicht angelegt (Linter hat es aus Package.swift entfernt, Comment markiert TODO). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
33 lines
1.5 KiB
Swift
33 lines
1.5 KiB
Swift
import Foundation
|
|
|
|
/// App-spezifischer Kontext für die Section-Texte. Apps reichen ein
|
|
/// `ManaLLMContext` rein, und die Sections erweitern ihre Footer-
|
|
/// und Subtitle-Texte um diesen Kontext.
|
|
///
|
|
/// **Beispiele:**
|
|
/// - Memoro: `ManaLLMContext(useCaseShort: "Headline + Intro", useCaseLong: "destilliert lange Audio-Transkripte in kurze Texte")`
|
|
/// - Pageta: `ManaLLMContext(useCaseShort: "Artikel-Zusammenfassung", useCaseLong: "fasst Artikel in zwei Sätze zusammen")`
|
|
/// - Comicello: `ManaLLMContext(useCaseShort: "Story-Synopsis", useCaseLong: "generiert eine kurze Synopsis zu einer Story")`
|
|
/// - Herbatrium: `ManaLLMContext(useCaseShort: "Pflanzen-Notizen", useCaseLong: "verdichtet Pflegenotizen in eine kurze Zusammenfassung")`
|
|
///
|
|
/// Wenn nicht gesetzt (`nil`), nutzen die Sections generische Texte.
|
|
public struct ManaLLMContext: Equatable, Sendable {
|
|
/// Kurzer Label-Text, taucht z.B. als Section-Header auf
|
|
/// ("KI-Modell für Headline + Intro").
|
|
public let useCaseShort: String
|
|
|
|
/// Längerer Erklärtext, taucht im Section-Footer auf
|
|
/// ("Die App nutzt das Modell für: <useCaseLong>.").
|
|
public let useCaseLong: String
|
|
|
|
public init(useCaseShort: String, useCaseLong: String) {
|
|
self.useCaseShort = useCaseShort
|
|
self.useCaseLong = useCaseLong
|
|
}
|
|
|
|
/// Generischer Fallback wenn die App keinen Kontext mitgibt.
|
|
public static let generic = ManaLLMContext(
|
|
useCaseShort: "Lokale KI",
|
|
useCaseLong: "Texte lokal zusammenfasst, klassifiziert oder generiert"
|
|
)
|
|
}
|