nucliadb 6.9.1.post5187__py3-none-any.whl → 6.9.1.post5207__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.

Potentially problematic release.


This version of nucliadb might be problematic. Click here for more details.

@@ -34,8 +34,10 @@ from nucliadb.common.external_index_providers.base import ExternalIndexManager
34
34
  from nucliadb.common.external_index_providers.manager import (
35
35
  get_external_index_manager,
36
36
  )
37
+ from nucliadb.common.maindb.utils import get_driver
37
38
  from nucliadb.common.nidx import get_nidx_api_client
38
39
  from nucliadb.common.vector_index_config import nucliadb_index_config_to_nidx
40
+ from nucliadb.ingest.orm.knowledgebox import KnowledgeBox
39
41
  from nucliadb.migrator.settings import settings
40
42
  from nucliadb_protos import utils_pb2, writer_pb2
41
43
  from nucliadb_telemetry import errors
@@ -45,6 +47,7 @@ from .utils import (
45
47
  get_resource,
46
48
  get_rollover_resource_index_message,
47
49
  index_resource_to_shard,
50
+ wait_for_nidx,
48
51
  )
49
52
 
50
53
  logger = logging.getLogger(__name__)
@@ -254,6 +257,7 @@ async def index_to_rollover_index(
254
257
  for rid in resource_ids
255
258
  ]
256
259
  await asyncio.gather(*batch)
260
+ await wait_for_indexing_to_catch_up(app_context)
257
261
 
258
262
  async with datamanagers.with_transaction() as txn:
259
263
  state.resources_indexed = True
