fix: weird model selector fixed
This commit is contained in:
@@ -11,6 +11,7 @@ struct ContentView: View {
|
|||||||
@State private var showLoadError = false
|
@State private var showLoadError = false
|
||||||
@State private var showMonitor = false
|
@State private var showMonitor = false
|
||||||
@State private var showScenePicker = false
|
@State private var showScenePicker = false
|
||||||
|
@State private var confirmRedownload: ModelConfig?
|
||||||
@State private var exportDocument: ChatExportDocument?
|
@State private var exportDocument: ChatExportDocument?
|
||||||
@State private var documentErrorMessage: String?
|
@State private var documentErrorMessage: String?
|
||||||
@State private var exportErrorMessage: String?
|
@State private var exportErrorMessage: String?
|
||||||
@@ -67,6 +68,24 @@ struct ContentView: View {
|
|||||||
|
|
||||||
private var alertContent: some View {
|
private var alertContent: some View {
|
||||||
AnyView(lifecycleContent)
|
AnyView(lifecycleContent)
|
||||||
|
.alert("Re-download Model?", isPresented: .init(
|
||||||
|
get: { confirmRedownload != nil },
|
||||||
|
set: { if !$0 { confirmRedownload = nil } }
|
||||||
|
)) {
|
||||||
|
Button("Re-download", role: .destructive) {
|
||||||
|
if let config = confirmRedownload {
|
||||||
|
confirmRedownload = nil
|
||||||
|
Task { await modelManager.redownloadModel(config) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Button("Cancel", role: .cancel) {
|
||||||
|
confirmRedownload = nil
|
||||||
|
}
|
||||||
|
} message: {
|
||||||
|
if let config = confirmRedownload {
|
||||||
|
Text("This will delete the local cache for \(config.displayName) and download it again from HuggingFace.")
|
||||||
|
}
|
||||||
|
}
|
||||||
.alert("Model Error", isPresented: $showLoadError) {
|
.alert("Model Error", isPresented: $showLoadError) {
|
||||||
Button("Retry") {
|
Button("Retry") {
|
||||||
if let config = modelManager.currentModel ?? modelManager.availableModels.first {
|
if let config = modelManager.currentModel ?? modelManager.availableModels.first {
|
||||||
@@ -167,6 +186,16 @@ struct ContentView: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var toolbarButtons: some View {
|
private var toolbarButtons: some View {
|
||||||
|
// Re-download current model
|
||||||
|
if let current = modelManager.currentModel, !modelManager.isLoading {
|
||||||
|
Button {
|
||||||
|
confirmRedownload = current
|
||||||
|
} label: {
|
||||||
|
Label("Re-download Model", systemImage: "arrow.clockwise")
|
||||||
|
}
|
||||||
|
.help("Re-download \(current.displayName)")
|
||||||
|
}
|
||||||
|
|
||||||
// API server toggle
|
// API server toggle
|
||||||
let isRunning = chatVM?.apiServer.isRunning == true
|
let isRunning = chatVM?.apiServer.isRunning == true
|
||||||
Button {
|
Button {
|
||||||
|
|||||||
@@ -2,72 +2,31 @@ import SwiftUI
|
|||||||
|
|
||||||
struct ModelPickerView: View {
|
struct ModelPickerView: View {
|
||||||
@Environment(ModelManager.self) private var modelManager
|
@Environment(ModelManager.self) private var modelManager
|
||||||
@State private var confirmRedownload: ModelConfig?
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack(spacing: 8) {
|
Menu {
|
||||||
Picker("Model", selection: selectedModelBinding) {
|
|
||||||
ForEach(modelManager.availableModels) { config in
|
ForEach(modelManager.availableModels) { config in
|
||||||
|
Button {
|
||||||
|
guard config.id != modelManager.currentModel?.id else { return }
|
||||||
|
Task { await modelManager.loadModel(config) }
|
||||||
|
} label: {
|
||||||
Label(
|
Label(
|
||||||
config.isCurated ? config.displayName : config.repoId,
|
config.isCurated ? config.displayName : config.repoId,
|
||||||
systemImage: config.isLocal ? "checkmark.circle.fill" : "arrow.down.circle"
|
systemImage: config.isLocal ? "checkmark.circle.fill" : "arrow.down.circle"
|
||||||
).tag(config.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.frame(width: 260)
|
|
||||||
.disabled(modelManager.isLoading)
|
|
||||||
|
|
||||||
// Re-download button (visible when a model is loaded)
|
|
||||||
if let current = modelManager.currentModel, !modelManager.isLoading {
|
|
||||||
Button {
|
|
||||||
confirmRedownload = current
|
|
||||||
} label: {
|
|
||||||
Image(systemName: "arrow.clockwise")
|
|
||||||
.font(.caption)
|
|
||||||
}
|
|
||||||
.buttonStyle(.borderless)
|
|
||||||
.help("Re-download \(current.displayName)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.alert("Re-download Model?", isPresented: .init(
|
|
||||||
get: { confirmRedownload != nil },
|
|
||||||
set: { if !$0 { confirmRedownload = nil } }
|
|
||||||
)) {
|
|
||||||
Button("Re-download", role: .destructive) {
|
|
||||||
if let config = confirmRedownload {
|
|
||||||
Task { await modelManager.redownloadModel(config) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Button("Cancel", role: .cancel) {
|
|
||||||
confirmRedownload = nil
|
|
||||||
}
|
|
||||||
} message: {
|
|
||||||
if let config = confirmRedownload {
|
|
||||||
Text("This will delete the local cache for \(config.displayName) and download it again from HuggingFace.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var selectedModelBinding: Binding<String> {
|
|
||||||
Binding(
|
|
||||||
get: {
|
|
||||||
if let currentId = modelManager.currentModel?.id {
|
|
||||||
return currentId
|
|
||||||
}
|
|
||||||
if let defaultId = Preferences.defaultModelId,
|
|
||||||
let config = modelManager.availableModels.first(where: { $0.id == defaultId || $0.repoId == defaultId }) {
|
|
||||||
return config.id
|
|
||||||
}
|
|
||||||
return ModelConfig.default.id
|
|
||||||
},
|
|
||||||
set: { newId in
|
|
||||||
guard let config = modelManager.availableModels.first(where: { $0.id == newId }) ?? ModelConfig.resolve(newId) else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
Task {
|
|
||||||
await modelManager.loadModel(config)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Text(currentModelLabel)
|
||||||
|
.lineLimit(1)
|
||||||
|
.frame(minWidth: 200)
|
||||||
|
}
|
||||||
|
.menuStyle(.button)
|
||||||
|
.disabled(modelManager.isLoading)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var currentModelLabel: String {
|
||||||
|
guard let model = modelManager.currentModel else { return "Select Model" }
|
||||||
|
return model.isCurated ? model.displayName : model.repoId
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user