DVSemanticIndex<T> constructor

DVSemanticIndex<T>({
  1. required String name,
  2. required DVEmbedder? embedder,
  3. required DVVectorAdapter vectors,
  4. required String idOf(
    1. T record
    ),
  5. required Map<String, String Function(T record)> fields,
  6. required Future<T?> load(
    1. String id
    ),
  7. String? tenantOf(
    1. T record
    )?,
  8. Map<String, String> attributesOf(
    1. T record
    )?,
  9. FutureOr<bool> canSee(
    1. T record
    )?,
  10. DVSearchProvider<T, Object?>? keyword,
  11. Map<String, Object?> toJson(
    1. T record
    )?,
  12. List<DVEmbedder> previousEmbedders = const <DVEmbedder>[],
  13. DVChunking chunking = const DVChunking(),
  14. Set<String> sensitiveFields = const <String>{},
  15. DVQueues queues = const DVQueues(),
  16. String queue = 'semantic',
  17. int maxAttempts = 3,
  18. int refillMultiple = 4,
  19. DVSemanticMetering? metering,
})

Implementation

DVSemanticIndex({
  required this.name,
  required DVEmbedder? embedder,
  required this.vectors,
  required this.idOf,
  required this.fields,
  required this.load,
  this.tenantOf,
  this.attributesOf,
  this.canSee,
  this.keyword,
  this.toJson,
  this.previousEmbedders = const <DVEmbedder>[],
  this.chunking = const DVChunking(),
  this.sensitiveFields = const <String>{},
  this.queues = const DVQueues(),
  this.queue = 'semantic',
  this.maxAttempts = 3,
  this.refillMultiple = 4,
  this.metering,
}) : embedder = _requireEmbedder(name, embedder) {
  if (fields.isEmpty) {
    throw ArgumentError.value(fields, 'fields', 'name at least one field');
  }
  final Set<String> sensitiveSemantic =
      fields.keys.toSet().intersection(sensitiveFields);
  if (sensitiveSemantic.isNotEmpty) {
    throw ArgumentError.value(
      sensitiveSemantic.join(', '),
      'fields',
      'a sensitive field cannot be embedded: its text would reach the '
          'vector store and every result that matches it',
    );
  }
  if ((tenantOf != null || canSee != null) && !vectors.canFilter) {
    throw DVSemanticConfigError(
      'DV-SEMANTIC-002',
      'the vector adapter for "$name" cannot filter, and the model is '
          '${tenantOf != null ? 'tenant' : 'policy'}-scoped. A vector query '
          'returns the k nearest, so a filter applied afterwards shows one '
          'caller another\'s rows or none of their own. Use an adapter that '
          'filters in the query.',
    );
  }
  if (refillMultiple < 1) {
    throw ArgumentError.value(refillMultiple, 'refillMultiple', 'must be positive');
  }
  _registry[name] = this;
  queues.register<DVSemanticJob>(_runJob);
}