fix(knowledgebase): parsing for knowledge
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'knowledge_base.freezed.dart';
|
||||
part 'knowledge_base.g.dart';
|
||||
import '../utils/json_parsing.dart';
|
||||
|
||||
part 'knowledge_base.freezed.dart';
|
||||
|
||||
/// A knowledge base containing documents for RAG retrieval.
|
||||
@freezed
|
||||
sealed class KnowledgeBase with _$KnowledgeBase {
|
||||
const factory KnowledgeBase({
|
||||
@@ -15,10 +17,26 @@ sealed class KnowledgeBase with _$KnowledgeBase {
|
||||
@Default({}) Map<String, dynamic> metadata,
|
||||
}) = _KnowledgeBase;
|
||||
|
||||
factory KnowledgeBase.fromJson(Map<String, dynamic> json) =>
|
||||
_$KnowledgeBaseFromJson(json);
|
||||
/// Creates a [KnowledgeBase] from JSON, handling both snake_case (new API)
|
||||
/// and camelCase (old API) field names.
|
||||
factory KnowledgeBase.fromJson(Map<String, dynamic> json) {
|
||||
return KnowledgeBase(
|
||||
id: json['id'] as String,
|
||||
name: json['name'] as String,
|
||||
description: json['description'] as String?,
|
||||
createdAt: parseDateTime(json['created_at'] ?? json['createdAt']),
|
||||
updatedAt: parseDateTime(json['updated_at'] ?? json['updatedAt']),
|
||||
itemCount: parseInt(
|
||||
json['file_count'] ?? json['item_count'] ?? json['itemCount'],
|
||||
) ??
|
||||
0,
|
||||
metadata:
|
||||
(json['metadata'] as Map<String, dynamic>?) ?? const <String, dynamic>{},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// An item within a knowledge base.
|
||||
@freezed
|
||||
sealed class KnowledgeBaseItem with _$KnowledgeBaseItem {
|
||||
const factory KnowledgeBaseItem({
|
||||
@@ -30,6 +48,17 @@ sealed class KnowledgeBaseItem with _$KnowledgeBaseItem {
|
||||
@Default({}) Map<String, dynamic> metadata,
|
||||
}) = _KnowledgeBaseItem;
|
||||
|
||||
factory KnowledgeBaseItem.fromJson(Map<String, dynamic> json) =>
|
||||
_$KnowledgeBaseItemFromJson(json);
|
||||
/// Creates a [KnowledgeBaseItem] from JSON, handling both snake_case (new API)
|
||||
/// and camelCase (old API) field names.
|
||||
factory KnowledgeBaseItem.fromJson(Map<String, dynamic> json) {
|
||||
return KnowledgeBaseItem(
|
||||
id: json['id'] as String,
|
||||
content: json['content'] as String,
|
||||
title: json['title'] as String?,
|
||||
createdAt: parseDateTime(json['created_at'] ?? json['createdAt']),
|
||||
updatedAt: parseDateTime(json['updated_at'] ?? json['updatedAt']),
|
||||
metadata:
|
||||
(json['metadata'] as Map<String, dynamic>?) ?? const <String, dynamic>{},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
54
lib/core/models/knowledge_base_file.dart
Normal file
54
lib/core/models/knowledge_base_file.dart
Normal file
@@ -0,0 +1,54 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
import '../utils/json_parsing.dart';
|
||||
|
||||
part 'knowledge_base_file.freezed.dart';
|
||||
|
||||
/// A file within a knowledge base.
|
||||
///
|
||||
/// The new WebUI API returns files from a dedicated endpoint with pagination.
|
||||
/// Files are deduplicated by content hash (not filename).
|
||||
@freezed
|
||||
sealed class KnowledgeBaseFile with _$KnowledgeBaseFile {
|
||||
const factory KnowledgeBaseFile({
|
||||
required String id,
|
||||
required String filename,
|
||||
Map<String, dynamic>? meta,
|
||||
required DateTime createdAt,
|
||||
DateTime? updatedAt,
|
||||
|
||||
/// Content hash used for server-side deduplication.
|
||||
String? contentHash,
|
||||
}) = _KnowledgeBaseFile;
|
||||
|
||||
/// Creates a [KnowledgeBaseFile] from JSON, handling various API formats.
|
||||
factory KnowledgeBaseFile.fromJson(Map<String, dynamic> json) {
|
||||
return KnowledgeBaseFile(
|
||||
id: json['id'] as String,
|
||||
filename: _extractFilename(json),
|
||||
meta: json['meta'] as Map<String, dynamic>?,
|
||||
createdAt: parseDateTime(json['created_at'] ?? json['createdAt']),
|
||||
updatedAt: parseDateTimeOrNull(json['updated_at'] ?? json['updatedAt']),
|
||||
contentHash:
|
||||
(json['hash'] ?? json['content_hash'] ?? json['contentHash'])
|
||||
as String?,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Extracts filename from various possible locations in the JSON.
|
||||
String _extractFilename(Map<String, dynamic> json) {
|
||||
if (json.containsKey('filename')) {
|
||||
return json['filename'] as String? ?? 'Unknown';
|
||||
}
|
||||
if (json.containsKey('name')) {
|
||||
return json['name'] as String? ?? 'Unknown';
|
||||
}
|
||||
// Check nested meta object
|
||||
final meta = json['meta'];
|
||||
if (meta is Map) {
|
||||
final name = meta['name'] ?? meta['filename'];
|
||||
if (name is String) return name;
|
||||
}
|
||||
return 'Unknown';
|
||||
}
|
||||
Reference in New Issue
Block a user