import Foundation extension MiniMaxUsageParser { static func mapModelNameToServiceType(modelName: String) -> String { let lower = modelName.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() if lower == "general" || lower == "video" { return lower } // Legacy text model names are separate from Token Plan's `general` bucket. if self.isTextGenerationModelName(modelName) { return "Text Generation" } // Text to Speech (语音合成): speech-hd, Speech 2.8, etc. if lower.contains("speech") { return "Text to Speech" } // Image to Video Fast (图生视频 Fast): Hailuo-2.3-Fast if lower.contains("hailuo"), lower.contains("fast") { return "Image to Video" } // Text to Video (文生视频): Hailuo-2.3 (non-Fast) if lower.contains("hailuo") { return "Text to Video" } // Image Generation (图像生成): image-01, image-02, etc. if lower.hasPrefix("image-") { return "Image Generation" } // Music Generation (音乐生成): music-2.5, etc. if lower.contains("music") { return "Music Generation" } return modelName } static func isTextGenerationModelName(_ modelName: String) -> Bool { let lower = modelName.lowercased() return lower == "general" || lower.contains("minimax-m") || lower.hasPrefix("m2.") } static func shouldRenderWeeklyWindow(for modelName: String) -> Bool { self.isTextGenerationModelName(modelName) } static func formatMiniMaxDateTimeRange(startTime: Date?, endTime: Date?) -> String? { guard let startTime, let endTime else { return nil } let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(identifier: "Asia/Shanghai") formatter.dateFormat = "MM/dd HH:mm" let start = formatter.string(from: startTime) let end = formatter.string(from: endTime) return "\(start) - \(end)(UTC+8)" }}
import Foundation
extension MiniMaxUsageParser {
static func mapModelNameToServiceType(modelName: String) -> String {
let lower = modelName.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
if lower == "general" || lower == "video" {
return lower
}
// Legacy text model names are separate from Token Plan's `general` bucket.
if self.isTextGenerationModelName(modelName) {
return "Text Generation"
}
// Text to Speech (语音合成): speech-hd, Speech 2.8, etc.
if lower.contains("speech") {
return "Text to Speech"
}
// Image to Video Fast (图生视频 Fast): Hailuo-2.3-Fast
if lower.contains("hailuo"), lower.contains("fast") {
return "Image to Video"
}
// Text to Video (文生视频): Hailuo-2.3 (non-Fast)
if lower.contains("hailuo") {
return "Text to Video"
}
// Image Generation (图像生成): image-01, image-02, etc.
if lower.hasPrefix("image-") {
return "Image Generation"
}
// Music Generation (音乐生成): music-2.5, etc.
if lower.contains("music") {
return "Music Generation"
}
return modelName
}
static func isTextGenerationModelName(_ modelName: String) -> Bool {
let lower = modelName.lowercased()
return lower == "general" || lower.contains("minimax-m") || lower.hasPrefix("m2.")
}
static func shouldRenderWeeklyWindow(for modelName: String) -> Bool {
self.isTextGenerationModelName(modelName)
}
static func formatMiniMaxDateTimeRange(startTime: Date?, endTime: Date?) -> String? {
guard let startTime, let endTime else { return nil }
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(identifier: "Asia/Shanghai")
formatter.dateFormat = "MM/dd HH:mm"
let start = formatter.string(from: startTime)
let end = formatter.string(from: endTime)
return "\(start) - \(end)(UTC+8)"
}
}