IA e pequenas coisas a funcionar

This commit is contained in:
2026-05-10 18:45:00 +01:00
parent 0f382e970b
commit 3475b57036
21 changed files with 4484 additions and 72 deletions

View File

@@ -0,0 +1,145 @@
import 'package:cloud_firestore/cloud_firestore.dart';
/// Model for processed content chunks used in RAG system
class ContentChunk {
final String id;
final String contentId;
final String text;
final String subject;
final String concept;
final String? subConcept;
final String unit;
final double difficulty;
final int grade;
final List<double> embedding;
final String sourceDocument;
final Map<String, dynamic> metadata;
final DateTime createdAt;
final DateTime? lastUpdated;
final bool isActive;
final int? pageNumber;
final String? section;
ContentChunk({
required this.id,
required this.contentId,
required this.text,
required this.subject,
required this.concept,
this.subConcept,
required this.unit,
required this.difficulty,
required this.grade,
required this.embedding,
required this.sourceDocument,
required this.metadata,
required this.createdAt,
this.lastUpdated,
this.isActive = true,
this.pageNumber,
this.section,
});
/// Create from Firestore document
factory ContentChunk.fromFirestore(
Map<String, dynamic> data,
String documentId,
) {
return ContentChunk(
id: documentId,
contentId: data['contentId'] ?? '',
text: data['text'] ?? '',
subject: data['subject'] ?? '',
concept: data['concept'] ?? '',
subConcept: data['subConcept'],
unit: data['unit'] ?? '',
difficulty: (data['difficulty'] as num?)?.toDouble() ?? 0.5,
grade: data['grade'] ?? 10,
embedding: List<double>.from(data['embedding'] ?? []),
sourceDocument: data['sourceDocument'] ?? '',
metadata: Map<String, dynamic>.from(data['metadata'] ?? {}),
createdAt: (data['createdAt'] as Timestamp?)?.toDate() ?? DateTime.now(),
lastUpdated: (data['lastUpdated'] as Timestamp?)?.toDate(),
isActive: data['isActive'] ?? true,
pageNumber: data['pageNumber'],
section: data['section'],
);
}
/// Convert to Firestore document
Map<String, dynamic> toFirestore() {
return {
'contentId': contentId,
'text': text,
'subject': subject,
'concept': concept,
if (subConcept != null) 'subConcept': subConcept,
'unit': unit,
'difficulty': difficulty,
'grade': grade,
'embedding': embedding,
'sourceDocument': sourceDocument,
'metadata': metadata,
'createdAt': Timestamp.fromDate(createdAt),
if (lastUpdated != null) 'lastUpdated': Timestamp.fromDate(lastUpdated!),
'isActive': isActive,
if (pageNumber != null) 'pageNumber': pageNumber,
if (section != null) 'section': section,
};
}
/// Create a copy with updated fields
ContentChunk copyWith({
String? id,
String? contentId,
String? text,
String? subject,
String? concept,
String? subConcept,
String? unit,
double? difficulty,
int? grade,
List<double>? embedding,
String? sourceDocument,
Map<String, dynamic>? metadata,
DateTime? createdAt,
DateTime? lastUpdated,
bool? isActive,
int? pageNumber,
String? section,
}) {
return ContentChunk(
id: id ?? this.id,
contentId: contentId ?? this.contentId,
text: text ?? this.text,
subject: subject ?? this.subject,
concept: concept ?? this.concept,
subConcept: subConcept ?? this.subConcept,
unit: unit ?? this.unit,
difficulty: difficulty ?? this.difficulty,
grade: grade ?? this.grade,
embedding: embedding ?? this.embedding,
sourceDocument: sourceDocument ?? this.sourceDocument,
metadata: metadata ?? this.metadata,
createdAt: createdAt ?? this.createdAt,
lastUpdated: lastUpdated ?? this.lastUpdated,
isActive: isActive ?? this.isActive,
pageNumber: pageNumber ?? this.pageNumber,
section: section ?? this.section,
);
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is ContentChunk && other.id == id;
}
@override
int get hashCode => id.hashCode;
@override
String toString() {
return 'ContentChunk(id: $id, subject: $subject, concept: $concept, difficulty: $difficulty)';
}
}