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
@@ -0,0 +1,479 @@
1
+ # Copyright (C) 2021 Bosutech XXI S.L.
2
+ #
3
+ # nucliadb is offered under the AGPL v3.0 and as commercial software.
4
+ # For commercial licensing, contact us at info@nuclia.com.
5
+ #
6
+ # AGPL:
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Affero General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Affero General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ #
20
+
21
+
22
+ from typing import Any
23
+
24
+ from google.protobuf.json_format import MessageToDict
25
+
26
+ from nucliadb_models.common import Classification, FieldID, FieldTypeName
27
+ from nucliadb_models.conversation import Conversation, FieldConversation
28
+ from nucliadb_models.entities import EntitiesGroup, EntitiesGroupSummary, Entity
29
+ from nucliadb_models.extracted import (
30
+ ExtractedText,
31
+ FieldComputedMetadata,
32
+ FieldQuestionAnswers,
33
+ FileExtractedData,
34
+ LargeComputedMetadata,
35
+ LinkExtractedData,
36
+ VectorObject,
37
+ )
38
+ from nucliadb_models.file import FieldFile
39
+ from nucliadb_models.internal.shards import KnowledgeboxShards
40
+ from nucliadb_models.link import FieldLink
41
+ from nucliadb_models.metadata import (
42
+ ComputedMetadata,
43
+ Extra,
44
+ FieldClassification,
45
+ Metadata,
46
+ Origin,
47
+ Relation,
48
+ RelationMetadata,
49
+ RelationNodeType,
50
+ RelationType,
51
+ UserFieldMetadata,
52
+ UserMetadata,
53
+ )
54
+ from nucliadb_models.resource import KnowledgeBoxConfig
55
+ from nucliadb_models.synonyms import KnowledgeBoxSynonyms
56
+ from nucliadb_models.text import FieldText
57
+ from nucliadb_protos import knowledgebox_pb2, resources_pb2, utils_pb2, writer_pb2
58
+
59
+
60
+ def field_type_name(field_type: resources_pb2.FieldType.ValueType) -> FieldTypeName:
61
+ return {
62
+ resources_pb2.FieldType.LINK: FieldTypeName.LINK,
63
+ resources_pb2.FieldType.FILE: FieldTypeName.FILE,
64
+ resources_pb2.FieldType.TEXT: FieldTypeName.TEXT,
65
+ resources_pb2.FieldType.GENERIC: FieldTypeName.GENERIC,
66
+ resources_pb2.FieldType.CONVERSATION: FieldTypeName.CONVERSATION,
67
+ }[field_type]
68
+
69
+
70
+ def field_type(field_type: resources_pb2.FieldType.ValueType) -> FieldID.FieldType:
71
+ return {
72
+ resources_pb2.FieldType.LINK: FieldID.FieldType.LINK,
73
+ resources_pb2.FieldType.FILE: FieldID.FieldType.FILE,
74
+ resources_pb2.FieldType.TEXT: FieldID.FieldType.TEXT,
75
+ resources_pb2.FieldType.GENERIC: FieldID.FieldType.GENERIC,
76
+ resources_pb2.FieldType.CONVERSATION: FieldID.FieldType.CONVERSATION,
77
+ }[field_type]
78
+
79
+
80
+ def user_field_metadata(message: resources_pb2.UserFieldMetadata) -> UserFieldMetadata:
81
+ value = MessageToDict(
82
+ message,
83
+ preserving_proto_field_name=True,
84
+ including_default_value_fields=True,
85
+ use_integers_for_enums=True,
86
+ )
87
+ value["selections"] = [
88
+ MessageToDict(
89
+ selections,
90
+ preserving_proto_field_name=True,
91
+ including_default_value_fields=True,
92
+ use_integers_for_enums=True,
93
+ )
94
+ for selections in message.page_selections
95
+ ]
96
+ value["field"]["field_type"] = field_type_name(value["field"]["field_type"]).value
97
+ return UserFieldMetadata(**value)
98
+
99
+
100
+ def computed_metadata(message: resources_pb2.ComputedMetadata) -> ComputedMetadata:
101
+ values: dict[str, list[FieldClassification]] = {"field_classifications": []}
102
+ for fc in message.field_classifications:
103
+ values["field_classifications"].append(
104
+ FieldClassification(
105
+ field=FieldID(
106
+ field=fc.field.field,
107
+ field_type=field_type(fc.field.field_type),
108
+ ),
109
+ classifications=[
110
+ Classification(label=c.label, labelset=c.labelset) for c in fc.classifications
111
+ ],
112
+ )
113
+ )
114
+ return ComputedMetadata(**values)
115
+
116
+
117
+ def user_metadata(message: resources_pb2.UserMetadata) -> UserMetadata:
118
+ value = MessageToDict(
119
+ message,
120
+ preserving_proto_field_name=True,
121
+ including_default_value_fields=True,
122
+ )
123
+ value["relations"] = [convert_pb_relation_to_api(rel) for rel in message.relations]
124
+ return UserMetadata(**value)
125
+
126
+
127
+ RelationNodeTypeMap: dict[RelationNodeType, utils_pb2.RelationNode.NodeType.ValueType] = {
128
+ RelationNodeType.ENTITY: utils_pb2.RelationNode.NodeType.ENTITY,
129
+ RelationNodeType.LABEL: utils_pb2.RelationNode.NodeType.LABEL,
130
+ RelationNodeType.RESOURCE: utils_pb2.RelationNode.NodeType.RESOURCE,
131
+ RelationNodeType.USER: utils_pb2.RelationNode.NodeType.USER,
132
+ }
133
+
134
+ RelationNodeTypePbMap: dict[utils_pb2.RelationNode.NodeType.ValueType, RelationNodeType] = {
135
+ utils_pb2.RelationNode.NodeType.ENTITY: RelationNodeType.ENTITY,
136
+ utils_pb2.RelationNode.NodeType.LABEL: RelationNodeType.LABEL,
137
+ utils_pb2.RelationNode.NodeType.RESOURCE: RelationNodeType.RESOURCE,
138
+ utils_pb2.RelationNode.NodeType.USER: RelationNodeType.USER,
139
+ }
140
+
141
+
142
+ RelationTypePbMap: dict[utils_pb2.Relation.RelationType.ValueType, RelationType] = {
143
+ utils_pb2.Relation.RelationType.ABOUT: RelationType.ABOUT,
144
+ utils_pb2.Relation.RelationType.CHILD: RelationType.CHILD,
145
+ utils_pb2.Relation.RelationType.COLAB: RelationType.COLAB,
146
+ utils_pb2.Relation.RelationType.ENTITY: RelationType.ENTITY,
147
+ utils_pb2.Relation.RelationType.OTHER: RelationType.OTHER,
148
+ utils_pb2.Relation.RelationType.SYNONYM: RelationType.SYNONYM,
149
+ }
150
+
151
+ RelationTypeMap: dict[RelationType, utils_pb2.Relation.RelationType.ValueType] = {
152
+ RelationType.ABOUT: utils_pb2.Relation.RelationType.ABOUT,
153
+ RelationType.CHILD: utils_pb2.Relation.RelationType.CHILD,
154
+ RelationType.COLAB: utils_pb2.Relation.RelationType.COLAB,
155
+ RelationType.ENTITY: utils_pb2.Relation.RelationType.ENTITY,
156
+ RelationType.OTHER: utils_pb2.Relation.RelationType.OTHER,
157
+ RelationType.SYNONYM: utils_pb2.Relation.RelationType.SYNONYM,
158
+ }
159
+
160
+
161
+ def convert_pb_relation_to_api(rel: utils_pb2.Relation) -> dict[str, Any]:
162
+ return {
163
+ "relation": RelationTypePbMap[rel.relation],
164
+ "from": convert_pb_relation_node_to_api(rel.source),
165
+ "to": convert_pb_relation_node_to_api(rel.to),
166
+ "label": rel.relation_label,
167
+ "metadata": relation_metadata(rel.metadata),
168
+ }
169
+
170
+
171
+ def convert_pb_relation_node_to_api(
172
+ relation_node: utils_pb2.RelationNode,
173
+ ) -> dict[str, Any]:
174
+ return {
175
+ "type": RelationNodeTypePbMap[relation_node.ntype],
176
+ "value": relation_node.value,
177
+ "group": relation_node.subtype,
178
+ }
179
+
180
+
181
+ def relation_metadata(message: utils_pb2.RelationMetadata) -> RelationMetadata:
182
+ return RelationMetadata(
183
+ **MessageToDict(
184
+ message,
185
+ preserving_proto_field_name=True,
186
+ including_default_value_fields=True,
187
+ )
188
+ )
189
+
190
+
191
+ def relation(message: utils_pb2.Relation) -> Relation:
192
+ value = convert_pb_relation_to_api(message)
193
+ return Relation(**value)
194
+
195
+
196
+ def origin(message: resources_pb2.Origin) -> Origin:
197
+ data = MessageToDict(
198
+ message,
199
+ preserving_proto_field_name=True,
200
+ including_default_value_fields=True,
201
+ )
202
+ # old field was "colaborators" and we want to keep pb field name
203
+ # to avoid migration
204
+ data["collaborators"] = data.pop("colaborators", [])
205
+ return Origin(**data)
206
+
207
+
208
+ def extra(message: resources_pb2.Extra) -> Extra:
209
+ return Extra(
210
+ **MessageToDict(
211
+ message,
212
+ preserving_proto_field_name=True,
213
+ including_default_value_fields=False,
214
+ )
215
+ )
216
+
217
+
218
+ def metadata(message: resources_pb2.Metadata) -> Metadata:
219
+ return Metadata(
220
+ **MessageToDict(
221
+ message,
222
+ preserving_proto_field_name=True,
223
+ including_default_value_fields=True,
224
+ )
225
+ )
226
+
227
+
228
+ def field_question_answers(
229
+ message: resources_pb2.FieldQuestionAnswers,
230
+ ) -> FieldQuestionAnswers:
231
+ value = MessageToDict(
232
+ message,
233
+ preserving_proto_field_name=True,
234
+ including_default_value_fields=True,
235
+ )
236
+ return FieldQuestionAnswers(**value)
237
+
238
+
239
+ def extracted_text(message: resources_pb2.ExtractedText) -> ExtractedText:
240
+ return ExtractedText(
241
+ **MessageToDict(
242
+ message,
243
+ preserving_proto_field_name=True,
244
+ including_default_value_fields=True,
245
+ )
246
+ )
247
+
248
+
249
+ def vector_object(message: resources_pb2.VectorObject) -> VectorObject:
250
+ return VectorObject(
251
+ **MessageToDict(
252
+ message,
253
+ preserving_proto_field_name=True,
254
+ including_default_value_fields=True,
255
+ )
256
+ )
257
+
258
+
259
+ def large_computed_metadata(
260
+ message: resources_pb2.LargeComputedMetadata,
261
+ ) -> LargeComputedMetadata:
262
+ return LargeComputedMetadata(
263
+ **MessageToDict(
264
+ message,
265
+ preserving_proto_field_name=True,
266
+ including_default_value_fields=True,
267
+ )
268
+ )
269
+
270
+
271
+ def link_extracted_data(message: resources_pb2.LinkExtractedData) -> LinkExtractedData:
272
+ return LinkExtractedData(
273
+ **MessageToDict(
274
+ message,
275
+ preserving_proto_field_name=True,
276
+ including_default_value_fields=True,
277
+ )
278
+ )
279
+
280
+
281
+ def file_extracted_data(message: resources_pb2.FileExtractedData) -> FileExtractedData:
282
+ return FileExtractedData(
283
+ **MessageToDict(
284
+ message,
285
+ preserving_proto_field_name=True,
286
+ including_default_value_fields=True,
287
+ )
288
+ )
289
+
290
+
291
+ def shorten_fieldmetadata(
292
+ message: resources_pb2.FieldComputedMetadata,
293
+ ) -> None:
294
+ large_fields = ["ner", "relations", "positions", "classifications", "entities"]
295
+ for field in large_fields:
296
+ message.metadata.ClearField(field) # type: ignore
297
+ for metadata in message.split_metadata.values():
298
+ for field in large_fields:
299
+ metadata.ClearField(field) # type: ignore
300
+
301
+
302
+ def field_computed_metadata(
303
+ message: resources_pb2.FieldComputedMetadata, shortened: bool = False
304
+ ) -> FieldComputedMetadata:
305
+ if shortened:
306
+ shorten_fieldmetadata(message)
307
+ metadata = convert_fieldmetadata_pb_to_dict(message.metadata)
308
+ split_metadata = {
309
+ split: convert_fieldmetadata_pb_to_dict(metadata_split)
310
+ for split, metadata_split in message.split_metadata.items()
311
+ }
312
+ value = MessageToDict(
313
+ message,
314
+ preserving_proto_field_name=True,
315
+ including_default_value_fields=True,
316
+ )
317
+ value["metadata"] = metadata
318
+ value["split_metadata"] = split_metadata
319
+ return FieldComputedMetadata(**value)
320
+
321
+
322
+ def convert_fieldmetadata_pb_to_dict(
323
+ message: resources_pb2.FieldMetadata,
324
+ ) -> dict[str, Any]:
325
+ # Backwards compatibility with old entities format
326
+ # TODO: Remove once deprecated fields are removed
327
+ # If we recieved processor entities in the new field and the old field is empty, we copy them to the old field
328
+ if "processor" in message.entities and len(message.positions) == 0 and len(message.ner) == 0:
329
+ message.ner.update({ent.text: ent.label for ent in message.entities["processor"].entities})
330
+ for ent in message.entities["processor"].entities:
331
+ message.positions[ent.label + "/" + ent.text].entity = ent.text
332
+ message.positions[ent.label + "/" + ent.text].position.extend(
333
+ [
334
+ resources_pb2.Position(
335
+ start=position.start,
336
+ end=position.end,
337
+ )
338
+ for position in ent.positions
339
+ ]
340
+ )
341
+
342
+ value = MessageToDict(
343
+ message,
344
+ preserving_proto_field_name=True,
345
+ including_default_value_fields=True,
346
+ )
347
+ value["relations"] = [
348
+ convert_pb_relation_to_api(rel) for relations in message.relations for rel in relations.relations
349
+ ]
350
+ return value
351
+
352
+
353
+ def conversation(message: resources_pb2.Conversation) -> Conversation:
354
+ as_dict = MessageToDict(
355
+ message,
356
+ preserving_proto_field_name=True,
357
+ including_default_value_fields=True,
358
+ )
359
+ for conv_message in as_dict.get("messages", []):
360
+ for attachment_field in conv_message.get("content", {}).get("attachments_fields", []):
361
+ attachment_field["field_type"] = attachment_field["field_type"].lower()
362
+ return Conversation(**as_dict)
363
+
364
+
365
+ def field_conversation(message: resources_pb2.FieldConversation) -> FieldConversation:
366
+ return FieldConversation(
367
+ **MessageToDict(
368
+ message,
369
+ preserving_proto_field_name=True,
370
+ including_default_value_fields=True,
371
+ )
372
+ )
373
+
374
+
375
+ def entity(message: knowledgebox_pb2.Entity) -> Entity:
376
+ return Entity(
377
+ **MessageToDict(
378
+ message,
379
+ preserving_proto_field_name=True,
380
+ including_default_value_fields=True,
381
+ )
382
+ )
383
+
384
+
385
+ def entities_group(
386
+ message: knowledgebox_pb2.EntitiesGroup,
387
+ ) -> EntitiesGroup:
388
+ entities_group = MessageToDict(
389
+ message,
390
+ preserving_proto_field_name=True,
391
+ including_default_value_fields=True,
392
+ )
393
+ entities_group["entities"] = {}
394
+
395
+ for name, ent in message.entities.items():
396
+ if not ent.deleted:
397
+ entities_group["entities"][name] = entity(ent)
398
+
399
+ return EntitiesGroup(**entities_group)
400
+
401
+
402
+ def entities_group_summary(
403
+ message: knowledgebox_pb2.EntitiesGroupSummary,
404
+ ) -> EntitiesGroupSummary:
405
+ return EntitiesGroupSummary(
406
+ **MessageToDict(
407
+ message,
408
+ preserving_proto_field_name=True,
409
+ including_default_value_fields=True,
410
+ )
411
+ )
412
+
413
+
414
+ def field_file(message: resources_pb2.FieldFile) -> FieldFile:
415
+ instance = FieldFile(
416
+ **MessageToDict(
417
+ message,
418
+ preserving_proto_field_name=True,
419
+ including_default_value_fields=True,
420
+ )
421
+ )
422
+ instance.external = ( # type: ignore
423
+ message.file.source == resources_pb2.CloudFile.Source.EXTERNAL
424
+ )
425
+ return instance
426
+
427
+
428
+ def field_link(message: resources_pb2.FieldLink) -> FieldLink:
429
+ return FieldLink(
430
+ **MessageToDict(
431
+ message,
432
+ preserving_proto_field_name=True,
433
+ including_default_value_fields=True,
434
+ )
435
+ )
436
+
437
+
438
+ def field_text(message: resources_pb2.FieldText) -> FieldText:
439
+ return FieldText(
440
+ **MessageToDict(
441
+ message,
442
+ preserving_proto_field_name=True,
443
+ including_default_value_fields=True,
444
+ )
445
+ )
446
+
447
+
448
+ def knowledgebox_config(message: knowledgebox_pb2.KnowledgeBoxConfig) -> KnowledgeBoxConfig:
449
+ as_dict = MessageToDict(
450
+ message,
451
+ preserving_proto_field_name=True,
452
+ including_default_value_fields=True,
453
+ )
454
+ # Calculate external index provider metadata
455
+ # that is shown on read requests
456
+ eip = as_dict.pop("external_index_provider", None)
457
+ if eip:
458
+ as_dict["configured_external_index_provider"] = {"type": eip["type"].lower()}
459
+ return KnowledgeBoxConfig(**as_dict)
460
+
461
+
462
+ def kb_synonyms(message: knowledgebox_pb2.Synonyms) -> KnowledgeBoxSynonyms:
463
+ return KnowledgeBoxSynonyms(
464
+ **dict(
465
+ synonyms={
466
+ term: list(term_synonyms.synonyms) for term, term_synonyms in message.terms.items()
467
+ }
468
+ )
469
+ )
470
+
471
+
472
+ def kb_shards(message: writer_pb2.Shards) -> KnowledgeboxShards:
473
+ return KnowledgeboxShards(
474
+ **MessageToDict(
475
+ message,
476
+ preserving_proto_field_name=True,
477
+ including_default_value_fields=True,
478
+ )
479
+ )
@@ -0,0 +1,60 @@
1
+ # Copyright (C) 2021 Bosutech XXI S.L.
2
+ #
3
+ # nucliadb is offered under the AGPL v3.0 and as commercial software.
4
+ # For commercial licensing, contact us at info@nuclia.com.
5
+ #
6
+ # AGPL:
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Affero General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Affero General Public License
18
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ from nucliadb_models.common import FieldID, FieldTypeName
22
+ from nucliadb_models.search import FeedbackTasks, NucliaDBClientType
23
+ from nucliadb_models.synonyms import KnowledgeBoxSynonyms
24
+ from nucliadb_protos import knowledgebox_pb2, resources_pb2
25
+ from nucliadb_protos.audit_pb2 import ClientType, TaskType
26
+
27
+
28
+ def client_type(obj: NucliaDBClientType) -> ClientType.ValueType:
29
+ return ClientType.Value(obj.name)
30
+
31
+
32
+ def feedback_task(obj: FeedbackTasks) -> TaskType.ValueType:
33
+ return TaskType.Value(obj.name)
34
+
35
+
36
+ def field_type_name(obj: FieldTypeName) -> resources_pb2.FieldType.ValueType:
37
+ return {
38
+ FieldTypeName.LINK: resources_pb2.FieldType.LINK,
39
+ FieldTypeName.FILE: resources_pb2.FieldType.FILE,
40
+ FieldTypeName.TEXT: resources_pb2.FieldType.TEXT,
41
+ FieldTypeName.GENERIC: resources_pb2.FieldType.GENERIC,
42
+ FieldTypeName.CONVERSATION: resources_pb2.FieldType.CONVERSATION,
43
+ }[obj]
44
+
45
+
46
+ def field_type(obj: FieldID.FieldType) -> resources_pb2.FieldType.ValueType:
47
+ return {
48
+ FieldID.FieldType.LINK: resources_pb2.FieldType.LINK,
49
+ FieldID.FieldType.FILE: resources_pb2.FieldType.FILE,
50
+ FieldID.FieldType.TEXT: resources_pb2.FieldType.TEXT,
51
+ FieldID.FieldType.GENERIC: resources_pb2.FieldType.GENERIC,
52
+ FieldID.FieldType.CONVERSATION: resources_pb2.FieldType.CONVERSATION,
53
+ }[obj]
54
+
55
+
56
+ def kb_synonyms(obj: KnowledgeBoxSynonyms) -> knowledgebox_pb2.Synonyms:
57
+ pbsyn = knowledgebox_pb2.Synonyms()
58
+ for term, term_synonyms in obj.synonyms.items():
59
+ pbsyn.terms[term].synonyms.extend(term_synonyms)
60
+ return pbsyn