@@ -262,6 +266,22 @@ async def index_to_rollover_index(
262
266
  await txn.commit()
263
267
 
264
268
 
269
+ async def wait_for_indexing_to_catch_up(app_context: ApplicationContext):
270
+ try:
271
+ app_context.nats_manager
272
+ except AssertionError:
273
+ logger.warning("Nats manager not initialized. Cannot wait for indexing to catch up")
274
+ return
275
+ max_pending = 1000
276
+ while True:
277
+ try:
278
+ await wait_for_nidx(app_context.nats_manager, max_wait_seconds=60, max_pending=max_pending)
279
+ return
280
+ except asyncio.TimeoutError:
281
+ logger.warning(f"Nidx is behind more than {max_pending} messages. Throttling rollover.")
282
+ await asyncio.sleep(30)
283
+
284
+
265
285
  async def _index_resource_to_rollover_index(
266
286
  app_context: ApplicationContext,
267
287
  rollover_shards: writer_pb2.Shards,
@@ -415,6 +435,15 @@ async def cutover_shards(app_context: ApplicationContext, kbid: str) -> None:
415
435
 
416
436
  await txn.commit()
417
437
 
438
+ # For KBs with pre-warm enabled, we must configure the new shards. There may
439
+ # be some small delay between this call and the shards being actually
440
+ # prewarmed, but rollovers are quite unusual and we prefer this rather than
441
+ # prewarming old and new shards at the same time
442
+ kb_config = await datamanagers.atomic.kb.get_config(kbid=kbid)
443
+ if kb_config is not None and kb_config.prewarm_enabled:
444
+ driver = get_driver()
445
+ await KnowledgeBox.configure_shards(driver, kbid, prewarm=True)
446
+
418
447
 
419
448
  async def validate_indexed_data(
420
449
  app_context: ApplicationContext, kbid: str, external: Optional[ExternalIndexManager] = None
@@ -32,6 +32,7 @@ from nucliadb.common.cluster.settings import settings
32
32
  from nucliadb.ingest.orm import index_message
33
33
  from nucliadb.ingest.orm.resource import Resource
34
34
  from nucliadb_protos import writer_pb2
35
+ from nucliadb_utils.nats import NatsConnectionManager
35
36
  from nucliadb_utils.utilities import Utility, clean_utility, get_utility, set_utility
36
37
 
37
38
  if TYPE_CHECKING: # pragma: no cover
@@ -125,3 +126,28 @@ async def delete_resource_from_shard(
125
126
  partition = partitioning.generate_partition(kbid, resource_id)
126
127
 
127
128
  await sm.delete_resource(shard, resource_id, 0, str(partition), kbid)
129
+
130
+
131
+ async def get_nats_consumer_pending_messages(
132
+ nats_manager: NatsConnectionManager, *, stream: str, consumer: str
133
+ ) -> int:
134
+ # get raw js client
135
+ js = nats_manager.js
136
+ consumer_info = await js.consumer_info(stream, consumer)
137
+ return consumer_info.num_pending
138
+
139
+
140
+ async def wait_for_nidx(
141
+ nats_manager: NatsConnectionManager,
142
+ max_pending: int,
143
+ poll_interval_seconds: int = 5,
144
+ max_wait_seconds: int = 60,
145
+ ):
146
+ async with asyncio.timeout(max_wait_seconds): # type: ignore
147
+ while True:
148
+ pending = await get_nats_consumer_pending_messages(
149
+ nats_manager, stream="nidx", consumer="nidx"
150
+ )
151
+ if pending < max_pending:
152
+ return
153
+ await asyncio.sleep(poll_interval_seconds)
@@ -42,6 +42,7 @@ from typing_extensions import Concatenate, ParamSpec
42
42
 
43
43
  from nucliadb.common.maindb.driver import Transaction
44
44
 
45
+ from . import cluster as cluster_dm
45
46
  from . import kb as kb_dm
46
47
  from . import labels as labels_dm
47
48
  from . import resources as resources_dm
@@ -73,6 +74,10 @@ def rw_txn_wrap(fun: Callable[Concatenate[Transaction, P], Awaitable[T]]) -> Cal
73
74
  return wrapper
74
75
 
75
76
 
77
+ class cluster:
78
+ get_kb_shards = ro_txn_wrap(cluster_dm.get_kb_shards)
79
+
80
+
76
81
  class kb:
77
82
  exists_kb = ro_txn_wrap(kb_dm.exists_kb)
78
83
  get_config = ro_txn_wrap(kb_dm.get_config)
@@ -140,9 +140,8 @@ async def start_shard_creator() -> Callable[[], Awaitable[None]]:
140
140
  driver = await setup_driver()
141
141
  pubsub = await get_pubsub()
142
142
  assert pubsub is not None, "Pubsub is not configured"
143
- storage = await get_storage(service_name=SERVICE_NAME)
144
143
 
145
- shard_creator = ShardCreatorHandler(driver=driver, storage=storage, pubsub=pubsub)
144
+ shard_creator = ShardCreatorHandler(driver=driver, pubsub=pubsub)
146
145
  await shard_creator.initialize()
147
146
 
148
147
  return shard_creator.finalize
@@ -25,14 +25,14 @@ from typing import Any
25
25
 
26
26
  from nidx_protos import nodereader_pb2, noderesources_pb2
27
27
 
28
- from nucliadb.common import locking
28
+ from nucliadb.common import datamanagers, locking
29
+ from nucliadb.common.cluster.settings import settings
29
30
  from nucliadb.common.cluster.utils import get_shard_manager
30
31
  from nucliadb.common.maindb.driver import Driver
31
32
  from nucliadb.common.nidx import get_nidx_api_client
32
33
  from nucliadb_protos import writer_pb2
33
34
  from nucliadb_utils import const
34
35
  from nucliadb_utils.cache.pubsub import PubSubDriver
35
- from nucliadb_utils.storages.storage import Storage
36
36
 
37
37
  from . import metrics
38
38
  from .utils import DelayedTaskHandler
@@ -52,12 +52,10 @@ class ShardCreatorHandler:
52
52
  self,
53
53
  *,
54
54
  driver: Driver,
55
- storage: Storage,
56
55
  pubsub: PubSubDriver,
57
56
  check_delay: float = 10.0,
58
57
  ):
59
58
  self.driver = driver
60
- self.storage = storage
61
59
  self.pubsub = pubsub
62
60
  self.shard_manager = get_shard_manager()
63
61
  self.task_handler = DelayedTaskHandler(check_delay)
@@ -111,4 +109,17 @@ class ShardCreatorHandler:
111
109
  shard_id=noderesources_pb2.ShardId(id=current_shard.nidx_shard_id)
112
110
  ) # type: ignore
113
111
  )
114
- await self.shard_manager.maybe_create_new_shard(kbid, shard.paragraphs)
112
+
113
+ if not should_create_new_shard(shard.paragraphs):
114
+ return
115
+
116
+ logger.info({"message": "Adding shard", "kbid": kbid})
117
+ async with datamanagers.with_rw_transaction() as txn:
118
+ kb_config = await datamanagers.kb.get_config(txn, kbid=kbid)
119
+ prewarm = kb_config is not None and kb_config.prewarm_enabled
120
+ await self.shard_manager.create_shard_by_kbid(txn, kbid, prewarm_enabled=prewarm)
121
+ await txn.commit()
122
+
123
+
124
+ def should_create_new_shard(num_paragraphs: int) -> bool:
125
+ return num_paragraphs > settings.max_shard_paragraphs
@@ -24,7 +24,7 @@ from uuid import uuid4
24
24
 
25
25
  from grpc import StatusCode
26
26
  from grpc.aio import AioRpcError
27
- from nidx_protos import noderesources_pb2
27
+ from nidx_protos import nidx_pb2, noderesources_pb2
28
28
 
29
29
  from nucliadb.common import datamanagers
30
30
  from nucliadb.common.cluster.exceptions import ShardNotFound
@@ -108,6 +108,7 @@ class KnowledgeBox:
108
108
  external_index_provider: CreateExternalIndexProviderMetadata = CreateExternalIndexProviderMetadata(),
109
109
  hidden_resources_enabled: bool = False,
110
110
  hidden_resources_hide_on_creation: bool = False,
111
+ prewarm_enabled: bool = False,
111
112
  ) -> tuple[str, str]:
112
113
  """Creates a new knowledge box and return its id and slug."""
113
114
 
@@ -194,6 +195,7 @@ class KnowledgeBox:
194
195
  migration_version=get_latest_version(),
195
196
  hidden_resources_enabled=hidden_resources_enabled,
196
197
  hidden_resources_hide_on_creation=hidden_resources_hide_on_creation,
