clarifai 11.2.4rc2__tar.gz → 11.3.0__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.4rc2/clarifai.egg-info → clarifai-11.3.0}/PKG-INFO +4 -3
- clarifai-11.3.0/clarifai/__init__.py +1 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/deployment.py +3 -1
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/model.py +7 -3
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/models/model_builder.py +0 -55
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/models/model_class.py +4 -7
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/data_types.py +3 -3
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/data_utils.py +35 -36
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/method_signatures.py +0 -8
- clarifai-11.3.0/clarifai/runners/utils/openai_convertor.py +167 -0
- clarifai-11.3.0/clarifai/utils/protobuf.py +143 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0/clarifai.egg-info}/PKG-INFO +4 -3
- clarifai-11.3.0/clarifai.egg-info/SOURCES.txt +124 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai.egg-info/requires.txt +1 -1
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/requirements.txt +1 -1
- clarifai-11.2.4rc2/clarifai/__init__.py +0 -1
- clarifai-11.2.4rc2/clarifai/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/__pycache__/errors.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/__pycache__/versions.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/base.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/base_cli.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/deployment.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/model.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/model_cli.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/cli/__pycache__/nodepool.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/app.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/app.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/base.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/compute_cluster.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/dataset.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/deployment.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/input.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/lister.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/model.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/module.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/nodepool.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/search.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/user.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/__pycache__/workflow.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/auth/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/auth/__pycache__/helper.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/auth/__pycache__/register.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/client/auth/__pycache__/stub.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/constants/__pycache__/base.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/constants/__pycache__/dataset.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/constants/__pycache__/input.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/constants/__pycache__/model.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/constants/__pycache__/rag.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/constants/__pycache__/search.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/constants/__pycache__/workflow.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/export/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/export/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/export/__pycache__/inputs_annotations.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/base.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/features.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/image.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/multimodal.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/text.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/__pycache__/utils.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/datasets/upload/loaders/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/models/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/modules/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/rag/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/rag/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/rag/__pycache__/rag.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/rag/__pycache__/rag.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/rag/__pycache__/utils.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/base_typed_model.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/base_typed_model.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/model_class.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/model_run_locally.cpython-310-pytest-7.1.2.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/model_run_locally.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/model_runner.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/models/__pycache__/model_upload.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/__init__.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/buffered_stream.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/buffered_stream.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/buffered_stream.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/const.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/constants.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/constants.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/constants.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/data_handler.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/data_handler.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/data_handler.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/data_utils.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/data_utils.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/data_utils.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/grpc_server.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/grpc_server.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/grpc_server.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/health.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/health.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/health.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/loader.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/logging.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/logging.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/logging.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/stream_source.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/stream_source.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/url_fetcher.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/url_fetcher.cpython-38.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/__pycache__/url_fetcher.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/runners/utils/openai_convertor.py +0 -227
- clarifai-11.2.4rc2/clarifai/schema/__pycache__/search.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/urls/__pycache__/helper.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/__pycache__/cli.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/__pycache__/constants.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/__pycache__/logging.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/__pycache__/misc.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/__pycache__/model_train.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/evaluation/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/utils/evaluation/__pycache__/main.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/workflows/__pycache__/__init__.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/workflows/__pycache__/__init__.cpython-39.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/workflows/__pycache__/export.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/workflows/__pycache__/utils.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai/workflows/__pycache__/validate.cpython-310.pyc +0 -0
- clarifai-11.2.4rc2/clarifai.egg-info/SOURCES.txt +0 -241
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/LICENSE +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/MANIFEST.in +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/README.md +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/README.md +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/__main__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/base.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/compute_cluster.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/deployment.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/model.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli/nodepool.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/cli.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/app.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/auth/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/auth/helper.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/auth/register.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/auth/stub.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/base.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/compute_cluster.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/dataset.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/input.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/lister.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/model_client.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/module.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/nodepool.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/search.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/user.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/client/workflow.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/constants/base.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/constants/dataset.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/constants/input.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/constants/model.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/constants/rag.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/constants/search.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/constants/workflow.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/export/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/export/inputs_annotations.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/base.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/features.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/image.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/loaders/README.md +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/loaders/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/loaders/coco_captions.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/loaders/coco_detection.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/loaders/imagenet_classification.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/multimodal.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/text.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/datasets/upload/utils.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/errors.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/models/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/models/api.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/modules/README.md +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/modules/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/modules/css.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/modules/pages.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/modules/style.css +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/rag/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/rag/rag.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/rag/utils.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/dockerfile_template/Dockerfile.template +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/models/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/models/model_run_locally.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/models/model_runner.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/models/model_servicer.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/server.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/code_script.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/const.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/loader.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/serializers.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/runners/utils/url_fetcher.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/schema/search.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/urls/helper.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/cli.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/config.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/constants.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/evaluation/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/evaluation/helpers.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/evaluation/main.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/logging.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/misc.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/utils/model_train.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/versions.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/workflows/__init__.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/workflows/export.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/workflows/utils.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai/workflows/validate.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai.egg-info/dependency_links.txt +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai.egg-info/entry_points.txt +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/clarifai.egg-info/top_level.txt +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/pyproject.toml +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/setup.cfg +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/setup.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_app.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_auth.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_data_upload.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_eval.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_misc.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_model_predict.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_model_train.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_modules.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_rag.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_search.py +0 -0
- {clarifai-11.2.4rc2 → clarifai-11.3.0}/tests/test_stub.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: clarifai
|
3
|
-
Version: 11.
|
3
|
+
Version: 11.3.0
|
4
4
|
Summary: Clarifai Python SDK
|
5
5
|
Home-page: https://github.com/Clarifai/clarifai-python
|
6
6
|
Author: Clarifai
|
@@ -20,7 +20,7 @@ Classifier: Operating System :: OS Independent
|
|
20
20
|
Requires-Python: >=3.8
|
21
21
|
Description-Content-Type: text/markdown
|
22
22
|
License-File: LICENSE
|
23
|
-
Requires-Dist: clarifai-grpc>=11.2
|
23
|
+
Requires-Dist: clarifai-grpc>=11.3.2
|
24
24
|
Requires-Dist: clarifai-protocol>=0.0.22
|
25
25
|
Requires-Dist: numpy>=1.22.0
|
26
26
|
Requires-Dist: tqdm>=4.65.0
|
@@ -42,6 +42,7 @@ Dynamic: description
|
|
42
42
|
Dynamic: description-content-type
|
43
43
|
Dynamic: home-page
|
44
44
|
Dynamic: license
|
45
|
+
Dynamic: license-file
|
45
46
|
Dynamic: provides-extra
|
46
47
|
Dynamic: requires-dist
|
47
48
|
Dynamic: requires-python
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "11.3.0"
|
@@ -3,6 +3,7 @@ from clarifai_grpc.grpc.api import resources_pb2
|
|
3
3
|
from clarifai.client.base import BaseClient
|
4
4
|
from clarifai.client.lister import Lister
|
5
5
|
from clarifai.utils.logging import logger
|
6
|
+
from clarifai.utils.protobuf import dict_to_protobuf
|
6
7
|
|
7
8
|
|
8
9
|
class Deployment(Lister, BaseClient):
|
@@ -28,7 +29,8 @@ class Deployment(Lister, BaseClient):
|
|
28
29
|
**kwargs: Additional keyword arguments to be passed to the deployment.
|
29
30
|
"""
|
30
31
|
self.kwargs = {**kwargs, 'id': deployment_id, 'user_id': user_id}
|
31
|
-
self.deployment_info = resources_pb2.Deployment(
|
32
|
+
self.deployment_info = resources_pb2.Deployment()
|
33
|
+
dict_to_protobuf(self.deployment_info, self.kwargs)
|
32
34
|
self.logger = logger
|
33
35
|
BaseClient.__init__(
|
34
36
|
self,
|
@@ -32,7 +32,7 @@ from clarifai.utils.misc import BackoffIterator
|
|
32
32
|
from clarifai.utils.model_train import (find_and_replace_key, params_parser,
|
33
33
|
response_to_model_params, response_to_param_info,
|
34
34
|
response_to_templates)
|
35
|
-
|
35
|
+
from clarifai.utils.protobuf import dict_to_protobuf
|
36
36
|
MAX_SIZE_PER_STREAM = int(89_128_960) # 85GiB
|
37
37
|
MIN_CHUNK_FOR_UPLOAD_FILE = int(5_242_880) # 5MiB
|
38
38
|
MAX_CHUNK_FOR_UPLOAD_FILE = int(5_242_880_000) # 5GiB
|
@@ -73,8 +73,11 @@ class Model(Lister, BaseClient):
|
|
73
73
|
user_id, app_id, _, model_id, model_version_id = ClarifaiUrlHelper.split_clarifai_url(url)
|
74
74
|
model_version = {'id': model_version_id}
|
75
75
|
kwargs = {'user_id': user_id, 'app_id': app_id}
|
76
|
+
|
76
77
|
self.kwargs = {**kwargs, 'id': model_id, 'model_version': model_version, }
|
77
|
-
self.model_info = resources_pb2.Model(
|
78
|
+
self.model_info = resources_pb2.Model()
|
79
|
+
dict_to_protobuf(self.model_info, self.kwargs)
|
80
|
+
|
78
81
|
self.logger = logger
|
79
82
|
self.training_params = {}
|
80
83
|
self.input_types = None
|
@@ -983,7 +986,8 @@ class Model(Lister, BaseClient):
|
|
983
986
|
|
984
987
|
dict_response = MessageToDict(response, preserving_proto_field_name=True)
|
985
988
|
self.kwargs = self.process_response_keys(dict_response['model'])
|
986
|
-
self.model_info = resources_pb2.Model(
|
989
|
+
self.model_info = resources_pb2.Model()
|
990
|
+
dict_to_protobuf(self.model_info, self.kwargs)
|
987
991
|
|
988
992
|
def __str__(self):
|
989
993
|
if len(self.kwargs) < 10:
|
@@ -23,7 +23,6 @@ from clarifai.runners.utils.const import (
|
|
23
23
|
DEFAULT_DOWNLOAD_CHECKPOINT_WHEN, DEFAULT_PYTHON_VERSION, DEFAULT_RUNTIME_DOWNLOAD_PATH,
|
24
24
|
PYTHON_BASE_IMAGE, TORCH_BASE_IMAGE)
|
25
25
|
from clarifai.runners.utils.loader import HuggingFaceLoader
|
26
|
-
from clarifai.runners.utils import data_utils
|
27
26
|
from clarifai.runners.utils.method_signatures import signatures_to_yaml
|
28
27
|
from clarifai.urls.helper import ClarifaiUrlHelper
|
29
28
|
from clarifai.utils.logging import logger
|
@@ -337,16 +336,6 @@ class ModelBuilder:
|
|
337
336
|
method_info = model_class._get_method_info()
|
338
337
|
signatures = [method.signature for method in method_info.values()]
|
339
338
|
return signatures
|
340
|
-
|
341
|
-
def get_methods_defaults(self):
|
342
|
-
"""
|
343
|
-
Returns the inference parameters for the model class.
|
344
|
-
"""
|
345
|
-
model_class = self.load_model_class(mocking=True)
|
346
|
-
method_info = model_class._get_method_info()
|
347
|
-
python_param_defaults = [method.python_param_types for method in method_info.values()]
|
348
|
-
return python_param_defaults
|
349
|
-
|
350
339
|
|
351
340
|
@property
|
352
341
|
def client(self):
|
@@ -633,58 +622,14 @@ class ModelBuilder:
|
|
633
622
|
concepts = config.get('concepts')
|
634
623
|
logger.info(f"Updated config.yaml with {len(concepts)} concepts.")
|
635
624
|
|
636
|
-
def filled_params_specs_with_inference_params(self, method_signatures: list[resources_pb2.MethodSignature], methods_defaults) -> list[resources_pb2.ModelTypeField]:
|
637
|
-
"""
|
638
|
-
Fills the params_specs with the inference params.
|
639
|
-
"""
|
640
|
-
inference_params = set()
|
641
|
-
for i, method_defaults in enumerate(methods_defaults):
|
642
|
-
for name, default in method_defaults.items():
|
643
|
-
if isinstance(default, data_utils.InputField):
|
644
|
-
if i==0:
|
645
|
-
inference_params.add(name)
|
646
|
-
else:
|
647
|
-
# if field.name not in inference_params then remove from inference_params
|
648
|
-
if name not in inference_params:
|
649
|
-
inference_params.remove(field.name)
|
650
|
-
output=[]
|
651
|
-
for signature in method_signatures:
|
652
|
-
for field in signature.input_fields:
|
653
|
-
if field.name in inference_params:
|
654
|
-
field.path = field.name
|
655
|
-
if field.type == resources_pb2.ModelTypeField.DataType.STR:
|
656
|
-
field.default_value= str(field.default)
|
657
|
-
field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.STRING
|
658
|
-
elif field.type == resources_pb2.ModelTypeField.DataType.INT:
|
659
|
-
field.default_value= int(field.default)
|
660
|
-
field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.NUMBER
|
661
|
-
elif field.type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
662
|
-
field.default_value= float(field.default)
|
663
|
-
field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.NUMBER
|
664
|
-
elif field.type == resources_pb2.ModelTypeField.DataType.BOOL:
|
665
|
-
field.default_value= bool(field.default)
|
666
|
-
field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.BOOLEAN
|
667
|
-
else:
|
668
|
-
field.default_value= field.default
|
669
|
-
field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.STRING
|
670
|
-
output.append(field)
|
671
|
-
return output
|
672
|
-
|
673
|
-
|
674
625
|
def get_model_version_proto(self):
|
675
626
|
signatures = self.get_method_signatures()
|
676
|
-
methods_defaults = self.get_methods_defaults()
|
677
|
-
|
678
627
|
model_version_proto = resources_pb2.ModelVersion(
|
679
628
|
pretrained_model_config=resources_pb2.PretrainedModelConfig(),
|
680
629
|
inference_compute_info=self.inference_compute_info,
|
681
630
|
method_signatures=signatures,
|
682
|
-
output_info= resources_pb2.OutputInfo(
|
683
|
-
params_specs=self.filled_params_specs_with_inference_params(signatures, methods_defaults),
|
684
|
-
)
|
685
631
|
)
|
686
632
|
|
687
|
-
|
688
633
|
model_type_id = self.config.get('model').get('model_type_id')
|
689
634
|
if model_type_id in CONCEPTS_REQUIRED_MODEL_TYPE:
|
690
635
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import collections.abc as abc
|
1
2
|
import inspect
|
2
3
|
import itertools
|
3
4
|
import logging
|
@@ -271,8 +272,9 @@ class ModelClass(ABC):
|
|
271
272
|
if k not in python_param_types:
|
272
273
|
continue
|
273
274
|
|
274
|
-
if hasattr(python_param_types[k],
|
275
|
-
|
275
|
+
if hasattr(python_param_types[k],
|
276
|
+
"__args__") and (getattr(python_param_types[k], "__origin__",
|
277
|
+
None) in [abc.Iterator, abc.Generator, abc.Iterable]):
|
276
278
|
# get the type of the items in the stream
|
277
279
|
stream_type = python_param_types[k].__args__[0]
|
278
280
|
|
@@ -354,9 +356,4 @@ class _MethodInfo:
|
|
354
356
|
for p in inspect.signature(method).parameters.values()
|
355
357
|
if p.annotation != inspect.Parameter.empty
|
356
358
|
}
|
357
|
-
self.python_param_defaults = {
|
358
|
-
p.name: p.default
|
359
|
-
for p in inspect.signature(method).parameters.values()
|
360
|
-
if p.default != inspect.Parameter.empty
|
361
|
-
}
|
362
359
|
self.python_param_types.pop('self', None)
|
@@ -160,8 +160,8 @@ class Text(MessageData):
|
|
160
160
|
|
161
161
|
class Concept(MessageData):
|
162
162
|
|
163
|
-
def __init__(self,
|
164
|
-
self.id =
|
163
|
+
def __init__(self, name: str, value: float = 1):
|
164
|
+
self.id = name
|
165
165
|
self.name = name
|
166
166
|
self.value = value
|
167
167
|
|
@@ -173,7 +173,7 @@ class Concept(MessageData):
|
|
173
173
|
|
174
174
|
@classmethod
|
175
175
|
def from_proto(cls, proto: ConceptProto) -> "Concept":
|
176
|
-
return cls(proto.
|
176
|
+
return cls(proto.name, proto.value)
|
177
177
|
|
178
178
|
|
179
179
|
class Region(MessageData):
|
@@ -171,51 +171,50 @@ class InputField(MessageData):
|
|
171
171
|
if default is not None:
|
172
172
|
proto.default = json.dumps(default)
|
173
173
|
return proto
|
174
|
-
except
|
174
|
+
except Exception:
|
175
175
|
if default is not None:
|
176
176
|
proto.default = str(default)
|
177
177
|
return proto
|
178
178
|
except Exception as e:
|
179
|
-
raise ValueError(
|
179
|
+
raise ValueError(
|
180
|
+
f"Error setting default value of type, {type(default)} and value: {default}: {e}")
|
180
181
|
|
181
182
|
@classmethod
|
182
183
|
def get_default(cls, proto):
|
183
|
-
|
184
|
-
|
185
|
-
|
184
|
+
default_str = proto.default
|
185
|
+
default = None
|
186
|
+
import json
|
187
|
+
try:
|
188
|
+
# Attempt to parse as JSON first (for complex types)
|
189
|
+
return json.loads(default_str)
|
190
|
+
except json.JSONDecodeError:
|
191
|
+
pass
|
192
|
+
# Check for boolean values stored as "True" or "False"
|
193
|
+
if proto.type == resources_pb2.ModelTypeField.DataType.BOOL:
|
186
194
|
try:
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
pass
|
197
|
-
# Try to parse as integer
|
198
|
-
elif proto.type == resources_pb2.ModelTypeField.DataType.INT:
|
199
|
-
try:
|
200
|
-
default = int(default_str)
|
201
|
-
except ValueError:
|
202
|
-
pass
|
203
|
-
|
204
|
-
# Try to parse as float
|
205
|
-
elif proto.type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
206
|
-
try:
|
207
|
-
default = float(default_str)
|
208
|
-
except ValueError:
|
209
|
-
pass
|
210
|
-
elif proto.type == resources_pb2.ModelTypeField.DataType.STR:
|
211
|
-
default = default_str
|
212
|
-
|
213
|
-
if default is None:
|
214
|
-
# If all parsing fails, return the string value
|
215
|
-
default = default_str
|
216
|
-
return default
|
217
|
-
|
195
|
+
default = bool(default_str)
|
196
|
+
except ValueError:
|
197
|
+
pass
|
198
|
+
# Try to parse as integer
|
199
|
+
elif proto.type == resources_pb2.ModelTypeField.DataType.INT:
|
200
|
+
try:
|
201
|
+
default = int(default_str)
|
202
|
+
except ValueError:
|
203
|
+
pass
|
218
204
|
|
205
|
+
# Try to parse as float
|
206
|
+
elif proto.type == resources_pb2.ModelTypeField.DataType.FLOAT:
|
207
|
+
try:
|
208
|
+
default = float(default_str)
|
209
|
+
except ValueError:
|
210
|
+
pass
|
211
|
+
elif proto.type == resources_pb2.ModelTypeField.DataType.STR:
|
212
|
+
default = default_str
|
213
|
+
|
214
|
+
if default is None:
|
215
|
+
# If all parsing fails, return the string value
|
216
|
+
default = default_str
|
217
|
+
return default
|
219
218
|
|
220
219
|
|
221
220
|
class DataConverter:
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import collections.abc as abc
|
2
2
|
import inspect
|
3
|
-
import logging
|
4
3
|
import json
|
5
4
|
from collections import namedtuple
|
6
5
|
from typing import Dict, List, Tuple, get_args, get_origin
|
@@ -313,13 +312,6 @@ def deserialize(proto, signatures, inference_params={}, is_output=False):
|
|
313
312
|
kwargs[sig.name] = serializer.deserialize(part.data)
|
314
313
|
elif inference_params_value is not None:
|
315
314
|
kwargs[sig.name] = inference_params_value
|
316
|
-
elif sig.default and (sig.required is False) and (not is_output):
|
317
|
-
try:
|
318
|
-
kwargs[sig.name] = data_utils.InputField.get_default(sig)
|
319
|
-
except Exception as e:
|
320
|
-
# default is not set, so ignore
|
321
|
-
logging.exception('Default value not set for %s: %s', sig.name, e)
|
322
|
-
pass
|
323
315
|
else:
|
324
316
|
if sig_i == 0:
|
325
317
|
# possible inlined first value
|
@@ -0,0 +1,167 @@
|
|
1
|
+
import time
|
2
|
+
import uuid
|
3
|
+
|
4
|
+
|
5
|
+
def generate_id():
|
6
|
+
return f"chatcmpl-{uuid.uuid4().hex}"
|
7
|
+
|
8
|
+
|
9
|
+
def _format_non_streaming_response(
|
10
|
+
generated_text,
|
11
|
+
model="custom-model",
|
12
|
+
id=None,
|
13
|
+
created=None,
|
14
|
+
prompt_tokens=None,
|
15
|
+
completion_tokens=None,
|
16
|
+
finish_reason="stop",
|
17
|
+
):
|
18
|
+
if id is None:
|
19
|
+
id = generate_id()
|
20
|
+
if created is None:
|
21
|
+
created = int(time.time())
|
22
|
+
|
23
|
+
response = {
|
24
|
+
"id":
|
25
|
+
id,
|
26
|
+
"object":
|
27
|
+
"chat.completion",
|
28
|
+
"created":
|
29
|
+
created,
|
30
|
+
"model":
|
31
|
+
model,
|
32
|
+
"choices": [{
|
33
|
+
"index": 0,
|
34
|
+
"message": {
|
35
|
+
"role": "assistant",
|
36
|
+
"content": generated_text,
|
37
|
+
},
|
38
|
+
"finish_reason": finish_reason,
|
39
|
+
"logprobs": None,
|
40
|
+
}],
|
41
|
+
}
|
42
|
+
|
43
|
+
if prompt_tokens is not None and completion_tokens is not None:
|
44
|
+
response["usage"] = {
|
45
|
+
"prompt_tokens": prompt_tokens,
|
46
|
+
"completion_tokens": completion_tokens,
|
47
|
+
"total_tokens": prompt_tokens + completion_tokens,
|
48
|
+
}
|
49
|
+
|
50
|
+
return response
|
51
|
+
|
52
|
+
|
53
|
+
def _format_streaming_response(
|
54
|
+
generated_chunks,
|
55
|
+
model="custom-model",
|
56
|
+
id=None,
|
57
|
+
created=None,
|
58
|
+
finish_reason="stop",
|
59
|
+
):
|
60
|
+
if id is None:
|
61
|
+
id = generate_id()
|
62
|
+
if created is None:
|
63
|
+
created = int(time.time())
|
64
|
+
|
65
|
+
for chunk in generated_chunks:
|
66
|
+
yield {
|
67
|
+
"id":
|
68
|
+
id,
|
69
|
+
"object":
|
70
|
+
"chat.completion.chunk",
|
71
|
+
"created":
|
72
|
+
created,
|
73
|
+
"model":
|
74
|
+
model,
|
75
|
+
"choices": [{
|
76
|
+
"index": 0,
|
77
|
+
"delta": {
|
78
|
+
"content": chunk,
|
79
|
+
},
|
80
|
+
"finish_reason": None,
|
81
|
+
"logprobs": None,
|
82
|
+
}],
|
83
|
+
}
|
84
|
+
|
85
|
+
# Final chunk indicating completion
|
86
|
+
yield {
|
87
|
+
"id": id,
|
88
|
+
"object": "chat.completion.chunk",
|
89
|
+
"created": created,
|
90
|
+
"model": model,
|
91
|
+
"choices": [{
|
92
|
+
"index": 0,
|
93
|
+
"delta": {},
|
94
|
+
"finish_reason": finish_reason,
|
95
|
+
"logprobs": None,
|
96
|
+
}],
|
97
|
+
}
|
98
|
+
|
99
|
+
|
100
|
+
def openai_response(
|
101
|
+
generated_text,
|
102
|
+
model="custom-model",
|
103
|
+
id=None,
|
104
|
+
created=None,
|
105
|
+
prompt_tokens=None,
|
106
|
+
completion_tokens=None,
|
107
|
+
finish_reason="stop",
|
108
|
+
stream=True,
|
109
|
+
):
|
110
|
+
if stream:
|
111
|
+
return _format_streaming_response(generated_text, model, id, created, finish_reason)
|
112
|
+
else:
|
113
|
+
return _format_non_streaming_response(generated_text, model, id, created, prompt_tokens,
|
114
|
+
completion_tokens, finish_reason)
|
115
|
+
|
116
|
+
|
117
|
+
def openai_to_hf_messages(openai_messages):
|
118
|
+
"""
|
119
|
+
Converts OpenAI-style chat messages into a format compatible with Hugging Face's
|
120
|
+
`tokenizer.apply_chat_template()` function, supporting all modalities (text, images, etc.).
|
121
|
+
|
122
|
+
Args:
|
123
|
+
openai_messages (list): List of OpenAI-style messages, where each message is a dict with
|
124
|
+
'role' (str) and 'content' (str or list of parts).
|
125
|
+
|
126
|
+
Returns:
|
127
|
+
list: Hugging Face-compatible messages. Each message is a dict with 'role' and 'content'.
|
128
|
+
Content is a string (text-only) or a list of parts (multimodal).
|
129
|
+
"""
|
130
|
+
hf_messages = []
|
131
|
+
for msg in openai_messages:
|
132
|
+
role = msg['role']
|
133
|
+
content = msg['content']
|
134
|
+
|
135
|
+
if isinstance(content, list):
|
136
|
+
# Handle multimodal content (e.g., text + images)
|
137
|
+
converted_content = []
|
138
|
+
for part in content:
|
139
|
+
if part['type'] == 'text':
|
140
|
+
converted_content.append({'type': 'text', 'text': part['text']})
|
141
|
+
elif part['type'] == 'image_url':
|
142
|
+
# Handle image (extract base64 or URL)
|
143
|
+
image_url = part["image_url"]["url"]
|
144
|
+
if image_url.startswith("data:image"):
|
145
|
+
# Base64-encoded image
|
146
|
+
b64_img = image_url.split(",")[1]
|
147
|
+
converted_content.append({'type': 'image', 'base64': b64_img})
|
148
|
+
else:
|
149
|
+
# URL (model must handle downloads)
|
150
|
+
converted_content.append({'type': 'image', 'url': image_url})
|
151
|
+
elif part['type'] == 'video_url':
|
152
|
+
video_url = part["video_url"]["url"]
|
153
|
+
if video_url.startswith("data:video"):
|
154
|
+
ValueError("Base64 video data is not supported in HF format.")
|
155
|
+
else:
|
156
|
+
# URL (model must handle downloads)
|
157
|
+
converted_content.append({'type': 'video', 'url': video_url})
|
158
|
+
else:
|
159
|
+
raise ValueError(f"Unsupported content type: {part['type']} for conversion.")
|
160
|
+
hf_content = converted_content
|
161
|
+
else:
|
162
|
+
# Text-only content (string)
|
163
|
+
hf_content = content
|
164
|
+
|
165
|
+
hf_messages.append({'role': role, 'content': hf_content})
|
166
|
+
|
167
|
+
return hf_messages
|
@@ -0,0 +1,143 @@
|
|
1
|
+
from google.protobuf import struct_pb2, symbol_database, wrappers_pb2
|
2
|
+
from google.protobuf.descriptor import FieldDescriptor
|
3
|
+
from google.protobuf.message import Message
|
4
|
+
from google.protobuf.timestamp_pb2 import Timestamp
|
5
|
+
|
6
|
+
from clarifai.utils.logging import logger
|
7
|
+
|
8
|
+
# Initialize the Protobuf symbol database for dynamic message type resolution
|
9
|
+
db = symbol_database.Default()
|
10
|
+
|
11
|
+
# Define standard wrapper types for Protobuf well-known types
|
12
|
+
WRAPPER_TYPES = {
|
13
|
+
wrappers_pb2.Int32Value,
|
14
|
+
wrappers_pb2.Int64Value,
|
15
|
+
wrappers_pb2.StringValue,
|
16
|
+
wrappers_pb2.UInt32Value,
|
17
|
+
wrappers_pb2.UInt64Value,
|
18
|
+
}
|
19
|
+
|
20
|
+
|
21
|
+
def dict_to_protobuf(pb_obj: Message, data: dict) -> None:
|
22
|
+
"""Recursively convert a nested dictionary to a Protobuf message object.
|
23
|
+
|
24
|
+
Args:
|
25
|
+
pb_obj: The target Protobuf message instance to populate.
|
26
|
+
data: Source dictionary containing the data to convert.
|
27
|
+
"""
|
28
|
+
for field, value in data.items():
|
29
|
+
if field not in pb_obj.DESCRIPTOR.fields_by_name:
|
30
|
+
logger.warning(f"Ignoring unknown field '{field}' in message '{pb_obj.DESCRIPTOR.name}'")
|
31
|
+
continue
|
32
|
+
|
33
|
+
field_descriptor = pb_obj.DESCRIPTOR.fields_by_name[field]
|
34
|
+
|
35
|
+
try:
|
36
|
+
# Handle repeated fields (lists)
|
37
|
+
if field_descriptor.label == FieldDescriptor.LABEL_REPEATED:
|
38
|
+
_handle_repeated_field(pb_obj, field_descriptor, field, value)
|
39
|
+
|
40
|
+
# Handle message fields (nested messages)
|
41
|
+
elif field_descriptor.type == FieldDescriptor.TYPE_MESSAGE:
|
42
|
+
_handle_message_field(pb_obj, field_descriptor, field, value)
|
43
|
+
|
44
|
+
# Handle scalar fields
|
45
|
+
else:
|
46
|
+
if value:
|
47
|
+
setattr(pb_obj, field, value)
|
48
|
+
|
49
|
+
except Exception as e:
|
50
|
+
logger.error(f"Error processing field '{field}': {str(e)}")
|
51
|
+
raise
|
52
|
+
|
53
|
+
|
54
|
+
def _handle_repeated_field(pb_obj: Message, field_descriptor: FieldDescriptor, field: str,
|
55
|
+
value: list) -> None:
|
56
|
+
"""Process repeated fields (both scalar and message types)."""
|
57
|
+
if not isinstance(value, list):
|
58
|
+
logger.warning(f"Expected list for repeated field '{field}', got {type(value).__name__}")
|
59
|
+
return
|
60
|
+
|
61
|
+
repeated_field = getattr(pb_obj, field)
|
62
|
+
|
63
|
+
# Handle repeated message fields
|
64
|
+
if field_descriptor.type == FieldDescriptor.TYPE_MESSAGE:
|
65
|
+
for item in value:
|
66
|
+
if isinstance(item, dict):
|
67
|
+
item_msg = repeated_field.add()
|
68
|
+
dict_to_protobuf(item_msg, item)
|
69
|
+
elif isinstance(item, Message):
|
70
|
+
repeated_field.add().CopyFrom(item)
|
71
|
+
else:
|
72
|
+
logger.warning(f"Invalid type {type(item).__name__} in repeated message field '{field}'")
|
73
|
+
else:
|
74
|
+
# Handle repeated scalar fields
|
75
|
+
try:
|
76
|
+
repeated_field.extend(value)
|
77
|
+
except TypeError as e:
|
78
|
+
logger.error(f"Type mismatch in repeated scalar field '{field}': {str(e)}")
|
79
|
+
raise
|
80
|
+
|
81
|
+
|
82
|
+
def _handle_message_field(pb_obj: Message, field_descriptor: FieldDescriptor, field: str,
|
83
|
+
value: object) -> None:
|
84
|
+
"""Process message-type fields including special types."""
|
85
|
+
msg_class = db.GetSymbol(field_descriptor.message_type.full_name)
|
86
|
+
target_field = getattr(pb_obj, field)
|
87
|
+
|
88
|
+
# Handle special message types
|
89
|
+
if msg_class is Timestamp:
|
90
|
+
_set_timestamp_value(target_field, value)
|
91
|
+
elif msg_class is struct_pb2.Struct:
|
92
|
+
_set_struct_value(target_field, value)
|
93
|
+
elif msg_class in WRAPPER_TYPES:
|
94
|
+
_set_wrapper_value(target_field, msg_class, value)
|
95
|
+
else:
|
96
|
+
# Handle nested messages
|
97
|
+
if isinstance(value, dict):
|
98
|
+
nested_pb = msg_class()
|
99
|
+
dict_to_protobuf(nested_pb, value)
|
100
|
+
target_field.CopyFrom(nested_pb)
|
101
|
+
elif isinstance(value, Message):
|
102
|
+
target_field.CopyFrom(value)
|
103
|
+
else:
|
104
|
+
logger.warning(f"Invalid type {type(value).__name__} for message field '{field}'")
|
105
|
+
|
106
|
+
|
107
|
+
def _set_timestamp_value(target_field: Message, value: object) -> None:
|
108
|
+
"""Set timestamp value from dict or numeric timestamp."""
|
109
|
+
ts = Timestamp()
|
110
|
+
if isinstance(value, dict):
|
111
|
+
ts.seconds = value.get('seconds', 0)
|
112
|
+
ts.nanos = value.get('nanos', 0)
|
113
|
+
elif isinstance(value, (int, float)):
|
114
|
+
ts.seconds = int(value)
|
115
|
+
ts.nanos = int((value - ts.seconds) * 1e9)
|
116
|
+
else:
|
117
|
+
logger.warning(f"Unsupported timestamp format: {type(value).__name__}")
|
118
|
+
target_field.CopyFrom(ts)
|
119
|
+
|
120
|
+
|
121
|
+
def _set_struct_value(target_field: Message, value: object) -> None:
|
122
|
+
"""Convert dictionary to Protobuf Struct."""
|
123
|
+
if not isinstance(value, dict):
|
124
|
+
logger.warning(f"Expected dict for Struct field, got {type(value).__name__}")
|
125
|
+
return
|
126
|
+
|
127
|
+
struct = struct_pb2.Struct()
|
128
|
+
try:
|
129
|
+
struct.update(value)
|
130
|
+
except ValueError as e:
|
131
|
+
logger.error(f"Invalid value in Struct: {str(e)}")
|
132
|
+
raise
|
133
|
+
target_field.CopyFrom(struct)
|
134
|
+
|
135
|
+
|
136
|
+
def _set_wrapper_value(target_field: Message, wrapper_type: type, value: object) -> None:
|
137
|
+
"""Set value for wrapper types (e.g., Int32Value)."""
|
138
|
+
try:
|
139
|
+
wrapper = wrapper_type(value=value)
|
140
|
+
except TypeError as e:
|
141
|
+
logger.error(f"Invalid value for {wrapper_type.__name__}: {str(e)}")
|
142
|
+
raise
|
143
|
+
target_field.CopyFrom(wrapper)
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: clarifai
|
3
|
-
Version: 11.
|
3
|
+
Version: 11.3.0
|
4
4
|
Summary: Clarifai Python SDK
|
5
5
|
Home-page: https://github.com/Clarifai/clarifai-python
|
6
6
|
Author: Clarifai
|
@@ -20,7 +20,7 @@ Classifier: Operating System :: OS Independent
|
|
20
20
|
Requires-Python: >=3.8
|
21
21
|
Description-Content-Type: text/markdown
|
22
22
|
License-File: LICENSE
|
23
|
-
Requires-Dist: clarifai-grpc>=11.2
|
23
|
+
Requires-Dist: clarifai-grpc>=11.3.2
|
24
24
|
Requires-Dist: clarifai-protocol>=0.0.22
|
25
25
|
Requires-Dist: numpy>=1.22.0
|
26
26
|
Requires-Dist: tqdm>=4.65.0
|
@@ -42,6 +42,7 @@ Dynamic: description
|
|
42
42
|
Dynamic: description-content-type
|
43
43
|
Dynamic: home-page
|
44
44
|
Dynamic: license
|
45
|
+
Dynamic: license-file
|
45
46
|
Dynamic: provides-extra
|
46
47
|
Dynamic: requires-dist
|
47
48
|
Dynamic: requires-python
|