scaleapi


Namescaleapi JSON
Version 2.15.4 PyPI version JSON
download
home_pagehttps://github.com/scaleapi/scaleapi-python-client
SummaryThe official Python client library for Scale AI, the Data Platform for AI
upload_time2024-02-01 17:49:12
maintainer
docs_urlNone
authorScale AI
requires_python>=3.6
license
keywords scale scaleapi tasks categorization labeling annotation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            *********************
Scale AI | Python SDK
*********************

If you use earlier versions of the SDK, please refer to `v1.0.4 documentation <https://github.com/scaleapi/scaleapi-python-client/blob/release-1.0.4/README.rst>`_.

If you are migrating from earlier versions to v2,  please refer to `Migration Guide to v2 <https://github.com/scaleapi/scaleapi-python-client/blob/master/docs/migration_guide.md>`_.

|pic1| |pic2| |pic3|

.. |pic1| image:: https://pepy.tech/badge/scaleapi/month
  :alt: Downloads
  :target: https://pepy.tech/project/scaleapi
.. |pic2| image:: https://img.shields.io/pypi/pyversions/scaleapi.svg
  :alt: Supported Versions
  :target: https://pypi.org/project/scaleapi
.. |pic3| image:: https://img.shields.io/github/contributors/scaleapi/scaleapi-python-client.svg
  :alt: Contributors
  :target: https://github.com/scaleapi/scaleapi-python-client/graphs/contributors

Installation
____________

Install with PyPI (pip)

.. code-block:: bash

    $ pip install --upgrade scaleapi

or install with Anaconda (conda)

.. code-block:: bash

    $ conda install -c conda-forge scaleapi

Usage
_____

.. code-block:: python

    import scaleapi

    client = scaleapi.ScaleClient("YOUR_API_KEY_HERE")

If you need to use a proxy to connect Scale API, you can feed ``proxies``, ``cert`` and ``verify`` attributes of the python ``requests`` package during the client initialization.
Proxy support is available with SDK version 2.14.0 and beyond.

`Documentation of Proxies usage in requests package`__

__ https://requests.readthedocs.io/en/latest/user/advanced/#proxies

.. code-block:: python

    proxies = { 'https': 'http://10.10.1.10:1080' }

    client = scaleapi.ScaleClient(
                api_key="YOUR_API_KEY_HERE",
                proxies=proxies,
                cert='/path/client.cert',
                verify=True
            )

Tasks
_____

Most of these methods will return a `scaleapi.Task` object, which will contain information
about the json response (task_id, status, params, response, etc.).

Any parameter available in `Scale's API documentation`__ can be passed as an argument option with the corresponding type.

__ https://docs.scale.com/reference#tasks-object-overview

The following endpoints for tasks are available:

Create Task
^^^^^^^^^^^

This method can be used for any Scale supported task type using the following format:

.. code-block:: python

    client.create_task(TaskType, ...task parameters...)

Passing in the applicable values into the function definition. The applicable fields and further information for each task type can be found in `Scale's API documentation`__.

__ https://docs.scale.com/reference

.. code-block:: python

    from scaleapi.tasks import TaskType
    from scaleapi.exceptions import ScaleDuplicateResource

    payload = dict(
        project = "test_project",
        callback_url = "http://www.example.com/callback",
        instruction = "Draw a box around each baby cow and big cow.",
        attachment_type = "image",
        attachment = "http://i.imgur.com/v4cBreD.jpg",
        unique_id = "c235d023af73",
        geometries = {
            "box": {
                "objects_to_annotate": ["Baby Cow", "Big Cow"],
                "min_height": 10,
                "min_width": 10,
            }
        },
    )

    try:
        client.create_task(TaskType.ImageAnnotation, **payload)
    except ScaleDuplicateResource as err:
        print(err.message)  # If unique_id is already used for a different task


Retrieve a task
^^^^^^^^^^^^^^^

Retrieve a task given its id. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#retrieve-tasks

.. code-block :: python

    task = client.get_task("30553edd0b6a93f8f05f0fee")
    print(task.status)  # Task status ("pending", "completed", "error", "canceled")
    print(task.response) # If task is complete


Task Attributes
^^^^^^^^^^^^^^^

The older ``param_dict`` attribute is now replaced with a method ``as_dict()`` to return a task's all attributes as a dictionary (JSON).

.. code-block :: python

    task.as_dict()

    # {
    #  'task_id': '30553edd0b6a93f8f05f0fee',
    #  'created_at': '2021-06-17T21:46:36.359Z',
    #  'type': 'imageannotation',
    #  'status': 'pending',
    #   ....
    #  'params': {
    #   'attachment': 'http://i.imgur.com/v4cBreD.jpg',
    #   'attachment_type': 'image',
    #   'geometries': {
    #    'box': {
    #     'objects_to_annotate': ['Baby Cow', 'Big Cow'],
    #     'min_height': 10,
    #     'min_width': 10,
    #     ...
    #   },
    #  'project': 'My Project',
    #  ...
    # }

First-level attributes of Task are also accessible with ``.`` annotation as the following:

.. code-block :: python

    task.status                   # same as task.as_dict()["status"]
    task.params["geometries"]     # same as task.as_dict()["params"]["geometries"]
    task.response["annotations"]  # same as task.as_dict()["response"]["annotations"]


Accessing ``task.params`` child objects directly at task level is **deprecated**. Instead of ``task.attribute``, you should use ``task.params["attribute"]`` for accessing objects under `params`.

.. code-block :: python

    task.params["geometries"]   # task.geometries is DEPRECATED
    task.params["attachment"]   # task.attachment is DEPRECATED

If you use the ``limited_response = True`` filter in ``get_tasks()``, you will only receive the following attributes: ``task_id``, ``status``, ``metadata``, ``project`` and ``otherVersion``.

Retrieve List of Tasks
^^^^^^^^^^^^^^^^^^^^^^

Retrieve a list of `Task` objects, with filters for: ``project_name``, ``batch_name``, ``type``, ``status``,
``review_status``, ``unique_id``, ``completed_after``, ``completed_before``, ``updated_after``, ``updated_before``,
``created_after``, ``created_before``, ``tags`` and ``limited_response``.

``get_tasks()`` is a **generator** method and yields ``Task`` objects.

*A generator is another type of function, returns an iterable that you can loop over like a list.
However, unlike lists, generators do not store the content in the memory.
That helps you to process a large number of objects without increasing memory usage.*

If you will iterate through the tasks and process them once, using a generator is the most efficient method.
However, if you need to process the list of tasks multiple times, you can wrap the generator in a ``list(...)``
statement, which returns a list of Tasks by loading them into the memory.

Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#list-multiple-tasks

.. code-block :: python

    from scaleapi.tasks import TaskReviewStatus, TaskStatus

    tasks = client.get_tasks(
        project_name = "My Project",
        created_after = "2020-09-08",
        completed_before = "2021-04-01",
        status = TaskStatus.Completed,
        review_status = TaskReviewStatus.Accepted
    )

    # Iterating through the generator
    for task in tasks:
        # Download task or do something!
        print(task.task_id)

    # For retrieving results as a Task list
    task_list = list(tasks)
    print(f"{len(task_list)} tasks retrieved")