198
+ prewarm_enabled=prewarm_enabled,
197
199
  )
198
200
  config.external_index_provider.CopyFrom(stored_external_index_provider)
199
201
  await datamanagers.kb.set_config(txn, kbid=kbid, config=config)
@@ -220,7 +222,7 @@ class KnowledgeBox:
220
222
  shard_manager = get_shard_manager()
221
223
  # XXX creating a shard is a slow IO operation that requires a write
222
224
  # txn to be open!
223
- await shard_manager.create_shard_by_kbid(txn, kbid)
225
+ await shard_manager.create_shard_by_kbid(txn, kbid, prewarm_enabled=prewarm_enabled)
224
226
  # shards don't need a rollback as they will be eventually purged
225
227
 
226
228
  await txn.commit()
@@ -243,39 +245,86 @@ class KnowledgeBox:
243
245
  @classmethod
244
246
  async def update(
245
247
  cls,
246
- txn: Transaction,
247
- uuid: str,
248
+ driver: Driver,
249
+ kbid: str,
250
+ *,
248
251
  slug: Optional[str] = None,
249
- config: Optional[KnowledgeBoxConfig] = None,
252
+ title: Optional[str] = None,
253
+ description: Optional[str] = None,
254
+ migration_version: Optional[int] = None,
255
+ external_index_provider: Optional[StoredExternalIndexProviderMetadata] = None,
256
+ hidden_resources_enabled: Optional[bool] = None,
257
+ hidden_resources_hide_on_creation: Optional[bool] = None,
258
+ prewarm_enabled: Optional[bool] = None,
250
259
  ) -> str:
251
- exist = await datamanagers.kb.get_config(txn, kbid=uuid, for_update=True)
252
- if not exist:
253
- raise datamanagers.exceptions.KnowledgeBoxNotFound()
254
-
255
- if slug:
256
- await txn.delete(datamanagers.kb.KB_SLUGS.format(slug=exist.slug))
257
- await txn.set(
258
- datamanagers.kb.KB_SLUGS.format(slug=slug),
259
- uuid.encode(),
260
- )
261
- if config:
262
- config.slug = slug
263
- else:
264
- exist.slug = slug
260
+ async with driver.rw_transaction() as txn:
261
+ stored = await datamanagers.kb.get_config(txn, kbid=kbid, for_update=True)
262
+ if not stored:
263
+ raise datamanagers.exceptions.KnowledgeBoxNotFound()
264
+
265
+ if slug:
266
+ await txn.delete(datamanagers.kb.KB_SLUGS.format(slug=stored.slug))
267
+ await txn.set(
268
+ datamanagers.kb.KB_SLUGS.format(slug=slug),
269
+ kbid.encode(),
270
+ )
271
+ stored.slug = slug
265
272
 
266
- if config and exist != config:
267
- exist.MergeFrom(config)
268
- exist.hidden_resources_enabled = config.hidden_resources_enabled
269
- exist.hidden_resources_hide_on_creation = config.hidden_resources_hide_on_creation
273
+ if title is not None:
274
+ stored.title = title
275
+ if description is not None:
276
+ stored.description = description
270
277
 
271
- if exist.hidden_resources_hide_on_creation and not exist.hidden_resources_enabled:
272
- raise KnowledgeBoxCreationError(
273
- "Cannot hide new resources if the hidden resources feature is disabled"
274
- )
278
+ if migration_version is not None:
279
+ stored.migration_version = migration_version
280
+
281
+ if external_index_provider is not None:
282
+ stored.external_index_provider.MergeFrom(external_index_provider)
275
283
 
276
- await datamanagers.kb.set_config(txn, kbid=uuid, config=exist)
284
+ if hidden_resources_enabled is not None:
285
+ stored.hidden_resources_enabled = hidden_resources_enabled
286
+ if hidden_resources_hide_on_creation is not None:
287
+ stored.hidden_resources_hide_on_creation = hidden_resources_hide_on_creation
288
+
289
+ update_nidx_prewarm = None
290
+ if prewarm_enabled is not None:
291
+ if stored.prewarm_enabled != prewarm_enabled:
292
+ update_nidx_prewarm = prewarm_enabled
293
+ stored.prewarm_enabled = prewarm_enabled
294
+
295
+ if stored.hidden_resources_hide_on_creation and not stored.hidden_resources_enabled:
296
+ raise KnowledgeBoxCreationError(
297
+ "Cannot hide new resources if the hidden resources feature is disabled"
298
+ )
277
299
 
