part of 'ai_config_bloc.dart'; // 枚举来定义 Provider 获取模型列表的能力 enum ModelListingCapability { noListing, // 不支持 API 获取 listingWithoutKey, // 无需 Key 获取 listingWithKey, // 需要 Key 获取 } enum AiConfigStatus { initial, loading, loaded, error, } enum AiConfigActionStatus { idle, // 初始状态 loading, // 操作进行中(例如保存、删除、验证) success, // 操作成功 error // 操作失败 } class AiConfigState extends Equatable { const AiConfigState({ this.status = AiConfigStatus.initial, this.configs = const [], this.availableProviders = const [], this.modelsForProvider = const [], this.modelsForProviderInfo = const [], this.modelGroups = const {}, this.selectedProviderForModels, this.providerDefaultConfigs = const {}, this.loadingConfigId, this.actionStatus = AiConfigActionStatus.idle, this.errorMessage, this.actionErrorMessage, // New state fields this.providerCapability, this.isTestingApiKey = false, this.apiKeyTestSuccessProvider, this.apiKeyTestError, }); final AiConfigStatus status; final List configs; final List availableProviders; final List modelsForProvider; // For the currently selected provider final List modelsForProviderInfo; // New field for ModelInfo final Map modelGroups; // Models grouped by provider final String? selectedProviderForModels; // Tracks which provider `modelsForProvider` belongs to final Map providerDefaultConfigs; // Provider name -> one representative config final String? loadingConfigId; // ID of the config being validated final AiConfigActionStatus actionStatus; // Status for CRUD/Action operations final String? errorMessage; // General error message for loading etc. final String? actionErrorMessage; // Specific error for the last action // New state fields for dynamic loading and validation final ModelListingCapability? providerCapability; // Capability of the selected provider final bool isTestingApiKey; // Is an API key currently being tested? final String? apiKeyTestSuccessProvider; // Which provider's key was successfully tested? final String? apiKeyTestError; // Error message from the last API key test // 获取已验证的配置,用于选择器 List get validatedConfigs => configs.where((c) => c.isValidated).toList(); // 获取默认配置 UserAIModelConfigModel? get defaultConfig => configs.firstWhereOrNull((c) => c.isDefault); // 获取特定提供商的默认配置 UserAIModelConfigModel? getProviderDefaultConfig(String provider) { return providerDefaultConfigs[provider]; } AiConfigState copyWith({ AiConfigStatus? status, List? configs, List? availableProviders, List? modelsForProvider, List? modelsForProviderInfo, Map? modelGroups, String? selectedProviderForModels, // Use ValueGetter to allow clearing the value by passing () => null ValueGetter? selectedProviderForModelsClearable, Map? providerDefaultConfigs, String? loadingConfigId, // Use ValueGetter for nullable loadingConfigId ValueGetter? loadingConfigIdClearable, AiConfigActionStatus? actionStatus, ValueGetter? errorMessage, // Use ValueGetter for nullable fields ValueGetter? actionErrorMessage, // New fields ModelListingCapability? providerCapability, ValueGetter? providerCapabilityClearable, bool? isTestingApiKey, String? apiKeyTestSuccessProvider, ValueGetter? apiKeyTestSuccessProviderClearable, String? apiKeyTestError, ValueGetter? apiKeyTestErrorClearable, // Helper for clearing models - not a direct state field bool clearModels = false, }) { return AiConfigState( status: status ?? this.status, configs: configs ?? this.configs, availableProviders: availableProviders ?? this.availableProviders, modelsForProvider: clearModels ? [] : (modelsForProvider ?? this.modelsForProvider), modelsForProviderInfo: clearModels ? [] : (modelsForProviderInfo ?? this.modelsForProviderInfo), modelGroups: modelGroups ?? this.modelGroups, selectedProviderForModels: selectedProviderForModelsClearable != null ? selectedProviderForModelsClearable() : selectedProviderForModels ?? this.selectedProviderForModels, providerDefaultConfigs: providerDefaultConfigs ?? this.providerDefaultConfigs, loadingConfigId: loadingConfigIdClearable != null ? loadingConfigIdClearable() : loadingConfigId ?? this.loadingConfigId, actionStatus: actionStatus ?? this.actionStatus, errorMessage: errorMessage != null ? errorMessage() : this.errorMessage, actionErrorMessage: actionErrorMessage != null ? actionErrorMessage() : this.actionErrorMessage, // New fields providerCapability: providerCapabilityClearable != null ? providerCapabilityClearable() : providerCapability ?? this.providerCapability, isTestingApiKey: isTestingApiKey ?? this.isTestingApiKey, apiKeyTestSuccessProvider: apiKeyTestSuccessProviderClearable != null ? apiKeyTestSuccessProviderClearable() : apiKeyTestSuccessProvider ?? this.apiKeyTestSuccessProvider, apiKeyTestError: apiKeyTestErrorClearable != null ? apiKeyTestErrorClearable() : apiKeyTestError ?? this.apiKeyTestError, ); } @override List get props => [ status, configs, availableProviders, modelsForProvider, modelsForProviderInfo, modelGroups, selectedProviderForModels, providerDefaultConfigs, loadingConfigId, actionStatus, errorMessage, actionErrorMessage, // New state fields providerCapability, isTestingApiKey, apiKeyTestSuccessProvider, apiKeyTestError, ]; }