Get Tasks Count
^^^^^^^^^^^^^^^

``get_tasks_count()`` method returns the number of tasks with the given optional parameters for: ``project_name``, ``batch_name``, ``type``, ``status``,
``review_status``, ``unique_id``, ``completed_after``, ``completed_before``, ``updated_after``, ``updated_before``,
``created_after``, ``created_before`` and ``tags``.

.. code-block :: python

    from scaleapi.tasks import TaskReviewStatus, TaskStatus

    task_count = client.get_tasks_count(
        project_name = "My Project",
        created_after = "2020-09-08",
        completed_before = "2021-04-01",
        status = TaskStatus.Completed,
        review_status = TaskReviewStatus.Accepted
    )

    print(task_count)  # 1923


Cancel Task
^^^^^^^^^^^

Cancel a task given its id if work has not started on the task (task status is ``Queued`` in the UI). Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#cancel-task

.. code-block :: python

    task = client.cancel_task('30553edd0b6a93f8f05f0fee')

    # If you also want to clear 'unique_id' of a task while canceling
    task = client.cancel_task('30553edd0b6a93f8f05f0fee', clear_unique_id=True)

    # cancel() is also available on task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    task.cancel()

    # If you also want to clear 'unique_id' of a task while canceling
    task.cancel(clear_unique_id=True)


Audit a Task
^^^^^^^^^^^^

This method allows you to ``accept`` or ``reject`` completed tasks, along with support for adding comments about the reason for the given audit status, mirroring our Audit UI.
Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference/audit-a-task

.. code-block :: python

    # Accept a completed task by submitting an audit
    client.audit_task('30553edd0b6a93f8f05f0fee', True)

    # Reject a completed task by submitting a comment with the audit
    client.audit_task('30553edd0b6a93f8f05f0fee', False, 'Rejected due to quality')

    # audit() is also available on Task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    task.audit(True)


Update A Task's Unique Id
^^^^^^^^^^^^^^^^^^^^^^^^^

Update a given task's unique_id. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference/update-task-unique-id

.. code-block :: python

    task = client.update_task_unique_id('30553edd0b6a93f8f05f0fee', "new_unique_id")

    # update_unique_id() is also available on task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    task.update_unique_id("new_unique_id")


Clear A Task's Unique Id
^^^^^^^^^^^^^^^^^^^^^^^^^

Clear a given task's unique_id. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference/delete-task-unique-id

.. code-block :: python

    task = client.clear_task_unique_id('30553edd0b6a93f8f05f0fee')

    # clear_unique_id() is also available on task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    task.clear_unique_id()


Set A Task's Metadata
^^^^^^^^^^^^^^^^^^^^^^^^^

Set a given task's ``metadata``. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference/set-metadata

.. code-block :: python

    # set metadata on a task by specifying task id
    new_metadata = {'myKey': 'myValue'}
    task = client.set_task_metadata('30553edd0b6a93f8f05f0fee', new_metadata)

    # set metadata on a task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    new_metadata = {'myKey': 'myValue'}
    task.set_metadata(new_metadata)

Set A Task's Tags
^^^^^^^^^^^^^^^^^^^^^^^^^

Set a given task's ``tags``. This will replace all existing tags on a task. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference/setting-tags

.. code-block :: python

    # set a list of tags on a task by specifying task id
    new_tags = ["tag1", "tag2", "tag3"]
    task = client.set_task_tags('30553edd0b6a93f8f05f0fee', new_tags)

    # set a list of tags on a task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    new_tags = ["tag1", "tag2", "tag3"]
    task.set_tags(new_tags)

Add Tags to A Task
^^^^^^^^^^^^^^^^^^^^^^^^^

Add ``tags`` to a given task. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference/adding-tags

.. code-block :: python

    # add a list of tags on a task by specifying task id
    tags_to_add = ["tag4", "tag5"]
    task = client.add_task_tags('30553edd0b6a93f8f05f0fee', tags_to_add)

    # add a list of tags on a task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    tags_to_add = ["tag4", "tag5"]
    task.add_tags(tags_to_add)

Delete Tags from A Task
^^^^^^^^^^^^^^^^^^^^^^^^^

Delete ``tags`` from a given task. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference/deleting-tags

.. code-block :: python

    # delete a list of tags on a task by specifying task id
    tags_to_delete = ["tag1", "tag2"]
    task = client.delete_task_tags('30553edd0b6a93f8f05f0fee', tags_to_delete)

    # delete a list of tags on a task object
    task = client.get_task('30553edd0b6a93f8f05f0fee')
    tags_to_delete = ["tag1", "tag2"]
    task.delete_tags(tags_to_delete)

Batches
_______

Create Batch
^^^^^^^^^^^^

Create a new Batch. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#batch-creation

.. code-block:: python

    batch = client.create_batch(
        project = "test_project",
        callback = "http://www.example.com/callback",
        batch_name = "batch_name_01_07_2021"
    )

    print(batch.name)  # batch_name_01_07_2021

Throws ``ScaleDuplicateResource`` exception if a batch with the same name already exists.

Finalize Batch
^^^^^^^^^^^^^^^

Finalize a Batch. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#batch-finalization

.. code-block:: python

    client.finalize_batch(batch_name="batch_name_01_07_2021")

    # Alternative method
    batch = client.get_batch(batch_name="batch_name_01_07_2021")
    batch.finalize()

Check Batch Status
^^^^^^^^^^^^^^^^^^

Get the status of a Batch. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#batch-status

.. code-block:: python

    client.batch_status(batch_name = "batch_name_01_07_2021")

    # Alternative via Batch.get_status()
    batch = client.get_batch("batch_name_01_07_2021")
    batch.get_status() # Refreshes tasks_{status} attributes of Batch
    print(batch.tasks_pending, batch.tasks_completed)

Retrieve A Batch
^^^^^^^^^^^^^^^^

Retrieve a single Batch. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#batch-retrieval

.. code-block:: python

    batch = client.get_batch(batch_name = "batch_name_01_07_2021")

The older ``param_dict`` attribute is now replaced with a method ``batch.as_dict()`` to return a batch's all attributes as a dictionary (JSON).

List Batches
^^^^^^^^^^^^

Retrieve a list of Batches. Optional parameters are ``project_name``, ``batch_status``, ``exclude_archived``, ``created_after`` and ``created_before``.

``get_batches()`` is a **generator** method and yields ``Batch`` objects.

*A generator is another type of function, returns an iterable that you can loop over like a list.
However, unlike lists, generators do not store the content in the memory.
That helps you to process a large number of objects without increasing memory usage.*

When wrapped in a ``list(...)`` statement, it returns a list of Batches by loading them into the memory.

Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#batch-list

.. code-block :: python

    from scaleapi.batches import BatchStatus

    batches = client.get_batches(
        batch_status=BatchStatus.Completed,
        created_after = "2020-09-08"
    )

    counter = 0
    for batch in batches:
        counter += 1
        print(f"Downloading batch {counter} | {batch.name} | {batch.project}")

    # Alternative for accessing as a Batch list
    batch_list = list(batches)
    print(f"{len(batch_list))} batches retrieved")

