nucliadb 2.46.1.post382__py3-none-any.whl → 6.2.1.post2777__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.
Files changed (431) hide show
  1. migrations/0002_rollover_shards.py +1 -2
  2. migrations/0003_allfields_key.py +2 -37
  3. migrations/0004_rollover_shards.py +1 -2
  4. migrations/0005_rollover_shards.py +1 -2
  5. migrations/0006_rollover_shards.py +2 -4
  6. migrations/0008_cleanup_leftover_rollover_metadata.py +1 -2
  7. migrations/0009_upgrade_relations_and_texts_to_v2.py +5 -4
  8. migrations/0010_fix_corrupt_indexes.py +11 -12
  9. migrations/0011_materialize_labelset_ids.py +2 -18
  10. migrations/0012_rollover_shards.py +6 -12
  11. migrations/0013_rollover_shards.py +2 -4
  12. migrations/0014_rollover_shards.py +5 -7
  13. migrations/0015_targeted_rollover.py +6 -12
  14. migrations/0016_upgrade_to_paragraphs_v2.py +27 -32
  15. migrations/0017_multiple_writable_shards.py +3 -6
  16. migrations/0018_purge_orphan_kbslugs.py +59 -0
  17. migrations/0019_upgrade_to_paragraphs_v3.py +66 -0
  18. migrations/0020_drain_nodes_from_cluster.py +83 -0
  19. nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +17 -18
  20. nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
  21. migrations/0023_backfill_pg_catalog.py +80 -0
  22. migrations/0025_assign_models_to_kbs_v2.py +113 -0
  23. migrations/0026_fix_high_cardinality_content_types.py +61 -0
  24. migrations/0027_rollover_texts3.py +73 -0
  25. nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
  26. migrations/pg/0002_catalog.py +42 -0
  27. nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
  28. nucliadb/common/cluster/base.py +41 -24
  29. nucliadb/common/cluster/discovery/base.py +6 -14
  30. nucliadb/common/cluster/discovery/k8s.py +9 -19
  31. nucliadb/common/cluster/discovery/manual.py +1 -3
  32. nucliadb/common/cluster/discovery/single.py +1 -2
  33. nucliadb/common/cluster/discovery/utils.py +1 -3
  34. nucliadb/common/cluster/grpc_node_dummy.py +11 -16
  35. nucliadb/common/cluster/index_node.py +10 -19
  36. nucliadb/common/cluster/manager.py +223 -102
  37. nucliadb/common/cluster/rebalance.py +42 -37
  38. nucliadb/common/cluster/rollover.py +377 -204
  39. nucliadb/common/cluster/settings.py +16 -9
  40. nucliadb/common/cluster/standalone/grpc_node_binding.py +24 -76
  41. nucliadb/common/cluster/standalone/index_node.py +4 -11
  42. nucliadb/common/cluster/standalone/service.py +2 -6
  43. nucliadb/common/cluster/standalone/utils.py +9 -6
  44. nucliadb/common/cluster/utils.py +43 -29
  45. nucliadb/common/constants.py +20 -0
  46. nucliadb/common/context/__init__.py +6 -4
  47. nucliadb/common/context/fastapi.py +8 -5
  48. nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
  49. nucliadb/common/datamanagers/__init__.py +24 -5
  50. nucliadb/common/datamanagers/atomic.py +102 -0
  51. nucliadb/common/datamanagers/cluster.py +5 -5
  52. nucliadb/common/datamanagers/entities.py +6 -16
  53. nucliadb/common/datamanagers/fields.py +84 -0
  54. nucliadb/common/datamanagers/kb.py +101 -24
  55. nucliadb/common/datamanagers/labels.py +26 -56
  56. nucliadb/common/datamanagers/processing.py +2 -6
  57. nucliadb/common/datamanagers/resources.py +214 -117
  58. nucliadb/common/datamanagers/rollover.py +77 -16
  59. nucliadb/{ingest/orm → common/datamanagers}/synonyms.py +16 -28
  60. nucliadb/common/datamanagers/utils.py +19 -11
  61. nucliadb/common/datamanagers/vectorsets.py +110 -0
  62. nucliadb/common/external_index_providers/base.py +257 -0
  63. nucliadb/{ingest/tests/unit/test_cache.py → common/external_index_providers/exceptions.py} +9 -8
  64. nucliadb/common/external_index_providers/manager.py +101 -0
  65. nucliadb/common/external_index_providers/pinecone.py +933 -0
  66. nucliadb/common/external_index_providers/settings.py +52 -0
  67. nucliadb/common/http_clients/auth.py +3 -6
  68. nucliadb/common/http_clients/processing.py +6 -11
  69. nucliadb/common/http_clients/utils.py +1 -3
  70. nucliadb/common/ids.py +240 -0
  71. nucliadb/common/locking.py +43 -13
  72. nucliadb/common/maindb/driver.py +11 -35
  73. nucliadb/common/maindb/exceptions.py +6 -6
  74. nucliadb/common/maindb/local.py +22 -9
  75. nucliadb/common/maindb/pg.py +206 -111
  76. nucliadb/common/maindb/utils.py +13 -44
  77. nucliadb/common/models_utils/from_proto.py +479 -0
  78. nucliadb/common/models_utils/to_proto.py +60 -0
  79. nucliadb/common/nidx.py +260 -0
  80. nucliadb/export_import/datamanager.py +25 -19
  81. nucliadb/export_import/exceptions.py +8 -0
  82. nucliadb/export_import/exporter.py +20 -7
  83. nucliadb/export_import/importer.py +6 -11
  84. nucliadb/export_import/models.py +5 -5
  85. nucliadb/export_import/tasks.py +4 -4
  86. nucliadb/export_import/utils.py +94 -54
  87. nucliadb/health.py +1 -3
  88. nucliadb/ingest/app.py +15 -11
  89. nucliadb/ingest/consumer/auditing.py +30 -147
  90. nucliadb/ingest/consumer/consumer.py +96 -52
  91. nucliadb/ingest/consumer/materializer.py +10 -12
  92. nucliadb/ingest/consumer/pull.py +12 -27
  93. nucliadb/ingest/consumer/service.py +20 -19
  94. nucliadb/ingest/consumer/shard_creator.py +7 -14
  95. nucliadb/ingest/consumer/utils.py +1 -3
  96. nucliadb/ingest/fields/base.py +139 -188
  97. nucliadb/ingest/fields/conversation.py +18 -5
  98. nucliadb/ingest/fields/exceptions.py +1 -4
  99. nucliadb/ingest/fields/file.py +7 -25
  100. nucliadb/ingest/fields/link.py +11 -16
  101. nucliadb/ingest/fields/text.py +9 -4
  102. nucliadb/ingest/orm/brain.py +255 -262
  103. nucliadb/ingest/orm/broker_message.py +181 -0
  104. nucliadb/ingest/orm/entities.py +36 -51
  105. nucliadb/ingest/orm/exceptions.py +12 -0
  106. nucliadb/ingest/orm/knowledgebox.py +334 -278
  107. nucliadb/ingest/orm/processor/__init__.py +2 -697
  108. nucliadb/ingest/orm/processor/auditing.py +117 -0
  109. nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
  110. nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
  111. nucliadb/ingest/orm/processor/processor.py +752 -0
  112. nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
  113. nucliadb/ingest/orm/resource.py +280 -520
  114. nucliadb/ingest/orm/utils.py +25 -31
  115. nucliadb/ingest/partitions.py +3 -9
  116. nucliadb/ingest/processing.py +76 -81
  117. nucliadb/ingest/py.typed +0 -0
  118. nucliadb/ingest/serialize.py +37 -173
  119. nucliadb/ingest/service/__init__.py +1 -3
  120. nucliadb/ingest/service/writer.py +186 -577
  121. nucliadb/ingest/settings.py +13 -22
  122. nucliadb/ingest/utils.py +3 -6
  123. nucliadb/learning_proxy.py +264 -51
  124. nucliadb/metrics_exporter.py +30 -19
  125. nucliadb/middleware/__init__.py +1 -3
  126. nucliadb/migrator/command.py +1 -3
  127. nucliadb/migrator/datamanager.py +13 -13
  128. nucliadb/migrator/migrator.py +57 -37
  129. nucliadb/migrator/settings.py +2 -1
  130. nucliadb/migrator/utils.py +18 -10
  131. nucliadb/purge/__init__.py +139 -33
  132. nucliadb/purge/orphan_shards.py +7 -13
  133. nucliadb/reader/__init__.py +1 -3
  134. nucliadb/reader/api/models.py +3 -14
  135. nucliadb/reader/api/v1/__init__.py +0 -1
  136. nucliadb/reader/api/v1/download.py +27 -94
  137. nucliadb/reader/api/v1/export_import.py +4 -4
  138. nucliadb/reader/api/v1/knowledgebox.py +13 -13
  139. nucliadb/reader/api/v1/learning_config.py +8 -12
  140. nucliadb/reader/api/v1/resource.py +67 -93
  141. nucliadb/reader/api/v1/services.py +70 -125
  142. nucliadb/reader/app.py +16 -46
  143. nucliadb/reader/lifecycle.py +18 -4
  144. nucliadb/reader/py.typed +0 -0
  145. nucliadb/reader/reader/notifications.py +10 -31
  146. nucliadb/search/__init__.py +1 -3
  147. nucliadb/search/api/v1/__init__.py +2 -2
  148. nucliadb/search/api/v1/ask.py +112 -0
  149. nucliadb/search/api/v1/catalog.py +184 -0
  150. nucliadb/search/api/v1/feedback.py +17 -25
  151. nucliadb/search/api/v1/find.py +41 -41
  152. nucliadb/search/api/v1/knowledgebox.py +90 -62
  153. nucliadb/search/api/v1/predict_proxy.py +2 -2
  154. nucliadb/search/api/v1/resource/ask.py +66 -117
  155. nucliadb/search/api/v1/resource/search.py +51 -72
  156. nucliadb/search/api/v1/router.py +1 -0
  157. nucliadb/search/api/v1/search.py +50 -197
  158. nucliadb/search/api/v1/suggest.py +40 -54
  159. nucliadb/search/api/v1/summarize.py +9 -5
  160. nucliadb/search/api/v1/utils.py +2 -1
  161. nucliadb/search/app.py +16 -48
  162. nucliadb/search/lifecycle.py +10 -3
  163. nucliadb/search/predict.py +176 -188
  164. nucliadb/search/py.typed +0 -0
  165. nucliadb/search/requesters/utils.py +41 -63
  166. nucliadb/search/search/cache.py +149 -20
  167. nucliadb/search/search/chat/ask.py +918 -0
  168. nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -13
  169. nucliadb/search/search/chat/images.py +41 -17
  170. nucliadb/search/search/chat/prompt.py +851 -282
  171. nucliadb/search/search/chat/query.py +274 -267
  172. nucliadb/{writer/resource/slug.py → search/search/cut.py} +8 -6
  173. nucliadb/search/search/fetch.py +43 -36
  174. nucliadb/search/search/filters.py +9 -15
  175. nucliadb/search/search/find.py +214 -54
  176. nucliadb/search/search/find_merge.py +408 -391
  177. nucliadb/search/search/hydrator.py +191 -0
  178. nucliadb/search/search/merge.py +198 -234
  179. nucliadb/search/search/metrics.py +73 -2
  180. nucliadb/search/search/paragraphs.py +64 -106
  181. nucliadb/search/search/pgcatalog.py +233 -0
  182. nucliadb/search/search/predict_proxy.py +1 -1
  183. nucliadb/search/search/query.py +386 -257
  184. nucliadb/search/search/query_parser/exceptions.py +22 -0
  185. nucliadb/search/search/query_parser/models.py +101 -0
  186. nucliadb/search/search/query_parser/parser.py +183 -0
  187. nucliadb/search/search/rank_fusion.py +204 -0
  188. nucliadb/search/search/rerankers.py +270 -0
  189. nucliadb/search/search/shards.py +4 -38
  190. nucliadb/search/search/summarize.py +14 -18
  191. nucliadb/search/search/utils.py +27 -4
  192. nucliadb/search/settings.py +15 -1
  193. nucliadb/standalone/api_router.py +4 -10
  194. nucliadb/standalone/app.py +17 -14
  195. nucliadb/standalone/auth.py +7 -21
  196. nucliadb/standalone/config.py +9 -12
  197. nucliadb/standalone/introspect.py +5 -5
  198. nucliadb/standalone/lifecycle.py +26 -25
  199. nucliadb/standalone/migrations.py +58 -0
  200. nucliadb/standalone/purge.py +9 -8
  201. nucliadb/standalone/py.typed +0 -0
  202. nucliadb/standalone/run.py +25 -18
  203. nucliadb/standalone/settings.py +10 -14
  204. nucliadb/standalone/versions.py +15 -5
  205. nucliadb/tasks/consumer.py +8 -12
  206. nucliadb/tasks/producer.py +7 -6
  207. nucliadb/tests/config.py +53 -0
  208. nucliadb/train/__init__.py +1 -3
  209. nucliadb/train/api/utils.py +1 -2
  210. nucliadb/train/api/v1/shards.py +2 -2
  211. nucliadb/train/api/v1/trainset.py +4 -6
  212. nucliadb/train/app.py +14 -47
  213. nucliadb/train/generator.py +10 -19
  214. nucliadb/train/generators/field_classifier.py +7 -19
  215. nucliadb/train/generators/field_streaming.py +156 -0
  216. nucliadb/train/generators/image_classifier.py +12 -18
  217. nucliadb/train/generators/paragraph_classifier.py +5 -9
  218. nucliadb/train/generators/paragraph_streaming.py +6 -9
  219. nucliadb/train/generators/question_answer_streaming.py +19 -20
  220. nucliadb/train/generators/sentence_classifier.py +9 -15
  221. nucliadb/train/generators/token_classifier.py +45 -36
  222. nucliadb/train/generators/utils.py +14 -18
  223. nucliadb/train/lifecycle.py +7 -3
  224. nucliadb/train/nodes.py +23 -32
  225. nucliadb/train/py.typed +0 -0
  226. nucliadb/train/servicer.py +13 -21
  227. nucliadb/train/settings.py +2 -6
  228. nucliadb/train/types.py +13 -10
  229. nucliadb/train/upload.py +3 -6
  230. nucliadb/train/uploader.py +20 -25
  231. nucliadb/train/utils.py +1 -1
  232. nucliadb/writer/__init__.py +1 -3
  233. nucliadb/writer/api/constants.py +0 -5
  234. nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
  235. nucliadb/writer/api/v1/export_import.py +102 -49
  236. nucliadb/writer/api/v1/field.py +196 -620
  237. nucliadb/writer/api/v1/knowledgebox.py +221 -71
  238. nucliadb/writer/api/v1/learning_config.py +2 -2
  239. nucliadb/writer/api/v1/resource.py +114 -216
  240. nucliadb/writer/api/v1/services.py +64 -132
  241. nucliadb/writer/api/v1/slug.py +61 -0
  242. nucliadb/writer/api/v1/transaction.py +67 -0
  243. nucliadb/writer/api/v1/upload.py +184 -215
  244. nucliadb/writer/app.py +11 -61
  245. nucliadb/writer/back_pressure.py +62 -43
  246. nucliadb/writer/exceptions.py +0 -4
  247. nucliadb/writer/lifecycle.py +21 -15
  248. nucliadb/writer/py.typed +0 -0
  249. nucliadb/writer/resource/audit.py +2 -1
  250. nucliadb/writer/resource/basic.py +48 -62
  251. nucliadb/writer/resource/field.py +45 -135
  252. nucliadb/writer/resource/origin.py +1 -2
  253. nucliadb/writer/settings.py +14 -5
  254. nucliadb/writer/tus/__init__.py +17 -15
  255. nucliadb/writer/tus/azure.py +111 -0
  256. nucliadb/writer/tus/dm.py +17 -5
  257. nucliadb/writer/tus/exceptions.py +1 -3
  258. nucliadb/writer/tus/gcs.py +56 -84
  259. nucliadb/writer/tus/local.py +21 -37
  260. nucliadb/writer/tus/s3.py +28 -68
  261. nucliadb/writer/tus/storage.py +5 -56
  262. nucliadb/writer/vectorsets.py +125 -0
  263. nucliadb-6.2.1.post2777.dist-info/METADATA +148 -0
  264. nucliadb-6.2.1.post2777.dist-info/RECORD +343 -0
  265. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/WHEEL +1 -1
  266. nucliadb/common/maindb/redis.py +0 -194
  267. nucliadb/common/maindb/tikv.py +0 -412
  268. nucliadb/ingest/fields/layout.py +0 -58
  269. nucliadb/ingest/tests/conftest.py +0 -30
  270. nucliadb/ingest/tests/fixtures.py +0 -771
  271. nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
  272. nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -80
  273. nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -89
  274. nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
  275. nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
  276. nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
  277. nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -691
  278. nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
  279. nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
  280. nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
  281. nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -140
  282. nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
  283. nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
  284. nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -139
  285. nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
  286. nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
  287. nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
  288. nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
  289. nucliadb/ingest/tests/unit/orm/test_resource.py +0 -275
  290. nucliadb/ingest/tests/unit/test_partitions.py +0 -40
  291. nucliadb/ingest/tests/unit/test_processing.py +0 -171
  292. nucliadb/middleware/transaction.py +0 -117
  293. nucliadb/reader/api/v1/learning_collector.py +0 -63
  294. nucliadb/reader/tests/__init__.py +0 -19
  295. nucliadb/reader/tests/conftest.py +0 -31
  296. nucliadb/reader/tests/fixtures.py +0 -136
  297. nucliadb/reader/tests/test_list_resources.py +0 -75
  298. nucliadb/reader/tests/test_reader_file_download.py +0 -273
  299. nucliadb/reader/tests/test_reader_resource.py +0 -379
  300. nucliadb/reader/tests/test_reader_resource_field.py +0 -219
  301. nucliadb/search/api/v1/chat.py +0 -258
  302. nucliadb/search/api/v1/resource/chat.py +0 -94
  303. nucliadb/search/tests/__init__.py +0 -19
  304. nucliadb/search/tests/conftest.py +0 -33
  305. nucliadb/search/tests/fixtures.py +0 -199
  306. nucliadb/search/tests/node.py +0 -465
  307. nucliadb/search/tests/unit/__init__.py +0 -18
  308. nucliadb/search/tests/unit/api/__init__.py +0 -19
  309. nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
  310. nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
  311. nucliadb/search/tests/unit/api/v1/resource/test_ask.py +0 -67
  312. nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -97
  313. nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
  314. nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
  315. nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -93
  316. nucliadb/search/tests/unit/search/__init__.py +0 -18
  317. nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
  318. nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -210
  319. nucliadb/search/tests/unit/search/search/__init__.py +0 -19
  320. nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
  321. nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
  322. nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -266
  323. nucliadb/search/tests/unit/search/test_fetch.py +0 -108
  324. nucliadb/search/tests/unit/search/test_filters.py +0 -125
  325. nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
  326. nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
  327. nucliadb/search/tests/unit/search/test_query.py +0 -201
  328. nucliadb/search/tests/unit/test_app.py +0 -79
  329. nucliadb/search/tests/unit/test_find_merge.py +0 -112
  330. nucliadb/search/tests/unit/test_merge.py +0 -34
  331. nucliadb/search/tests/unit/test_predict.py +0 -584
  332. nucliadb/standalone/tests/__init__.py +0 -19
  333. nucliadb/standalone/tests/conftest.py +0 -33
  334. nucliadb/standalone/tests/fixtures.py +0 -38
  335. nucliadb/standalone/tests/unit/__init__.py +0 -18
  336. nucliadb/standalone/tests/unit/test_api_router.py +0 -61
  337. nucliadb/standalone/tests/unit/test_auth.py +0 -169
  338. nucliadb/standalone/tests/unit/test_introspect.py +0 -35
  339. nucliadb/standalone/tests/unit/test_versions.py +0 -68
  340. nucliadb/tests/benchmarks/__init__.py +0 -19
  341. nucliadb/tests/benchmarks/test_search.py +0 -99
  342. nucliadb/tests/conftest.py +0 -32
  343. nucliadb/tests/fixtures.py +0 -736
  344. nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -203
  345. nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -109
  346. nucliadb/tests/migrations/__init__.py +0 -19
  347. nucliadb/tests/migrations/test_migration_0017.py +0 -80
  348. nucliadb/tests/tikv.py +0 -240
  349. nucliadb/tests/unit/__init__.py +0 -19
  350. nucliadb/tests/unit/common/__init__.py +0 -19
  351. nucliadb/tests/unit/common/cluster/__init__.py +0 -19
  352. nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
  353. nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -170
  354. nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
  355. nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -113
  356. nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -59
  357. nucliadb/tests/unit/common/cluster/test_cluster.py +0 -399
  358. nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -178
  359. nucliadb/tests/unit/common/cluster/test_rollover.py +0 -279
  360. nucliadb/tests/unit/common/maindb/__init__.py +0 -18
  361. nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
  362. nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
  363. nucliadb/tests/unit/common/maindb/test_utils.py +0 -81
  364. nucliadb/tests/unit/common/test_context.py +0 -36
  365. nucliadb/tests/unit/export_import/__init__.py +0 -19
  366. nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
  367. nucliadb/tests/unit/export_import/test_utils.py +0 -294
  368. nucliadb/tests/unit/migrator/__init__.py +0 -19
  369. nucliadb/tests/unit/migrator/test_migrator.py +0 -87
  370. nucliadb/tests/unit/tasks/__init__.py +0 -19
  371. nucliadb/tests/unit/tasks/conftest.py +0 -42
  372. nucliadb/tests/unit/tasks/test_consumer.py +0 -93
  373. nucliadb/tests/unit/tasks/test_producer.py +0 -95
  374. nucliadb/tests/unit/tasks/test_tasks.py +0 -60
  375. nucliadb/tests/unit/test_field_ids.py +0 -49
  376. nucliadb/tests/unit/test_health.py +0 -84
  377. nucliadb/tests/unit/test_kb_slugs.py +0 -54
  378. nucliadb/tests/unit/test_learning_proxy.py +0 -252
  379. nucliadb/tests/unit/test_metrics_exporter.py +0 -77
  380. nucliadb/tests/unit/test_purge.py +0 -138
  381. nucliadb/tests/utils/__init__.py +0 -74
  382. nucliadb/tests/utils/aiohttp_session.py +0 -44
  383. nucliadb/tests/utils/broker_messages/__init__.py +0 -167
  384. nucliadb/tests/utils/broker_messages/fields.py +0 -181
  385. nucliadb/tests/utils/broker_messages/helpers.py +0 -33
  386. nucliadb/tests/utils/entities.py +0 -78
  387. nucliadb/train/api/v1/check.py +0 -60
  388. nucliadb/train/tests/__init__.py +0 -19
  389. nucliadb/train/tests/conftest.py +0 -29
  390. nucliadb/train/tests/fixtures.py +0 -342
  391. nucliadb/train/tests/test_field_classification.py +0 -122
  392. nucliadb/train/tests/test_get_entities.py +0 -80
  393. nucliadb/train/tests/test_get_info.py +0 -51
  394. nucliadb/train/tests/test_get_ontology.py +0 -34
  395. nucliadb/train/tests/test_get_ontology_count.py +0 -63
  396. nucliadb/train/tests/test_image_classification.py +0 -222
  397. nucliadb/train/tests/test_list_fields.py +0 -39
  398. nucliadb/train/tests/test_list_paragraphs.py +0 -73
  399. nucliadb/train/tests/test_list_resources.py +0 -39
  400. nucliadb/train/tests/test_list_sentences.py +0 -71
  401. nucliadb/train/tests/test_paragraph_classification.py +0 -123
  402. nucliadb/train/tests/test_paragraph_streaming.py +0 -118
  403. nucliadb/train/tests/test_question_answer_streaming.py +0 -239
  404. nucliadb/train/tests/test_sentence_classification.py +0 -143
  405. nucliadb/train/tests/test_token_classification.py +0 -136
  406. nucliadb/train/tests/utils.py +0 -108
  407. nucliadb/writer/layouts/__init__.py +0 -51
  408. nucliadb/writer/layouts/v1.py +0 -59
  409. nucliadb/writer/resource/vectors.py +0 -120
  410. nucliadb/writer/tests/__init__.py +0 -19
  411. nucliadb/writer/tests/conftest.py +0 -31
  412. nucliadb/writer/tests/fixtures.py +0 -192
  413. nucliadb/writer/tests/test_fields.py +0 -486
  414. nucliadb/writer/tests/test_files.py +0 -743
  415. nucliadb/writer/tests/test_knowledgebox.py +0 -49
  416. nucliadb/writer/tests/test_reprocess_file_field.py +0 -139
  417. nucliadb/writer/tests/test_resources.py +0 -546
  418. nucliadb/writer/tests/test_service.py +0 -137
  419. nucliadb/writer/tests/test_tus.py +0 -203
  420. nucliadb/writer/tests/utils.py +0 -35
  421. nucliadb/writer/tus/pg.py +0 -125
  422. nucliadb-2.46.1.post382.dist-info/METADATA +0 -134
  423. nucliadb-2.46.1.post382.dist-info/RECORD +0 -451
  424. {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
  425. /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
  426. /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
  427. /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
  428. /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
  429. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/entry_points.txt +0 -0
  430. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/top_level.txt +0 -0
  431. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/zip-safe +0 -0
@@ -22,15 +22,12 @@ from typing import TYPE_CHECKING, Any, Optional, Union
22
22
  from pydantic import BaseModel
23
23
 
24
24
  import nucliadb_models as models
25
- from nucliadb_models.common import FIELD_TYPES_MAP, FieldTypeName
25
+ from nucliadb_models.common import FieldTypeName
26
26
  from nucliadb_models.resource import (
27
27
  ConversationFieldExtractedData,
28
- DatetimeFieldExtractedData,
29
28
  Error,
30
29
  ExtractedDataType,
31
30
  FileFieldExtractedData,
32
- KeywordsetFieldExtractedData,
33
- LayoutFieldExtractedData,
34
31
  LinkFieldExtractedData,
35
32
  TextFieldExtractedData,
36
33
  )
@@ -41,10 +38,7 @@ if TYPE_CHECKING: # pragma: no cover
41
38
  models.FieldText,
42
39
  models.FieldFile,
43
40
  models.FieldLink,
44
- models.FieldLayout,
45
41
  models.Conversation,
46
- models.FieldKeywordset,
47
- models.FieldDatetime,
48
42
  ]
