diff --git a/README.md b/README.md index 7be7d04..33c75a6 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,13 @@ final result = await client.detectGrooming( if (result.groomingRisk == GroomingRisk.high) { print('Flags: ${result.flags}'); // [secrecy, isolation] } + +// Per-message breakdown (optional, returned on conversation-aware endpoints) +if (result.messageAnalysis != null) { + for (final m in result.messageAnalysis!) { + print('Message ${m.messageIndex}: risk=${m.riskScore}, flags=${m.flags}, summary=${m.summary}'); + } +} ``` ### Unsafe Content Detection diff --git a/lib/src/models.dart b/lib/src/models.dart index 83cd3e0..29f2bf8 100644 --- a/lib/src/models.dart +++ b/lib/src/models.dart @@ -302,6 +302,7 @@ class GroomingResult { required this.rationale, required this.riskScore, required this.recommendedAction, + this.messageAnalysis, this.externalId, this.metadata, this.creditsUsed, @@ -317,6 +318,9 @@ class GroomingResult { rationale: json['rationale'] as String, riskScore: (json['risk_score'] as num).toDouble(), recommendedAction: json['recommended_action'] as String, + messageAnalysis: (json['message_analysis'] as List?) + ?.map((e) => MessageAnalysis.fromJson(e as Map)) + .toList(), externalId: json['external_id'] as String?, metadata: json['metadata'] as Map?, creditsUsed: json['credits_used'] as int?, @@ -331,6 +335,7 @@ class GroomingResult { final String rationale; final double riskScore; final String recommendedAction; + final List? messageAnalysis; final String? externalId; final Map? metadata; final int? creditsUsed; @@ -1102,6 +1107,30 @@ class ImageAnalysisResult { // Detection Results (Fraud & Safety Extended) // ============================================================================= +/// Per-message analysis from conversation-aware detection. +class MessageAnalysis { + const MessageAnalysis({ + required this.messageIndex, + required this.riskScore, + required this.flags, + required this.summary, + }); + + factory MessageAnalysis.fromJson(Map json) { + return MessageAnalysis( + messageIndex: json['message_index'] as int, + riskScore: (json['risk_score'] as num).toDouble(), + flags: List.from(json['flags'] as List), + summary: json['summary'] as String, + ); + } + + final int messageIndex; + final double riskScore; + final List flags; + final String summary; +} + /// A detection category with confidence score. class DetectionCategory { const DetectionCategory({ @@ -1181,6 +1210,7 @@ class DetectionResult { required this.languageStatus, this.evidence, this.ageCalibration, + this.messageAnalysis, this.creditsUsed, this.processingTimeMs, this.externalId, @@ -1209,6 +1239,9 @@ class DetectionResult { ageCalibration: json['age_calibration'] != null ? AgeCalibration.fromJson(json['age_calibration'] as Map) : null, + messageAnalysis: (json['message_analysis'] as List?) + ?.map((e) => MessageAnalysis.fromJson(e as Map)) + .toList(), creditsUsed: json['credits_used'] as int?, processingTimeMs: (json['processing_time_ms'] as num?)?.toDouble(), externalId: json['external_id'] as String?, @@ -1230,6 +1263,7 @@ class DetectionResult { final String languageStatus; final List? evidence; final AgeCalibration? ageCalibration; + final List? messageAnalysis; final int? creditsUsed; final double? processingTimeMs; final String? externalId;