278
- return uuid
300
+ await datamanagers.kb.set_config(txn, kbid=kbid, config=stored)
301
+
302
+ await txn.commit()
303
+
304
+ if update_nidx_prewarm is not None:
305
+ await cls.configure_shards(driver, kbid, prewarm=update_nidx_prewarm)
306
+
307
+ return kbid
308
+
309
+ @classmethod
310
+ async def configure_shards(cls, driver: Driver, kbid: str, *, prewarm: bool):
311
+ shards_obj = await datamanagers.atomic.cluster.get_kb_shards(kbid=kbid)
312
+ if shards_obj is None:
313
+ logger.warning(f"Shards not found for KB while updating pre-warm flag", extra={"kbid": kbid})
314
+ return
315
+
316
+ nidx_shard_ids = [shard.nidx_shard_id for shard in shards_obj.shards]
317
+
318
+ nidx_api = get_nidx_api_client()
319
+ if nidx_api is not None and len(nidx_shard_ids) > 0:
320
+ configs = [
321
+ nidx_pb2.ShardConfig(
322
+ shard_id=shard_id,
323
+ prewarm_enabled=prewarm,
324
+ )
325
+ for shard_id in nidx_shard_ids
326
+ ]
327
+ await nidx_api.ConfigureShards(nidx_pb2.ShardsConfig(configs=configs))
279
328
 
280
329
  @classmethod
281
330
  async def delete(cls, driver: Driver, kbid: str):
@@ -446,22 +446,27 @@ class Processor:
446
446
  # a resource was move to another shard while it was being indexed
447
447
  shard_id = await datamanagers.resources.get_resource_shard_id(txn, kbid=kbid, rid=uuid)
448
448
 
449
- shard = None
450
- if shard_id is not None:
451
- # Resource already has a shard assigned
452
- shard = await kb.get_resource_shard(shard_id)
453
- if shard is None:
454
- raise AttributeError("Shard not available")
455
- else:
456
- # It's a new resource, get KB's current active shard to place new resource on
457
- shard = await self.index_node_shard_manager.get_current_active_shard(txn, kbid)
458
- if shard is None:
459
- # No current shard available, create a new one
460
- shard = await self.index_node_shard_manager.create_shard_by_kbid(txn, kbid)
461
- await datamanagers.resources.set_resource_shard_id(
462
- txn, kbid=kbid, rid=uuid, shard=shard.shard
463
- )
464
- return shard
449
+ shard = None
450
+ if shard_id is not None:
451
+ # Resource already has a shard assigned
452
+ shard = await kb.get_resource_shard(shard_id)
453
+ if shard is None:
454
+ raise AttributeError("Shard not available")
455
+ else:
456
+ # It's a new resource, get KB's current active shard to place new resource on
457
+ shard = await self.index_node_shard_manager.get_current_active_shard(txn, kbid)
458
+ if shard is None:
459
+ # No current shard available, create a new one
460
+ async with locking.distributed_lock(locking.NEW_SHARD_LOCK.format(kbid=kbid)):
461
+ kb_config = await datamanagers.kb.get_config(txn, kbid=kbid)
462
+ prewarm = kb_config is not None and kb_config.prewarm_enabled
463
+ shard = await self.index_node_shard_manager.create_shard_by_kbid(
464
+ txn, kbid, prewarm_enabled=prewarm
465
+ )
466
+ await datamanagers.resources.set_resource_shard_id(
467
+ txn, kbid=kbid, rid=uuid, shard=shard.shard
468
+ )
469
+ return shard
465
470
 
466
471
  @processor_observer.wrap({"type": "index_resource"})
467
472
  async def index_resource(
@@ -126,6 +126,7 @@ class WriterServicer(writer_pb2_grpc.WriterServicer):
126
126
  external_index_provider=request.external_index_provider,
127
127
  hidden_resources_enabled=request.hidden_resources_enabled,
128
128
  hidden_resources_hide_on_creation=request.hidden_resources_hide_on_creation,
129
+ prewarm_enabled=request.prewarm_enabled,
129
130
  )
130
131
 
131
132
  except KnowledgeBoxConflict:
@@ -167,11 +168,17 @@ class WriterServicer(writer_pb2_grpc.WriterServicer):
167
168
  )
168
169
 
169
170
  try:
170
- async with self.driver.rw_transaction() as txn:
171
- kbid = await KnowledgeBoxORM.update(
172
- txn, uuid=request.uuid, slug=request.slug, config=request.config
173
- )
174
- await txn.commit()
171
+ kbid = await KnowledgeBoxORM.update(
172
+ self.driver,
173
+ kbid=request.uuid,
174
+ slug=request.slug,
175
+ title=request.config.title or None,
176
+ description=request.config.description or None,
177
+ external_index_provider=request.config.external_index_provider or None,
178
+ hidden_resources_enabled=request.config.hidden_resources_enabled,
179
+ hidden_resources_hide_on_creation=request.config.hidden_resources_hide_on_creation,
180
+ prewarm_enabled=request.config.prewarm_enabled,
181
+ )
175
182
  except KnowledgeBoxNotFound:
176
183
  return UpdateKnowledgeBoxResponse(status=KnowledgeBoxResponseStatus.NOTFOUND)
177
184
  except Exception:
@@ -77,13 +77,7 @@ class MigrationsDataManager:
77
77
  return KnowledgeBoxInfo(current_version=kb_config.migration_version)
78
78
 
79
79
  async def update_kb_info(self, *, kbid: str, current_version: int) -> None:
80
- async with self.driver.rw_transaction() as txn:
81
- kb_config = await datamanagers.kb.get_config(txn, kbid=kbid, for_update=True)
82
- if kb_config is None:
83
- raise Exception(f"KB {kbid} does not exist")
84
- kb_config.migration_version = current_version
85
- await KnowledgeBoxORM.update(txn, kbid, config=kb_config)
86
- await txn.commit()
80
+ await KnowledgeBoxORM.update(self.driver, kbid, migration_version=current_version)
87
81
 