49
43
  ]
50
44
  else:
@@ -55,19 +49,14 @@ else:
55
49
  class ResourceField(BaseModel):
56
50
  field_type: FieldTypeName
57
51
  field_id: str
58
- value: ValueType
59
- extracted: ExtractedDataType
52
+ value: ValueType = None
53
+ extracted: Optional[ExtractedDataType] = None
60
54
  error: Optional[Error] = None
61
55
 
62
56
 
63
- FIELD_NAMES_TO_PB_TYPE_MAP = {v: k for k, v in FIELD_TYPES_MAP.items()}
64
-
65
57
  FIELD_NAME_TO_EXTRACTED_DATA_FIELD_MAP: dict[FieldTypeName, Any] = {
66
58
  FieldTypeName.TEXT: TextFieldExtractedData,
67
59
  FieldTypeName.FILE: FileFieldExtractedData,
68
60
  FieldTypeName.LINK: LinkFieldExtractedData,
69
- FieldTypeName.DATETIME: DatetimeFieldExtractedData,
70
- FieldTypeName.KEYWORDSET: KeywordsetFieldExtractedData,
71
- FieldTypeName.LAYOUT: LayoutFieldExtractedData,
72
61
  FieldTypeName.CONVERSATION: ConversationFieldExtractedData,
73
62
  }
