nucliadb 4.0.0.post542__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 (418) hide show
  1. migrations/0003_allfields_key.py +1 -35
  2. migrations/0009_upgrade_relations_and_texts_to_v2.py +4 -2
  3. migrations/0010_fix_corrupt_indexes.py +10 -10
  4. migrations/0011_materialize_labelset_ids.py +1 -16
  5. migrations/0012_rollover_shards.py +5 -10
  6. migrations/0014_rollover_shards.py +4 -5
  7. migrations/0015_targeted_rollover.py +5 -10
  8. migrations/0016_upgrade_to_paragraphs_v2.py +25 -28
  9. migrations/0017_multiple_writable_shards.py +2 -4
  10. migrations/0018_purge_orphan_kbslugs.py +5 -7
  11. migrations/0019_upgrade_to_paragraphs_v3.py +25 -28
  12. migrations/0020_drain_nodes_from_cluster.py +3 -3
  13. nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +16 -19
  14. nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
  15. migrations/0023_backfill_pg_catalog.py +80 -0
  16. migrations/0025_assign_models_to_kbs_v2.py +113 -0
  17. migrations/0026_fix_high_cardinality_content_types.py +61 -0
  18. migrations/0027_rollover_texts3.py +73 -0
  19. nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
  20. migrations/pg/0002_catalog.py +42 -0
  21. nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
  22. nucliadb/common/cluster/base.py +30 -16
  23. nucliadb/common/cluster/discovery/base.py +6 -14
  24. nucliadb/common/cluster/discovery/k8s.py +9 -19
  25. nucliadb/common/cluster/discovery/manual.py +1 -3
  26. nucliadb/common/cluster/discovery/utils.py +1 -3
  27. nucliadb/common/cluster/grpc_node_dummy.py +3 -11
  28. nucliadb/common/cluster/index_node.py +10 -19
  29. nucliadb/common/cluster/manager.py +174 -59
  30. nucliadb/common/cluster/rebalance.py +27 -29
  31. nucliadb/common/cluster/rollover.py +353 -194
  32. nucliadb/common/cluster/settings.py +6 -0
  33. nucliadb/common/cluster/standalone/grpc_node_binding.py +13 -64
  34. nucliadb/common/cluster/standalone/index_node.py +4 -11
  35. nucliadb/common/cluster/standalone/service.py +2 -6
  36. nucliadb/common/cluster/standalone/utils.py +2 -6
  37. nucliadb/common/cluster/utils.py +29 -22
  38. nucliadb/common/constants.py +20 -0
  39. nucliadb/common/context/__init__.py +3 -0
  40. nucliadb/common/context/fastapi.py +8 -5
  41. nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
  42. nucliadb/common/datamanagers/__init__.py +7 -1
  43. nucliadb/common/datamanagers/atomic.py +22 -4
  44. nucliadb/common/datamanagers/cluster.py +5 -5
  45. nucliadb/common/datamanagers/entities.py +6 -16
  46. nucliadb/common/datamanagers/fields.py +84 -0
  47. nucliadb/common/datamanagers/kb.py +83 -37
  48. nucliadb/common/datamanagers/labels.py +26 -56
  49. nucliadb/common/datamanagers/processing.py +2 -6
  50. nucliadb/common/datamanagers/resources.py +41 -103
  51. nucliadb/common/datamanagers/rollover.py +76 -15
  52. nucliadb/common/datamanagers/synonyms.py +1 -1
  53. nucliadb/common/datamanagers/utils.py +15 -6
  54. nucliadb/common/datamanagers/vectorsets.py +110 -0
  55. nucliadb/common/external_index_providers/base.py +257 -0
  56. nucliadb/{ingest/tests/unit/orm/test_orm_utils.py → common/external_index_providers/exceptions.py} +9 -8
  57. nucliadb/common/external_index_providers/manager.py +101 -0
  58. nucliadb/common/external_index_providers/pinecone.py +933 -0
  59. nucliadb/common/external_index_providers/settings.py +52 -0
  60. nucliadb/common/http_clients/auth.py +3 -6
  61. nucliadb/common/http_clients/processing.py +6 -11
  62. nucliadb/common/http_clients/utils.py +1 -3
  63. nucliadb/common/ids.py +240 -0
  64. nucliadb/common/locking.py +29 -7
  65. nucliadb/common/maindb/driver.py +11 -35
  66. nucliadb/common/maindb/exceptions.py +3 -0
  67. nucliadb/common/maindb/local.py +22 -9
  68. nucliadb/common/maindb/pg.py +206 -111
  69. nucliadb/common/maindb/utils.py +11 -42
  70. nucliadb/common/models_utils/from_proto.py +479 -0
  71. nucliadb/common/models_utils/to_proto.py +60 -0
  72. nucliadb/common/nidx.py +260 -0
  73. nucliadb/export_import/datamanager.py +25 -19
  74. nucliadb/export_import/exporter.py +5 -11
  75. nucliadb/export_import/importer.py +5 -7
  76. nucliadb/export_import/models.py +3 -3
  77. nucliadb/export_import/tasks.py +4 -4
  78. nucliadb/export_import/utils.py +25 -37
  79. nucliadb/health.py +1 -3
  80. nucliadb/ingest/app.py +15 -11
  81. nucliadb/ingest/consumer/auditing.py +21 -19
  82. nucliadb/ingest/consumer/consumer.py +82 -47
  83. nucliadb/ingest/consumer/materializer.py +5 -12
  84. nucliadb/ingest/consumer/pull.py +12 -27
  85. nucliadb/ingest/consumer/service.py +19 -17
  86. nucliadb/ingest/consumer/shard_creator.py +2 -4
  87. nucliadb/ingest/consumer/utils.py +1 -3
  88. nucliadb/ingest/fields/base.py +137 -105
  89. nucliadb/ingest/fields/conversation.py +18 -5
  90. nucliadb/ingest/fields/exceptions.py +1 -4
  91. nucliadb/ingest/fields/file.py +7 -16
  92. nucliadb/ingest/fields/link.py +5 -10
  93. nucliadb/ingest/fields/text.py +9 -4
  94. nucliadb/ingest/orm/brain.py +200 -213
  95. nucliadb/ingest/orm/broker_message.py +181 -0
  96. nucliadb/ingest/orm/entities.py +36 -51
  97. nucliadb/ingest/orm/exceptions.py +12 -0
  98. nucliadb/ingest/orm/knowledgebox.py +322 -197
  99. nucliadb/ingest/orm/processor/__init__.py +2 -700
  100. nucliadb/ingest/orm/processor/auditing.py +4 -23
  101. nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
  102. nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
  103. nucliadb/ingest/orm/processor/processor.py +752 -0
  104. nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
  105. nucliadb/ingest/orm/resource.py +249 -402
  106. nucliadb/ingest/orm/utils.py +4 -4
  107. nucliadb/ingest/partitions.py +3 -9
  108. nucliadb/ingest/processing.py +64 -73
  109. nucliadb/ingest/py.typed +0 -0
  110. nucliadb/ingest/serialize.py +37 -167
  111. nucliadb/ingest/service/__init__.py +1 -3
  112. nucliadb/ingest/service/writer.py +185 -412
  113. nucliadb/ingest/settings.py +10 -20
  114. nucliadb/ingest/utils.py +3 -6
  115. nucliadb/learning_proxy.py +242 -55
  116. nucliadb/metrics_exporter.py +30 -19
  117. nucliadb/middleware/__init__.py +1 -3
  118. nucliadb/migrator/command.py +1 -3
  119. nucliadb/migrator/datamanager.py +13 -13
  120. nucliadb/migrator/migrator.py +47 -30
  121. nucliadb/migrator/utils.py +18 -10
  122. nucliadb/purge/__init__.py +139 -33
  123. nucliadb/purge/orphan_shards.py +7 -13
  124. nucliadb/reader/__init__.py +1 -3
  125. nucliadb/reader/api/models.py +1 -12
  126. nucliadb/reader/api/v1/__init__.py +0 -1
  127. nucliadb/reader/api/v1/download.py +21 -88
  128. nucliadb/reader/api/v1/export_import.py +1 -1
  129. nucliadb/reader/api/v1/knowledgebox.py +10 -10
  130. nucliadb/reader/api/v1/learning_config.py +2 -6
  131. nucliadb/reader/api/v1/resource.py +62 -88
  132. nucliadb/reader/api/v1/services.py +64 -83
  133. nucliadb/reader/app.py +12 -29
  134. nucliadb/reader/lifecycle.py +18 -4
  135. nucliadb/reader/py.typed +0 -0
  136. nucliadb/reader/reader/notifications.py +10 -28
  137. nucliadb/search/__init__.py +1 -3
  138. nucliadb/search/api/v1/__init__.py +1 -2
  139. nucliadb/search/api/v1/ask.py +17 -10
  140. nucliadb/search/api/v1/catalog.py +184 -0
  141. nucliadb/search/api/v1/feedback.py +16 -24
  142. nucliadb/search/api/v1/find.py +36 -36
  143. nucliadb/search/api/v1/knowledgebox.py +89 -60
  144. nucliadb/search/api/v1/resource/ask.py +2 -8
  145. nucliadb/search/api/v1/resource/search.py +49 -70
  146. nucliadb/search/api/v1/search.py +44 -210
  147. nucliadb/search/api/v1/suggest.py +39 -54
  148. nucliadb/search/app.py +12 -32
  149. nucliadb/search/lifecycle.py +10 -3
  150. nucliadb/search/predict.py +136 -187
  151. nucliadb/search/py.typed +0 -0
  152. nucliadb/search/requesters/utils.py +25 -58
  153. nucliadb/search/search/cache.py +149 -20
  154. nucliadb/search/search/chat/ask.py +571 -123
  155. nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -14
  156. nucliadb/search/search/chat/images.py +41 -17
  157. nucliadb/search/search/chat/prompt.py +817 -266
  158. nucliadb/search/search/chat/query.py +213 -309
  159. nucliadb/{tests/migrations/__init__.py → search/search/cut.py} +8 -8
  160. nucliadb/search/search/fetch.py +43 -36
  161. nucliadb/search/search/filters.py +9 -15
  162. nucliadb/search/search/find.py +214 -53
  163. nucliadb/search/search/find_merge.py +408 -391
  164. nucliadb/search/search/hydrator.py +191 -0
  165. nucliadb/search/search/merge.py +187 -223
  166. nucliadb/search/search/metrics.py +73 -2
  167. nucliadb/search/search/paragraphs.py +64 -106
  168. nucliadb/search/search/pgcatalog.py +233 -0
  169. nucliadb/search/search/predict_proxy.py +1 -1
  170. nucliadb/search/search/query.py +305 -150
  171. nucliadb/search/search/query_parser/exceptions.py +22 -0
  172. nucliadb/search/search/query_parser/models.py +101 -0
  173. nucliadb/search/search/query_parser/parser.py +183 -0
  174. nucliadb/search/search/rank_fusion.py +204 -0
  175. nucliadb/search/search/rerankers.py +270 -0
  176. nucliadb/search/search/shards.py +3 -32
  177. nucliadb/search/search/summarize.py +7 -18
  178. nucliadb/search/search/utils.py +27 -4
  179. nucliadb/search/settings.py +15 -1
  180. nucliadb/standalone/api_router.py +4 -10
  181. nucliadb/standalone/app.py +8 -14
  182. nucliadb/standalone/auth.py +7 -21
  183. nucliadb/standalone/config.py +7 -10
  184. nucliadb/standalone/lifecycle.py +26 -25
  185. nucliadb/standalone/migrations.py +1 -3
  186. nucliadb/standalone/purge.py +1 -1
  187. nucliadb/standalone/py.typed +0 -0
  188. nucliadb/standalone/run.py +3 -6
  189. nucliadb/standalone/settings.py +9 -16
  190. nucliadb/standalone/versions.py +15 -5
  191. nucliadb/tasks/consumer.py +8 -12
  192. nucliadb/tasks/producer.py +7 -6
  193. nucliadb/tests/config.py +53 -0
  194. nucliadb/train/__init__.py +1 -3
  195. nucliadb/train/api/utils.py +1 -2
  196. nucliadb/train/api/v1/shards.py +1 -1
  197. nucliadb/train/api/v1/trainset.py +2 -4
  198. nucliadb/train/app.py +10 -31
  199. nucliadb/train/generator.py +10 -19
  200. nucliadb/train/generators/field_classifier.py +7 -19
  201. nucliadb/train/generators/field_streaming.py +156 -0
  202. nucliadb/train/generators/image_classifier.py +12 -18
  203. nucliadb/train/generators/paragraph_classifier.py +5 -9
  204. nucliadb/train/generators/paragraph_streaming.py +6 -9
  205. nucliadb/train/generators/question_answer_streaming.py +19 -20
  206. nucliadb/train/generators/sentence_classifier.py +9 -15
  207. nucliadb/train/generators/token_classifier.py +48 -39
  208. nucliadb/train/generators/utils.py +14 -18
  209. nucliadb/train/lifecycle.py +7 -3
  210. nucliadb/train/nodes.py +23 -32
  211. nucliadb/train/py.typed +0 -0
  212. nucliadb/train/servicer.py +13 -21
  213. nucliadb/train/settings.py +2 -6
  214. nucliadb/train/types.py +13 -10
  215. nucliadb/train/upload.py +3 -6
  216. nucliadb/train/uploader.py +19 -23
  217. nucliadb/train/utils.py +1 -1
  218. nucliadb/writer/__init__.py +1 -3
  219. nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
  220. nucliadb/writer/api/v1/export_import.py +67 -14
  221. nucliadb/writer/api/v1/field.py +16 -269
  222. nucliadb/writer/api/v1/knowledgebox.py +218 -68
  223. nucliadb/writer/api/v1/resource.py +68 -88
  224. nucliadb/writer/api/v1/services.py +51 -70
  225. nucliadb/writer/api/v1/slug.py +61 -0
  226. nucliadb/writer/api/v1/transaction.py +67 -0
  227. nucliadb/writer/api/v1/upload.py +114 -113
  228. nucliadb/writer/app.py +6 -43
  229. nucliadb/writer/back_pressure.py +16 -38
  230. nucliadb/writer/exceptions.py +0 -4
  231. nucliadb/writer/lifecycle.py +21 -15
  232. nucliadb/writer/py.typed +0 -0
  233. nucliadb/writer/resource/audit.py +2 -1
  234. nucliadb/writer/resource/basic.py +48 -46
  235. nucliadb/writer/resource/field.py +25 -127
  236. nucliadb/writer/resource/origin.py +1 -2
  237. nucliadb/writer/settings.py +6 -2
  238. nucliadb/writer/tus/__init__.py +17 -15
  239. nucliadb/writer/tus/azure.py +111 -0
  240. nucliadb/writer/tus/dm.py +17 -5
  241. nucliadb/writer/tus/exceptions.py +1 -3
  242. nucliadb/writer/tus/gcs.py +49 -84
  243. nucliadb/writer/tus/local.py +21 -37
  244. nucliadb/writer/tus/s3.py +28 -68
  245. nucliadb/writer/tus/storage.py +5 -56
  246. nucliadb/writer/vectorsets.py +125 -0
  247. nucliadb-6.2.1.post2777.dist-info/METADATA +148 -0
  248. nucliadb-6.2.1.post2777.dist-info/RECORD +343 -0
  249. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2777.dist-info}/WHEEL +1 -1
  250. nucliadb/common/maindb/redis.py +0 -194
  251. nucliadb/common/maindb/tikv.py +0 -433
  252. nucliadb/ingest/fields/layout.py +0 -58
  253. nucliadb/ingest/tests/conftest.py +0 -30
  254. nucliadb/ingest/tests/fixtures.py +0 -764
  255. nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
  256. nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -78
  257. nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -126
  258. nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
  259. nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
  260. nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
  261. nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -684
  262. nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
  263. nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
  264. nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
  265. nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -139
  266. nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
  267. nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
  268. nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -140
  269. nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
  270. nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
  271. nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
  272. nucliadb/ingest/tests/unit/orm/test_brain_vectors.py +0 -74
  273. nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
  274. nucliadb/ingest/tests/unit/orm/test_resource.py +0 -331
  275. nucliadb/ingest/tests/unit/test_cache.py +0 -31
  276. nucliadb/ingest/tests/unit/test_partitions.py +0 -40
  277. nucliadb/ingest/tests/unit/test_processing.py +0 -171
  278. nucliadb/middleware/transaction.py +0 -117
  279. nucliadb/reader/api/v1/learning_collector.py +0 -63
  280. nucliadb/reader/tests/__init__.py +0 -19
  281. nucliadb/reader/tests/conftest.py +0 -31
  282. nucliadb/reader/tests/fixtures.py +0 -136
  283. nucliadb/reader/tests/test_list_resources.py +0 -75
  284. nucliadb/reader/tests/test_reader_file_download.py +0 -273
  285. nucliadb/reader/tests/test_reader_resource.py +0 -353
  286. nucliadb/reader/tests/test_reader_resource_field.py +0 -219
  287. nucliadb/search/api/v1/chat.py +0 -263
  288. nucliadb/search/api/v1/resource/chat.py +0 -174
  289. nucliadb/search/tests/__init__.py +0 -19
  290. nucliadb/search/tests/conftest.py +0 -33
  291. nucliadb/search/tests/fixtures.py +0 -199
  292. nucliadb/search/tests/node.py +0 -466
  293. nucliadb/search/tests/unit/__init__.py +0 -18
  294. nucliadb/search/tests/unit/api/__init__.py +0 -19
  295. nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
  296. nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
  297. nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -98
  298. nucliadb/search/tests/unit/api/v1/test_ask.py +0 -120
  299. nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
  300. nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
  301. nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -99
  302. nucliadb/search/tests/unit/search/__init__.py +0 -18
  303. nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
  304. nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -211
  305. nucliadb/search/tests/unit/search/search/__init__.py +0 -19
  306. nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
  307. nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
  308. nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -270
  309. nucliadb/search/tests/unit/search/test_fetch.py +0 -108
  310. nucliadb/search/tests/unit/search/test_filters.py +0 -125
  311. nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
  312. nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
  313. nucliadb/search/tests/unit/search/test_query.py +0 -153
  314. nucliadb/search/tests/unit/test_app.py +0 -79
  315. nucliadb/search/tests/unit/test_find_merge.py +0 -112
  316. nucliadb/search/tests/unit/test_merge.py +0 -34
  317. nucliadb/search/tests/unit/test_predict.py +0 -525
  318. nucliadb/standalone/tests/__init__.py +0 -19
  319. nucliadb/standalone/tests/conftest.py +0 -33
  320. nucliadb/standalone/tests/fixtures.py +0 -38
  321. nucliadb/standalone/tests/unit/__init__.py +0 -18
  322. nucliadb/standalone/tests/unit/test_api_router.py +0 -61
  323. nucliadb/standalone/tests/unit/test_auth.py +0 -169
  324. nucliadb/standalone/tests/unit/test_introspect.py +0 -35
  325. nucliadb/standalone/tests/unit/test_migrations.py +0 -63
  326. nucliadb/standalone/tests/unit/test_versions.py +0 -68
  327. nucliadb/tests/benchmarks/__init__.py +0 -19
  328. nucliadb/tests/benchmarks/test_search.py +0 -99
  329. nucliadb/tests/conftest.py +0 -32
  330. nucliadb/tests/fixtures.py +0 -735
  331. nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -202
  332. nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -107
  333. nucliadb/tests/migrations/test_migration_0017.py +0 -76
  334. nucliadb/tests/migrations/test_migration_0018.py +0 -95
  335. nucliadb/tests/tikv.py +0 -240
  336. nucliadb/tests/unit/__init__.py +0 -19
  337. nucliadb/tests/unit/common/__init__.py +0 -19
  338. nucliadb/tests/unit/common/cluster/__init__.py +0 -19
  339. nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
  340. nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -172
  341. nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
  342. nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -114
  343. nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -61
  344. nucliadb/tests/unit/common/cluster/test_cluster.py +0 -408
  345. nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -173
  346. nucliadb/tests/unit/common/cluster/test_rebalance.py +0 -38
  347. nucliadb/tests/unit/common/cluster/test_rollover.py +0 -282
  348. nucliadb/tests/unit/common/maindb/__init__.py +0 -18
  349. nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
  350. nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
  351. nucliadb/tests/unit/common/maindb/test_utils.py +0 -92
  352. nucliadb/tests/unit/common/test_context.py +0 -36
  353. nucliadb/tests/unit/export_import/__init__.py +0 -19
  354. nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
  355. nucliadb/tests/unit/export_import/test_utils.py +0 -301
  356. nucliadb/tests/unit/migrator/__init__.py +0 -19
  357. nucliadb/tests/unit/migrator/test_migrator.py +0 -87
  358. nucliadb/tests/unit/tasks/__init__.py +0 -19
  359. nucliadb/tests/unit/tasks/conftest.py +0 -42
  360. nucliadb/tests/unit/tasks/test_consumer.py +0 -92
  361. nucliadb/tests/unit/tasks/test_producer.py +0 -95
  362. nucliadb/tests/unit/tasks/test_tasks.py +0 -58
  363. nucliadb/tests/unit/test_field_ids.py +0 -49
  364. nucliadb/tests/unit/test_health.py +0 -86
  365. nucliadb/tests/unit/test_kb_slugs.py +0 -54
  366. nucliadb/tests/unit/test_learning_proxy.py +0 -252
  367. nucliadb/tests/unit/test_metrics_exporter.py +0 -77
  368. nucliadb/tests/unit/test_purge.py +0 -136
  369. nucliadb/tests/utils/__init__.py +0 -74
  370. nucliadb/tests/utils/aiohttp_session.py +0 -44
  371. nucliadb/tests/utils/broker_messages/__init__.py +0 -171
  372. nucliadb/tests/utils/broker_messages/fields.py +0 -197
  373. nucliadb/tests/utils/broker_messages/helpers.py +0 -33
  374. nucliadb/tests/utils/entities.py +0 -78
  375. nucliadb/train/api/v1/check.py +0 -60
  376. nucliadb/train/tests/__init__.py +0 -19
  377. nucliadb/train/tests/conftest.py +0 -29
  378. nucliadb/train/tests/fixtures.py +0 -342
  379. nucliadb/train/tests/test_field_classification.py +0 -122
  380. nucliadb/train/tests/test_get_entities.py +0 -80
  381. nucliadb/train/tests/test_get_info.py +0 -51
  382. nucliadb/train/tests/test_get_ontology.py +0 -34
  383. nucliadb/train/tests/test_get_ontology_count.py +0 -63
  384. nucliadb/train/tests/test_image_classification.py +0 -221
  385. nucliadb/train/tests/test_list_fields.py +0 -39
  386. nucliadb/train/tests/test_list_paragraphs.py +0 -73
  387. nucliadb/train/tests/test_list_resources.py +0 -39
  388. nucliadb/train/tests/test_list_sentences.py +0 -71
  389. nucliadb/train/tests/test_paragraph_classification.py +0 -123
  390. nucliadb/train/tests/test_paragraph_streaming.py +0 -118
  391. nucliadb/train/tests/test_question_answer_streaming.py +0 -239
  392. nucliadb/train/tests/test_sentence_classification.py +0 -143
  393. nucliadb/train/tests/test_token_classification.py +0 -136
  394. nucliadb/train/tests/utils.py +0 -101
  395. nucliadb/writer/layouts/__init__.py +0 -51
  396. nucliadb/writer/layouts/v1.py +0 -59
  397. nucliadb/writer/tests/__init__.py +0 -19
  398. nucliadb/writer/tests/conftest.py +0 -31
  399. nucliadb/writer/tests/fixtures.py +0 -191
  400. nucliadb/writer/tests/test_fields.py +0 -475
  401. nucliadb/writer/tests/test_files.py +0 -740
  402. nucliadb/writer/tests/test_knowledgebox.py +0 -49
  403. nucliadb/writer/tests/test_reprocess_file_field.py +0 -133
  404. nucliadb/writer/tests/test_resources.py +0 -476
  405. nucliadb/writer/tests/test_service.py +0 -137
  406. nucliadb/writer/tests/test_tus.py +0 -203
  407. nucliadb/writer/tests/utils.py +0 -35
  408. nucliadb/writer/tus/pg.py +0 -125
  409. nucliadb-4.0.0.post542.dist-info/METADATA +0 -135
  410. nucliadb-4.0.0.post542.dist-info/RECORD +0 -462
  411. {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
  412. /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
  413. /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
  414. /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
  415. /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
  416. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2777.dist-info}/entry_points.txt +0 -0
  417. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2777.dist-info}/top_level.txt +0 -0
  418. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2777.dist-info}/zip-safe +0 -0
