HuggingChat-Mac/Models/LLMModel.swift (78 lines of code) (raw):
//
// LLMModel.swift
// HuggingChat-Mac
//
// Created by Cyril Zakka on 8/23/24.
//
import Foundation
final class LLMModel: Codable, Identifiable, BaseConversation {
let id: String
let name: String
let displayName: String
let websiteUrl: URL
let modelUrl: URL
let tools: Bool
let promptExamples: [PromptExample]
let multimodal: Bool
let unlisted: Bool
let description: String
var preprompt: String
init(
id: String, name: String, displayName: String, websiteUrl: URL, modelUrl: URL,
promptExamples: [PromptExample], multimodal: Bool, unlisted: Bool, description: String,
isActive: Bool, preprompt: String, tools: Bool
) {
self.id = id
self.name = name
self.displayName = displayName
self.websiteUrl = websiteUrl
self.modelUrl = modelUrl
self.promptExamples = promptExamples
self.multimodal = multimodal
self.unlisted = unlisted
self.description = description
self.preprompt = preprompt
self.tools = tools
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decode(String.self, forKey: .id)
self.name = try container.decode(String.self, forKey: .name)
self.displayName = try container.decode(String.self, forKey: .displayName)
if let url = try? container.decode(URL.self, forKey: .websiteUrl) {
self.websiteUrl = url
} else {
self.websiteUrl = URL(string: "https://huggingface.co/\(self.name)")!
}
if let url = try? container.decode(URL.self, forKey: .modelUrl) {
self.modelUrl = url
} else {
self.modelUrl = URL(string: "https://huggingface.co/\(self.name)")!
}
self.promptExamples = (try? container.decode([PromptExample].self, forKey: .promptExamples)) ?? []
self.multimodal = try container.decode(Bool.self, forKey: .multimodal)
self.unlisted = try container.decode(Bool.self, forKey: .unlisted)
self.description = (try? container.decode(String.self, forKey: .description)) ?? ""
self.preprompt = try container.decode(String.self, forKey: .preprompt)
self.tools = try container.decode(Bool.self, forKey: .tools)
}
}
extension LLMModel {
static func dumbModel() -> LLMModel {
let examples = [
PromptExample(
title: "Write an email from bullet list", prompt: "Write an email from bullet list"),
PromptExample(title: "Code a snake game", prompt: "Code a snake game"),
PromptExample(title: "Assist in a task", prompt: "Assist in a task"),
]
return LLMModel(
id: "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
name: "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
displayName: "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
websiteUrl: URL(string: "https://google.fr")!,
modelUrl: URL(string: "https://google.fr")!, promptExamples: examples,
multimodal: false,
unlisted: false, description: "", isActive: true, preprompt: "", tools: false)
}
func toNewConversation() -> (AnyObject&Codable) {
return NewConversationFromModelRequestBody(model: id, preprompt: preprompt)
}
}
struct PromptExample: Codable {
let title: String
let prompt: String
}