mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2025-01-07 09:11:46 +00:00
e790eef21c
* Updated Models Layout - Added a models drawer - Added downloading directly from Hugging Face - Load custom models from local folder - Delete models by swiping left * trimmed trailing white space * Updated Models Layout
146 lines
4.7 KiB
Swift
146 lines
4.7 KiB
Swift
import SwiftUI
|
|
|
|
struct ContentView: View {
|
|
@StateObject var llamaState = LlamaState()
|
|
@State private var multiLineText = ""
|
|
@State private var showingHelp = false // To track if Help Sheet should be shown
|
|
|
|
var body: some View {
|
|
NavigationView {
|
|
VStack {
|
|
ScrollView(.vertical, showsIndicators: true) {
|
|
Text(llamaState.messageLog)
|
|
.font(.system(size: 12))
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding()
|
|
.onTapGesture {
|
|
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
|
|
}
|
|
}
|
|
|
|
TextEditor(text: $multiLineText)
|
|
.frame(height: 80)
|
|
.padding()
|
|
.border(Color.gray, width: 0.5)
|
|
|
|
HStack {
|
|
Button("Send") {
|
|
sendText()
|
|
}
|
|
|
|
Button("Bench") {
|
|
bench()
|
|
}
|
|
|
|
Button("Clear") {
|
|
clear()
|
|
}
|
|
|
|
Button("Copy") {
|
|
UIPasteboard.general.string = llamaState.messageLog
|
|
}
|
|
}
|
|
.buttonStyle(.bordered)
|
|
.padding()
|
|
|
|
NavigationLink(destination: DrawerView(llamaState: llamaState)) {
|
|
Text("View Models")
|
|
}
|
|
.padding()
|
|
|
|
}
|
|
.padding()
|
|
.navigationBarTitle("Model Settings", displayMode: .inline)
|
|
|
|
}
|
|
}
|
|
|
|
func sendText() {
|
|
Task {
|
|
await llamaState.complete(text: multiLineText)
|
|
multiLineText = ""
|
|
}
|
|
}
|
|
|
|
func bench() {
|
|
Task {
|
|
await llamaState.bench()
|
|
}
|
|
}
|
|
|
|
func clear() {
|
|
Task {
|
|
await llamaState.clear()
|
|
}
|
|
}
|
|
struct DrawerView: View {
|
|
|
|
@ObservedObject var llamaState: LlamaState
|
|
@State private var showingHelp = false
|
|
func delete(at offsets: IndexSet) {
|
|
offsets.forEach { offset in
|
|
let model = llamaState.downloadedModels[offset]
|
|
let fileURL = getDocumentsDirectory().appendingPathComponent(model.filename)
|
|
do {
|
|
try FileManager.default.removeItem(at: fileURL)
|
|
} catch {
|
|
print("Error deleting file: \(error)")
|
|
}
|
|
}
|
|
|
|
// Remove models from downloadedModels array
|
|
llamaState.downloadedModels.remove(atOffsets: offsets)
|
|
}
|
|
|
|
func getDocumentsDirectory() -> URL {
|
|
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
|
|
return paths[0]
|
|
}
|
|
var body: some View {
|
|
List {
|
|
Section(header: Text("Download Models From Hugging Face")) {
|
|
HStack {
|
|
InputButton(llamaState: llamaState)
|
|
}
|
|
}
|
|
Section(header: Text("Downloaded Models")) {
|
|
ForEach(llamaState.downloadedModels) { model in
|
|
DownloadButton(llamaState: llamaState, modelName: model.name, modelUrl: model.url, filename: model.filename)
|
|
}
|
|
.onDelete(perform: delete)
|
|
}
|
|
Section(header: Text("Default Models")) {
|
|
ForEach(llamaState.undownloadedModels) { model in
|
|
DownloadButton(llamaState: llamaState, modelName: model.name, modelUrl: model.url, filename: model.filename)
|
|
}
|
|
}
|
|
|
|
}
|
|
.listStyle(GroupedListStyle())
|
|
.navigationBarTitle("Model Settings", displayMode: .inline).toolbar {
|
|
ToolbarItem(placement: .navigationBarTrailing) {
|
|
Button("Help") {
|
|
showingHelp = true
|
|
}
|
|
}
|
|
}.sheet(isPresented: $showingHelp) { // Sheet for help modal
|
|
VStack(alignment: .leading) {
|
|
VStack(alignment: .leading) {
|
|
Text("1. Make sure the model is in GGUF Format")
|
|
.padding()
|
|
Text("2. Copy the download link of the quantized model")
|
|
.padding()
|
|
}
|
|
Spacer()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct ContentView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
ContentView()
|
|
}
|
|
}
|