nucliadb 6.4.0.post4302__py3-none-any.whl → 6.4.0.post4317__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -232,26 +232,39 @@ async def purge_kb_vectorsets(driver: Driver, storage: Storage):
232
232
  async for resource in kb.iterate_resources():
233
233
  fields.extend((await resource.get_fields(force=True)).values())
234
234
 
235
- # we don't need the maindb transaction anymore to remove vectors from storage
236
- for field in fields:
237
- if purge_payload.storage_key_kind == VectorSetConfig.StorageKeyKind.UNSET:
238
- # Bw/c for purge before adding purge payload. We assume
239
- # there's only 2 kinds of KBs: with one or with more than
240
- # one vectorset. KBs with one vectorset are not allowed to
241
- # delete their vectorset, so we wouldn't be here. It has to
242
- # be a KB with multiple, so the storage key kind has to be
243
- # this:
244
- await field.delete_vectors(
245
- vectorset, VectorSetConfig.StorageKeyKind.VECTORSET_PREFIX
246
- )
247
- else:
248
- await field.delete_vectors(vectorset, purge_payload.storage_key_kind)
235
+ logger.info(f"Purging {len(fields)} fields for vectorset {vectorset}", extra={"kbid": kbid})
236
+ for fields_batch in batchify(fields, 20):
237
+ tasks = []
238
+ for field in fields_batch:
239
+ if purge_payload.storage_key_kind == VectorSetConfig.StorageKeyKind.UNSET:
240
+ # Bw/c for purge before adding purge payload. We assume
241
+ # there's only 2 kinds of KBs: with one or with more than
242
+ # one vectorset. KBs with one vectorset are not allowed to
243
+ # delete their vectorset, so we wouldn't be here. It has to
244
+ # be a KB with multiple, so the storage key kind has to be
245
+ # this:
246
+ tasks.append(
247
+ asyncio.create_task(
248
+ field.delete_vectors(
249
+ vectorset, VectorSetConfig.StorageKeyKind.VECTORSET_PREFIX
250
+ )
251
+ )
252
+ )
253
+ else:
254
+ tasks.append(
255
+ asyncio.create_task(
256
+ field.delete_vectors(vectorset, purge_payload.storage_key_kind)
257
+ )
258
+ )
259
+ await asyncio.gather(*tasks)
249
260
 
250
261
  # Finally, delete the key
251
262
  async with driver.transaction() as txn:
252
263
  await txn.delete(key)
253
264
  await txn.commit()
254
265
 
266
+ logger.info(f"Finished purging vectorset {vectorset} for KB", extra={"kbid": kbid})
267
+
255
268
  except Exception as exc:
256
269
  errors.capture_exception(exc)
