nuclia 4.9.1__py3-none-any.whl → 4.9.3__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.
nuclia/lib/kb.py CHANGED
@@ -23,6 +23,7 @@ from nuclia_models.events.activity_logs import ( # type: ignore
23
23
  )
24
24
  from nuclia_models.events.remi import RemiQuery
25
25
  from nuclia_models.worker.tasks import TaskStartKB
26
+ from nuclia_models.config.proto import ExtractConfig
26
27
  from nuclia.exceptions import RateLimitError
27
28
  from nuclia.lib.utils import handle_http_sync_errors, handle_http_async_errors
28
29
  from datetime import datetime
@@ -58,6 +59,8 @@ STOP_TASK = "/task/{task_id}/stop"
58
59
  DELETE_TASK = "/task/{task_id}"
59
60
  GET_TASK = "/task/{task_id}/inspect"
60
61
  RESTART_TASK = "/task/{task_id}/restart"
62
+ EXTRACT_STRATEGIES = "/extract_strategies"
63
+ DELETE_EXTRACT_STRATEGY = "/extract_strategies/strategy/{id}"
61
64
 
62
65
  DOWNLOAD_FORMAT_HEADERS = {
63
66
  DownloadFormat.CSV: "text/csv",
@@ -487,6 +490,37 @@ class NucliaDBClient(BaseNucliaDBClient):
487
490
  handle_http_sync_errors(response)
488
491
  return response
489
492
 
493
+ def list_extract_strategies(self) -> httpx.Response:
494
+ if self.reader_session is None:
495
+ raise Exception("KB not configured")
496
+
497
+ response: httpx.Response = self.reader_session.get(
498
+ f"{self.url}{EXTRACT_STRATEGIES}"
499
+ )
500
+ handle_http_sync_errors(response)
501
+ return response
502
+
503
+ def add_extract_strategy(self, config: ExtractConfig) -> httpx.Response:
504
+ if self.writer_session is None:
505
+ raise Exception("KB not configured")
506
+
507
+ response: httpx.Response = self.writer_session.post(
508
+ f"{self.url}{EXTRACT_STRATEGIES}",
509
+ json=config.model_dump(mode="json", exclude_unset=True),
510
+ )
511
+ handle_http_sync_errors(response)
512
+ return response
513
+
514
+ def delete_extract_strategy(self, strategy_id: str) -> httpx.Response:
515
+ if self.writer_session is None:
516
+ raise Exception("KB not configured")
517
+
518
+ response: httpx.Response = self.writer_session.delete(
519
+ f"{self.url}{DELETE_EXTRACT_STRATEGY.format(id=strategy_id)}",
520
+ )
521
+ handle_http_sync_errors(response)
522
+ return response
523
+
490
524
 
491
525
  class AsyncNucliaDBClient(BaseNucliaDBClient):
492
526
  reader_session: Optional[httpx.AsyncClient] = None
@@ -813,3 +847,34 @@ class AsyncNucliaDBClient(BaseNucliaDBClient):
813
847
  )
814
848
  await handle_http_async_errors(response)
815
849
  return response