@@ -20,7 +20,6 @@
20
20
  from . import download # noqa
21
21
  from . import export_import # noqa
22
22
  from . import knowledgebox # noqa
23
- from . import learning_collector # noqa
24
23
  from . import learning_config # noqa
25
24
  from . import resource # noqa
26
25
  from . import services # noqa
@@ -28,14 +28,14 @@ from fastapi_versioning import version
28
28
  from starlette.datastructures import Headers
29
29
  from starlette.responses import StreamingResponse
30
30
 
31
- from nucliadb.ingest.orm.resource import FIELD_TYPE_TO_ID
31
+ from nucliadb.common.ids import FIELD_TYPE_PB_TO_STR
32
+ from nucliadb.common.models_utils import to_proto
32
33
  from nucliadb.ingest.serialize import get_resource_uuid_by_slug
33
34
  from nucliadb.reader import SERVICE_NAME, logger
34
- from nucliadb.reader.api.models import FIELD_NAMES_TO_PB_TYPE_MAP
35
35
  from nucliadb_models.common import FieldTypeName
36
36
  from nucliadb_models.resource import NucliaDBRoles
37
37
  from nucliadb_utils.authentication import requires_one
38
- from nucliadb_utils.storages.storage import StorageField # type: ignore
38
+ from nucliadb_utils.storages.storage import ObjectMetadata, Range, StorageField
39
39
  from nucliadb_utils.utilities import get_storage
