clarifai 11.3.0rc2__py3-none-any.whl → 11.4.0__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.
- clarifai/__init__.py +1 -1
- clarifai/cli/__main__.py +1 -1
- clarifai/cli/base.py +144 -136
- clarifai/cli/compute_cluster.py +45 -31
- clarifai/cli/deployment.py +93 -76
- clarifai/cli/model.py +578 -180
- clarifai/cli/nodepool.py +100 -82
- clarifai/client/__init__.py +12 -2
- clarifai/client/app.py +973 -911
- clarifai/client/auth/helper.py +345 -342
- clarifai/client/auth/register.py +7 -7
- clarifai/client/auth/stub.py +107 -106
- clarifai/client/base.py +185 -178
- clarifai/client/compute_cluster.py +214 -180
- clarifai/client/dataset.py +793 -698
- clarifai/client/deployment.py +55 -50
- clarifai/client/input.py +1223 -1088
- clarifai/client/lister.py +47 -45
- clarifai/client/model.py +1939 -1717
- clarifai/client/model_client.py +525 -502
- clarifai/client/module.py +82 -73
- clarifai/client/nodepool.py +358 -213
- clarifai/client/runner.py +58 -0
- clarifai/client/search.py +342 -309
- clarifai/client/user.py +419 -414
- clarifai/client/workflow.py +294 -274
- clarifai/constants/dataset.py +11 -17
- clarifai/constants/model.py +8 -2
- clarifai/datasets/export/inputs_annotations.py +233 -217
- clarifai/datasets/upload/base.py +63 -51
- clarifai/datasets/upload/features.py +43 -38
- clarifai/datasets/upload/image.py +237 -207
- clarifai/datasets/upload/loaders/coco_captions.py +34 -32
- clarifai/datasets/upload/loaders/coco_detection.py +72 -65
- clarifai/datasets/upload/loaders/imagenet_classification.py +57 -53
- clarifai/datasets/upload/loaders/xview_detection.py +274 -132
- clarifai/datasets/upload/multimodal.py +55 -46
- clarifai/datasets/upload/text.py +55 -47
- clarifai/datasets/upload/utils.py +250 -234
- clarifai/errors.py +51 -50
- clarifai/models/api.py +260 -238
- clarifai/modules/css.py +50 -50
- clarifai/modules/pages.py +33 -33
- clarifai/rag/rag.py +312 -288
- clarifai/rag/utils.py +91 -84
- clarifai/runners/models/model_builder.py +906 -802
- clarifai/runners/models/model_class.py +370 -331
- clarifai/runners/models/model_run_locally.py +459 -419
- clarifai/runners/models/model_runner.py +170 -162
- clarifai/runners/models/model_servicer.py +78 -70
- clarifai/runners/server.py +111 -101
- clarifai/runners/utils/code_script.py +225 -187
- clarifai/runners/utils/const.py +4 -1
- clarifai/runners/utils/data_types/__init__.py +12 -0
- clarifai/runners/utils/data_types/data_types.py +598 -0
- clarifai/runners/utils/data_utils.py +387 -440
- clarifai/runners/utils/loader.py +247 -227
- clarifai/runners/utils/method_signatures.py +411 -386
- clarifai/runners/utils/openai_convertor.py +108 -109
- clarifai/runners/utils/serializers.py +175 -179
- clarifai/runners/utils/url_fetcher.py +35 -35
- clarifai/schema/search.py +56 -63
- clarifai/urls/helper.py +125 -102
- clarifai/utils/cli.py +129 -123
- clarifai/utils/config.py +127 -87
- clarifai/utils/constants.py +49 -0
- clarifai/utils/evaluation/helpers.py +503 -466
- clarifai/utils/evaluation/main.py +431 -393
- clarifai/utils/evaluation/testset_annotation_parser.py +154 -144
- clarifai/utils/logging.py +324 -306
- clarifai/utils/misc.py +60 -56
- clarifai/utils/model_train.py +165 -146
- clarifai/utils/protobuf.py +126 -103
- clarifai/versions.py +3 -1
- clarifai/workflows/export.py +48 -50
- clarifai/workflows/utils.py +39 -36
- clarifai/workflows/validate.py +55 -43
- {clarifai-11.3.0rc2.dist-info → clarifai-11.4.0.dist-info}/METADATA +16 -6
- clarifai-11.4.0.dist-info/RECORD +109 -0
- {clarifai-11.3.0rc2.dist-info → clarifai-11.4.0.dist-info}/WHEEL +1 -1
- clarifai/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/__pycache__/errors.cpython-310.pyc +0 -0
- clarifai/__pycache__/errors.cpython-311.pyc +0 -0
- clarifai/__pycache__/versions.cpython-310.pyc +0 -0
- clarifai/__pycache__/versions.cpython-311.pyc +0 -0
- clarifai/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/cli/__pycache__/base.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/base.cpython-311.pyc +0 -0
- clarifai/cli/__pycache__/base_cli.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/compute_cluster.cpython-311.pyc +0 -0
- clarifai/cli/__pycache__/deployment.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/deployment.cpython-311.pyc +0 -0
- clarifai/cli/__pycache__/model.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/model.cpython-311.pyc +0 -0
- clarifai/cli/__pycache__/model_cli.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/nodepool.cpython-310.pyc +0 -0
- clarifai/cli/__pycache__/nodepool.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/client/__pycache__/app.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/app.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/app.cpython-39.pyc +0 -0
- clarifai/client/__pycache__/base.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/base.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/compute_cluster.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/dataset.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/dataset.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/deployment.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/deployment.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/input.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/input.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/lister.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/lister.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/model.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/model.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/module.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/module.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/nodepool.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/nodepool.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/search.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/search.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/user.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/user.cpython-311.pyc +0 -0
- clarifai/client/__pycache__/workflow.cpython-310.pyc +0 -0
- clarifai/client/__pycache__/workflow.cpython-311.pyc +0 -0
- clarifai/client/auth/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/client/auth/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/client/auth/__pycache__/helper.cpython-310.pyc +0 -0
- clarifai/client/auth/__pycache__/helper.cpython-311.pyc +0 -0
- clarifai/client/auth/__pycache__/register.cpython-310.pyc +0 -0
- clarifai/client/auth/__pycache__/register.cpython-311.pyc +0 -0
- clarifai/client/auth/__pycache__/stub.cpython-310.pyc +0 -0
- clarifai/client/auth/__pycache__/stub.cpython-311.pyc +0 -0
- clarifai/client/cli/__init__.py +0 -0
- clarifai/client/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/client/cli/__pycache__/base_cli.cpython-310.pyc +0 -0
- clarifai/client/cli/__pycache__/model_cli.cpython-310.pyc +0 -0
- clarifai/client/cli/base_cli.py +0 -88
- clarifai/client/cli/model_cli.py +0 -29
- clarifai/constants/__pycache__/base.cpython-310.pyc +0 -0
- clarifai/constants/__pycache__/base.cpython-311.pyc +0 -0
- clarifai/constants/__pycache__/dataset.cpython-310.pyc +0 -0
- clarifai/constants/__pycache__/dataset.cpython-311.pyc +0 -0
- clarifai/constants/__pycache__/input.cpython-310.pyc +0 -0
- clarifai/constants/__pycache__/input.cpython-311.pyc +0 -0
- clarifai/constants/__pycache__/model.cpython-310.pyc +0 -0
- clarifai/constants/__pycache__/model.cpython-311.pyc +0 -0
- clarifai/constants/__pycache__/rag.cpython-310.pyc +0 -0
- clarifai/constants/__pycache__/rag.cpython-311.pyc +0 -0
- clarifai/constants/__pycache__/search.cpython-310.pyc +0 -0
- clarifai/constants/__pycache__/search.cpython-311.pyc +0 -0
- clarifai/constants/__pycache__/workflow.cpython-310.pyc +0 -0
- clarifai/constants/__pycache__/workflow.cpython-311.pyc +0 -0
- clarifai/datasets/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/datasets/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/datasets/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/datasets/export/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/datasets/export/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/datasets/export/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/datasets/export/__pycache__/inputs_annotations.cpython-310.pyc +0 -0
- clarifai/datasets/export/__pycache__/inputs_annotations.cpython-311.pyc +0 -0
- clarifai/datasets/upload/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/datasets/upload/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/datasets/upload/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/datasets/upload/__pycache__/base.cpython-310.pyc +0 -0
- clarifai/datasets/upload/__pycache__/base.cpython-311.pyc +0 -0
- clarifai/datasets/upload/__pycache__/features.cpython-310.pyc +0 -0
- clarifai/datasets/upload/__pycache__/features.cpython-311.pyc +0 -0
- clarifai/datasets/upload/__pycache__/image.cpython-310.pyc +0 -0
- clarifai/datasets/upload/__pycache__/image.cpython-311.pyc +0 -0
- clarifai/datasets/upload/__pycache__/multimodal.cpython-310.pyc +0 -0
- clarifai/datasets/upload/__pycache__/multimodal.cpython-311.pyc +0 -0
- clarifai/datasets/upload/__pycache__/text.cpython-310.pyc +0 -0
- clarifai/datasets/upload/__pycache__/text.cpython-311.pyc +0 -0
- clarifai/datasets/upload/__pycache__/utils.cpython-310.pyc +0 -0
- clarifai/datasets/upload/__pycache__/utils.cpython-311.pyc +0 -0
- clarifai/datasets/upload/loaders/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/datasets/upload/loaders/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/datasets/upload/loaders/__pycache__/coco_detection.cpython-311.pyc +0 -0
- clarifai/datasets/upload/loaders/__pycache__/imagenet_classification.cpython-311.pyc +0 -0
- clarifai/models/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/modules/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/rag/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/rag/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/rag/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/rag/__pycache__/rag.cpython-310.pyc +0 -0
- clarifai/rag/__pycache__/rag.cpython-311.pyc +0 -0
- clarifai/rag/__pycache__/rag.cpython-39.pyc +0 -0
- clarifai/rag/__pycache__/utils.cpython-310.pyc +0 -0
- clarifai/rag/__pycache__/utils.cpython-311.pyc +0 -0
- clarifai/runners/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/runners/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/runners/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/runners/dockerfile_template/Dockerfile.cpu.template +0 -31
- clarifai/runners/dockerfile_template/Dockerfile.cuda.template +0 -42
- clarifai/runners/dockerfile_template/Dockerfile.nim +0 -71
- clarifai/runners/models/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/runners/models/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/runners/models/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/runners/models/__pycache__/base_typed_model.cpython-310.pyc +0 -0
- clarifai/runners/models/__pycache__/base_typed_model.cpython-311.pyc +0 -0
- clarifai/runners/models/__pycache__/base_typed_model.cpython-39.pyc +0 -0
- clarifai/runners/models/__pycache__/model_builder.cpython-311.pyc +0 -0
- clarifai/runners/models/__pycache__/model_class.cpython-310.pyc +0 -0
- clarifai/runners/models/__pycache__/model_class.cpython-311.pyc +0 -0
- clarifai/runners/models/__pycache__/model_run_locally.cpython-310-pytest-7.1.2.pyc +0 -0
- clarifai/runners/models/__pycache__/model_run_locally.cpython-310.pyc +0 -0
- clarifai/runners/models/__pycache__/model_run_locally.cpython-311.pyc +0 -0
- clarifai/runners/models/__pycache__/model_runner.cpython-310.pyc +0 -0
- clarifai/runners/models/__pycache__/model_runner.cpython-311.pyc +0 -0
- clarifai/runners/models/__pycache__/model_upload.cpython-310.pyc +0 -0
- clarifai/runners/models/base_typed_model.py +0 -238
- clarifai/runners/models/model_class_refract.py +0 -80
- clarifai/runners/models/model_upload.py +0 -607
- clarifai/runners/models/temp.py +0 -25
- clarifai/runners/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/runners/utils/__pycache__/__init__.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/buffered_stream.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/buffered_stream.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/buffered_stream.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/const.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/const.cpython-311.pyc +0 -0
- clarifai/runners/utils/__pycache__/constants.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/constants.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/constants.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_handler.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_handler.cpython-311.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_handler.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_handler.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_utils.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_utils.cpython-311.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_utils.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/data_utils.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/grpc_server.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/grpc_server.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/grpc_server.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/health.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/health.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/health.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/loader.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/loader.cpython-311.pyc +0 -0
- clarifai/runners/utils/__pycache__/logging.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/logging.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/logging.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/stream_source.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/stream_source.cpython-39.pyc +0 -0
- clarifai/runners/utils/__pycache__/url_fetcher.cpython-310.pyc +0 -0
- clarifai/runners/utils/__pycache__/url_fetcher.cpython-311.pyc +0 -0
- clarifai/runners/utils/__pycache__/url_fetcher.cpython-38.pyc +0 -0
- clarifai/runners/utils/__pycache__/url_fetcher.cpython-39.pyc +0 -0
- clarifai/runners/utils/data_handler.py +0 -231
- clarifai/runners/utils/data_handler_refract.py +0 -213
- clarifai/runners/utils/data_types.py +0 -469
- clarifai/runners/utils/logger.py +0 -0
- clarifai/runners/utils/openai_format.py +0 -87
- clarifai/schema/__pycache__/search.cpython-310.pyc +0 -0
- clarifai/schema/__pycache__/search.cpython-311.pyc +0 -0
- clarifai/urls/__pycache__/helper.cpython-310.pyc +0 -0
- clarifai/urls/__pycache__/helper.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/utils/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/utils/__pycache__/cli.cpython-310.pyc +0 -0
- clarifai/utils/__pycache__/cli.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/config.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/constants.cpython-310.pyc +0 -0
- clarifai/utils/__pycache__/constants.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/logging.cpython-310.pyc +0 -0
- clarifai/utils/__pycache__/logging.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/misc.cpython-310.pyc +0 -0
- clarifai/utils/__pycache__/misc.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/model_train.cpython-310.pyc +0 -0
- clarifai/utils/__pycache__/model_train.cpython-311.pyc +0 -0
- clarifai/utils/__pycache__/protobuf.cpython-311.pyc +0 -0
- clarifai/utils/evaluation/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/utils/evaluation/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/utils/evaluation/__pycache__/helpers.cpython-311.pyc +0 -0
- clarifai/utils/evaluation/__pycache__/main.cpython-311.pyc +0 -0
- clarifai/utils/evaluation/__pycache__/main.cpython-39.pyc +0 -0
- clarifai/workflows/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai/workflows/__pycache__/__init__.cpython-311.pyc +0 -0
- clarifai/workflows/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai/workflows/__pycache__/export.cpython-310.pyc +0 -0
- clarifai/workflows/__pycache__/export.cpython-311.pyc +0 -0
- clarifai/workflows/__pycache__/utils.cpython-310.pyc +0 -0
- clarifai/workflows/__pycache__/utils.cpython-311.pyc +0 -0
- clarifai/workflows/__pycache__/validate.cpython-310.pyc +0 -0
- clarifai/workflows/__pycache__/validate.cpython-311.pyc +0 -0
- clarifai-11.3.0rc2.dist-info/RECORD +0 -322
- {clarifai-11.3.0rc2.dist-info → clarifai-11.4.0.dist-info}/entry_points.txt +0 -0
- {clarifai-11.3.0rc2.dist-info → clarifai-11.4.0.dist-info/licenses}/LICENSE +0 -0
- {clarifai-11.3.0rc2.dist-info → clarifai-11.4.0.dist-info}/top_level.txt +0 -0
@@ -1,30 +1,28 @@
|
|
1
|
-
import operator
|
2
1
|
from io import BytesIO
|
3
2
|
from typing import List
|
4
3
|
|
5
4
|
from clarifai_grpc.grpc.api import resources_pb2
|
6
|
-
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeEnumOption
|
5
|
+
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeEnumOption, ModelTypeRangeInfo
|
7
6
|
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeField as InputFieldProto
|
8
|
-
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeRangeInfo
|
9
7
|
from PIL import Image
|
10
8
|
|
11
9
|
from clarifai.runners.utils.data_types import MessageData
|
12
10
|
|
13
11
|
|
14
12
|
def image_to_bytes(img: Image.Image, format="JPEG") -> bytes:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
buffered = BytesIO()
|
14
|
+
img.save(buffered, format=format)
|
15
|
+
img_str = buffered.getvalue()
|
16
|
+
return img_str
|
19
17
|
|
20
18
|
|
21
19
|
def bytes_to_image(bytes_img) -> Image.Image:
|
22
|
-
|
23
|
-
|
20
|
+
img = Image.open(BytesIO(bytes_img))
|
21
|
+
return img
|
24
22
|
|
25
23
|
|
26
24
|
def is_openai_chat_format(messages):
|
27
|
-
|
25
|
+
"""
|
28
26
|
Verify if the given argument follows the OpenAI chat messages format.
|
29
27
|
|
30
28
|
Args:
|
@@ -33,447 +31,396 @@ def is_openai_chat_format(messages):
|
|
33
31
|
Returns:
|
34
32
|
bool: True if valid, False otherwise.
|
35
33
|
"""
|
36
|
-
|
37
|
-
|
34
|
+
if not isinstance(messages, list):
|
35
|
+
return False
|
38
36
|
|
39
|
-
|
37
|
+
valid_roles = {"system", "user", "assistant", "function"}
|
40
38
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
39
|
+
for msg in messages:
|
40
|
+
if not isinstance(msg, dict):
|
41
|
+
return False
|
42
|
+
if "role" not in msg or "content" not in msg:
|
43
|
+
return False
|
44
|
+
if msg["role"] not in valid_roles:
|
45
|
+
return False
|
48
46
|
|
49
|
-
|
47
|
+
content = msg["content"]
|
50
48
|
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
# Content should be either a string (text message) or a multimodal list
|
50
|
+
if isinstance(content, str):
|
51
|
+
continue # Valid text message
|
54
52
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
elif isinstance(content, list):
|
54
|
+
for item in content:
|
55
|
+
if not isinstance(item, dict):
|
56
|
+
return False
|
57
|
+
return True
|
60
58
|
|
61
59
|
|
62
60
|
class InputField(MessageData):
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
if self.choices is not None:
|
196
|
-
for choice in self.choices:
|
197
|
-
option = ModelTypeEnumOption(id=str(choice))
|
198
|
-
proto.model_type_enum_options.append(option)
|
199
|
-
|
200
|
-
proto.required = self.default is None
|
201
|
-
|
202
|
-
if self.min_value is not None or self.max_value is not None:
|
203
|
-
range_info = ModelTypeRangeInfo()
|
204
|
-
if self.min_value is not None:
|
205
|
-
range_info.min = float(self.min_value)
|
206
|
-
if self.max_value is not None:
|
207
|
-
range_info.max = float(self.max_value)
|
208
|
-
proto.model_type_range_info.CopyFrom(range_info)
|
209
|
-
proto.is_param = self.is_param
|
210
|
-
|
211
|
-
if self.default is not None:
|
212
|
-
proto = self.set_default(proto, self.default)
|
61
|
+
"""A field that can be used to store input data."""
|
62
|
+
|
63
|
+
def __init__(
|
64
|
+
self,
|
65
|
+
default=None,
|
66
|
+
description=None,
|
67
|
+
min_value=None,
|
68
|
+
max_value=None,
|
69
|
+
choices=None,
|
70
|
+
# is_param=True
|
71
|
+
):
|
72
|
+
self.default = default
|
73
|
+
self.description = description
|
74
|
+
self.min_value = min_value
|
75
|
+
self.max_value = max_value
|
76
|
+
self.choices = choices
|
77
|
+
# self.is_param = is_param
|
78
|
+
|
79
|
+
def __repr__(self) -> str:
|
80
|
+
attrs = []
|
81
|
+
if self.default is not None:
|
82
|
+
attrs.append(f"default={self.default!r}")
|
83
|
+
if self.description is not None:
|
84
|
+
attrs.append(f"description={self.description!r}")
|
85
|
+
if self.min_value is not None:
|
86
|
+
attrs.append(f"min_value={self.min_value!r}")
|
87
|
+
if self.max_value is not None:
|
88
|
+
attrs.append(f"max_value={self.max_value!r}")
|
89
|
+
if self.choices is not None:
|
90
|
+
attrs.append(f"choices={self.choices!r}")
|
91
|
+
# attrs.append(f"is_param={self.is_param!r}")
|
92
|
+
return f"InputField({', '.join(attrs)})"
|
93
|
+
|
94
|
+
def to_proto(self, proto=None) -> InputFieldProto:
|
95
|
+
if proto is None:
|
96
|
+
proto = InputFieldProto()
|
97
|
+
if self.description is not None:
|
98
|
+
proto.description = self.description
|
99
|
+
|
100
|
+
if self.choices is not None:
|
101
|
+
for choice in self.choices:
|
102
|
+
option = ModelTypeEnumOption(id=str(choice))
|
103
|
+
proto.model_type_enum_options.append(option)
|
104
|
+
|
105
|
+
proto.required = self.default is None
|
106
|
+
|
107
|
+
if self.min_value is not None or self.max_value is not None:
|
108
|
+
range_info = ModelTypeRangeInfo()
|
109
|
+
if self.min_value is not None:
|
110
|
+
range_info.min = float(self.min_value)
|
111
|
+
if self.max_value is not None:
|
112
|
+
range_info.max = float(self.max_value)
|
113
|
+
proto.model_type_range_info.CopyFrom(range_info)
|
114
|
+
# proto.is_param = self.is_param
|
115
|
+
|
116
|
+
if self.default is not None:
|
117
|
+
proto = self.set_default(proto, self.default)
|
118
|
+
|
119
|
+
return proto
|
120
|
+
|
121
|
+
@classmethod
|
122
|
+
def from_proto(cls, proto):
|
123
|
+
default = None
|
124
|
+
if proto.HasField('default'):
|
125
|
+
pb_value = proto.default
|
126
|
+
if pb_value.HasField('string_value'):
|
127
|
+
default = pb_value.string_value
|
128
|
+
try:
|
129
|
+
import json
|
130
|
+
|
131
|
+
default = json.loads(default)
|
132
|
+
except json.JSONDecodeError:
|
133
|
+
pass
|
134
|
+
elif pb_value.HasField('number_value'):
|
135
|
+
default = pb_value.number_value
|
136
|
+
if default.is_integer():
|
137
|
+
default = int(default)
|
138
|
+
else:
|
139
|
+
default = float(default)
|
140
|
+
elif pb_value.HasField('bool_value'):
|
141
|
+
default = pb_value.bool_value
|
142
|
+
|
143
|
+
choices = (
|
144
|
+
[option.id for option in proto.model_type_enum_options]
|
145
|
+
if proto.model_type_enum_options
|
146
|
+
else None
|
147
|
+
)
|
148
|
+
|
149
|
+
min_value = None
|
150
|
+
max_value = None
|
151
|
+
if proto.HasField('model_type_range_info'):
|
152
|
+
min_value = proto.model_type_range_info.min
|
153
|
+
max_value = proto.model_type_range_info.max
|
154
|
+
if min_value.is_integer():
|
155
|
+
min_value = int(min_value)
|
156
|
+
if max_value.is_integer():
|
157
|
+
max_value = int(max_value)
|
158
|
+
|
159
|
+
return cls(
|
160
|
+
default=default,
|
161
|
+
description=proto.description if proto.description else None,
|
162
|
+
min_value=min_value,
|
163
|
+
max_value=max_value,
|
164
|
+
choices=choices,
|
165
|
+
# is_param=proto.is_param
|
166
|
+
)
|
167
|
+
|
168
|
+
@classmethod
|
169
|
+
def set_default(cls, proto=None, default=None):
|
170
|
+
try:
|
171
|
+
import json
|
172
|
+
|
173
|
+
if proto is None:
|
174
|
+
proto = InputFieldProto()
|
175
|
+
if default is not None:
|
176
|
+
proto.default = json.dumps(default)
|
177
|
+
return proto
|
178
|
+
except Exception:
|
179
|
+
if default is not None:
|
180
|
+
proto.default = str(default)
|
181
|
+
return proto
|
182
|
+
except Exception as e:
|
183
|
+
raise ValueError(
|
184
|
+
f"Error setting default value of type, {type(default)} and value: {default}: {e}"
|
185
|
+
)
|
186
|
+
|
187
|
+
@classmethod
|
188
|
+
def get_default(cls, proto):
|
189
|
+
default_str = proto.default
|
190
|
+
default = None
|
191
|
+
import json
|
213
192
|
|
214
|
-
return proto
|
215
|
-
|
216
|
-
@classmethod
|
217
|
-
def from_proto(cls, proto):
|
218
|
-
default = None
|
219
|
-
if proto.HasField('default'):
|
220
|
-
pb_value = proto.default
|
221
|
-
if pb_value.HasField('string_value'):
|
222
|
-
default = pb_value.string_value
|
223
193
|
try:
|
224
|
-
|
225
|
-
|
194
|
+
# Attempt to parse as JSON first (for complex types)
|
195
|
+
return json.loads(default_str)
|
226
196
|
except json.JSONDecodeError:
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
max_value=max_value,
|
255
|
-
choices=choices,
|
256
|
-
is_param=proto.is_param)
|
257
|
-
|
258
|
-
@classmethod
|
259
|
-
def set_default(cls, proto=None, default=None):
|
260
|
-
try:
|
261
|
-
import json
|
262
|
-
if proto is None:
|
263
|
-
proto = InputFieldProto()
|
264
|
-
if default is not None:
|
265
|
-
proto.default = json.dumps(default)
|
266
|
-
return proto
|
267
|
-
except Exception:
|
268
|
-
if default is not None:
|
269
|
-
proto.default = str(default)
|
270
|
-
return proto
|
271
|
-
except Exception as e:
|
272
|
-
raise ValueError(
|
273
|
-
f"Error setting default value of type, {type(default)} and value: {default}: {e}")
|
274
|
-
|
275
|
-
@classmethod
|
276
|
-
def get_default(cls, proto):
|
277
|
-
default_str = proto.default
|
278
|
-
default = None
|
279
|
-
import json
|
280
|
-
try:
|
281
|
-
# Attempt to parse as JSON first (for complex types)
|
282
|
-
return json.loads(default_str)
|
283
|
-
except json.JSONDecodeError:
|
284
|
-
pass
|
285
|
-
# Check for boolean values stored as "True" or "False"
|
286
|
-
if proto.type == resources_pb2.ModelTypeField.DataType.BOOL:
|
287
|
-
try:
|
288
|
-
default = bool(default_str)
|
289
|
-
except ValueError:
|
290
|
-
pass
|
291
|
-
# Try to parse as integer
|
292
|
-
elif proto.type == resources_pb2.ModelTypeField.DataType.INT:
|
293
|
-
try:
|
294
|
-
default = int(default_str)
|
295
|
-
except ValueError:
|
296
|
-
pass
|
297
|
-
|
298
|
-
# Try to parse as float
|
299
|
-
elif proto.type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
300
|
-
try:
|
301
|
-
default = float(default_str)
|
302
|
-
except ValueError:
|
303
|
-
pass
|
304
|
-
elif proto.type == resources_pb2.ModelTypeField.DataType.STR:
|
305
|
-
default = default_str
|
306
|
-
|
307
|
-
if default is None:
|
308
|
-
# If all parsing fails, return the string value
|
309
|
-
default = default_str
|
310
|
-
return default
|
197
|
+
pass
|
198
|
+
# Check for boolean values stored as "True" or "False"
|
199
|
+
if proto.type == resources_pb2.ModelTypeField.DataType.BOOL:
|
200
|
+
try:
|
201
|
+
default = bool(default_str)
|
202
|
+
except ValueError:
|
203
|
+
pass
|
204
|
+
# Try to parse as integer
|
205
|
+
elif proto.type == resources_pb2.ModelTypeField.DataType.INT:
|
206
|
+
try:
|
207
|
+
default = int(default_str)
|
208
|
+
except ValueError:
|
209
|
+
pass
|
210
|
+
|
211
|
+
# Try to parse as float
|
212
|
+
elif proto.type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
213
|
+
try:
|
214
|
+
default = float(default_str)
|
215
|
+
except ValueError:
|
216
|
+
pass
|
217
|
+
elif proto.type == resources_pb2.ModelTypeField.DataType.STR:
|
218
|
+
default = default_str
|
219
|
+
|
220
|
+
if default is None:
|
221
|
+
# If all parsing fails, return the string value
|
222
|
+
default = default_str
|
223
|
+
return default
|
311
224
|
|
312
225
|
|
313
226
|
class DataConverter:
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
return
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
"
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
227
|
+
"""A class that can be used to convert data to and from a specific format."""
|
228
|
+
|
229
|
+
@classmethod
|
230
|
+
def convert_input_data_to_new_format(
|
231
|
+
cls, data: resources_pb2.Data, input_fields: List[resources_pb2.ModelTypeField]
|
232
|
+
) -> resources_pb2.Data:
|
233
|
+
"""Convert input data to new format."""
|
234
|
+
new_data = resources_pb2.Data()
|
235
|
+
for field in input_fields:
|
236
|
+
part_data = cls._convert_field(data, field)
|
237
|
+
if cls._is_data_set(part_data):
|
238
|
+
# if the field is set, add it to the new data part
|
239
|
+
part = new_data.parts.add()
|
240
|
+
part.id = field.name
|
241
|
+
part.data.CopyFrom(part_data)
|
242
|
+
elif field.required:
|
243
|
+
raise ValueError(f"Field {field.name} is required but not set")
|
244
|
+
return new_data
|
245
|
+
|
246
|
+
@classmethod
|
247
|
+
def _convert_field(
|
248
|
+
cls, old_data: resources_pb2.Data, field: resources_pb2.ModelTypeField
|
249
|
+
) -> resources_pb2.Data:
|
250
|
+
data_type = field.type
|
251
|
+
new_data = resources_pb2.Data()
|
252
|
+
if data_type == resources_pb2.ModelTypeField.DataType.STR:
|
253
|
+
if old_data.HasField('text'):
|
254
|
+
new_data.string_value = old_data.text.raw
|
255
|
+
old_data.ClearField('text')
|
256
|
+
return new_data
|
257
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.IMAGE:
|
258
|
+
if old_data.HasField('image'):
|
259
|
+
new_data.image.CopyFrom(old_data.image)
|
260
|
+
# Clear the old field to avoid duplication
|
261
|
+
old_data.ClearField('image')
|
262
|
+
return new_data
|
263
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.VIDEO:
|
264
|
+
if old_data.HasField('video'):
|
265
|
+
new_data.video.CopyFrom(old_data.video)
|
266
|
+
old_data.ClearField('video')
|
267
|
+
return new_data
|
268
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.BOOL:
|
269
|
+
if old_data.bool_value is not False:
|
270
|
+
new_data.bool_value = old_data.bool_value
|
271
|
+
old_data.bool_value = False
|
272
|
+
return new_data
|
273
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.INT:
|
274
|
+
if old_data.int_value != 0:
|
275
|
+
new_data.int_value = old_data.int_value
|
276
|
+
old_data.int_value = 0
|
277
|
+
return new_data
|
278
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
279
|
+
if old_data.float_value != 0.0:
|
280
|
+
new_data.float_value = old_data.float_value
|
281
|
+
old_data.float_value = 0.0
|
282
|
+
return new_data
|
283
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.BYTES:
|
284
|
+
if old_data.bytes_value != b"":
|
285
|
+
new_data.bytes_value = old_data.bytes_value
|
286
|
+
old_data.bytes_value = b""
|
287
|
+
return new_data
|
288
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.NDARRAY:
|
289
|
+
if old_data.HasField('ndarray'):
|
290
|
+
new_data.ndarray.CopyFrom(old_data.ndarray)
|
291
|
+
old_data.ClearField('ndarray')
|
292
|
+
return new_data
|
293
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.TEXT:
|
294
|
+
if old_data.HasField('text'):
|
295
|
+
new_data.text.CopyFrom(old_data.text)
|
296
|
+
old_data.ClearField('text')
|
297
|
+
return new_data
|
298
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.AUDIO:
|
299
|
+
if old_data.HasField('audio'):
|
300
|
+
new_data.audio.CopyFrom(old_data.audio)
|
301
|
+
old_data.ClearField('audio')
|
302
|
+
return new_data
|
303
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.CONCEPT:
|
304
|
+
if old_data.concepts:
|
305
|
+
new_data.concepts.extend(old_data.concepts)
|
306
|
+
old_data.ClearField('concepts')
|
307
|
+
return new_data
|
308
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.REGION:
|
309
|
+
if old_data.regions:
|
310
|
+
new_data.regions.extend(old_data.regions)
|
311
|
+
old_data.ClearField('regions')
|
312
|
+
return new_data
|
313
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.FRAME:
|
314
|
+
if old_data.frames:
|
315
|
+
new_data.frames.extend(old_data.frames)
|
316
|
+
old_data.ClearField('frames')
|
317
|
+
return new_data
|
318
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.LIST:
|
319
|
+
if not field.type_args:
|
320
|
+
raise ValueError("LIST type requires type_args")
|
321
|
+
element_field = field.type_args[0]
|
322
|
+
if element_field in (
|
323
|
+
resources_pb2.ModelTypeField.DataType.CONCEPT,
|
324
|
+
resources_pb2.ModelTypeField.DataType.REGION,
|
325
|
+
resources_pb2.ModelTypeField.DataType.FRAME,
|
326
|
+
):
|
327
|
+
# convert to new format
|
328
|
+
new_data = cls._convert_field(old_data, element_field)
|
329
|
+
return new_data
|
330
|
+
else:
|
331
|
+
return new_data
|
332
|
+
# raise ValueError(f"Unsupported data type: {data_type}")
|
333
|
+
|
334
|
+
@classmethod
|
335
|
+
def is_old_format(cls, data: resources_pb2.Data) -> bool:
|
336
|
+
"""Check if the Data proto is in the old format (without parts)."""
|
337
|
+
if len(data.parts) > 0:
|
338
|
+
return False # New format uses parts
|
339
|
+
|
340
|
+
# Check if any singular field is set
|
341
|
+
singular_fields = [
|
342
|
+
'image',
|
343
|
+
'video',
|
344
|
+
'metadata',
|
345
|
+
'geo',
|
346
|
+
'text',
|
347
|
+
'audio',
|
348
|
+
'ndarray',
|
349
|
+
'int_value',
|
350
|
+
'float_value',
|
351
|
+
'bytes_value',
|
352
|
+
'bool_value',
|
353
|
+
'string_value',
|
354
|
+
]
|
355
|
+
for field in singular_fields:
|
356
|
+
if data.HasField(field):
|
357
|
+
return True
|
358
|
+
|
359
|
+
# Check if any repeated field has elements
|
360
|
+
repeated_fields = [
|
361
|
+
'concepts',
|
362
|
+
'colors',
|
363
|
+
'clusters',
|
364
|
+
'embeddings',
|
365
|
+
'regions',
|
366
|
+
'frames',
|
367
|
+
'tracks',
|
368
|
+
'time_segments',
|
369
|
+
'hits',
|
370
|
+
'heatmaps',
|
371
|
+
]
|
372
|
+
for field in repeated_fields:
|
373
|
+
if getattr(data, field):
|
374
|
+
return True
|
375
|
+
|
376
|
+
return False
|
377
|
+
|
378
|
+
@classmethod
|
379
|
+
def convert_output_data_to_old_format(cls, data: resources_pb2.Data) -> resources_pb2.Data:
|
380
|
+
"""Convert output data to old format."""
|
381
|
+
old_data = resources_pb2.Data()
|
382
|
+
part_data = data.parts[0].data
|
383
|
+
# Handle text.raw specially (common case for text outputs)
|
384
|
+
old_data = part_data
|
385
|
+
if old_data.string_value:
|
386
|
+
old_data.text.raw = old_data.string_value
|
387
|
+
|
388
|
+
return old_data
|
389
|
+
|
390
|
+
@classmethod
|
391
|
+
def _is_data_set(cls, data_msg):
|
392
|
+
# Singular message fields
|
393
|
+
singular_fields = ["image", "video", "metadata", "geo", "text", "audio", "ndarray"]
|
394
|
+
for field in singular_fields:
|
395
|
+
if data_msg.HasField(field):
|
396
|
+
return True
|
397
|
+
|
398
|
+
# Repeated fields
|
399
|
+
repeated_fields = [
|
400
|
+
"concepts",
|
401
|
+
"colors",
|
402
|
+
"clusters",
|
403
|
+
"embeddings",
|
404
|
+
"regions",
|
405
|
+
"frames",
|
406
|
+
"tracks",
|
407
|
+
"time_segments",
|
408
|
+
"hits",
|
409
|
+
"heatmaps",
|
410
|
+
"parts",
|
411
|
+
]
|
412
|
+
for field in repeated_fields:
|
413
|
+
if getattr(data_msg, field): # checks if the list is not empty
|
414
|
+
return True
|
415
|
+
|
416
|
+
# Scalar fields (proto3 default: 0 for numbers, empty for strings/bytes, False for bool)
|
417
|
+
if (
|
418
|
+
data_msg.int_value != 0
|
419
|
+
or data_msg.float_value != 0.0
|
420
|
+
or data_msg.bytes_value != b""
|
421
|
+
or data_msg.bool_value is True
|
422
|
+
or data_msg.string_value != ""
|
423
|
+
):
|
424
|
+
return True
|
425
|
+
|
426
|
+
return False
|