Projects
________

Create Project
^^^^^^^^^^^^^^

Create a new Project. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#project-creation

.. code-block:: python

    from scaleapi.tasks import TaskType

    project = client.create_project(
        project_name = "Test_Project",
        task_type = TaskType.ImageAnnotation,
        params = {"instruction": "Please label the kittens"},
    )

    print(project.name)  # Test_Project

Specify ``rapid=true`` for Rapid projects and ``studio=true`` for Studio projects. Throws ``ScaleDuplicateResource`` exception if a project with the same name already exists.

Retrieve Project
^^^^^^^^^^^^^^^^

Retrieve a single Project. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#project-retrieval

.. code-block:: python

    project = client.get_project(project_name = "test_project")

The older ``param_dict`` attribute is now replaced with a method ``project.as_dict()`` to return a project's all attributes as a dictionary (JSON).

List Projects
^^^^^^^^^^^^^

This function does not take any arguments. Retrieve a list of every Project.
Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#batch-list

.. code-block :: python

    counter = 0
    projects = client.projects()
    for project in projects:
        counter += 1
        print(f'Downloading project {counter} | {project.name} | {project.type}')

Update Project
^^^^^^^^^^^^^^

Creates a new version of the Project. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#project-update-parameters

.. code-block :: python

    data = client.update_project(
        project_name="test_project",
        patch=False,
        instruction="update: Please label all the stuff",
    )

Files
________

Files are a way of uploading local files directly to Scale storage or importing files before creating tasks.


Upload Files
^^^^^^^^^^^^^^

Upload a file. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#file-upload-1

.. code-block:: python

    with open(file_name, 'rb') as f:
        my_file = client.upload_file(
            file=f,
            project_name = "test_project",
        )

The ``file.attachment_url`` can be used in place of attachments in task payload.


.. code-block:: python

    my_file.as_dict()

    # {
    #  'attachment_url': 'scaledata://606e2a0a46102303a130949/8ac09a90-c143-4154-9a9b-6c35121396d1f',
    #  'created_at': '2021-06-17T21:56:53.825Z',
    #  'id': '8ac09d70-ca43-4354-9a4b-6c3591396d1f',
    #  'mime_type': 'image/png',
    #  'project_names': ['test_project'],
    #  'size': 340714,
    #  'updated_at': '2021-06-17T21:56:53.825Z'
    # }

Import Files
^^^^^^^^^^^^^^

Import a file from a URL. Check out `Scale's API documentation`__ for more information.

__ https://docs.scale.com/reference#file-import-1

.. code-block:: python

    my_file = client.import_file(
        file_url="http://i.imgur.com/v4cBreD.jpg",
        project_name = "test_project",
    )


After the files are successfully uploaded to Scale's storage, you can access the URL as ``my_file.attachment_url``, which will have a prefix like ``scaledata://``.

The attribute can be passed to the task payloads, in the ``attachment`` parameter.

.. code-block:: python

  task_payload = dict(
      ...
      ...
      attachment_type = "image",
      attachment = my_file.attachment_url,  # scaledata://606e2a30949/89a90-c143-4154-9a9b-6c36d1f
      ...
      ...
  )

Manage Teammates
________________

Manage the members of your Scale team via API. Check out `Scale Team API Documentation`__ for more information.

__ https://docs.scale.com/reference/teams-overview

List Teammates
^^^^^^^^^^^^^^

Lists all teammates in your Scale team.
Returns all teammates in a List of Teammate objects.

.. code-block:: python

    teammates = client.list_teammates()

Invite Teammate
^^^^^^^^^^^^^^^

Invites a list of email strings to your team with the provided role.
The available teammate roles are: 'labeler', 'member', or 'manager'.
Returns all teammates in a List of Teammate objects.

.. code-block:: python

    from scaleapi import TeammateRole

    teammates = client.invite_teammates(['email1@example.com', 'email2@example.com'], TeammateRole.Member)

Update Teammate Role
^^^^^^^^^^^^^^^^^^^^^

Updates a list of emails of your Scale team members with the new role.
The available teammate roles are: 'labeler', 'member', or 'manager'.
Returns all teammates in a List of Teammate objects.

.. code-block python

    from scaleapi import TeammateRole

    teammates = client.update_teammates_role(['email1@example.com', 'email2@example.com'], TeammateRole.Manager)

Example Scripts
_______________

A list of examples scripts for use.

* `cancel_batch.py`__ to concurrently cancel tasks in batches

__ https://github.com/scaleapi/scaleapi-python-client/blob/master/examples/cancel_batch.py

Evaluation tasks (For Scale Rapid projects only)
________________________________________________

Evaluation tasks are tasks that we know the answer to and are used to measure workers' performance internally to ensure the quality

Create Evaluation Task
^^^^^^^^^^^^^^^^^^^^^^

Create an evaluation task.

.. code-block:: python

    client.create_evaluation_task(TaskType, ...task parameters...)

Passing in the applicable values into the function definition. The applicable fields are the same as for create_task. Applicable fields for each task type can be found in `Scale's API documentation`__. Additionally an expected_response is required. An optional initial_response can be provided if it's for a review phase evaluation task.

__ https://docs.scale.com/reference

.. code-block:: python

    from scaleapi.tasks import TaskType

    expected_response = {
        "annotations": {
            "answer_reasonable": {
                "type": "category",
                "field_id": "answer_reasonable",
                "response": [
                    [
                        "no"
                    ]
                ]
            }
        }
    }

    initial_response = {
        "annotations": {
            "answer_reasonable": {
                "type": "category",
                "field_id": "answer_reasonable",
                "response": [
                    [
                        "yes"
                    ]
                ]
            }
        }
    }

    attachments = [
        {"type": "image", "content": "https://i.imgur.com/bGjrNzl.jpeg"}
    ]

    payload = dict(
        project = "test_project",
        attachments,
        initial_response=initial_response,
        expected_response=expected_response,
    )

    client.create_evaluation_task(TaskType.TextCollection, **payload)

Training tasks (For Scale Rapid projects only)
________________________________________________

Training tasks are used to onboard taskers onto your project

Create Training Task
^^^^^^^^^^^^^^^^^^^^^^

Create a training task.

.. code-block:: python

    client.create_training_task(TaskType, ...task parameters...)

Studio Assignments (For Scale Studio only)
__________________________________________

Manage project assignments for your labelers.

List All Assignments
^^^^^^^^^^^^^^^^^^^^

Lists all your Scale team members and the projects they are assigned to.
Returns a dictionary of all teammate assignments with keys as 'emails' of each teammate, and values as a list of project names the teammate are assigned to.

.. code-block:: python

    assignments = client.list_studio_assignments()
    my_assignment = assignments.get('my-email@example.com')

Add Studio Assignment
^^^^^^^^^^^^^^^^^^^^^

Assigns provided projects to specified teammate emails.

Accepts a list of emails and a list of projects.

