nucliadb 6.3.3.post3621__py3-none-any.whl → 6.3.3.post3627__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.
@@ -39,6 +39,7 @@ from . import (
39
39
  processing,
40
40
  resources,
41
41
  rollover,
42
+ search_configurations,
42
43
  synonyms,
43
44
  vectorsets,
44
45
  )
@@ -55,6 +56,7 @@ __all__ = (
55
56
  "processing",
56
57
  "resources",
57
58
  "rollover",
59
+ "search_configurations",
58
60
  "synonyms",
59
61
  "vectorsets",
60
62
  "with_transaction",
@@ -45,6 +45,7 @@ from nucliadb.common.maindb.driver import Transaction
45
45
  from . import kb as kb_dm
46
46
  from . import labels as labels_dm
47
47
  from . import resources as resources_dm
48
+ from . import search_configurations as search_configurations_dm
48
49
  from . import synonyms as synonyms_dm
49
50
  from .utils import with_ro_transaction, with_transaction
50
51
 
@@ -94,3 +95,7 @@ class labelset:
94
95
  class synonyms:
95
96
  get = ro_txn_wrap(synonyms_dm.get)
96
97
  set = rw_txn_wrap(synonyms_dm.set)
98
+
99
+
100
+ class search_configurations:
101
+ get = ro_txn_wrap(search_configurations_dm.get)
@@ -0,0 +1,68 @@
1
+ # Copyright (C) 2021 Bosutech XXI S.L.
2
+ #
3
+ # nucliadb is offered under the AGPL v3.0 and as commercial software.
4
+ # For commercial licensing, contact us at info@nuclia.com.
5
+ #
6
+ # AGPL:
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Affero General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Affero General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ #
20
+ import logging
21
+ from typing import Optional
22
+
23
+ from pydantic import TypeAdapter
24
+
25
+ from nucliadb.common.maindb.driver import Transaction
26
+ from nucliadb_models.configuration import SearchConfiguration
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+ KB_SEARCH_CONFIGURATION_PREFIX = "/kbs/{kbid}/search_configuration"
31
+ KB_SEARCH_CONFIGURATION = "/kbs/{kbid}/search_configuration/{name}"
32
+
33
+
34
+ async def get(txn: Transaction, *, kbid: str, name: str) -> Optional[SearchConfiguration]:
35
+ key = KB_SEARCH_CONFIGURATION.format(kbid=kbid, name=name)
36
+ data = await txn.get(key, for_update=True)
37
+ if not data:
38
+ return None
39
+ return TypeAdapter(SearchConfiguration).validate_json(data)
40
+
41
+
42
+ async def list(txn: Transaction, *, kbid: str) -> dict[str, SearchConfiguration]:
43
+ keys = []
44
+ async for key in txn.keys(KB_SEARCH_CONFIGURATION_PREFIX.format(kbid=kbid)):
45
+ keys.append(key)
46
+
47
+ configs_data = await txn.batch_get(keys)
48
+
49
+ configs = {}
50
+ for key, data in zip(keys, configs_data):
51
+ if data is None:
52
+ continue
53
+ name = key.split("/")[-1]
54
+ config: SearchConfiguration = TypeAdapter(SearchConfiguration).validate_json(data)
55
+ configs[name] = config
56
+
57
+ return configs
58
+
59
+
60
+ async def set(txn: Transaction, *, kbid: str, name: str, config: SearchConfiguration) -> None:
61
+ key = KB_SEARCH_CONFIGURATION.format(kbid=kbid, name=name)
62
+ data = config.model_dump_json(exclude_unset=True)
63
+ await txn.set(key, data.encode("utf-8"))
64
+
65
+
66
+ async def delete(txn: Transaction, *, kbid: str, name: str) -> None:
67
+ key = KB_SEARCH_CONFIGURATION.format(kbid=kbid, name=name)
68
+ await txn.delete(key)
@@ -21,6 +21,7 @@ import asyncio
21
21
  import importlib.metadata
22
22
  from typing import AsyncGenerator
23
23
 
24
+ from nucliadb.common import datamanagers
24
25
  from nucliadb.common.cluster.exceptions import NodeError, ShardNotFound
25
26
  from nucliadb.common.cluster.utils import setup_cluster, teardown_cluster
26
27
  from nucliadb.common.maindb.driver import Driver
@@ -185,7 +186,11 @@ async def _purge_resources_storage_batch(driver: Driver, storage: Storage, batch
185
186
  tasks = []
186
187
  for key in to_delete_batch:
187
188
  kbid, resource_id = key.split("/")[-2:]
188
- tasks.append(asyncio.create_task(storage.delete_resource(kbid, resource_id)))
189
+ # Check if resource exists in maindb. This can happen if a file is deleted (marked for purge) and immediately
190
+ # reuploaded. Without this check, we will delete the data of the newly uploaded copy of the resource.
191
+ if not await datamanagers.atomic.resources.resource_exists(kbid=kbid, rid=resource_id):
192
+ tasks.append(asyncio.create_task(storage.delete_resource(kbid, resource_id)))
193
+
189
194
  await asyncio.gather(*tasks)
190
195
 
191
196
  # Delete the schedule-to-delete keys
@@ -38,6 +38,7 @@ from nucliadb.models.responses import HTTPClientError
38
38
  from nucliadb.reader import SERVICE_NAME
39
39
  from nucliadb.reader.api.v1.router import KB_PREFIX, api
40
40
  from nucliadb.reader.reader.notifications import kb_notifications_stream
41
+ from nucliadb_models.configuration import SearchConfiguration
41
42
  from nucliadb_models.entities import (
42
43
  EntitiesGroup,
43
44
  KnowledgeBoxEntities,
@@ -315,3 +316,41 @@ async def processing_status(
315
316
  # overwrite result with only resources that exist in the database.
316
317
  results.results = result_items
317
318
  return results
319
+
320
+
321
+ @api.get(
322
+ f"/{KB_PREFIX}/{{kbid}}/search_configurations/{{config_name}}",
323
+ status_code=200,
324
+ summary="Get search configuration",
325
+ tags=["Knowledge Box Services"],
326
+ response_model_exclude_unset=True,
327
+ )
328
+ @requires(NucliaDBRoles.READER)
329
+ @version(1)
330
+ async def get_search_configuration(request: Request, kbid: str, config_name: str) -> SearchConfiguration:
331
+ async with datamanagers.with_transaction() as txn:
332
+ if not await datamanagers.kb.exists_kb(txn, kbid=kbid):
333
+ raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
334
+
335
+ config = await datamanagers.search_configurations.get(txn, kbid=kbid, name=config_name)
336
+ if config is None:
337
+ raise HTTPException(status_code=404, detail="Search configuration does not exist")
338
+
339
+ return config
340
+
341
+
342
+ @api.get(
343
+ f"/{KB_PREFIX}/{{kbid}}/search_configurations",
344
+ status_code=200,
345
+ summary="List search configurations",
346
+ tags=["Knowledge Box Services"],
347
+ response_model_exclude_unset=True,
348
+ )
349
+ @requires(NucliaDBRoles.READER)
350
+ @version(1)
351
+ async def list_search_configurations(request: Request, kbid: str) -> dict[str, SearchConfiguration]:
352
+ async with datamanagers.with_transaction() as txn:
353
+ if not await datamanagers.kb.exists_kb(txn, kbid=kbid):
354
+ raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
355
+
356
+ return await datamanagers.search_configurations.list(txn, kbid=kbid)
@@ -23,12 +23,14 @@ from fastapi import Header, Request, Response
23
23
  from fastapi_versioning import version
24
24
  from starlette.responses import StreamingResponse
25
25
 
26
+ from nucliadb.common import datamanagers
26
27
  from nucliadb.models.responses import HTTPClientError
27
28
  from nucliadb.search.api.v1.router import KB_PREFIX, api
28
29
  from nucliadb.search.search import cache
29
30
  from nucliadb.search.search.chat.ask import AskResult, ask, handled_ask_exceptions
30
31
  from nucliadb.search.search.chat.exceptions import AnswerJsonSchemaTooLong
31
32
  from nucliadb.search.search.utils import maybe_log_request_payload
33
+ from nucliadb_models.configuration import AskConfig
32
34
  from nucliadb_models.resource import NucliaDBRoles
33
35
  from nucliadb_models.search import (
34
36
  AskRequest,
@@ -72,6 +74,22 @@ async def ask_knowledgebox_endpoint(
72
74
  else:
73
75
  item.security.groups = current_user.security_groups
74
76
 
77
+ if item.search_configuration is not None:
78
+ search_config = await datamanagers.atomic.search_configurations.get(
79
+ kbid=kbid, name=item.search_configuration
80
+ )
81
+ if search_config is None:
82
+ return HTTPClientError(status_code=400, detail="Search configuration not found")
83
+
84
+ if not isinstance(search_config.config, AskConfig):
85
+ return HTTPClientError(
86
+ status_code=400, detail="This search configuration is not valid for `ask`"
87
+ )
88
+
89
+ item = AskRequest.model_validate(
90
+ search_config.config.model_dump(exclude_unset=True) | item.model_dump(exclude_unset=True)
91
+ )
92
+
75
93
  return await create_ask_response(
76
94
  kbid, item, x_nucliadb_user, x_ndb_client, x_forwarded_for, x_synchronous
77
95
  )
@@ -25,6 +25,7 @@ from fastapi.openapi.models import Example
25
25
  from fastapi_versioning import version
26
26
  from pydantic import ValidationError
27
27
 
28
+ from nucliadb.common import datamanagers
28
29
  from nucliadb.common.datamanagers.exceptions import KnowledgeBoxNotFound
29
30
  from nucliadb.models.responses import HTTPClientError
30
31
  from nucliadb.search import predict
@@ -35,6 +36,7 @@ from nucliadb.search.search.exceptions import InvalidQueryError
35
36
  from nucliadb.search.search.find import find
36
37
  from nucliadb.search.search.utils import maybe_log_request_payload, min_score_from_query_params
37
38
  from nucliadb_models.common import FieldTypeName
39
+ from nucliadb_models.configuration import FindConfig
38
40
  from nucliadb_models.filters import FilterExpression
39
41
  from nucliadb_models.resource import ExtractedDataTypeName, NucliaDBRoles
40
42
  from nucliadb_models.search import (
@@ -129,6 +131,9 @@ async def find_knowledgebox(
129
131
  show_hidden: bool = fastapi_query(SearchParamDefaults.show_hidden),
130
132
  rank_fusion: RankFusionName = fastapi_query(SearchParamDefaults.rank_fusion),
131
133
  reranker: Union[RerankerName, Reranker] = fastapi_query(SearchParamDefaults.reranker),
134
+ search_configuration: Optional[str] = Query(
135
+ default=None, description="Load find parameters from this configuration"
136
+ ),
132
137
  x_ndb_client: NucliaDBClientType = Header(NucliaDBClientType.API),
133
138
  x_nucliadb_user: str = Header(""),
134
139
  x_forwarded_for: str = Header(""),
@@ -203,6 +208,22 @@ async def _find_endpoint(
203
208
  x_nucliadb_user: str,
204
209
  x_forwarded_for: str,
205
210
  ) -> Union[KnowledgeboxFindResults, HTTPClientError]:
211
+ if item.search_configuration is not None:
212
+ search_config = await datamanagers.atomic.search_configurations.get(
213
+ kbid=kbid, name=item.search_configuration
214
+ )
215
+ if search_config is None:
216
+ return HTTPClientError(status_code=400, detail="Search configuration not found")
217
+
218
+ if not isinstance(search_config.config, FindConfig):
219
+ return HTTPClientError(
220
+ status_code=400, detail="This search configuration is not valid for `find`"
221
+ )
222
+
223
+ item = FindRequest.model_validate(
224
+ search_config.config.model_dump(exclude_unset=True) | item.model_dump(exclude_unset=True)
225
+ )
226
+
206
227
  try:
207
228
  maybe_log_request_payload(kbid, "/find", item)
208
229
  with cache.request_caches():
@@ -30,6 +30,7 @@ from nucliadb.models.responses import (
30
30
  HTTPNotFound,
31
31
  )
32
32
  from nucliadb.writer.api.v1.router import KB_PREFIX, api
33
+ from nucliadb_models.configuration import SearchConfiguration
33
34
  from nucliadb_models.entities import (
34
35
  CreateEntitiesGroupPayload,
35
36
  UpdateEntitiesGroupPayload,
@@ -272,3 +273,77 @@ async def delete_custom_synonyms(request: Request, kbid: str):
272
273
  await txn.commit()
273
274
 
274
275
  return Response(status_code=204)
276
+
277
+
278
+ @api.post(
279
+ f"/{KB_PREFIX}/{{kbid}}/search_configurations/{{config_name}}",
280
+ status_code=201,
281
+ summary="Create search configuration",
282
+ tags=["Knowledge Box Services"],
283
+ )
284
+ @requires(NucliaDBRoles.WRITER)
285
+ @version(1)
286
+ async def create_search_configuration(
287
+ request: Request, kbid: str, config_name: str, search_configuration: SearchConfiguration
288
+ ):
289
+ async with datamanagers.with_transaction() as txn:
290
+ if not await datamanagers.kb.exists_kb(txn, kbid=kbid):
291
+ raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
292
+
293
+ if await datamanagers.search_configurations.get(txn, kbid=kbid, name=config_name) is not None:
294
+ raise HTTPException(status_code=409, detail="Search configuration already exists")
295
+
296
+ await datamanagers.search_configurations.set(
297
+ txn, kbid=kbid, name=config_name, config=search_configuration
298
+ )
299
+ await txn.commit()
300
+
301
+ return Response(status_code=201)
302
+
303
+
304
+ @api.patch(
305
+ f"/{KB_PREFIX}/{{kbid}}/search_configurations/{{config_name}}",
306
+ status_code=200,
307
+ summary="Update search configuration",
308
+ tags=["Knowledge Box Services"],
309
+ )
310
+ @requires(NucliaDBRoles.WRITER)
311
+ @version(1)
312
+ async def update_search_configuration(
313
+ request: Request, kbid: str, config_name: str, search_configuration: SearchConfiguration
314
+ ):
315
+ async with datamanagers.with_transaction() as txn:
316
+ if not await datamanagers.kb.exists_kb(txn, kbid=kbid):
317
+ raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
318
+
319
+ if await datamanagers.search_configurations.get(txn, kbid=kbid, name=config_name) is None:
320
+ raise HTTPException(status_code=404, detail="Search configuration does not exist")
321
+
322
+ await datamanagers.search_configurations.set(
323
+ txn, kbid=kbid, name=config_name, config=search_configuration
324
+ )
325
+ await txn.commit()
326
+
327
+ return Response(status_code=200)
328
+
329
+
330
+ @api.delete(
331
+ f"/{KB_PREFIX}/{{kbid}}/search_configurations/{{config_name}}",
332
+ status_code=204,
333
+ summary="Delete search configuration",
334
+ tags=["Knowledge Box Services"],
335
+ )
336
+ @requires(NucliaDBRoles.WRITER)
337
+ @version(1)
338
+ async def delete_search_configuration(request: Request, kbid: str, config_name: str):
339
+ async with datamanagers.with_transaction() as txn:
340
+ if not await datamanagers.kb.exists_kb(txn, kbid=kbid):
341
+ raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
342
+
343
+ if await datamanagers.search_configurations.get(txn, kbid=kbid, name=config_name) is None:
344
+ raise HTTPException(status_code=404, detail="Search configuration does not exist")
345
+
346
+ await datamanagers.search_configurations.delete(txn, kbid=kbid, name=config_name)
347
+ await txn.commit()
348
+
349
+ return Response(status_code=204)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: nucliadb
3
- Version: 6.3.3.post3621
3
+ Version: 6.3.3.post3627
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.3.3.post3621
24
- Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.3.3.post3621
25
- Requires-Dist: nucliadb-protos>=6.3.3.post3621
26
- Requires-Dist: nucliadb-models>=6.3.3.post3621
27
- Requires-Dist: nidx-protos>=6.3.3.post3621
23
+ Requires-Dist: nucliadb-telemetry[all]>=6.3.3.post3627
24
+ Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.3.3.post3627
25
+ Requires-Dist: nucliadb-protos>=6.3.3.post3627
26
+ Requires-Dist: nucliadb-models>=6.3.3.post3627
27
+ Requires-Dist: nidx-protos>=6.3.3.post3627
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
@@ -67,8 +67,8 @@ nucliadb/common/cluster/standalone/__init__.py,sha256=itSI7dtTwFP55YMX4iK7JzdMHS
67
67
  nucliadb/common/cluster/standalone/utils.py,sha256=af3r-x_GF7A6dwIAhZLR-r-SZQEVxsFrDKeMfUTA6G0,1908
68
68
  nucliadb/common/context/__init__.py,sha256=ZLUvKuIPaolKeA3aeZa2JcHwCIaEauNu8WpdKsiINXo,3354
69
69
  nucliadb/common/context/fastapi.py,sha256=j3HZ3lne6mIfw1eEar2het8RWzv6UruUZpXaKieSLOs,1527
70
- nucliadb/common/datamanagers/__init__.py,sha256=U1cg-KvqbfzN5AnL_tFFrERmPb81w_0MNiTmxObmla4,2062
71
- nucliadb/common/datamanagers/atomic.py,sha256=beMWAQUlS2-R8G77G5aNeCcxA0ik_IIYSISg_o2jUEA,3083
70
+ nucliadb/common/datamanagers/__init__.py,sha256=jksw4pXyXb05SG3EN-BPBrhc1u1Ge_m21PYqD7NYQEs,2118
71
+ nucliadb/common/datamanagers/atomic.py,sha256=WihdtBWQIAuElZQjh1xQ--q5dJowwlkovqsW-OB_t2k,3230
72
72
  nucliadb/common/datamanagers/cluster.py,sha256=psTwAWSLj83vhFnC1iJJ6holrolAI4nKos9PuEWspYY,1500
73
73
  nucliadb/common/datamanagers/entities.py,sha256=gI-0mbMlqrr9FiyhexEh6czhgYcMxE2s9m4o866EK9o,5340
74
74
  nucliadb/common/datamanagers/exceptions.py,sha256=Atz_PP_GGq4jgJaWcAkcRbHBoBaGcC9yJvFteylKtTE,883
@@ -78,6 +78,7 @@ nucliadb/common/datamanagers/labels.py,sha256=Zm0GQpSPoGXEEysUY7VsDIcyKSIIQsMVph
78
78
  nucliadb/common/datamanagers/processing.py,sha256=ByxdZzdbAfJGqC6__mY-zryjk040TyQfcUq3rxujeoY,1587
79
79
  nucliadb/common/datamanagers/resources.py,sha256=5EJk7P-G4A_YiobiUexz_yuZUTuxS5zqzjMdJN6Sm6k,11297
80
80
  nucliadb/common/datamanagers/rollover.py,sha256=c_DE3jtZusNL_9aOVjHOB9PV5OSVg7GJ5J-Ny0goHBE,7833
81
+ nucliadb/common/datamanagers/search_configurations.py,sha256=O-8eW43CE46GcxO6TB5hpi27NBguv4BL4SI1vLlN8os,2463
81
82
  nucliadb/common/datamanagers/synonyms.py,sha256=zk3GEH38KF5vV_VcuL6DCg-2JwgXJfQl7Io6VPqv2cw,1566
82
83
  nucliadb/common/datamanagers/utils.py,sha256=McHlXvE4P3x-bBY3pr0n8djbTDQvI1G5WusJrnRdhLA,1827
83
84
  nucliadb/common/datamanagers/vectorsets.py,sha256=ciYb5uD435Zo8ZbqgPUAszFW9Svp_-R2hY2FEhQ411Y,4304
@@ -165,7 +166,7 @@ nucliadb/migrator/settings.py,sha256=jOUX0ZMunCXN8HpF9xXN0aunJYRhu4Vdr_ffjRIqwtw
165
166
  nucliadb/migrator/utils.py,sha256=NgUreUvON8_nWEzTxELBMWlfV7E6-6qi-g0DMEbVEz4,2885
166
167
  nucliadb/models/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
167
168
  nucliadb/models/responses.py,sha256=qnuOoc7TrVSUnpikfTwHLKez47_DE4mSFzpxrwtqijA,1599
168
- nucliadb/purge/__init__.py,sha256=p-DxJ3vGtEcCuiSsWY22bQn99vTMHk32BQdQJVy5b0k,11983
169
+ nucliadb/purge/__init__.py,sha256=UXbto56EWYLwZj6uEc-flQVe3gDDNFtM6EV-aIkryPU,12353
169
170
  nucliadb/purge/orphan_shards.py,sha256=AU1Jfc4qtQFasB6dkuGz0a_Zjs-i7liUTf7Xpl8R8ng,7939
170
171
  nucliadb/reader/__init__.py,sha256=C5Efic7WlGm2U2C5WOyquMFbIj2Pojwe_8mwzVYnOzE,1304
171
172
  nucliadb/reader/app.py,sha256=Se-BFTE6d1v1msLzQn4q5XIhjnSxa2ckDSHdvm7NRf8,3096
@@ -182,7 +183,7 @@ nucliadb/reader/api/v1/knowledgebox.py,sha256=Uu-yPB8KKZt1VaFrFNMMaXOvLsclBJDK9d
182
183
  nucliadb/reader/api/v1/learning_config.py,sha256=CZ7pFXzBZkJE2dXbC1wArszJw_ZLpuEb6gnsz2MKEz0,5525
183
184
  nucliadb/reader/api/v1/resource.py,sha256=SFIv_vpgkdJQv7L_UgYZS5FvubipJ0ligpExGDjKHV0,14064
184
185
  nucliadb/reader/api/v1/router.py,sha256=eyNmEGSP9zHkCIG5XlAXl6sukq950B7gFT3X2peMtIE,1011
185
- nucliadb/reader/api/v1/services.py,sha256=hGD7VHOsLYeaA8kwX92iC-BkbGbh4d_v5W4434ezjuY,11916
186
+ nucliadb/reader/api/v1/services.py,sha256=bL3s-qNLWS2uOC6KNgT6b3V_GGP4Pw7ZaOYI-x_qs18,13431
186
187
  nucliadb/reader/api/v1/vectorsets.py,sha256=insTwaykshz442cMKa2VP74wJwvZrIYi0U7M9EM3aCM,1822
187
188
  nucliadb/reader/reader/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
188
189
  nucliadb/reader/reader/notifications.py,sha256=HVZNUlfbSuoZ9BsSs8wmzPeYurl0U0O2ooVlR9KSM3U,7792
@@ -198,10 +199,10 @@ nucliadb/search/settings.py,sha256=vem3EcyYlTPSim0kEK-xe-erF4BZg0CT_LAb8ZRQAE8,1
198
199
  nucliadb/search/utilities.py,sha256=9SsRDw0rJVXVoLBfF7rBb6q080h-thZc7u8uRcTiBeY,1037
199
200
  nucliadb/search/api/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
200
201
  nucliadb/search/api/v1/__init__.py,sha256=DH16OYnw9jQ38OpKlmdXeoq2j40ZPXZRtGvClKOkMhw,1239
201
- nucliadb/search/api/v1/ask.py,sha256=F2dR3-swb3Xz8MfZPYL3G65KY2R_mgef4YVBbu8kLi4,4352
202
+ nucliadb/search/api/v1/ask.py,sha256=SFNjvhY3xAVniMChitILdtzwn7HmgV_k_ecn71egca0,5117
202
203
  nucliadb/search/api/v1/catalog.py,sha256=Nw4wIj4AjGp-p64FFVQFN4v2LFcV3A0UJIxfo3_XGmY,7670
203
204
  nucliadb/search/api/v1/feedback.py,sha256=kNLc4dHz2SXHzV0PwC1WiRAwY88fDptPcP-kO0q-FrQ,2620
204
- nucliadb/search/api/v1/find.py,sha256=z1mahccu5oZuyuibTD8wPoF8ySPAA58GkRiCZjRHK-s,9589
205
+ nucliadb/search/api/v1/find.py,sha256=OOeqCVE88o4t1XzWgcknTWR0e3WcwzLDcnUhCeA1Pcc,10495
205
206
  nucliadb/search/api/v1/graph.py,sha256=5APs0-W-jNQfH-mRLrdRkk6B_mnsJxLb68t0NE_KZUk,4238
206
207
  nucliadb/search/api/v1/knowledgebox.py,sha256=rWhx3PYWryingu19qwwFDbVvVYynq5Ky23FSlzmTutQ,8721
207
208
  nucliadb/search/api/v1/predict_proxy.py,sha256=QrGzo0hKjtmyGZ6pjlJHYAh4hxwVUIOTcVcerRCw7eE,3047
@@ -332,7 +333,7 @@ nucliadb/writer/api/v1/knowledgebox.py,sha256=MLeIuym4jPrJgfy1NTcN9CpUGwuBiqDHMc
332
333
  nucliadb/writer/api/v1/learning_config.py,sha256=CKBjqcbewkfPwGUPLDWzZSpro6XkmCaVppe5Qtpu5Go,3117
333
334
  nucliadb/writer/api/v1/resource.py,sha256=A8fAHlN5XFsg6XFYKhfWJS8czgNH6yXr-PsnUqz2WUE,18757
334
335
  nucliadb/writer/api/v1/router.py,sha256=RjuoWLpZer6Kl2BW_wznpNo6XL3BOpdTGqXZCn3QrrQ,1034
335
- nucliadb/writer/api/v1/services.py,sha256=THnBnRxiHrEZPpBTL-E-vplEUfcD-fZpuslKRonM6xs,10286
336
+ nucliadb/writer/api/v1/services.py,sha256=HLQW18AEC5zQp5azpeAtRi7ZTzQSwG6SbmkHlmjTIFA,13165
336
337
  nucliadb/writer/api/v1/slug.py,sha256=xlVBDBpRi9bNulpBHZwhyftVvulfE0zFm1XZIWl-AKY,2389
337
338
  nucliadb/writer/api/v1/transaction.py,sha256=d2Vbgnkk_-FLGSTt3vfldwiJIUf0XoyD0wP1jQNz_DY,2430
338
339
  nucliadb/writer/api/v1/upload.py,sha256=VOeqNTrZx1_z8iaKjM7p8fVlVcIYMtnQNK1dm72ct6k,33161
@@ -351,8 +352,8 @@ nucliadb/writer/tus/local.py,sha256=7jYa_w9b-N90jWgN2sQKkNcomqn6JMVBOVeDOVYJHto,
351
352
  nucliadb/writer/tus/s3.py,sha256=vF0NkFTXiXhXq3bCVXXVV-ED38ECVoUeeYViP8uMqcU,8357
352
353
  nucliadb/writer/tus/storage.py,sha256=ToqwjoYnjI4oIcwzkhha_MPxi-k4Jk3Lt55zRwaC1SM,2903
353
354
  nucliadb/writer/tus/utils.py,sha256=MSdVbRsRSZVdkaum69_0wku7X3p5wlZf4nr6E0GMKbw,2556
354
- nucliadb-6.3.3.post3621.dist-info/METADATA,sha256=SQabE3xZSXmHoDasDSvXFiDaUJqMkmdkjf5dj6_jWic,4291
355
- nucliadb-6.3.3.post3621.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
356
- nucliadb-6.3.3.post3621.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
357
- nucliadb-6.3.3.post3621.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
358
- nucliadb-6.3.3.post3621.dist-info/RECORD,,
355
+ nucliadb-6.3.3.post3627.dist-info/METADATA,sha256=8OItSgGLAoh1Jkmsg-9YmOfbrL2ckn1FdWh2gZZdZ4A,4291
356
+ nucliadb-6.3.3.post3627.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
357
+ nucliadb-6.3.3.post3627.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
358
+ nucliadb-6.3.3.post3627.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
359
+ nucliadb-6.3.3.post3627.dist-info/RECORD,,