850
+
851
+ async def list_extract_strategies(self) -> httpx.Response:
852
+ if self.reader_session is None:
853
+ raise Exception("KB not configured")
854
+
855
+ response: httpx.Response = await self.reader_session.get(
856
+ f"{self.url}{EXTRACT_STRATEGIES}"
857
+ )
858
+ await handle_http_async_errors(response)
859
+ return response
860
+
861
+ async def add_extract_strategy(self, config: ExtractConfig) -> httpx.Response:
862
+ if self.writer_session is None:
863
+ raise Exception("KB not configured")
864
+
865
+ response: httpx.Response = await self.writer_session.post(
866
+ f"{self.url}{EXTRACT_STRATEGIES}",
867
+ json=config.model_dump(mode="json", exclude_unset=True),
868
+ )
869
+ await handle_http_async_errors(response)
870
+ return response
871
+
872
+ async def delete_extract_strategy(self, strategy_id: str) -> httpx.Response:
873
+ if self.writer_session is None:
874
+ raise Exception("KB not configured")
875
+
876
+ response: httpx.Response = await self.writer_session.delete(
877
+ f"{self.url}{DELETE_EXTRACT_STRATEGY.format(id=strategy_id)}",
878
+ )
879
+ await handle_http_async_errors(response)
880
+ return response
nuclia/lib/nua.py CHANGED
@@ -42,6 +42,8 @@ from nuclia.lib.nua_responses import (
42
42
  PushResponseV2,
43
43
  QueryInfo,
44
44
  RephraseModel,
45
+ RerankModel,
46
+ RerankResponse,
45
47
  RestrictedIDString,
46
48
  Sentence,
47
49
  Source,
@@ -77,6 +79,7 @@ PUSH_PROCESS = "/api/v2/processing/push"
77
79
  SCHEMA = "/api/v1/learning/configuration/schema"
78
80
  SCHEMA_KBID = "/api/v1/schema"
79
81
  CONFIG = "/api/v1/config"
82
+ RERANK = "/api/v1/predict/rerank"
80
83
 
81
84
  ConvertType = TypeVar("ConvertType", bound=BaseModel)
82
85
 
@@ -410,6 +413,12 @@ class NuaClient:
410
413
  activity_endpoint = f"{self.url}{STATUS_PROCESS}/{process_id}"
411
414
  return self._request("GET", activity_endpoint, ProcessRequestStatus)
412
415
 
416
+ def rerank(self, model: RerankModel) -> RerankResponse:
417
+ endpoint = f"{self.url}{RERANK}"
418
+ return self._request(
419
+ "POST", endpoint, payload=model.model_dump(), output=RerankResponse
420
+ )
421
+
413
422
 
414
423
  class AsyncNuaClient:
415
424
  def __init__(
@@ -792,3 +801,9 @@ class AsyncNuaClient:
792
801
  return await self._request(
793
802
  "GET", activity_endpoint, output=ProcessRequestStatus
794
803
  )
804
+
805
+ async def rerank(self, model: RerankModel) -> RerankResponse:
806
+ endpoint = f"{self.url}{RERANK}"
807
+ return await self._request(
808
+ "POST", endpoint, payload=model.model_dump(), output=RerankResponse
809
+ )
@@ -557,3 +557,15 @@ class QueryInfo(BaseModel):
557
557
  max_context: int
558
558
  entities: Optional[TokenSearch]
559
559
  sentence: Optional[SentenceSearch]
560
+
561
+
562
+ class RerankModel(BaseModel):
563
+ question: str
564
+ user_id: str
565
+ context: dict[str, str] = {}
566
+
567
+
568
+ class RerankResponse(BaseModel):
569
+ context_scores: dict[str, float] = Field(
570
+ description="Scores for each context given by the reranker"
571
+ )
@@ -0,0 +1,98 @@
1
+ from nuclia.data import get_auth, get_async_auth
2
+ from nuclia.decorators import kb, pretty
3
+ from nuclia.lib.kb import NucliaDBClient, AsyncNucliaDBClient
4
+ from nuclia.sdk.auth import NucliaAuth, AsyncNucliaAuth
5
+ from nuclia_models.config.proto import ExtractConfig
6
+ from typing import Dict
7
+
8
+
9
+ class NucliaExtractStrategy:
10
+ @property
11
+ def _auth(self) -> NucliaAuth:
12
+ auth = get_auth()
13
+ return auth
14
+
15
+ @kb
16
+ @pretty
17
+ def list(self, *args, **kwargs) -> Dict[str, ExtractConfig]:
18
+ """
19
+ List extract strategies
20
+ """
21
+ ndb: NucliaDBClient = kwargs["ndb"]
22
+ response = ndb.list_extract_strategies()
23
+ return response.json()
24
+
25
+ @kb
26
+ def add(
27
+ self,
28
+ *args,
29
+ config: ExtractConfig,
30
+ **kwargs,
31
+ ) -> str:
32
+ """
33
+ Add extract strategy
34
+
35
+ :param config: strategy configuration
36
+ """
37
+ if isinstance(config, dict):
38
+ config = ExtractConfig.model_validate(config)
39
+
40
+ ndb: NucliaDBClient = kwargs["ndb"]
41
+ response = ndb.add_extract_strategy(config=config)
42
+ return response.json()
43
+
44
+ @kb
45
+ def delete(self, *args, id: str, **kwargs):
46
+ """
47
+ Delete extract strategy
48
+
49
+ :param id: ID of the strategy to delete
50
+ """
51
+ ndb: NucliaDBClient = kwargs["ndb"]
52
+ ndb.delete_extract_strategy(strategy_id=id)
53
+
54
+
55
+ class AsyncNucliaExtractStrategy:
56
+ @property
57
+ def _auth(self) -> AsyncNucliaAuth:
58
+ auth = get_async_auth()
59
+ return auth
60
+
61
+ @kb
62
+ @pretty
63
+ async def list(self, *args, **kwargs) -> Dict[str, ExtractConfig]:
64
+ """
65
+ List extract strategies
66
+ """
67
+ ndb: AsyncNucliaDBClient = kwargs["ndb"]
68
+ response = await ndb.list_extract_strategies()
69
+ return response.json()
70
+
71
+ @kb
72
+ async def add(
73
+ self,
74
+ *args,
75
+ config: ExtractConfig,
76
+ **kwargs,
77
+ ) -> str:
78
+ """
79
+ Add extract strategy
80
+
81
+ :param config: strategy configuration
82
+ """
83
+ if isinstance(config, dict):
84
+ config = ExtractConfig.model_validate(config)
85
+
86
+ ndb: AsyncNucliaDBClient = kwargs["ndb"]
87
+ response = await ndb.add_extract_strategy(config=config)
88
+ return response.json()
89
+
90
+ @kb
91
+ async def delete(self, *args, id: str, **kwargs):
92
+ """
93
+ Delete extract strategy
94
+
95
+ :param id: ID of the strategy to delete
96
+ """
97
+ ndb: AsyncNucliaDBClient = kwargs["ndb"]
98
+ await ndb.delete_extract_strategy(strategy_id=id)
nuclia/sdk/kb.py CHANGED
@@ -30,6 +30,10 @@ from nuclia.sdk.remi import NucliaRemi, AsyncNucliaRemi
30
30
  from nuclia.sdk.resource import AsyncNucliaResource, NucliaResource
31
31
  from nuclia.sdk.search import AsyncNucliaSearch, NucliaSearch
32
32
  from nuclia.sdk.task import NucliaTask, AsyncNucliaTask
33
+ from nuclia.sdk.extract_strategy import (
34
+ NucliaExtractStrategy,
35
+ AsyncNucliaExtractStrategy,
36
+ )
33
37
  from nuclia.sdk.upload import AsyncNucliaUpload, NucliaUpload
34
38
 
35
39
 
@@ -48,6 +52,7 @@ class NucliaKB:
48
52
  self.logs = NucliaLogs()
49
53
  self.task = NucliaTask()
50
54
  self.remi = NucliaRemi()
55
+ self.extract_strategies = NucliaExtractStrategy()
51
56
 
52
57
  @kb
53
58
  def list(
@@ -459,6 +464,7 @@ class AsyncNucliaKB:
459
464
  self.logs = AsyncNucliaLogs()
460
465
  self.task = AsyncNucliaTask()
461
466
  self.remi = AsyncNucliaRemi()
467
+ self.extract_strategies = AsyncNucliaExtractStrategy()
462
468
 
463
469
  @kb
464
470
  async def list(self, **kwargs) -> ResourceList:
nuclia/sdk/predict.py CHANGED
@@ -13,6 +13,8 @@ from nuclia.lib.nua_responses import (
13
13
  ConfigSchema,
14
14
  LearningConfigurationCreation,
15
15
  QueryInfo,
16
+ RerankModel,
17
+ RerankResponse,
16
18
  Sentence,
17
19
  StoredLearningConfiguration,
18
20
  SummarizedModel,
@@ -162,6 +164,17 @@ class NucliaPredict:
162
164
  nc: NuaClient = kwargs["nc"]
163
165
  return nc.remi(request)
164
166
 
167
+ @nua
168
+ def rerank(self, request: RerankModel, **kwargs) -> RerankResponse:
169
+ """
170
+ Perform a reranking of the results based on the question and context provided.
171
+
172
+ :param request: RerankModel
173
+ :return: RerankResponse
174
+ """
175
+ nc: NuaClient = kwargs["nc"]
176
+ return nc.rerank(request)
177
+
165
178
 
166
179
  class AsyncNucliaPredict:
167
180
  @property
@@ -299,3 +312,14 @@ class AsyncNucliaPredict:
299
312
 
300
313
  nc: AsyncNuaClient = kwargs["nc"]
301
314
  return await nc.remi(request)
315
+
316
+ @nua
317
+ async def rerank(self, request: RerankModel, **kwargs) -> RerankResponse:
318
+ """
319
+ Perform a reranking of the results based on the question and context provided.
320
+
321
+ :param request: RerankModel
322
+ :return: RerankResponse
323
+ """
324
+ nc: AsyncNuaClient = kwargs["nc"]
325
+ return await nc.rerank(request)
@@ -0,0 +1,16 @@
1
+ from nuclia.sdk.kb import NucliaKB
2
+
3
+
4
+ def test_extract_strategies(testing_config):
5
+ nkb = NucliaKB()
6
+ # preventive clean up
7
+ for id in nkb.extract_strategies.list().keys():
8
+ nkb.extract_strategies.delete(id=id)
9
+
10
+ # tests
11
+ nkb.extract_strategies.add(config={"name": "strategy1", "vllm_config": {}})
12
+ all = nkb.extract_strategies.list()
13
+ assert len(all.keys()) == 1
14
+ nkb.extract_strategies.delete(id=list(all.keys())[0])
15
+ all = nkb.extract_strategies.list()
16
+ assert len(all.keys()) == 0
@@ -1,6 +1,6 @@
1
1
  from nuclia_models.predict.generative_responses import TextGenerativeResponse
2
2
 
3
- from nuclia.lib.nua_responses import ChatModel, UserPrompt
3
+ from nuclia.lib.nua_responses import ChatModel, RerankModel, UserPrompt
4
4
  from nuclia.sdk.predict import AsyncNucliaPredict, NucliaPredict
5
5
  import pytest
6
6
  from nuclia_models.predict.remi import RemiRequest
@@ -170,3 +170,18 @@ async def test_nua_async_remi(testing_config):
170
170
 
171
171
  assert results.context_relevance[1] < 2
172
172
  assert results.groundedness[1] < 2
173
+
174
+
175
+ def test_nua_rerank(testing_config):
176
+ np = NucliaPredict()
177
+ results = np.rerank(
178
+ RerankModel(
179
+ user_id="Nuclia PY CLI",
180
+ question="What is the capital of France?",
181
+ context={
182
+ "1": "Paris is the capital of France.",
183
+ "2": "Berlin is the capital of Germany.",
184
+ },
185
+ )
186
+ )
187
+ assert results.context_scores["1"] > results.context_scores["2"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nuclia
3
- Version: 4.9.1
3
+ Version: 4.9.3
4
4
  Summary: Nuclia Python SDK
5
5
  Author-email: Nuclia <info@nuclia.com>
6
6
  License-Expression: MIT
@@ -9,11 +9,11 @@ nuclia/cli/run.py,sha256=B1hP0upSbSCqqT89WAwsd93ZxkAoF6ajVyLOdYmo8fU,1560
9
9
  nuclia/cli/utils.py,sha256=iZ3P8juBdAGvaRUd2BGz7bpUXNDHdPrC5p876yyZ2Cs,1223
10
10
  nuclia/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  nuclia/lib/conversations.py,sha256=M6qhL9NPEKroYF767S-Q2XWokRrjX02kpYTzRvZKwUE,149
12
- nuclia/lib/kb.py,sha256=jV-L8-a5oFVHIbFfeGO17hXf2IQk9UuW-9fq5D3LO6Y,28508
12
+ nuclia/lib/kb.py,sha256=vSLfmV6HqPvWJwPVw4iIzkDnm0M96_ImTH3QMZdkd_I,30985
13
13
  nuclia/lib/models.py,sha256=ekEQrVIFU3aFvt60yQh-zpWkGNORBMSc7c5Hd_VzPzI,1564
14
- nuclia/lib/nua.py,sha256=sUVFdCjvLigTqUUhILywdHpiC0qKCtKPABn5kUXfuxQ,27064
14
+ nuclia/lib/nua.py,sha256=jVUV8I50iJpUQD6yn4V7wNDDSDP8oEWrRxnmrs33hnI,27591
15
15
  nuclia/lib/nua_chat.py,sha256=ApL1Y1FWvAVUt-Y9a_8TUSJIhg8-UmBSy8TlDPn6tD8,3874
16
- nuclia/lib/nua_responses.py,sha256=RJB7bbgZEpYr29aOmaT2nb1X0g6wds4MOngq7N-ZcTg,13382
16
+ nuclia/lib/nua_responses.py,sha256=FyCedSKHVGn4w380obV9B3D1JaqVyNTqda4-OCs4A9A,13637
17
17
  nuclia/lib/utils.py,sha256=9l6DxBk-11WqUhXRn99cqeuVTUOJXj-1S6zckal7wOk,6312
18
18
  nuclia/sdk/__init__.py,sha256=-nAw8i53XBdmbfTa1FJZ0FNRMNakimDVpD6W4OdES-c,1374
19
19
  nuclia/sdk/accounts.py,sha256=7XQ3K9_jlSuk2Cez868FtazZ05xSGab6h3Mt1qMMwIE,647
@@ -21,13 +21,14 @@ nuclia/sdk/agent.py,sha256=ot_oA4yi7TkXahPnhcRIxztq9Dtskc85-A57WN1BNGg,1961
21
21
  nuclia/sdk/auth.py,sha256=o9CiWt3P_UHQW_L5Jq_9IOB-KpSCXFsVTouQcZp8BJM,25072
22
22
  nuclia/sdk/backup.py,sha256=adbPcNEbHGZW698o028toXKfDkDrmk5QRIDSiN6SPys,6529
23
23
  nuclia/sdk/export_import.py,sha256=y5cTOxhILwRPIvR2Ya12bk-ReGbeDzA3C9TPxgnOHD4,9756
24
- nuclia/sdk/kb.py,sha256=iDJimbzw_R9VeUu7a4F5wXoLdLxCim7W3UeEaAQ5dGI,26820
24
+ nuclia/sdk/extract_strategy.py,sha256=NZBLLThdLyQYw8z1mT9iRhFjkE5sQP86-3QhsTiyV9o,2540
25
+ nuclia/sdk/kb.py,sha256=2-H9FOvPgsG-ZYNUA8D4FYAJhX3K8m2VwbwSQy1JV7c,27044
25
26
  nuclia/sdk/kbs.py,sha256=nXEvg5ddZYdDS8Kie7TrN-s1meU9ecYLf9FlT5xr-ro,9131
26
27
  nuclia/sdk/logger.py,sha256=UHB81eS6IGmLrsofKxLh8cmF2AsaTj_HXP0tGqMr_HM,57
27
28
  nuclia/sdk/logs.py,sha256=3jfORpo8fzZiXFFSbGY0o3Bre1ZgJaKQCXgxP1keNHw,9614
28
29
  nuclia/sdk/nua.py,sha256=6t0m0Sx-UhqNU2Hx9v6vTwy0m3a30K4T0KmP9G43MzY,293
29
30
  nuclia/sdk/nucliadb.py,sha256=bOESIppPgY7IrNqrYY7T3ESoxwttbOSTm5zj1xUS1jI,1288
30
- nuclia/sdk/predict.py,sha256=KF7iT2aasaB9DIEAwqktXbOl2H_Y_ne-6-SEErN7YOk,9095
31
+ nuclia/sdk/predict.py,sha256=Gom-BlISXawThNq-f7fb1te5tY4catlIdmO-pMJyqkk,9815
31
32
  nuclia/sdk/process.py,sha256=WuNnqaWprp-EABWDC_z7O2woesGIlYWnDUKozh7Ibr4,2241
32
33
  nuclia/sdk/remi.py,sha256=BEb3O9R2jOFlOda4vjFucKKGO1c2eTkqYZdFlIy3Zmo,4357
33
34
  nuclia/sdk/resource.py,sha256=0lSvD4e1FpN5iM9W295dOKLJ8hsXfIe8HKdo0HsVg20,13976
@@ -42,6 +43,7 @@ nuclia/tests/assets/conversation.json,sha256=jLmVngHEW8QdAzSMa-MYgbJgYxOO8tHq6Ia
42
43
  nuclia/tests/test_kb/test_backup.py,sha256=67fAw1C_NB363G-wuI9LnSH6nG_YrYs-uBcFyBx6Peg,2932
43
44
  nuclia/tests/test_kb/test_conversation.py,sha256=plsWY_gEhK3P4CsIO9jkBmimZk3UDGeMYPu7YVFeuIQ,727
44
45
  nuclia/tests/test_kb/test_export_import.py,sha256=lQEww2jFNHZYcudFJqcHhoWAPrmtvvnPvcFqrijxLbo,1019
46
+ nuclia/tests/test_kb/test_extract_strategies.py,sha256=aKNzE98H1sE4eFqh8XiwvzDT8-7SnMs0v3NTeubZ-XY,521
45
47
  nuclia/tests/test_kb/test_graph.py,sha256=ecAB-lWqm3_796HUuF-fSpGzlhsXV9NGZnAjvxXANps,2540
46
48
  nuclia/tests/test_kb/test_labels.py,sha256=IUdTq4mzv0OrOkwBWWy4UwKGKyJybtoHrgvXr676vyY,961
47
49
  nuclia/tests/test_kb/test_logs.py,sha256=Z9ELtiiU9NniITJzeWt92GCcERKYy9Nwc_fUVPboRU0,3121
@@ -55,15 +57,15 @@ nuclia/tests/test_manage/test_auth.py,sha256=I5ho9rKhrzCiP57cDVcs2zrXyy1uWlKxzfE
55
57
  nuclia/tests/test_manage/test_kb.py,sha256=gqBMxmIuPUKC6kP2V_IapS9u72QR99V8CDQlJOa8sHU,1959
56
58
  nuclia/tests/test_nua/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
59
  nuclia/tests/test_nua/test_agent.py,sha256=iPA8lVw7CyONS-0fVG7rDzv8T-LnUlNPMNynTnP-2ic,334
58
- nuclia/tests/test_nua/test_predict.py,sha256=SKASYohoZgDGHoVQsS2_jFwXVdMFU6REh5Suw8okIHQ,5347
60
+ nuclia/tests/test_nua/test_predict.py,sha256=8by69GgXuOZKAgksjSjgmbNr98jCXanF1HOo29oNuMg,5798
59
61
  nuclia/tests/test_nucliadb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
62
  nuclia/tests/test_nucliadb/test_crud.py,sha256=GuY76HRvt2DFaNgioKm5n0Aco1HnG7zzV_zKom5N8xc,1173
61
63
  nuclia/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
64
  nuclia/tests/unit/test_export_import.py,sha256=xo_wVbjUnNlVV65ZGH7LtZ38qy39EkJp2hjOuTHC1nU,980
63
65
  nuclia/tests/unit/test_nua_responses.py,sha256=t_hIdVztTi27RWvpfTJUYcCL0lpKdZFegZIwLdaPNh8,319
64
- nuclia-4.9.1.dist-info/licenses/LICENSE,sha256=Ops2LTti_HJtpmWcanuUTdTY3vKDR1myJ0gmGBKC0FA,1063
65
- nuclia-4.9.1.dist-info/METADATA,sha256=bScM2QXDcmlYLGp0pDG1ij02jclIV8u0Rk_CTFwkjvA,2337
66
- nuclia-4.9.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
67
- nuclia-4.9.1.dist-info/entry_points.txt,sha256=iZHOyXPNS54r3eQmdi5So20xO1gudI9K2oP4sQsCJRw,46
68
- nuclia-4.9.1.dist-info/top_level.txt,sha256=cqn_EitXOoXOSUvZnd4q6QGrhm04pg8tLAZtem-Zfdo,7
69
- nuclia-4.9.1.dist-info/RECORD,,
66
+ nuclia-4.9.3.dist-info/licenses/LICENSE,sha256=Ops2LTti_HJtpmWcanuUTdTY3vKDR1myJ0gmGBKC0FA,1063
67
+ nuclia-4.9.3.dist-info/METADATA,sha256=rxQGLEDjPHayY_NPuXkmXpfsp4_BfoBC2ZjLlOjhyoM,2337
68
+ nuclia-4.9.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
69
+ nuclia-4.9.3.dist-info/entry_points.txt,sha256=iZHOyXPNS54r3eQmdi5So20xO1gudI9K2oP4sQsCJRw,46
70
+ nuclia-4.9.3.dist-info/top_level.txt,sha256=cqn_EitXOoXOSUvZnd4q6QGrhm04pg8tLAZtem-Zfdo,7
71
+ nuclia-4.9.3.dist-info/RECORD,,
File without changes