40
40
 
41
41
  from .router import KB_PREFIX, RESOURCE_PREFIX, RSLUG_PREFIX, api
@@ -50,7 +50,7 @@ class DownloadType(Enum):
50
50
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/{{field_type}}/{{field_id}}/download/extracted/{{download_field:path}}", # noqa
51
51
  tags=["Resource fields"],
52
52
  status_code=200,
53
- name="Download extracted binary file (by slug)",
53
+ summary="Download extracted binary file (by slug)",
54
54
  )
55
55
  @requires_one([NucliaDBRoles.READER])
56
56
  @version(1)
@@ -62,16 +62,14 @@ async def download_extract_file_rslug_prefix(
62
62
  field_id: str,
63
63
  download_field: str,
64
64
  ) -> Response:
65
- return await _download_extract_file(
66
- request, kbid, field_type, field_id, download_field, rslug=rslug
67
- )
65
+ return await _download_extract_file(request, kbid, field_type, field_id, download_field, rslug=rslug)
68
66
 
69
67
 
70
68
  @api.get(
71
69
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/{{field_type}}/{{field_id}}/download/extracted/{{download_field:path}}", # noqa
72
70
  tags=["Resource fields"],
73
71
  status_code=200,
74
- name="Download extracted binary file (by id)",
72
+ summary="Download extracted binary file (by id)",
75
73
  )
