112 lines
2.8 KiB
Swift
112 lines
2.8 KiB
Swift
//
|
|
// Settings.swift
|
|
// oAI
|
|
//
|
|
// Application settings and configuration
|
|
//
|
|
|
|
import Foundation
|
|
|
|
struct Settings: Codable {
|
|
// Provider settings
|
|
var defaultProvider: Provider
|
|
var openrouterAPIKey: String?
|
|
var anthropicAPIKey: String?
|
|
var openaiAPIKey: String?
|
|
var ollamaBaseURL: String
|
|
|
|
// Model settings
|
|
var defaultModel: String?
|
|
var streamEnabled: Bool
|
|
var maxTokens: Int
|
|
var systemPrompt: String?
|
|
var customPromptMode: CustomPromptMode
|
|
|
|
// Feature flags
|
|
var onlineMode: Bool
|
|
var memoryEnabled: Bool
|
|
var mcpEnabled: Bool
|
|
|
|
// Web search
|
|
var searchProvider: SearchProvider
|
|
var googleAPIKey: String?
|
|
var googleSearchEngineID: String?
|
|
|
|
// UI
|
|
var costWarningThreshold: Double
|
|
|
|
enum Provider: String, Codable, CaseIterable {
|
|
case openrouter
|
|
case anthropic
|
|
case openai
|
|
case ollama
|
|
|
|
var displayName: String {
|
|
rawValue.capitalized
|
|
}
|
|
|
|
var iconName: String {
|
|
switch self {
|
|
case .openrouter: return "network"
|
|
case .anthropic: return "brain"
|
|
case .openai: return "sparkles"
|
|
case .ollama: return "server.rack"
|
|
}
|
|
}
|
|
}
|
|
|
|
enum SearchProvider: String, Codable, CaseIterable {
|
|
case anthropicNative = "anthropic_native"
|
|
case duckduckgo
|
|
case google
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .anthropicNative: return "Anthropic Native"
|
|
case .duckduckgo: return "DuckDuckGo"
|
|
case .google: return "Google"
|
|
}
|
|
}
|
|
}
|
|
|
|
enum CustomPromptMode: String, Codable, CaseIterable {
|
|
case append = "append"
|
|
case replace = "replace"
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .append: return "Append to Default"
|
|
case .replace: return "Replace Default (BYOP)"
|
|
}
|
|
}
|
|
|
|
var description: String {
|
|
switch self {
|
|
case .append: return "Your custom prompt will be added after the default system prompt"
|
|
case .replace: return "Only use your custom prompt (Bring Your Own Prompt)"
|
|
}
|
|
}
|
|
}
|
|
|
|
// Default settings
|
|
static let `default` = Settings(
|
|
defaultProvider: .openrouter,
|
|
openrouterAPIKey: nil,
|
|
anthropicAPIKey: nil,
|
|
openaiAPIKey: nil,
|
|
ollamaBaseURL: "http://localhost:11434",
|
|
defaultModel: nil,
|
|
streamEnabled: true,
|
|
maxTokens: 4096,
|
|
systemPrompt: nil,
|
|
customPromptMode: .append,
|
|
onlineMode: false,
|
|
memoryEnabled: true,
|
|
mcpEnabled: false,
|
|
searchProvider: .duckduckgo,
|
|
googleAPIKey: nil,
|
|
googleSearchEngineID: nil,
|
|
costWarningThreshold: 1.0
|
|
)
|
|
}
|