88
82
  async def get_global_info(self) -> GlobalInfo:
89
83
  async with self.driver.ro_transaction() as txn:
@@ -19,6 +19,7 @@
19
19
  #
20
20
  import asyncio
21
21
  import importlib.metadata
22
+ from itertools import batched # type: ignore
22
23
  from typing import AsyncGenerator
23
24
 
24
25
  from nucliadb.common import datamanagers
@@ -233,7 +234,7 @@ async def purge_kb_vectorsets(driver: Driver, storage: Storage):
233
234
  fields.extend((await resource.get_fields(force=True)).values())
234
235
 
235
236
  logger.info(f"Purging {len(fields)} fields for vectorset {vectorset}", extra={"kbid": kbid})
236
- for fields_batch in batchify(fields, 20):
237
+ for fields_batch in batched(fields, n=20):
237
238
  tasks = []
238
239
  for field in fields_batch:
239
240
  if purge_payload.storage_key_kind == VectorSetConfig.StorageKeyKind.UNSET:
@@ -317,9 +318,3 @@ def run() -> int: # pragma: no cover
317
318
  setup_logging()
318
319
  errors.setup_error_handling(importlib.metadata.distribution("nucliadb").version)
319
320
  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]
@@ -147,8 +147,6 @@ async def create_kb(item: KnowledgeBoxConfig) -> tuple[str, str]:
147
147
  @requires(NucliaDBRoles.MANAGER)
148
148
  @version(1)
149
149
  async def update_kb(request: Request, kbid: str, item: KnowledgeBoxConfig) -> KnowledgeBoxObjID:
150
- driver = get_driver()
151
- config = None
152
150
  if (
153
151
  item.slug
154
152
  or item.title
@@ -156,29 +154,24 @@ async def update_kb(request: Request, kbid: str, item: KnowledgeBoxConfig) -> Kn
156
154
  or item.hidden_resources_enabled
157
155
  or item.hidden_resources_hide_on_creation
158
156
  ):
159
- config = knowledgebox_pb2.KnowledgeBoxConfig(
160
- slug=item.slug or "",
161
- title=item.title or "",
162
- description=item.description or "",
163
- hidden_resources_enabled=item.hidden_resources_enabled,
164
- hidden_resources_hide_on_creation=item.hidden_resources_hide_on_creation,
165
- )
166
- try:
167
- async with driver.rw_transaction() as txn:
157
+ try:
158
+ driver = get_driver()
168
159
  await KnowledgeBox.update(
169
- txn,
170
- uuid=kbid,
160
+ driver,
161
+ kbid=kbid,
171
162
  slug=item.slug,
172
- config=config,
163
+ title=item.title,
164
+ description=item.description,
165
+ hidden_resources_enabled=item.hidden_resources_enabled,
166
+ hidden_resources_hide_on_creation=item.hidden_resources_hide_on_creation,
173
167
  )
174
- await txn.commit()
175
- except datamanagers.exceptions.KnowledgeBoxNotFound:
176
- raise HTTPException(status_code=404, detail="Knowledge box does not exist")
177
- except Exception as exc:
178
- logger.exception("Could not update KB", exc_info=exc, extra={"kbid": kbid})
179
- raise HTTPException(status_code=500, detail="Error updating knowledge box")
180
- else:
181
- return KnowledgeBoxObjID(uuid=kbid)
168
+ except datamanagers.exceptions.KnowledgeBoxNotFound:
169
+ raise HTTPException(status_code=404, detail="Knowledge box does not exist")
170
+ except Exception as exc:
171
+ logger.exception("Could not update KB", exc_info=exc, extra={"kbid": kbid})
172
+ raise HTTPException(status_code=500, detail="Error updating knowledge box")
173
+
174
+ return KnowledgeBoxObjID(uuid=kbid)
182
175
 
183
176
 
184
177
  @only_for_onprem
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nucliadb
3
- Version: 6.9.1.post5187
3
+ Version: 6.9.1.post5207
4
4
  Summary: NucliaDB
5
5
  Author-email: Nuclia <nucliadb@nuclia.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -19,11 +19,11 @@ 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.9.1.post5187
23
- Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.9.1.post5187
24
- Requires-Dist: nucliadb-protos>=6.9.1.post5187
25
- Requires-Dist: nucliadb-models>=6.9.1.post5187
26
- Requires-Dist: nidx-protos>=6.9.1.post5187
22
+ Requires-Dist: nucliadb-telemetry[all]>=6.9.1.post5207
23
+ Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.9.1.post5207
24
+ Requires-Dist: nucliadb-protos>=6.9.1.post5207
25
+ Requires-Dist: nucliadb-models>=6.9.1.post5207
26
+ Requires-Dist: nidx-protos>=6.9.1.post5207
27
27
  Requires-Dist: nucliadb-admin-assets>=1.0.0.post1224
28
28
  Requires-Dist: nuclia-models>=0.50.0
