// // GenerationParams.swift // Zyquo MLX // // Author: Simon-Pierre Boucher // Mail: contact@spboucher.ai // import Foundation import MLXLMCommon /// App-level generation parameters (Codable for persistence, presets, and /// per-run notes). Mapped 1:1 onto `MLXLMCommon.GenerateParameters` /// (verified fields — docs/MLX-RESEARCH.md §4.3). struct GenerationParams: Codable, Hashable, Sendable { var temperature: Float = 0.6 var topP: Float = 1.0 var topK: Int = 0 var minP: Float = 0.0 var maxTokens: Int? = 2048 var repetitionPenalty: Float? var repetitionContextSize: Int = 20 var seed: UInt64? /// KV-cache quantization bits (nil = off). var kvBits: Int? var kvGroupSize: Int = 64 /// Cap on KV cache length (RotatingKVCache when set). var maxKVSize: Int? var asMLX: GenerateParameters { GenerateParameters( maxTokens: maxTokens, maxKVSize: maxKVSize, kvBits: kvBits, kvGroupSize: kvGroupSize, temperature: temperature, topP: topP, topK: topK, minP: minP, repetitionPenalty: repetitionPenalty, repetitionContextSize: repetitionContextSize, seed: seed ) } } /// Final statistics for one generation (from `GenerateCompletionInfo`). struct InferenceStats: Codable, Hashable, Sendable { var promptTokens: Int var generatedTokens: Int /// Time to first token ≈ prompt processing time. var ttft: TimeInterval var generateTime: TimeInterval var stopReason: String var tokensPerSecond: Double { generateTime > 0 ? Double(generatedTokens) / generateTime : 0 } }