@@ -80,6 +80,25 @@ struct ContentView: View {
8080 case tokenizer
8181 }
8282
83+ enum ModelType {
84+ case llama
85+ case llava
86+ case qwen3
87+
88+ static func fromPath( _ path: String ) -> ModelType {
89+ let filename = ( path as NSString ) . lastPathComponent. lowercased ( )
90+ if filename. hasPrefix ( " llama " ) {
91+ return . llama
92+ } else if filename. hasPrefix ( " llava " ) {
93+ return . llava
94+ } else if filename. hasPrefix ( " qwen3 " ) {
95+ return . qwen3
96+ }
97+ print ( " Unknown model type in path: \( path) . Model filename should start with one of: llama, llava, or qwen3 " )
98+ exit ( 1 )
99+ }
100+ }
101+
83102 private var placeholder : String {
84103 resourceManager. isModelValid ? resourceManager. isTokenizerValid ? " Prompt... " : " Select Tokenizer... " : " Select Model... "
85104 }
@@ -275,14 +294,14 @@ struct ContentView: View {
275294 let seq_len = 768 // text: 256, vision: 768
276295 let modelPath = resourceManager. modelPath
277296 let tokenizerPath = resourceManager. tokenizerPath
278- let useLlama = modelPath . lowercased ( ) . contains ( " llama " )
297+ let modelType = ModelType . fromPath ( modelPath )
279298
280299 prompt = " "
281300 hideKeyboard ( )
282301 showingSettings = false
283302
284303 messages. append ( Message ( text: text) )
285- messages. append ( Message ( type: useLlama ? . llamagenerated : . llavagenerated) )
304+ messages. append ( Message ( type: modelType == . llama ? . llamagenerated : . llavagenerated) )
286305
287306 runnerQueue. async {
288307 defer {
@@ -292,14 +311,16 @@ struct ContentView: View {
292311 }
293312 }
294313
295- if useLlama {
314+ switch modelType {
315+ case . llama, . qwen3:
296316 runnerHolder. runner = runnerHolder. runner ?? Runner ( modelPath: modelPath, tokenizerPath: tokenizerPath)
297- } else {
317+ case . llava :
298318 runnerHolder. llavaRunner = runnerHolder. llavaRunner ?? LLaVARunner ( modelPath: modelPath, tokenizerPath: tokenizerPath)
299319 }
300320
301321 guard !shouldStopGenerating else { return }
302- if useLlama {
322+ switch modelType {
323+ case . llama, . qwen3:
303324 if let runner = runnerHolder. runner, !runner. isLoaded ( ) {
304325 var error : Error ?
305326 let startLoadTime = Date ( )
@@ -329,7 +350,7 @@ struct ContentView: View {
329350 return
330351 }
331352 }
332- } else {
353+ case . llava :
333354 if let runner = runnerHolder. llavaRunner, !runner. isLoaded ( ) {
334355 var error : Error ?
335356 let startLoadTime = Date ( )
@@ -411,12 +432,19 @@ struct ContentView: View {
411432 }
412433 }
413434 } else {
414- let llama3_prompt = " <|begin_of_text|><|start_header_id|>user<|end_header_id|> \( text) <|eot_id|><|start_header_id|>assistant<|end_header_id|> "
435+ let prompt : String
436+ switch modelType {
437+ case . qwen3:
438+ prompt = String ( format: Constants . qwen3PromptTemplate, text)
439+ case . llama:
440+ prompt = String ( format: Constants . llama3PromptTemplate, text)
441+ case . llava:
442+ prompt = String ( format: Constants . llama3PromptTemplate, text)
443+ }
415444
416- try runnerHolder. runner? . generate ( llama3_prompt , sequenceLength: seq_len) { token in
445+ try runnerHolder. runner? . generate ( prompt , sequenceLength: seq_len) { token in
417446
418- NSLog ( " >>> token={ \( token) } " )
419- if token != llama3_prompt {
447+ if token != prompt {
420448 // hack to fix the issue that extension/llm/runner/text_token_generator.h
421449 // keeps generating after <|eot_id|>
422450 if token == " <|eot_id|> " {
0 commit comments