29
29
  Requires-Dist: uvicorn[standard]
@@ -85,17 +85,17 @@ nucliadb/common/catalog/utils.py,sha256=lQLTe3rN_ra0CiNjTQIiIaU4lhx5beRkx1Va10ZB
85
85
  nucliadb/common/cluster/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
86
86
  nucliadb/common/cluster/exceptions.py,sha256=t7v_l93t44l2tQpdQXgO_w-c4YZRcaayOz1A2i0w4RQ,1258
87
87
  nucliadb/common/cluster/grpc_node_dummy.py,sha256=JkufazWzMA4KFEU8EBkMbiiDW4C8lLcRhiiCxP7aCQY,2949
88
- nucliadb/common/cluster/manager.py,sha256=QOHA7trtZVwV5G9IIxM1Y-0P2KE5mEhsXUMPs8vxIg0,12816
89
- nucliadb/common/cluster/rebalance.py,sha256=238JxqdSl1_oeJNpKuGBgfVn8WXVmyX5yl2PyHomYX8,8715
90
- nucliadb/common/cluster/rollover.py,sha256=swuYNXJ8u5p11PvYaHxVtomiYIPVWVGVsicwTgm24-Q,25862
88
+ nucliadb/common/cluster/manager.py,sha256=p-haaGEnCa-20t-I2XEo4QJ5ZC1QgJ6p2jzXFYVB6nQ,12346
89
+ nucliadb/common/cluster/rebalance.py,sha256=s0YJ07Y358T9x22QnHHEvhmHqf1CnQWQD6oJznOo2Xc,22239
90
+ nucliadb/common/cluster/rollover.py,sha256=kmVCdyjJ1dilnSodHMqf0EUkTjPC5H0aA4JqW9KsEa4,27168
91
91
  nucliadb/common/cluster/settings.py,sha256=f6Y5K0PGahkedwe5wtkWMnbqwDFJgOOwX_MOIGwH9Dg,2271
92
- nucliadb/common/cluster/utils.py,sha256=IfW5PA7Ab26xWUYNOc3yBoksWV1GK4BGhTRo1vnHNKg,4662
92
+ nucliadb/common/cluster/utils.py,sha256=E4GqidwTKczJX_lTnncBCof2fL4CFVVF1eLiz9NWjlc,5494
93
93
  nucliadb/common/cluster/standalone/__init__.py,sha256=itSI7dtTwFP55YMX4iK7JzdMHS5CQVUiB1XzQu4UBh8,833
94
94
  nucliadb/common/cluster/standalone/utils.py,sha256=af3r-x_GF7A6dwIAhZLR-r-SZQEVxsFrDKeMfUTA6G0,1908
95
95
  nucliadb/common/context/__init__.py,sha256=IKAHuiCjbOEsqfLozWwJ6mRFzFncsZMyxNC5E_XZ5EM,6016
96
96
  nucliadb/common/context/fastapi.py,sha256=mH_8n5t7quNSPivNM2JS5EQf2sTVJsdzXW6LaY7EHAA,1629
97
97
  nucliadb/common/datamanagers/__init__.py,sha256=xKc6ZMqKUs20R90jJT4xkQ8TFMNwQnhhuWnBBqVnKdM,2084
98
- nucliadb/common/datamanagers/atomic.py,sha256=WihdtBWQIAuElZQjh1xQ--q5dJowwlkovqsW-OB_t2k,3230
98
+ nucliadb/common/datamanagers/atomic.py,sha256=-3T2--A0_qFWmy573t-DS29EHFcMTyjGvcvky6J9tAM,3341
99
99
  nucliadb/common/datamanagers/cluster.py,sha256=iU0b7AESm1Yi8Wp3pIKgqixZGNMjeBrxSpvEKsaZKgY,1831
100
100
  nucliadb/common/datamanagers/entities.py,sha256=gI-0mbMlqrr9FiyhexEh6czhgYcMxE2s9m4o866EK9o,5340
101
101
  nucliadb/common/datamanagers/exceptions.py,sha256=Atz_PP_GGq4jgJaWcAkcRbHBoBaGcC9yJvFteylKtTE,883
@@ -150,8 +150,8 @@ nucliadb/ingest/consumer/consumer.py,sha256=1OetpJXp6glaAe4kKqUA_L46BS-ZyEccTkwt
150
150
  nucliadb/ingest/consumer/materializer.py,sha256=tgD_rDI2twQzcz8kKNiW_L4YIth16IGh9mUfD5wiSD4,3858
151
151
  nucliadb/ingest/consumer/metrics.py,sha256=ji1l_4cKiHJthQd8YNem1ft4iMbw9KThmVvJmLcv3Xg,1075
152
152
  nucliadb/ingest/consumer/pull.py,sha256=Ki_aHi72W83yD03lPt6Yz2l_uCeu62fd4upEMcOZcm4,9201
