clarifai 11.2.3rc4__tar.gz → 11.2.3rc6__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.3rc4/clarifai.egg-info → clarifai-11.2.3rc6}/PKG-INFO +1 -1
- clarifai-11.2.3rc6/clarifai/__init__.py +1 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/model_class.py +8 -143
- clarifai-11.2.3rc6/clarifai/runners/utils/data_utils.py +337 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6/clarifai.egg-info}/PKG-INFO +1 -1
- clarifai-11.2.3rc4/clarifai/__init__.py +0 -1
- clarifai-11.2.3rc4/clarifai/runners/utils/data_utils.py +0 -180
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/LICENSE +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/MANIFEST.in +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/README.md +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/__pycache__/errors.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/__pycache__/versions.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/README.md +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__main__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/base_cli.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/deployment.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/model_cli.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/__pycache__/nodepool.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/base.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/compute_cluster.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/deployment.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/model.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli/nodepool.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/cli.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/app.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/app.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/dataset.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/deployment.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/input.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/lister.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/module.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/nodepool.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/search.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/user.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/__pycache__/workflow.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/app.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/__pycache__/helper.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/__pycache__/register.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/__pycache__/stub.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/helper.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/register.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/auth/stub.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/base.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/compute_cluster.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/dataset.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/deployment.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/input.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/lister.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/model.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/model_client.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/module.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/nodepool.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/search.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/user.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/client/workflow.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/__pycache__/dataset.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/__pycache__/input.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/__pycache__/model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/__pycache__/rag.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/__pycache__/search.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/__pycache__/workflow.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/base.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/dataset.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/input.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/model.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/rag.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/search.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/constants/workflow.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/export/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/export/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/export/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/export/__pycache__/inputs_annotations.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/export/inputs_annotations.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/base.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/features.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/image.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/multimodal.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/text.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/__pycache__/utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/base.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/features.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/image.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/loaders/README.md +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/loaders/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/loaders/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/loaders/coco_captions.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/loaders/coco_detection.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/loaders/imagenet_classification.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/multimodal.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/text.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/datasets/upload/utils.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/errors.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/models/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/models/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/models/api.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/modules/README.md +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/modules/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/modules/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/modules/css.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/modules/pages.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/modules/style.css +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/__pycache__/rag.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/__pycache__/rag.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/__pycache__/utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/rag.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/rag/utils.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/dockerfile_template/Dockerfile.template +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/base_typed_model.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/base_typed_model.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/model_class.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/model_run_locally.cpython-310-pytest-7.1.2.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/model_run_locally.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/model_runner.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/__pycache__/model_upload.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/model_builder.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/model_run_locally.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/model_runner.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/models/model_servicer.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/server.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/__init__.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/buffered_stream.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/buffered_stream.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/buffered_stream.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/const.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/constants.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/constants.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/constants.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/data_handler.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/data_handler.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/data_handler.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/data_utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/data_utils.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/data_utils.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/grpc_server.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/grpc_server.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/grpc_server.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/health.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/health.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/health.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/loader.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/logging.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/logging.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/logging.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/stream_source.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/stream_source.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/url_fetcher.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/url_fetcher.cpython-38.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/__pycache__/url_fetcher.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/code_script.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/const.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/data_types.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/loader.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/method_signatures.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/serializers.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/runners/utils/url_fetcher.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/schema/__pycache__/search.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/schema/search.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/urls/__pycache__/helper.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/urls/helper.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__pycache__/cli.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__pycache__/constants.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__pycache__/logging.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__pycache__/misc.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/__pycache__/model_train.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/cli.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/constants.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/evaluation/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/evaluation/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/evaluation/__pycache__/main.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/evaluation/helpers.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/evaluation/main.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/logging.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/misc.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/utils/model_train.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/versions.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/__init__.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/__pycache__/__init__.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/__pycache__/__init__.cpython-39.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/__pycache__/export.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/__pycache__/utils.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/__pycache__/validate.cpython-310.pyc +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/export.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/utils.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai/workflows/validate.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai.egg-info/SOURCES.txt +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai.egg-info/dependency_links.txt +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai.egg-info/entry_points.txt +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai.egg-info/requires.txt +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/clarifai.egg-info/top_level.txt +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/pyproject.toml +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/requirements.txt +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/setup.cfg +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/setup.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_app.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_auth.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_data_upload.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_eval.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_misc.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_model_predict.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_model_train.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_modules.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_rag.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_search.py +0 -0
- {clarifai-11.2.3rc4 → clarifai-11.2.3rc6}/tests/test_stub.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "11.2.3rc6"
|
@@ -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,141 +71,6 @@ class ModelClass(ABC):
|
|
71
71
|
output.data.text.raw = signatures_to_json(signatures)
|
72
72
|
return resp
|
73
73
|
|
74
|
-
def _convert_input_data_to_new_format(
|
75
|
-
self, data: resources_pb2.Data,
|
76
|
-
input_fields: List[resources_pb2.ModelTypeField]) -> resources_pb2.Data:
|
77
|
-
"""Convert input data to new format."""
|
78
|
-
new_data = resources_pb2.Data()
|
79
|
-
for field in input_fields:
|
80
|
-
part_data = self._convert_field(data, field)
|
81
|
-
part = new_data.parts.add()
|
82
|
-
part.id = field.name
|
83
|
-
part.data.CopyFrom(part_data)
|
84
|
-
return new_data
|
85
|
-
|
86
|
-
def _convert_field(self, old_data: resources_pb2.Data,
|
87
|
-
field: resources_pb2.ModelTypeField) -> resources_pb2.Data:
|
88
|
-
data_type = field.type
|
89
|
-
if data_type == resources_pb2.ModelTypeField.DataType.STR:
|
90
|
-
new_data = resources_pb2.Data()
|
91
|
-
new_data.string_value = old_data.text.raw
|
92
|
-
return new_data
|
93
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.IMAGE:
|
94
|
-
new_data = resources_pb2.Data()
|
95
|
-
new_data.image.CopyFrom(old_data.image)
|
96
|
-
return new_data
|
97
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.VIDEO:
|
98
|
-
new_data = resources_pb2.Data()
|
99
|
-
new_data.video.CopyFrom(old_data.video)
|
100
|
-
return new_data
|
101
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.BOOL:
|
102
|
-
new_data = resources_pb2.Data()
|
103
|
-
new_data.bool_value = old_data.bool_value
|
104
|
-
return new_data
|
105
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.INT:
|
106
|
-
new_data = resources_pb2.Data()
|
107
|
-
new_data.int_value = old_data.int_value
|
108
|
-
return new_data
|
109
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
110
|
-
new_data = resources_pb2.Data()
|
111
|
-
new_data.float_value = old_data.float_value
|
112
|
-
return new_data
|
113
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.BYTES:
|
114
|
-
new_data = resources_pb2.Data()
|
115
|
-
new_data.bytes_value = old_data.bytes_value
|
116
|
-
return new_data
|
117
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.NDARRAY:
|
118
|
-
new_data = resources_pb2.Data()
|
119
|
-
new_data.ndarray.CopyFrom(old_data.ndarray)
|
120
|
-
return new_data
|
121
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.JSON_DATA:
|
122
|
-
new_data = resources_pb2.Data()
|
123
|
-
struct_dict = old_data.text.raw
|
124
|
-
new_data.string_value = json.dumps(struct_dict)
|
125
|
-
return new_data
|
126
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.TEXT:
|
127
|
-
new_data = resources_pb2.Data()
|
128
|
-
new_data.text.CopyFrom(old_data.text)
|
129
|
-
return new_data
|
130
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.CONCEPT:
|
131
|
-
new_data = resources_pb2.Data()
|
132
|
-
new_data.concepts.extend(old_data.concepts)
|
133
|
-
return new_data
|
134
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.REGION:
|
135
|
-
new_data = resources_pb2.Data()
|
136
|
-
new_data.regions.extend(old_data.regions)
|
137
|
-
return new_data
|
138
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.FRAME:
|
139
|
-
new_data = resources_pb2.Data()
|
140
|
-
new_data.frames.extend(old_data.frames)
|
141
|
-
return new_data
|
142
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.AUDIO:
|
143
|
-
new_data = resources_pb2.Data()
|
144
|
-
new_data.audio.CopyFrom(old_data.audio)
|
145
|
-
return new_data
|
146
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.LIST:
|
147
|
-
new_data = resources_pb2.Data()
|
148
|
-
if not field.type_args:
|
149
|
-
raise ValueError("LIST type requires type_args")
|
150
|
-
element_field = field.type_args[0]
|
151
|
-
element_data = self._convert_field(old_data, element_field)
|
152
|
-
part = new_data.parts.add()
|
153
|
-
part.data.CopyFrom(element_data)
|
154
|
-
return new_data
|
155
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.TUPLE:
|
156
|
-
new_data = resources_pb2.Data()
|
157
|
-
for element_field in field.type_args:
|
158
|
-
element_data = self._convert_field(old_data, element_field)
|
159
|
-
part = new_data.parts.add()
|
160
|
-
part.data.CopyFrom(element_data)
|
161
|
-
return new_data
|
162
|
-
elif data_type == resources_pb2.ModelTypeField.DataType.NAMED_FIELDS:
|
163
|
-
new_data = resources_pb2.Data()
|
164
|
-
for named_field in field.type_args:
|
165
|
-
part_data = self._convert_field(old_data, named_field)
|
166
|
-
part = new_data.parts.add()
|
167
|
-
part.id = named_field.name
|
168
|
-
part.data.CopyFrom(part_data)
|
169
|
-
return new_data
|
170
|
-
else:
|
171
|
-
raise ValueError(f"Unsupported data type: {data_type}")
|
172
|
-
|
173
|
-
def is_old_format(self, data: resources_pb2.Data) -> bool:
|
174
|
-
"""Check if the Data proto is in the old format (without parts)."""
|
175
|
-
if len(data.parts) > 0:
|
176
|
-
return False # New format uses parts
|
177
|
-
|
178
|
-
# Check if any singular field is set
|
179
|
-
singular_fields = [
|
180
|
-
'image', 'video', 'metadata', 'geo', 'text', 'audio', 'ndarray', 'int_value',
|
181
|
-
'float_value', 'bytes_value', 'bool_value', 'string_value'
|
182
|
-
]
|
183
|
-
for field in singular_fields:
|
184
|
-
if data.HasField(field):
|
185
|
-
return True
|
186
|
-
|
187
|
-
# Check if any repeated field has elements
|
188
|
-
repeated_fields = [
|
189
|
-
'concepts', 'colors', 'clusters', 'embeddings', 'regions', 'frames', 'tracks',
|
190
|
-
'time_segments', 'hits', 'heatmaps'
|
191
|
-
]
|
192
|
-
for field in repeated_fields:
|
193
|
-
if getattr(data, field):
|
194
|
-
return True
|
195
|
-
|
196
|
-
return False
|
197
|
-
|
198
|
-
def _convert_output_data_to_old_format(self, data: resources_pb2.Data) -> resources_pb2.Data:
|
199
|
-
"""Convert output data to old format."""
|
200
|
-
old_data = resources_pb2.Data()
|
201
|
-
part_data = data.parts[0].data
|
202
|
-
# Handle text.raw specially (common case for text outputs)
|
203
|
-
old_data = part_data
|
204
|
-
if old_data.string_value:
|
205
|
-
old_data.text.raw = old_data.string_value
|
206
|
-
|
207
|
-
return old_data
|
208
|
-
|
209
74
|
def _batch_predict(self, method, inputs: List[Dict[str, Any]]) -> List[Any]:
|
210
75
|
"""Batch predict method for multiple inputs."""
|
211
76
|
outputs = []
|
@@ -239,10 +104,10 @@ class ModelClass(ABC):
|
|
239
104
|
python_param_types = method_info.python_param_types
|
240
105
|
for input in request.inputs:
|
241
106
|
# check if input is in old format
|
242
|
-
is_convert =
|
107
|
+
is_convert = DataConverter.is_old_format(input.data)
|
243
108
|
if is_convert:
|
244
109
|
# convert to new format
|
245
|
-
new_data =
|
110
|
+
new_data = DataConverter.convert_input_data_to_new_format(input.data, signature.input_fields)
|
246
111
|
input.data.CopyFrom(new_data)
|
247
112
|
# convert inputs to python types
|
248
113
|
inputs = self._convert_input_protos_to_python(request.inputs, inference_params,
|
@@ -285,10 +150,10 @@ class ModelClass(ABC):
|
|
285
150
|
python_param_types = method_info.python_param_types
|
286
151
|
for input in request.inputs:
|
287
152
|
# check if input is in old format
|
288
|
-
is_convert =
|
153
|
+
is_convert = DataConverter.is_old_format(input.data)
|
289
154
|
if is_convert:
|
290
155
|
# convert to new format
|
291
|
-
new_data =
|
156
|
+
new_data = DataConverter.convert_input_data_to_new_format(input.data, signature.input_fields)
|
292
157
|
input.data.CopyFrom(new_data)
|
293
158
|
inputs = self._convert_input_protos_to_python(request.inputs, inference_params,
|
294
159
|
signature.input_fields, python_param_types)
|
@@ -346,10 +211,10 @@ class ModelClass(ABC):
|
|
346
211
|
|
347
212
|
for input in request.inputs:
|
348
213
|
# check if input is in old format
|
349
|
-
is_convert =
|
214
|
+
is_convert = DataConverter.is_old_format(input.data)
|
350
215
|
if is_convert:
|
351
216
|
# convert to new format
|
352
|
-
new_data =
|
217
|
+
new_data = DataConverter.convert_input_data_to_new_format(input.data, signature.input_fields)
|
353
218
|
input.data.CopyFrom(new_data)
|
354
219
|
# convert all inputs for the first request, including the first stream value
|
355
220
|
inputs = self._convert_input_protos_to_python(request.inputs, inference_params,
|
@@ -423,7 +288,7 @@ class ModelClass(ABC):
|
|
423
288
|
serialize({'return': output}, variables_signature, proto.data, is_output=True)
|
424
289
|
if convert_old_format:
|
425
290
|
# convert to old format
|
426
|
-
data =
|
291
|
+
data = DataConverter.convert_output_data_to_old_format(proto.data)
|
427
292
|
proto.data.CopyFrom(data)
|
428
293
|
proto.status.code = status_code_pb2.SUCCESS
|
429
294
|
if hasattr(self, "_prompt_tokens") and self._prompt_tokens is not None:
|
@@ -0,0 +1,337 @@
|
|
1
|
+
from io import BytesIO
|
2
|
+
|
3
|
+
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeEnumOption
|
4
|
+
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeField as InputFieldProto
|
5
|
+
from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeRangeInfo
|
6
|
+
from PIL import Image
|
7
|
+
|
8
|
+
from clarifai.runners.utils.data_types import MessageData
|
9
|
+
from clarifai_grpc.grpc.api import resources_pb2
|
10
|
+
from typing import List
|
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.HasField('bool_value'):
|
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.HasField('int_value'):
|
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.HasField('float_value'):
|
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.HasField('bytes_value'):
|
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.3rc4"
|