nucliadb 4.0.0.post542__py3-none-any.whl → 6.2.1.post2798__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 -403
  106. nucliadb/ingest/orm/utils.py +4 -4
  107. nucliadb/ingest/partitions.py +3 -9
  108. nucliadb/ingest/processing.py +70 -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 +143 -117
  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 +37 -128
  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.post2798.dist-info/METADATA +148 -0
  248. nucliadb-6.2.1.post2798.dist-info/RECORD +343 -0
  249. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.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.post2798.dist-info}/entry_points.txt +0 -0
  417. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/top_level.txt +0 -0
  418. {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/zip-safe +0 -0
@@ -17,6 +17,7 @@
17
17
  # You should have received a copy of the GNU Affero General Public License
18
18
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
  #
20
+ from datetime import datetime
20
21
  from typing import AsyncGenerator
21
22
  from uuid import uuid4
22
23
 
@@ -29,24 +30,32 @@ from nucliadb.common.context import ApplicationContext
29
30
  from nucliadb.common.context.fastapi import get_app_context
30
31
  from nucliadb.export_import import importer
31
32
  from nucliadb.export_import.datamanager import ExportImportDataManager
32
- from nucliadb.export_import.exceptions import IncompatibleExport
33
+ from nucliadb.export_import.exceptions import (
34
+ IncompatibleExport,
35
+ )
33
36
  from nucliadb.export_import.models import (
34
37
  ExportMetadata,
35
38
  ImportMetadata,
36
39
  NatsTaskMessage,
37
40
  )
38
41
  from nucliadb.export_import.tasks import get_exports_producer, get_imports_producer
39
- from nucliadb.export_import.utils import stream_compatible_with_kb
42
+ from nucliadb.export_import.utils import ExportStreamReader, stream_compatible_with_kb
40
43
  from nucliadb.models.responses import HTTPClientError
41
44
  from nucliadb.writer import logger
42
- from nucliadb.writer.api.v1.router import KB_PREFIX, api
45
+ from nucliadb.writer.api.utils import only_for_onprem
46
+ from nucliadb.writer.api.v1.knowledgebox import create_kb
47
+ from nucliadb.writer.api.v1.router import KB_PREFIX, KBS_PREFIX, api
43
48
  from nucliadb.writer.back_pressure import maybe_back_pressure
44
49
  from nucliadb_models.export_import import (
45
50
  CreateExportResponse,
46
51
  CreateImportResponse,
52
+ NewImportedKbResponse,
47
53
  Status,
48
54
  )
49
- from nucliadb_models.resource import NucliaDBRoles
55
+ from nucliadb_models.resource import (
56
+ KnowledgeBoxConfig,
57
+ NucliaDBRoles,
58
+ )
50
59
  from nucliadb_telemetry import errors
51
60
  from nucliadb_utils.authentication import requires_one
52
61
 
@@ -75,6 +84,56 @@ async def start_kb_export_endpoint(request: Request, kbid: str):
75
84
  return CreateExportResponse(export_id=export_id)
76
85
 
77
86
 
87
+ @only_for_onprem
88
+ @api.post(
89
+ f"/{KBS_PREFIX}/import",
90
+ summary="Create a KB from an export and import its content",
91
+ tags=["Knowledge Boxes"],
92
+ response_model=NewImportedKbResponse,
93
+ openapi_extra={"x-hidden-operation": True},
94
+ )
95
+ @requires_one([NucliaDBRoles.MANAGER, NucliaDBRoles.WRITER])
96
+ @version(1)
97
+ async def kb_create_and_import_endpoint(request: Request):
98
+ context = get_app_context(request.app)
99
+
100
+ # Read stream and parse learning configuration
101
+ stream = request.stream()
102
+ stream_reader = ExportStreamReader(stream)
103
+ learning_config, leftover_bytes = await stream_reader.maybe_read_learning_config()
104
+ if learning_config is None:
105
+ return HTTPClientError(
106
+ status_code=400,
107
+ detail="Trying to import an export missing learning config. Try using import on an existing KB or use a newer export",
108
+ )
109
+
110
+ # Create a KB with the import learning config
111
+
112
+ now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
113
+ import_kb_config = KnowledgeBoxConfig(
114
+ title=f"Imported KB - {now}",
115
+ learning_configuration=learning_config.dict(),
116
+ )
117
+ kbid, slug = await create_kb(import_kb_config)
118
+
119
+ # Import contents to the new KB
120
+
121
+ async def stream_with_leftovers(leftovers: bytes, stream: AsyncGenerator[bytes, None]):
122
+ if len(leftovers) > 0:
123
+ yield leftovers
124
+ async for chunk in stream:
125
+ yield chunk
126
+
127
+ await importer.import_kb(
128
+ context=context, kbid=kbid, stream=stream_with_leftovers(leftover_bytes, stream)
129
+ )
130
+
131
+ return NewImportedKbResponse(
132
+ kbid=kbid,
133
+ slug=slug,
134
+ )
135
+
136
+
78
137
  @api.post(
79
138
  f"/{KB_PREFIX}/{{kbid}}/import",
80
139
  status_code=200,
@@ -139,30 +198,24 @@ async def start_export_task(context: ApplicationContext, kbid: str, export_id: s
139
198
  producer = await get_exports_producer(context)
140
199
  msg = NatsTaskMessage(kbid=kbid, id=export_id)
141
200
  seqid = await producer(msg) # type: ignore
142
- logger.info(
143
- f"Export task produced. seqid={seqid} kbid={kbid} export_id={export_id}"
144
- )
201
+ logger.info(f"Export task produced. seqid={seqid} kbid={kbid} export_id={export_id}")
145
202
  except Exception as e:
146
203
  errors.capture_exception(e)
147
204
  await dm.delete_metadata("export", metadata)
148
205
  raise
149
206
 
150
207
 
151
- async def start_import_task(
152
- context: ApplicationContext, kbid: str, import_id: str, import_size: int
153
- ):
208
+ async def start_import_task(context: ApplicationContext, kbid: str, import_id: str, import_size: int):
154
209
  dm = ExportImportDataManager(context.kv_driver, context.blob_storage)
155
210
  metadata = ImportMetadata(kbid=kbid, id=import_id)
156
211
  metadata.task.status = Status.SCHEDULED
157
- metadata.total = import_size
212
+ metadata.total = import_size or 0
158
213
  await dm.set_metadata("import", metadata)
159
214
  try:
160
215
  producer = await get_imports_producer(context)
161
216
  msg = NatsTaskMessage(kbid=kbid, id=import_id)
162
217
  seqid = await producer(msg) # type: ignore
163
- logger.info(
164
- f"Import task produced. seqid={seqid} kbid={kbid} import_id={import_id}"
165
- )
218
+ logger.info(f"Import task produced. seqid={seqid} kbid={kbid} import_id={import_id}")
166
219
  except Exception as e:
167
220
  errors.capture_exception(e)
168
221
  await dm.delete_metadata("import", metadata)
@@ -21,9 +21,7 @@ from inspect import iscoroutinefunction
21
21
  from typing import TYPE_CHECKING, Callable, Optional, Type, Union
22
22
 
23
23
  from fastapi import HTTPException, Response
24
- from fastapi_versioning import version # type: ignore
25
- from nucliadb_protos.resources_pb2 import FieldID, Metadata
26
- from nucliadb_protos.writer_pb2 import BrokerMessage
24
+ from fastapi_versioning import version
27
25
  from starlette.requests import Request
28
26
 
29
27
  import nucliadb_models as models
@@ -36,6 +34,7 @@ from nucliadb.writer.api.constants import (
36
34
  X_FILE_PASSWORD,
37
35
  X_NUCLIADB_USER,
38
36
  )
37
+ from nucliadb.writer.api.v1 import transaction
39
38
  from nucliadb.writer.api.v1.resource import (
40
39
  get_rid_from_slug_or_raise_error,
41
40
  validate_rid_exists_or_raise_error,
@@ -46,10 +45,7 @@ from nucliadb.writer.resource.audit import parse_audit
46
45
  from nucliadb.writer.resource.field import (
47
46
  extract_file_field,
48
47
  parse_conversation_field,
49
- parse_datetime_field,
50
48
  parse_file_field,
51
- parse_keywordset_field,
52
- parse_layout_field,
53
49
  parse_link_field,
54
50
  parse_text_field,
55
51
  )
@@ -58,28 +54,23 @@ from nucliadb_models.resource import NucliaDBRoles
58
54
  from nucliadb_models.utils import FieldIdString
59
55
  from nucliadb_models.writer import ResourceFieldAdded, ResourceUpdated
60
56
  from nucliadb_protos import resources_pb2
57
+ from nucliadb_protos.resources_pb2 import FieldID, Metadata
58
+ from nucliadb_protos.writer_pb2 import BrokerMessage
61
59
  from nucliadb_utils.authentication import requires
62
60
  from nucliadb_utils.exceptions import LimitsExceededError, SendToProcessError
63
- from nucliadb_utils.transaction import TransactionCommitTimeoutError
64
61
  from nucliadb_utils.utilities import (
65
62
  get_partitioning,
66
63
  get_storage,
67
- get_transaction_utility,
68
64
  )
69
65
 
70
66
  if TYPE_CHECKING: # pragma: no cover
71
- FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP: dict[
72
- models.FieldTypeName, resources_pb2.FieldType.V
73
- ]
67
+ FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP: dict[models.FieldTypeName, resources_pb2.FieldType.ValueType]
74
68
  else:
75
69
  FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP: dict[models.FieldTypeName, int]
76
70
 
77
71
  FieldModelType = Union[
78
72
  models.TextField,
79
73
  models.LinkField,
80
- models.FieldKeywordset,
81
- models.FieldDatetime,
82
- models.InputLayoutField,
83
74
  models.InputConversationField,
84
75
  models.FileField,
85
76
  ]
@@ -87,10 +78,7 @@ FieldModelType = Union[
87
78
  FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP = {
88
79
  models.FieldTypeName.FILE: resources_pb2.FieldType.FILE,
89
80
  models.FieldTypeName.LINK: resources_pb2.FieldType.LINK,
90
- models.FieldTypeName.DATETIME: resources_pb2.FieldType.DATETIME,
91
- models.FieldTypeName.KEYWORDSET: resources_pb2.FieldType.KEYWORDSET,
92
81
  models.FieldTypeName.TEXT: resources_pb2.FieldType.TEXT,
93
- models.FieldTypeName.LAYOUT: resources_pb2.FieldType.LAYOUT,
94
82
  # models.FieldTypeName.GENERIC: resources_pb2.FieldType.GENERIC,
95
83
  models.FieldTypeName.CONVERSATION: resources_pb2.FieldType.CONVERSATION,
96
84
  }
@@ -128,24 +116,12 @@ async def add_field_to_resource(
128
116
 
129
117
  parse_field = FIELD_PARSERS_MAP[type(field_payload)]
130
118
  if iscoroutinefunction(parse_field):
131
- await parse_field(
132
- kbid, rid, field_id, field_payload, writer, toprocess, **parser_kwargs
133
- )
119
+ await parse_field(kbid, rid, field_id, field_payload, writer, toprocess, **parser_kwargs)
134
120
  else:
135
- parse_field(
136
- kbid, rid, field_id, field_payload, writer, toprocess, **parser_kwargs
137
- )
121
+ parse_field(kbid, rid, field_id, field_payload, writer, toprocess, **parser_kwargs)
138
122
 
139
- transaction = get_transaction_utility()
140
123
  processing = get_processing()
141
- try:
142
- writer.source = BrokerMessage.MessageSource.WRITER
143
- await transaction.commit(writer, partition, wait=True)
144
- except TransactionCommitTimeoutError:
145
- raise HTTPException(
146
- status_code=501,
147
- detail="Inconsistent write. This resource will not be processed and may not be stored.",
148
- )
124
+ await transaction.commit(writer, partition)
149
125
  try:
150
126
  processing_info = await processing.send_to_process(toprocess, partition)
151
127
  except LimitsExceededError as exc:
@@ -168,9 +144,7 @@ async def add_field_to_resource_by_slug(
168
144
  **parser_kwargs,
169
145
  ):
170
146
  rid = await get_rid_from_slug_or_raise_error(kbid, slug)
171
- return await add_field_to_resource(
172
- request, kbid, rid, field_id, field_payload, **parser_kwargs
173
- )
147
+ return await add_field_to_resource(request, kbid, rid, field_id, field_payload, **parser_kwargs)
174
148
 
175
149
 
176
150
  async def delete_resource_field(
@@ -183,8 +157,6 @@ async def delete_resource_field(
183
157
  await validate_rid_exists_or_raise_error(kbid, rid)
184
158
 
185
159
  partitioning = get_partitioning()
186
- transaction = get_transaction_utility()
187
-
188
160
  partition = partitioning.generate_partition(kbid, rid)
189
161
  writer = BrokerMessage()
190
162
 
@@ -197,15 +169,7 @@ async def delete_resource_field(
197
169
 
198
170
  writer.delete_fields.append(pb_field_id)
199
171
  parse_audit(writer.audit, request)
200
-
201
- try:
202
- await transaction.commit(writer, partition, wait=True)
203
- except TransactionCommitTimeoutError:
204
- raise HTTPException(
205
- status_code=501,
206
- detail="Inconsistent write. This resource will not be processed and may not be stored.",
207
- )
208
-
172
+ await transaction.commit(writer, partition)
209
173
  return Response(status_code=204)
210
174
 
211
175
 
@@ -251,41 +215,6 @@ def parse_link_field_adapter(
251
215
  return parse_link_field(field_id, field_payload, writer, toprocess)
252
216
 
253
217
 
254
- def parse_keywordset_field_adapter(
255
- _kbid: str,
256
- _rid: str,
257
- field_id: FieldIdString,
258
- field_payload: models.FieldKeywordset,
259
- writer: BrokerMessage,
260
- toprocess: PushPayload,
261
- ):
262
- return parse_keywordset_field(field_id, field_payload, writer, toprocess)
263
-
264
-
265
- def parse_datetime_field_adapter(
266
- _kbid: str,
267
- _rid: str,
268
- field_id: FieldIdString,
269
- field_payload: models.FieldDatetime,
270
- writer: BrokerMessage,
271
- toprocess: PushPayload,
272
- ):
273
- return parse_datetime_field(field_id, field_payload, writer, toprocess)
274
-
275
-
276
- async def parse_layout_field_adapter(
277
- kbid: str,
278
- rid: str,
279
- field_id: FieldIdString,
280
- field_payload: models.InputLayoutField,
281
- writer: BrokerMessage,
282
- toprocess: PushPayload,
283
- ):
284
- return await parse_layout_field(
285
- field_id, field_payload, writer, toprocess, kbid, rid
286
- )
287
-
288
-
289
218
  async def parse_conversation_field_adapter(
290
219
  kbid: str,
291
220
  rid: str,
@@ -294,9 +223,7 @@ async def parse_conversation_field_adapter(
294
223
  writer: BrokerMessage,
295
224
  toprocess: PushPayload,
296
225
  ):
297
- return await parse_conversation_field(
298
- field_id, field_payload, writer, toprocess, kbid, rid
299
- )
226
+ return await parse_conversation_field(field_id, field_payload, writer, toprocess, kbid, rid)
300
227
 
301
228
 
302
229
  async def parse_file_field_adapter(
@@ -316,9 +243,6 @@ async def parse_file_field_adapter(
316
243
  FIELD_PARSERS_MAP: dict[Type, Union[Callable]] = {
317
244
  models.TextField: parse_text_field_adapter,
318
245
  models.LinkField: parse_link_field_adapter,
319
- models.FieldKeywordset: parse_keywordset_field_adapter,
320
- models.FieldDatetime: parse_datetime_field_adapter,
321
- models.InputLayoutField: parse_layout_field_adapter,
322
246
  models.InputConversationField: parse_conversation_field_adapter,
323
247
  models.FileField: parse_file_field_adapter,
324
248
  }
@@ -343,9 +267,7 @@ async def add_resource_field_text_rslug_prefix(
343
267
  field_id: FieldIdString,
344
268
  field_payload: models.TextField,
345
269
  ) -> ResourceFieldAdded:
346
- return await add_field_to_resource_by_slug(
347
- request, kbid, rslug, field_id, field_payload
348
- )
270
+ return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field_payload)
349
271
 
350
272
 
351
273
  @api.put(
@@ -383,9 +305,7 @@ async def add_resource_field_link_rslug_prefix(
383
305
  field_id: FieldIdString,
384
306
  field_payload: models.LinkField,
385
307
  ) -> ResourceFieldAdded:
386
- return await add_field_to_resource_by_slug(
387
- request, kbid, rslug, field_id, field_payload
388
- )
308
+ return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field_payload)
389
309
 
390
310
 
391
311
  @api.put(
@@ -407,126 +327,6 @@ async def add_resource_field_link_rid_prefix(
407
327
  return await add_field_to_resource(request, kbid, rid, field_id, field_payload)
408
328
 
409
329
 
410
- @api.put(
411
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/keywordset/{{field_id}}",
412
- status_code=201,
413
- summary="Add resource keywordset field (by slug)",
414
- response_model=ResourceFieldAdded,
415
- tags=["Resource fields"],
416
- )
417
- @requires(NucliaDBRoles.WRITER)
418
- @version(1)
419
- async def add_resource_field_keywordset_rslug_prefix(
420
- request: Request,
421
- kbid: str,
422
- rslug: str,
423
- field_id: FieldIdString,
424
- field_payload: models.FieldKeywordset,
425
- ) -> ResourceFieldAdded:
426
- return await add_field_to_resource_by_slug(
427
- request, kbid, rslug, field_id, field_payload
428
- )
429
-
430
-
431
- @api.put(
432
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/keywordset/{{field_id}}",
433
- status_code=201,
434
- summary="Add resource keywordset field (by id)",
435
- response_model=ResourceFieldAdded,
436
- tags=["Resource fields"],
437
- )
438
- @requires(NucliaDBRoles.WRITER)
439
- @version(1)
440
- async def add_resource_field_keywordset_rid_prefix(
441
- request: Request,
442
- kbid: str,
443
- rid: str,
444
- field_id: FieldIdString,
445
- field_payload: models.FieldKeywordset,
446
- ) -> ResourceFieldAdded:
447
- return await add_field_to_resource(request, kbid, rid, field_id, field_payload)
448
-
449
-
450
- @api.put(
451
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/datetime/{{field_id}}",
452
- status_code=201,
453
- summary="Add resource datetime field (by slug)",
454
- response_model=ResourceFieldAdded,
455
- tags=["Resource fields"],
456
- )
457
- @requires(NucliaDBRoles.WRITER)
458
- @version(1)
459
- async def add_resource_field_datetime_rslug_prefix(
460
- request: Request,
461
- kbid: str,
462
- rslug: str,
463
- field_id: FieldIdString,
464
- field_payload: models.FieldDatetime,
465
- ) -> ResourceFieldAdded:
466
- return await add_field_to_resource_by_slug(
467
- request, kbid, rslug, field_id, field_payload
468
- )
469
-
470
-
471
- @api.put(
472
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/datetime/{{field_id}}",
473
- status_code=201,
474
- summary="Add resource datetime field (by id)",
475
- response_model=ResourceFieldAdded,
476
- tags=["Resource fields"],
477
- )
478
- @requires(NucliaDBRoles.WRITER)
479
- @version(1)
480
- async def add_resource_field_datetime_rid_prefix(
481
- request: Request,
482
- kbid: str,
483
- rid: str,
484
- field_id: FieldIdString,
485
- field_payload: models.FieldDatetime,
486
- ) -> ResourceFieldAdded:
487
- return await add_field_to_resource(request, kbid, rid, field_id, field_payload)
488
-
489
-
490
- @api.put(
491
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/layout/{{field_id}}",
492
- status_code=201,
493
- summary="Add resource layout field (by slug)",
494
- response_model=ResourceFieldAdded,
495
- tags=["Resource fields"],
496
- )
497
- @requires(NucliaDBRoles.WRITER)
498
- @version(1)
499
- async def add_resource_field_layout_rslug_prefix(
500
- request: Request,
501
- kbid: str,
502
- rslug: str,
503
- field_id: FieldIdString,
504
- field_payload: models.InputLayoutField,
505
- ) -> ResourceFieldAdded:
506
- return await add_field_to_resource_by_slug(
507
- request, kbid, rslug, field_id, field_payload
508
- )
509
-
510
-
511
- @api.put(
512
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/layout/{{field_id}}",
513
- status_code=201,
514
- summary="Add resource layout field (by id)",
515
- response_model=ResourceFieldAdded,
516
- tags=["Resource fields"],
517
- )
518
- @requires(NucliaDBRoles.WRITER)
519
- @version(1)
520
- async def add_resource_field_layout_rid_prefix(
521
- request: Request,
522
- kbid: str,
523
- rid: str,
524
- field_id: FieldIdString,
525
- field_payload: models.InputLayoutField,
526
- ) -> ResourceFieldAdded:
527
- return await add_field_to_resource(request, kbid, rid, field_id, field_payload)
528
-
529
-
530
330
  @api.put(
531
331
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/conversation/{{field_id}}",
532
332
  status_code=201,
@@ -543,9 +343,7 @@ async def add_resource_field_conversation_rslug_prefix(
543
343
  field_id: FieldIdString,
544
344
  field_payload: models.InputConversationField,
545
345
  ) -> ResourceFieldAdded:
546
- return await add_field_to_resource_by_slug(
547
- request, kbid, rslug, field_id, field_payload
548
- )
346
+ return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field_payload)
549
347
 
550
348
 
551
349
  @api.put(
@@ -653,48 +451,6 @@ async def append_messages_to_conversation_field_rid_prefix(
653
451
  return await add_field_to_resource(request, kbid, rid, field_id, field)
654
452
 
655
453
 
656
- @api.put(
657
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/layout/{{field_id}}/blocks",
658
- status_code=200,
659
- summary="Append blocks to layout field (by slug)",
660
- response_model=ResourceFieldAdded,
661
- tags=["Resource fields"],
662
- )
663
- @requires(NucliaDBRoles.WRITER)
664
- @version(1)
665
- async def append_blocks_to_layout_field_rslug_prefix(
666
- request: Request,
667
- kbid: str,
668
- rslug: str,
669
- field_id: FieldIdString,
670
- blocks: dict[str, models.InputBlock],
671
- ) -> ResourceFieldAdded:
672
- field = models.InputLayoutField(body=models.InputLayoutContent())
673
- field.body.blocks.update(blocks)
674
- return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field)
675
-
676
-
677
- @api.put(
678
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/layout/{{field_id}}/blocks",
679
- status_code=200,
680
- summary="Append blocks to layout field (by id)",
681
- response_model=ResourceFieldAdded,
682
- tags=["Resource fields"],
683
- )
684
- @requires(NucliaDBRoles.WRITER)
685
- @version(1)
686
- async def append_blocks_to_layout_field_rid_prefix(
687
- request: Request,
688
- kbid: str,
689
- rid: str,
690
- field_id: FieldIdString,
691
- blocks: dict[str, models.InputBlock],
692
- ) -> ResourceFieldAdded:
693
- field = models.InputLayoutField(body=models.InputLayoutContent())
694
- field.body.blocks.update(blocks)
695
- return await add_field_to_resource(request, kbid, rid, field_id, field)
696
-
697
-
698
454
  @api.delete(
699
455
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/{{field_type}}/{{field_id}}",
700
456
  status_code=204,
@@ -711,9 +467,7 @@ async def delete_resource_field_rslug_prefix(
711
467
  field_type: models.FieldTypeName,
712
468
  field_id: FieldIdString,
713
469
  ):
714
- return await delete_resource_field_by_slug(
715
- request, kbid, rslug, field_type, field_id
716
- )
470
+ return await delete_resource_field_by_slug(request, kbid, rslug, field_type, field_id)
717
471
 
718
472
 
719
473
  @api.delete(
@@ -754,7 +508,6 @@ async def reprocess_file_field(
754
508
  ) -> ResourceUpdated:
755
509
  await maybe_back_pressure(request, kbid, resource_uuid=rid)
756
510
 
757
- transaction = get_transaction_utility()
758
511
  processing = get_processing()
759
512
  partitioning = get_partitioning()
760
513
 
@@ -800,13 +553,7 @@ async def reprocess_file_field(
800
553
  writer.source = BrokerMessage.MessageSource.WRITER
801
554
  writer.basic.metadata.useful = True
802
555
  writer.basic.metadata.status = Metadata.Status.PENDING
803
- try:
804
- await transaction.commit(writer, partition, wait=False)
805
- except TransactionCommitTimeoutError:
806
- raise HTTPException(
807
- status_code=501,
808
- detail="Inconsistent write. This resource will not be processed and may not be stored.",
809
- )
556
+ await transaction.commit(writer, partition, wait=False)
810
557
  # Send current resource to reprocess.
811
558
  try:
812
559
  processing_info = await processing.send_to_process(toprocess, partition)