import '../utils/date_time_parser.dart'; /// AI功能类型枚举 enum AIFeatureType { /// 场景生成摘要 sceneToSummary, /// 摘要生成场景 summaryToScene, /// 文本扩写功能 textExpansion, /// 文本重构功能 textRefactor, /// 文本缩写功能 textSummary, /// AI聊天对话功能 aiChat, /// 小说内容生成功能 novelGeneration, /// 专业续写小说功能 professionalFictionContinuation, /// 场景节拍生成功能 sceneBeatGeneration, /// 写作编排(大纲/章节/组合) novelCompose, /// 设定树生成功能 settingTreeGeneration } /// 提示词类型枚举 enum PromptType { /// 摘要提示词 summary, /// 风格提示词 style } /// 提示词优化风格 enum OptimizationStyle { /// 专业风格 professional, /// 创意风格 creative, /// 简洁风格 concise } /// 提示词模板类型 enum TemplateType { /// 公共模板 public, /// 私有模板 private } /// 提示词项 class PromptItem { final String id; final String title; final String content; final PromptType type; PromptItem({ required this.id, required this.title, required this.content, required this.type, }); factory PromptItem.fromJson(Map json) { return PromptItem( id: json['id'] as String, title: json['title'] as String, content: json['content'] as String, type: PromptType.values.firstWhere( (e) => e.toString().split('.').last == json['type'], orElse: () => PromptType.summary, ), ); } Map toJson() { return { 'id': id, 'title': title, 'content': content, 'type': type.toString().split('.').last, }; } } /// 提示词数据模型 class PromptData { /// 用户自定义提示词 final String userPrompt; /// 系统默认提示词 final String defaultPrompt; /// 是否为用户自定义 final bool isCustomized; /// 提示词项列表 final List promptItems; PromptData({ required this.userPrompt, required this.defaultPrompt, required this.isCustomized, this.promptItems = const [], }); /// 获取当前生效的提示词(如果自定义则返回用户提示词,否则返回默认提示词) String get activePrompt => isCustomized ? userPrompt : defaultPrompt; /// 获取摘要类型的提示词列表 List get summaryPrompts => promptItems.where((item) => item.type == PromptType.summary).toList(); /// 获取风格类型的提示词列表 List get stylePrompts => promptItems.where((item) => item.type == PromptType.style).toList(); } /// 提示词模板模型 class PromptTemplate { /// 模板ID final String id; /// 模板名称 final String name; /// 模板内容 final String content; /// 功能类型 final AIFeatureType featureType; /// 是否为公共模板 final bool isPublic; /// 作者ID(公共模板可为null或系统ID) final String? authorId; /// 源模板ID(如果是从公共模板复制的) final String? sourceTemplateId; /// 是否为官方验证模板 final bool isVerified; /// 用户是否收藏(仅对私有模板有效) final bool isFavorite; /// 是否为默认模板 final bool isDefault; /// 创建时间 final DateTime createdAt; /// 更新时间 final DateTime updatedAt; /// 模板描述 final String? description; /// 模板标签 final List? templateTags; /// 作者名称 final String? authorName; /// 使用次数 final int? useCount; /// 平均评分 final double? averageRating; /// 评分次数 final int? ratingCount; /// AI功能类型(别名,保持向后兼容) AIFeatureType? get aiFeatureType => featureType; PromptTemplate({ required this.id, required this.name, required this.content, required this.featureType, required this.isPublic, this.authorId, this.sourceTemplateId, this.isVerified = false, this.isFavorite = false, this.isDefault = false, required this.createdAt, required this.updatedAt, this.description, this.templateTags, this.authorName, this.useCount, this.averageRating, this.ratingCount, }); /// 创建私有模板 factory PromptTemplate.createPrivate({ required String id, required String name, required String content, required AIFeatureType featureType, required String authorId, String? sourceTemplateId, bool isFavorite = false, }) { final now = DateTime.now(); return PromptTemplate( id: id, name: name, content: content, featureType: featureType, isPublic: false, authorId: authorId, sourceTemplateId: sourceTemplateId, isVerified: false, isFavorite: isFavorite, isDefault: false, createdAt: now, updatedAt: now, description: null, templateTags: null, authorName: null, useCount: 0, averageRating: null, ratingCount: 0, ); } /// 从公共模板复制创建私有模板 factory PromptTemplate.copyFromPublic({ required PromptTemplate publicTemplate, required String newId, required String authorId, String? newName, }) { final now = DateTime.now(); return PromptTemplate( id: newId, name: newName ?? '${publicTemplate.name} (复制)', content: publicTemplate.content, featureType: publicTemplate.featureType, isPublic: false, authorId: authorId, sourceTemplateId: publicTemplate.id, isVerified: false, isFavorite: false, isDefault: false, createdAt: now, updatedAt: now, description: null, templateTags: null, authorName: null, useCount: 0, averageRating: null, ratingCount: 0, ); } factory PromptTemplate.fromJson(Map json) { return PromptTemplate( id: (json['id'] ?? '').toString(), name: (json['name'] ?? '').toString(), content: (json['content'] ?? '').toString(), featureType: _parseFeatureType(json['featureType']), isPublic: json['isPublic'] as bool? ?? false, authorId: (json['authorId'])?.toString(), sourceTemplateId: (json['sourceTemplateId'])?.toString(), isVerified: json['isVerified'] as bool? ?? false, isFavorite: json['isFavorite'] as bool? ?? false, isDefault: json['isDefault'] as bool? ?? false, createdAt: parseBackendDateTime(json['createdAt']), updatedAt: parseBackendDateTime(json['updatedAt']), description: json['description']?.toString(), templateTags: (json['templateTags'] as List?)?.map((e) => e.toString()).toList(), authorName: json['authorName']?.toString(), useCount: (json['useCount'] as num?)?.toInt(), averageRating: (json['averageRating'] as num?)?.toDouble(), ratingCount: (json['ratingCount'] as num?)?.toInt(), ); } Map toJson() { return { 'id': id, 'name': name, 'content': content, 'featureType': _featureTypeToString(featureType), 'isPublic': isPublic, 'authorId': authorId, 'sourceTemplateId': sourceTemplateId, 'isVerified': isVerified, 'isFavorite': isFavorite, 'isDefault': isDefault, 'createdAt': createdAt.toIso8601String(), 'updatedAt': updatedAt.toIso8601String(), 'description': description, 'templateTags': templateTags, 'authorName': authorName, 'useCount': useCount, 'averageRating': averageRating, 'ratingCount': ratingCount, }; } /// 克隆并更新模板 PromptTemplate copyWith({ String? id, String? name, String? content, AIFeatureType? featureType, bool? isPublic, String? authorId, String? sourceTemplateId, bool? isVerified, bool? isFavorite, bool? isDefault, DateTime? createdAt, DateTime? updatedAt, String? description, List? templateTags, String? authorName, int? useCount, double? averageRating, int? ratingCount, }) { return PromptTemplate( id: id ?? this.id, name: name ?? this.name, content: content ?? this.content, featureType: featureType ?? this.featureType, isPublic: isPublic ?? this.isPublic, authorId: authorId ?? this.authorId, sourceTemplateId: sourceTemplateId ?? this.sourceTemplateId, isVerified: isVerified ?? this.isVerified, isFavorite: isFavorite ?? this.isFavorite, isDefault: isDefault ?? this.isDefault, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, description: description ?? this.description, templateTags: templateTags ?? this.templateTags, authorName: authorName ?? this.authorName, useCount: useCount ?? this.useCount, averageRating: averageRating ?? this.averageRating, ratingCount: ratingCount ?? this.ratingCount, ); } /// 标记为收藏 PromptTemplate toggleFavorite() { return copyWith(isFavorite: !isFavorite, updatedAt: DateTime.now()); } /// 判断模板是否可编辑(只有私有模板可编辑) bool get isEditable => !isPublic; /// 从字符串解析功能类型 static AIFeatureType _parseFeatureType(dynamic featureTypeValue) { final featureTypeStr = featureTypeValue?.toString() ?? ''; switch (featureTypeStr) { case 'SCENE_TO_SUMMARY': return AIFeatureType.sceneToSummary; case 'SUMMARY_TO_SCENE': return AIFeatureType.summaryToScene; case 'TEXT_EXPANSION': return AIFeatureType.textExpansion; case 'TEXT_REFACTOR': return AIFeatureType.textRefactor; case 'TEXT_SUMMARY': return AIFeatureType.textSummary; case 'AI_CHAT': return AIFeatureType.aiChat; case 'NOVEL_GENERATION': return AIFeatureType.novelGeneration; case 'PROFESSIONAL_FICTION_CONTINUATION': return AIFeatureType.professionalFictionContinuation; case 'SCENE_BEAT_GENERATION': return AIFeatureType.sceneBeatGeneration; case 'NOVEL_COMPOSE': return AIFeatureType.novelCompose; case 'SETTING_TREE_GENERATION': return AIFeatureType.settingTreeGeneration; default: // 尝试直接匹配枚举的名称 try { return AIFeatureType.values.firstWhere( (t) => t.toString().split('.').last.toUpperCase() == featureTypeStr.toUpperCase(), ); } catch (_) { return AIFeatureType.textExpansion; // 默认值 } } } /// 将功能类型转换为字符串 static String _featureTypeToString(AIFeatureType featureType) { switch (featureType) { case AIFeatureType.sceneToSummary: return 'SCENE_TO_SUMMARY'; case AIFeatureType.summaryToScene: return 'SUMMARY_TO_SCENE'; case AIFeatureType.textExpansion: return 'TEXT_EXPANSION'; case AIFeatureType.textRefactor: return 'TEXT_REFACTOR'; case AIFeatureType.textSummary: return 'TEXT_SUMMARY'; case AIFeatureType.aiChat: return 'AI_CHAT'; case AIFeatureType.novelGeneration: return 'NOVEL_GENERATION'; case AIFeatureType.professionalFictionContinuation: return 'PROFESSIONAL_FICTION_CONTINUATION'; case AIFeatureType.sceneBeatGeneration: return 'SCENE_BEAT_GENERATION'; case AIFeatureType.novelCompose: return 'NOVEL_COMPOSE'; case AIFeatureType.settingTreeGeneration: return 'SETTING_TREE_GENERATION'; } } } /// 用户提示词模板DTO class UserPromptTemplateDto { /// 功能类型 final AIFeatureType featureType; /// 提示词文本 final String promptText; UserPromptTemplateDto({ required this.featureType, required this.promptText, }); factory UserPromptTemplateDto.fromJson(Map json) { String featureTypeStr = json['featureType'] as String; AIFeatureType type; // 根据字符串解析枚举 switch (featureTypeStr) { case 'SCENE_TO_SUMMARY': type = AIFeatureType.sceneToSummary; break; case 'SUMMARY_TO_SCENE': type = AIFeatureType.summaryToScene; break; case 'TEXT_EXPANSION': type = AIFeatureType.textExpansion; break; case 'TEXT_REFACTOR': type = AIFeatureType.textRefactor; break; case 'TEXT_SUMMARY': type = AIFeatureType.textSummary; break; case 'AI_CHAT': type = AIFeatureType.aiChat; break; case 'NOVEL_GENERATION': type = AIFeatureType.novelGeneration; break; case 'PROFESSIONAL_FICTION_CONTINUATION': type = AIFeatureType.professionalFictionContinuation; break; case 'SCENE_BEAT_GENERATION': type = AIFeatureType.sceneBeatGeneration; break; case 'NOVEL_COMPOSE': type = AIFeatureType.novelCompose; break; case 'SETTING_TREE_GENERATION': type = AIFeatureType.settingTreeGeneration; break; default: // 尝试直接匹配枚举的名称 try { type = AIFeatureType.values.firstWhere( (t) => t.toString().split('.').last.toUpperCase() == featureTypeStr.toUpperCase() ); } catch (e) { throw ArgumentError('未知的功能类型: $featureTypeStr'); } } return UserPromptTemplateDto( featureType: type, promptText: json['promptText'] as String, ); } Map toJson() { String featureTypeStr; // 将枚举转换为字符串 switch (featureType) { case AIFeatureType.sceneToSummary: featureTypeStr = 'SCENE_TO_SUMMARY'; break; case AIFeatureType.summaryToScene: featureTypeStr = 'SUMMARY_TO_SCENE'; break; case AIFeatureType.textExpansion: featureTypeStr = 'TEXT_EXPANSION'; break; case AIFeatureType.textRefactor: featureTypeStr = 'TEXT_REFACTOR'; break; case AIFeatureType.textSummary: featureTypeStr = 'TEXT_SUMMARY'; break; case AIFeatureType.aiChat: featureTypeStr = 'AI_CHAT'; break; case AIFeatureType.novelGeneration: featureTypeStr = 'NOVEL_GENERATION'; break; case AIFeatureType.professionalFictionContinuation: featureTypeStr = 'PROFESSIONAL_FICTION_CONTINUATION'; break; case AIFeatureType.sceneBeatGeneration: featureTypeStr = 'SCENE_BEAT_GENERATION'; break; case AIFeatureType.novelCompose: featureTypeStr = 'NOVEL_COMPOSE'; break; case AIFeatureType.settingTreeGeneration: featureTypeStr = 'SETTING_TREE_GENERATION'; break; } return { 'featureType': featureTypeStr, 'promptText': promptText, }; } } /// 更新提示词请求DTO class UpdatePromptRequest { /// 提示词文本 final String promptText; UpdatePromptRequest({ required this.promptText, }); factory UpdatePromptRequest.fromJson(Map json) { return UpdatePromptRequest( promptText: json['promptText'] as String, ); } Map toJson() { return { 'promptText': promptText, }; } } /// 优化提示词请求 class OptimizePromptRequest { final String content; final OptimizationStyle style; final double preserveRatio; // 0.0-1.0 保留原文比例 OptimizePromptRequest({ required this.content, required this.style, this.preserveRatio = 0.5, }); factory OptimizePromptRequest.fromJson(Map json) { return OptimizePromptRequest( content: json['content'] as String, style: _parseOptimizationStyle(json['style'] as String), preserveRatio: json['preserveRatio'] as double? ?? 0.5, ); } Map toJson() { return { 'content': content, 'style': _optimizationStyleToString(style), 'preserveRatio': preserveRatio, }; } } /// 解析优化风格 OptimizationStyle _parseOptimizationStyle(String value) { return OptimizationStyle.values.firstWhere( (e) => e.toString().split('.').last == value, orElse: () => OptimizationStyle.professional, ); } /// 优化风格转字符串 String _optimizationStyleToString(OptimizationStyle style) { return style.toString().split('.').last; } /// 优化区块 class OptimizationSection { final String title; final String content; final String? original; final String type; OptimizationSection({ required this.title, required this.content, this.original, required this.type, }); /// 是否为未更改的区块 bool get isUnchanged => type == 'unchanged'; /// 是否为修改过的区块 bool get isModified => type == 'modified'; factory OptimizationSection.fromJson(Map json) { return OptimizationSection( title: json['title'] as String, content: json['content'] as String, original: json['original'] as String?, type: json['type'] as String, ); } Map toJson() { return { 'title': title, 'content': content, 'original': original, 'type': type, }; } } /// 优化统计数据 class OptimizationStatistics { final int originalTokens; final int optimizedTokens; final int originalLength; final int optimizedLength; final double efficiency; // 兼容旧版API的属性 int get originalWordCount => originalLength; int get optimizedWordCount => optimizedLength; double get changeRatio => efficiency; OptimizationStatistics({ required this.originalTokens, required this.optimizedTokens, required this.originalLength, required this.optimizedLength, required this.efficiency, }); factory OptimizationStatistics.fromJson(Map json) { return OptimizationStatistics( originalTokens: json['originalTokens'] as int, optimizedTokens: json['optimizedTokens'] as int, originalLength: json['originalLength'] as int, optimizedLength: json['optimizedLength'] as int, efficiency: json['efficiency'] as double, ); } Map toJson() { return { 'originalTokens': originalTokens, 'optimizedTokens': optimizedTokens, 'originalLength': originalLength, 'optimizedLength': optimizedLength, 'efficiency': efficiency, }; } } /// 优化结果 class OptimizationResult { final String optimizedContent; final List sections; final OptimizationStatistics statistics; OptimizationResult({ required this.optimizedContent, required this.sections, required this.statistics, }); factory OptimizationResult.fromJson(Map json) { return OptimizationResult( optimizedContent: json['optimizedContent'] as String, sections: (json['sections'] as List) .map((e) => OptimizationSection.fromJson(e as Map)) .toList(), statistics: OptimizationStatistics.fromJson( json['statistics'] as Map), ); } Map toJson() { return { 'optimizedContent': optimizedContent, 'sections': sections.map((e) => e.toJson()).toList(), 'statistics': statistics.toJson(), }; } } // 字符串构建器类 class StringBuilder { final StringBuffer _buffer = StringBuffer(); void append(String str) { _buffer.write(str); } void appendLine(String str) { _buffer.writeln(str); } @override String toString() { return _buffer.toString(); } void clear() { _buffer.clear(); } int get length => _buffer.length; bool get isEmpty => _buffer.isEmpty; bool get isNotEmpty => _buffer.isNotEmpty; } // ====================== 统一提示词聚合相关模型 ====================== /// 系统提示词信息 class SystemPromptInfo { final String defaultSystemPrompt; final String defaultUserPrompt; final String? userCustomSystemPrompt; final bool hasUserCustom; const SystemPromptInfo({ required this.defaultSystemPrompt, required this.defaultUserPrompt, this.userCustomSystemPrompt, required this.hasUserCustom, }); /// 获取生效的系统提示词 String get effectivePrompt => hasUserCustom && userCustomSystemPrompt != null ? userCustomSystemPrompt! : defaultSystemPrompt; factory SystemPromptInfo.fromJson(Map json) { return SystemPromptInfo( defaultSystemPrompt: json['defaultSystemPrompt'] as String? ?? '', defaultUserPrompt: json['defaultUserPrompt'] as String? ?? '请在此处输入您的具体需求和内容...', userCustomSystemPrompt: json['userCustomSystemPrompt'] as String?, hasUserCustom: json['hasUserCustom'] as bool? ?? false, ); } Map toJson() { return { 'defaultSystemPrompt': defaultSystemPrompt, 'defaultUserPrompt': defaultUserPrompt, 'userCustomSystemPrompt': userCustomSystemPrompt, 'hasUserCustom': hasUserCustom, }; } } /// 用户提示词信息 class UserPromptInfo { final String id; final String name; final String? description; final AIFeatureType featureType; final String? systemPrompt; final String userPrompt; final List tags; final List categories; final bool isFavorite; final bool isDefault; final bool isPublic; final String? shareCode; final bool isVerified; final int usageCount; final int favoriteCount; final double rating; final String? authorId; final int? version; final String? language; final DateTime createdAt; final DateTime? lastUsedAt; final DateTime updatedAt; const UserPromptInfo({ required this.id, required this.name, this.description, required this.featureType, this.systemPrompt, required this.userPrompt, this.tags = const [], this.categories = const [], this.isFavorite = false, this.isDefault = false, this.isPublic = false, this.shareCode, this.isVerified = false, this.usageCount = 0, this.favoriteCount = 0, this.rating = 0.0, this.authorId, this.version = 1, this.language = 'zh', required this.createdAt, this.lastUsedAt, required this.updatedAt, }); factory UserPromptInfo.fromJson(Map json) { return UserPromptInfo( id: json['id'] as String, name: json['name'] as String, description: json['description'] as String?, featureType: PromptTemplate._parseFeatureType(json['featureType'] as String), systemPrompt: json['systemPrompt'] as String?, userPrompt: json['userPrompt'] as String? ?? '', tags: (json['tags'] as List?)?.cast() ?? [], categories: (json['categories'] as List?)?.cast() ?? [], isFavorite: json['isFavorite'] as bool? ?? false, isDefault: (json['isDefault'] ?? json['is_default'] ?? json['default'] ?? json['isDefaultTemplate']) as bool? ?? false, isPublic: json['isPublic'] as bool? ?? false, shareCode: json['shareCode'] as String?, isVerified: json['isVerified'] as bool? ?? false, usageCount: (json['usageCount'] as num?)?.toInt() ?? 0, favoriteCount: (json['favoriteCount'] as num?)?.toInt() ?? 0, rating: (json['rating'] as num?)?.toDouble() ?? 0.0, authorId: json['authorId'] as String?, version: (json['version'] as num?)?.toInt(), language: json['language'] as String?, createdAt: json['createdAt'] != null ? parseBackendDateTime(json['createdAt']) : DateTime.now(), // 提供默认值 lastUsedAt: json['lastUsedAt'] != null ? parseBackendDateTime(json['lastUsedAt']) : null, updatedAt: json['updatedAt'] != null ? parseBackendDateTime(json['updatedAt']) : DateTime.now(), // 提供默认值 ); } Map toJson() { return { 'id': id, 'name': name, 'description': description, 'featureType': PromptTemplate._featureTypeToString(featureType), 'systemPrompt': systemPrompt, 'userPrompt': userPrompt, 'tags': tags, 'categories': categories, 'isFavorite': isFavorite, 'isDefault': isDefault, 'isPublic': isPublic, 'shareCode': shareCode, 'isVerified': isVerified, 'usageCount': usageCount, 'favoriteCount': favoriteCount, 'rating': rating, 'authorId': authorId, 'version': version, 'language': language, 'createdAt': createdAt.toIso8601String(), 'lastUsedAt': lastUsedAt?.toIso8601String(), 'updatedAt': updatedAt.toIso8601String(), }; } /// 复制对象并修改指定字段 UserPromptInfo copyWith({ String? id, String? name, String? description, AIFeatureType? featureType, String? systemPrompt, String? userPrompt, List? tags, List? categories, bool? isFavorite, bool? isDefault, bool? isPublic, String? shareCode, bool? isVerified, int? usageCount, int? favoriteCount, double? rating, String? authorId, int? version, String? language, DateTime? createdAt, DateTime? lastUsedAt, DateTime? updatedAt, }) { return UserPromptInfo( id: id ?? this.id, name: name ?? this.name, description: description ?? this.description, featureType: featureType ?? this.featureType, systemPrompt: systemPrompt ?? this.systemPrompt, userPrompt: userPrompt ?? this.userPrompt, tags: tags ?? this.tags, categories: categories ?? this.categories, isFavorite: isFavorite ?? this.isFavorite, isDefault: isDefault ?? this.isDefault, isPublic: isPublic ?? this.isPublic, shareCode: shareCode ?? this.shareCode, isVerified: isVerified ?? this.isVerified, usageCount: usageCount ?? this.usageCount, favoriteCount: favoriteCount ?? this.favoriteCount, rating: rating ?? this.rating, authorId: authorId ?? this.authorId, version: version ?? this.version, language: language ?? this.language, createdAt: createdAt ?? this.createdAt, lastUsedAt: lastUsedAt ?? this.lastUsedAt, updatedAt: updatedAt ?? this.updatedAt, ); } } /// 公开提示词信息 class PublicPromptInfo { final String id; final String name; final String? description; final String? authorName; final AIFeatureType featureType; final String systemPrompt; final String userPrompt; final List tags; final List categories; final double? rating; final int usageCount; final int favoriteCount; final String? shareCode; final bool isVerified; final String? language; final int? version; final DateTime createdAt; final DateTime updatedAt; final DateTime? lastUsedAt; const PublicPromptInfo({ required this.id, required this.name, this.description, this.authorName, required this.featureType, required this.systemPrompt, required this.userPrompt, this.tags = const [], this.categories = const [], this.rating, this.usageCount = 0, this.favoriteCount = 0, this.shareCode, this.isVerified = false, this.language, this.version, required this.createdAt, required this.updatedAt, this.lastUsedAt, }); factory PublicPromptInfo.fromJson(Map json) { return PublicPromptInfo( id: json['id'] as String, name: json['name'] as String, description: json['description'] as String?, authorName: json['authorName'] as String?, featureType: PromptTemplate._parseFeatureType(json['featureType'] as String), systemPrompt: json['systemPrompt'] as String? ?? '', userPrompt: json['userPrompt'] as String? ?? '', tags: (json['tags'] as List?)?.cast() ?? [], categories: (json['categories'] as List?)?.cast() ?? [], rating: (json['rating'] as num?)?.toDouble(), usageCount: (json['usageCount'] as num?)?.toInt() ?? 0, favoriteCount: (json['favoriteCount'] as num?)?.toInt() ?? 0, shareCode: json['shareCode'] as String?, isVerified: json['isVerified'] as bool? ?? false, language: json['language'] as String?, version: (json['version'] as num?)?.toInt(), createdAt: json['createdAt'] != null ? parseBackendDateTime(json['createdAt']) : DateTime.now(), // 提供默认值 updatedAt: json['updatedAt'] != null ? parseBackendDateTime(json['updatedAt']) : DateTime.now(), // 提供默认值 lastUsedAt: json['lastUsedAt'] != null ? parseBackendDateTime(json['lastUsedAt']) : null, ); } Map toJson() { return { 'id': id, 'name': name, 'description': description, 'authorName': authorName, 'featureType': PromptTemplate._featureTypeToString(featureType), 'systemPrompt': systemPrompt, 'userPrompt': userPrompt, 'tags': tags, 'categories': categories, 'rating': rating, 'usageCount': usageCount, 'favoriteCount': favoriteCount, 'shareCode': shareCode, 'isVerified': isVerified, 'language': language, 'version': version, 'createdAt': createdAt.toIso8601String(), 'updatedAt': updatedAt.toIso8601String(), 'lastUsedAt': lastUsedAt?.toIso8601String(), }; } } /// 最近使用的提示词信息 class RecentPromptInfo { final String id; final String name; final String? description; final AIFeatureType featureType; final List tags; final bool isDefault; final bool isFavorite; final double rating; final DateTime lastUsedAt; final int usageCount; const RecentPromptInfo({ required this.id, required this.name, this.description, required this.featureType, this.tags = const [], this.isDefault = false, this.isFavorite = false, this.rating = 0.0, required this.lastUsedAt, this.usageCount = 0, }); factory RecentPromptInfo.fromJson(Map json) { return RecentPromptInfo( id: json['id'] as String, name: json['name'] as String, description: json['description'] as String?, featureType: PromptTemplate._parseFeatureType(json['featureType'] as String), tags: (json['tags'] as List?)?.cast() ?? [], isDefault: json['isDefault'] as bool? ?? false, isFavorite: json['isFavorite'] as bool? ?? false, rating: (json['rating'] as num?)?.toDouble() ?? 0.0, lastUsedAt: json['lastUsedAt'] != null ? parseBackendDateTime(json['lastUsedAt']) : DateTime.now(), // 提供默认值 usageCount: (json['usageCount'] as num?)?.toInt() ?? 0, ); } Map toJson() { return { 'id': id, 'name': name, 'description': description, 'featureType': PromptTemplate._featureTypeToString(featureType), 'tags': tags, 'isDefault': isDefault, 'isFavorite': isFavorite, 'rating': rating, 'lastUsedAt': lastUsedAt.toIso8601String(), 'usageCount': usageCount, }; } } /// 完整的提示词包 class PromptPackage { final AIFeatureType featureType; final SystemPromptInfo systemPrompt; final List userPrompts; final List publicPrompts; final List recentlyUsed; final Set supportedPlaceholders; final Map placeholderDescriptions; final DateTime lastUpdated; const PromptPackage({ required this.featureType, required this.systemPrompt, this.userPrompts = const [], this.publicPrompts = const [], this.recentlyUsed = const [], this.supportedPlaceholders = const {}, this.placeholderDescriptions = const {}, required this.lastUpdated, }); factory PromptPackage.fromJson(Map json) { return PromptPackage( featureType: PromptTemplate._parseFeatureType(json['featureType'] as String), systemPrompt: SystemPromptInfo.fromJson(json['systemPrompt'] as Map), userPrompts: (json['userPrompts'] as List?) ?.map((e) => UserPromptInfo.fromJson(e as Map)) .toList() ?? [], publicPrompts: (json['publicPrompts'] as List?) ?.map((e) => PublicPromptInfo.fromJson(e as Map)) .toList() ?? [], recentlyUsed: (json['recentlyUsed'] as List?) ?.map((e) => RecentPromptInfo.fromJson(e as Map)) .toList() ?? [], supportedPlaceholders: (json['supportedPlaceholders'] as List?) ?.cast().toSet() ?? {}, placeholderDescriptions: (json['placeholderDescriptions'] as Map?) ?.cast() ?? {}, lastUpdated: json['lastUpdated'] != null ? parseBackendDateTime(json['lastUpdated']) : DateTime.now(), // 提供默认值 ); } Map toJson() { return { 'featureType': PromptTemplate._featureTypeToString(featureType), 'systemPrompt': systemPrompt.toJson(), 'userPrompts': userPrompts.map((e) => e.toJson()).toList(), 'publicPrompts': publicPrompts.map((e) => e.toJson()).toList(), 'recentlyUsed': recentlyUsed.map((e) => e.toJson()).toList(), 'supportedPlaceholders': supportedPlaceholders.toList(), 'placeholderDescriptions': placeholderDescriptions, 'lastUpdated': lastUpdated.toIso8601String(), }; } } /// 用户提示词概览 class UserPromptOverview { final String userId; final Map promptCountsByFeature; final List globalRecentlyUsed; final List favoritePrompts; final Set allTags; final int totalUsageCount; final DateTime? lastActiveAt; const UserPromptOverview({ required this.userId, this.promptCountsByFeature = const {}, this.globalRecentlyUsed = const [], this.favoritePrompts = const [], this.allTags = const {}, this.totalUsageCount = 0, this.lastActiveAt, }); factory UserPromptOverview.fromJson(Map json) { final promptCountsJson = json['promptCountsByFeature'] as Map?; final promptCountsByFeature = {}; if (promptCountsJson != null) { for (final entry in promptCountsJson.entries) { try { final featureType = PromptTemplate._parseFeatureType(entry.key); promptCountsByFeature[featureType] = (entry.value as num).toInt(); } catch (e) { // 忽略无法解析的功能类型 } } } return UserPromptOverview( userId: json['userId'] as String, promptCountsByFeature: promptCountsByFeature, globalRecentlyUsed: (json['globalRecentlyUsed'] as List?) ?.map((e) => RecentPromptInfo.fromJson(e as Map)) .toList() ?? [], favoritePrompts: (json['favoritePrompts'] as List?) ?.map((e) => UserPromptInfo.fromJson(e as Map)) .toList() ?? [], allTags: (json['allTags'] as List?)?.cast().toSet() ?? {}, totalUsageCount: (json['totalUsageCount'] as num?)?.toInt() ?? 0, lastActiveAt: json['lastActiveAt'] != null ? parseBackendDateTime(json['lastActiveAt']) : null, ); } Map toJson() { final promptCountsJson = {}; for (final entry in promptCountsByFeature.entries) { promptCountsJson[PromptTemplate._featureTypeToString(entry.key)] = entry.value; } return { 'userId': userId, 'promptCountsByFeature': promptCountsJson, 'globalRecentlyUsed': globalRecentlyUsed.map((e) => e.toJson()).toList(), 'favoritePrompts': favoritePrompts.map((e) => e.toJson()).toList(), 'allTags': allTags.toList(), 'totalUsageCount': totalUsageCount, 'lastActiveAt': lastActiveAt?.toIso8601String(), }; } } /// 缓存预热结果 class CacheWarmupResult { final bool success; final int duration; // 毫秒 final int warmedFeatures; final int warmedPrompts; final String? errorMessage; const CacheWarmupResult({ required this.success, this.duration = 0, this.warmedFeatures = 0, this.warmedPrompts = 0, this.errorMessage, }); factory CacheWarmupResult.fromJson(Map json) { return CacheWarmupResult( success: json['success'] as bool? ?? false, duration: (json['duration'] as num?)?.toInt() ?? 0, warmedFeatures: (json['warmedFeatures'] as num?)?.toInt() ?? 0, warmedPrompts: (json['warmedPrompts'] as num?)?.toInt() ?? 0, errorMessage: json['errorMessage'] as String?, ); } Map toJson() { return { 'success': success, 'duration': duration, 'warmedFeatures': warmedFeatures, 'warmedPrompts': warmedPrompts, 'errorMessage': errorMessage, }; } } /// 聚合缓存统计 class AggregationCacheStats { final Map cacheHitCounts; final Map cacheMissCounts; final Map cacheHitRates; final int totalCacheSize; final DateTime? lastClearTime; const AggregationCacheStats({ this.cacheHitCounts = const {}, this.cacheMissCounts = const {}, this.cacheHitRates = const {}, this.totalCacheSize = 0, this.lastClearTime, }); factory AggregationCacheStats.fromJson(Map json) { return AggregationCacheStats( cacheHitCounts: (json['cacheHitCounts'] as Map?) ?.map((k, v) => MapEntry(k, (v as num).toInt())) ?? {}, cacheMissCounts: (json['cacheMissCounts'] as Map?) ?.map((k, v) => MapEntry(k, (v as num).toInt())) ?? {}, cacheHitRates: (json['cacheHitRates'] as Map?) ?.map((k, v) => MapEntry(k, (v as num).toDouble())) ?? {}, totalCacheSize: (json['totalCacheSize'] as num?)?.toInt() ?? 0, lastClearTime: json['lastClearTime'] != null ? parseBackendDateTime(json['lastClearTime']) : null, ); } Map toJson() { return { 'cacheHitCounts': cacheHitCounts, 'cacheMissCounts': cacheMissCounts, 'cacheHitRates': cacheHitRates, 'totalCacheSize': totalCacheSize, 'lastClearTime': lastClearTime?.toIso8601String(), }; } } /// 占位符性能统计 class PlaceholderPerformanceStats { final int totalResolveCount; final int parallelResolveCount; final double averageResolveTime; // 毫秒 final Map placeholderUsageCounts; final Map placeholderResolveTimes; const PlaceholderPerformanceStats({ this.totalResolveCount = 0, this.parallelResolveCount = 0, this.averageResolveTime = 0.0, this.placeholderUsageCounts = const {}, this.placeholderResolveTimes = const {}, }); factory PlaceholderPerformanceStats.fromJson(Map json) { return PlaceholderPerformanceStats( totalResolveCount: (json['totalResolveCount'] as num?)?.toInt() ?? 0, parallelResolveCount: (json['parallelResolveCount'] as num?)?.toInt() ?? 0, averageResolveTime: (json['averageResolveTime'] as num?)?.toDouble() ?? 0.0, placeholderUsageCounts: (json['placeholderUsageCounts'] as Map?) ?.map((k, v) => MapEntry(k, (v as num).toInt())) ?? {}, placeholderResolveTimes: (json['placeholderResolveTimes'] as Map?) ?.map((k, v) => MapEntry(k, (v as num).toDouble())) ?? {}, ); } Map toJson() { return { 'totalResolveCount': totalResolveCount, 'parallelResolveCount': parallelResolveCount, 'averageResolveTime': averageResolveTime, 'placeholderUsageCounts': placeholderUsageCounts, 'placeholderResolveTimes': placeholderResolveTimes, }; } } /// 系统健康状态 class SystemHealthStatus { final String status; final int timestamp; final String service; final String version; const SystemHealthStatus({ required this.status, required this.timestamp, required this.service, required this.version, }); /// 检查系统是否健康 bool get isHealthy => status.toLowerCase() == 'up'; factory SystemHealthStatus.fromJson(Map json) { return SystemHealthStatus( status: json['status'] as String? ?? 'UNKNOWN', timestamp: (json['timestamp'] as num?)?.toInt() ?? 0, service: json['service'] as String? ?? '', version: json['version'] as String? ?? '', ); } Map toJson() { return { 'status': status, 'timestamp': timestamp, 'service': service, 'version': version, }; } } // ====================== 增强用户提示词模板相关模型 ====================== /// 增强用户提示词模板 class EnhancedUserPromptTemplate { final String id; final String userId; final String name; final String? description; final AIFeatureType featureType; final String systemPrompt; final String userPrompt; final List tags; final List categories; final bool isPublic; final String? shareCode; final bool isFavorite; final bool isDefault; final int usageCount; final double rating; final int ratingCount; final DateTime createdAt; final DateTime updatedAt; final DateTime? lastUsedAt; final bool isVerified; final String? authorId; final int? version; final String? language; final int? favoriteCount; final DateTime? reviewedAt; final String? reviewedBy; final String? reviewComment; const EnhancedUserPromptTemplate({ required this.id, required this.userId, required this.name, this.description, required this.featureType, required this.systemPrompt, required this.userPrompt, this.tags = const [], this.categories = const [], this.isPublic = false, this.shareCode, this.isFavorite = false, this.isDefault = false, this.usageCount = 0, this.rating = 0.0, this.ratingCount = 0, required this.createdAt, required this.updatedAt, this.lastUsedAt, this.isVerified = false, this.authorId, this.version, this.language, this.favoriteCount, this.reviewedAt, this.reviewedBy, this.reviewComment, }); factory EnhancedUserPromptTemplate.fromJson(Map json) { return EnhancedUserPromptTemplate( id: (json['id'] ?? '') as String, userId: (json['userId'] as String?) ?? (json['authorId'] as String?) ?? '', name: json['name'] as String, description: json['description'] as String?, featureType: PromptTemplate._parseFeatureType(json['featureType'] as String? ?? 'TEXT_EXPANSION'), systemPrompt: json['systemPrompt'] as String? ?? '', userPrompt: json['userPrompt'] as String? ?? '', tags: (json['tags'] as List?)?.cast() ?? [], categories: (json['categories'] as List?)?.cast() ?? [], isPublic: json['isPublic'] as bool? ?? false, shareCode: json['shareCode'] as String?, isFavorite: json['isFavorite'] as bool? ?? false, isDefault: (json['isDefault'] ?? json['is_default'] ?? json['default'] ?? json['isDefaultTemplate']) as bool? ?? false, usageCount: (json['usageCount'] as num?)?.toInt() ?? 0, rating: (json['rating'] as num?)?.toDouble() ?? 0.0, ratingCount: (json['ratingCount'] as num?)?.toInt() ?? 0, createdAt: json['createdAt'] != null ? parseBackendDateTime(json['createdAt']) : DateTime.now(), // 提供默认值 updatedAt: json['updatedAt'] != null ? parseBackendDateTime(json['updatedAt']) : DateTime.now(), // 提供默认值 lastUsedAt: json['lastUsedAt'] != null ? parseBackendDateTime(json['lastUsedAt']) : null, isVerified: json['isVerified'] as bool? ?? false, authorId: json['authorId'] as String?, version: (json['version'] as num?)?.toInt(), language: json['language'] as String?, favoriteCount: (json['favoriteCount'] as num?)?.toInt(), reviewedAt: json['reviewedAt'] != null ? parseBackendDateTime(json['reviewedAt']) : null, reviewedBy: json['reviewedBy'] as String?, reviewComment: json['reviewComment'] as String?, ); } Map toJson() { return { 'id': id, 'userId': userId, 'name': name, 'description': description, 'featureType': PromptTemplate._featureTypeToString(featureType), 'systemPrompt': systemPrompt, 'userPrompt': userPrompt, 'tags': tags, 'categories': categories, 'isPublic': isPublic, 'shareCode': shareCode, 'isFavorite': isFavorite, 'isDefault': isDefault, 'usageCount': usageCount, 'rating': rating, 'ratingCount': ratingCount, 'createdAt': createdAt.toIso8601String(), 'updatedAt': updatedAt.toIso8601String(), 'lastUsedAt': lastUsedAt?.toIso8601String(), 'isVerified': isVerified, 'authorId': authorId, 'version': version, 'language': language, 'favoriteCount': favoriteCount, 'reviewedAt': reviewedAt?.toIso8601String(), 'reviewedBy': reviewedBy, 'reviewComment': reviewComment, }; } /// 复制模板并修改指定字段 EnhancedUserPromptTemplate copyWith({ String? id, String? userId, String? name, String? description, AIFeatureType? featureType, String? systemPrompt, String? userPrompt, List? tags, List? categories, bool? isPublic, String? shareCode, bool? isFavorite, bool? isDefault, int? usageCount, double? rating, int? ratingCount, DateTime? createdAt, DateTime? updatedAt, DateTime? lastUsedAt, bool? isVerified, String? authorId, int? version, String? language, int? favoriteCount, DateTime? reviewedAt, String? reviewedBy, String? reviewComment, }) { return EnhancedUserPromptTemplate( id: id ?? this.id, userId: userId ?? this.userId, name: name ?? this.name, description: description ?? this.description, featureType: featureType ?? this.featureType, systemPrompt: systemPrompt ?? this.systemPrompt, userPrompt: userPrompt ?? this.userPrompt, tags: tags ?? this.tags, categories: categories ?? this.categories, isPublic: isPublic ?? this.isPublic, shareCode: shareCode ?? this.shareCode, isFavorite: isFavorite ?? this.isFavorite, isDefault: isDefault ?? this.isDefault, usageCount: usageCount ?? this.usageCount, rating: rating ?? this.rating, ratingCount: ratingCount ?? this.ratingCount, createdAt: createdAt ?? this.createdAt, updatedAt: updatedAt ?? this.updatedAt, lastUsedAt: lastUsedAt ?? this.lastUsedAt, isVerified: isVerified ?? this.isVerified, authorId: authorId ?? this.authorId, version: version ?? this.version, language: language ?? this.language, favoriteCount: favoriteCount ?? this.favoriteCount, reviewedAt: reviewedAt ?? this.reviewedAt, reviewedBy: reviewedBy ?? this.reviewedBy, reviewComment: reviewComment ?? this.reviewComment, ); } } /// 创建提示词模板请求 class CreatePromptTemplateRequest { final String name; final String? description; final AIFeatureType featureType; final String systemPrompt; final String userPrompt; final List tags; final List categories; const CreatePromptTemplateRequest({ required this.name, this.description, required this.featureType, required this.systemPrompt, required this.userPrompt, this.tags = const [], this.categories = const [], }); Map toJson() { return { 'name': name, 'description': description, 'featureType': PromptTemplate._featureTypeToString(featureType), 'systemPrompt': systemPrompt, 'userPrompt': userPrompt, 'tags': tags, 'categories': categories, }; } } /// 更新提示词模板请求 class UpdatePromptTemplateRequest { final String? name; final String? description; final String? systemPrompt; final String? userPrompt; final List? tags; final List? categories; const UpdatePromptTemplateRequest({ this.name, this.description, this.systemPrompt, this.userPrompt, this.tags, this.categories, }); Map toJson() { final json = {}; if (name != null) json['name'] = name; if (description != null) json['description'] = description; if (systemPrompt != null) json['systemPrompt'] = systemPrompt; if (userPrompt != null) json['userPrompt'] = userPrompt; if (tags != null) json['tags'] = tags; if (categories != null) json['categories'] = categories; return json; } } /// 发布模板请求 class PublishTemplateRequest { final String? shareCode; const PublishTemplateRequest({this.shareCode}); Map toJson() { return { 'shareCode': shareCode, }; } } /// AI功能类型枚举扩展 extension AIFeatureTypeExtension on AIFeatureType { /// 转换为API字符串格式 String toApiString() { switch (this) { case AIFeatureType.sceneToSummary: return 'SCENE_TO_SUMMARY'; case AIFeatureType.summaryToScene: return 'SUMMARY_TO_SCENE'; case AIFeatureType.textExpansion: return 'TEXT_EXPANSION'; case AIFeatureType.textRefactor: return 'TEXT_REFACTOR'; case AIFeatureType.textSummary: return 'TEXT_SUMMARY'; case AIFeatureType.aiChat: return 'AI_CHAT'; case AIFeatureType.novelGeneration: return 'NOVEL_GENERATION'; case AIFeatureType.professionalFictionContinuation: return 'PROFESSIONAL_FICTION_CONTINUATION'; case AIFeatureType.sceneBeatGeneration: return 'SCENE_BEAT_GENERATION'; case AIFeatureType.novelCompose: return 'NOVEL_COMPOSE'; case AIFeatureType.settingTreeGeneration: return 'SETTING_TREE_GENERATION'; } } /// 获取显示名称 String get displayName { switch (this) { case AIFeatureType.sceneToSummary: return '场景摘要'; case AIFeatureType.summaryToScene: return '摘要扩写'; case AIFeatureType.textExpansion: return '文本扩写'; case AIFeatureType.textRefactor: return '文本重构'; case AIFeatureType.textSummary: return '文本总结'; case AIFeatureType.aiChat: return 'AI聊天'; case AIFeatureType.novelGeneration: return '小说生成'; case AIFeatureType.professionalFictionContinuation: return '专业续写'; case AIFeatureType.sceneBeatGeneration: return '场景节拍生成'; case AIFeatureType.novelCompose: return '设定编排'; case AIFeatureType.settingTreeGeneration: return '设定树生成'; } } /// 获取英文显示名称 String get englishName { switch (this) { case AIFeatureType.sceneToSummary: return 'Scene Beat Completions'; case AIFeatureType.summaryToScene: return 'Summary Expansions'; case AIFeatureType.textExpansion: return 'Text Expansion'; case AIFeatureType.textRefactor: return 'Text Refactor'; case AIFeatureType.textSummary: return 'Text Summary'; case AIFeatureType.aiChat: return 'AI Chat'; case AIFeatureType.novelGeneration: return 'Novel Generation'; case AIFeatureType.professionalFictionContinuation: return 'Professional Fiction Continuation'; case AIFeatureType.sceneBeatGeneration: return 'Scene Beat Generation'; case AIFeatureType.novelCompose: return 'Novel Compose'; case AIFeatureType.settingTreeGeneration: return 'Setting Tree Generation'; } } } /// AIFeatureType工具类 class AIFeatureTypeHelper { /// 从API字符串解析枚举 static AIFeatureType fromApiString(String apiString) { switch (apiString) { case 'SCENE_TO_SUMMARY': return AIFeatureType.sceneToSummary; case 'SUMMARY_TO_SCENE': return AIFeatureType.summaryToScene; case 'TEXT_EXPANSION': return AIFeatureType.textExpansion; case 'TEXT_REFACTOR': return AIFeatureType.textRefactor; case 'TEXT_SUMMARY': return AIFeatureType.textSummary; case 'AI_CHAT': return AIFeatureType.aiChat; case 'NOVEL_GENERATION': return AIFeatureType.novelGeneration; case 'PROFESSIONAL_FICTION_CONTINUATION': return AIFeatureType.professionalFictionContinuation; case 'SCENE_BEAT_GENERATION': return AIFeatureType.sceneBeatGeneration; case 'NOVEL_COMPOSE': return AIFeatureType.novelCompose; case 'SETTING_TREE_GENERATION': return AIFeatureType.settingTreeGeneration; default: // 尝试直接匹配枚举的名称 try { return AIFeatureType.values.firstWhere( (t) => t.toString().split('.').last.toUpperCase() == apiString.toUpperCase() ); } catch (e) { throw ArgumentError('未知的功能类型: $apiString'); } } } /// 批量转换枚举列表为字符串列表 static List toApiStringList(Iterable features) { return features.map((f) => f.toApiString()).toList(); } /// 批量从字符串列表解析枚举列表 static List fromApiStringList(Iterable apiStrings) { return apiStrings.map((s) => fromApiString(s)).toList(); } /// 获取所有功能类型 static List get allFeatures => AIFeatureType.values; /// 获取功能类型的API路径格式 static String toPathString(AIFeatureType featureType) { return featureType.toString().split('.').last; } }