clarifai 11.2.3rc5__tar.gz → 11.2.3rc7__tar.gz
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-11.2.3rc5/clarifai.egg-info → clarifai-11.2.3rc7}/PKG-INFO +1 -1
- clarifai-11.2.3rc7/clarifai/__init__.py +1 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/model_class.py +11 -165
- clarifai-11.2.3rc7/clarifai/runners/utils/data_utils.py +337 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7/clarifai.egg-info}/PKG-INFO +1 -1
- clarifai-11.2.3rc5/clarifai/__init__.py +0 -1
- clarifai-11.2.3rc5/clarifai/runners/utils/data_utils.py +0 -180
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/LICENSE +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/MANIFEST.in +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/README.md +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/__pycache__/errors.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/__pycache__/versions.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/README.md +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__main__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/base_cli.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/deployment.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/model_cli.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/__pycache__/nodepool.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/base.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/compute_cluster.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/deployment.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/model.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli/nodepool.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/cli.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/app.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/app.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/dataset.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/deployment.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/input.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/lister.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/module.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/nodepool.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/search.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/user.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/__pycache__/workflow.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/app.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/__pycache__/helper.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/__pycache__/register.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/__pycache__/stub.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/helper.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/register.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/auth/stub.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/base.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/compute_cluster.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/dataset.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/deployment.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/input.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/lister.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/model.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/model_client.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/module.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/nodepool.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/search.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/user.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/client/workflow.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/__pycache__/dataset.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/__pycache__/input.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/__pycache__/model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/__pycache__/rag.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/__pycache__/search.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/__pycache__/workflow.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/base.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/dataset.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/input.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/model.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/rag.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/search.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/constants/workflow.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/export/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/export/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/export/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/export/__pycache__/inputs_annotations.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/export/inputs_annotations.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/features.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/image.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/multimodal.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/text.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/__pycache__/utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/base.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/features.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/image.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/loaders/README.md +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/loaders/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/loaders/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/loaders/coco_captions.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/loaders/coco_detection.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/loaders/imagenet_classification.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/multimodal.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/text.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/datasets/upload/utils.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/errors.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/models/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/models/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/models/api.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/modules/README.md +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/modules/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/modules/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/modules/css.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/modules/pages.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/modules/style.css +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/__pycache__/rag.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/__pycache__/rag.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/__pycache__/utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/rag.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/rag/utils.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/dockerfile_template/Dockerfile.template +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/base_typed_model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/base_typed_model.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/model_class.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/model_run_locally.cpython-310-pytest-7.1.2.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/model_run_locally.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/model_runner.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/__pycache__/model_upload.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/model_builder.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/model_run_locally.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/model_runner.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/models/model_servicer.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/server.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/__init__.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/buffered_stream.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/buffered_stream.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/buffered_stream.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/const.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/constants.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/constants.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/constants.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/data_handler.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/data_handler.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/data_handler.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/data_utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/data_utils.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/data_utils.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/grpc_server.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/grpc_server.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/grpc_server.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/health.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/health.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/health.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/loader.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/logging.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/logging.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/logging.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/stream_source.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/stream_source.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/url_fetcher.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/url_fetcher.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/__pycache__/url_fetcher.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/code_script.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/const.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/data_types.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/loader.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/method_signatures.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/serializers.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/runners/utils/url_fetcher.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/schema/__pycache__/search.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/schema/search.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/urls/__pycache__/helper.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/urls/helper.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__pycache__/cli.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__pycache__/constants.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__pycache__/logging.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__pycache__/misc.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/__pycache__/model_train.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/cli.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/constants.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/evaluation/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/evaluation/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/evaluation/__pycache__/main.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/evaluation/helpers.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/evaluation/main.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/logging.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/misc.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/utils/model_train.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/versions.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/__init__.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/__pycache__/export.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/__pycache__/utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/__pycache__/validate.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/export.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/utils.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai/workflows/validate.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai.egg-info/SOURCES.txt +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai.egg-info/dependency_links.txt +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai.egg-info/entry_points.txt +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai.egg-info/requires.txt +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/clarifai.egg-info/top_level.txt +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/pyproject.toml +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/requirements.txt +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/setup.cfg +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/setup.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_app.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_auth.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_data_upload.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_eval.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_misc.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_model_predict.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_model_train.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_modules.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_rag.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_search.py +0 -0
- {clarifai-11.2.3rc5 → clarifai-11.2.3rc7}/tests/test_stub.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "11.2.3rc7"
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import inspect
|
2
2
|
import itertools
|
3
|
-
import json
|
4
3
|
import logging
|
5
4
|
import os
|
6
5
|
import traceback
|
@@ -12,6 +11,7 @@ from clarifai_grpc.grpc.api.status import status_code_pb2, status_pb2
|
|
12
11
|
from google.protobuf import json_format
|
13
12
|
|
14
13
|
from clarifai.runners.utils import data_types
|
14
|
+
from clarifai.runners.utils.data_utils import DataConverter
|
15
15
|
from clarifai.runners.utils.method_signatures import (build_function_signature, deserialize,
|
16
16
|
get_stream_from_signature, serialize,
|
17
17
|
signatures_to_json)
|
@@ -71,163 +71,6 @@ class ModelClass(ABC):
|
|
71
71
|
output.data.text.raw = signatures_to_json(signatures)
|
72
72
|
return resp
|
73
73
|
|
74
|
-
def _is_data_set(self, data_msg):
|
75
|
-
# Singular message fields
|
76
|
-
singular_fields = [
|
77
|
-
"image", "video", "metadata", "geo", "text", "audio", "ndarray"
|
78
|
-
]
|
79
|
-
for field in singular_fields:
|
80
|
-
if data_msg.HasField(field):
|
81
|
-
return True
|
82
|
-
|
83
|
-
# Repeated fields
|
84
|
-
repeated_fields = [
|
85
|
-
"concepts", "colors", "clusters", "embeddings", "regions", "frames",
|
86
|
-
"tracks", "time_segments", "hits", "heatmaps", "parts"
|
87
|
-
]
|
88
|
-
for field in repeated_fields:
|
89
|
-
if getattr(data_msg, field): # checks if the list is not empty
|
90
|
-
return True
|
91
|
-
|
92
|
-
# Scalar fields (proto3 default: 0 for numbers, empty for strings/bytes, False for bool)
|
93
|
-
if (
|
94
|
-
data_msg.int_value != 0 or
|
95
|
-
data_msg.float_value != 0.0 or
|
96
|
-
data_msg.bytes_value != b"" or
|
97
|
-
data_msg.bool_value is True or
|
98
|
-
data_msg.string_value != ""
|
99
|
-
):
|
100
|
-
return True
|
101
|
-
|
102
|
-
return False
|
103
|
-
|
104
|
-
|
105
|
-
def _convert_input_data_to_new_format(
|
106
|
-
self, data: resources_pb2.Data,
|
107
|
-
input_fields: List[resources_pb2.ModelTypeField]) -> resources_pb2.Data:
|
108
|
-
"""Convert input data to new format."""
|
109
|
-
new_data = resources_pb2.Data()
|
110
|
-
for field in input_fields:
|
111
|
-
part_data = self._convert_field(data, field)
|
112
|
-
if self._is_data_set(part_data):
|
113
|
-
# if the field is set, add it to the new data part
|
114
|
-
part = new_data.parts.add()
|
115
|
-
part.id = field.name
|
116
|
-
part.data.CopyFrom(part_data)
|
117
|
-
else:
|
118
|
-
if field.required:
|
119
|
-
raise ValueError(f"Field {field.name} is required but not set")
|
120
|
-
return new_data
|
121
|
-
|
122
|
-
def _convert_field(self, old_data: resources_pb2.Data,
|
123
|
-
field: resources_pb2.ModelTypeField) -> resources_pb2.Data:
|
124
|
-
data_type = field.type
|
125
|
-
new_data = resources_pb2.Data()
|
126
|
-
if data_type == resources_pb2.ModelTypeField.DataType.STR:
|
127
|
-
if old_data.HasField('text'):
|
128
|
-
new_data.string_value = old_data.text.raw
|
129
|
-
return new_data
|
130
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.IMAGE:
|
131
|
-
if old_data.HasField('image'):
|
132
|
-
new_data.image.CopyFrom(old_data.image)
|
133
|
-
return new_data
|
134
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.VIDEO:
|
135
|
-
if old_data.HasField('video'):
|
136
|
-
new_data.video.CopyFrom(old_data.video)
|
137
|
-
return new_data
|
138
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.BOOL:
|
139
|
-
if old_data.HasField('bool_value'):
|
140
|
-
new_data.bool_value = old_data.bool_value
|
141
|
-
return new_data
|
142
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.INT:
|
143
|
-
if old_data.HasField('int_value'):
|
144
|
-
new_data.int_value = old_data.int_value
|
145
|
-
return new_data
|
146
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
147
|
-
if old_data.HasField('float_value'):
|
148
|
-
new_data.float_value = old_data.float_value
|
149
|
-
return new_data
|
150
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.BYTES:
|
151
|
-
if old_data.HasField('bytes_value'):
|
152
|
-
new_data.bytes_value = old_data.bytes_value
|
153
|
-
return new_data
|
154
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.NDARRAY:
|
155
|
-
if old_data.HasField('ndarray'):
|
156
|
-
new_data.ndarray.CopyFrom(old_data.ndarray)
|
157
|
-
return new_data
|
158
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.TEXT:
|
159
|
-
if old_data.HasField('text'):
|
160
|
-
new_data.text.CopyFrom(old_data.text)
|
161
|
-
return new_data
|
162
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.AUDIO:
|
163
|
-
if old_data.HasField('audio'):
|
164
|
-
new_data.audio.CopyFrom(old_data.audio)
|
165
|
-
return new_data
|
166
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.CONCEPT:
|
167
|
-
if old_data.concepts:
|
168
|
-
new_data.concepts.extend(old_data.concepts)
|
169
|
-
return new_data
|
170
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.REGION:
|
171
|
-
if old_data.regions:
|
172
|
-
new_data.regions.extend(old_data.regions)
|
173
|
-
return new_data
|
174
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.FRAME:
|
175
|
-
if old_data.frames:
|
176
|
-
new_data.frames.extend(old_data.frames)
|
177
|
-
return new_data
|
178
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.LIST:
|
179
|
-
new_data = resources_pb2.Data()
|
180
|
-
if not field.type_args:
|
181
|
-
raise ValueError("LIST type requires type_args")
|
182
|
-
element_field = field.type_args[0]
|
183
|
-
if element_field in (resources_pb2.ModelTypeField.DataType.CONCEPT,
|
184
|
-
resources_pb2.ModelTypeField.DataType.REGION,
|
185
|
-
resources_pb2.ModelTypeField.DataType.FRAME):
|
186
|
-
# convert to new format
|
187
|
-
element_data = self._convert_field(old_data, element_field)
|
188
|
-
# part = new_data.parts.add()
|
189
|
-
# part.data.CopyFrom(element_data)
|
190
|
-
return element_data
|
191
|
-
else:
|
192
|
-
return new_data
|
193
|
-
# raise ValueError(f"Unsupported data type: {data_type}")
|
194
|
-
|
195
|
-
def is_old_format(self, data: resources_pb2.Data) -> bool:
|
196
|
-
"""Check if the Data proto is in the old format (without parts)."""
|
197
|
-
if len(data.parts) > 0:
|
198
|
-
return False # New format uses parts
|
199
|
-
|
200
|
-
# Check if any singular field is set
|
201
|
-
singular_fields = [
|
202
|
-
'image', 'video', 'metadata', 'geo', 'text', 'audio', 'ndarray', 'int_value',
|
203
|
-
'float_value', 'bytes_value', 'bool_value', 'string_value'
|
204
|
-
]
|
205
|
-
for field in singular_fields:
|
206
|
-
if data.HasField(field):
|
207
|
-
return True
|
208
|
-
|
209
|
-
# Check if any repeated field has elements
|
210
|
-
repeated_fields = [
|
211
|
-
'concepts', 'colors', 'clusters', 'embeddings', 'regions', 'frames', 'tracks',
|
212
|
-
'time_segments', 'hits', 'heatmaps'
|
213
|
-
]
|
214
|
-
for field in repeated_fields:
|
215
|
-
if getattr(data, field):
|
216
|
-
return True
|
217
|
-
|
218
|
-
return False
|
219
|
-
|
220
|
-
def _convert_output_data_to_old_format(self, data: resources_pb2.Data) -> resources_pb2.Data:
|
221
|
-
"""Convert output data to old format."""
|
222
|
-
old_data = resources_pb2.Data()
|
223
|
-
part_data = data.parts[0].data
|
224
|
-
# Handle text.raw specially (common case for text outputs)
|
225
|
-
old_data = part_data
|
226
|
-
if old_data.string_value:
|
227
|
-
old_data.text.raw = old_data.string_value
|
228
|
-
|
229
|
-
return old_data
|
230
|
-
|
231
74
|
def _batch_predict(self, method, inputs: List[Dict[str, Any]]) -> List[Any]:
|
232
75
|
"""Batch predict method for multiple inputs."""
|
233
76
|
outputs = []
|
@@ -261,10 +104,11 @@ class ModelClass(ABC):
|
|
261
104
|
python_param_types = method_info.python_param_types
|
262
105
|
for input in request.inputs:
|
263
106
|
# check if input is in old format
|
264
|
-
is_convert =
|
107
|
+
is_convert = DataConverter.is_old_format(input.data)
|
265
108
|
if is_convert:
|
266
109
|
# convert to new format
|
267
|
-
new_data =
|
110
|
+
new_data = DataConverter.convert_input_data_to_new_format(input.data,
|
111
|
+
signature.input_fields)
|
268
112
|
input.data.CopyFrom(new_data)
|
269
113
|
# convert inputs to python types
|
270
114
|
inputs = self._convert_input_protos_to_python(request.inputs, inference_params,
|
@@ -307,10 +151,11 @@ class ModelClass(ABC):
|
|
307
151
|
python_param_types = method_info.python_param_types
|
308
152
|
for input in request.inputs:
|
309
153
|
# check if input is in old format
|
310
|
-
is_convert =
|
154
|
+
is_convert = DataConverter.is_old_format(input.data)
|
311
155
|
if is_convert:
|
312
156
|
# convert to new format
|
313
|
-
new_data =
|
157
|
+
new_data = DataConverter.convert_input_data_to_new_format(input.data,
|
158
|
+
signature.input_fields)
|
314
159
|
input.data.CopyFrom(new_data)
|
315
160
|
inputs = self._convert_input_protos_to_python(request.inputs, inference_params,
|
316
161
|
signature.input_fields, python_param_types)
|
@@ -368,10 +213,11 @@ class ModelClass(ABC):
|
|
368
213
|
|
369
214
|
for input in request.inputs:
|
370
215
|
# check if input is in old format
|
371
|
-
is_convert =
|
216
|
+
is_convert = DataConverter.is_old_format(input.data)
|
372
217
|
if is_convert:
|
373
218
|
# convert to new format
|
374
|
-
new_data =
|
219
|
+
new_data = DataConverter.convert_input_data_to_new_format(input.data,
|
220
|
+
signature.input_fields)
|
375
221
|
input.data.CopyFrom(new_data)
|
376
222
|
# convert all inputs for the first request, including the first stream value
|
377
223
|
inputs = self._convert_input_protos_to_python(request.inputs, inference_params,
|
@@ -445,7 +291,7 @@ class ModelClass(ABC):
|
|
445
291
|
serialize({'return': output}, variables_signature, proto.data, is_output=True)
|
446
292
|
if convert_old_format:
|
447
293
|
# convert to old format
|
448
|
-
data =
|
294
|
+
data = DataConverter.convert_output_data_to_old_format(proto.data)
|
449
295
|
proto.data.CopyFrom(data)
|
450
296
|
proto.status.code = status_code_pb2.SUCCESS
|
451
297
|
if hasattr(self, "_prompt_tokens") and self._prompt_tokens is not None:
|
@@ -0,0 +1,337 @@
|
|
1
|
+
from io import BytesIO
|
2
|
+
from typing import List
|
3
|
+
|
4
|
+
from clarifai_grpc.grpc.api import resources_pb2
|
5
|
+
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeEnumOption
|
6
|
+
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeField as InputFieldProto
|
7
|
+
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeRangeInfo
|
8
|
+
from PIL import Image
|
9
|
+
|
10
|
+
from clarifai.runners.utils.data_types import MessageData
|
11
|
+
|
12
|
+
|
13
|
+
def image_to_bytes(img: Image.Image, format="JPEG") -> bytes:
|
14
|
+
buffered = BytesIO()
|
15
|
+
img.save(buffered, format=format)
|
16
|
+
img_str = buffered.getvalue()
|
17
|
+
return img_str
|
18
|
+
|
19
|
+
|
20
|
+
def bytes_to_image(bytes_img) -> Image.Image:
|
21
|
+
img = Image.open(BytesIO(bytes_img))
|
22
|
+
return img
|
23
|
+
|
24
|
+
|
25
|
+
def is_openai_chat_format(messages):
|
26
|
+
"""
|
27
|
+
Verify if the given argument follows the OpenAI chat messages format.
|
28
|
+
|
29
|
+
Args:
|
30
|
+
messages (list): A list of dictionaries representing chat messages.
|
31
|
+
|
32
|
+
Returns:
|
33
|
+
bool: True if valid, False otherwise.
|
34
|
+
"""
|
35
|
+
if not isinstance(messages, list):
|
36
|
+
return False
|
37
|
+
|
38
|
+
valid_roles = {"system", "user", "assistant", "function"}
|
39
|
+
|
40
|
+
for msg in messages:
|
41
|
+
if not isinstance(msg, dict):
|
42
|
+
return False
|
43
|
+
if "role" not in msg or "content" not in msg:
|
44
|
+
return False
|
45
|
+
if msg["role"] not in valid_roles:
|
46
|
+
return False
|
47
|
+
|
48
|
+
content = msg["content"]
|
49
|
+
|
50
|
+
# Content should be either a string (text message) or a multimodal list
|
51
|
+
if isinstance(content, str):
|
52
|
+
continue # Valid text message
|
53
|
+
|
54
|
+
elif isinstance(content, list):
|
55
|
+
for item in content:
|
56
|
+
if not isinstance(item, dict):
|
57
|
+
return False
|
58
|
+
return True
|
59
|
+
|
60
|
+
|
61
|
+
class InputField(MessageData):
|
62
|
+
"""A field that can be used to store input data."""
|
63
|
+
|
64
|
+
def __init__(
|
65
|
+
self,
|
66
|
+
default=None,
|
67
|
+
description=None,
|
68
|
+
min_value=None,
|
69
|
+
max_value=None,
|
70
|
+
choices=None,
|
71
|
+
# is_param=True
|
72
|
+
):
|
73
|
+
self.default = default
|
74
|
+
self.description = description
|
75
|
+
self.min_value = min_value
|
76
|
+
self.max_value = max_value
|
77
|
+
self.choices = choices
|
78
|
+
# self.is_param = is_param
|
79
|
+
|
80
|
+
def __repr__(self) -> str:
|
81
|
+
attrs = []
|
82
|
+
if self.default is not None:
|
83
|
+
attrs.append(f"default={self.default!r}")
|
84
|
+
if self.description is not None:
|
85
|
+
attrs.append(f"description={self.description!r}")
|
86
|
+
if self.min_value is not None:
|
87
|
+
attrs.append(f"min_value={self.min_value!r}")
|
88
|
+
if self.max_value is not None:
|
89
|
+
attrs.append(f"max_value={self.max_value!r}")
|
90
|
+
if self.choices is not None:
|
91
|
+
attrs.append(f"choices={self.choices!r}")
|
92
|
+
# attrs.append(f"is_param={self.is_param!r}")
|
93
|
+
return f"InputField({', '.join(attrs)})"
|
94
|
+
|
95
|
+
def to_proto(self, proto=None) -> InputFieldProto:
|
96
|
+
if proto is None:
|
97
|
+
proto = InputFieldProto()
|
98
|
+
if self.description is not None:
|
99
|
+
proto.description = self.description
|
100
|
+
|
101
|
+
if self.choices is not None:
|
102
|
+
for choice in self.choices:
|
103
|
+
option = ModelTypeEnumOption(id=str(choice))
|
104
|
+
proto.model_type_enum_options.append(option)
|
105
|
+
|
106
|
+
proto.required = self.default is None
|
107
|
+
|
108
|
+
if self.min_value is not None or self.max_value is not None:
|
109
|
+
range_info = ModelTypeRangeInfo()
|
110
|
+
if self.min_value is not None:
|
111
|
+
range_info.min = float(self.min_value)
|
112
|
+
if self.max_value is not None:
|
113
|
+
range_info.max = float(self.max_value)
|
114
|
+
proto.model_type_range_info.CopyFrom(range_info)
|
115
|
+
# proto.is_param = self.is_param
|
116
|
+
|
117
|
+
if self.default is not None:
|
118
|
+
if isinstance(self.default, str) or isinstance(self.default, bool) or isinstance(
|
119
|
+
self.default, (int, float)):
|
120
|
+
proto.default = str(self.default)
|
121
|
+
else:
|
122
|
+
import json
|
123
|
+
proto.default = json.dumps(self.default)
|
124
|
+
|
125
|
+
return proto
|
126
|
+
|
127
|
+
@classmethod
|
128
|
+
def from_proto(cls, proto):
|
129
|
+
default = None
|
130
|
+
if proto.HasField('default'):
|
131
|
+
pb_value = proto.default
|
132
|
+
if pb_value.HasField('string_value'):
|
133
|
+
default = pb_value.string_value
|
134
|
+
try:
|
135
|
+
import json
|
136
|
+
default = json.loads(default)
|
137
|
+
except json.JSONDecodeError:
|
138
|
+
pass
|
139
|
+
elif pb_value.HasField('number_value'):
|
140
|
+
default = pb_value.number_value
|
141
|
+
if default.is_integer():
|
142
|
+
default = int(default)
|
143
|
+
else:
|
144
|
+
default = float(default)
|
145
|
+
elif pb_value.HasField('bool_value'):
|
146
|
+
default = pb_value.bool_value
|
147
|
+
|
148
|
+
choices = [option.id for option in proto.model_type_enum_options
|
149
|
+
] if proto.model_type_enum_options else None
|
150
|
+
|
151
|
+
min_value = None
|
152
|
+
max_value = None
|
153
|
+
if proto.HasField('model_type_range_info'):
|
154
|
+
min_value = proto.model_type_range_info.min
|
155
|
+
max_value = proto.model_type_range_info.max
|
156
|
+
if min_value.is_integer():
|
157
|
+
min_value = int(min_value)
|
158
|
+
if max_value.is_integer():
|
159
|
+
max_value = int(max_value)
|
160
|
+
|
161
|
+
return cls(
|
162
|
+
default=default,
|
163
|
+
description=proto.description if proto.description else None,
|
164
|
+
min_value=min_value,
|
165
|
+
max_value=max_value,
|
166
|
+
choices=choices,
|
167
|
+
# is_param=proto.is_param
|
168
|
+
)
|
169
|
+
|
170
|
+
@classmethod
|
171
|
+
def set_default(cls, proto=None, default=None):
|
172
|
+
|
173
|
+
if proto is None:
|
174
|
+
proto = InputFieldProto()
|
175
|
+
if default is not None:
|
176
|
+
if isinstance(default, str) or isinstance(default, bool) or isinstance(
|
177
|
+
default, (int, float)):
|
178
|
+
proto.default = str(default)
|
179
|
+
else:
|
180
|
+
import json
|
181
|
+
proto.default = json.dumps(default)
|
182
|
+
return proto
|
183
|
+
|
184
|
+
|
185
|
+
class DataConverter:
|
186
|
+
"""A class that can be used to convert data to and from a specific format."""
|
187
|
+
|
188
|
+
@classmethod
|
189
|
+
def convert_input_data_to_new_format(
|
190
|
+
cls, data: resources_pb2.Data,
|
191
|
+
input_fields: List[resources_pb2.ModelTypeField]) -> resources_pb2.Data:
|
192
|
+
"""Convert input data to new format."""
|
193
|
+
new_data = resources_pb2.Data()
|
194
|
+
for field in input_fields:
|
195
|
+
part_data = cls._convert_field(data, field)
|
196
|
+
if cls._is_data_set(part_data):
|
197
|
+
# if the field is set, add it to the new data part
|
198
|
+
part = new_data.parts.add()
|
199
|
+
part.id = field.name
|
200
|
+
part.data.CopyFrom(part_data)
|
201
|
+
else:
|
202
|
+
if field.required:
|
203
|
+
raise ValueError(f"Field {field.name} is required but not set")
|
204
|
+
return new_data
|
205
|
+
|
206
|
+
@classmethod
|
207
|
+
def _convert_field(cls, old_data: resources_pb2.Data,
|
208
|
+
field: resources_pb2.ModelTypeField) -> resources_pb2.Data:
|
209
|
+
data_type = field.type
|
210
|
+
new_data = resources_pb2.Data()
|
211
|
+
if data_type == resources_pb2.ModelTypeField.DataType.STR:
|
212
|
+
if old_data.HasField('text'):
|
213
|
+
new_data.string_value = old_data.text.raw
|
214
|
+
return new_data
|
215
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.IMAGE:
|
216
|
+
if old_data.HasField('image'):
|
217
|
+
new_data.image.CopyFrom(old_data.image)
|
218
|
+
return new_data
|
219
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.VIDEO:
|
220
|
+
if old_data.HasField('video'):
|
221
|
+
new_data.video.CopyFrom(old_data.video)
|
222
|
+
return new_data
|
223
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.BOOL:
|
224
|
+
if old_data.bool_value != False:
|
225
|
+
new_data.bool_value = old_data.bool_value
|
226
|
+
return new_data
|
227
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.INT:
|
228
|
+
if old_data.int_value != 0:
|
229
|
+
new_data.int_value = old_data.int_value
|
230
|
+
return new_data
|
231
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
232
|
+
if old_data.float_value != 0.0:
|
233
|
+
new_data.float_value = old_data.float_value
|
234
|
+
return new_data
|
235
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.BYTES:
|
236
|
+
if old_data.bytes_value != b"":
|
237
|
+
new_data.bytes_value = old_data.bytes_value
|
238
|
+
return new_data
|
239
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.NDARRAY:
|
240
|
+
if old_data.HasField('ndarray'):
|
241
|
+
new_data.ndarray.CopyFrom(old_data.ndarray)
|
242
|
+
return new_data
|
243
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.TEXT:
|
244
|
+
if old_data.HasField('text'):
|
245
|
+
new_data.text.CopyFrom(old_data.text)
|
246
|
+
return new_data
|
247
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.AUDIO:
|
248
|
+
if old_data.HasField('audio'):
|
249
|
+
new_data.audio.CopyFrom(old_data.audio)
|
250
|
+
return new_data
|
251
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.CONCEPT:
|
252
|
+
if old_data.concepts:
|
253
|
+
new_data.concepts.extend(old_data.concepts)
|
254
|
+
return new_data
|
255
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.REGION:
|
256
|
+
if old_data.regions:
|
257
|
+
new_data.regions.extend(old_data.regions)
|
258
|
+
return new_data
|
259
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.FRAME:
|
260
|
+
if old_data.frames:
|
261
|
+
new_data.frames.extend(old_data.frames)
|
262
|
+
return new_data
|
263
|
+
elif data_type == resources_pb2.ModelTypeField.DataType.LIST:
|
264
|
+
if not field.type_args:
|
265
|
+
raise ValueError("LIST type requires type_args")
|
266
|
+
element_field = field.type_args[0]
|
267
|
+
if element_field in (resources_pb2.ModelTypeField.DataType.CONCEPT,
|
268
|
+
resources_pb2.ModelTypeField.DataType.REGION,
|
269
|
+
resources_pb2.ModelTypeField.DataType.FRAME):
|
270
|
+
# convert to new format
|
271
|
+
new_data = cls._convert_field(old_data, element_field)
|
272
|
+
return new_data
|
273
|
+
else:
|
274
|
+
return new_data
|
275
|
+
# raise ValueError(f"Unsupported data type: {data_type}")
|
276
|
+
|
277
|
+
@classmethod
|
278
|
+
def is_old_format(cls, data: resources_pb2.Data) -> bool:
|
279
|
+
"""Check if the Data proto is in the old format (without parts)."""
|
280
|
+
if len(data.parts) > 0:
|
281
|
+
return False # New format uses parts
|
282
|
+
|
283
|
+
# Check if any singular field is set
|
284
|
+
singular_fields = [
|
285
|
+
'image', 'video', 'metadata', 'geo', 'text', 'audio', 'ndarray', 'int_value',
|
286
|
+
'float_value', 'bytes_value', 'bool_value', 'string_value'
|
287
|
+
]
|
288
|
+
for field in singular_fields:
|
289
|
+
if data.HasField(field):
|
290
|
+
return True
|
291
|
+
|
292
|
+
# Check if any repeated field has elements
|
293
|
+
repeated_fields = [
|
294
|
+
'concepts', 'colors', 'clusters', 'embeddings', 'regions', 'frames', 'tracks',
|
295
|
+
'time_segments', 'hits', 'heatmaps'
|
296
|
+
]
|
297
|
+
for field in repeated_fields:
|
298
|
+
if getattr(data, field):
|
299
|
+
return True
|
300
|
+
|
301
|
+
return False
|
302
|
+
|
303
|
+
@classmethod
|
304
|
+
def convert_output_data_to_old_format(cls, data: resources_pb2.Data) -> resources_pb2.Data:
|
305
|
+
"""Convert output data to old format."""
|
306
|
+
old_data = resources_pb2.Data()
|
307
|
+
part_data = data.parts[0].data
|
308
|
+
# Handle text.raw specially (common case for text outputs)
|
309
|
+
old_data = part_data
|
310
|
+
if old_data.string_value:
|
311
|
+
old_data.text.raw = old_data.string_value
|
312
|
+
|
313
|
+
return old_data
|
314
|
+
|
315
|
+
@classmethod
|
316
|
+
def _is_data_set(cls, data_msg):
|
317
|
+
# Singular message fields
|
318
|
+
singular_fields = ["image", "video", "metadata", "geo", "text", "audio", "ndarray"]
|
319
|
+
for field in singular_fields:
|
320
|
+
if data_msg.HasField(field):
|
321
|
+
return True
|
322
|
+
|
323
|
+
# Repeated fields
|
324
|
+
repeated_fields = [
|
325
|
+
"concepts", "colors", "clusters", "embeddings", "regions", "frames", "tracks",
|
326
|
+
"time_segments", "hits", "heatmaps", "parts"
|
327
|
+
]
|
328
|
+
for field in repeated_fields:
|
329
|
+
if getattr(data_msg, field): # checks if the list is not empty
|
330
|
+
return True
|
331
|
+
|
332
|
+
# Scalar fields (proto3 default: 0 for numbers, empty for strings/bytes, False for bool)
|
333
|
+
if (data_msg.int_value != 0 or data_msg.float_value != 0.0 or data_msg.bytes_value != b"" or
|
334
|
+
data_msg.bool_value is True or data_msg.string_value != ""):
|
335
|
+
return True
|
336
|
+
|
337
|
+
return False
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "11.2.3rc5"
|