The file /Users/neog/Apps/iOS/AI-KeywordMonitor/App/Constants.swift has been updated. Here's the result of running `cat -n` on a snippet of the edited file: 101→ /// Days for "this week" grouping 102→ static let thisWeekDays = 7 103→ } 104→ 105→ // MARK: - AI Analysis (Claude API) 106→ enum AI { 107→ /// Claude API base URL 108→ static let baseURL = "https://api.anthropic.com/v1" 109→ 110→ /// Default model for analysis 111→ static let defaultModel = "claude-sonnet-4-20250514" 112→ 113→ /// Request timeout for AI analysis (seconds) 114→ static let timeout: TimeInterval = 60 115→ 116→ /// Maximum retry attempts for failed AI requests 117→ static let maxRetries = 3 118→ 119→ /// Batch size for processing multiple articles 120→ static let batchSize = 10 121→ 122→ /// Temperature for analysis (lower = more deterministic) 123→ static let temperature: Double = 0.3 124→ 125→ /// Max tokens for single article analysis 126→ static let maxTokensSingle = 500 127→ 128→ /// Max tokens for aggregated insights 129→ static let maxTokensAggregated = 1000 130→ 131→ /// Retry delay base (exponential backoff) 132→ static let retryDelayBase: Double = 2.0 133→ 134→ /// High relevance threshold 135→ static let highRelevanceThreshold: Double = 0.7 136→ 137→ /// Extreme sentiment threshold (for alerts) 138→ static let extremeSentimentThreshold: Double = 0.8 139→ 140→ /// Maximum articles for aggregated insights 141→ static let maxArticlesForInsights = 50 142→ 143→ /// Anthropic API version header 144→ static let anthropicVersion = "2023-06-01" 145→ 146→ /// UserDefaults keys 147→ enum Keys { 148→ static let claudeAPIKey = "ai_claude_api_key" 149→ static let aiPreferredModel = "aiPreferredModel" 150→ static let aiEnabled = "aiEnabled" 151→ static let autoAnalysisEnabled = "autoAnalysisEnabled" 152→ } 153→ 154→ // MARK: - Auto-Analysis Settings 155→ /// Maximum articles to analyze in a single auto-analysis batch 156→ static let autoAnalysisMaxBatch = 20 157→ 158→ /// Delay before starting auto-analysis (nanoseconds) - allows batching 159→ static let autoAnalysisDelayNanoseconds: UInt64 = 2_000_000_000 // 2 seconds 160→ 161→ /// Parallel batch size for auto-analysis 162→ static let parallelBatchSize = 4 163→ 164→ /// Delay between parallel batches (nanoseconds) 165→ static let batchDelayNanoseconds: UInt64 = 500_000_000 // 0.5 seconds 166→ 167→ // MARK: - Claude Pricing (USD per 1M tokens) 168→ enum Costs { 169→ /// Claude Sonnet 4 pricing (input, output) per 1M tokens 170→ static let claudeSonnet = (input: 3.00, output: 15.00) 171→ 172→ /// Claude Haiku pricing (input, output) per 1M tokens 173→ static let claudeHaiku = (input: 0.25, output: 1.25) 174→ 175→ /// Estimate cost for a request 176→ static func estimate(model: String, inputTokens: Int, outputTokens: Int) -> Double { 177→ let (inputCost, outputCost): (Double, Double) 178→ 179→ if model.contains("haiku") { 180→ (inputCost, outputCost) = claudeHaiku 181→ } else { 182→ (inputCost, outputCost) = claudeSonnet 183→ } 184→ 185→ let inputCostPerToken = inputCost / 1_000_000 186→ let outputCostPerToken = outputCost / 1_000_000 187→ 188→ return Double(inputTokens) * inputCostPerToken + Double(outputTokens) * outputCostPerToken 189→ } 190→ } 191→ 192→ // MARK: - Health Check Settings 193→ enum HealthCheck { 194→ /// Timeout for health check (seconds) 195→ static let timeout: TimeInterval = 5.0 196→ 197→ /// Cache duration for health status (seconds) 198→ static let cacheDuration: TimeInterval = 60.0 199→ } 200→ } 201→ 202→ // MARK: - PDF Export 203→ enum PDF { 204→ /// Default page size