@@ -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
@@ -62,9 +62,7 @@ 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(
@@ -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
 
@@ -124,9 +120,7 @@ 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(
@@ -164,63 +158,6 @@ 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
- summary="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
- summary="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"],
@@ -237,9 +174,7 @@ 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(
@@ -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
 
@@ -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,
@@ -46,10 +46,10 @@ 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
 
@@ -64,15 +64,15 @@ 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
 
@@ -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
  )
@@ -44,9 +44,7 @@ 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(
@@ -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")
@@ -22,22 +22,21 @@ from typing import Optional, Union
22
22
  from fastapi import Header, HTTPException, Query, Request, Response
23
23
  from fastapi_versioning import version
24
24
 
25
- import nucliadb_models as models
25
+ from nucliadb.common.datamanagers.resources import KB_RESOURCE_SLUG_BASE
26
26
  from nucliadb.common.maindb.utils import get_driver
27
+ from nucliadb.common.models_utils import from_proto, to_proto
27
28
  from nucliadb.ingest.fields.conversation import Conversation
28
29
  from nucliadb.ingest.orm.knowledgebox import KnowledgeBox as ORMKnowledgeBox
29
- from nucliadb.ingest.orm.resource import KB_RESOURCE_SLUG_BASE
30
30
  from nucliadb.ingest.orm.resource import Resource as ORMResource
31
31
  from nucliadb.ingest.serialize import (
32
32
  managed_serialize,
33
33
  serialize,
34
34
  set_resource_field_extracted_data,
35
35
  )
36
- from nucliadb.reader import SERVICE_NAME # type: ignore
36
+ from nucliadb.reader import SERVICE_NAME
37
37
  from nucliadb.reader.api import DEFAULT_RESOURCE_LIST_PAGE_SIZE
38
38
  from nucliadb.reader.api.models import (
39
39
  FIELD_NAME_TO_EXTRACTED_DATA_FIELD_MAP,
40
- FIELD_NAMES_TO_PB_TYPE_MAP,
41
40
  ResourceField,
42
41
  )
43
42
  from nucliadb.reader.api.v1.router import KB_PREFIX, RESOURCE_PREFIX, RSLUG_PREFIX, api
@@ -77,60 +76,55 @@ async def list_resources(
77
76
 
78
77
  # Get counters from maindb
79
78
  driver = get_driver()
80
- txn = await driver.begin()
81
-
82
- # Filter parameters for serializer
83
- show: list[ResourceProperties] = [ResourceProperties.BASIC]
84
- field_types: list[FieldTypeName] = []
85
- extracted: list[ExtractedDataTypeName] = []
86
-
87
- try:
88
- resources: list[Resource] = []
89
- max_items_to_iterate = (page + 1) * size
90
- first_wanted_item_index = (page * size) + 1 # 1-based index
91
- current_key_index = 0
92
-
93
- # ask for one item more than we need, in order to know if it's the last page
94
- keys_generator = txn.keys(
95
- match=KB_RESOURCE_SLUG_BASE.format(kbid=kbid),
96
- count=max_items_to_iterate + 1,
97
- )
98
- async for key in keys_generator:
99
- current_key_index += 1
100
-
101
- # First of all, we need to skip keys, in case we are on a +1 page
102
- if page > 0 and current_key_index < first_wanted_item_index:
103
- continue
104
-
105
- # Don't fetch keys once we got all items for this
106
- if len(resources) == size:
107
- await keys_generator.aclose()
108
- break
109
-
110
- # Fetch and Add wanted item
111
- rid = await txn.get(key)
112
- if rid:
113
- result = await managed_serialize(
114
- txn,
115
- kbid,
116
- rid.decode(),
117
- show,
118
- field_types,
119
- extracted,
120
- service_name=SERVICE_NAME,
121
- )
122
- if result is not None:
123
- resources.append(result)
124
-
125
- is_last_page = current_key_index <= max_items_to_iterate
126
-
127
- except Exception as exc:
128
- errors.capture_exception(exc)
129
- raise HTTPException(
130
- status_code=500, detail="Couldn't retrieve list of resources right now"
131
- )
132
- finally:
133
- await txn.abort()
79
+ async with driver.transaction(read_only=True) as txn:
80
+ # Filter parameters for serializer
81
+ show: list[ResourceProperties] = [ResourceProperties.BASIC]
82
+ field_types: list[FieldTypeName] = []
83
+ extracted: list[ExtractedDataTypeName] = []
84
+
85
+ try:
86
+ resources: list[Resource] = []
87
+ max_items_to_iterate = (page + 1) * size
88
+ first_wanted_item_index = (page * size) + 1 # 1-based index
89
+ current_key_index = 0
90
+
91
+ # ask for one item more than we need, in order to know if it's the last page
92
+ keys_generator = txn.keys(
93
+ match=KB_RESOURCE_SLUG_BASE.format(kbid=kbid),
94
+ count=max_items_to_iterate + 1,
95
+ )
96
+ async for key in keys_generator:
97
+ current_key_index += 1
98
+
99
+ # First of all, we need to skip keys, in case we are on a +1 page
100
+ if page > 0 and current_key_index < first_wanted_item_index:
101
+ continue
102
+
103
+ # Don't fetch keys once we got all items for this
104
+ if len(resources) == size:
105
+ await keys_generator.aclose()
106
+ break
107
+
108
+ # Fetch and Add wanted item
109
+ rid = await txn.get(key, for_update=False)
110
+ if rid:
111
+ result = await managed_serialize(
112
+ txn,
113
+ kbid,
114
+ rid.decode(),
115
+ show,
116
+ field_types,
117
+ extracted,
118
+ service_name=SERVICE_NAME,
119
+ )
120
+ if result is not None:
121
+ resources.append(result)
122
+
123
+ is_last_page = current_key_index <= max_items_to_iterate
124
+
125
+ except Exception as exc:
126
+ errors.capture_exception(exc)
127
+ raise HTTPException(status_code=500, detail="Couldn't retrieve list of resources right now")
134
128
 
135
129
  return ResourceList(
136
130
  resources=resources,
@@ -153,9 +147,7 @@ async def get_resource_by_uuid(
153
147
  kbid: str,
154
148
  rid: str,
155
149
  show: list[ResourceProperties] = Query([ResourceProperties.BASIC]),
156
- field_type_filter: list[FieldTypeName] = Query(
157
- list(FieldTypeName), alias="field_type"
158
- ),
150
+ field_type_filter: list[FieldTypeName] = Query(list(FieldTypeName), alias="field_type"),
159
151
  extracted: list[ExtractedDataTypeName] = Query(
160
152
  [
161
153
  ExtractedDataTypeName.TEXT,
@@ -193,9 +185,7 @@ async def get_resource_by_slug(
193
185
  kbid: str,
194
186
  rslug: str,
195
187
  show: list[ResourceProperties] = Query([ResourceProperties.BASIC]),
196
- field_type_filter: list[FieldTypeName] = Query(
197
- list(FieldTypeName), alias="field_type"
198
- ),
188
+ field_type_filter: list[FieldTypeName] = Query(list(FieldTypeName), alias="field_type"),
199
189
  extracted: list[ExtractedDataTypeName] = Query(
200
190
  [
201
191
  ExtractedDataTypeName.TEXT,
@@ -235,7 +225,7 @@ async def _get_resource(
235
225
  audit = get_audit()
236
226
  if audit is not None:
237
227
  audit_id = rid if rid else rslug
238
- await audit.visited(kbid, audit_id, x_nucliadb_user, x_forwarded_for) # type: ignore
228
+ audit.visited(kbid, audit_id, x_nucliadb_user, x_forwarded_for) # type: ignore
239
229
 
240
230
  result = await serialize(
241
231
  kbid,
@@ -343,9 +333,7 @@ async def _get_resource_field(
343
333
  ) -> Response:
344
334
  storage = await get_storage(service_name=SERVICE_NAME)
345
335
  driver = get_driver()
346
-
347
- pb_field_id = FIELD_NAMES_TO_PB_TYPE_MAP[field_type]
348
-
336
+ pb_field_id = to_proto.field_type_name(field_type)
349
337
  async with driver.transaction() as txn:
350
338
  kb = ORMKnowledgeBox(txn, storage, kbid)
351
339
 
@@ -360,34 +348,22 @@ async def _get_resource_field(
360
348
  if field is None:
361
349
  raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
362
350
 
363
- resource_field = ResourceField(field_id=field_id, field_type=field_type) # type: ignore
351
+ resource_field = ResourceField(field_id=field_id, field_type=field_type)
364
352
 
365
353
  if ResourceFieldProperties.VALUE in show:
366
354
  value = await field.get_value()
367
355
 
368
356
  if isinstance(value, resources_pb2.FieldText):
369
357
  value = await field.get_value()
370
- resource_field.value = models.FieldText.from_message(value)
358
+ resource_field.value = from_proto.field_text(value)
371
359
 
372
360
  if isinstance(value, resources_pb2.FieldFile):
373
361
  value = await field.get_value()
374
- resource_field.value = models.FieldFile.from_message(value)
362
+ resource_field.value = from_proto.field_file(value)
375
363
 
376
364
  if isinstance(value, resources_pb2.FieldLink):
377
365
  value = await field.get_value()
378
- resource_field.value = models.FieldLink.from_message(value)
379
-
380
- if isinstance(value, resources_pb2.FieldLayout):
381
- value = await field.get_value()
382
- resource_field.value = models.FieldLayout.from_message(value)
383
-
384
- if isinstance(value, resources_pb2.FieldDatetime):
385
- value = await field.get_value()
386
- resource_field.value = models.FieldDatetime.from_message(value)
387
-
388
- if isinstance(value, resources_pb2.FieldKeywordset):
389
- value = await field.get_value()
390
- resource_field.value = models.FieldKeywordset.from_message(value)
366
+ resource_field.value = from_proto.field_link(value)
391
367
 
392
368
  if isinstance(field, Conversation):
393
369
  if page == "first":
@@ -400,12 +376,10 @@ async def _get_resource_field(
400
376
 
401
377
  value = await field.get_value(page=page_to_fetch)
402
378
  if value is not None:
403
- resource_field.value = models.Conversation.from_message(value)
379
+ resource_field.value = from_proto.conversation(value)
404
380
 
405
381
  if ResourceFieldProperties.EXTRACTED in show and extracted:
406
- resource_field.extracted = FIELD_NAME_TO_EXTRACTED_DATA_FIELD_MAP[
407
- field_type
408
- ]()
382
+ resource_field.extracted = FIELD_NAME_TO_EXTRACTED_DATA_FIELD_MAP[field_type]()
409
383
  await set_resource_field_extracted_data(
410
384
  field,
411
385
  resource_field.extracted,