nucliadb 6.7.0.post4734__py3-none-any.whl → 6.7.0.post4742__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.
@@ -46,6 +46,11 @@ class Settings(BaseSettings):
46
46
  title="Max paragraphs per resource",
47
47
  description="Maximum number of paragraphs allowed on a single resource",
48
48
  )
49
+ max_entity_facets: int = Field(
50
+ default=4_000,
51
+ title="Max entity labels per field",
52
+ description="Maximum number of entity labels (/e/) per field that are indexed (excess is not indexed)",
53
+ )
49
54
 
50
55
  nidx_api_address: Optional[str] = Field(default=None, description="NIDX gRPC API address")
51
56
  nidx_searcher_address: Optional[str] = Field(
@@ -49,6 +49,10 @@ class ResourceNotIndexable(Exception):
49
49
  Unable to index resource
50
50
  """
51
51
 
52
+ def __init__(self, field_id: str, message: str):
53
+ self.field_id = field_id
54
+ self.message = message
55
+
52
56
 
53
57
  class EntityManagementException(Exception):
54
58
  pass
@@ -18,4 +18,6 @@
18
18
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
20
  # reexports
21
- from .processor import Processor, validate_indexable_resource # noqa: F401
21
+ from .processor import Processor
22
+
23
+ __all__ = ["Processor"]
@@ -83,18 +83,52 @@ def validate_indexable_resource(resource: noderesources_pb2.Resource) -> None:
83
83
  This is still an edge case.
84
84
  """
85
85
  num_paragraphs = 0
86
- for _, fparagraph in resource.paragraphs.items():
86
+ first_exceeded = ""
87
+ for field_id, fparagraph in resource.paragraphs.items():
87
88
  # this count should not be very expensive to do since we don't have
88
89
  # a lot of different fields and we just do a count on a dict
89
90
  num_paragraphs += len(fparagraph.paragraphs)
91
+ if num_paragraphs > cluster_settings.max_resource_paragraphs:
92
+ first_exceeded = field_id
90
93
 
91
94
  if num_paragraphs > cluster_settings.max_resource_paragraphs:
92
95
  raise ResourceNotIndexable(
93
- "Resource has too many paragraphs. "
94
- f"Supported: {cluster_settings.max_resource_paragraphs} , Number: {num_paragraphs}"
96
+ first_exceeded,
97
+ f"Resource has too many paragraphs ({num_paragraphs}) and cannot be indexed. "
98
+ f"The maximum number of paragraphs per resource is {cluster_settings.max_resource_paragraphs}",
95
99
  )
96
100
 
97
101
 
102
+ def trim_entity_facets(index_message: PBBrainResource) -> list[tuple[str, str]]:
103
+ max_entities = cluster_settings.max_entity_facets
104
+ warnings = []
105
+ for field_id, text_info in index_message.texts.items():
106
+ if len(text_info.labels) > max_entities:
107
+ new_labels = []
108
+ entity_count = 0
109
+ truncated = False
110
+ for label in text_info.labels:
111
+ if label.startswith("/e/"):
112
+ if entity_count < max_entities:
113
+ new_labels.append(label)
114
+ else:
115
+ truncated = True
116
+ entity_count += 1
117
+ else:
118
+ new_labels.append(label)
119
+ if truncated:
120
+ warnings.append(
121
+ (
122
+ field_id,
123
+ f"Too many detected entities. Only the first {max_entities} will be available as facets for filtering",
124
+ )
125
+ )
126
+ text_info.ClearField("labels")
127
+ text_info.labels.extend(new_labels)
128
+
129
+ return warnings
130
+
131
+
98
132
  class Processor:
99
133
  """
100
134
  This class is responsible for processing messages from the broker
@@ -314,17 +348,35 @@ class Processor:
314
348
  # index message
315
349
  if resource and resource.modified:
316
350
  index_message = await self.generate_index_message(resource, messages, created)
351
+
352
+ try:
353
+ warnings = await self.index_resource(
354
+ index_message=index_message,
355
+ txn=txn,
356
+ uuid=uuid,
357
+ kbid=kbid,
358
+ seqid=seqid,
359
+ partition=partition,
360
+ kb=kb,
361
+ source=messages_source(messages),
362
+ )
363
+ # Save indexing warnings
364
+ for field_id, warning in warnings:
365
+ await resource.add_field_error(
366
+ field_id, warning, writer_pb2.Error.Severity.WARNING
367
+ )
368
+ except ResourceNotIndexable as e:
369
+ await resource.add_field_error(
370
+ e.field_id, e.message, writer_pb2.Error.Severity.ERROR
371
+ )
372
+ # Catalog takes status from index message labels, override it to error
373
+ current_status = [x for x in index_message.labels if x.startswith("/n/s/")]
374
+ if current_status:
375
+ index_message.labels.remove(current_status[0])
376
+ index_message.labels.append("/n/s/ERROR")
377
+
317
378
  await pgcatalog_update(txn, kbid, resource, index_message)
318
- await self.index_resource( # noqa
319
- index_message=index_message,
320
- txn=txn,
321
- uuid=uuid,
322
- kbid=kbid,
323
- seqid=seqid,
324
- partition=partition,
325
- kb=kb,
326
- source=messages_source(messages),
327
- )
379
+
328
380
  if transaction_check:
329
381
  await sequence_manager.set_last_seqid(txn, partition, seqid)
330
382
  await txn.commit()
@@ -445,8 +497,10 @@ class Processor:
445
497
  partition: str,
446
498
  kb: KnowledgeBox,
447
499
  source: nodewriter_pb2.IndexMessageSource.ValueType,
448
- ) -> None:
500
+ ) -> list[tuple[str, str]]:
449
501
  validate_indexable_resource(index_message)
502
+ warnings = trim_entity_facets(index_message)
503
+
450
504
  shard = await self.get_or_assign_resource_shard(txn, kb, uuid)
451
505
  external_index_manager = await get_external_index_manager(kbid=kbid)
452
506
  if external_index_manager is not None:
@@ -460,6 +514,7 @@ class Processor:
460
514
  kb=kbid,
461
515
  source=source,
462
516
  )
517
+ return warnings
463
518
 
464
519
  @processor_observer.wrap({"type": "generate_index_message"})
465
520
  async def generate_index_message(
@@ -27,7 +27,7 @@ from typing import TYPE_CHECKING, Any, Optional, Sequence, Type
27
27
 
28
28
  from nucliadb.common import datamanagers
29
29
  from nucliadb.common.datamanagers.resources import KB_RESOURCE_SLUG
30
- from nucliadb.common.ids import FIELD_TYPE_PB_TO_STR, FieldId
30
+ from nucliadb.common.ids import FIELD_TYPE_PB_TO_STR, FIELD_TYPE_STR_TO_PB, FieldId
31
31
  from nucliadb.common.maindb.driver import Transaction
32
32
  from nucliadb.ingest.fields.base import Field
33
33
  from nucliadb.ingest.fields.conversation import Conversation
@@ -526,6 +526,34 @@ class Resource:
526
526
  else:
527
527
  self.basic.metadata.status = PBMetadata.Status.PROCESSED
528
528
 
529
+ async def add_field_error(
530
+ self, field_id: str, message: str, severity: writer_pb2.Error.Severity.ValueType
531
+ ):
532
+ (field_type_str, field_name) = field_id.split("/")
533
+ field_type = FIELD_TYPE_STR_TO_PB[field_type_str]
534
+ field = await self.get_field(field_name, field_type)
535
+ status = await field.get_status()
536
+ if status is not None:
537
+ field_error = writer_pb2.FieldError(
538
+ source_error=writer_pb2.Error(
539
+ field=field_name,
540
+ field_type=field_type,
541
+ error=message,
542
+ code=writer_pb2.Error.ErrorCode.INDEX,
543
+ severity=severity,
544
+ )
545
+ )
546
+ field_error.created.GetCurrentTime()
547
+ status.errors.append(field_error)
548
+ if severity == writer_pb2.Error.Severity.ERROR:
549
+ status.status = writer_pb2.FieldStatus.Status.ERROR
550
+ await field.set_status(status)
551
+
552
+ # If it's an error, we may need to change the resource status
553
+ if severity == writer_pb2.Error.Severity.ERROR and self.basic:
554
+ await self.update_status()
555
+ await self.set_basic(self.basic)
556
+
529
557
  @processor_observer.wrap({"type": "apply_extracted"})
530
558
  async def apply_extracted(self, message: BrokerMessage):
531
559
  await self.get_basic()
@@ -21,7 +21,7 @@ from typing import Dict
21
21
 
22
22
  from fastapi import Request
23
23
  from fastapi_versioning import version
24
- from nuclia_models.config.proto import ExtractConfig
24
+ from nuclia_models.config.proto import ExtractConfig, SplitConfiguration
25
25
 
26
26
  from nucliadb.learning_proxy import learning_config_proxy
27
27
  from nucliadb.models.responses import HTTPClientError
@@ -183,3 +183,40 @@ async def get_extract_strategy_from_id(
183
183
  return await learning_config_proxy(
184
184
  request, "GET", f"/extract_strategies/{kbid}/strategies/{strategy_id}"
185
185
  )
186
+
187
+
188
+ @api.get(
189
+ path=f"/{KB_PREFIX}/{{kbid}}/split_strategies",
190
+ status_code=200,
191
+ summary="Learning split strategies",
192
+ description="Get available split strategies ",
193
+ response_model=Dict[str, SplitConfiguration],
194
+ tags=["Split Strategies"],
195
+ )
196
+ @requires(NucliaDBRoles.READER)
197
+ @version(1)
198
+ async def get_split_strategies(
199
+ request: Request,
200
+ kbid: str,
201
+ ):
202
+ return await learning_config_proxy(request, "GET", f"/split_strategies/{kbid}")
203
+
204
+
205
+ @api.get(
206
+ path=f"/{KB_PREFIX}/{{kbid}}/split_strategies/strategy/{{strategy_id}}",
207
+ status_code=200,
208
+ summary="Extract split configuration",
209
+ description="Get split strategy for a given id",
210
+ response_model=None,
211
+ tags=["Split Strategies"],
212
+ )
213
+ @requires(NucliaDBRoles.READER)
214
+ @version(1)
215
+ async def get_split_strategy_from_id(
216
+ request: Request,
217
+ kbid: str,
218
+ strategy_id: str,
219
+ ):
220
+ return await learning_config_proxy(
221
+ request, "GET", f"/split_strategies/{kbid}/strategies/{strategy_id}"
222
+ )
@@ -19,7 +19,7 @@
19
19
  #
20
20
  from fastapi import Request
21
21
  from fastapi_versioning import version
22
- from nuclia_models.config.proto import ExtractConfig
22
+ from nuclia_models.config.proto import ExtractConfig, SplitConfiguration
23
23
 
24
24
  from nucliadb.learning_proxy import learning_config_proxy
25
25
  from nucliadb.writer.api.v1.router import KB_PREFIX, api
@@ -97,3 +97,41 @@ async def delete_strategy(
97
97
  return await learning_config_proxy(
98
98
  request, "DELETE", f"/extract_strategies/{kbid}/strategies/{strategy_id}"
99
99
  )
100
+
101
+
102
+ @api.post(
103
+ path=f"/{KB_PREFIX}/{{kbid}}/split_strategies",
104
+ status_code=200,
105
+ summary="Add a split strategy to a KB",
106
+ description="Add a split strategy to a KB",
107
+ response_model=str,
108
+ tags=["Split Strategies"],
109
+ )
110
+ @requires(NucliaDBRoles.WRITER)
111
+ @version(1)
112
+ async def add_split_strategy(
113
+ request: Request,
114
+ kbid: str,
115
+ item: SplitConfiguration,
116
+ ):
117
+ return await learning_config_proxy(request, "POST", f"/split_strategies/{kbid}")
118
+
119
+
120
+ @api.delete(
121
+ path=f"/{KB_PREFIX}/{{kbid}}/split_strategies/strategy/{{strategy_id}}",
122
+ status_code=204,
123
+ summary="Remove a split strategy from a KB",
124
+ description="Removes a split strategy from a KB",
125
+ response_model=None,
126
+ tags=["Split Strategies"],
127
+ )
128
+ @requires(NucliaDBRoles.WRITER)
129
+ @version(1)
130
+ async def delete_split_strategy(
131
+ request: Request,
132
+ kbid: str,
133
+ strategy_id: str,
134
+ ):
135
+ return await learning_config_proxy(
136
+ request, "DELETE", f"/split_strategies/{kbid}/strategies/{strategy_id}"
137
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nucliadb
3
- Version: 6.7.0.post4734
3
+ Version: 6.7.0.post4742
4
4
  Summary: NucliaDB
5
5
  Author-email: Nuclia <nucliadb@nuclia.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -19,13 +19,13 @@ Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3 :: Only
20
20
  Requires-Python: <4,>=3.9
21
21
  Description-Content-Type: text/markdown
22
- Requires-Dist: nucliadb-telemetry[all]>=6.7.0.post4734
23
- Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.7.0.post4734
24
- Requires-Dist: nucliadb-protos>=6.7.0.post4734
25
- Requires-Dist: nucliadb-models>=6.7.0.post4734
26
- Requires-Dist: nidx-protos>=6.7.0.post4734
22
+ Requires-Dist: nucliadb-telemetry[all]>=6.7.0.post4742
23
+ Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.7.0.post4742
24
+ Requires-Dist: nucliadb-protos>=6.7.0.post4742
25
+ Requires-Dist: nucliadb-models>=6.7.0.post4742
26
+ Requires-Dist: nidx-protos>=6.7.0.post4742
27
27
  Requires-Dist: nucliadb-admin-assets>=1.0.0.post1224
28
- Requires-Dist: nuclia-models>=0.43.0
28
+ Requires-Dist: nuclia-models>=0.46.0
29
29
  Requires-Dist: uvicorn[standard]
30
30
  Requires-Dist: argdantic
31
31
  Requires-Dist: aiohttp>=3.11.11
@@ -81,7 +81,7 @@ nucliadb/common/cluster/grpc_node_dummy.py,sha256=JkufazWzMA4KFEU8EBkMbiiDW4C8lL
81
81
  nucliadb/common/cluster/manager.py,sha256=QOHA7trtZVwV5G9IIxM1Y-0P2KE5mEhsXUMPs8vxIg0,12816
82
82
  nucliadb/common/cluster/rebalance.py,sha256=238JxqdSl1_oeJNpKuGBgfVn8WXVmyX5yl2PyHomYX8,8715
83
83
  nucliadb/common/cluster/rollover.py,sha256=swuYNXJ8u5p11PvYaHxVtomiYIPVWVGVsicwTgm24-Q,25862
84
- nucliadb/common/cluster/settings.py,sha256=JPwV_0U_i618Tn66GWUq6qCKNjy4TWkGEGld9GwH5uk,2048
84
+ nucliadb/common/cluster/settings.py,sha256=H-KRSDdJozXLRZjjmDzgjMKm_9p6UBaPuqmTFkdhd_M,2270
85
85
  nucliadb/common/cluster/utils.py,sha256=IfW5PA7Ab26xWUYNOc3yBoksWV1GK4BGhTRo1vnHNKg,4662
86
86
  nucliadb/common/cluster/standalone/__init__.py,sha256=itSI7dtTwFP55YMX4iK7JzdMHS5CQVUiB1XzQu4UBh8,833
87
87
  nucliadb/common/cluster/standalone/utils.py,sha256=af3r-x_GF7A6dwIAhZLR-r-SZQEVxsFrDKeMfUTA6G0,1908
@@ -159,17 +159,17 @@ nucliadb/ingest/orm/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20
159
159
  nucliadb/ingest/orm/brain_v2.py,sha256=y_OQ-SXyClX_VSKFVkYYwdIDxmj6TAQLC7UdPJ0hOvE,33647
160
160
  nucliadb/ingest/orm/broker_message.py,sha256=XWaiZgDOz94NPOPT-hqbRr5ZkpVimUw6PjUJNftfoVw,7514
161
161
  nucliadb/ingest/orm/entities.py,sha256=kXyeF6XOpFKhEsGLcY-GLIk21Exp0cJst4XQQ9jJoug,14791
162
- nucliadb/ingest/orm/exceptions.py,sha256=k4Esv4NtL4TrGTcsQpwrSfDhPQpiYcRbB1SpYmBX5MY,1432
162
+ nucliadb/ingest/orm/exceptions.py,sha256=gsp7TtVNQPiIEh-zf_UEJClwuFU0iu-5vzj0OrKMScg,1550
163
163
  nucliadb/ingest/orm/index_message.py,sha256=DWMTHJoVamUbK8opKl5csDvxfgz7c2j7phG1Ut4yIxk,15724
164
164
  nucliadb/ingest/orm/knowledgebox.py,sha256=_rkeTMIXMhR64gbYtZpFHoUHghV2DTJ2lUBqZsoqC_4,23898
165
165
  nucliadb/ingest/orm/metrics.py,sha256=OiuggTh-n3kZHA2G73NEUdIlh8c3yFrbusI88DK-Mko,1273
166
- nucliadb/ingest/orm/resource.py,sha256=MfKGHTj-hxIoSC_8_86OPfRbaQOTHGkADZIvQ_7dKW4,38780
166
+ nucliadb/ingest/orm/resource.py,sha256=TWsPo11d6n0HpXRNGy0AAVKXiYDSr0gzEzBBQXkw7FE,40015
167
167
  nucliadb/ingest/orm/utils.py,sha256=fCQRuyecgqhaY7mcBG93oaXMkzkKb9BFjOcy4-ZiSNw,2693
168
- nucliadb/ingest/orm/processor/__init__.py,sha256=Aqd9wCNTvggkMkCY3WvoI8spdr94Jnqk-0iq9XpLs18,922
168
+ nucliadb/ingest/orm/processor/__init__.py,sha256=xhDNKCxY0XNOlIVKEtM8QT75vDUkJIt7K-_VgGbbOQU,904
169
169
  nucliadb/ingest/orm/processor/auditing.py,sha256=TeYhXGJRyQ7ROytbb2u8R0fIh_FYi3HgTu3S1ribY3U,4623
170
170
  nucliadb/ingest/orm/processor/data_augmentation.py,sha256=v-pj4GbBWSuO8dQyahs5UDr5ghsyfhCZDS0ftKd6ZYc,5179
171
171
  nucliadb/ingest/orm/processor/pgcatalog.py,sha256=VPQ_Evme7xmmGoQ45zt0Am0yPkaD4hxN1r5rEaVt6s8,4633
172
- nucliadb/ingest/orm/processor/processor.py,sha256=jaEBwbv--WyoC8zcdxWAyF0dAzVA5crVDJl56Bqv1eI,31444
172
+ nucliadb/ingest/orm/processor/processor.py,sha256=pr0wbe86d6ZboOaBH5HMsgcmm-WYDIjMrGDTElPxS3A,33830
173
173
  nucliadb/ingest/orm/processor/sequence_manager.py,sha256=uqEphtI1Ir_yk9jRl2gPf7BlzzXWovbARY5MNZSBI_8,1704
174
174
  nucliadb/ingest/service/__init__.py,sha256=LHQFUkdmNBOWqBG0Md9sMMI7g5TQZ-hLAnhw6ZblrJg,2002
175
175
  nucliadb/ingest/service/exceptions.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
@@ -202,7 +202,7 @@ nucliadb/reader/api/v1/__init__.py,sha256=ieP8lsCCwG66Jupv8II5MSTj6nh3eCtLcF4utH
202
202
  nucliadb/reader/api/v1/download.py,sha256=rGv1c5CjrJheDgGwAnNWy76A_4V2shqqHYvwmKGFlpk,10758
203
203
  nucliadb/reader/api/v1/export_import.py,sha256=x4VBNDFjnlY1nIt5kdq0eZTB_DeRzGzT8T7uB7wUhNU,6448
204
204
  nucliadb/reader/api/v1/knowledgebox.py,sha256=Uu-yPB8KKZt1VaFrFNMMaXOvLsclBJDK9dzZ9lF2ctI,3645
205
- nucliadb/reader/api/v1/learning_config.py,sha256=CZ7pFXzBZkJE2dXbC1wArszJw_ZLpuEb6gnsz2MKEz0,5525
205
+ nucliadb/reader/api/v1/learning_config.py,sha256=t_KqQBBbhpo0m6nQTkYmNdZsLVmW53SLcHMrCWiQMrk,6536
206
206
  nucliadb/reader/api/v1/resource.py,sha256=oCZGisVv5-t67MmokIpwaqJq5suE6YphR1QoCUmM174,14172
207
207
  nucliadb/reader/api/v1/router.py,sha256=eyNmEGSP9zHkCIG5XlAXl6sukq950B7gFT3X2peMtIE,1011
208
208
  nucliadb/reader/api/v1/services.py,sha256=Q2n-QMfAVzSylu6qTUuPa6L3AfZ9jS3azVlfQdSqlA4,13443
@@ -354,7 +354,7 @@ nucliadb/writer/api/v1/__init__.py,sha256=akI9A_jloNLb0dU4T5zjfdyvmSAiDeIdjAlzNx
354
354
  nucliadb/writer/api/v1/export_import.py,sha256=v0sU55TtRSqDzwkDgcwv2uSaqKCuQTtGcMpYoHQYBQA,8192
355
355
  nucliadb/writer/api/v1/field.py,sha256=rF_x6fVczZKa4xBrHChUVau-70uFJT7srQpOLuqG2ic,18755
356
356
  nucliadb/writer/api/v1/knowledgebox.py,sha256=PHEYDFa-sN5JrI8-EiVVg5FDOsRuCLT43kyAB4xt-xA,9530
357
- nucliadb/writer/api/v1/learning_config.py,sha256=CKBjqcbewkfPwGUPLDWzZSpro6XkmCaVppe5Qtpu5Go,3117
357
+ nucliadb/writer/api/v1/learning_config.py,sha256=mGQmnfFSM2Z9HDnWr8PFoA1MLpFR1JaCDb8B14J8e5k,4140
358
358
  nucliadb/writer/api/v1/resource.py,sha256=gr4VtYOtnIAL5zsDQsBDzeOOWWh6wN7PUh1XgUsQ9N4,20436
359
359
  nucliadb/writer/api/v1/router.py,sha256=RjuoWLpZer6Kl2BW_wznpNo6XL3BOpdTGqXZCn3QrrQ,1034
360
360
  nucliadb/writer/api/v1/services.py,sha256=3AUjk-SmvqJx76v7y89DZx6oyasojPliGYeniRQjpcU,13337
@@ -376,8 +376,8 @@ nucliadb/writer/tus/local.py,sha256=7jYa_w9b-N90jWgN2sQKkNcomqn6JMVBOVeDOVYJHto,
376
376
  nucliadb/writer/tus/s3.py,sha256=vF0NkFTXiXhXq3bCVXXVV-ED38ECVoUeeYViP8uMqcU,8357
377
377
  nucliadb/writer/tus/storage.py,sha256=ToqwjoYnjI4oIcwzkhha_MPxi-k4Jk3Lt55zRwaC1SM,2903
378
378
  nucliadb/writer/tus/utils.py,sha256=MSdVbRsRSZVdkaum69_0wku7X3p5wlZf4nr6E0GMKbw,2556
379
- nucliadb-6.7.0.post4734.dist-info/METADATA,sha256=LmyI9BUlxR1x6eJDoIY21ZN2TcyG-uVt7XNj3ZQt4eE,4158
380
- nucliadb-6.7.0.post4734.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
381
- nucliadb-6.7.0.post4734.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
382
- nucliadb-6.7.0.post4734.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
383
- nucliadb-6.7.0.post4734.dist-info/RECORD,,
379
+ nucliadb-6.7.0.post4742.dist-info/METADATA,sha256=RMmnuJPlX0neyRjo1ojJkYdgNvjC6CTMQBcYFFidrgM,4158
380
+ nucliadb-6.7.0.post4742.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
381
+ nucliadb-6.7.0.post4742.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
382
+ nucliadb-6.7.0.post4742.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
383
+ nucliadb-6.7.0.post4742.dist-info/RECORD,,