Files
MaliangAINovalWriter/AINoval/lib/models/user_ai_model_config_model.dart
2025-09-10 00:07:52 +08:00

170 lines
5.5 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:meta/meta.dart'; // For @immutable
import '../utils/date_time_parser.dart'; // Import the parser
import 'package:equatable/equatable.dart'; // Import Equatable for Equatable mixin
/// 用户 AI 模型配置模型 (对应后端的 UserAIModelConfigResponse)
@immutable // Good practice for value objects
class UserAIModelConfigModel extends Equatable {
final String id;
final String userId;
final String provider;
final String modelName;
final String alias;
final String apiEndpoint;
final bool isValidated;
final bool isDefault;
final DateTime createdAt;
final DateTime updatedAt;
final String? apiKey; // 添加apiKey字段存储解密后的API密钥
/// 获取模型名称,用于显示
String get name => (alias.isNotEmpty && alias != modelName) ? alias : modelName;
const UserAIModelConfigModel({
required this.id,
required this.userId,
required this.provider,
required this.modelName,
required this.alias,
required this.apiEndpoint,
required this.isValidated,
required this.isDefault,
required this.createdAt,
required this.updatedAt,
this.apiKey, // 添加apiKey字段可为空
});
// 空实例,用于默认值
factory UserAIModelConfigModel.empty() {
return UserAIModelConfigModel(
id: '',
userId: '',
provider: '',
modelName: '',
alias: '',
apiEndpoint: '',
isValidated: false,
isDefault: false,
createdAt: DateTime.now(),
updatedAt: DateTime.now(),
apiKey: null, // 默认为null
);
}
// 从JSON转换方法
factory UserAIModelConfigModel.fromJson(Map<String, dynamic> json) {
// Helper to safely get string, providing a default if null or wrong type
String safeString(String key, [String defaultValue = '']) {
return json[key] is String ? json[key] as String : defaultValue;
}
// Helper to safely get bool, providing a default if null or wrong type
bool safeBool(String key, [bool defaultValue = false]) {
return json[key] is bool ? json[key] as bool : defaultValue;
}
return UserAIModelConfigModel(
id: safeString('id'), // Assuming 'id' is the key from backend
userId: safeString('userId'),
provider: safeString('provider'),
modelName: safeString('modelName'),
alias: safeString('alias'), // 使用safeString确保null安全
apiEndpoint: safeString('apiEndpoint'), // 修复使用safeString处理可能为null的apiEndpoint
isValidated: safeBool('isValidated'),
isDefault: safeBool('isDefault'),
createdAt: parseBackendDateTime(json['createdAt']), // Use the parser
updatedAt: parseBackendDateTime(json['updatedAt']), // Use the parser
apiKey: json['apiKey'] as String?, // 添加API密钥可为空
);
}
// 转换为JSON方法
Map<String, dynamic> toJson() {
return {
'id': id,
'userId': userId,
'provider': provider,
'modelName': modelName,
'alias': alias,
'apiEndpoint': apiEndpoint,
'isValidated': isValidated,
'isDefault': isDefault,
'createdAt': createdAt.toIso8601String(), // Standard format for JSON
'updatedAt': updatedAt.toIso8601String(), // Standard format for JSON
'apiKey': apiKey, // 包含API密钥
};
}
// 复制方法
UserAIModelConfigModel copyWith({
String? id,
String? userId,
String? provider,
String? modelName,
String? alias,
String? apiEndpoint,
bool? isValidated,
bool? isDefault,
DateTime? createdAt,
DateTime? updatedAt,
String? apiKey, // 添加apiKey参数
}) {
return UserAIModelConfigModel(
id: id ?? this.id,
userId: userId ?? this.userId,
provider: provider ?? this.provider,
modelName: modelName ?? this.modelName,
alias: alias ?? this.alias,
apiEndpoint: apiEndpoint ?? this.apiEndpoint,
isValidated: isValidated ?? this.isValidated,
isDefault: isDefault ?? this.isDefault,
createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt,
apiKey: apiKey ?? this.apiKey, // 复制apiKey
);
}
// --- Value Equality ---
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is UserAIModelConfigModel &&
other.id == id &&
other.userId == userId &&
other.provider == provider &&
other.modelName == modelName &&
other.alias == alias &&
other.apiEndpoint == apiEndpoint &&
other.isValidated == isValidated &&
other.isDefault == isDefault &&
other.createdAt == createdAt &&
other.apiKey == apiKey && // 比较apiKey
other.updatedAt == updatedAt;
}
@override
int get hashCode {
return id.hashCode ^
userId.hashCode ^
provider.hashCode ^
modelName.hashCode ^
alias.hashCode ^
apiEndpoint.hashCode ^
isValidated.hashCode ^
isDefault.hashCode ^
createdAt.hashCode ^
apiKey.hashCode ^ // 计算apiKey的哈希值
updatedAt.hashCode;
}
@override
String toString() {
return 'UserAIModelConfigModel(id: $id, userId: $userId, provider: $provider, modelName: $modelName, alias: $alias, apiEndpoint: $apiEndpoint, isValidated: $isValidated, isDefault: $isDefault, createdAt: $createdAt, updatedAt: $updatedAt, apiKey: ${apiKey != null ? '******' : 'null'})'; // 不显示完整apiKey
}
@override
List<Object?> get props => [id, userId, provider, modelName, alias, apiEndpoint, isValidated, isDefault, createdAt, updatedAt, apiKey]; // 添加apiKey到props
}