76
74
  @requires_one([NucliaDBRoles.READER])
77
75
  @version(1)
@@ -83,9 +81,7 @@ async def download_extract_file_rid_prefix(
83
81
  field_id: str,
84
82
  download_field: str,
85
83
  ) -> Response:
86
- return await _download_extract_file(
87
- request, kbid, field_type, field_id, download_field, rid=rid
88
- )
84
+ return await _download_extract_file(request, kbid, field_type, field_id, download_field, rid=rid)
89
85
 
90
86
 
91
87
  async def _download_extract_file(
@@ -101,8 +97,8 @@ async def _download_extract_file(
101
97
 
102
98
  storage = await get_storage(service_name=SERVICE_NAME)
103
99
 
104
- pb_field_type = FIELD_NAMES_TO_PB_TYPE_MAP[field_type]
105
- field_type_letter = FIELD_TYPE_TO_ID[pb_field_type]
100
+ pb_field_type = to_proto.field_type_name(field_type)
101
+ field_type_letter = FIELD_TYPE_PB_TO_STR[pb_field_type]
106
102
 
107
103
  sf = storage.file_extracted(kbid, rid, field_type_letter, field_id, download_field)
108
104
 
@@ -113,7 +109,7 @@ async def _download_extract_file(
113
109
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/file/{{field_id}}/download/field",
114
110
  tags=["Resource fields"],
115
111
  status_code=200,
116
- name="Download field binary field (by slug)",
112
+ summary="Download field binary field (by slug)",
117
113
  )
118
114
  @requires_one([NucliaDBRoles.READER])
119
115
  @version(1)
@@ -124,16 +120,14 @@ async def download_field_file_rslug_prefix(
124
120
  field_id: str,
125
121
  inline: bool = False,
126
122
  ) -> Response:
127
- return await _download_field_file(
128
- request, kbid, field_id, rslug=rslug, inline=inline
129
- )
123
+ return await _download_field_file(request, kbid, field_id, rslug=rslug, inline=inline)
130
124
 
131
125
 
132
126
  @api.get(
133
127
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/file/{{field_id}}/download/field",
134
128
  tags=["Resource fields"],
135
129
  status_code=200,
136
- name="Download field binary field (by id)",
130
+ summary="Download field binary field (by id)",
137
131
  )
138
132
  @requires_one([NucliaDBRoles.READER])
139
133
  @version(1)
@@ -164,68 +158,11 @@ async def _download_field_file(
164
158
  return await download_api(sf, request.headers, inline=inline)
165
159
 
166
160
 
167
- @api.get(
168
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/layout/{{field_id}}/download/field/{{download_field}}",
169
- tags=["Resource fields"],
170
- status_code=200,
171
- name="Download layout binary field (by slug)",
172
- )
173
- @requires_one([NucliaDBRoles.READER])
174
- @version(1)
175
- async def download_field_layout_rslug_prefix(
176
- request: Request,
177
- kbid: str,
178
- rslug: str,
179
- field_id: str,
180
- download_field: str,
181
- ) -> Response:
182
- return await _download_field_layout(
183
- request, kbid, field_id, download_field, rslug=rslug
184
- )
185
-
186
-
187
- @api.get(
188
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/layout/{{field_id}}/download/field/{{download_field}}",
189
- tags=["Resource fields"],
190
- status_code=200,
191
- name="Download layout binary field (by id)",
192
- )
193
- @requires_one([NucliaDBRoles.READER])
194
- @version(1)
195
- async def download_field_layout_rid_prefix(
196
- request: Request,
197
- kbid: str,
198
- rid: str,
199
- field_id: str,
200
- download_field: str,
201
- ) -> Response:
202
- return await _download_field_layout(
203
- request, kbid, field_id, download_field, rid=rid
204
- )
205
-
206
-
207
- async def _download_field_layout(
208
- request: Request,
209
- kbid: str,
210
- field_id: str,
211
- download_field: str,
212
- rid: Optional[str] = None,
213
- rslug: Optional[str] = None,
214
- ) -> Response:
215
- rid = await _get_resource_uuid_from_params(kbid, rid, rslug)
216
-
217
- storage = await get_storage(service_name=SERVICE_NAME)
218
-
219
- sf = storage.layout_field(kbid, rid, field_id, download_field)
220
-
221
- return await download_api(sf, request.headers)
222
-
223
-
224
161
  @api.get(
225
162
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/conversation/{{field_id}}/download/field/{{message_id}}/{{file_num}}", # noqa
226
163
  tags=["Resource fields"],
227
164
  status_code=200,
228
- name="Download conversation binary field (by slug)",
165
+ summary="Download conversation binary field (by slug)",
229
166
  )
230
167
  @requires_one([NucliaDBRoles.READER])
231
168
  @version(1)
@@ -237,16 +174,14 @@ async def download_field_conversation_rslug_prefix(
237
174
  message_id: str,
238
175
  file_num: int,
239
176
  ) -> Response:
240
- return await _download_field_conversation(
241
- request, kbid, field_id, message_id, file_num, rslug=rslug
242
- )
177
+ return await _download_field_conversation(request, kbid, field_id, message_id, file_num, rslug=rslug)
243
178
 
244
179
 
245
180
  @api.get(
246
181
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/conversation/{{field_id}}/download/field/{{message_id}}/{{file_num}}", # noqa
247
182
  tags=["Resource fields"],
248
183
  status_code=200,
249
- name="Download conversation binary field (by id)",
184
+ summary="Download conversation binary field (by id)",
250
185
  )
251
186
  @requires_one([NucliaDBRoles.READER])
252
187
  @version(1)
@@ -258,9 +193,7 @@ async def download_field_conversation_rid_prefix(
258
193
  message_id: str,
259
194
  file_num: int,
260
195
  ) -> Response:
261
- return await _download_field_conversation(
262
- request, kbid, field_id, message_id, file_num, rid=rid
263
- )
196
+ return await _download_field_conversation(request, kbid, field_id, message_id, file_num, rid=rid)
264
197
 
265
198
 
266
199
  async def _download_field_conversation(
@@ -282,13 +215,13 @@ async def _download_field_conversation(
282
215
 
283
216
 
284
217
  async def download_api(sf: StorageField, headers: Headers, inline: bool = False):
285
- metadata = await sf.exists()
218
+ metadata: Optional[ObjectMetadata] = await sf.exists()
286
219
  if metadata is None:
287
220
  raise HTTPException(status_code=404, detail="Specified file doesn't exist")
288
221
 
289
- file_size = int(metadata.get("SIZE", -1))
290
- content_type = metadata.get("CONTENT_TYPE", "application/octet-stream")
291
- filename = metadata.get("FILENAME", "file")
222
+ file_size = metadata.size or -1
223
+ content_type = metadata.content_type or "application/octet-stream"
224
+ filename = metadata.filename or "file"
292
225
  filename = safe_http_header_encode(filename)
293
226
 
294
227
  status_code = 200
@@ -299,8 +232,10 @@ async def download_api(sf: StorageField, headers: Headers, inline: bool = False)
299
232
  "Content-Type": content_type,
300
233
  "Content-Disposition": content_disposition,
301
234
  }
302
- download_headers = {}
235
+
236
+ range = Range()
303
237
  if "range" in headers and file_size > -1:
238
+ status_code = 206
304
239
  range_request = headers["range"]
305
240
  try:
306
241
  start, end, range_size = parse_media_range(range_request, file_size)
@@ -341,23 +276,21 @@ async def download_api(sf: StorageField, headers: Headers, inline: bool = False)
341
276
  headers={"Content-Range": f"bytes */{file_size}"},
342
277
  status_code=416,
343
278
  )
344
- status_code = 206
345
279
  logger.debug(f"Range request: {range_request}")
346
280
  extra_headers["Content-Length"] = f"{range_size}"
347
281
  extra_headers["Content-Range"] = f"bytes {start}-{end}/{file_size}"
348
- download_headers["Range"] = range_request
282
+ range.start = start
283
+ range.end = end
349
284
 
350
285
  return StreamingResponse(
351
- sf.storage.download(sf.bucket, sf.key, headers=download_headers), # type: ignore
286
+ sf.storage.download(sf.bucket, sf.key, range=range),
352
287
  status_code=status_code,
353
288
  media_type=content_type,
354
289
  headers=extra_headers,
355
290
  )
356
291
 
357
292
 
358
- async def _get_resource_uuid_from_params(
359
- kbid, rid: Optional[str], rslug: Optional[str]
360
- ) -> str:
293
+ async def _get_resource_uuid_from_params(kbid, rid: Optional[str], rslug: Optional[str]) -> str:
361
294
  if not any([rid, rslug]):
362
295
  raise ValueError("Either rid or slug must be set")
363
296
 
@@ -41,7 +41,7 @@ from nucliadb_utils.authentication import requires_one
41
41
  @api.get(
42
42
  f"/{KB_PREFIX}/{{kbid}}/export/{{export_id}}",
43
43
  status_code=200,
44
- name="Download a Knowledge Box export",
44
+ summary="Download a Knowledge Box export",
45
45
  tags=["Knowledge Boxes"],
46
46
  response_class=StreamingResponse,
47
47
  )
@@ -100,7 +100,7 @@ async def download_export_and_delete(
100
100
  @api.get(
101
101
  f"/{KB_PREFIX}/{{kbid}}/export/{{export_id}}/status",
102
102
  status_code=200,
103
- name="Get the status of a Knowledge Box Export",
103
+ summary="Get the status of a Knowledge Box Export",
104
104
  response_model=StatusResponse,
105
105
  tags=["Knowledge Boxes"],
106
106
  )
@@ -119,7 +119,7 @@ async def get_export_status_endpoint(
119
119
  @api.get(
120
120
  f"/{KB_PREFIX}/{{kbid}}/import/{{import_id}}/status",
121
121
  status_code=200,
122
- name="Get the status of a Knowledge Box Import",
122
+ summary="Get the status of a Knowledge Box Import",
123
123
  response_model=StatusResponse,
124
124
  tags=["Knowledge Boxes"],
125
125
  )
@@ -160,5 +160,5 @@ async def _get_status(
160
160
 
161
161
 
162
162
  async def exists_kb(kbid: str) -> bool:
163
- async with datamanagers.with_transaction(read_only=True) as txn:
163
+ async with datamanagers.with_ro_transaction() as txn:
164
164
  return await datamanagers.kb.exists_kb(txn, kbid=kbid)
@@ -18,14 +18,14 @@
18
18
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
  #
20
20
  from fastapi import HTTPException
21
- from fastapi_versioning import version # type: ignore
21
+ from fastapi_versioning import version
22
22
  from starlette.requests import Request
23
23
 
24
24
  from nucliadb.common import datamanagers
25
25
  from nucliadb.common.maindb.utils import get_driver
26
+ from nucliadb.common.models_utils import from_proto
26
27
  from nucliadb.reader.api.v1.router import KB_PREFIX, KBS_PREFIX, api
27
28
  from nucliadb_models.resource import (
28
- KnowledgeBoxConfig,
29
29
  KnowledgeBoxList,
30
30
  KnowledgeBoxObj,
31
31
  KnowledgeBoxObjSummary,
@@ -37,7 +37,7 @@ from nucliadb_utils.authentication import requires, requires_one
37
37
  @api.get(
38
38
  f"/{KBS_PREFIX}",
39
39
  status_code=200,
40
- name="List Knowledge Boxes",
40
+ summary="List Knowledge Boxes",
41
41
  response_model=KnowledgeBoxList,
42
42
  tags=["Knowledge Boxes"],
43
43
  include_in_schema=False,
@@ -46,17 +46,17 @@ from nucliadb_utils.authentication import requires, requires_one
46
46
  @version(1)
47
47
  async def get_kbs(request: Request, prefix: str = "") -> KnowledgeBoxList:
48
48
  driver = get_driver()
49
- async with driver.transaction() as txn:
49
+ async with driver.transaction(read_only=True) as txn:
50
50
  response = KnowledgeBoxList()
51
51
  async for kbid, slug in datamanagers.kb.get_kbs(txn, prefix=prefix):
52
- response.kbs.append(KnowledgeBoxObjSummary(slug=slug or None, uuid=kbid)) # type: ignore
52
+ response.kbs.append(KnowledgeBoxObjSummary(slug=slug or None, uuid=kbid))
53
53
  return response
54
54
 
55
55
 
56
56
  @api.get(
57
57
  f"/{KB_PREFIX}/{{kbid}}",
58
58
  status_code=200,
59
- name="Get Knowledge Box",
59
+ summary="Get Knowledge Box",
60
60
  response_model=KnowledgeBoxObj,
61
61
  tags=["Knowledge Boxes"],
62
62
  )
@@ -64,22 +64,22 @@ async def get_kbs(request: Request, prefix: str = "") -> KnowledgeBoxList:
64
64
  @version(1)
65
65
  async def get_kb(request: Request, kbid: str) -> KnowledgeBoxObj:
66
66
  driver = get_driver()
67
- async with driver.transaction() as txn:
67
+ async with driver.transaction(read_only=True) as txn:
68
68
  kb_config = await datamanagers.kb.get_config(txn, kbid=kbid)
69
69
  if kb_config is None:
70
70
  raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
71
71
 
72
72
  return KnowledgeBoxObj(
73
73
  uuid=kbid,
74
- slug=kb_config.slug, # type: ignore
75
- config=KnowledgeBoxConfig.from_message(kb_config),
74
+ slug=kb_config.slug,
75
+ config=from_proto.knowledgebox_config(kb_config),
76
76
  )
77
77
 
78
78
 
79
79
  @api.get(
80
80
  f"/{KB_PREFIX}/s/{{slug}}",
81
81
  status_code=200,
82
- name="Get Knowledge Box (by slug)",
82
+ summary="Get Knowledge Box (by slug)",
83
83
  response_model=KnowledgeBoxObj,
84
84
  tags=["Knowledge Boxes"],
85
85
  )
@@ -87,7 +87,7 @@ async def get_kb(request: Request, kbid: str) -> KnowledgeBoxObj:
87
87
  @version(1)
88
88
  async def get_kb_by_slug(request: Request, slug: str) -> KnowledgeBoxObj:
89
89
  driver = get_driver()
90
- async with driver.transaction() as txn:
90
+ async with driver.transaction(read_only=True) as txn:
91
91
  kbid = await datamanagers.kb.get_kb_uuid(txn, slug=slug)
92
92
  if kbid is None:
93
93
  raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
@@ -98,6 +98,6 @@ async def get_kb_by_slug(request: Request, slug: str) -> KnowledgeBoxObj:
98
98
 
99
99
  return KnowledgeBoxObj(
100
100
  uuid=kbid,
101
- slug=kb_config.slug, # type: ignore
102
- config=KnowledgeBoxConfig.from_message(kb_config),
101
+ slug=kb_config.slug,
102
+ config=from_proto.knowledgebox_config(kb_config),
103
103
  )
@@ -31,7 +31,7 @@ from nucliadb_utils.settings import is_onprem_nucliadb
31
31
  @api.get(
32
32
  path=f"/{KB_PREFIX}/{{kbid}}/models/{{model_id}}/{{filename:path}}",
33
33
  status_code=200,
34
- name="Download the Knowledege Box model",
34
+ summary="Download the Knowledege Box model",
35
35
  description="Download the trained model or any other generated file as a result of a training task on a Knowledge Box.", # noqa
36
36
  response_model=None,
37
37
  tags=["Models"],
@@ -44,15 +44,13 @@ async def download_model(
44
44
  model_id: str,
45
45
  filename: str,
46
46
  ):
47
- return await learning_config_proxy(
48
- request, "GET", f"/download/{kbid}/model/{model_id}/{filename}"
49
- )
47
+ return await learning_config_proxy(request, "GET", f"/download/{kbid}/model/{model_id}/{filename}")
50
48
 
51
49
 
52
50
  @api.get(
53
51
  path=f"/{KB_PREFIX}/{{kbid}}/configuration",
54
52
  status_code=200,
55
- name="Get Knowledge Box models configuration",
53
+ summary="Get Knowledge Box models configuration",
56
54
  description="Current configuration of models assigned to a Knowledge Box",
57
55
  response_model=None,
58
56
  tags=["Models"],
@@ -74,7 +72,7 @@ async def get_configuration(
74
72
  @api.get(
75
73
  path=f"/{KB_PREFIX}/{{kbid}}/models",
76
74
  status_code=200,
77
- name="Get available models",
75
+ summary="Get available models",
78
76
  description="Get available models",
79
77
  response_model=None,
80
78
  tags=["Models"],
@@ -91,7 +89,7 @@ async def get_models(
91
89
  @api.get(
92
90
  path=f"/{KB_PREFIX}/{{kbid}}/model/{{model_id}}",
93
91
  status_code=200,
94
- name="Get model metadata",
92
+ summary="Get model metadata",
95
93
  description="Get metadata for a particular model",
96
94
  response_model=None,
97
95
  tags=["Models"],
@@ -114,7 +112,7 @@ async def get_model(
114
112
  @api.get(
115
113
  path=f"/{KB_PREFIX}/{{kbid}}/schema",
116
114
  status_code=200,
117
- name="Learning configuration schema",
115
+ summary="Learning configuration schema",
118
116
  description="Get jsonschema definition to update the `learning_configuration` of your Knowledge Box",
119
117
  response_model=None,
120
118
  tags=["Models"],
@@ -131,7 +129,7 @@ async def get_schema_for_configuration_updates(
131
129
  @api.get(
132
130
  path=f"/nua/schema",
133
131
  status_code=200,
134
- name="Learning configuration schema for Knowledge Box creation",
132
+ summary="Learning configuration schema for Knowledge Box creation",
135
133
  description="Get jsonschema definition for `learning_configuration` field for the Knowledge Box creation payload",
136
134
  response_model=None,
137
135
  tags=["Models"],
@@ -143,7 +141,5 @@ async def get_schema_for_configuration_creation(
143
141
  request: Request,
144
142
  ):
145
143
  if not is_onprem_nucliadb():
146
- return HTTPClientError(
147
- status_code=404, detail="Endpoint not available for Hosted NucliaDB"
148
- )
144
+ return HTTPClientError(status_code=404, detail="Endpoint not available for Hosted NucliaDB")
149
145
  return await learning_config_proxy(request, "GET", f"/schema")