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.
- migrations/0003_allfields_key.py +1 -35
- migrations/0009_upgrade_relations_and_texts_to_v2.py +4 -2
- migrations/0010_fix_corrupt_indexes.py +10 -10
- migrations/0011_materialize_labelset_ids.py +1 -16
- migrations/0012_rollover_shards.py +5 -10
- migrations/0014_rollover_shards.py +4 -5
- migrations/0015_targeted_rollover.py +5 -10
- migrations/0016_upgrade_to_paragraphs_v2.py +25 -28
- migrations/0017_multiple_writable_shards.py +2 -4
- migrations/0018_purge_orphan_kbslugs.py +5 -7
- migrations/0019_upgrade_to_paragraphs_v3.py +25 -28
- migrations/0020_drain_nodes_from_cluster.py +3 -3
- nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +16 -19
- nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
- migrations/0023_backfill_pg_catalog.py +80 -0
- migrations/0025_assign_models_to_kbs_v2.py +113 -0
- migrations/0026_fix_high_cardinality_content_types.py +61 -0
- migrations/0027_rollover_texts3.py +73 -0
- nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
- migrations/pg/0002_catalog.py +42 -0
- nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
- nucliadb/common/cluster/base.py +30 -16
- nucliadb/common/cluster/discovery/base.py +6 -14
- nucliadb/common/cluster/discovery/k8s.py +9 -19
- nucliadb/common/cluster/discovery/manual.py +1 -3
- nucliadb/common/cluster/discovery/utils.py +1 -3
- nucliadb/common/cluster/grpc_node_dummy.py +3 -11
- nucliadb/common/cluster/index_node.py +10 -19
- nucliadb/common/cluster/manager.py +174 -59
- nucliadb/common/cluster/rebalance.py +27 -29
- nucliadb/common/cluster/rollover.py +353 -194
- nucliadb/common/cluster/settings.py +6 -0
- nucliadb/common/cluster/standalone/grpc_node_binding.py +13 -64
- nucliadb/common/cluster/standalone/index_node.py +4 -11
- nucliadb/common/cluster/standalone/service.py +2 -6
- nucliadb/common/cluster/standalone/utils.py +2 -6
- nucliadb/common/cluster/utils.py +29 -22
- nucliadb/common/constants.py +20 -0
- nucliadb/common/context/__init__.py +3 -0
- nucliadb/common/context/fastapi.py +8 -5
- nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
- nucliadb/common/datamanagers/__init__.py +7 -1
- nucliadb/common/datamanagers/atomic.py +22 -4
- nucliadb/common/datamanagers/cluster.py +5 -5
- nucliadb/common/datamanagers/entities.py +6 -16
- nucliadb/common/datamanagers/fields.py +84 -0
- nucliadb/common/datamanagers/kb.py +83 -37
- nucliadb/common/datamanagers/labels.py +26 -56
- nucliadb/common/datamanagers/processing.py +2 -6
- nucliadb/common/datamanagers/resources.py +41 -103
- nucliadb/common/datamanagers/rollover.py +76 -15
- nucliadb/common/datamanagers/synonyms.py +1 -1
- nucliadb/common/datamanagers/utils.py +15 -6
- nucliadb/common/datamanagers/vectorsets.py +110 -0
- nucliadb/common/external_index_providers/base.py +257 -0
- nucliadb/{ingest/tests/unit/orm/test_orm_utils.py → common/external_index_providers/exceptions.py} +9 -8
- nucliadb/common/external_index_providers/manager.py +101 -0
- nucliadb/common/external_index_providers/pinecone.py +933 -0
- nucliadb/common/external_index_providers/settings.py +52 -0
- nucliadb/common/http_clients/auth.py +3 -6
- nucliadb/common/http_clients/processing.py +6 -11
- nucliadb/common/http_clients/utils.py +1 -3
- nucliadb/common/ids.py +240 -0
- nucliadb/common/locking.py +29 -7
- nucliadb/common/maindb/driver.py +11 -35
- nucliadb/common/maindb/exceptions.py +3 -0
- nucliadb/common/maindb/local.py +22 -9
- nucliadb/common/maindb/pg.py +206 -111
- nucliadb/common/maindb/utils.py +11 -42
- nucliadb/common/models_utils/from_proto.py +479 -0
- nucliadb/common/models_utils/to_proto.py +60 -0
- nucliadb/common/nidx.py +260 -0
- nucliadb/export_import/datamanager.py +25 -19
- nucliadb/export_import/exporter.py +5 -11
- nucliadb/export_import/importer.py +5 -7
- nucliadb/export_import/models.py +3 -3
- nucliadb/export_import/tasks.py +4 -4
- nucliadb/export_import/utils.py +25 -37
- nucliadb/health.py +1 -3
- nucliadb/ingest/app.py +15 -11
- nucliadb/ingest/consumer/auditing.py +21 -19
- nucliadb/ingest/consumer/consumer.py +82 -47
- nucliadb/ingest/consumer/materializer.py +5 -12
- nucliadb/ingest/consumer/pull.py +12 -27
- nucliadb/ingest/consumer/service.py +19 -17
- nucliadb/ingest/consumer/shard_creator.py +2 -4
- nucliadb/ingest/consumer/utils.py +1 -3
- nucliadb/ingest/fields/base.py +137 -105
- nucliadb/ingest/fields/conversation.py +18 -5
- nucliadb/ingest/fields/exceptions.py +1 -4
- nucliadb/ingest/fields/file.py +7 -16
- nucliadb/ingest/fields/link.py +5 -10
- nucliadb/ingest/fields/text.py +9 -4
- nucliadb/ingest/orm/brain.py +200 -213
- nucliadb/ingest/orm/broker_message.py +181 -0
- nucliadb/ingest/orm/entities.py +36 -51
- nucliadb/ingest/orm/exceptions.py +12 -0
- nucliadb/ingest/orm/knowledgebox.py +322 -197
- nucliadb/ingest/orm/processor/__init__.py +2 -700
- nucliadb/ingest/orm/processor/auditing.py +4 -23
- nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
- nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
- nucliadb/ingest/orm/processor/processor.py +752 -0
- nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
- nucliadb/ingest/orm/resource.py +249 -403
- nucliadb/ingest/orm/utils.py +4 -4
- nucliadb/ingest/partitions.py +3 -9
- nucliadb/ingest/processing.py +70 -73
- nucliadb/ingest/py.typed +0 -0
- nucliadb/ingest/serialize.py +37 -167
- nucliadb/ingest/service/__init__.py +1 -3
- nucliadb/ingest/service/writer.py +185 -412
- nucliadb/ingest/settings.py +10 -20
- nucliadb/ingest/utils.py +3 -6
- nucliadb/learning_proxy.py +242 -55
- nucliadb/metrics_exporter.py +30 -19
- nucliadb/middleware/__init__.py +1 -3
- nucliadb/migrator/command.py +1 -3
- nucliadb/migrator/datamanager.py +13 -13
- nucliadb/migrator/migrator.py +47 -30
- nucliadb/migrator/utils.py +18 -10
- nucliadb/purge/__init__.py +139 -33
- nucliadb/purge/orphan_shards.py +7 -13
- nucliadb/reader/__init__.py +1 -3
- nucliadb/reader/api/models.py +1 -12
- nucliadb/reader/api/v1/__init__.py +0 -1
- nucliadb/reader/api/v1/download.py +21 -88
- nucliadb/reader/api/v1/export_import.py +1 -1
- nucliadb/reader/api/v1/knowledgebox.py +10 -10
- nucliadb/reader/api/v1/learning_config.py +2 -6
- nucliadb/reader/api/v1/resource.py +62 -88
- nucliadb/reader/api/v1/services.py +64 -83
- nucliadb/reader/app.py +12 -29
- nucliadb/reader/lifecycle.py +18 -4
- nucliadb/reader/py.typed +0 -0
- nucliadb/reader/reader/notifications.py +10 -28
- nucliadb/search/__init__.py +1 -3
- nucliadb/search/api/v1/__init__.py +1 -2
- nucliadb/search/api/v1/ask.py +17 -10
- nucliadb/search/api/v1/catalog.py +184 -0
- nucliadb/search/api/v1/feedback.py +16 -24
- nucliadb/search/api/v1/find.py +36 -36
- nucliadb/search/api/v1/knowledgebox.py +89 -60
- nucliadb/search/api/v1/resource/ask.py +2 -8
- nucliadb/search/api/v1/resource/search.py +49 -70
- nucliadb/search/api/v1/search.py +44 -210
- nucliadb/search/api/v1/suggest.py +39 -54
- nucliadb/search/app.py +12 -32
- nucliadb/search/lifecycle.py +10 -3
- nucliadb/search/predict.py +136 -187
- nucliadb/search/py.typed +0 -0
- nucliadb/search/requesters/utils.py +25 -58
- nucliadb/search/search/cache.py +149 -20
- nucliadb/search/search/chat/ask.py +571 -123
- nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -14
- nucliadb/search/search/chat/images.py +41 -17
- nucliadb/search/search/chat/prompt.py +817 -266
- nucliadb/search/search/chat/query.py +213 -309
- nucliadb/{tests/migrations/__init__.py → search/search/cut.py} +8 -8
- nucliadb/search/search/fetch.py +43 -36
- nucliadb/search/search/filters.py +9 -15
- nucliadb/search/search/find.py +214 -53
- nucliadb/search/search/find_merge.py +408 -391
- nucliadb/search/search/hydrator.py +191 -0
- nucliadb/search/search/merge.py +187 -223
- nucliadb/search/search/metrics.py +73 -2
- nucliadb/search/search/paragraphs.py +64 -106
- nucliadb/search/search/pgcatalog.py +233 -0
- nucliadb/search/search/predict_proxy.py +1 -1
- nucliadb/search/search/query.py +305 -150
- nucliadb/search/search/query_parser/exceptions.py +22 -0
- nucliadb/search/search/query_parser/models.py +101 -0
- nucliadb/search/search/query_parser/parser.py +183 -0
- nucliadb/search/search/rank_fusion.py +204 -0
- nucliadb/search/search/rerankers.py +270 -0
- nucliadb/search/search/shards.py +3 -32
- nucliadb/search/search/summarize.py +7 -18
- nucliadb/search/search/utils.py +27 -4
- nucliadb/search/settings.py +15 -1
- nucliadb/standalone/api_router.py +4 -10
- nucliadb/standalone/app.py +8 -14
- nucliadb/standalone/auth.py +7 -21
- nucliadb/standalone/config.py +7 -10
- nucliadb/standalone/lifecycle.py +26 -25
- nucliadb/standalone/migrations.py +1 -3
- nucliadb/standalone/purge.py +1 -1
- nucliadb/standalone/py.typed +0 -0
- nucliadb/standalone/run.py +3 -6
- nucliadb/standalone/settings.py +9 -16
- nucliadb/standalone/versions.py +15 -5
- nucliadb/tasks/consumer.py +8 -12
- nucliadb/tasks/producer.py +7 -6
- nucliadb/tests/config.py +53 -0
- nucliadb/train/__init__.py +1 -3
- nucliadb/train/api/utils.py +1 -2
- nucliadb/train/api/v1/shards.py +1 -1
- nucliadb/train/api/v1/trainset.py +2 -4
- nucliadb/train/app.py +10 -31
- nucliadb/train/generator.py +10 -19
- nucliadb/train/generators/field_classifier.py +7 -19
- nucliadb/train/generators/field_streaming.py +156 -0
- nucliadb/train/generators/image_classifier.py +12 -18
- nucliadb/train/generators/paragraph_classifier.py +5 -9
- nucliadb/train/generators/paragraph_streaming.py +6 -9
- nucliadb/train/generators/question_answer_streaming.py +19 -20
- nucliadb/train/generators/sentence_classifier.py +9 -15
- nucliadb/train/generators/token_classifier.py +48 -39
- nucliadb/train/generators/utils.py +14 -18
- nucliadb/train/lifecycle.py +7 -3
- nucliadb/train/nodes.py +23 -32
- nucliadb/train/py.typed +0 -0
- nucliadb/train/servicer.py +13 -21
- nucliadb/train/settings.py +2 -6
- nucliadb/train/types.py +13 -10
- nucliadb/train/upload.py +3 -6
- nucliadb/train/uploader.py +19 -23
- nucliadb/train/utils.py +1 -1
- nucliadb/writer/__init__.py +1 -3
- nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
- nucliadb/writer/api/v1/export_import.py +67 -14
- nucliadb/writer/api/v1/field.py +16 -269
- nucliadb/writer/api/v1/knowledgebox.py +218 -68
- nucliadb/writer/api/v1/resource.py +68 -88
- nucliadb/writer/api/v1/services.py +51 -70
- nucliadb/writer/api/v1/slug.py +61 -0
- nucliadb/writer/api/v1/transaction.py +67 -0
- nucliadb/writer/api/v1/upload.py +143 -117
- nucliadb/writer/app.py +6 -43
- nucliadb/writer/back_pressure.py +16 -38
- nucliadb/writer/exceptions.py +0 -4
- nucliadb/writer/lifecycle.py +21 -15
- nucliadb/writer/py.typed +0 -0
- nucliadb/writer/resource/audit.py +2 -1
- nucliadb/writer/resource/basic.py +48 -46
- nucliadb/writer/resource/field.py +37 -128
- nucliadb/writer/resource/origin.py +1 -2
- nucliadb/writer/settings.py +6 -2
- nucliadb/writer/tus/__init__.py +17 -15
- nucliadb/writer/tus/azure.py +111 -0
- nucliadb/writer/tus/dm.py +17 -5
- nucliadb/writer/tus/exceptions.py +1 -3
- nucliadb/writer/tus/gcs.py +49 -84
- nucliadb/writer/tus/local.py +21 -37
- nucliadb/writer/tus/s3.py +28 -68
- nucliadb/writer/tus/storage.py +5 -56
- nucliadb/writer/vectorsets.py +125 -0
- nucliadb-6.2.1.post2798.dist-info/METADATA +148 -0
- nucliadb-6.2.1.post2798.dist-info/RECORD +343 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/WHEEL +1 -1
- nucliadb/common/maindb/redis.py +0 -194
- nucliadb/common/maindb/tikv.py +0 -433
- nucliadb/ingest/fields/layout.py +0 -58
- nucliadb/ingest/tests/conftest.py +0 -30
- nucliadb/ingest/tests/fixtures.py +0 -764
- nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -78
- nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -126
- nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
- nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
- nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
- nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -684
- nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
- nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
- nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -139
- nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
- nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
- nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -140
- nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
- nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
- nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
- nucliadb/ingest/tests/unit/orm/test_brain_vectors.py +0 -74
- nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
- nucliadb/ingest/tests/unit/orm/test_resource.py +0 -331
- nucliadb/ingest/tests/unit/test_cache.py +0 -31
- nucliadb/ingest/tests/unit/test_partitions.py +0 -40
- nucliadb/ingest/tests/unit/test_processing.py +0 -171
- nucliadb/middleware/transaction.py +0 -117
- nucliadb/reader/api/v1/learning_collector.py +0 -63
- nucliadb/reader/tests/__init__.py +0 -19
- nucliadb/reader/tests/conftest.py +0 -31
- nucliadb/reader/tests/fixtures.py +0 -136
- nucliadb/reader/tests/test_list_resources.py +0 -75
- nucliadb/reader/tests/test_reader_file_download.py +0 -273
- nucliadb/reader/tests/test_reader_resource.py +0 -353
- nucliadb/reader/tests/test_reader_resource_field.py +0 -219
- nucliadb/search/api/v1/chat.py +0 -263
- nucliadb/search/api/v1/resource/chat.py +0 -174
- nucliadb/search/tests/__init__.py +0 -19
- nucliadb/search/tests/conftest.py +0 -33
- nucliadb/search/tests/fixtures.py +0 -199
- nucliadb/search/tests/node.py +0 -466
- nucliadb/search/tests/unit/__init__.py +0 -18
- nucliadb/search/tests/unit/api/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_ask.py +0 -120
- nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
- nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -99
- nucliadb/search/tests/unit/search/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -211
- nucliadb/search/tests/unit/search/search/__init__.py +0 -19
- nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
- nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
- nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -270
- nucliadb/search/tests/unit/search/test_fetch.py +0 -108
- nucliadb/search/tests/unit/search/test_filters.py +0 -125
- nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
- nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
- nucliadb/search/tests/unit/search/test_query.py +0 -153
- nucliadb/search/tests/unit/test_app.py +0 -79
- nucliadb/search/tests/unit/test_find_merge.py +0 -112
- nucliadb/search/tests/unit/test_merge.py +0 -34
- nucliadb/search/tests/unit/test_predict.py +0 -525
- nucliadb/standalone/tests/__init__.py +0 -19
- nucliadb/standalone/tests/conftest.py +0 -33
- nucliadb/standalone/tests/fixtures.py +0 -38
- nucliadb/standalone/tests/unit/__init__.py +0 -18
- nucliadb/standalone/tests/unit/test_api_router.py +0 -61
- nucliadb/standalone/tests/unit/test_auth.py +0 -169
- nucliadb/standalone/tests/unit/test_introspect.py +0 -35
- nucliadb/standalone/tests/unit/test_migrations.py +0 -63
- nucliadb/standalone/tests/unit/test_versions.py +0 -68
- nucliadb/tests/benchmarks/__init__.py +0 -19
- nucliadb/tests/benchmarks/test_search.py +0 -99
- nucliadb/tests/conftest.py +0 -32
- nucliadb/tests/fixtures.py +0 -735
- nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -202
- nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -107
- nucliadb/tests/migrations/test_migration_0017.py +0 -76
- nucliadb/tests/migrations/test_migration_0018.py +0 -95
- nucliadb/tests/tikv.py +0 -240
- nucliadb/tests/unit/__init__.py +0 -19
- nucliadb/tests/unit/common/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -172
- nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
- nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -114
- nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -61
- nucliadb/tests/unit/common/cluster/test_cluster.py +0 -408
- nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -173
- nucliadb/tests/unit/common/cluster/test_rebalance.py +0 -38
- nucliadb/tests/unit/common/cluster/test_rollover.py +0 -282
- nucliadb/tests/unit/common/maindb/__init__.py +0 -18
- nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
- nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
- nucliadb/tests/unit/common/maindb/test_utils.py +0 -92
- nucliadb/tests/unit/common/test_context.py +0 -36
- nucliadb/tests/unit/export_import/__init__.py +0 -19
- nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
- nucliadb/tests/unit/export_import/test_utils.py +0 -301
- nucliadb/tests/unit/migrator/__init__.py +0 -19
- nucliadb/tests/unit/migrator/test_migrator.py +0 -87
- nucliadb/tests/unit/tasks/__init__.py +0 -19
- nucliadb/tests/unit/tasks/conftest.py +0 -42
- nucliadb/tests/unit/tasks/test_consumer.py +0 -92
- nucliadb/tests/unit/tasks/test_producer.py +0 -95
- nucliadb/tests/unit/tasks/test_tasks.py +0 -58
- nucliadb/tests/unit/test_field_ids.py +0 -49
- nucliadb/tests/unit/test_health.py +0 -86
- nucliadb/tests/unit/test_kb_slugs.py +0 -54
- nucliadb/tests/unit/test_learning_proxy.py +0 -252
- nucliadb/tests/unit/test_metrics_exporter.py +0 -77
- nucliadb/tests/unit/test_purge.py +0 -136
- nucliadb/tests/utils/__init__.py +0 -74
- nucliadb/tests/utils/aiohttp_session.py +0 -44
- nucliadb/tests/utils/broker_messages/__init__.py +0 -171
- nucliadb/tests/utils/broker_messages/fields.py +0 -197
- nucliadb/tests/utils/broker_messages/helpers.py +0 -33
- nucliadb/tests/utils/entities.py +0 -78
- nucliadb/train/api/v1/check.py +0 -60
- nucliadb/train/tests/__init__.py +0 -19
- nucliadb/train/tests/conftest.py +0 -29
- nucliadb/train/tests/fixtures.py +0 -342
- nucliadb/train/tests/test_field_classification.py +0 -122
- nucliadb/train/tests/test_get_entities.py +0 -80
- nucliadb/train/tests/test_get_info.py +0 -51
- nucliadb/train/tests/test_get_ontology.py +0 -34
- nucliadb/train/tests/test_get_ontology_count.py +0 -63
- nucliadb/train/tests/test_image_classification.py +0 -221
- nucliadb/train/tests/test_list_fields.py +0 -39
- nucliadb/train/tests/test_list_paragraphs.py +0 -73
- nucliadb/train/tests/test_list_resources.py +0 -39
- nucliadb/train/tests/test_list_sentences.py +0 -71
- nucliadb/train/tests/test_paragraph_classification.py +0 -123
- nucliadb/train/tests/test_paragraph_streaming.py +0 -118
- nucliadb/train/tests/test_question_answer_streaming.py +0 -239
- nucliadb/train/tests/test_sentence_classification.py +0 -143
- nucliadb/train/tests/test_token_classification.py +0 -136
- nucliadb/train/tests/utils.py +0 -101
- nucliadb/writer/layouts/__init__.py +0 -51
- nucliadb/writer/layouts/v1.py +0 -59
- nucliadb/writer/tests/__init__.py +0 -19
- nucliadb/writer/tests/conftest.py +0 -31
- nucliadb/writer/tests/fixtures.py +0 -191
- nucliadb/writer/tests/test_fields.py +0 -475
- nucliadb/writer/tests/test_files.py +0 -740
- nucliadb/writer/tests/test_knowledgebox.py +0 -49
- nucliadb/writer/tests/test_reprocess_file_field.py +0 -133
- nucliadb/writer/tests/test_resources.py +0 -476
- nucliadb/writer/tests/test_service.py +0 -137
- nucliadb/writer/tests/test_tus.py +0 -203
- nucliadb/writer/tests/utils.py +0 -35
- nucliadb/writer/tus/pg.py +0 -125
- nucliadb-4.0.0.post542.dist-info/METADATA +0 -135
- nucliadb-4.0.0.post542.dist-info/RECORD +0 -462
- {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
- /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
- /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/entry_points.txt +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/top_level.txt +0 -0
- {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
|
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.
|
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
|
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)
|
nucliadb/writer/api/v1/field.py
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
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)
|