Files
MLXServer/MLXServer/Models/ChatScene.swift

60 lines
1.9 KiB
Swift

import Foundation
struct ChatScene: Codable, Identifiable, Hashable {
let id: UUID
var name: String
var modelId: String?
var systemPrompt: String
var starterPrompt: String
var generationOverrides: GenerationSettingsOverride
init(
id: UUID = UUID(),
name: String,
modelId: String? = nil,
systemPrompt: String = "",
starterPrompt: String = "",
generationOverrides: GenerationSettingsOverride = .none
) {
self.id = id
self.name = name
self.modelId = modelId
self.systemPrompt = systemPrompt
self.starterPrompt = starterPrompt
self.generationOverrides = generationOverrides
}
private enum CodingKeys: String, CodingKey {
case id
case name
case modelId
case systemPrompt
case starterPrompt
case generationOverrides
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(UUID.self, forKey: .id)
name = try container.decode(String.self, forKey: .name)
modelId = try container.decodeIfPresent(String.self, forKey: .modelId)
systemPrompt = try container.decodeIfPresent(String.self, forKey: .systemPrompt) ?? ""
starterPrompt = try container.decodeIfPresent(String.self, forKey: .starterPrompt) ?? ""
generationOverrides = try container.decodeIfPresent(GenerationSettingsOverride.self, forKey: .generationOverrides) ?? .none
}
var trimmedName: String {
name.trimmingCharacters(in: .whitespacesAndNewlines)
}
var displayName: String {
trimmedName.isEmpty ? "Untitled Scene" : trimmedName
}
var resolvedModel: ModelConfig? {
guard let modelId else { return nil }
return ModelConfig.availableModels.first(where: { $0.id == modelId })
}
static let empty = ChatScene(name: "New Scene")
}