mana-swift-ui/Sources/ManaLLMUI/ManaLLMContext.swift
Till JS ad9dc1abba v0.8.0 — feat(llm-ui): neues Library-Product ManaLLMUI
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>
2026-05-22 14:19:58 +02:00

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"
)
}