Clarifai Python SDK
This is the official Python client for interacting with our powerful API. The Clarifai Python SDK offers a comprehensive set of tools to integrate Clarifai's AI platform to leverage computer vision capabilities like classification , detection ,segementation and natural language capabilities like classification , summarisation , generation , Q&A ,etc into your applications. With just a few lines of code, you can leverage cutting-edge artificial intelligence to unlock valuable insights from visual and textual content.
Website | Schedule Demo | Signup for a Free Account | API Docs | Clarifai Community | Python SDK Docs | Examples | Colab Notebooks | Discord
Give the repo a star ⭐
Table Of Contents
:rocket: Installation
Install from PyPi:
pip install -U clarifai
Install from Source:
git clone https://github.com/Clarifai/clarifai-python.git
cd clarifai-python
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python setup.py install
:memo: Getting started
Clarifai uses Personal Access Tokens(PATs) to validate requests. You can create and manage PATs under your Clarifai account security settings.
Export your PAT as an environment variable. Then, import and initialize the API Client.
Set PAT as environment variable through terminal:
export CLARIFAI_PAT={your personal access token}
from clarifai.client.user import User
client = User(user_id="user_id")
apps_generator = client.list_apps()
apps = list(apps_generator)
OR
PAT can be passed as constructor argument
from clarifai.client.user import User
client = User(user_id="user_id", pat="your personal access token")
:floppy_disk: Interacting with Datasets
Clarifai datasets help in managing datasets used for model training and evaluation. It provides functionalities like creating datasets,uploading datasets, retrying failed uploads from logs and exporting datasets as .zip files.
app = client.create_app(app_id="demo_app", base_workflow="Universal")
dataset = app.create_dataset(dataset_id="demo_dataset")
from clarifai.datasets.upload.loaders.coco_detection import COCODetectionDataLoader
coco_dataloader = COCODetectionDataLoader("images_dir", "coco_annotation_filepath")
dataset.upload_dataset(dataloader=coco_dataloader, get_upload_status=True)
from clarifai.datasets.upload.utils import load_module_dataloader
cifar_dataloader = load_module_dataloader('./image_classification/cifar10')
dataset.upload_dataset(dataloader=cifar_dataloader,
get_upload_status=True,
log_warnings =True)
dataset.retry_upload_from_logs(dataloader=cifar_dataloader, log_file_path='log_file.log',
retry_duplicates=True,
log_warnings=True)
dataset.upload_from_csv(csv_path='csv_path', input_type='text', csv_type='raw', labels=True)
dataset.upload_from_folder(folder_path='folder_path', input_type='text', labels=True)
dataset.export(save_path='output.zip')
:floppy_disk: Interacting with Inputs
You can use inputs() for adding and interacting with input data. Inputs can be uploaded directly from a URL or a file. You can also view input annotations and concepts.
Input Upload
from clarifai.client.user import User
app = User(user_id="user_id").app(app_id="app_id")
input_obj = app.inputs()
input_obj.upload_from_url(input_id = 'demo', image_url='https://samples.clarifai.com/metro-north.jpg')
input_obj.upload_from_file(input_id = 'demo', video_file='demo.mp4')
input_obj.upload_text(input_id = 'demo', raw_text = 'This is a test')
Input Listing
input_generator = input_obj.list_inputs(page_no=1,per_page=10,input_type='image')
inputs_list = list(input_generator)
annotation_generator = input_obj.list_annotations(batch_input=inputs_list)
annotations_list = list(annotation_generator)
all_concepts = list(app.list_concepts())
Input Download
input_generator = input_obj.list_inputs(page_no=1,per_page=1,input_type='image')
inputs_list = list(input_generator)
input_bytes = input_obj.download_inputs(inputs_list)
with open('demo.jpg','wb') as f:
f.write(input_bytes[0])
:brain: Interacting with Models
The Model Class allows you to perform predictions using Clarifai models. You can specify which model to use by providing the model URL or ID. This gives you flexibility in choosing models. The App Class also allows listing of all available Clarifai models for discovery.
For greater control over model predictions, you can pass in an output_config
to modify the model output as demonstrated below.
Model Predict
from clarifai.client.model import Model
"""
Get Model information on details of model(description, usecases..etc) and info on training or
# other inference parameters(eg: temperature, top_k, max_tokens..etc for LLMs)
"""
gpt_4_model = Model("https://clarifai.com/openai/chat-completion/models/GPT-4")
print(gpt_4_model)
model_prediction = Model("https://clarifai.com/anthropic/completion/models/claude-v2").predict_by_bytes(b"Write a tweet on future of AI")
model_prediction = gpt_4_model.predict_by_bytes(b"Write a tweet on future of AI", inference_params=dict(temperature=str(0.7), max_tokens=30))
model_prediction = model.predict_by_filepath(filepath="local_filepath", output_config={"min_value": 0.98})
model_prediction = model.predict_by_url(url="url")
video_input_proto = [input_obj.get_input_from_url("Input_id", video_url=BEER_VIDEO_URL)]
model_prediction = model.predict(video_input_proto, output_config={"sample_ms": 2000})
Model Training
from clarifai.client.app import App
from clarifai.client.model import Model
"""
Create model with trainable model_type
"""
app = App(user_id="user_id", app_id="app_id")
model = app.create_model(model_id="model_id", model_type_id="visual-classifier")
(or)
model = Model('url')
"""
List training templates for the model_type
"""
templates = model.list_training_templates()
print(templates)
"""
Get parameters for the model.
"""
params = model.get_params(template='classification_basemodel_v1', save_to='model_params.yaml')
"""
Update the model params yaml and pass it to model.train()
"""
model_version_id = model.train('model_params.yaml')
"""
Training status and saving logs
"""
status = model.training_status(version_id=model_version_id,training_logs=True)
print(status)
Export your trained model
Model Export feature enables you to package your trained model into a model.tar
file. This file enables deploying your model within a Triton Inference Server deployment.
from clarifai.client.model import Model
model = Model('url')
model.export('output/folder/')
Evaluate your trained model
When your model is trained and ready, you can evaluate by the following code
from clarifai.client.model import Model
model = Model('url')
model.evaluate(dataset_id='your-dataset-id')
Compare the evaluation results of your models.
from clarifai.client.model import Model
from clarifai.client.dataset import Dataset
from clarifai.utils.evaluation import EvalResultCompare
models = ['model url1', 'model url2']
dataset = 'dataset url'
compare = EvalResultCompare(
models=models,
datasets=dataset,
attempt_evaluate=True
)
compare.all('output/folder/')
Models Listing
all_model_versions = list(model.list_versions())
model_v1 = client.app("app_id").model(model_id="model_id", model_version_id="model_version_id")
all_models = list(app.list_models())
all_llm_community_models = App().list_models(filter_by={"query": "LLM",
"model_type_id": "text-to-text"}, only_in_app=False)
all_llm_community_models = list(all_llm_community_models)
:fire: Interacting with Workflows
Workflows offer a versatile framework for constructing the inference pipeline, simplifying the integration of diverse models. You can use the Workflow class to create and manage workflows using YAML configuration.
For starting or making quick adjustments to existing Clarifai community workflows using an initial YAML configuration, the SDK provides an export feature.
Workflow Predict
from clarifai.client.workflow import Workflow
workflow = Workflow("workflow_url")
workflow_prediction = workflow.predict_by_url(url="url")
workflow = Workflow(user_id="user_id", app_id="app_id", workflow_id="workflow_id",
output_config={"min_value": 0.98})
workflow_prediction = workflow.predict_by_filepath(filepath="local_filepath")
Workflows Listing
all_workflow_versions = list(workflow.list_versions())
workflow_v1 = Workflow(workflow_id="workflow_id", workflow_version=dict(id="workflow_version_id"), app_id="app_id", user_id="user_id")
all_workflow = list(app.list_workflow())
all_face_community_workflows = App().list_workflows(filter_by={"query": "face"}, only_in_app=False)
all_face_community_workflows = list(all_face_community_workflows)
Workflow Create
Create a new workflow specified by a yaml config file.
from clarifai.client.app import App
app = App(app_id="app_id", user_id="user_id")
workflow = app.create_workflow(config_filepath="config.yml")
Workflow Export
Export an existing workflow from Clarifai as a local yaml file.
from clarifai.client.workflow import Workflow
workflow = Workflow("https://clarifai.com/clarifai/main/workflows/Demographics")
workflow.export('demographics_workflow.yml')
:mag: Search
Smart Image Search
Clarifai's Smart Search feature leverages vector search capabilities to power the search experience. Vector search is a type of search engine that uses vectors to search and retrieve text, images, and videos.
Instead of traditional keyword-based search, where exact matches are sought, vector search allows for searching based on visual and/or semantic similarity by calculating distances between vector embedding representations of the data.
Here is an example of how to use vector search to find similar images:
from clarifai.client.search import Search
search = Search(user_id="user_id", app_id="app_id", top_k=1, metric="cosine")
results = search.query(ranks=[{"image_url": "https://samples.clarifai.com/metro-north.jpg"}])
for data in results:
print(data.hits[0].input.data.image.url)
Smart Text Search
Smart Text Search is our proprietary feature that uses deep learning techniques to sort, rank, and retrieve text data based on their content and semantic similarity.
Here is an example of how to use Smart Text Search to find similar text:
results = search.query(ranks=[{"text_raw": "I love my dog"}])
Filters
You can use filters to narrow down your search results. Filters can be used to filter by concepts, metadata, and Geo Point.
It is possible to add together multiple search parameters to expand your search. You can even combine negated search terms for more advanced tasks.
For example, you can combine two concepts as below.
results = search.query(ranks=[{"image_url": "https://samples.clarifai.com/metro-north.jpg"}],
filters=[{"concepts": [{"name": "deer", "value":1},
{"name": "dog", "value":1}]}])
results = search.query(ranks=[{"image_url": "https://samples.clarifai.com/metro-north.jpg"}],
filters=[{"concepts": [{"name": "deer", "value":1}],
"concepts": [{"name": "dog", "value":1}]}])
Input filters allows to filter by input_type, status of inputs and by inputs_dataset_id
results = search.query(filters=[{'input_types': ['image', 'text']}])
Below is an example of using Search with Pagination.
from clarifai.client.search import Search
search = Search(user_id="user_id", app_id="app_id", metric="cosine", pagination=True)
results = search.query(ranks=[{"image_url": "https://samples.clarifai.com/metro-north.jpg"}],page_no=2,per_page=5)
for data in results:
print(data.hits[0].input.data.image.url)
Retrieval Augmented Generation (RAG)
You can setup and start your RAG pipeline in 4 lines of code. The setup method automatically creates a new app and the necessary components under the hood. By default it uses the mistral-7B-Instruct model.
from clarifai.rag import RAG
rag_agent = RAG.setup(user_id="USER_ID")
rag_agent.upload(folder_path="~/docs")
rag_agent.chat(messages=[{"role":"human", "content":"What is Clarifai"}])
If you have previously run the setup method, you can instantiate the RAG class with the prompter workflow URL:
from clarifai.rag import RAG
rag_agent = RAG(workflow_url="WORKFLOW_URL")
:pushpin: More Examples
See many more code examples in this repo.
Also see the official Python SDK docs