Returns a dictionary of all teammate assignments with keys as 'emails' of each teammate, and values as a list of project names the teammate are assigned to.

.. code-block:: python

    assignments = client.add_studio_assignments(['email1@example.com', 'email2@example.com'], ['project 1', 'project 2'])


Remove Studio Assignment
^^^^^^^^^^^^^^^^^^^^^^^^

Removes provided projects from specified teammate emails.

Accepts a list of emails and a list of projects.

Returns a dictionary of all teammate assignments with keys as 'emails' of each teammate, and values as a list of project names the teammate are assigned to.

.. code-block:: python

    assignments = client.remove_studio_assignments(['email1@example.com', 'email2@example.com'], ['project 1', 'project 2'])

Studio Project Groups (For Scale Studio Only)
_____________________________________________

Manage groups of labelers in our project by using Studio Project Groups.

List Studio Project Groups
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Returns all labeler groups for the specified project.

.. code-block:: python

    list_project_group = client.list_project_groups('project_name')

Add Studio Project Group
^^^^^^^^^^^^^^^^^^^^^^^^

Creates a project group with the provided group_name for the specified project and adds the provided teammate emails to the new project group. The team members must be assigned to the specified project in order to be added to the new group.

Returns the created StudioProjectGroup object.

.. code-block:: python

    added_project_group = client.create_project_group(
        'project_name', ['email1@example.com'], 'project_group_name'
    )

Update Studio Project Group
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Assign or remove teammates from a project group.

Returns the updated StudioProjectGroup object.

.. code-block:: python

    updated_project_group = client.update_project_group(
        'project_name', 'project_group_name', ['emails_to_add'], ['emails_to_remove']
    )

Studio Batches (For Scale Studio Only)
_______________________________________

Get information about your pending Studio batches.

List Studio Batches
^^^^^^^^^^^^^^^^^^^

Returns a list of StudioBatch objects for all pending Studio batches.

.. code-block:: python

    studio_batches = client.list_studio_batches()

Assign Studio Batches
^^^^^^^^^^^^^^^^^^^^^^

Sets labeler group assignment for the specified batch.

Returns a StudioBatch object for the specified batch.

.. code-block:: python

    assigned_studio_batch = client.assign_studio_batches('batch_name', ['project_group_name'])

Set Studio Batches Priority
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Sets the order to prioritize your pending Studio batches. You must include all pending studio batches in the List.

Returns a List of StudioBatch objects in the new order.

.. code-block:: python

    studio_batch_priority = client.set_studio_batches_priorities(
        ['pending_batch_1', 'pending_batch_2', 'pending_batch_3']
    )

Reset Studio Batches Priority
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Resets the order of your Studio batches to the default order, which prioritizes older batches first.

Returns a List of StudioBatch objects in the new order.

.. code-block:: python

    reset_studio_batch_prioprity = client.reset_studio_batches_priorities()


Error handling
______________

If something went wrong while making API calls, then exceptions will be raised automatically
as a `ScaleException` parent type and child exceptions:

- ``ScaleInvalidRequest``: 400 - Bad Request -- The request was unacceptable, often due to missing a required parameter.
- ``ScaleUnauthorized``: 401 - Unauthorized -- No valid API key provided.
- ``ScaleNotEnabled``: 402 - Not enabled -- Please contact sales@scaleapi.com before creating this type of task.
- ``ScaleResourceNotFound``: 404 - Not Found -- The requested resource doesn't exist.
- ``ScaleDuplicateResource``: 409 - Conflict -- Object already exists with same name, idempotency key or unique_id.
- ``ScaleTooManyRequests``: 429 - Too Many Requests -- Too many requests hit the API too quickly.
- ``ScaleInternalError``: 500 - Internal Server Error -- We had a problem with our server. Try again later.
- ``ScaleServiceUnavailable``: 503 - Server Timeout From Request Queueing -- Try again later.
- ``ScaleTimeoutError``: 504 - Server Timeout Error -- Try again later.

Check out `Scale's API documentation <https://docs.scale.com/reference#errors>`_ for more details.

For example:

.. code-block:: python

    from scaleapi.exceptions import ScaleException

    try:
        client.create_task(TaskType.TextCollection, attachment="Some parameters are missing.")
    except ScaleException as err:
        print(err.code)  # 400
        print(err.message)  # Parameter is invalid, reason: "attachments" is required



Troubleshooting
_______________

