nucliadb 6.3.3.post3626__py3-none-any.whl → 6.3.3.post3628__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)
@@ -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():
@@ -29,6 +29,7 @@ def parse_graph_search(item: graph_requests.GraphSearchRequest) -> GraphRetrieva
29
29
  pb = nodereader_pb2.GraphSearchRequest()
30
30
  pb.query.path.CopyFrom(_parse_path_query(item.query))
31
31
  pb.top_k = item.top_k
32
+ pb.kind = nodereader_pb2.GraphSearchRequest.QueryKind.PATH
32
33
  return pb
33
34
 
34
35
 
@@ -36,6 +37,7 @@ def parse_graph_node_search(item: graph_requests.GraphNodesSearchRequest) -> Gra
36
37
  pb = nodereader_pb2.GraphSearchRequest()
37
38
  pb.query.path.CopyFrom(_parse_node_query(item.query))
38
39
  pb.top_k = item.top_k
40
+ pb.kind = nodereader_pb2.GraphSearchRequest.QueryKind.NODES
39
41
  return pb
40
42
 
41
43
 
@@ -43,6 +45,7 @@ def parse_graph_relation_search(item: graph_requests.GraphRelationsSearchRequest
43
45
  pb = nodereader_pb2.GraphSearchRequest()
44
46
  pb.query.path.CopyFrom(_parse_relation_query(item.query))
45
47
  pb.top_k = item.top_k
48
+ pb.kind = nodereader_pb2.GraphSearchRequest.QueryKind.RELATIONS
46
49
  return pb
47
50
 
48
51
 
@@ -110,12 +113,6 @@ def _parse_node_query(expr: graph_requests.GraphNodesQuery) -> nodereader_pb2.Gr
110
113
  elif isinstance(expr, graph_requests.Not):
111
114
  pb.bool_not.CopyFrom(_parse_node_query(expr.operand))
112
115
 
113
- elif isinstance(expr, graph_requests.SourceNode):
114
- _set_node_to_pb(expr, pb.path.source)
115
-
116
- elif isinstance(expr, graph_requests.DestinationNode):
117
- _set_node_to_pb(expr, pb.path.destination)
118
-
119
116
  elif isinstance(expr, graph_requests.AnyNode):
120
117
  _set_node_to_pb(expr, pb.path.source)
121
118
  pb.path.undirected = True
@@ -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.post3626
3
+ Version: 6.3.3.post3628
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.post3626
24
- Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.3.3.post3626
25
- Requires-Dist: nucliadb-protos>=6.3.3.post3626
26
- Requires-Dist: nucliadb-models>=6.3.3.post3626
27
- Requires-Dist: nidx-protos>=6.3.3.post3626
23
+ Requires-Dist: nucliadb-telemetry[all]>=6.3.3.post3628
24
+ Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.3.3.post3628
25
+ Requires-Dist: nucliadb-protos>=6.3.3.post3628
26
+ Requires-Dist: nucliadb-models>=6.3.3.post3628
27
+ Requires-Dist: nidx-protos>=6.3.3.post3628
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
@@ -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
@@ -255,7 +256,7 @@ nucliadb/search/search/query_parser/old_filters.py,sha256=-zbfN-RsXoj_DRjh3Lfp-w
255
256
  nucliadb/search/search/query_parser/parsers/__init__.py,sha256=ySCNSdbesLXGZyR88919njulA6UE10_3PhqMG_Yj1o4,1034
256
257
  nucliadb/search/search/query_parser/parsers/catalog.py,sha256=XdBiTweGTQkj8m_V_i2xbwp7P5pPO8K1Tud692XKhMw,7149
257
258
  nucliadb/search/search/query_parser/parsers/find.py,sha256=q3wH_i0DGceeKckYEH3c5MqM5EvRiMCL7r-6nCAId9Q,4666
258
- nucliadb/search/search/query_parser/parsers/graph.py,sha256=4cR-Y_ZUX-QNYhL6DV2tanmBlSb0ducf4J3hb9VXLh8,6261
259
+ nucliadb/search/search/query_parser/parsers/graph.py,sha256=stD17_cXhLagJgNZu4Vqk0YJTU15BVSANHrB4sX2qCQ,6244
259
260
  nucliadb/standalone/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
260
261
  nucliadb/standalone/api_router.py,sha256=hgq9FXpihzgjHkwcVGfGCSwyXy67fqXTfLFHuINzIi0,5567
261
262
  nucliadb/standalone/app.py,sha256=mAApNK_iVsQgJyd-mtwCeZq5csSimwnXmlQGH9a70pE,5586
@@ -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.post3626.dist-info/METADATA,sha256=IoTcS-I-HSFWU6Be7gUPbWE3I60TUvgAfOP3jRQ-LUs,4291
355
- nucliadb-6.3.3.post3626.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
356
- nucliadb-6.3.3.post3626.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
357
- nucliadb-6.3.3.post3626.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
358
- nucliadb-6.3.3.post3626.dist-info/RECORD,,
355
+ nucliadb-6.3.3.post3628.dist-info/METADATA,sha256=QfPZhPdO_j-wFfhn94ixkXxeI61hltnRWHwhQUpf5tc,4291
356
+ nucliadb-6.3.3.post3628.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
357
+ nucliadb-6.3.3.post3628.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
358
+ nucliadb-6.3.3.post3628.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
359
+ nucliadb-6.3.3.post3628.dist-info/RECORD,,