153
- nucliadb/ingest/consumer/service.py,sha256=mjiEJFO9t8nsQBdbWfGyyGajaW012-6mAwMARBkedgU,5600
154
- nucliadb/ingest/consumer/shard_creator.py,sha256=UKIk0yaS_jC_nGQqymn9NGJWzwZEqhIr0gznJYorlAE,4348
153
+ nucliadb/ingest/consumer/service.py,sha256=_yj3gUKaCUA6Wp_73Bm8tO2Xk1vR8-aJV2xvPZpjAfM,5524
154
+ nucliadb/ingest/consumer/shard_creator.py,sha256=qUEpxZLE1etw1nL8L3O9HvZBx5NNql7S1vKDyqelN2M,4849
155
155
  nucliadb/ingest/consumer/utils.py,sha256=jpX8D4lKzuPCpArQLZeX_Zczq3pfen_zAf8sPJfOEZU,2642
156
156
  nucliadb/ingest/fields/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
157
157
  nucliadb/ingest/fields/base.py,sha256=D8NzawonF7hivDW9zvQBbV938TKA6e2OCGqV4kS96RU,24405
@@ -167,23 +167,23 @@ nucliadb/ingest/orm/broker_message.py,sha256=XWaiZgDOz94NPOPT-hqbRr5ZkpVimUw6PjU
167
167
  nucliadb/ingest/orm/entities.py,sha256=kXyeF6XOpFKhEsGLcY-GLIk21Exp0cJst4XQQ9jJoug,14791
168
168
  nucliadb/ingest/orm/exceptions.py,sha256=gsp7TtVNQPiIEh-zf_UEJClwuFU0iu-5vzj0OrKMScg,1550
169
169
  nucliadb/ingest/orm/index_message.py,sha256=mWlpQ0-KChSVIbHewVE8sXCe-7LiPIIh0cBqr3axU8o,16554
170
- nucliadb/ingest/orm/knowledgebox.py,sha256=n72wuqordGbKhUcFd1jEbf3c7E3IQPnyBXq9rIEDtvM,23428
170
+ nucliadb/ingest/orm/knowledgebox.py,sha256=rjZKD8dIhr-2kvm77K0OBjQKv8VU1FoWi0YQDswZ9fo,25630
171
171
  nucliadb/ingest/orm/metrics.py,sha256=OiuggTh-n3kZHA2G73NEUdIlh8c3yFrbusI88DK-Mko,1273
172
172
  nucliadb/ingest/orm/resource.py,sha256=zQeZyZ-tCxr-DhonLobfZRkz_iEew0Y-cGfXeNNIHG0,40432
173
173
  nucliadb/ingest/orm/utils.py,sha256=fCQRuyecgqhaY7mcBG93oaXMkzkKb9BFjOcy4-ZiSNw,2693
174
174
  nucliadb/ingest/orm/processor/__init__.py,sha256=xhDNKCxY0XNOlIVKEtM8QT75vDUkJIt7K-_VgGbbOQU,904
175
175
  nucliadb/ingest/orm/processor/auditing.py,sha256=gxn5v30KVaH0TnIjo715mWjzKGJ-DMviElEXJG9BNN4,4612
176
176
  nucliadb/ingest/orm/processor/data_augmentation.py,sha256=v-pj4GbBWSuO8dQyahs5UDr5ghsyfhCZDS0ftKd6ZYc,5179
177
- nucliadb/ingest/orm/processor/processor.py,sha256=3wlGiCXXaVpqLyCJ3AHWHfpKTwtywU78_LkNtpqOiuQ,31391
177
+ nucliadb/ingest/orm/processor/processor.py,sha256=S7myNucnK8v_5y4gZxS_5nL-glGx_fZe2l8gSzDy2CU,31808
178
178
  nucliadb/ingest/orm/processor/sequence_manager.py,sha256=kUH0bCuM6NqpA0xSwfyb9igig3Btu57pc8VYnKggqx4,1693
179
179
  nucliadb/ingest/service/__init__.py,sha256=LHQFUkdmNBOWqBG0Md9sMMI7g5TQZ-hLAnhw6ZblrJg,2002
180
180
  nucliadb/ingest/service/exceptions.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
181
- nucliadb/ingest/service/writer.py,sha256=6LvBcwdu5MbL8SWI4HhQwULFsTnnbeHpg4xIzj5Hw_M,21570
181
+ nucliadb/ingest/service/writer.py,sha256=ilHBV3cW4D-vO0hWKZP0hA9j5xNnEgsXrrw7r0VOt9M,21988
182
182
  nucliadb/middleware/__init__.py,sha256=A8NBlBuEkunCFMKpR9gnfNELsVn0Plc55BIQMbWDM8Q,2202
183
183
  nucliadb/migrator/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
184
184
  nucliadb/migrator/command.py,sha256=dKbJ1tAmP6X4lMVRSSlz351euaqs2wBPpOczLjATUes,2089
185
185
  nucliadb/migrator/context.py,sha256=3h6M_AG2HFjTYtQC2XDmKps7wywdUduT1RM3C30S_S0,1334
186
- nucliadb/migrator/datamanager.py,sha256=WLOKVbkU-G4dtWscKMc4WhQHpncWq_hH3Kf4qHfPzXI,5237
186
+ nucliadb/migrator/datamanager.py,sha256=PttueVXSqwXHNvrT8p2626Td-NHb4eGBbfBY_F4vVdw,4928
187
187
  nucliadb/migrator/exceptions.py,sha256=jTj3YhKmFwUyjjgoKUNoCAiGrpEbB64X1Um212nSNQ8,889