If you notice any problems, please contact our support via Intercom by logging into your dashboard, or, if you are Enterprise, by contacting your Engagement Manager.



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/scaleapi/scaleapi-python-client",
    "name": "scaleapi",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": "",
    "keywords": "scale,scaleapi,tasks,categorization,labeling,annotation",
    "author": "Scale AI",
    "author_email": "support@scale.com",
    "download_url": "https://files.pythonhosted.org/packages/28/48/d615913ed07e3ab565f665113bd45b6df5ab8f691c743ec24cddb244cb06/scaleapi-2.15.4.tar.gz",
    "platform": null,
    "description": "*********************\nScale AI | Python SDK\n*********************\n\nIf you use earlier versions of the SDK, please refer to `v1.0.4 documentation <https://github.com/scaleapi/scaleapi-python-client/blob/release-1.0.4/README.rst>`_.\n\nIf you are migrating from earlier versions to v2,  please refer to `Migration Guide to v2 <https://github.com/scaleapi/scaleapi-python-client/blob/master/docs/migration_guide.md>`_.\n\n|pic1| |pic2| |pic3|\n\n.. |pic1| image:: https://pepy.tech/badge/scaleapi/month\n  :alt: Downloads\n  :target: https://pepy.tech/project/scaleapi\n.. |pic2| image:: https://img.shields.io/pypi/pyversions/scaleapi.svg\n  :alt: Supported Versions\n  :target: https://pypi.org/project/scaleapi\n.. |pic3| image:: https://img.shields.io/github/contributors/scaleapi/scaleapi-python-client.svg\n  :alt: Contributors\n  :target: https://github.com/scaleapi/scaleapi-python-client/graphs/contributors\n\nInstallation\n____________\n\nInstall with PyPI (pip)\n\n.. code-block:: bash\n\n    $ pip install --upgrade scaleapi\n\nor install with Anaconda (conda)\n\n.. code-block:: bash\n\n    $ conda install -c conda-forge scaleapi\n\nUsage\n_____\n\n.. code-block:: python\n\n    import scaleapi\n\n    client = scaleapi.ScaleClient(\"YOUR_API_KEY_HERE\")\n\nIf you need to use a proxy to connect Scale API, you can feed ``proxies``, ``cert`` and ``verify`` attributes of the python ``requests`` package during the client initialization.\nProxy support is available with SDK version 2.14.0 and beyond.\n\n`Documentation of Proxies usage in requests package`__\n\n__ https://requests.readthedocs.io/en/latest/user/advanced/#proxies\n\n.. code-block:: python\n\n    proxies = { 'https': 'http://10.10.1.10:1080' }\n\n    client = scaleapi.ScaleClient(\n                api_key=\"YOUR_API_KEY_HERE\",\n                proxies=proxies,\n                cert='/path/client.cert',\n                verify=True\n            )\n\nTasks\n_____\n\nMost of these methods will return a `scaleapi.Task` object, which will contain information\nabout the json response (task_id, status, params, response, etc.).\n\nAny parameter available in `Scale's API documentation`__ can be passed as an argument option with the corresponding type.\n\n__ https://docs.scale.com/reference#tasks-object-overview\n\nThe following endpoints for tasks are available:\n\nCreate Task\n^^^^^^^^^^^\n\nThis method can be used for any Scale supported task type using the following format:\n\n.. code-block:: python\n\n    client.create_task(TaskType, ...task parameters...)\n\nPassing in the applicable values into the function definition. The applicable fields and further information for each task type can be found in `Scale's API documentation`__.\n\n__ https://docs.scale.com/reference\n\n.. code-block:: python\n\n    from scaleapi.tasks import TaskType\n    from scaleapi.exceptions import ScaleDuplicateResource\n\n    payload = dict(\n        project = \"test_project\",\n        callback_url = \"http://www.example.com/callback\",\n        instruction = \"Draw a box around each baby cow and big cow.\",\n        attachment_type = \"image\",\n        attachment = \"http://i.imgur.com/v4cBreD.jpg\",\n        unique_id = \"c235d023af73\",\n        geometries = {\n            \"box\": {\n                \"objects_to_annotate\": [\"Baby Cow\", \"Big Cow\"],\n                \"min_height\": 10,\n                \"min_width\": 10,\n            }\n        },\n    )\n\n    try:\n        client.create_task(TaskType.ImageAnnotation, **payload)\n    except ScaleDuplicateResource as err:\n        print(err.message)  # If unique_id is already used for a different task\n\n\nRetrieve a task\n^^^^^^^^^^^^^^^\n\nRetrieve a task given its id. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#retrieve-tasks\n\n.. code-block :: python\n\n    task = client.get_task(\"30553edd0b6a93f8f05f0fee\")\n    print(task.status)  # Task status (\"pending\", \"completed\", \"error\", \"canceled\")\n    print(task.response) # If task is complete\n\n\nTask Attributes\n^^^^^^^^^^^^^^^\n\nThe older ``param_dict`` attribute is now replaced with a method ``as_dict()`` to return a task's all attributes as a dictionary (JSON).\n\n.. code-block :: python\n\n    task.as_dict()\n\n    # {\n    #  'task_id': '30553edd0b6a93f8f05f0fee',\n    #  'created_at': '2021-06-17T21:46:36.359Z',\n    #  'type': 'imageannotation',\n    #  'status': 'pending',\n    #   ....\n    #  'params': {\n    #   'attachment': 'http://i.imgur.com/v4cBreD.jpg',\n    #   'attachment_type': 'image',\n    #   'geometries': {\n    #    'box': {\n    #     'objects_to_annotate': ['Baby Cow', 'Big Cow'],\n    #     'min_height': 10,\n    #     'min_width': 10,\n    #     ...\n    #   },\n    #  'project': 'My Project',\n    #  ...\n    # }\n\nFirst-level attributes of Task are also accessible with ``.`` annotation as the following:\n\n.. code-block :: python\n\n    task.status                   # same as task.as_dict()[\"status\"]\n    task.params[\"geometries\"]     # same as task.as_dict()[\"params\"][\"geometries\"]\n    task.response[\"annotations\"]  # same as task.as_dict()[\"response\"][\"annotations\"]\n\n\nAccessing ``task.params`` child objects directly at task level is **deprecated**. Instead of ``task.attribute``, you should use ``task.params[\"attribute\"]`` for accessing objects under `params`.\n\n.. code-block :: python\n\n    task.params[\"geometries\"]   # task.geometries is DEPRECATED\n    task.params[\"attachment\"]   # task.attachment is DEPRECATED\n\nIf you use the ``limited_response = True`` filter in ``get_tasks()``, you will only receive the following attributes: ``task_id``, ``status``, ``metadata``, ``project`` and ``otherVersion``.\n\nRetrieve List of Tasks\n^^^^^^^^^^^^^^^^^^^^^^\n\nRetrieve a list of `Task` objects, with filters for: ``project_name``, ``batch_name``, ``type``, ``status``,\n``review_status``, ``unique_id``, ``completed_after``, ``completed_before``, ``updated_after``, ``updated_before``,\n``created_after``, ``created_before``, ``tags`` and ``limited_response``.\n\n``get_tasks()`` is a **generator** method and yields ``Task`` objects.\n\n*A generator is another type of function, returns an iterable that you can loop over like a list.\nHowever, unlike lists, generators do not store the content in the memory.\nThat helps you to process a large number of objects without increasing memory usage.*\n\nIf you will iterate through the tasks and process them once, using a generator is the most efficient method.\nHowever, if you need to process the list of tasks multiple times, you can wrap the generator in a ``list(...)``\nstatement, which returns a list of Tasks by loading them into the memory.\n\nCheck out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#list-multiple-tasks\n\n.. code-block :: python\n\n    from scaleapi.tasks import TaskReviewStatus, TaskStatus\n\n    tasks = client.get_tasks(\n        project_name = \"My Project\",\n        created_after = \"2020-09-08\",\n        completed_before = \"2021-04-01\",\n        status = TaskStatus.Completed,\n        review_status = TaskReviewStatus.Accepted\n    )\n\n    # Iterating through the generator\n    for task in tasks:\n        # Download task or do something!\n        print(task.task_id)\n\n    # For retrieving results as a Task list\n    task_list = list(tasks)\n    print(f\"{len(task_list)} tasks retrieved\")\n\nGet Tasks Count\n^^^^^^^^^^^^^^^\n\n``get_tasks_count()`` method returns the number of tasks with the given optional parameters for: ``project_name``, ``batch_name``, ``type``, ``status``,\n``review_status``, ``unique_id``, ``completed_after``, ``completed_before``, ``updated_after``, ``updated_before``,\n``created_after``, ``created_before`` and ``tags``.\n\n.. code-block :: python\n\n    from scaleapi.tasks import TaskReviewStatus, TaskStatus\n\n    task_count = client.get_tasks_count(\n        project_name = \"My Project\",\n        created_after = \"2020-09-08\",\n        completed_before = \"2021-04-01\",\n        status = TaskStatus.Completed,\n        review_status = TaskReviewStatus.Accepted\n    )\n\n    print(task_count)  # 1923\n\n\nCancel Task\n^^^^^^^^^^^\n\nCancel a task given its id if work has not started on the task (task status is ``Queued`` in the UI). Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#cancel-task\n\n.. code-block :: python\n\n    task = client.cancel_task('30553edd0b6a93f8f05f0fee')\n\n    # If you also want to clear 'unique_id' of a task while canceling\n    task = client.cancel_task('30553edd0b6a93f8f05f0fee', clear_unique_id=True)\n\n    # cancel() is also available on task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    task.cancel()\n\n    # If you also want to clear 'unique_id' of a task while canceling\n    task.cancel(clear_unique_id=True)\n\n\nAudit a Task\n^^^^^^^^^^^^\n\nThis method allows you to ``accept`` or ``reject`` completed tasks, along with support for adding comments about the reason for the given audit status, mirroring our Audit UI.\nCheck out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference/audit-a-task\n\n.. code-block :: python\n\n    # Accept a completed task by submitting an audit\n    client.audit_task('30553edd0b6a93f8f05f0fee', True)\n\n    # Reject a completed task by submitting a comment with the audit\n    client.audit_task('30553edd0b6a93f8f05f0fee', False, 'Rejected due to quality')\n\n    # audit() is also available on Task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    task.audit(True)\n\n\nUpdate A Task's Unique Id\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nUpdate a given task's unique_id. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference/update-task-unique-id\n\n.. code-block :: python\n\n    task = client.update_task_unique_id('30553edd0b6a93f8f05f0fee', \"new_unique_id\")\n\n    # update_unique_id() is also available on task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    task.update_unique_id(\"new_unique_id\")\n\n\nClear A Task's Unique Id\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nClear a given task's unique_id. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference/delete-task-unique-id\n\n.. code-block :: python\n\n    task = client.clear_task_unique_id('30553edd0b6a93f8f05f0fee')\n\n    # clear_unique_id() is also available on task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    task.clear_unique_id()\n\n\nSet A Task's Metadata\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSet a given task's ``metadata``. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference/set-metadata\n\n.. code-block :: python\n\n    # set metadata on a task by specifying task id\n    new_metadata = {'myKey': 'myValue'}\n    task = client.set_task_metadata('30553edd0b6a93f8f05f0fee', new_metadata)\n\n    # set metadata on a task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    new_metadata = {'myKey': 'myValue'}\n    task.set_metadata(new_metadata)\n\nSet A Task's Tags\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSet a given task's ``tags``. This will replace all existing tags on a task. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference/setting-tags\n\n.. code-block :: python\n\n    # set a list of tags on a task by specifying task id\n    new_tags = [\"tag1\", \"tag2\", \"tag3\"]\n    task = client.set_task_tags('30553edd0b6a93f8f05f0fee', new_tags)\n\n    # set a list of tags on a task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    new_tags = [\"tag1\", \"tag2\", \"tag3\"]\n    task.set_tags(new_tags)\n\nAdd Tags to A Task\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nAdd ``tags`` to a given task. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference/adding-tags\n\n.. code-block :: python\n\n    # add a list of tags on a task by specifying task id\n    tags_to_add = [\"tag4\", \"tag5\"]\n    task = client.add_task_tags('30553edd0b6a93f8f05f0fee', tags_to_add)\n\n    # add a list of tags on a task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    tags_to_add = [\"tag4\", \"tag5\"]\n    task.add_tags(tags_to_add)\n\nDelete Tags from A Task\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nDelete ``tags`` from a given task. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference/deleting-tags\n\n.. code-block :: python\n\n    # delete a list of tags on a task by specifying task id\n    tags_to_delete = [\"tag1\", \"tag2\"]\n    task = client.delete_task_tags('30553edd0b6a93f8f05f0fee', tags_to_delete)\n\n    # delete a list of tags on a task object\n    task = client.get_task('30553edd0b6a93f8f05f0fee')\n    tags_to_delete = [\"tag1\", \"tag2\"]\n    task.delete_tags(tags_to_delete)\n\nBatches\n_______\n\nCreate Batch\n^^^^^^^^^^^^\n\nCreate a new Batch. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#batch-creation\n\n.. code-block:: python\n\n    batch = client.create_batch(\n        project = \"test_project\",\n        callback = \"http://www.example.com/callback\",\n        batch_name = \"batch_name_01_07_2021\"\n    )\n\n    print(batch.name)  # batch_name_01_07_2021\n\nThrows ``ScaleDuplicateResource`` exception if a batch with the same name already exists.\n\nFinalize Batch\n^^^^^^^^^^^^^^^\n\nFinalize a Batch. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#batch-finalization\n\n.. code-block:: python\n\n    client.finalize_batch(batch_name=\"batch_name_01_07_2021\")\n\n    # Alternative method\n    batch = client.get_batch(batch_name=\"batch_name_01_07_2021\")\n    batch.finalize()\n\nCheck Batch Status\n^^^^^^^^^^^^^^^^^^\n\nGet the status of a Batch. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#batch-status\n\n.. code-block:: python\n\n    client.batch_status(batch_name = \"batch_name_01_07_2021\")\n\n    # Alternative via Batch.get_status()\n    batch = client.get_batch(\"batch_name_01_07_2021\")\n    batch.get_status() # Refreshes tasks_{status} attributes of Batch\n    print(batch.tasks_pending, batch.tasks_completed)\n\nRetrieve A Batch\n^^^^^^^^^^^^^^^^\n\nRetrieve a single Batch. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#batch-retrieval\n\n.. code-block:: python\n\n    batch = client.get_batch(batch_name = \"batch_name_01_07_2021\")\n\nThe older ``param_dict`` attribute is now replaced with a method ``batch.as_dict()`` to return a batch's all attributes as a dictionary (JSON).\n\nList Batches\n^^^^^^^^^^^^\n\nRetrieve a list of Batches. Optional parameters are ``project_name``, ``batch_status``, ``exclude_archived``, ``created_after`` and ``created_before``.\n\n``get_batches()`` is a **generator** method and yields ``Batch`` objects.\n\n*A generator is another type of function, returns an iterable that you can loop over like a list.\nHowever, unlike lists, generators do not store the content in the memory.\nThat helps you to process a large number of objects without increasing memory usage.*\n\nWhen wrapped in a ``list(...)`` statement, it returns a list of Batches by loading them into the memory.\n\nCheck out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#batch-list\n\n.. code-block :: python\n\n    from scaleapi.batches import BatchStatus\n\n    batches = client.get_batches(\n        batch_status=BatchStatus.Completed,\n        created_after = \"2020-09-08\"\n    )\n\n    counter = 0\n    for batch in batches:\n        counter += 1\n        print(f\"Downloading batch {counter} | {batch.name} | {batch.project}\")\n\n    # Alternative for accessing as a Batch list\n    batch_list = list(batches)\n    print(f\"{len(batch_list))} batches retrieved\")\n\nProjects\n________\n\nCreate Project\n^^^^^^^^^^^^^^\n\nCreate a new Project. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#project-creation\n\n.. code-block:: python\n\n    from scaleapi.tasks import TaskType\n\n    project = client.create_project(\n        project_name = \"Test_Project\",\n        task_type = TaskType.ImageAnnotation,\n        params = {\"instruction\": \"Please label the kittens\"},\n    )\n\n    print(project.name)  # Test_Project\n\nSpecify ``rapid=true`` for Rapid projects and ``studio=true`` for Studio projects. Throws ``ScaleDuplicateResource`` exception if a project with the same name already exists.\n\nRetrieve Project\n^^^^^^^^^^^^^^^^\n\nRetrieve a single Project. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#project-retrieval\n\n.. code-block:: python\n\n    project = client.get_project(project_name = \"test_project\")\n\nThe older ``param_dict`` attribute is now replaced with a method ``project.as_dict()`` to return a project's all attributes as a dictionary (JSON).\n\nList Projects\n^^^^^^^^^^^^^\n\nThis function does not take any arguments. Retrieve a list of every Project.\nCheck out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#batch-list\n\n.. code-block :: python\n\n    counter = 0\n    projects = client.projects()\n    for project in projects:\n        counter += 1\n        print(f'Downloading project {counter} | {project.name} | {project.type}')\n\nUpdate Project\n^^^^^^^^^^^^^^\n\nCreates a new version of the Project. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#project-update-parameters\n\n.. code-block :: python\n\n    data = client.update_project(\n        project_name=\"test_project\",\n        patch=False,\n        instruction=\"update: Please label all the stuff\",\n    )\n\nFiles\n________\n\nFiles are a way of uploading local files directly to Scale storage or importing files before creating tasks.\n\n\nUpload Files\n^^^^^^^^^^^^^^\n\nUpload a file. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#file-upload-1\n\n.. code-block:: python\n\n    with open(file_name, 'rb') as f:\n        my_file = client.upload_file(\n            file=f,\n            project_name = \"test_project\",\n        )\n\nThe ``file.attachment_url`` can be used in place of attachments in task payload.\n\n\n.. code-block:: python\n\n    my_file.as_dict()\n\n    # {\n    #  'attachment_url': 'scaledata://606e2a0a46102303a130949/8ac09a90-c143-4154-9a9b-6c35121396d1f',\n    #  'created_at': '2021-06-17T21:56:53.825Z',\n    #  'id': '8ac09d70-ca43-4354-9a4b-6c3591396d1f',\n    #  'mime_type': 'image/png',\n    #  'project_names': ['test_project'],\n    #  'size': 340714,\n    #  'updated_at': '2021-06-17T21:56:53.825Z'\n    # }\n\nImport Files\n^^^^^^^^^^^^^^\n\nImport a file from a URL. Check out `Scale's API documentation`__ for more information.\n\n__ https://docs.scale.com/reference#file-import-1\n\n.. code-block:: python\n\n    my_file = client.import_file(\n        file_url=\"http://i.imgur.com/v4cBreD.jpg\",\n        project_name = \"test_project\",\n    )\n\n\nAfter the files are successfully uploaded to Scale's storage, you can access the URL as ``my_file.attachment_url``, which will have a prefix like ``scaledata://``.\n\nThe attribute can be passed to the task payloads, in the ``attachment`` parameter.\n\n.. code-block:: python\n\n  task_payload = dict(\n      ...\n      ...\n      attachment_type = \"image\",\n      attachment = my_file.attachment_url,  # scaledata://606e2a30949/89a90-c143-4154-9a9b-6c36d1f\n      ...\n      ...\n  )\n\nManage Teammates\n________________\n\nManage the members of your Scale team via API. Check out `Scale Team API Documentation`__ for more information.\n\n__ https://docs.scale.com/reference/teams-overview\n\nList Teammates\n^^^^^^^^^^^^^^\n\nLists all teammates in your Scale team.\nReturns all teammates in a List of Teammate objects.\n\n.. code-block:: python\n\n    teammates = client.list_teammates()\n\nInvite Teammate\n^^^^^^^^^^^^^^^\n\nInvites a list of email strings to your team with the provided role.\nThe available teammate roles are: 'labeler', 'member', or 'manager'.\nReturns all teammates in a List of Teammate objects.\n\n.. code-block:: python\n\n    from scaleapi import TeammateRole\n\n    teammates = client.invite_teammates(['email1@example.com', 'email2@example.com'], TeammateRole.Member)\n\nUpdate Teammate Role\n^^^^^^^^^^^^^^^^^^^^^\n\nUpdates a list of emails of your Scale team members with the new role.\nThe available teammate roles are: 'labeler', 'member', or 'manager'.\nReturns all teammates in a List of Teammate objects.\n\n.. code-block python\n\n    from scaleapi import TeammateRole\n\n    teammates = client.update_teammates_role(['email1@example.com', 'email2@example.com'], TeammateRole.Manager)\n\nExample Scripts\n_______________\n\nA list of examples scripts for use.\n\n* `cancel_batch.py`__ to concurrently cancel tasks in batches\n\n__ https://github.com/scaleapi/scaleapi-python-client/blob/master/examples/cancel_batch.py\n\nEvaluation tasks (For Scale Rapid projects only)\n________________________________________________\n\nEvaluation tasks are tasks that we know the answer to and are used to measure workers' performance internally to ensure the quality\n\nCreate Evaluation Task\n^^^^^^^^^^^^^^^^^^^^^^\n\nCreate an evaluation task.\n\n.. code-block:: python\n\n    client.create_evaluation_task(TaskType, ...task parameters...)\n\nPassing in the applicable values into the function definition. The applicable fields are the same as for create_task. Applicable fields for each task type can be found in `Scale's API documentation`__. Additionally an expected_response is required. An optional initial_response can be provided if it's for a review phase evaluation task.\n\n__ https://docs.scale.com/reference\n\n.. code-block:: python\n\n    from scaleapi.tasks import TaskType\n\n    expected_response = {\n        \"annotations\": {\n            \"answer_reasonable\": {\n                \"type\": \"category\",\n                \"field_id\": \"answer_reasonable\",\n                \"response\": [\n                    [\n                        \"no\"\n                    ]\n                ]\n            }\n        }\n    }\n\n    initial_response = {\n        \"annotations\": {\n            \"answer_reasonable\": {\n                \"type\": \"category\",\n                \"field_id\": \"answer_reasonable\",\n                \"response\": [\n                    [\n                        \"yes\"\n                    ]\n                ]\n            }\n        }\n    }\n\n    attachments = [\n        {\"type\": \"image\", \"content\": \"https://i.imgur.com/bGjrNzl.jpeg\"}\n    ]\n\n    payload = dict(\n        project = \"test_project\",\n        attachments,\n        initial_response=initial_response,\n        expected_response=expected_response,\n    )\n\n    client.create_evaluation_task(TaskType.TextCollection, **payload)\n\nTraining tasks (For Scale Rapid projects only)\n________________________________________________\n\nTraining tasks are used to onboard taskers onto your project\n\nCreate Training Task\n^^^^^^^^^^^^^^^^^^^^^^\n\nCreate a training task.\n\n.. code-block:: python\n\n    client.create_training_task(TaskType, ...task parameters...)\n\nStudio Assignments (For Scale Studio only)\n__________________________________________\n\nManage project assignments for your labelers.\n\nList All Assignments\n^^^^^^^^^^^^^^^^^^^^\n\nLists all your Scale team members and the projects they are assigned to.\nReturns a dictionary of all teammate assignments with keys as 'emails' of each teammate, and values as a list of project names the teammate are assigned to.\n\n.. code-block:: python\n\n    assignments = client.list_studio_assignments()\n    my_assignment = assignments.get('my-email@example.com')\n\nAdd Studio Assignment\n^^^^^^^^^^^^^^^^^^^^^\n\nAssigns provided projects to specified teammate emails.\n\nAccepts a list of emails and a list of projects.\n\nReturns a dictionary of all teammate assignments with keys as 'emails' of each teammate, and values as a list of project names the teammate are assigned to.\n\n.. code-block:: python\n\n    assignments = client.add_studio_assignments(['email1@example.com', 'email2@example.com'], ['project 1', 'project 2'])\n\n\nRemove Studio Assignment\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nRemoves provided projects from specified teammate emails.\n\nAccepts a list of emails and a list of projects.\n\nReturns a dictionary of all teammate assignments with keys as 'emails' of each teammate, and values as a list of project names the teammate are assigned to.\n\n.. code-block:: python\n\n    assignments = client.remove_studio_assignments(['email1@example.com', 'email2@example.com'], ['project 1', 'project 2'])\n\nStudio Project Groups (For Scale Studio Only)\n_____________________________________________\n\nManage groups of labelers in our project by using Studio Project Groups.\n\nList Studio Project Groups\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nReturns all labeler groups for the specified project.\n\n.. code-block:: python\n\n    list_project_group = client.list_project_groups('project_name')\n\nAdd Studio Project Group\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nCreates a project group with the provided group_name for the specified project and adds the provided teammate emails to the new project group. The team members must be assigned to the specified project in order to be added to the new group.\n\nReturns the created StudioProjectGroup object.\n\n.. code-block:: python\n\n    added_project_group = client.create_project_group(\n        'project_name', ['email1@example.com'], 'project_group_name'\n    )\n\nUpdate Studio Project Group\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nAssign or remove teammates from a project group.\n\nReturns the updated StudioProjectGroup object.\n\n.. code-block:: python\n\n    updated_project_group = client.update_project_group(\n        'project_name', 'project_group_name', ['emails_to_add'], ['emails_to_remove']\n    )\n\nStudio Batches (For Scale Studio Only)\n_______________________________________\n\nGet information about your pending Studio batches.\n\nList Studio Batches\n^^^^^^^^^^^^^^^^^^^\n\nReturns a list of StudioBatch objects for all pending Studio batches.\n\n.. code-block:: python\n\n    studio_batches = client.list_studio_batches()\n\nAssign Studio Batches\n^^^^^^^^^^^^^^^^^^^^^^\n\nSets labeler group assignment for the specified batch.\n\nReturns a StudioBatch object for the specified batch.\n\n.. code-block:: python\n\n    assigned_studio_batch = client.assign_studio_batches('batch_name', ['project_group_name'])\n\nSet Studio Batches Priority\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSets the order to prioritize your pending Studio batches. You must include all pending studio batches in the List.\n\nReturns a List of StudioBatch objects in the new order.\n\n.. code-block:: python\n\n    studio_batch_priority = client.set_studio_batches_priorities(\n        ['pending_batch_1', 'pending_batch_2', 'pending_batch_3']\n    )\n\nReset Studio Batches Priority\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nResets the order of your Studio batches to the default order, which prioritizes older batches first.\n\nReturns a List of StudioBatch objects in the new order.\n\n.. code-block:: python\n\n    reset_studio_batch_prioprity = client.reset_studio_batches_priorities()\n\n\nError handling\n______________\n\nIf something went wrong while making API calls, then exceptions will be raised automatically\nas a `ScaleException` parent type and child exceptions:\n\n- ``ScaleInvalidRequest``: 400 - Bad Request -- The request was unacceptable, often due to missing a required parameter.\n- ``ScaleUnauthorized``: 401 - Unauthorized -- No valid API key provided.\n- ``ScaleNotEnabled``: 402 - Not enabled -- Please contact sales@scaleapi.com before creating this type of task.\n- ``ScaleResourceNotFound``: 404 - Not Found -- The requested resource doesn't exist.\n- ``ScaleDuplicateResource``: 409 - Conflict -- Object already exists with same name, idempotency key or unique_id.\n- ``ScaleTooManyRequests``: 429 - Too Many Requests -- Too many requests hit the API too quickly.\n- ``ScaleInternalError``: 500 - Internal Server Error -- We had a problem with our server. Try again later.\n- ``ScaleServiceUnavailable``: 503 - Server Timeout From Request Queueing -- Try again later.\n- ``ScaleTimeoutError``: 504 - Server Timeout Error -- Try again later.\n\nCheck out `Scale's API documentation <https://docs.scale.com/reference#errors>`_ for more details.\n\nFor example:\n\n.. code-block:: python\n\n    from scaleapi.exceptions import ScaleException\n\n    try:\n        client.create_task(TaskType.TextCollection, attachment=\"Some parameters are missing.\")\n    except ScaleException as err:\n        print(err.code)  # 400\n        print(err.message)  # Parameter is invalid, reason: \"attachments\" is required\n\n\n\nTroubleshooting\n_______________\n\nIf you notice any problems, please contact our support via Intercom by logging into your dashboard, or, if you are Enterprise, by contacting your Engagement Manager.\n\n\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "The official Python client library for Scale AI, the Data Platform for AI",
    "version": "2.15.4",
    "project_urls": {
        "Homepage": "https://github.com/scaleapi/scaleapi-python-client"
    },
    "split_keywords": [
        "scale",
        "scaleapi",
        "tasks",
        "categorization",
        "labeling",
        "annotation"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "90c402d3ea1effa07e0c70bcf8bcf64a71bc61892b98772565ff98e043f727fb",
                "md5": "a023b473132eabff19322b97586d2487",
                "sha256": "8c074e80109f933e068008a85c7c53869f45998ddee101e258e7883eec4fcb02"
            },
            "downloads": -1,
            "filename": "scaleapi-2.15.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a023b473132eabff19322b97586d2487",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 28811,
            "upload_time": "2024-02-01T17:49:10",
            "upload_time_iso_8601": "2024-02-01T17:49:10.071476Z",
            "url": "https://files.pythonhosted.org/packages/90/c4/02d3ea1effa07e0c70bcf8bcf64a71bc61892b98772565ff98e043f727fb/scaleapi-2.15.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2848d615913ed07e3ab565f665113bd45b6df5ab8f691c743ec24cddb244cb06",
                "md5": "5f2d7747c947244f6e4b2bc91e96313e",
                "sha256": "3f86a5687f2b01809846384bdebc61591190e60d311ae1bc33aab1294f142ff2"
            },
            "downloads": -1,
            "filename": "scaleapi-2.15.4.tar.gz",
            "has_sig": false,
            "md5_digest": "5f2d7747c947244f6e4b2bc91e96313e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 34018,
            "upload_time": "2024-02-01T17:49:12",
            "upload_time_iso_8601": "2024-02-01T17:49:12.499075Z",
            "url": "https://files.pythonhosted.org/packages/28/48/d615913ed07e3ab565f665113bd45b6df5ab8f691c743ec24cddb244cb06/scaleapi-2.15.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-02-01 17:49:12",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "scaleapi",
    "github_project": "scaleapi-python-client",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "circle": true,
    "tox": true,
    "lcname": "scaleapi"
}
        
Elapsed time: 0.17865s