]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
llama.swiftui : support loading custom model from file picker (#4767)
authorsingularity <redacted>
Thu, 4 Jan 2024 08:22:38 +0000 (16:22 +0800)
committerGitHub <redacted>
Thu, 4 Jan 2024 08:22:38 +0000 (10:22 +0200)
* swiftui: support load model from file picker

* swiftui: remove trailing whitespace

examples/llama.swiftui/llama.swiftui.xcodeproj/project.pbxproj
examples/llama.swiftui/llama.swiftui/UI/ContentView.swift
examples/llama.swiftui/llama.swiftui/UI/LoadCustomButton.swift [new file with mode: 0644]

index 7bf4489a2431b8dc07ebb20b6c3fd6415863af38..a70750a224e77f51d0f743c10dcae831ce2469d0 100644 (file)
@@ -23,6 +23,7 @@
                8A3F84242AC4C891005E2EE8 /* models in Resources */ = {isa = PBXBuildFile; fileRef = 8A3F84232AC4C891005E2EE8 /* models */; };
                8A907F332AC7138A006146EA /* LibLlama.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A907F322AC7134E006146EA /* LibLlama.swift */; };
                8A9F7C4D2AC332EE008AE1EA /* LlamaState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9F7C4C2AC332EE008AE1EA /* LlamaState.swift */; };
+               F1FE20E22B465ECA00B45541 /* LoadCustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1FE20E12B465EC900B45541 /* LoadCustomButton.swift */; };
                F1FE20DC2B465C4500B45541 /* ggml-metal.metal in Resources */ = {isa = PBXBuildFile; fileRef = 549479C82AC9E10B00E0F78B /* ggml-metal.metal */; };
 /* End PBXBuildFile section */
 
@@ -68,6 +69,7 @@
                8A3F84232AC4C891005E2EE8 /* models */ = {isa = PBXFileReference; lastKnownFileType = folder; name = models; path = llama.swiftui/Resources/models; sourceTree = "<group>"; };
                8A907F322AC7134E006146EA /* LibLlama.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibLlama.swift; sourceTree = "<group>"; };
                8A9F7C4C2AC332EE008AE1EA /* LlamaState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LlamaState.swift; sourceTree = "<group>"; };
+               F1FE20E12B465EC900B45541 /* LoadCustomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadCustomButton.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
                        children = (
                                7FA3D2B22B2EA2F600543F92 /* DownloadButton.swift */,
                                8A1C83782AC328BD0096AF73 /* ContentView.swift */,
+                               F1FE20E12B465EC900B45541 /* LoadCustomButton.swift */,
                        );
                        path = UI;
                        sourceTree = "<group>";
                        files = (
                                542376082B0D9BFB008E6A1C /* ggml-quants.c in Sources */,
                                549479CD2AC9E42A00E0F78B /* ggml-metal.m in Sources */,
+                               F1FE20E22B465ECA00B45541 /* LoadCustomButton.swift in Sources */,
                                542EA09D2AC8723900A8AEE9 /* ggml.c in Sources */,
                                8A907F332AC7138A006146EA /* LibLlama.swift in Sources */,
                                542EA0A32AC8729100A8AEE9 /* llama.cpp in Sources */,
index 147e0c63bd8dd84f3427d9582e0fc5cfd49d2762..7c81ea256ffd7eec6d9f7616d66d1ad5d197eba5 100644 (file)
@@ -103,6 +103,8 @@ struct ContentView: View {
                     ContentView.cleanupModelCaches()
                     llamaState.cacheCleared = true
                 }
+
+                LoadCustomButton(llamaState: llamaState)
             }
             .padding(.top, 4)
             .font(.system(size: 12))
diff --git a/examples/llama.swiftui/llama.swiftui/UI/LoadCustomButton.swift b/examples/llama.swiftui/llama.swiftui/UI/LoadCustomButton.swift
new file mode 100644 (file)
index 0000000..4315dbe
--- /dev/null
@@ -0,0 +1,44 @@
+import SwiftUI
+import UniformTypeIdentifiers
+
+struct LoadCustomButton: View {
+    @ObservedObject private var llamaState: LlamaState
+    @State private var showFileImporter = false
+
+    init(llamaState: LlamaState) {
+        self.llamaState = llamaState
+    }
+
+    var body: some View {
+        VStack {
+            Button(action: {
+                showFileImporter = true
+            }) {
+                Text("Load Custom Model")
+            }
+        }
+        .fileImporter(
+            isPresented: $showFileImporter,
+            allowedContentTypes: [UTType(filenameExtension: "gguf", conformingTo: .data)!],
+            allowsMultipleSelection: false
+        ) { result in
+            switch result {
+            case .success(let files):
+                files.forEach { file in
+                    let gotAccess = file.startAccessingSecurityScopedResource()
+                    if !gotAccess { return }
+
+                    do {
+                        try llamaState.loadModel(modelUrl: file.absoluteURL)
+                    } catch let err {
+                        print("Error: \(err.localizedDescription)")
+                    }
+
+                    file.stopAccessingSecurityScopedResource()
+                }
+            case .failure(let error):
+                print(error)
+            }
+        }
+    }
+}