bbcf0c74bb
- 19 Swift source files (~4900 lines) - Complete UI with SwiftUI (MainView, SettingsView, MessageBubble, InputBar) - Inference layer (LlmEngine, Agent, ToolCalling, ConversationContext) - Services (Audio, TTS, WebSearch, ModelDownload, Storage) - Build system: Makefile, Package.swift, Podfile - Documentation: BUILD.md, plan.md, PROJECT_STATUS.md - Ready for Xcode build - just need LiteRT dependency added
63 lines
1.6 KiB
Swift
63 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
enum MessageRole: String, Codable {
|
|
case user
|
|
case assistant
|
|
case tool
|
|
case system
|
|
}
|
|
|
|
struct Message: Identifiable, Codable, Equatable {
|
|
let id: UUID
|
|
var role: MessageRole
|
|
var content: String
|
|
var toolCalls: [ToolCall]?
|
|
var toolCallId: String?
|
|
let timestamp: Date
|
|
|
|
init(id: UUID = UUID(), role: MessageRole, content: String, toolCalls: [ToolCall]? = nil, toolCallId: String? = nil, timestamp: Date = Date()) {
|
|
self.id = id
|
|
self.role = role
|
|
self.content = content
|
|
self.toolCalls = toolCalls
|
|
self.toolCallId = toolCallId
|
|
self.timestamp = timestamp
|
|
}
|
|
|
|
static func user(_ content: String) -> Message {
|
|
Message(role: .user, content: content)
|
|
}
|
|
|
|
static func assistant(_ content: String, toolCalls: [ToolCall]? = nil) -> Message {
|
|
Message(role: .assistant, content: content, toolCalls: toolCalls)
|
|
}
|
|
}
|
|
|
|
struct ToolCall: Codable, Equatable {
|
|
let id: String
|
|
let name: String
|
|
let arguments: [String: String]
|
|
}
|
|
|
|
enum ModelVariant: String, Codable, CaseIterable {
|
|
case e2b = "E2B"
|
|
case e4b = "E4B"
|
|
case custom = "Custom"
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .e2b: return "Gemma 4 E2B (Fast)"
|
|
case .e4b: return "Gemma 4 E4B (Quality)"
|
|
case .custom: return "Custom Model"
|
|
}
|
|
}
|
|
|
|
var sizeDescription: String {
|
|
switch self {
|
|
case .e2b: return "~2.7 GB"
|
|
case .e4b: return "~4.5 GB"
|
|
case .custom: return "Varies"
|
|
}
|
|
}
|
|
}
|