257
270
  logger.error(
@@ -304,3 +317,9 @@ def run() -> int: # pragma: no cover
304
317
  setup_logging()
305
318
  errors.setup_error_handling(importlib.metadata.distribution("nucliadb").version)
306
319
  return asyncio.run(main())
320
+
321
+
322
+ def batchify(iterable, n=1):
323
+ """Yield successive n-sized chunks from iterable."""
324
+ for i in range(0, len(iterable), n):
325
+ yield iterable[i : i + n]
@@ -246,8 +246,6 @@ async def get_relations_results(
246
246
  kbid: str,
247
247
  text_answer: str,
248
248
  timeout: Optional[float] = None,
249
- only_with_metadata: bool = False,
250
- only_agentic_relations: bool = False,
251
249
  ) -> Relations:
252
250
  try:
253
251
  predict = get_predict()
@@ -257,8 +255,6 @@ async def get_relations_results(
257
255
  kbid=kbid,
258
256
  entities=detected_entities,
259
257
  timeout=timeout,
260
- only_with_metadata=only_with_metadata,
261
- only_agentic_relations=only_agentic_relations,
262
258
  )
263
259
  except Exception as exc:
264
260
  capture_exception(exc)
@@ -271,9 +267,6 @@ async def get_relations_results_from_entities(
271
267
  kbid: str,
272
268
  entities: Iterable[RelationNode],
273
269
  timeout: Optional[float] = None,
274
- only_with_metadata: bool = False,
275
- only_agentic_relations: bool = False,
276
- only_entity_to_entity: bool = False,
277
270
  deleted_entities: set[str] = set(),
278
271
  ) -> Relations:
279
272
  entry_points = list(entities)
@@ -303,9 +296,6 @@ async def get_relations_results_from_entities(
303
296
  return await merge_relations_results(
304
297
  relations_results,
305
298
  entry_points,
306
- only_with_metadata,
307
- only_agentic_relations,
308
- only_entity_to_entity,
309
299
  )
310
300
 
311
301
 
@@ -19,6 +19,7 @@
19
19
  import heapq
20
20
  import json
21
21
  from collections import defaultdict
22
+ from dataclasses import dataclass
22
23
  from typing import Any, Collection, Iterable, Optional, Union
23
24
 
24
25
  from nidx_protos import nodereader_pb2
@@ -36,13 +37,13 @@ from nucliadb.search import logger
36
37
  from nucliadb.search.requesters.utils import Method, nidx_query
37
38
  from nucliadb.search.search.chat.query import (
38
39
  find_request_from_ask_request,
39
- get_relations_results_from_entities,
40
40
  )
41
41
  from nucliadb.search.search.find_merge import (
42
42
  compose_find_resources,
43
43
  hydrate_and_rerank,
44
44
  )
45
45
  from nucliadb.search.search.hydrator import ResourceHydrationOptions, TextBlockHydrationOptions
46
+ from nucliadb.search.search.merge import entity_type_to_relation_node_type, merge_relations_results
46
47
  from nucliadb.search.search.metrics import Metrics
47
48
  from nucliadb.search.search.rerankers import (
48
49
  Reranker,
@@ -74,7 +75,7 @@ from nucliadb_models.search import (
74
75
  TextPosition,
75
76
  UserPrompt,
76
77
  )
77
- from nucliadb_protos.utils_pb2 import RelationNode
78
+ from nucliadb_protos.utils_pb2 import Relation, RelationNode
78
79
 
79
80
  SCHEMA = {
80
81
  "title": "score_triplets",
@@ -289,6 +290,17 @@ Now, let's get started! Here are the triplets you need to score:
289
290
  """
290
291
 
291
292
 
293
+ @dataclass(frozen=True)
294
+ class FrozenRelationNode:
295
+ ntype: RelationNode.NodeType.ValueType
296
+ subtype: str
297
+ value: str
298
+
299
+
300
+ def freeze_node(r: RelationNode):
301
+ return FrozenRelationNode(ntype=r.ntype, subtype=r.subtype, value=r.value)
302
+
303
+
292
304
  class RelationsParagraphMatch(BaseModel):
293
305
  paragraph_id: ParagraphId
294
306
  score: float
@@ -310,13 +322,12 @@ async def get_graph_results(
310
322
  shards: Optional[list[str]] = None,
311
323
  ) -> tuple[KnowledgeboxFindResults, FindRequest]:
312
324
  relations = Relations(entities={})
313
- explored_entities: set[str] = set()
325
+ explored_entities: set[FrozenRelationNode] = set()
314
326
  scores: dict[str, list[float]] = {}
315
327
  predict = get_predict()
328
+ entities_to_explore: list[RelationNode] = []
316
329
 
317
330
  for hop in range(graph_strategy.hops):
318
- entities_to_explore: Iterable[RelationNode] = []
319
-
320
331
  if hop == 0:
321
332
  # Get the entities from the query
322
333
  with metrics.time("graph_strat_query_entities"):
@@ -326,14 +337,14 @@ async def get_graph_results(
326
337
  query=query,
327
338
  )
328
339
  if relation_result is not None:
329
- entities_to_explore = (
340
+ entities_to_explore = [
330
341
  RelationNode(
331
342
  ntype=RelationNode.NodeType.ENTITY,
332
343
  value=result.value,
333
344
  subtype=result.family,
334
345
  )
335
346
  for result in relation_result.entities
336
- )
347
+ ]
337
348
  elif (
338
349
  not entities_to_explore
339
350
  or graph_strategy.query_entity_detection == QueryEntityDetection.PREDICT
@@ -353,7 +364,7 @@ async def get_graph_results(
353
364
  entities_to_explore = []
354
365
  else:
355
366
  # Find neighbors of the current relations and remove the ones already explored
356
- entities_to_explore = (
367
+ entities_to_explore = [
357
368
  RelationNode(
358
369
  ntype=RelationNode.NodeType.ENTITY,
359
370
  value=relation.entity,
@@ -361,35 +372,50 @@ async def get_graph_results(
361
372
  )
362
373
  for subgraph in relations.entities.values()
363
374
  for relation in subgraph.related_to
364
- if relation.entity not in explored_entities
365
- )
375
+ if FrozenRelationNode(
376
+ ntype=entity_type_to_relation_node_type(relation.entity_type),
377
+ subtype=relation.entity_subtype,
378
+ value=relation.entity,
379
+ )
380
+ not in explored_entities
381
+ ]
382
+
383
+ if not entities_to_explore:
384
+ break
366
385
 
367
386
  # Get the relations for the new entities
387
+ relations_results = []
368
388
  with metrics.time("graph_strat_neighbor_relations"):
369
389
  try:
370
- new_relations = await get_relations_results_from_entities(
371
- kbid=kbid,
372
- entities=entities_to_explore,
373
- timeout=5.0,
390
+ relations_results = await find_graph_neighbours(
391
+ kbid,
392
+ entities_to_explore,
393
+ explored_entities,
394
+ exclude_processor_relations=graph_strategy.exclude_processor_relations,
395
+ )
396
+ new_relations = await merge_relations_results(
397
+ relations_results,
398
+ entities_to_explore,
374
399
  only_with_metadata=not graph_strategy.relation_text_as_paragraphs,
375
- only_agentic_relations=graph_strategy.agentic_graph_only,
376
- # We only want entity to entity relations (skip resource/labels/collaborators/etc.)
377
- only_entity_to_entity=True,
378
- deleted_entities=explored_entities,
379
400
  )
380
401
  except Exception as e:
381
402
  capture_exception(e)
382
403
  logger.exception("Error in getting query relations for graph strategy")
383
404
  new_relations = Relations(entities={})
384
405
 
385
- new_subgraphs = new_relations.entities
406
+ relations.entities.update(new_relations.entities)
407
+ discovered_entities = []
386
408
 
387
- explored_entities.update(new_subgraphs.keys())
409
+ for shard in relations_results:
410
+ for node in shard.nodes:
411
+ if node not in entities_to_explore and freeze_node(node) not in explored_entities:
412
+ discovered_entities.append(node)
388
413
 
389
- if not new_subgraphs or all(not subgraph.related_to for subgraph in new_subgraphs.values()):
414
+ if not discovered_entities:
390
415
  break
391
416
 
392
- relations.entities.update(new_subgraphs)
417
+ explored_entities.update([freeze_node(n) for n in entities_to_explore])
418
+ entities_to_explore = discovered_entities
393
419
 
394
420
  # Rank the relevance of the relations
395
421
  with metrics.time("graph_strat_rank_relations"):
@@ -898,3 +924,51 @@ def relations_matches_to_text_block_matches(
898
924
  paragraph_matches: Collection[RelationsParagraphMatch],
899
925
  ) -> list[TextBlockMatch]:
900
926
  return [relations_match_to_text_block_match(match) for match in paragraph_matches]
927
+
928
+
929
+ async def find_graph_neighbours(
930
+ kbid: str,
931
+ entities_to_explore: list[RelationNode],
932
+ explored_entities: set[FrozenRelationNode],
933
+ exclude_processor_relations: bool,
934
+ ) -> list[nodereader_pb2.GraphSearchResponse]:
935
+ graph_query = nodereader_pb2.GraphSearchRequest(
936
+ kind=nodereader_pb2.GraphSearchRequest.QueryKind.PATH, top_k=100
937
+ )
938
+
939
+ # Explore starting from some entities
940
+ query_to_explore = nodereader_pb2.GraphQuery.PathQuery()
941
+ for entity in entities_to_explore:
942
+ entity_query = nodereader_pb2.GraphQuery.PathQuery()
943
+ entity_query.path.source.node_type = entity.ntype
944
+ entity_query.path.source.node_subtype = entity.subtype
945
+ entity_query.path.source.value = entity.value
946
+ entity_query.path.undirected = True
947
+ query_to_explore.bool_or.operands.append(entity_query)
948
+ graph_query.query.path.bool_and.operands.append(query_to_explore)
949
+
950
+ # Do not return already known entities
951
+ if explored_entities:
952
+ query_exclude_explored = nodereader_pb2.GraphQuery.PathQuery()
953
+ for explored in explored_entities:
954
+ entity_query = nodereader_pb2.GraphQuery.PathQuery()
955
+ entity_query.path.source.node_type = explored.ntype
956
+ entity_query.path.source.node_subtype = explored.subtype
957
+ entity_query.path.source.value = explored.value
958
+ entity_query.path.undirected = True
959
+ query_exclude_explored.bool_not.bool_or.operands.append(entity_query)
960
+ graph_query.query.path.bool_and.operands.append(query_exclude_explored)
961
+
962
+ # Only include relations between entities
963
+ only_entities = nodereader_pb2.GraphQuery.PathQuery()
964
+ only_entities.path.relation.relation_type = Relation.RelationType.ENTITY
965
+ graph_query.query.path.bool_and.operands.append(only_entities)
966
+
967
+ # Exclude processor entities
968
+ if exclude_processor_relations:
969
+ exclude_processor = nodereader_pb2.GraphQuery.PathQuery()
970
+ exclude_processor.facet.facet = "/g"
971
+ graph_query.query.path.bool_and.operands.append(exclude_processor)
972
+
973
+ (relations_results, _) = await nidx_query(kbid, Method.GRAPH, graph_query, timeout=5.0)
974
+ return relations_results
@@ -48,7 +48,6 @@ from nucliadb.search.search.fetch import (
48
48
  from nucliadb.search.search.query_parser.models import FulltextQuery, UnitRetrieval
49
49
  from nucliadb_models.common import FieldTypeName
50
50
  from nucliadb_models.labels import translate_system_to_alias_label
51
- from nucliadb_models.metadata import RelationType
52
51
  from nucliadb_models.resource import ExtractedDataTypeName
53
52
  from nucliadb_models.search import (
54
53
  DirectionalRelation,
@@ -93,6 +92,15 @@ def relation_node_type_to_entity_type(node_type: RelationNode.NodeType.ValueType
93
92
  }[node_type]
94
93
 
95
94
 
95
+ def entity_type_to_relation_node_type(node_type: EntityType) -> RelationNode.NodeType.ValueType:
96
+ return {
97
+ EntityType.ENTITY: RelationNode.NodeType.ENTITY,
98
+ EntityType.LABEL: RelationNode.NodeType.LABEL,
99
+ EntityType.RESOURCE: RelationNode.NodeType.RESOURCE,
100
+ EntityType.USER: RelationNode.NodeType.USER,
101
+ }[node_type]
102
+
103
+
96
104
  def sort_results_by_score(results: Union[list[ParagraphResult], list[DocumentResult]]):
97
105
  results.sort(key=lambda x: (x.score.bm25, x.score.booster), reverse=True)
98
106
 
@@ -442,18 +450,10 @@ async def merge_relations_results(
442
450
  graph_responses: list[GraphSearchResponse],
443
451
  query_entry_points: Iterable[RelationNode],
444
452
  only_with_metadata: bool = False,
445
- only_agentic: bool = False,
446
- only_entity_to_entity: bool = False,
447
453
  ) -> Relations:
448
454
  loop = asyncio.get_event_loop()
449
455
  return await loop.run_in_executor(
450
- None,
451
- _merge_relations_results,
452
- graph_responses,
453
- query_entry_points,
454
- only_with_metadata,
455
- only_agentic,
456
- only_entity_to_entity,
456
+ None, _merge_relations_results, graph_responses, query_entry_points, only_with_metadata
457
457
  )
458
458
 
459
459
 
@@ -461,21 +461,8 @@ def _merge_relations_results(
461
461
  graph_responses: list[GraphSearchResponse],
462
462
  query_entry_points: Iterable[RelationNode],
463
463
  only_with_metadata: bool,
464
- only_agentic: bool,
465
- only_entity_to_entity: bool,
466
464
  ) -> Relations:
467
- """Merge relation search responses into a single Relations object while applying filters.
468
-
469
- - When `only_with_metadata` is enabled, only include paths with metadata
470
- (this can include paragraph_id and entity positions among other things)
471
-
472
- - When `only_agentic` is enabled, ony include relations extracted by a Graph
473
- Extraction Agent
474
-
475
- - When `only_entity_to_entity` is enabled, only include relations between
476
- nodes with type ENTITY
477
-
478
- """
465
+ """Merge relation search responses into a single Relations object while applying filters."""
479
466
  relations = Relations(entities={})
480
467
 
481
468
  for entry_point in query_entry_points:
@@ -492,18 +479,9 @@ def _merge_relations_results(
492
479
  if path.resource_field_id is not None:
493
480
  resource_id = path.resource_field_id.split("/")[0]
494
481
 
495
- # If only_with_metadata is True, we check that metadata for the relation is not None
496
- # If only_agentic is True, we check that metadata for the relation is not None and that it has a data_augmentation_task_id
497
- # TODO: This is suboptimal, we should be able to filter this in the query to the index,
498
482
  if only_with_metadata and not metadata:
499
483
  continue
500
484
 
501
- if only_agentic and (not metadata or not metadata.data_augmentation_task_id):
502
- continue
503
-
504
- if only_entity_to_entity and relation_type != RelationType.ENTITY:
505
- continue
506
-
507
485
  if origin.value in relations.entities:
508
486
  relations.entities[origin.value].related_to.append(
509
487
  DirectionalRelation(
@@ -72,8 +72,8 @@ async def generate_field_streaming_payloads(
72
72
  for status in trainset.filter.status:
73
73
  request.filter.labels.append(f"/n/s/{status}")
74
74
 
75
- total = 0
76
75
  resources = set()
76
+ fields = set()
77
77
 
78
78
  async for document_item in get_nidx_searcher_client().Documents(request):
79
79
  text_labels = []
@@ -81,7 +81,6 @@ async def generate_field_streaming_payloads(
81
81
  text_labels.append(label)
82
82
 
83
83
  field_id = f"{document_item.uuid}{document_item.field}"
84
- total += 1
85
84
  resources.add(document_item.uuid)
86
85
 
87
86
  field_parts = document_item.field.split("/")
@@ -100,6 +99,15 @@ async def generate_field_streaming_payloads(
100
99
  tl.field_type = field_type
101
100
  tl.split = split
102
101
 
102
+ field_unique_key = f"{rid}/{field_type}/{field}/{split}"
103
+ if field_unique_key in fields:
104
+ # This field has already been yielded. This can happen as we are streaming directly from nidx
105
+ # and field deletions may not be reflected immediately in the index.
106
+ logger.warning(f"Duplicated field found {field_unique_key}. Skipping.", extra={"kbid": kbid})
107
+ continue
108
+
109
+ fields.add(field_unique_key)
110
+
103
111
  if trainset.exclude_text:
104
112
  tl.text.text = ""
105
113
  else:
@@ -119,11 +127,11 @@ async def generate_field_streaming_payloads(
119
127
 
120
128
  yield tl
121
129
 
122
- if total % 1000 == 0:
130
+ if len(fields) % 1000 == 0:
123
131
  logger.info(
124
132
  "Field streaming in progress",
125
133
  extra={
126
- "fields": total,
134
+ "fields": len(fields),
127
135
  "resources": len(resources),
128
136
  "kbid": kbid,
129
137
  "shard_replica_id": shard_replica_id,
@@ -133,7 +141,7 @@ async def generate_field_streaming_payloads(
133
141
  logger.info(
134
142
  "Field streaming finished",
135
143
  extra={
136
- "fields": total,
144
+ "fields": len(fields),
137
145
  "resources": len(resources),
138
146
  "kbid": kbid,
139
147
  "shard_replica_id": shard_replica_id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nucliadb
3
- Version: 6.4.0.post4302
3
+ Version: 6.4.0.post4317
4
4
  Summary: NucliaDB
5
5
  Author-email: Nuclia <nucliadb@nuclia.com>
6
6
  License: AGPL
@@ -20,11 +20,11 @@ Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3 :: Only
21
21
  Requires-Python: <4,>=3.9
22
22
  Description-Content-Type: text/markdown
23
- Requires-Dist: nucliadb-telemetry[all]>=6.4.0.post4302
24
- Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.4.0.post4302
25
- Requires-Dist: nucliadb-protos>=6.4.0.post4302
26
- Requires-Dist: nucliadb-models>=6.4.0.post4302
27
- Requires-Dist: nidx-protos>=6.4.0.post4302
23
+ Requires-Dist: nucliadb-telemetry[all]>=6.4.0.post4317
24
+ Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.4.0.post4317
25
+ Requires-Dist: nucliadb-protos>=6.4.0.post4317
26
+ Requires-Dist: nucliadb-models>=6.4.0.post4317
27
+ Requires-Dist: nidx-protos>=6.4.0.post4317
28
28
  Requires-Dist: nucliadb-admin-assets>=1.0.0.post1224
29
29
  Requires-Dist: nuclia-models>=0.24.2
30
30
  Requires-Dist: uvicorn[standard]
@@ -179,7 +179,7 @@ nucliadb/models/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,8
179
179
  nucliadb/models/responses.py,sha256=qnuOoc7TrVSUnpikfTwHLKez47_DE4mSFzpxrwtqijA,1599
180
180
  nucliadb/models/internal/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
181
181
  nucliadb/models/internal/processing.py,sha256=bzPr-hXliY81zMUgG-PDyDiFKP7Xbs71s2d0SIAu4Do,4090
182
- nucliadb/purge/__init__.py,sha256=UXbto56EWYLwZj6uEc-flQVe3gDDNFtM6EV-aIkryPU,12353
182
+ nucliadb/purge/__init__.py,sha256=lZE7_FQMVz2rWiwRYrtKpAjVoO6tbnzTYofQbsGUqos,13118
183
183
  nucliadb/purge/orphan_shards.py,sha256=fcP37QoFNjS6q2XozLQImY1swC_EmHeNhAJwLvEkOww,7769
184
184
  nucliadb/reader/__init__.py,sha256=C5Efic7WlGm2U2C5WOyquMFbIj2Pojwe_8mwzVYnOzE,1304
185
185
  nucliadb/reader/app.py,sha256=Se-BFTE6d1v1msLzQn4q5XIhjnSxa2ckDSHdvm7NRf8,3096
@@ -240,10 +240,10 @@ nucliadb/search/search/filters.py,sha256=1MkHlJjAQqoRCj7e5cEzK2HvBxGLE17I_omsjik
240
240
  nucliadb/search/search/find.py,sha256=ZocoQNN28OHOmMaroGVFCnce3YHPZbFb1-9jxLNHSFM,7805
241
241
  nucliadb/search/search/find_merge.py,sha256=c-7IlfjfdmWAvQOyM7IO3bKS1EQpnR4oi6pN6mwrQKw,19815
242
242
  nucliadb/search/search/graph_merge.py,sha256=y5V7X-BhjHsKDXE69tzQLIIKGm4XuaFrZXw0odcHVNM,3402
243
- nucliadb/search/search/graph_strategy.py,sha256=RVUPqzvnfoZY9JlprCqtitFa_5aAvl48S0TAZtbNbQM,32888
243
+ nucliadb/search/search/graph_strategy.py,sha256=LtPWGVL0RzxUgDLjrYgoQdZFmPBbln1fUsmXM1z5krs,35941
244
244
  nucliadb/search/search/hydrator.py,sha256=-R37gCrGxkyaiHQalnTWHNG_FCx11Zucd7qA1vQCxuw,6985
245
245
  nucliadb/search/search/ingestion_agents.py,sha256=NeJr4EEX-bvFFMGvXOOwLv8uU7NuQ-ntJnnrhnKfMzY,3174
246
- nucliadb/search/search/merge.py,sha256=Abg9YblQJvH2jDvXVT45MNxaIpNa7TTpsiUSJqb3NDc,23307
246
+ nucliadb/search/search/merge.py,sha256=XiRBsxhYPshPV7lZXD-9E259KZOPIf4I2tKosY0lPo4,22470
247
247
  nucliadb/search/search/metrics.py,sha256=3I6IN0qDSmqIvUaWJmT3rt-Jyjs6LcvnKI8ZqCiuJPY,3501
248
248
  nucliadb/search/search/paragraphs.py,sha256=pNAEiYqJGGUVcEf7xf-PFMVqz0PX4Qb-WNG-_zPGN2o,7799
249
249
  nucliadb/search/search/pgcatalog.py,sha256=s_J98fsX_RuFXwpejpkGqG-tD9ELuzz4YQ6U3ew5h2g,9313
@@ -259,7 +259,7 @@ nucliadb/search/search/chat/ask.py,sha256=aaNj0MeAbx9dyeKpQJdm3VsHMq9OmcCESxahbg
259
259
  nucliadb/search/search/chat/exceptions.py,sha256=Siy4GXW2L7oPhIR86H3WHBhE9lkV4A4YaAszuGGUf54,1356
260
260
  nucliadb/search/search/chat/images.py,sha256=PA8VWxT5_HUGfW1ULhKTK46UBsVyINtWWqEM1ulzX1E,3095
261
261
  nucliadb/search/search/chat/prompt.py,sha256=e8C7_MPr6Cn3nJHA4hWpeW3629KVI1ZUQA_wZf9Kiu4,48503
262
- nucliadb/search/search/chat/query.py,sha256=0cShyunE_ZbHiQ2PIEbqjGyRCF409gE6OS45YZcZHi8,17052
262
+ nucliadb/search/search/chat/query.py,sha256=3jMPNbiFEOoS0ydMOPYkSx1qVlvAv51npzadWXDwkMs,16650
263
263
  nucliadb/search/search/query_parser/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
264
264
  nucliadb/search/search/query_parser/exceptions.py,sha256=szAOXUZ27oNY-OSa9t2hQ5HHkQQC0EX1FZz_LluJHJE,1224
265
265
  nucliadb/search/search/query_parser/fetcher.py,sha256=SkvBRDfSKmuz-QygNKLAU4AhZhhDo1dnOZmt1zA28RA,16851
@@ -322,7 +322,7 @@ nucliadb/train/api/v1/shards.py,sha256=GJRnQe8P-7_VTIN1oxVmxlrDA08qVN7opEZdbF4Wx
322
322
  nucliadb/train/api/v1/trainset.py,sha256=kpnpDgiMWr1FKHZJgwH7hue5kzilA8-i9X0YHlNeHuU,2113
323
323
  nucliadb/train/generators/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
324
324
  nucliadb/train/generators/field_classifier.py,sha256=xUA10o9CtBtilbP3uc-8Wn_zQ0oK3BrqYGqZgxh4ZLk,3428
325
- nucliadb/train/generators/field_streaming.py,sha256=tI6vWhfLk-AVswh7rcjcO7Gg0YzS3OKMLJJ3VhDASG0,5980
325
+ nucliadb/train/generators/field_streaming.py,sha256=nje317SutX8QmHq-xwUphzUiozmzpCRfPXxhF_jFzdg,6441
326
326
  nucliadb/train/generators/image_classifier.py,sha256=BDXgyd5TGZRnzDnVRvp-qsRCuoTbTYwui3JiDIjuiDc,1736
327
327
  nucliadb/train/generators/paragraph_classifier.py,sha256=4sH3IQc7yJrlDs1C76SxFzL9N5mXWRZzJzoiF7y4dSQ,2703
328
328
  nucliadb/train/generators/paragraph_streaming.py,sha256=1xsc_IqP-1M0TzYTqu5qCvWBNp_J3Kyvnx8HVbToXmQ,3532
@@ -368,8 +368,8 @@ nucliadb/writer/tus/local.py,sha256=7jYa_w9b-N90jWgN2sQKkNcomqn6JMVBOVeDOVYJHto,
368
368
  nucliadb/writer/tus/s3.py,sha256=vF0NkFTXiXhXq3bCVXXVV-ED38ECVoUeeYViP8uMqcU,8357
369
369
  nucliadb/writer/tus/storage.py,sha256=ToqwjoYnjI4oIcwzkhha_MPxi-k4Jk3Lt55zRwaC1SM,2903
370
370
  nucliadb/writer/tus/utils.py,sha256=MSdVbRsRSZVdkaum69_0wku7X3p5wlZf4nr6E0GMKbw,2556
371
- nucliadb-6.4.0.post4302.dist-info/METADATA,sha256=BELqLq2CUcIs_LxWC6lJuuuyPvCt2JGYoTJ7Ur-zK80,4223
372
- nucliadb-6.4.0.post4302.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
373
- nucliadb-6.4.0.post4302.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
374
- nucliadb-6.4.0.post4302.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
375
- nucliadb-6.4.0.post4302.dist-info/RECORD,,
371
+ nucliadb-6.4.0.post4317.dist-info/METADATA,sha256=d8tAT1pIjUuErJUdwLw2yt9bgSnVJn2U7KkhldSRAZU,4223
372
+ nucliadb-6.4.0.post4317.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
373
+ nucliadb-6.4.0.post4317.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
374
+ nucliadb-6.4.0.post4317.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
375
+ nucliadb-6.4.0.post4317.dist-info/RECORD,,