analysis_models.dart 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. class AnalysisSessionSummary {
  2. const AnalysisSessionSummary({
  3. required this.sessionId,
  4. required this.observationId,
  5. required this.status,
  6. required this.message,
  7. });
  8. final String sessionId;
  9. final String observationId;
  10. final String status;
  11. final String message;
  12. factory AnalysisSessionSummary.fromJson(Map<String, dynamic> json) {
  13. return AnalysisSessionSummary(
  14. sessionId: json['session_id'] as String,
  15. observationId: json['observation_id'] as String,
  16. status: json['status'] as String,
  17. message: json['message'] as String,
  18. );
  19. }
  20. }
  21. class ObservationSummary {
  22. const ObservationSummary({
  23. required this.id,
  24. required this.modality,
  25. required this.durationMs,
  26. required this.sampleRate,
  27. required this.channels,
  28. required this.tags,
  29. required this.captureMetadata,
  30. });
  31. final String id;
  32. final String modality;
  33. final int durationMs;
  34. final int sampleRate;
  35. final int channels;
  36. final List<String> tags;
  37. final Map<String, dynamic> captureMetadata;
  38. factory ObservationSummary.fromJson(Map<String, dynamic> json) {
  39. return ObservationSummary(
  40. id: json['id'] as String,
  41. modality: json['modality'] as String,
  42. durationMs: json['duration_ms'] as int,
  43. sampleRate: json['sample_rate'] as int,
  44. channels: json['channels'] as int,
  45. tags: (json['tags'] as List<dynamic>).cast<String>(),
  46. captureMetadata:
  47. (json['capture_metadata'] as Map<String, dynamic>? ?? const {}),
  48. );
  49. }
  50. }
  51. class EvidenceSummary {
  52. const EvidenceSummary({
  53. required this.id,
  54. required this.producerModuleId,
  55. required this.category,
  56. required this.values,
  57. required this.confidence,
  58. });
  59. final String id;
  60. final String? producerModuleId;
  61. final String category;
  62. final Map<String, dynamic> values;
  63. final double confidence;
  64. factory EvidenceSummary.fromJson(Map<String, dynamic> json) {
  65. return EvidenceSummary(
  66. id: json['id'] as String,
  67. producerModuleId: json['producer_module_id'] as String?,
  68. category: json['category'] as String,
  69. values: (json['values'] as Map<String, dynamic>? ?? const {}),
  70. confidence: (json['confidence'] as num).toDouble(),
  71. );
  72. }
  73. }
  74. class ScoreCard {
  75. const ScoreCard({
  76. required this.total,
  77. required this.components,
  78. required this.penalties,
  79. required this.notes,
  80. });
  81. final double total;
  82. final Map<String, double> components;
  83. final Map<String, double> penalties;
  84. final List<String> notes;
  85. factory ScoreCard.fromJson(Map<String, dynamic> json) {
  86. Map<String, double> toDoubleMap(Map<String, dynamic>? source) {
  87. if (source == null) return const {};
  88. return source.map(
  89. (key, value) => MapEntry(key, (value as num).toDouble()),
  90. );
  91. }
  92. return ScoreCard(
  93. total: (json['total'] as num).toDouble(),
  94. components: toDoubleMap(json['components'] as Map<String, dynamic>?),
  95. penalties: toDoubleMap(json['penalties'] as Map<String, dynamic>?),
  96. notes: (json['notes'] as List<dynamic>? ?? const []).cast<String>(),
  97. );
  98. }
  99. }
  100. class ExperimentSummary {
  101. const ExperimentSummary({
  102. required this.id,
  103. required this.parentId,
  104. required this.hypothesisId,
  105. required this.title,
  106. required this.status,
  107. required this.pipelineSummary,
  108. required this.score,
  109. required this.failureReasons,
  110. });
  111. final String id;
  112. final String? parentId;
  113. final String? hypothesisId;
  114. final String title;
  115. final String status;
  116. final List<String> pipelineSummary;
  117. final ScoreCard score;
  118. final List<String> failureReasons;
  119. factory ExperimentSummary.fromJson(Map<String, dynamic> json) {
  120. return ExperimentSummary(
  121. id: json['id'] as String,
  122. parentId: json['parent_id'] as String?,
  123. hypothesisId: json['hypothesis_id'] as String?,
  124. title: json['title'] as String,
  125. status: json['status'] as String,
  126. pipelineSummary: (json['pipeline_summary'] as List<dynamic>)
  127. .cast<String>(),
  128. score: ScoreCard.fromJson(json['score'] as Map<String, dynamic>),
  129. failureReasons: (json['failure_reasons'] as List<dynamic>? ?? const [])
  130. .cast<String>(),
  131. );
  132. }
  133. }
  134. class HypothesisSummary {
  135. const HypothesisSummary({
  136. required this.id,
  137. required this.label,
  138. required this.rationale,
  139. required this.confidence,
  140. required this.relatedSignalProfiles,
  141. });
  142. final String id;
  143. final String label;
  144. final String rationale;
  145. final double confidence;
  146. final List<String> relatedSignalProfiles;
  147. factory HypothesisSummary.fromJson(Map<String, dynamic> json) {
  148. return HypothesisSummary(
  149. id: json['id'] as String,
  150. label: json['label'] as String,
  151. rationale: json['rationale'] as String,
  152. confidence: (json['confidence'] as num).toDouble(),
  153. relatedSignalProfiles: (json['related_signal_profiles'] as List<dynamic>)
  154. .cast<String>(),
  155. );
  156. }
  157. }
  158. class RankedFinding {
  159. const RankedFinding({
  160. required this.label,
  161. required this.confidence,
  162. required this.supportingEvidence,
  163. required this.contradictingEvidence,
  164. });
  165. final String label;
  166. final double confidence;
  167. final List<String> supportingEvidence;
  168. final List<String> contradictingEvidence;
  169. factory RankedFinding.fromJson(Map<String, dynamic> json) {
  170. return RankedFinding(
  171. label: json['label'] as String,
  172. confidence: (json['confidence'] as num).toDouble(),
  173. supportingEvidence: (json['supporting_evidence'] as List<dynamic>)
  174. .cast<String>(),
  175. contradictingEvidence: (json['contradicting_evidence'] as List<dynamic>)
  176. .cast<String>(),
  177. );
  178. }
  179. }
  180. class ConclusionSummary {
  181. const ConclusionSummary({
  182. required this.summary,
  183. required this.findings,
  184. required this.uncertainty,
  185. required this.suggestedNextActions,
  186. });
  187. final String summary;
  188. final List<RankedFinding> findings;
  189. final List<String> uncertainty;
  190. final List<String> suggestedNextActions;
  191. factory ConclusionSummary.fromJson(Map<String, dynamic> json) {
  192. return ConclusionSummary(
  193. summary: json['summary'] as String,
  194. findings: (json['findings'] as List<dynamic>)
  195. .map((item) => RankedFinding.fromJson(item as Map<String, dynamic>))
  196. .toList(),
  197. uncertainty: (json['uncertainty'] as List<dynamic>).cast<String>(),
  198. suggestedNextActions: (json['suggested_next_actions'] as List<dynamic>)
  199. .cast<String>(),
  200. );
  201. }
  202. }
  203. class AnalysisSessionSnapshot {
  204. const AnalysisSessionSnapshot({
  205. required this.sessionId,
  206. required this.observationId,
  207. required this.status,
  208. required this.mode,
  209. required this.observation,
  210. required this.hypotheses,
  211. required this.probeEvidence,
  212. required this.experiments,
  213. required this.conclusion,
  214. });
  215. final String sessionId;
  216. final String observationId;
  217. final String status;
  218. final String mode;
  219. final ObservationSummary observation;
  220. final List<HypothesisSummary> hypotheses;
  221. final List<EvidenceSummary> probeEvidence;
  222. final List<ExperimentSummary> experiments;
  223. final ConclusionSummary conclusion;
  224. factory AnalysisSessionSnapshot.fromJson(Map<String, dynamic> json) {
  225. return AnalysisSessionSnapshot(
  226. sessionId: json['session_id'] as String,
  227. observationId: json['observation_id'] as String,
  228. status: json['status'] as String,
  229. mode: json['mode'] as String,
  230. observation: ObservationSummary.fromJson(
  231. json['observation'] as Map<String, dynamic>,
  232. ),
  233. hypotheses: (json['hypotheses'] as List<dynamic>)
  234. .map(
  235. (item) => HypothesisSummary.fromJson(item as Map<String, dynamic>),
  236. )
  237. .toList(),
  238. probeEvidence: (json['probe_evidence'] as List<dynamic>)
  239. .map((item) => EvidenceSummary.fromJson(item as Map<String, dynamic>))
  240. .toList(),
  241. experiments: (json['experiments'] as List<dynamic>)
  242. .map(
  243. (item) => ExperimentSummary.fromJson(item as Map<String, dynamic>),
  244. )
  245. .toList(),
  246. conclusion: ConclusionSummary.fromJson(
  247. json['conclusion'] as Map<String, dynamic>,
  248. ),
  249. );
  250. }
  251. }