First public release v2.3.1
This commit is contained in:
@@ -46,6 +46,9 @@ struct Message: Identifiable, Codable, Equatable {
|
||||
// Streaming state (not persisted)
|
||||
var isStreaming: Bool = false
|
||||
|
||||
// Star state (not persisted in messages table — tracked via message_metadata for saved conversations)
|
||||
var isStarred: Bool = false
|
||||
|
||||
// Generated images from image-output models (base64-decoded PNG/JPEG data)
|
||||
var generatedImages: [Data]? = nil
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ struct SessionStats {
|
||||
var totalOutputTokens: Int = 0
|
||||
var totalCost: Double = 0.0
|
||||
var messageCount: Int = 0
|
||||
var hasCostData: Bool = false
|
||||
|
||||
var totalTokens: Int {
|
||||
totalInputTokens + totalOutputTokens
|
||||
@@ -46,14 +47,18 @@ struct SessionStats {
|
||||
}
|
||||
|
||||
var totalCostDisplay: String {
|
||||
String(format: "$%.4f", totalCost)
|
||||
hasCostData ? String(format: "$%.4f", totalCost) : "N/A"
|
||||
}
|
||||
|
||||
|
||||
var averageCostPerMessage: Double {
|
||||
guard messageCount > 0 else { return 0.0 }
|
||||
return totalCost / Double(messageCount)
|
||||
}
|
||||
|
||||
|
||||
var averageCostDisplay: String {
|
||||
hasCostData ? String(format: "$%.4f", averageCostPerMessage) : "N/A"
|
||||
}
|
||||
|
||||
mutating func addMessage(inputTokens: Int?, outputTokens: Int?, cost: Double?) {
|
||||
if let input = inputTokens {
|
||||
totalInputTokens += input
|
||||
@@ -63,14 +68,16 @@ struct SessionStats {
|
||||
}
|
||||
if let messageCost = cost {
|
||||
totalCost += messageCost
|
||||
hasCostData = true
|
||||
}
|
||||
messageCount += 1
|
||||
}
|
||||
|
||||
|
||||
mutating func reset() {
|
||||
totalInputTokens = 0
|
||||
totalOutputTokens = 0
|
||||
totalCost = 0.0
|
||||
messageCount = 0
|
||||
hasCostData = false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user