188
188
  nucliadb/migrator/migrator.py,sha256=NUOhaCyEoAldXVexYEqClppIN0TMXrF37Ulz0y0TWCY,10840
189
189
  nucliadb/migrator/models.py,sha256=3PJkL2PGvKgIG0KIBv4H5XCsOVmwWMlRV3m0ntDj10Q,1145
@@ -193,7 +193,7 @@ nucliadb/models/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,8
193
193
  nucliadb/models/responses.py,sha256=qnuOoc7TrVSUnpikfTwHLKez47_DE4mSFzpxrwtqijA,1599
194
194
  nucliadb/models/internal/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
195
195
  nucliadb/models/internal/processing.py,sha256=F_WpDItHsBWuMNeLMxXOKqpZoRYdjPuB2l0s29PVcfI,4213
196
- nucliadb/purge/__init__.py,sha256=FWqY2ln2ecGgVcZaMhfs8nTt4HzpprubkCsurSrIrC8,13070
196
+ nucliadb/purge/__init__.py,sha256=RFqMj3JRML2sGrQtmRm2fzRg350f0PhkBpZh-KRWnlc,12954
197
197
  nucliadb/purge/orphan_shards.py,sha256=5QvTBoYJ2h14TUvJmZxphHJPf_WB-VVC9453n-zjSrU,7747
198
198
  nucliadb/reader/__init__.py,sha256=C5Efic7WlGm2U2C5WOyquMFbIj2Pojwe_8mwzVYnOzE,1304
199
199
  nucliadb/reader/app.py,sha256=Se-BFTE6d1v1msLzQn4q5XIhjnSxa2ckDSHdvm7NRf8,3096
@@ -362,7 +362,7 @@ nucliadb/writer/api/utils.py,sha256=wIQHlU8RQiIGVLI72suvyVIKlCU44Unh0Ae0IiN6Qwo,
362
362
  nucliadb/writer/api/v1/__init__.py,sha256=akI9A_jloNLb0dU4T5zjfdyvmSAiDeIdjAlzNx74FlU,1128
363
363
  nucliadb/writer/api/v1/export_import.py,sha256=v0sU55TtRSqDzwkDgcwv2uSaqKCuQTtGcMpYoHQYBQA,8192
364
364
  nucliadb/writer/api/v1/field.py,sha256=nO3IEV6v5hokdIo5HoaecdwDqvr1PzCJlh5DafzcNTw,19130
365
- nucliadb/writer/api/v1/knowledgebox.py,sha256=oSeM0HkOhvDIvjwrBeqbd9ubeN91x2-PiuhJgNuBn-w,8084
365
+ nucliadb/writer/api/v1/knowledgebox.py,sha256=hx3J91fziaISU1aYdfI0eIQNuJj8BrBzGb6B4Rt2j-I,7881
366
366
  nucliadb/writer/api/v1/learning_config.py,sha256=DTLEzKJ3dHvi8pbZscjElUqCH_ZvLc6WZgvalFqHo10,4450
367
367
  nucliadb/writer/api/v1/resource.py,sha256=IfcT6HXnR5sC5wSnQSuKmFzEWcLTh7OzZEAV4hYmXnA,20442
368
368
  nucliadb/writer/api/v1/router.py,sha256=RjuoWLpZer6Kl2BW_wznpNo6XL3BOpdTGqXZCn3QrrQ,1034
@@ -385,8 +385,8 @@ nucliadb/writer/tus/local.py,sha256=7jYa_w9b-N90jWgN2sQKkNcomqn6JMVBOVeDOVYJHto,
385
385
  nucliadb/writer/tus/s3.py,sha256=vu1BGg4VqJ_x2P1u2BxqPKlSfw5orT_a3R-Ln5oPUpU,8483
386
386
  nucliadb/writer/tus/storage.py,sha256=ToqwjoYnjI4oIcwzkhha_MPxi-k4Jk3Lt55zRwaC1SM,2903
387
387
  nucliadb/writer/tus/utils.py,sha256=MSdVbRsRSZVdkaum69_0wku7X3p5wlZf4nr6E0GMKbw,2556
388
- nucliadb-6.9.1.post5187.dist-info/METADATA,sha256=dhIhNOcYtZA3MpFYQVS5YCtNOA7kQI09_R6FPPzR3TQ,4158
389
- nucliadb-6.9.1.post5187.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
390
- nucliadb-6.9.1.post5187.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
391
- nucliadb-6.9.1.post5187.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
392
- nucliadb-6.9.1.post5187.dist-info/RECORD,,
388
+ nucliadb-6.9.1.post5207.dist-info/METADATA,sha256=icEK-KGKOcUE2rL5qX_iNdbLDueZLT3XNaPSe6P5n1E,4158
389
+ nucliadb-6.9.1.post5207.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
390
+ nucliadb-6.9.1.post5207.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
391
+ nucliadb-6.9.1.post5207.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
392
+ nucliadb-6.9.1.post5207.dist-info/RECORD,,