From 187eec849591168327f86379afcdddec02b88d64 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Fri, 3 Oct 2025 01:26:36 +0000
Subject: [PATCH 01/11] SDK regeneration
---
.mock/definition/__package__.yml | 11 +
.mock/definition/projects.yml | 154 -
.../definition/projects/annotatorWeights.yml | 84 +
.mock/definition/projects/members.yml | 58 +
.../{projectRoles.yml => projects/roles.yml} | 32 +-
.mock/definition/workspaces.yml | 290 --
.mock/definition/workspaces/projects.yml | 304 ++
.mock/openapi/openapi.yaml | 124 +-
reference.md | 3201 +++++++++++------
src/label_studio_sdk/__init__.py | 12 +
src/label_studio_sdk/projects/__init__.py | 4 +-
.../projects/annotator_weights/__init__.py | 2 +
.../projects/annotator_weights/client.py | 288 ++
src/label_studio_sdk/projects/client.py | 8 +
.../projects/members/client.py | 238 +-
.../projects/roles/__init__.py | 2 +
src/label_studio_sdk/projects/roles/client.py | 555 +++
src/label_studio_sdk/types/__init__.py | 12 +
.../types/lse_project_params.py | 23 +
src/label_studio_sdk/types/project.py | 194 +
src/label_studio_sdk/types/project_member.py | 19 +
src/label_studio_sdk/types/project_role.py | 35 +
.../types/project_sampling.py | 7 +
.../types/project_skip_queue.py | 7 +
src/label_studio_sdk/workspaces/__init__.py | 5 +-
src/label_studio_sdk/workspaces/client.py | 4 +
.../workspaces/projects/__init__.py | 5 +
.../workspaces/projects/client.py | 649 ++++
.../workspaces/projects/types/__init__.py | 6 +
.../types/project_request_sampling.py | 7 +
.../types/project_request_skip_queue.py | 7 +
tests/projects/test_annotator_weights.py | 26 +
tests/projects/test_members.py | 23 +
tests/projects/test_roles.py | 55 +
tests/workspaces/test_projects.py | 231 ++
35 files changed, 5146 insertions(+), 1536 deletions(-)
create mode 100644 .mock/definition/projects/annotatorWeights.yml
rename .mock/definition/{projectRoles.yml => projects/roles.yml} (92%)
create mode 100644 .mock/definition/workspaces/projects.yml
create mode 100644 src/label_studio_sdk/projects/annotator_weights/__init__.py
create mode 100644 src/label_studio_sdk/projects/annotator_weights/client.py
create mode 100644 src/label_studio_sdk/projects/roles/__init__.py
create mode 100644 src/label_studio_sdk/projects/roles/client.py
create mode 100644 src/label_studio_sdk/types/lse_project_params.py
create mode 100644 src/label_studio_sdk/types/project.py
create mode 100644 src/label_studio_sdk/types/project_member.py
create mode 100644 src/label_studio_sdk/types/project_role.py
create mode 100644 src/label_studio_sdk/types/project_sampling.py
create mode 100644 src/label_studio_sdk/types/project_skip_queue.py
create mode 100644 src/label_studio_sdk/workspaces/projects/__init__.py
create mode 100644 src/label_studio_sdk/workspaces/projects/client.py
create mode 100644 src/label_studio_sdk/workspaces/projects/types/__init__.py
create mode 100644 src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py
create mode 100644 src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py
create mode 100644 tests/projects/test_annotator_weights.py
create mode 100644 tests/projects/test_roles.py
create mode 100644 tests/workspaces/test_projects.py
diff --git a/.mock/definition/__package__.yml b/.mock/definition/__package__.yml
index a03756650..590d6ae30 100644
--- a/.mock/definition/__package__.yml
+++ b/.mock/definition/__package__.yml
@@ -4091,6 +4091,17 @@ types:
workspace: optional
source:
openapi: openapi/openapi.yaml
+ LseProjectParams:
+ properties:
+ annotator_params: optional
+ use_kappa:
+ type: optional
+ docs: >-
+ If categorical variables are used in labeling (e.g. choices), Cohen's
+ Kappa statistic is computed to measure inter-rater reliability instead
+ of basic agreement
+ source:
+ openapi: openapi/openapi.yaml
LseProjectResponseSampling:
discriminated: false
union:
diff --git a/.mock/definition/projects.yml b/.mock/definition/projects.yml
index c7c8b45f1..3818022eb 100644
--- a/.mock/definition/projects.yml
+++ b/.mock/definition/projects.yml
@@ -1037,138 +1037,6 @@ service:
created: 1
audiences:
- public
- api_projects_members_create:
- path: /api/projects/{id}/members/
- method: POST
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Add a member to a specific project.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Add project member
- request:
- name: ProjectMemberRequest
- body:
- properties:
- user: integer
- content-type: application/json
- response:
- docs: ''
- type: root.ProjectMember
- examples:
- - path-parameters:
- id: 1
- request:
- user: 1
- response:
- body:
- user: 1
- api_projects_members_destroy:
- path: /api/projects/{id}/members/
- method: DELETE
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Remove a member from a specific project.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Remove member from project
- request:
- name: ApiProjectsMembersDestroyRequest
- query-parameters:
- project_member:
- type: optional
- docs: A unique integer value identifying this project member.
- examples:
- - path-parameters:
- id: 1
- api_projects_project_extra_params_retrieve:
- path: /api/projects/{id}/project-extra-params/
- method: GET
- auth: true
- docs: >-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Retrieve the annotator weights for statistics and Cohen's Kappa for a
- specific project.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Get annotator weights
- response:
- docs: Annotator weights retrieved
- type: ApiProjectsProjectExtraParamsRetrieveResponse
- examples:
- - path-parameters:
- id: 1
- response:
- body:
- annotator_params:
- - key: value
- use_kappa: true
- api_projects_project_extra_params_create:
- path: /api/projects/{id}/project-extra-params/
- method: POST
- auth: true
- docs: >-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Create annotator weights to be used in the annotation statistics for a
- project, such as when calculating kappa metrics for inter-annotator
- agreement.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Create annotator weights for statistics
- request:
- name: LseProjectParamsRequest
- body:
- properties:
- annotator_params: optional
- use_kappa:
- type: optional
- docs: >-
- If categorical variables are used in labeling (e.g. choices),
- Cohen's Kappa statistic is computed to measure inter-rater
- reliability instead of basic agreement
- content-type: application/json
- response:
- docs: Annotator weights created/updated
- type: ApiProjectsProjectExtraParamsCreateResponse
- examples:
- - path-parameters:
- id: 1
- request: {}
- response:
- body:
- annotator_params:
- - key: value
- use_kappa: true
api_projects_reimports_retrieve:
path: /api/projects/{id}/reimports/{reimport_pk}/
method: GET
@@ -1394,25 +1262,3 @@ types:
docs: Number of predictions created
source:
openapi: openapi/openapi.yaml
- ApiProjectsProjectExtraParamsRetrieveResponse:
- docs: Create or change annotator weights for statistics
- properties:
- annotator_params:
- type: optional>>
- docs: Dict of users with weights
- use_kappa:
- type: optional
- docs: If project uses Cohen's Kappa in calculation
- source:
- openapi: openapi/openapi.yaml
- ApiProjectsProjectExtraParamsCreateResponse:
- docs: Create or change annotator weights for statistics
- properties:
- annotator_params:
- type: optional>>
- docs: Dict of users with weights
- use_kappa:
- type: optional
- docs: If project uses Cohen's Kappa in calculation
- source:
- openapi: openapi/openapi.yaml
diff --git a/.mock/definition/projects/annotatorWeights.yml b/.mock/definition/projects/annotatorWeights.yml
new file mode 100644
index 000000000..0f702a83c
--- /dev/null
+++ b/.mock/definition/projects/annotatorWeights.yml
@@ -0,0 +1,84 @@
+imports:
+ root: ../__package__.yml
+service:
+ auth: false
+ base-path: ''
+ endpoints:
+ get:
+ path: /api/projects/{id}/project-extra-params/
+ method: GET
+ auth: true
+ docs: >-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Retrieve the annotator weights for statistics and Cohen's Kappa for a
+ specific project.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: Get annotator weights
+ response:
+ docs: Annotator weights retrieved
+ type: root.LseProjectParams
+ examples:
+ - path-parameters:
+ id: 1
+ response:
+ body:
+ annotator_params:
+ key: value
+ use_kappa: true
+ audiences:
+ - public
+ create:
+ path: /api/projects/{id}/project-extra-params/
+ method: POST
+ auth: true
+ docs: >-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Create annotator weights to be used in the annotation statistics for a
+ project, such as when calculating kappa metrics for inter-annotator
+ agreement.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: Create annotator weights for statistics
+ request:
+ name: LseProjectParamsRequest
+ body:
+ properties:
+ annotator_params: optional
+ use_kappa:
+ type: optional
+ docs: >-
+ If categorical variables are used in labeling (e.g. choices),
+ Cohen's Kappa statistic is computed to measure inter-rater
+ reliability instead of basic agreement
+ content-type: application/json
+ response:
+ docs: Annotator weights created/updated
+ type: root.LseProjectParams
+ examples:
+ - path-parameters:
+ id: 1
+ request: {}
+ response:
+ body:
+ annotator_params:
+ key: value
+ use_kappa: true
+ audiences:
+ - public
+ source:
+ openapi: openapi/openapi.yaml
diff --git a/.mock/definition/projects/members.yml b/.mock/definition/projects/members.yml
index a75c582c9..6171fe18a 100644
--- a/.mock/definition/projects/members.yml
+++ b/.mock/definition/projects/members.yml
@@ -78,5 +78,63 @@ service:
username: username
audiences:
- public
+ add:
+ path: /api/projects/{id}/members/
+ method: POST
+ auth: true
+ docs: |-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Add a member to a specific project.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: Add project member
+ request:
+ name: ProjectMemberRequest
+ body:
+ properties:
+ user: integer
+ content-type: application/json
+ response:
+ docs: ''
+ type: root.ProjectMember
+ examples:
+ - path-parameters:
+ id: 1
+ request:
+ user: 1
+ response:
+ body:
+ user: 1
+ audiences:
+ - public
+ remove:
+ path: /api/projects/{id}/members/
+ method: DELETE
+ auth: true
+ docs: |-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Remove a member from a specific project.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: Remove member from project
+ examples:
+ - path-parameters:
+ id: 1
+ audiences:
+ - public
source:
openapi: openapi/openapi.yaml
diff --git a/.mock/definition/projectRoles.yml b/.mock/definition/projects/roles.yml
similarity index 92%
rename from .mock/definition/projectRoles.yml
rename to .mock/definition/projects/roles.yml
index 5a7e176ed..2a29e4bdf 100644
--- a/.mock/definition/projectRoles.yml
+++ b/.mock/definition/projects/roles.yml
@@ -1,10 +1,10 @@
imports:
- root: __package__.yml
+ root: ../__package__.yml
service:
auth: false
base-path: ''
endpoints:
- api_projects_roles_list:
+ list:
path: /api/projects/roles/
method: GET
auth: true
@@ -22,7 +22,7 @@ service:
openapi: openapi/openapi.yaml
display-name: List project roles for current user
request:
- name: ApiProjectsRolesListRequest
+ name: RolesListRequest
query-parameters:
ids: optional
ordering:
@@ -38,7 +38,9 @@ service:
project: 1
role: OW
user: 1
- api_projects_roles_create:
+ audiences:
+ - public
+ add:
path: /api/projects/roles/
method: POST
auth: true
@@ -75,7 +77,7 @@ service:
user: integer
content-type: application/json
response:
- docs: ''
+ docs: Role created
type: root.ProjectRole
examples:
- request:
@@ -88,7 +90,9 @@ service:
project: 1
role: OW
user: 1
- api_projects_roles_destroy:
+ audiences:
+ - public
+ remove:
path: /api/projects/roles/{id}/
method: DELETE
auth: true
@@ -112,7 +116,9 @@ service:
examples:
- path-parameters:
id: 1
- api_projects_roles_retrieve:
+ audiences:
+ - public
+ get:
path: /api/projects/{id}/roles
method: GET
auth: true
@@ -134,15 +140,17 @@ service:
display-name: List project roles
response:
docs: ''
- type: root.ProjectRole
+ type: list
examples:
- path-parameters:
id: 1
response:
body:
- id: 1
- project: 1
- role: OW
- user: 1
+ - id: 1
+ project: 1
+ role: OW
+ user: 1
+ audiences:
+ - public
source:
openapi: openapi/openapi.yaml
diff --git a/.mock/definition/workspaces.yml b/.mock/definition/workspaces.yml
index 2ba101890..df2461243 100644
--- a/.mock/definition/workspaces.yml
+++ b/.mock/definition/workspaces.yml
@@ -222,295 +222,5 @@ service:
title: title
audiences:
- public
- api_workspaces_projects_retrieve:
- path: /api/workspaces/{id}/projects/
- method: GET
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Retrieve a list of all projects in a specific workspace.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: List workspace projects
- response:
- docs: ''
- type: root.Project
- examples:
- - path-parameters:
- id: 1
- response:
- body:
- color: color
- config_has_control_tags: true
- config_suitable_for_bulk_annotation: true
- control_weights:
- key: value
- created_at: '2024-01-15T09:30:00Z'
- created_by:
- avatar: avatar
- email: email
- first_name: first_name
- id: 1
- last_name: last_name
- description: description
- enable_empty_annotation: true
- evaluate_predictions_automatically: true
- expert_instruction: expert_instruction
- finished_task_number: 1
- ground_truth_number: 1
- id: 1
- is_draft: true
- is_published: true
- label_config: label_config
- maximum_annotations: 1
- min_annotations_to_start_training: 1
- model_version: model_version
- num_tasks_with_annotations: 1
- organization: 1
- overlap_cohort_percentage: 1
- parsed_label_config:
- key: value
- pinned_at: '2024-01-15T09:30:00Z'
- queue_done: 1
- queue_total: 1
- reveal_preannotations_interactively: true
- sampling: Sequential sampling
- show_annotation_history: true
- show_collab_predictions: true
- show_ground_truth_first: true
- show_instruction: true
- show_overlap_first: true
- show_skip_button: true
- skip_queue: REQUEUE_FOR_ME
- skipped_annotations_number: 1
- start_training_on_annotation_update: true
- task_data_login: task_data_login
- task_data_password: task_data_password
- task_number: 1
- title: title
- total_annotations_number: 1
- total_predictions_number: 1
- useful_annotation_number: 1
- api_workspaces_projects_create:
- path: /api/workspaces/{id}/projects/
- method: POST
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Create a project in a specific workspace.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Create workspace project
- request:
- name: ProjectRequest
- body:
- properties:
- color:
- type: optional
- validation:
- maxLength: 16
- control_weights: optional
- created_by:
- type: optional
- docs: Project owner
- description:
- type: optional
- docs: Project description
- enable_empty_annotation:
- type: optional
- docs: Allow annotators to submit empty annotations
- evaluate_predictions_automatically:
- type: optional
- docs: Retrieve and display predictions when loading a task
- expert_instruction:
- type: optional
- docs: Labeling instructions in HTML format
- is_draft:
- type: optional
- docs: Whether or not the project is in the middle of being created
- is_published:
- type: optional
- docs: Whether or not the project is published to annotators
- label_config:
- type: optional
- docs: Label config in XML format. See more about it in documentation
- maximum_annotations:
- type: optional
- docs: >-
- Maximum number of annotations for one task. If the number of
- annotations per task is equal or greater to this value, the task
- is completed (is_labeled=True)
- validation:
- min: -2147483648
- max: 2147483647
- min_annotations_to_start_training:
- type: optional
- docs: >-
- Minimum number of completed tasks after which model training is
- started
- validation:
- min: -2147483648
- max: 2147483647
- model_version:
- type: optional
- docs: Machine learning model version
- organization: optional
- overlap_cohort_percentage:
- type: optional
- validation:
- min: -2147483648
- max: 2147483647
- pinned_at:
- type: optional
- docs: Pinned date and time
- reveal_preannotations_interactively:
- type: optional
- docs: Reveal pre-annotations interactively
- sampling: optional
- show_annotation_history:
- type: optional
- docs: Show annotation history to annotator
- show_collab_predictions:
- type: optional
- docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
- show_instruction:
- type: optional
- docs: Show instructions to the annotator before they start
- show_overlap_first: optional
- show_skip_button:
- type: optional
- docs: >-
- Show a skip button in interface and allow annotators to skip the
- task
- skip_queue: optional
- task_data_login:
- type: optional
- docs: 'Task data credentials: login'
- validation:
- maxLength: 256
- task_data_password:
- type: optional
- docs: 'Task data credentials: password'
- validation:
- maxLength: 256
- title:
- type: optional
- docs: Project name. Must be between 3 and 50 characters long.
- validation:
- minLength: 3
- maxLength: 50
- content-type: application/json
- response:
- docs: ''
- type: root.Project
- examples:
- - path-parameters:
- id: 1
- request: {}
- response:
- body:
- color: color
- config_has_control_tags: true
- config_suitable_for_bulk_annotation: true
- control_weights:
- key: value
- created_at: '2024-01-15T09:30:00Z'
- created_by:
- avatar: avatar
- email: email
- first_name: first_name
- id: 1
- last_name: last_name
- description: description
- enable_empty_annotation: true
- evaluate_predictions_automatically: true
- expert_instruction: expert_instruction
- finished_task_number: 1
- ground_truth_number: 1
- id: 1
- is_draft: true
- is_published: true
- label_config: label_config
- maximum_annotations: 1
- min_annotations_to_start_training: 1
- model_version: model_version
- num_tasks_with_annotations: 1
- organization: 1
- overlap_cohort_percentage: 1
- parsed_label_config:
- key: value
- pinned_at: '2024-01-15T09:30:00Z'
- queue_done: 1
- queue_total: 1
- reveal_preannotations_interactively: true
- sampling: Sequential sampling
- show_annotation_history: true
- show_collab_predictions: true
- show_ground_truth_first: true
- show_instruction: true
- show_overlap_first: true
- show_skip_button: true
- skip_queue: REQUEUE_FOR_ME
- skipped_annotations_number: 1
- start_training_on_annotation_update: true
- task_data_login: task_data_login
- task_data_password: task_data_password
- task_number: 1
- title: title
- total_annotations_number: 1
- total_predictions_number: 1
- useful_annotation_number: 1
- api_workspaces_projects_destroy:
- path: /api/workspaces/{id}/projects/
- method: DELETE
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Delete projects from a specific workspace.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Remove workspace projects
- examples:
- - path-parameters:
- id: 1
source:
openapi: openapi/openapi.yaml
-types:
- ProjectRequestSampling:
- discriminated: false
- union:
- - root.SamplingDe5Enum
- - root.NullEnum
- source:
- openapi: openapi/openapi.yaml
- inline: true
- ProjectRequestSkipQueue:
- discriminated: false
- union:
- - root.SkipQueueEnum
- - root.NullEnum
- source:
- openapi: openapi/openapi.yaml
- inline: true
diff --git a/.mock/definition/workspaces/projects.yml b/.mock/definition/workspaces/projects.yml
new file mode 100644
index 000000000..525827387
--- /dev/null
+++ b/.mock/definition/workspaces/projects.yml
@@ -0,0 +1,304 @@
+imports:
+ root: ../__package__.yml
+service:
+ auth: false
+ base-path: ''
+ endpoints:
+ list:
+ path: /api/workspaces/{id}/projects/
+ method: GET
+ auth: true
+ docs: |-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Retrieve a list of all projects in a specific workspace.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: List workspace projects
+ response:
+ docs: ''
+ type: root.Project
+ examples:
+ - path-parameters:
+ id: 1
+ response:
+ body:
+ color: color
+ config_has_control_tags: true
+ config_suitable_for_bulk_annotation: true
+ control_weights:
+ key: value
+ created_at: '2024-01-15T09:30:00Z'
+ created_by:
+ avatar: avatar
+ email: email
+ first_name: first_name
+ id: 1
+ last_name: last_name
+ description: description
+ enable_empty_annotation: true
+ evaluate_predictions_automatically: true
+ expert_instruction: expert_instruction
+ finished_task_number: 1
+ ground_truth_number: 1
+ id: 1
+ is_draft: true
+ is_published: true
+ label_config: label_config
+ maximum_annotations: 1
+ min_annotations_to_start_training: 1
+ model_version: model_version
+ num_tasks_with_annotations: 1
+ organization: 1
+ overlap_cohort_percentage: 1
+ parsed_label_config:
+ key: value
+ pinned_at: '2024-01-15T09:30:00Z'
+ queue_done: 1
+ queue_total: 1
+ reveal_preannotations_interactively: true
+ sampling: Sequential sampling
+ show_annotation_history: true
+ show_collab_predictions: true
+ show_ground_truth_first: true
+ show_instruction: true
+ show_overlap_first: true
+ show_skip_button: true
+ skip_queue: REQUEUE_FOR_ME
+ skipped_annotations_number: 1
+ start_training_on_annotation_update: true
+ task_data_login: task_data_login
+ task_data_password: task_data_password
+ task_number: 1
+ title: title
+ total_annotations_number: 1
+ total_predictions_number: 1
+ useful_annotation_number: 1
+ audiences:
+ - public
+ add:
+ path: /api/workspaces/{id}/projects/
+ method: POST
+ auth: true
+ docs: |-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Create a project in a specific workspace.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: Create workspace project
+ request:
+ name: ProjectRequest
+ body:
+ properties:
+ color:
+ type: optional
+ validation:
+ maxLength: 16
+ control_weights: optional
+ created_by:
+ type: optional
+ docs: Project owner
+ description:
+ type: optional
+ docs: Project description
+ enable_empty_annotation:
+ type: optional
+ docs: Allow annotators to submit empty annotations
+ evaluate_predictions_automatically:
+ type: optional
+ docs: Retrieve and display predictions when loading a task
+ expert_instruction:
+ type: optional
+ docs: Labeling instructions in HTML format
+ is_draft:
+ type: optional
+ docs: Whether or not the project is in the middle of being created
+ is_published:
+ type: optional
+ docs: Whether or not the project is published to annotators
+ label_config:
+ type: optional
+ docs: Label config in XML format. See more about it in documentation
+ maximum_annotations:
+ type: optional
+ docs: >-
+ Maximum number of annotations for one task. If the number of
+ annotations per task is equal or greater to this value, the task
+ is completed (is_labeled=True)
+ validation:
+ min: -2147483648
+ max: 2147483647
+ min_annotations_to_start_training:
+ type: optional
+ docs: >-
+ Minimum number of completed tasks after which model training is
+ started
+ validation:
+ min: -2147483648
+ max: 2147483647
+ model_version:
+ type: optional
+ docs: Machine learning model version
+ organization: optional
+ overlap_cohort_percentage:
+ type: optional
+ validation:
+ min: -2147483648
+ max: 2147483647
+ pinned_at:
+ type: optional
+ docs: Pinned date and time
+ reveal_preannotations_interactively:
+ type: optional
+ docs: Reveal pre-annotations interactively
+ sampling: optional
+ show_annotation_history:
+ type: optional
+ docs: Show annotation history to annotator
+ show_collab_predictions:
+ type: optional
+ docs: If set, the annotator can view model predictions
+ show_ground_truth_first: optional
+ show_instruction:
+ type: optional
+ docs: Show instructions to the annotator before they start
+ show_overlap_first: optional
+ show_skip_button:
+ type: optional
+ docs: >-
+ Show a skip button in interface and allow annotators to skip the
+ task
+ skip_queue: optional
+ task_data_login:
+ type: optional
+ docs: 'Task data credentials: login'
+ validation:
+ maxLength: 256
+ task_data_password:
+ type: optional
+ docs: 'Task data credentials: password'
+ validation:
+ maxLength: 256
+ title:
+ type: optional
+ docs: Project name. Must be between 3 and 50 characters long.
+ validation:
+ minLength: 3
+ maxLength: 50
+ content-type: application/json
+ response:
+ docs: ''
+ type: root.Project
+ examples:
+ - path-parameters:
+ id: 1
+ request: {}
+ response:
+ body:
+ color: color
+ config_has_control_tags: true
+ config_suitable_for_bulk_annotation: true
+ control_weights:
+ key: value
+ created_at: '2024-01-15T09:30:00Z'
+ created_by:
+ avatar: avatar
+ email: email
+ first_name: first_name
+ id: 1
+ last_name: last_name
+ description: description
+ enable_empty_annotation: true
+ evaluate_predictions_automatically: true
+ expert_instruction: expert_instruction
+ finished_task_number: 1
+ ground_truth_number: 1
+ id: 1
+ is_draft: true
+ is_published: true
+ label_config: label_config
+ maximum_annotations: 1
+ min_annotations_to_start_training: 1
+ model_version: model_version
+ num_tasks_with_annotations: 1
+ organization: 1
+ overlap_cohort_percentage: 1
+ parsed_label_config:
+ key: value
+ pinned_at: '2024-01-15T09:30:00Z'
+ queue_done: 1
+ queue_total: 1
+ reveal_preannotations_interactively: true
+ sampling: Sequential sampling
+ show_annotation_history: true
+ show_collab_predictions: true
+ show_ground_truth_first: true
+ show_instruction: true
+ show_overlap_first: true
+ show_skip_button: true
+ skip_queue: REQUEUE_FOR_ME
+ skipped_annotations_number: 1
+ start_training_on_annotation_update: true
+ task_data_login: task_data_login
+ task_data_password: task_data_password
+ task_number: 1
+ title: title
+ total_annotations_number: 1
+ total_predictions_number: 1
+ useful_annotation_number: 1
+ audiences:
+ - public
+ remove:
+ path: /api/workspaces/{id}/projects/
+ method: DELETE
+ auth: true
+ docs: |-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Delete projects from a specific workspace.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: Remove workspace projects
+ examples:
+ - path-parameters:
+ id: 1
+ audiences:
+ - public
+ source:
+ openapi: openapi/openapi.yaml
+types:
+ ProjectRequestSampling:
+ discriminated: false
+ union:
+ - root.SamplingDe5Enum
+ - root.NullEnum
+ source:
+ openapi: openapi/openapi.yaml
+ inline: true
+ ProjectRequestSkipQueue:
+ discriminated: false
+ union:
+ - root.SkipQueueEnum
+ - root.NullEnum
+ source:
+ openapi: openapi/openapi.yaml
+ inline: true
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index 37b8fa51b..2bf1e131a 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -6990,6 +6990,12 @@ paths:
summary: List project roles for current user
tags:
- Project Roles
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - roles
+ x-fern-sdk-method-name: list
post:
description: "\n
\n \n This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)\n
\n \n\n Create project role for user allowing the user the same access level provided by organization role.\n "
operationId: api_projects_roles_create
@@ -7011,12 +7017,18 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/ProjectRole'
- description: ''
+ description: Role created
security:
- Token: []
summary: Create project role for user
tags:
- Project Roles
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - roles
+ x-fern-sdk-method-name: add
/api/projects/roles/{id}/:
delete:
description: "\n
\n \n This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)\n
\n \n\n Remove project role for user allowing the user the same access level provided by organization role.\n "
@@ -7030,12 +7042,18 @@ paths:
type: integer
responses:
'204':
- description: No response body
+ description: Role removed
security:
- Token: []
summary: Remove project role for user
tags:
- Project Roles
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - roles
+ x-fern-sdk-method-name: remove
/api/projects/validate/:
post:
description: Validate an arbitrary labeling configuration.
@@ -8220,19 +8238,20 @@ paths:
required: true
schema:
type: integer
- - description: A unique integer value identifying this project member.
- in: query
- name: project_member
- schema:
- type: integer
responses:
'204':
- description: No response body
+ description: Member removed
security:
- Token: []
summary: Remove member from project
tags:
- Projects
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - members
+ x-fern-sdk-method-name: remove
get:
description: |-
@@ -8314,6 +8333,12 @@ paths:
summary: Add project member
tags:
- Projects
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - members
+ x-fern-sdk-method-name: add
/api/projects/{id}/members/bulk/:
delete:
description: |-
@@ -8710,22 +8735,7 @@ paths:
content:
application/json:
schema:
- description: Create or change annotator weights for statistics
- properties:
- annotator_params:
- description: Dict of users with weights
- items:
- description: '{user_id: weight}'
- title: User_id and weight
- type: object
- title: annotator_params
- type: array
- use_kappa:
- description: If project uses Cohen's Kappa in calculation
- title: use_kappa
- type: boolean
- title: Change annotator weights for statistics
- type: object
+ $ref: '#/components/schemas/LseProjectParams'
description: Annotator weights retrieved
'204':
description: No annotator weights found
@@ -8734,6 +8744,12 @@ paths:
summary: Get annotator weights
tags:
- Projects
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - annotator_weights
+ x-fern-sdk-method-name: get
post:
description: |-
@@ -8766,28 +8782,19 @@ paths:
content:
application/json:
schema:
- description: Create or change annotator weights for statistics
- properties:
- annotator_params:
- description: Dict of users with weights
- items:
- description: '{user_id: weight}'
- title: User_id and weight
- type: object
- title: annotator_params
- type: array
- use_kappa:
- description: If project uses Cohen's Kappa in calculation
- title: use_kappa
- type: boolean
- title: Change annotator weights for statistics
- type: object
+ $ref: '#/components/schemas/LseProjectParams'
description: Annotator weights created/updated
security:
- Token: []
summary: Create annotator weights for statistics
tags:
- Projects
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - annotator_weights
+ x-fern-sdk-method-name: create
/api/projects/{id}/reimports/{reimport_pk}/:
get:
description: Return data related to async project reimport operation
@@ -8833,13 +8840,21 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/ProjectRole'
+ items:
+ $ref: '#/components/schemas/ProjectRole'
+ type: array
description: ''
security:
- Token: []
summary: List project roles
tags:
- Project Roles
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - roles
+ x-fern-sdk-method-name: get
/api/projects/{id}/stats/IAA:
get:
description: |-
@@ -18463,6 +18478,12 @@ paths:
summary: Remove workspace projects
tags:
- Workspaces
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - workspaces
+ - projects
+ x-fern-sdk-method-name: remove
get:
description: |-
@@ -18491,6 +18512,12 @@ paths:
summary: List workspace projects
tags:
- Workspaces
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - workspaces
+ - projects
+ x-fern-sdk-method-name: list
post:
description: |-
@@ -18530,6 +18557,12 @@ paths:
summary: Create workspace project
tags:
- Workspaces
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - workspaces
+ - projects
+ x-fern-sdk-method-name: add
/data/upload/{filename}:
get:
description: Download a specific uploaded file.
@@ -24158,6 +24191,15 @@ components:
workspace:
type: integer
type: object
+ LseProjectParams:
+ properties:
+ annotator_params:
+ description: 'user ID and user weight in score calculation. Format {user_id[int]: weight[Float[0..1]]}'
+ nullable: true
+ use_kappa:
+ description: If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
+ type: boolean
+ type: object
LseProjectParamsRequest:
properties:
annotator_params:
diff --git a/reference.md b/reference.md
index 2ed437ed9..4b64ef18d 100644
--- a/reference.md
+++ b/reference.md
@@ -29989,8 +29989,8 @@ client.organizations.permissions.update(
-## Projects Exports
-client.projects.exports.list_formats(...)
+## Projects Roles
+client.projects.roles.list(...)
-
@@ -30002,7 +30002,15 @@ client.organizations.permissions.update(
-
-Retrieve the available export formats for the current project by ID.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ List project roles for requested IDs for the current user
+
@@ -30022,9 +30030,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.exports.list_formats(
- id=1,
-)
+client.projects.roles.list()
```
@@ -30040,7 +30046,15 @@ client.projects.exports.list_formats(
-
-**id:** `int` — A unique integer value identifying this project.
+**ids:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
@@ -30060,7 +30074,7 @@ client.projects.exports.list_formats(
-client.projects.exports.list(...)
+client.projects.roles.add(...)
-
@@ -30072,7 +30086,15 @@ client.projects.exports.list_formats(
-
-Returns a list of exported files for a specific project by ID.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ Create project role for user allowing the user the same access level provided by organization role.
+
@@ -30092,8 +30114,10 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.exports.list(
- id=1,
+client.projects.roles.add(
+ project=1,
+ role="OW",
+ user=1,
)
```
@@ -30110,7 +30134,7 @@ client.projects.exports.list(
-
-**id:** `int` — A unique integer value identifying this project.
+**project:** `int`
@@ -30118,7 +30142,25 @@ client.projects.exports.list(
-
-**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
+**role:** `Role9E7Enum`
+
+User role in project
+
+* `OW` - Owner
+* `AD` - Administrator
+* `MA` - Manager
+* `RE` - Reviewer
+* `AN` - Annotator
+* `DI` - Deactivated
+* `NO` - Not Activated
+
+
+
+
+
+-
+
+**user:** `int`
@@ -30138,7 +30180,7 @@ client.projects.exports.list(
-client.projects.exports.create(...)
+client.projects.roles.remove(...)
-
@@ -30150,7 +30192,15 @@ client.projects.exports.list(
-
-Create a new export request to start a background task and generate an export file for a specific project by ID.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ Remove project role for user allowing the user the same access level provided by organization role.
+
@@ -30170,7 +30220,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.exports.create(
+client.projects.roles.remove(
id=1,
)
@@ -30188,7 +30238,7 @@ client.projects.exports.create(
-
-**id:** `int` — A unique integer value identifying this project.
+**id:** `int` — A unique integer value identifying this project role.
@@ -30196,79 +30246,78 @@ client.projects.exports.create(
-
-**annotation_filter_options:** `typing.Optional[LseAnnotationFilterOptionsRequest]`
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
--
-
-**converted_formats:** `typing.Optional[typing.Sequence[ConvertedFormatRequest]]`
-
-
--
-**counters:** `typing.Optional[typing.Optional[typing.Any]]`
-
+
+client.projects.roles.get(...)
-
-**created_by:** `typing.Optional[UserSimpleRequest]`
-
-
-
+#### 📝 Description
-
-**finished_at:** `typing.Optional[dt.datetime]` — Complete or fail time
-
-
-
-
-
-**md5:** `typing.Optional[str]`
-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ List users and their project level roles for a given project.
+ If user is not listed here and is a member of the project then they would behave as assigned role in organization.
+
+
+
+#### 🔌 Usage
+
-
-**serialization_options:** `typing.Optional[SerializationOptionsRequest]`
-
-
-
-
-
-**status:** `typing.Optional[Status7BfEnum]`
-
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.projects.roles.get(
+ id=1,
+)
+
+```
+
+
+
+#### ⚙️ Parameters
-
-**task_filter_options:** `typing.Optional[LseTaskFilterOptionsRequest]`
-
-
-
-
-
-**title:** `typing.Optional[str]`
+**id:** `int`
@@ -30288,7 +30337,8 @@ client.projects.exports.create(
-client.projects.exports.get(...)
+## Projects Exports
+client.projects.exports.list_formats(...)
-
@@ -30300,7 +30350,7 @@ client.projects.exports.create(
-
-Retrieve information about an export file by export ID for a specific project.
+Retrieve the available export formats for the current project by ID.
@@ -30320,8 +30370,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.exports.get(
- export_pk=1,
+client.projects.exports.list_formats(
id=1,
)
@@ -30339,14 +30388,6 @@ client.projects.exports.get(
-
-**export_pk:** `int` — Primary key identifying the export file.
-
-
-
-
-
--
-
**id:** `int` — A unique integer value identifying this project.
@@ -30367,7 +30408,7 @@ client.projects.exports.get(
-client.projects.exports.delete(...)
+client.projects.exports.list(...)
-
@@ -30379,7 +30420,7 @@ client.projects.exports.get(
-
-Delete an export file by specified export ID.
+Returns a list of exported files for a specific project by ID.
@@ -30399,8 +30440,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.exports.delete(
- export_pk=1,
+client.projects.exports.list(
id=1,
)
@@ -30418,7 +30458,7 @@ client.projects.exports.delete(
-
-**export_pk:** `int` — Primary key identifying the export file.
+**id:** `int` — A unique integer value identifying this project.
@@ -30426,7 +30466,7 @@ client.projects.exports.delete(
-
-**id:** `int` — A unique integer value identifying this project.
+**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
@@ -30446,7 +30486,7 @@ client.projects.exports.delete(
-client.projects.exports.convert(...)
+client.projects.exports.create(...)
-
@@ -30458,7 +30498,7 @@ client.projects.exports.delete(
-
-Convert export snapshot to selected format
+Create a new export request to start a background task and generate an export file for a specific project by ID.
@@ -30478,10 +30518,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.exports.convert(
- export_pk=1,
+client.projects.exports.create(
id=1,
- export_type="export_type",
)
```
@@ -30498,7 +30536,7 @@ client.projects.exports.convert(
-
-**export_pk:** `int` — Primary key identifying the export file.
+**id:** `int` — A unique integer value identifying this project.
@@ -30506,7 +30544,7 @@ client.projects.exports.convert(
-
-**id:** `int` — A unique integer value identifying this project.
+**annotation_filter_options:** `typing.Optional[LseAnnotationFilterOptionsRequest]`
@@ -30514,7 +30552,7 @@ client.projects.exports.convert(
-
-**export_type:** `str` — Export file format.
+**converted_formats:** `typing.Optional[typing.Sequence[ConvertedFormatRequest]]`
@@ -30522,7 +30560,7 @@ client.projects.exports.convert(
-
-**download_resources:** `typing.Optional[bool]` — Download resources in converter.
+**counters:** `typing.Optional[typing.Optional[typing.Any]]`
@@ -30530,76 +30568,47 @@ client.projects.exports.convert(
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**created_by:** `typing.Optional[UserSimpleRequest]`
-
-
+
+-
+**finished_at:** `typing.Optional[dt.datetime]` — Complete or fail time
+
-
-## Projects Members
-client.projects.members.get(...)
-
-#### 📝 Description
-
-
--
+**md5:** `typing.Optional[str]`
+
+
+
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated).
-
-
+**serialization_options:** `typing.Optional[SerializationOptionsRequest]`
+
-#### 🔌 Usage
-
-
--
-
-
-```python
-from label_studio_sdk import LabelStudio
-
-client = LabelStudio(
- api_key="YOUR_API_KEY",
-)
-client.projects.members.get(
- id=1,
-)
-
-```
-
-
+**status:** `typing.Optional[Status7BfEnum]`
+
-#### ⚙️ Parameters
-
-
--
-
-
-**id:** `int`
+**task_filter_options:** `typing.Optional[LseTaskFilterOptionsRequest]`
@@ -30607,7 +30616,7 @@ client.projects.members.get(
-
-**user_ids:** `typing.Optional[str]` — Comma-separated list of user IDs to include. Example: user_ids=1,2,3
+**title:** `typing.Optional[str]`
@@ -30627,8 +30636,7 @@ client.projects.members.get(
-## Projects Metrics
-client.projects.metrics.get(...)
+client.projects.exports.get(...)
-
@@ -30640,13 +30648,7 @@ client.projects.members.get(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Get the current metrics configuration for a project.
+Retrieve information about an export file by export ID for a specific project.
@@ -30666,7 +30668,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.metrics.get(
+client.projects.exports.get(
+ export_pk=1,
id=1,
)
@@ -30684,7 +30687,7 @@ client.projects.metrics.get(
-
-**id:** `int`
+**export_pk:** `int` — Primary key identifying the export file.
@@ -30692,11 +30695,19 @@ client.projects.metrics.get(
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**id:** `int` — A unique integer value identifying this project.
-
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
@@ -30704,7 +30715,7 @@ client.projects.metrics.get(
-client.projects.metrics.update(...)
+client.projects.exports.delete(...)
-
@@ -30716,13 +30727,7 @@ client.projects.metrics.get(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Update metrics strategy and parameters for a project.
+Delete an export file by specified export ID.
@@ -30742,7 +30747,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.metrics.update(
+client.projects.exports.delete(
+ export_pk=1,
id=1,
)
@@ -30760,31 +30766,7 @@ client.projects.metrics.update(
-
-**id:** `int`
-
-
-
-
-
--
-
-**additional_params:** `typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]`
-
-
-
-
-
--
-
-**agreement_threshold:** `typing.Optional[int]`
-
-
-
-
-
--
-
-**max_additional_annotators_assignable:** `typing.Optional[int]`
+**export_pk:** `int` — Primary key identifying the export file.
@@ -30792,7 +30774,7 @@ client.projects.metrics.update(
-
-**metric_name:** `typing.Optional[str]`
+**id:** `int` — A unique integer value identifying this project.
@@ -30812,8 +30794,7 @@ client.projects.metrics.update(
-## Projects Stats
-client.projects.stats.iaa(...)
+client.projects.exports.convert(...)
-
@@ -30825,13 +30806,7 @@ client.projects.metrics.update(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Get Inter-Annotator Agreement (IAA) matrix for a project, showing agreement between all annotators.
+Convert export snapshot to selected format
@@ -30851,8 +30826,10 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.iaa(
+client.projects.exports.convert(
+ export_pk=1,
id=1,
+ export_type="export_type",
)
```
@@ -30869,15 +30846,7 @@ client.projects.stats.iaa(
-
-**id:** `int`
-
-
-
-
-
--
-
-**expand:** `typing.Optional[str]` — Comma-separated list of fields to expand
+**export_pk:** `int` — Primary key identifying the export file.
@@ -30885,7 +30854,7 @@ client.projects.stats.iaa(
-
-**per_label:** `typing.Optional[bool]` — Calculate IAA per label
+**id:** `int` — A unique integer value identifying this project.
@@ -30893,7 +30862,7 @@ client.projects.stats.iaa(
-
-**std:** `typing.Optional[bool]` — Include standard deviation in results
+**export_type:** `str` — Export file format.
@@ -30901,7 +30870,7 @@ client.projects.stats.iaa(
-
-**task:** `typing.Optional[str]` — Comma-separated list of task IDs to filter by
+**download_resources:** `typing.Optional[bool]` — Download resources in converter.
@@ -30921,7 +30890,8 @@ client.projects.stats.iaa(
-client.projects.stats.agreement_annotator(...)
+## Projects Members
+client.projects.members.get(...)
-
@@ -30939,7 +30909,7 @@ client.projects.stats.iaa(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get agreement statistics for a specific annotator within a project.
+Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated).
@@ -30959,9 +30929,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.agreement_annotator(
+client.projects.members.get(
id=1,
- user_id=1,
)
```
@@ -30986,7 +30955,7 @@ client.projects.stats.agreement_annotator(
-
-**user_id:** `int`
+**user_ids:** `typing.Optional[str]` — Comma-separated list of user IDs to include. Example: user_ids=1,2,3
@@ -31006,7 +30975,7 @@ client.projects.stats.agreement_annotator(
-client.projects.stats.data_filters(...)
+client.projects.members.add(...)
-
@@ -31018,7 +30987,13 @@ client.projects.stats.agreement_annotator(
-
-Get statistics about user data filters and their usage within a project.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Add a member to a specific project.
@@ -31038,8 +31013,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.data_filters(
+client.projects.members.add(
id=1,
+ user=1,
)
```
@@ -31064,6 +31040,14 @@ client.projects.stats.data_filters(
-
+**user:** `int`
+
+
+
+
+
+-
+
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -31076,7 +31060,7 @@ client.projects.stats.data_filters(
-client.projects.stats.finished_tasks(...)
+client.projects.members.remove(...)
-
@@ -31088,7 +31072,13 @@ client.projects.stats.data_filters(
-
-Get statistics about finished tasks for a project.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Remove a member from a specific project.
@@ -31108,7 +31098,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.finished_tasks(
+client.projects.members.remove(
id=1,
)
@@ -31134,14 +31124,6 @@ client.projects.stats.finished_tasks(
-
-**user_pk:** `typing.Optional[int]` — User ID to filter statistics by (optional)
-
-
-
-
-
--
-
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -31154,7 +31136,8 @@ client.projects.stats.finished_tasks(
-client.projects.stats.lead_time(...)
+## Projects Metrics
+client.projects.metrics.get(...)
-
@@ -31166,7 +31149,13 @@ client.projects.stats.finished_tasks(
-
-Get lead time statistics across the project, including average annotation time.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Get the current metrics configuration for a project.
@@ -31186,7 +31175,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.lead_time(
+client.projects.metrics.get(
id=1,
)
@@ -31224,7 +31213,7 @@ client.projects.stats.lead_time(
-client.projects.stats.total_agreement(...)
+client.projects.metrics.update(...)
-
@@ -31242,9 +31231,7 @@ client.projects.stats.lead_time(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Overall or per-label total agreement across the project.
-
-NOTE: due to an open issue in Fern, SDK clients will raise ApiError upon handling a 204 response. As a workaround, wrap call to this function in a try-except block.
+Update metrics strategy and parameters for a project.
@@ -31264,7 +31251,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.total_agreement(
+client.projects.metrics.update(
id=1,
)
@@ -31290,7 +31277,31 @@ client.projects.stats.total_agreement(
-
-**per_label:** `typing.Optional[bool]` — Return agreement per label
+**additional_params:** `typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]`
+
+
+
+
+
+-
+
+**agreement_threshold:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**max_additional_annotators_assignable:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**metric_name:** `typing.Optional[str]`
@@ -31310,7 +31321,8 @@ client.projects.stats.total_agreement(
-client.projects.stats.update_stats(...)
+## Projects AnnotatorWeights
+client.projects.annotator_weights.get(...)
-
@@ -31322,7 +31334,13 @@ client.projects.stats.total_agreement(
-
-Start stats recalculation for given project
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
@@ -31342,7 +31360,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.update_stats(
+client.projects.annotator_weights.get(
id=1,
)
@@ -31368,14 +31386,6 @@ client.projects.stats.update_stats(
-
-**stat_type:** `typing.Optional[str]` — Stat type to recalculate. Possible values: label, stats
-
-
-
-
-
--
-
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -31388,7 +31398,7 @@ client.projects.stats.update_stats(
-client.projects.stats.user_prediction_agreement(...)
+client.projects.annotator_weights.create(...)
-
@@ -31406,7 +31416,7 @@ client.projects.stats.update_stats(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get prediction agreement statistics for a specific user within a project.
+Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
@@ -31426,9 +31436,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.user_prediction_agreement(
+client.projects.annotator_weights.create(
id=1,
- user_pk=1,
)
```
@@ -31453,7 +31462,7 @@ client.projects.stats.user_prediction_agreement(
-
-**user_pk:** `int`
+**annotator_params:** `typing.Optional[typing.Optional[typing.Any]]`
@@ -31461,7 +31470,7 @@ client.projects.stats.user_prediction_agreement(
-
-**per_label:** `typing.Optional[bool]` — Calculate agreement per label
+**use_kappa:** `typing.Optional[bool]` — If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
@@ -31481,7 +31490,8 @@ client.projects.stats.user_prediction_agreement(
-client.projects.stats.user_review_score(...)
+## Projects Stats
+client.projects.stats.iaa(...)
-
@@ -31499,7 +31509,7 @@ client.projects.stats.user_prediction_agreement(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get review score statistics for a specific user within a project.
+Get Inter-Annotator Agreement (IAA) matrix for a project, showing agreement between all annotators.
@@ -31519,9 +31529,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.user_review_score(
+client.projects.stats.iaa(
id=1,
- user_pk=1,
)
```
@@ -31546,7 +31555,7 @@ client.projects.stats.user_review_score(
-
-**user_pk:** `int`
+**expand:** `typing.Optional[str]` — Comma-separated list of fields to expand
@@ -31554,7 +31563,23 @@ client.projects.stats.user_review_score(
-
-**per_label:** `typing.Optional[bool]` — Calculate agreement per label
+**per_label:** `typing.Optional[bool]` — Calculate IAA per label
+
+
+
+
+
+-
+
+**std:** `typing.Optional[bool]` — Include standard deviation in results
+
+
+
+
+
+-
+
+**task:** `typing.Optional[str]` — Comma-separated list of task IDs to filter by
@@ -31574,7 +31599,7 @@ client.projects.stats.user_review_score(
-client.projects.stats.user_ground_truth_agreement(...)
+client.projects.stats.agreement_annotator(...)
-
@@ -31592,7 +31617,7 @@ client.projects.stats.user_review_score(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get ground truth agreement statistics for a specific user within a project.
+Get agreement statistics for a specific annotator within a project.
@@ -31612,9 +31637,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.stats.user_ground_truth_agreement(
+client.projects.stats.agreement_annotator(
id=1,
- user_pk=1,
+ user_id=1,
)
```
@@ -31639,15 +31664,7 @@ client.projects.stats.user_ground_truth_agreement(
-
-**user_pk:** `int`
-
-
-
-
-
--
-
-**per_label:** `typing.Optional[bool]` — Calculate agreement per label
+**user_id:** `int`
@@ -31667,8 +31684,7 @@ client.projects.stats.user_ground_truth_agreement(
-## Projects Assignments
-client.projects.assignments.bulk_assign(...)
+client.projects.stats.data_filters(...)
-
@@ -31680,13 +31696,7 @@ client.projects.stats.user_ground_truth_agreement(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Assign multiple users to a collection of tasks within a specific project.
+Get statistics about user data filters and their usage within a project.
@@ -31702,20 +31712,12 @@ Assign multiple users to a collection of tasks within a specific project.
```python
from label_studio_sdk import LabelStudio
-from label_studio_sdk.projects.assignments import (
- AssignmentsBulkAssignRequestSelectedItemsIncluded,
-)
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.assignments.bulk_assign(
+client.projects.stats.data_filters(
id=1,
- selected_items=AssignmentsBulkAssignRequestSelectedItemsIncluded(
- all_=True,
- ),
- type="AN",
- users=[1],
)
```
@@ -31740,38 +31742,6 @@ client.projects.assignments.bulk_assign(
-
-**selected_items:** `AssignmentsBulkAssignRequestSelectedItems` — Task selection by IDs. If filters are applied, the selection will be applied to the filtered tasks.If "all" is `false`, `"included"` must be used. If "all" is `true`, `"excluded"` must be used.
Examples: `{"all": false, "included": [1, 2, 3]}` or `{"all": true, "excluded": [4, 5]}`
-
-
-
-
-
--
-
-**type:** `AssignmentsBulkAssignRequestType` — Assignment type. Use AN for annotate or RE for review.
-
-
-
-
-
--
-
-**users:** `typing.Sequence[int]` — List of user IDs to assign
-
-
-
-
-
--
-
-**filters:** `typing.Optional[AssignmentsBulkAssignRequestFilters]` — Filters to apply on tasks. You can use [the helper class `Filters` from this page](https://labelstud.io/sdk/data_manager.html) to create Data Manager Filters.
Example: `{"conjunction": "or", "items": [{"filter": "filter:tasks:completed_at", "operator": "greater", "type": "Datetime", "value": "2021-01-01T00:00:00.000Z"}]}`
-
-
-
-
-
--
-
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -31784,7 +31754,7 @@ client.projects.assignments.bulk_assign(
-client.projects.assignments.list(...)
+client.projects.stats.finished_tasks(...)
-
@@ -31796,13 +31766,7 @@ client.projects.assignments.bulk_assign(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Retrieve a list of tasks and assignees for those tasks for a specific project.
+Get statistics about finished tasks for a project.
@@ -31822,9 +31786,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.assignments.list(
+client.projects.stats.finished_tasks(
id=1,
- task_pk=1,
)
```
@@ -31841,7 +31804,7 @@ client.projects.assignments.list(
-
-**id:** `int` — A unique integer value identifying this project.
+**id:** `int`
@@ -31849,7 +31812,7 @@ client.projects.assignments.list(
-
-**task_pk:** `int` — A unique integer value identifying this task.
+**user_pk:** `typing.Optional[int]` — User ID to filter statistics by (optional)
@@ -31869,7 +31832,7 @@ client.projects.assignments.list(
-client.projects.assignments.assign(...)
+client.projects.stats.lead_time(...)
-
@@ -31881,13 +31844,7 @@ client.projects.assignments.list(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Assign a user to a task in a specific project.
+Get lead time statistics across the project, including average annotation time.
@@ -31907,11 +31864,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.assignments.assign(
+client.projects.stats.lead_time(
id=1,
- task_pk=1,
- type="AN",
- users=[1],
)
```
@@ -31928,31 +31882,7 @@ client.projects.assignments.assign(
-
-**id:** `int` — A unique integer value identifying this project.
-
-
-
-
-
--
-
-**task_pk:** `int` — A unique integer value identifying this task.
-
-
-
-
-
--
-
-**type:** `AssignmentsAssignRequestType` — Assignment type. Use AN for annotate or RE for review.
-
-
-
-
-
--
-
-**users:** `typing.Sequence[int]` — List of user IDs to assign
+**id:** `int`
@@ -31972,7 +31902,7 @@ client.projects.assignments.assign(
-client.projects.assignments.delete(...)
+client.projects.stats.total_agreement(...)
-
@@ -31990,7 +31920,9 @@ client.projects.assignments.assign(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Remove assignees for a task within a specific project.
+Overall or per-label total agreement across the project.
+
+NOTE: due to an open issue in Fern, SDK clients will raise ApiError upon handling a 204 response. As a workaround, wrap call to this function in a try-except block.
@@ -32010,9 +31942,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.assignments.delete(
+client.projects.stats.total_agreement(
id=1,
- task_pk=1,
)
```
@@ -32029,23 +31960,7 @@ client.projects.assignments.delete(
-
-**id:** `int` — A unique integer value identifying this project.
-
-
-
-
-
--
-
-**task_pk:** `int` — A unique integer value identifying this task.
-
-
-
-
-
--
-
-**type:** `typing.Optional[AssignmentsDeleteRequestType]` — Assignment type to delete (optional). If omitted, deletes all assignments for the task.
+**id:** `int`
@@ -32053,7 +31968,7 @@ client.projects.assignments.delete(
-
-**users:** `typing.Optional[str]` — Comma separated list of user IDs to delete, as a string. If omitted, deletes all assignees for the given type.
+**per_label:** `typing.Optional[bool]` — Return agreement per label
@@ -32073,7 +31988,7 @@ client.projects.assignments.delete(
-client.projects.assignments.update(...)
+client.projects.stats.update_stats(...)
-
@@ -32085,13 +32000,7 @@ client.projects.assignments.delete(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Update the assignee for a task in a specific project.
+Start stats recalculation for given project
@@ -32111,11 +32020,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.assignments.update(
+client.projects.stats.update_stats(
id=1,
- task_pk=1,
- type="AN",
- users=[1],
)
```
@@ -32132,23 +32038,7 @@ client.projects.assignments.update(
-
-**id:** `int` — A unique integer value identifying this project.
-
-
-
-
-
--
-
-**task_pk:** `int` — A unique integer value identifying this task.
-
-
-
-
-
--
-
-**type:** `AssignmentsUpdateRequestType` — Assignment type. Use AN for annotate or RE for review.
+**id:** `int`
@@ -32156,7 +32046,7 @@ client.projects.assignments.update(
-
-**users:** `typing.Sequence[int]` — List of user IDs to assign
+**stat_type:** `typing.Optional[str]` — Stat type to recalculate. Possible values: label, stats
@@ -32176,8 +32066,7 @@ client.projects.assignments.update(
-## Projects Pauses
-client.projects.pauses.list(...)
+client.projects.stats.user_prediction_agreement(...)
-
@@ -32195,7 +32084,7 @@ client.projects.assignments.update(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Retrieve a list of all pauses.
+Get prediction agreement statistics for a specific user within a project.
@@ -32215,8 +32104,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.pauses.list(
- project_pk=1,
+client.projects.stats.user_prediction_agreement(
+ id=1,
user_pk=1,
)
@@ -32234,7 +32123,7 @@ client.projects.pauses.list(
-
-**project_pk:** `int`
+**id:** `int`
@@ -32250,15 +32139,7 @@ client.projects.pauses.list(
-
-**include_deleted:** `typing.Optional[bool]` — Include deleted pauses.
-
-
-
-
-
--
-
-**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
+**per_label:** `typing.Optional[bool]` — Calculate agreement per label
@@ -32278,7 +32159,7 @@ client.projects.pauses.list(
-client.projects.pauses.create(...)
+client.projects.stats.user_review_score(...)
-
@@ -32296,7 +32177,7 @@ client.projects.pauses.list(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Create a new pause entry.
+Get review score statistics for a specific user within a project.
@@ -32316,10 +32197,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.pauses.create(
- project_pk=1,
+client.projects.stats.user_review_score(
+ id=1,
user_pk=1,
- reason="MANUAL",
)
```
@@ -32336,7 +32216,7 @@ client.projects.pauses.create(
-
-**project_pk:** `int`
+**id:** `int`
@@ -32352,23 +32232,7 @@ client.projects.pauses.create(
-
-**reason:** `ReasonEnum`
-
-Reason for pausing
-
-* `MANUAL` - Manual
-* `BEHAVIOR_BASED` - Behavior-based
-* `ANNOTATOR_EVALUATION` - Annotator evaluation
-* `ANNOTATION_LIMIT` - Annotation limit
-* `CUSTOM_SCRIPT` - Custom script
-
-
-
-
-
--
-
-**verbose_reason:** `typing.Optional[str]` — Detailed description of why the project is paused, will be readable by paused annotators
+**per_label:** `typing.Optional[bool]` — Calculate agreement per label
@@ -32388,7 +32252,7 @@ Reason for pausing
-client.projects.pauses.get(...)
+client.projects.stats.user_ground_truth_agreement(...)
-
@@ -32406,7 +32270,7 @@ Reason for pausing
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Retrieve a specific pause by ID.
+Get ground truth agreement statistics for a specific user within a project.
@@ -32426,9 +32290,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.pauses.get(
- id="id",
- project_pk=1,
+client.projects.stats.user_ground_truth_agreement(
+ id=1,
user_pk=1,
)
@@ -32446,7 +32309,7 @@ client.projects.pauses.get(
-
-**id:** `str`
+**id:** `int`
@@ -32454,7 +32317,7 @@ client.projects.pauses.get(
-
-**project_pk:** `int`
+**user_pk:** `int`
@@ -32462,7 +32325,7 @@ client.projects.pauses.get(
-
-**user_pk:** `int`
+**per_label:** `typing.Optional[bool]` — Calculate agreement per label
@@ -32482,7 +32345,8 @@ client.projects.pauses.get(
-client.projects.pauses.delete(...)
+## Projects Assignments
+client.projects.assignments.bulk_assign(...)
-
@@ -32500,7 +32364,7 @@ client.projects.pauses.get(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Delete a specific pause by ID.
+Assign multiple users to a collection of tasks within a specific project.
@@ -32516,14 +32380,20 @@ Delete a specific pause by ID.
```python
from label_studio_sdk import LabelStudio
+from label_studio_sdk.projects.assignments import (
+ AssignmentsBulkAssignRequestSelectedItemsIncluded,
+)
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.pauses.delete(
- id="id",
- project_pk=1,
- user_pk=1,
+client.projects.assignments.bulk_assign(
+ id=1,
+ selected_items=AssignmentsBulkAssignRequestSelectedItemsIncluded(
+ all_=True,
+ ),
+ type="AN",
+ users=[1],
)
```
@@ -32540,7 +32410,7 @@ client.projects.pauses.delete(
-
-**id:** `str`
+**id:** `int`
@@ -32548,7 +32418,7 @@ client.projects.pauses.delete(
-
-**project_pk:** `int`
+**selected_items:** `AssignmentsBulkAssignRequestSelectedItems` — Task selection by IDs. If filters are applied, the selection will be applied to the filtered tasks.If "all" is `false`, `"included"` must be used. If "all" is `true`, `"excluded"` must be used.
Examples: `{"all": false, "included": [1, 2, 3]}` or `{"all": true, "excluded": [4, 5]}`
@@ -32556,7 +32426,7 @@ client.projects.pauses.delete(
-
-**user_pk:** `int`
+**type:** `AssignmentsBulkAssignRequestType` — Assignment type. Use AN for annotate or RE for review.
@@ -32564,19 +32434,35 @@ client.projects.pauses.delete(
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**users:** `typing.Sequence[int]` — List of user IDs to assign
-
-
+
+
+-
+
+**filters:** `typing.Optional[AssignmentsBulkAssignRequestFilters]` — Filters to apply on tasks. You can use [the helper class `Filters` from this page](https://labelstud.io/sdk/data_manager.html) to create Data Manager Filters.
Example: `{"conjunction": "or", "items": [{"filter": "filter:tasks:completed_at", "operator": "greater", "type": "Datetime", "value": "2021-01-01T00:00:00.000Z"}]}`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
-client.projects.pauses.update(...)
+client.projects.assignments.list(...)
-
@@ -32594,7 +32480,7 @@ client.projects.pauses.delete(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Partially update a pause entry by ID.
+Retrieve a list of tasks and assignees for those tasks for a specific project.
@@ -32614,10 +32500,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.pauses.update(
- id="id",
- project_pk=1,
- user_pk=1,
+client.projects.assignments.list(
+ id=1,
+ task_pk=1,
)
```
@@ -32634,39 +32519,7 @@ client.projects.pauses.update(
-
-**id:** `str`
-
-
-
-
-
--
-
-**project_pk:** `int`
-
-
-
-
-
--
-
-**user_pk:** `int`
-
-
-
-
-
--
-
-**reason:** `typing.Optional[ReasonEnum]`
-
-Reason for pausing
-
-* `MANUAL` - Manual
-* `BEHAVIOR_BASED` - Behavior-based
-* `ANNOTATOR_EVALUATION` - Annotator evaluation
-* `ANNOTATION_LIMIT` - Annotation limit
-* `CUSTOM_SCRIPT` - Custom script
+**id:** `int` — A unique integer value identifying this project.
@@ -32674,7 +32527,7 @@ Reason for pausing
-
-**verbose_reason:** `typing.Optional[str]` — Detailed description of why the project is paused, will be readable by paused annotators
+**task_pk:** `int` — A unique integer value identifying this task.
@@ -32694,8 +32547,7 @@ Reason for pausing
-## Projects Members Bulk
-client.projects.members.bulk.post(...)
+client.projects.assignments.assign(...)
-
@@ -32713,7 +32565,7 @@ Reason for pausing
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Assign project members in bulk.
+Assign a user to a task in a specific project.
@@ -32733,9 +32585,11 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.members.bulk.post(
+client.projects.assignments.assign(
id=1,
- all_=True,
+ task_pk=1,
+ type="AN",
+ users=[1],
)
```
@@ -32752,23 +32606,7 @@ client.projects.members.bulk.post(
-
-**id:** `int`
-
-
-
-
-
--
-
-**all_:** `bool`
-
-
-
-
-
--
-
-**search:** `typing.Optional[str]` — Search term for filtering members by name, email, or username. Only when all=True.
+**id:** `int` — A unique integer value identifying this project.
@@ -32776,7 +32614,7 @@ client.projects.members.bulk.post(
-
-**excluded:** `typing.Optional[typing.Sequence[int]]`
+**task_pk:** `int` — A unique integer value identifying this task.
@@ -32784,7 +32622,7 @@ client.projects.members.bulk.post(
-
-**included:** `typing.Optional[typing.Sequence[int]]`
+**type:** `AssignmentsAssignRequestType` — Assignment type. Use AN for annotate or RE for review.
@@ -32792,7 +32630,7 @@ client.projects.members.bulk.post(
-
-**roles:** `typing.Optional[typing.Sequence[ProjectMemberBulkAssignRolesRequest]]`
+**users:** `typing.Sequence[int]` — List of user IDs to assign
@@ -32812,7 +32650,7 @@ client.projects.members.bulk.post(
-client.projects.members.bulk.delete(...)
+client.projects.assignments.delete(...)
-
@@ -32830,7 +32668,7 @@ client.projects.members.bulk.post(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Unassign project members in bulk. Allows the same request body as bulk assign.
+Remove assignees for a task within a specific project.
@@ -32850,8 +32688,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.members.bulk.delete(
+client.projects.assignments.delete(
id=1,
+ task_pk=1,
)
```
@@ -32868,7 +32707,7 @@ client.projects.members.bulk.delete(
-
-**id:** `int`
+**id:** `int` — A unique integer value identifying this project.
@@ -32876,7 +32715,23 @@ client.projects.members.bulk.delete(
-
-**search:** `typing.Optional[str]` — Search term for filtering members by name, email, or username. Only when all=True.
+**task_pk:** `int` — A unique integer value identifying this task.
+
+
+
+
+
+-
+
+**type:** `typing.Optional[AssignmentsDeleteRequestType]` — Assignment type to delete (optional). If omitted, deletes all assignments for the task.
+
+
+
+
+
+-
+
+**users:** `typing.Optional[str]` — Comma separated list of user IDs to delete, as a string. If omitted, deletes all assignees for the given type.
@@ -32896,8 +32751,7 @@ client.projects.members.bulk.delete(
-## Projects Members Paginated
-client.projects.members.paginated.list(...)
+client.projects.assignments.update(...)
-
@@ -32915,7 +32769,7 @@ client.projects.members.bulk.delete(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Retrieve the members for a specific project.
+Update the assignee for a task in a specific project.
@@ -32935,14 +32789,12 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-response = client.projects.members.paginated.list(
+client.projects.assignments.update(
id=1,
+ task_pk=1,
+ type="AN",
+ users=[1],
)
-for item in response:
- yield item
-# alternatively, you can paginate page-by-page
-for page in response.iter_pages():
- yield page
```
@@ -32958,39 +32810,7 @@ for page in response.iter_pages():
-
-**id:** `int`
-
-
-
-
-
--
-
-**ids:** `typing.Optional[str]` — Comma-separated list of user IDs to filter by
-
-
-
-
-
--
-
-**implicit:** `typing.Optional[bool]` — Include/Exclude implicit project members in the results. If not provided, explicit + implicit members are returned.
-
-
-
-
-
--
-
-**no_annotators:** `typing.Optional[bool]` — Exclude annotators from the results
-
-
-
-
-
--
-
-**page:** `typing.Optional[int]` — A page number within the paginated result set.
+**id:** `int` — A unique integer value identifying this project.
@@ -32998,7 +32818,7 @@ for page in response.iter_pages():
-
-**page_size:** `typing.Optional[int]` — Number of results to return per page.
+**task_pk:** `int` — A unique integer value identifying this task.
@@ -33006,7 +32826,7 @@ for page in response.iter_pages():
-
-**search:** `typing.Optional[str]` — Search term for filtering members by name, email, or username
+**type:** `AssignmentsUpdateRequestType` — Assignment type. Use AN for annotate or RE for review.
@@ -33014,7 +32834,7 @@ for page in response.iter_pages():
-
-**with_deleted:** `typing.Optional[bool]` — Include deleted members in the results
+**users:** `typing.Sequence[int]` — List of user IDs to assign
@@ -33034,8 +32854,8 @@ for page in response.iter_pages():
-## Projects Metrics Custom
-client.projects.metrics.custom.get_lambda(...)
+## Projects Pauses
+client.projects.pauses.list(...)
-
@@ -33047,7 +32867,13 @@ for page in response.iter_pages():
-
-Get the AWS Lambda code for the custom metric configured for this project.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Retrieve a list of all pauses.
@@ -33067,8 +32893,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.metrics.custom.get_lambda(
- id=1,
+client.projects.pauses.list(
+ project_pk=1,
+ user_pk=1,
)
```
@@ -33085,7 +32912,31 @@ client.projects.metrics.custom.get_lambda(
-
-**id:** `int`
+**project_pk:** `int`
+
+
+
+
+
+-
+
+**user_pk:** `int`
+
+
+
+
+
+-
+
+**include_deleted:** `typing.Optional[bool]` — Include deleted pauses.
+
+
+
+
+
+-
+
+**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
@@ -33105,7 +32956,7 @@ client.projects.metrics.custom.get_lambda(
-client.projects.metrics.custom.update_lambda(...)
+client.projects.pauses.create(...)
-
@@ -33117,7 +32968,13 @@ client.projects.metrics.custom.get_lambda(
-
-Create or update the AWS Lambda function used for custom metrics in this project.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Create a new pause entry.
@@ -33137,9 +32994,10 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.metrics.custom.update_lambda(
- id=1,
- code="code",
+client.projects.pauses.create(
+ project_pk=1,
+ user_pk=1,
+ reason="MANUAL",
)
```
@@ -33156,7 +33014,7 @@ client.projects.metrics.custom.update_lambda(
-
-**id:** `int`
+**project_pk:** `int`
@@ -33164,7 +33022,7 @@ client.projects.metrics.custom.update_lambda(
-
-**code:** `str`
+**user_pk:** `int`
@@ -33172,7 +33030,15 @@ client.projects.metrics.custom.update_lambda(
-
-**region:** `typing.Optional[str]`
+**reason:** `ReasonEnum`
+
+Reason for pausing
+
+* `MANUAL` - Manual
+* `BEHAVIOR_BASED` - Behavior-based
+* `ANNOTATOR_EVALUATION` - Annotator evaluation
+* `ANNOTATION_LIMIT` - Annotation limit
+* `CUSTOM_SCRIPT` - Custom script
@@ -33180,7 +33046,7 @@ client.projects.metrics.custom.update_lambda(
-
-**role:** `typing.Optional[str]`
+**verbose_reason:** `typing.Optional[str]` — Detailed description of why the project is paused, will be readable by paused annotators
@@ -33200,7 +33066,7 @@ client.projects.metrics.custom.update_lambda(
-client.projects.metrics.custom.logs(...)
+client.projects.pauses.get(...)
-
@@ -33212,7 +33078,13 @@ client.projects.metrics.custom.update_lambda(
-
-Get AWS lambda logs for project, including filtering by start and end dates
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Retrieve a specific pause by ID.
@@ -33232,8 +33104,10 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.metrics.custom.logs(
- id=1,
+client.projects.pauses.get(
+ id="id",
+ project_pk=1,
+ user_pk=1,
)
```
@@ -33250,15 +33124,7 @@ client.projects.metrics.custom.logs(
-
-**id:** `int`
-
-
-
-
-
--
-
-**end_date:** `typing.Optional[str]` — End date for AWS logs filtering in format %Y-%m-%d
+**id:** `str`
@@ -33266,7 +33132,7 @@ client.projects.metrics.custom.logs(
-
-**limit:** `typing.Optional[int]` — Limit the number of logs to return
+**project_pk:** `int`
@@ -33274,7 +33140,7 @@ client.projects.metrics.custom.logs(
-
-**start_date:** `typing.Optional[str]` — Start date for AWS logs filtering in format %Y-%m-%d
+**user_pk:** `int`
@@ -33294,7 +33160,7 @@ client.projects.metrics.custom.logs(
-client.projects.metrics.custom.check_function(...)
+client.projects.pauses.delete(...)
-
@@ -33306,7 +33172,13 @@ client.projects.metrics.custom.logs(
-
-Validate custom matching function code for the project.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Delete a specific pause by ID.
@@ -33326,9 +33198,10 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.metrics.custom.check_function(
- id=1,
- code="code",
+client.projects.pauses.delete(
+ id="id",
+ project_pk=1,
+ user_pk=1,
)
```
@@ -33345,7 +33218,7 @@ client.projects.metrics.custom.check_function(
-
-**id:** `int`
+**id:** `str`
@@ -33353,7 +33226,15 @@ client.projects.metrics.custom.check_function(
-
-**code:** `str`
+**project_pk:** `int`
+
+
+
+
+
+-
+
+**user_pk:** `int`
@@ -33373,8 +33254,7 @@ client.projects.metrics.custom.check_function(
-## Prompts Indicators
-client.prompts.indicators.list(...)
+client.projects.pauses.update(...)
-
@@ -33392,7 +33272,7 @@ client.projects.metrics.custom.check_function(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get key indicators for the Prompt dashboard.
+Partially update a pause entry by ID.
@@ -33412,8 +33292,10 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.indicators.list(
- id=1,
+client.projects.pauses.update(
+ id="id",
+ project_pk=1,
+ user_pk=1,
)
```
@@ -33430,7 +33312,47 @@ client.prompts.indicators.list(
-
-**id:** `int`
+**id:** `str`
+
+
+
+
+
+-
+
+**project_pk:** `int`
+
+
+
+
+
+-
+
+**user_pk:** `int`
+
+
+
+
+
+-
+
+**reason:** `typing.Optional[ReasonEnum]`
+
+Reason for pausing
+
+* `MANUAL` - Manual
+* `BEHAVIOR_BASED` - Behavior-based
+* `ANNOTATOR_EVALUATION` - Annotator evaluation
+* `ANNOTATION_LIMIT` - Annotation limit
+* `CUSTOM_SCRIPT` - Custom script
+
+
+
+
+
+-
+
+**verbose_reason:** `typing.Optional[str]` — Detailed description of why the project is paused, will be readable by paused annotators
@@ -33450,7 +33372,8 @@ client.prompts.indicators.list(
-client.prompts.indicators.get(...)
+## Projects Members Bulk
+client.projects.members.bulk.post(...)
-
@@ -33468,7 +33391,7 @@ client.prompts.indicators.list(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get a specific key indicator for the Prompt dashboard.
+Assign project members in bulk.
@@ -33488,9 +33411,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.indicators.get(
+client.projects.members.bulk.post(
id=1,
- indicator_key="indicator_key",
+ all_=True,
)
```
@@ -33515,7 +33438,7 @@ client.prompts.indicators.get(
-
-**indicator_key:** `str`
+**all_:** `bool`
@@ -33523,76 +33446,31 @@ client.prompts.indicators.get(
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**search:** `typing.Optional[str]` — Search term for filtering members by name, email, or username. Only when all=True.
-
-
-
-
-
-
-
-
-## Prompts Versions
-client.prompts.versions.get_default_version_name(...)
-
--
-
-#### 📝 Description
-
-
--
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Get default prompt version name
-
-
+**excluded:** `typing.Optional[typing.Sequence[int]]`
+
-#### 🔌 Usage
-
-
--
-
-
-```python
-from label_studio_sdk import LabelStudio
-
-client = LabelStudio(
- api_key="YOUR_API_KEY",
-)
-client.prompts.versions.get_default_version_name(
- id=1,
-)
-
-```
-
-
+**included:** `typing.Optional[typing.Sequence[int]]`
+
-#### ⚙️ Parameters
-
-
--
-
-
-**id:** `int`
+**roles:** `typing.Optional[typing.Sequence[ProjectMemberBulkAssignRolesRequest]]`
@@ -33612,7 +33490,7 @@ client.prompts.versions.get_default_version_name(
-client.prompts.versions.list(...)
+client.projects.members.bulk.delete(...)
-
@@ -33630,7 +33508,7 @@ client.prompts.versions.get_default_version_name(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-List all versions of a prompt.
+Unassign project members in bulk. Allows the same request body as bulk assign.
@@ -33650,8 +33528,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.list(
- prompt_id=1,
+client.projects.members.bulk.delete(
+ id=1,
)
```
@@ -33668,7 +33546,7 @@ client.prompts.versions.list(
-
-**prompt_id:** `int`
+**id:** `int`
@@ -33676,7 +33554,7 @@ client.prompts.versions.list(
-
-**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
+**search:** `typing.Optional[str]` — Search term for filtering members by name, email, or username. Only when all=True.
@@ -33696,7 +33574,8 @@ client.prompts.versions.list(
-client.prompts.versions.create(...)
+## Projects Members Paginated
+client.projects.members.paginated.list(...)
-
@@ -33714,7 +33593,7 @@ client.prompts.versions.list(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Create a new version of a prompt.
+Retrieve the members for a specific project.
@@ -33734,12 +33613,14 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.create(
- prompt_id=1,
- prompt="prompt",
- provider_model_id="provider_model_id",
- title="title",
+response = client.projects.members.paginated.list(
+ id=1,
)
+for item in response:
+ yield item
+# alternatively, you can paginate page-by-page
+for page in response.iter_pages():
+ yield page
```
@@ -33755,7 +33636,7 @@ client.prompts.versions.create(
-
-**prompt_id:** `int`
+**id:** `int`
@@ -33763,7 +33644,7 @@ client.prompts.versions.create(
-
-**prompt:** `str` — Prompt to execute
+**ids:** `typing.Optional[str]` — Comma-separated list of user IDs to filter by
@@ -33771,7 +33652,7 @@ client.prompts.versions.create(
-
-**provider_model_id:** `str` — The model ID to use within the given provider, e.g. gpt-3.5
+**implicit:** `typing.Optional[bool]` — Include/Exclude implicit project members in the results. If not provided, explicit + implicit members are returned.
@@ -33779,7 +33660,7 @@ client.prompts.versions.create(
-
-**title:** `str` — Model name
+**no_annotators:** `typing.Optional[bool]` — Exclude annotators from the results
@@ -33787,7 +33668,7 @@ client.prompts.versions.create(
-
-**model_provider_connection:** `typing.Optional[int]`
+**page:** `typing.Optional[int]` — A page number within the paginated result set.
@@ -33795,7 +33676,7 @@ client.prompts.versions.create(
-
-**organization:** `typing.Optional[int]`
+**page_size:** `typing.Optional[int]` — Number of results to return per page.
@@ -33803,7 +33684,7 @@ client.prompts.versions.create(
-
-**parent_model:** `typing.Optional[int]` — Parent model interface ID
+**search:** `typing.Optional[str]` — Search term for filtering members by name, email, or username
@@ -33811,17 +33692,7 @@ client.prompts.versions.create(
-
-**provider:** `typing.Optional[ProviderEnum]`
-
-The model provider to use e.g. OpenAI
-
-* `OpenAI` - OpenAI
-* `AzureOpenAI` - AzureOpenAI
-* `AzureAIFoundry` - AzureAIFoundry
-* `VertexAI` - VertexAI
-* `Gemini` - Gemini
-* `Anthropic` - Anthropic
-* `Custom` - Custom
+**with_deleted:** `typing.Optional[bool]` — Include deleted members in the results
@@ -33841,7 +33712,8 @@ The model provider to use e.g. OpenAI
-client.prompts.versions.get(...)
+## Projects Metrics Custom
+client.projects.metrics.custom.get_lambda(...)
-
@@ -33853,13 +33725,7 @@ The model provider to use e.g. OpenAI
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Retrieve a specific prompt of a model.
+Get the AWS Lambda code for the custom metric configured for this project.
@@ -33879,9 +33745,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.get(
- prompt_id=1,
- version_id=1,
+client.projects.metrics.custom.get_lambda(
+ id=1,
)
```
@@ -33898,7 +33763,7 @@ client.prompts.versions.get(
-
-**prompt_id:** `int`
+**id:** `int`
@@ -33906,15 +33771,7 @@ client.prompts.versions.get(
-
-**version_id:** `int`
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -33926,7 +33783,7 @@ client.prompts.versions.get(
-client.prompts.versions.delete(...)
+client.projects.metrics.custom.update_lambda(...)
-
@@ -33938,13 +33795,7 @@ client.prompts.versions.get(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Delete a prompt version by ID
+Create or update the AWS Lambda function used for custom metrics in this project.
@@ -33964,9 +33815,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.delete(
- prompt_id=1,
- version_id=1,
+client.projects.metrics.custom.update_lambda(
+ id=1,
+ code="code",
)
```
@@ -33983,7 +33834,7 @@ client.prompts.versions.delete(
-
-**prompt_id:** `int`
+**id:** `int`
@@ -33991,7 +33842,23 @@ client.prompts.versions.delete(
-
-**version_id:** `int`
+**code:** `str`
+
+
+
+
+
+-
+
+**region:** `typing.Optional[str]`
+
+
+
+
+
+-
+
+**role:** `typing.Optional[str]`
@@ -34011,7 +33878,7 @@ client.prompts.versions.delete(
-client.prompts.versions.update(...)
+client.projects.metrics.custom.logs(...)
-
@@ -34023,13 +33890,7 @@ client.prompts.versions.delete(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Update a specific prompt version by ID.
+Get AWS lambda logs for project, including filtering by start and end dates
@@ -34049,9 +33910,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.update(
- prompt_id=1,
- version_id=1,
+client.projects.metrics.custom.logs(
+ id=1,
)
```
@@ -34068,7 +33928,7 @@ client.prompts.versions.update(
-
-**prompt_id:** `int`
+**id:** `int`
@@ -34076,7 +33936,7 @@ client.prompts.versions.update(
-
-**version_id:** `int`
+**end_date:** `typing.Optional[str]` — End date for AWS logs filtering in format %Y-%m-%d
@@ -34084,7 +33944,7 @@ client.prompts.versions.update(
-
-**model_provider_connection:** `typing.Optional[int]`
+**limit:** `typing.Optional[int]` — Limit the number of logs to return
@@ -34092,7 +33952,7 @@ client.prompts.versions.update(
-
-**organization:** `typing.Optional[int]`
+**start_date:** `typing.Optional[str]` — Start date for AWS logs filtering in format %Y-%m-%d
@@ -34100,41 +33960,70 @@ client.prompts.versions.update(
-
-**parent_model:** `typing.Optional[int]` — Parent model interface ID
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+client.projects.metrics.custom.check_function(...)
-
-**prompt:** `typing.Optional[str]` — Prompt to execute
-
+#### 📝 Description
+
+
+-
+
+
+-
+
+Validate custom matching function code for the project.
+
+
+#### 🔌 Usage
+
-
-**provider:** `typing.Optional[ProviderEnum]`
+
+-
-The model provider to use e.g. OpenAI
+```python
+from label_studio_sdk import LabelStudio
-* `OpenAI` - OpenAI
-* `AzureOpenAI` - AzureOpenAI
-* `AzureAIFoundry` - AzureAIFoundry
-* `VertexAI` - VertexAI
-* `Gemini` - Gemini
-* `Anthropic` - Anthropic
-* `Custom` - Custom
-
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.projects.metrics.custom.check_function(
+ id=1,
+ code="code",
+)
+
+```
+
+
+#### ⚙️ Parameters
+
-
-**provider_model_id:** `typing.Optional[str]` — The model ID to use within the given provider, e.g. gpt-3.5
+
+-
+
+**id:** `int`
@@ -34142,7 +34031,7 @@ The model provider to use e.g. OpenAI
-
-**title:** `typing.Optional[str]` — Model name
+**code:** `str`
@@ -34162,7 +34051,8 @@ The model provider to use e.g. OpenAI
-client.prompts.versions.cost_estimate(...)
+## Prompts Indicators
+client.prompts.indicators.list(...)
-
@@ -34180,7 +34070,7 @@ The model provider to use e.g. OpenAI
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get an estimate of the cost for making an inference run on the selected Prompt Version and Project/ProjectSubset
+Get key indicators for the Prompt dashboard.
@@ -34200,9 +34090,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.cost_estimate(
- prompt_id=1,
- version_id=1,
+client.prompts.indicators.list(
+ id=1,
)
```
@@ -34219,15 +34108,7 @@ client.prompts.versions.cost_estimate(
-
-**prompt_id:** `int`
-
-
-
-
-
--
-
-**version_id:** `int`
+**id:** `int`
@@ -34247,7 +34128,7 @@ client.prompts.versions.cost_estimate(
-client.prompts.versions.get_refined_prompt(...)
+client.prompts.indicators.get(...)
-
@@ -34259,7 +34140,13 @@ client.prompts.versions.cost_estimate(
-
-Get the refined prompt based on the `refinement_job_id`.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Get a specific key indicator for the Prompt dashboard.
@@ -34279,9 +34166,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.get_refined_prompt(
- prompt_id=1,
- version_id=1,
+client.prompts.indicators.get(
+ id=1,
+ indicator_key="indicator_key",
)
```
@@ -34298,15 +34185,7 @@ client.prompts.versions.get_refined_prompt(
-
-**prompt_id:** `int`
-
-
-
-
-
--
-
-**version_id:** `int`
+**id:** `int`
@@ -34314,7 +34193,7 @@ client.prompts.versions.get_refined_prompt(
-
-**refinement_job_id:** `typing.Optional[str]` — Refinement Job ID acquired from the `POST /api/prompts/{prompt_id}/versions/{version_id}/refine` endpoint
+**indicator_key:** `str`
@@ -34334,7 +34213,8 @@ client.prompts.versions.get_refined_prompt(
-client.prompts.versions.refine_prompt(...)
+## Prompts Versions
+client.prompts.versions.get_default_version_name(...)
-
@@ -34346,7 +34226,13 @@ client.prompts.versions.get_refined_prompt(
-
-Refine a prompt version using a teacher model and save the refined prompt as a new version.
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Get default prompt version name
@@ -34366,12 +34252,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.versions.refine_prompt(
- prompt_id=1,
- version_id=1,
- project_id=1,
- teacher_model_name="teacher_model_name",
- teacher_model_provider_connection_id=1,
+client.prompts.versions.get_default_version_name(
+ id=1,
)
```
@@ -34388,47 +34270,7 @@ client.prompts.versions.refine_prompt(
-
-**prompt_id:** `int`
-
-
-
-
-
--
-
-**version_id:** `int`
-
-
-
-
-
--
-
-**project_id:** `int` — Project ID to target the refined prompt for
-
-
-
-
-
--
-
-**teacher_model_name:** `str` — Name of the model to use to refine the prompt
-
-
-
-
-
--
-
-**teacher_model_provider_connection_id:** `int` — Model Provider Connection ID to use to refine the prompt
-
-
-
-
-
--
-
-**async_:** `typing.Optional[bool]` — Whether to run the refinement asynchronously
+**id:** `int`
@@ -34448,8 +34290,7 @@ client.prompts.versions.refine_prompt(
-## Prompts Runs
-client.prompts.runs.list(...)
+client.prompts.versions.list(...)
-
@@ -34467,7 +34308,7 @@ client.prompts.versions.refine_prompt(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Get information (status, metadata, etc) about an existing inference run
+List all versions of a prompt.
@@ -34487,9 +34328,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.runs.list(
+client.prompts.versions.list(
prompt_id=1,
- version_id=1,
)
```
@@ -34514,7 +34354,7 @@ client.prompts.runs.list(
-
-**version_id:** `int`
+**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
@@ -34522,51 +34362,19 @@ client.prompts.runs.list(
-
-**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
-
--
-**parent_model:** `typing.Optional[int]` — The ID of the parent model for this Inference Run
-
+
-
--
-
-**project:** `typing.Optional[int]` — The ID of the project this Inference Run makes predictions on
-
-
-
-
-
--
-
-**project_subset:** `typing.Optional[RunsListRequestProjectSubset]` — Defines which tasks are operated on (e.g. HasGT will only operate on tasks with a ground truth annotation, but All will operate on all records)
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
-
-
-
-
-client.prompts.runs.create(...)
+client.prompts.versions.create(...)
-
@@ -34584,7 +34392,7 @@ client.prompts.runs.list(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Run a prompt inference.
+Create a new version of a prompt.
@@ -34604,10 +34412,11 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.runs.create(
+client.prompts.versions.create(
prompt_id=1,
- version_id=1,
- project=1,
+ prompt="prompt",
+ provider_model_id="provider_model_id",
+ title="title",
)
```
@@ -34632,15 +34441,7 @@ client.prompts.runs.create(
-
-**version_id:** `int`
-
-
-
-
-
--
-
-**project:** `int`
+**prompt:** `str` — Prompt to execute
@@ -34648,7 +34449,7 @@ client.prompts.runs.create(
-
-**job_id:** `typing.Optional[str]` — Job ID for inference job for a ModelRun e.g. Adala job ID
+**provider_model_id:** `str` — The model ID to use within the given provider, e.g. gpt-3.5
@@ -34656,7 +34457,7 @@ client.prompts.runs.create(
-
-**organization:** `typing.Optional[int]`
+**title:** `str` — Model name
@@ -34664,7 +34465,7 @@ client.prompts.runs.create(
-
-**predictions_updated_at:** `typing.Optional[dt.datetime]`
+**model_provider_connection:** `typing.Optional[int]`
@@ -34672,7 +34473,7 @@ client.prompts.runs.create(
-
-**project_subset:** `typing.Optional[ProjectSubsetEnum]`
+**organization:** `typing.Optional[int]`
@@ -34680,7 +34481,7 @@ client.prompts.runs.create(
-
-**total_correct_predictions:** `typing.Optional[int]`
+**parent_model:** `typing.Optional[int]` — Parent model interface ID
@@ -34688,15 +34489,17 @@ client.prompts.runs.create(
-
-**total_predictions:** `typing.Optional[int]`
-
-
-
+**provider:** `typing.Optional[ProviderEnum]`
-
--
+The model provider to use e.g. OpenAI
-**total_tasks:** `typing.Optional[int]`
+* `OpenAI` - OpenAI
+* `AzureOpenAI` - AzureOpenAI
+* `AzureAIFoundry` - AzureAIFoundry
+* `VertexAI` - VertexAI
+* `Gemini` - Gemini
+* `Anthropic` - Anthropic
+* `Custom` - Custom
@@ -34716,7 +34519,7 @@ client.prompts.runs.create(
-client.prompts.runs.cancel(...)
+client.prompts.versions.get(...)
-
@@ -34734,7 +34537,7 @@ client.prompts.runs.create(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Cancel the inference run for the given api
+Retrieve a specific prompt of a model.
@@ -34754,8 +34557,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.prompts.runs.cancel(
- inference_run_id=1,
+client.prompts.versions.get(
prompt_id=1,
version_id=1,
)
@@ -34774,14 +34576,6 @@ client.prompts.runs.cancel(
-
-**inference_run_id:** `int`
-
-
-
-
-
--
-
**prompt_id:** `int`
@@ -34810,8 +34604,7 @@ client.prompts.runs.cancel(
-## Sso Saml
-client.sso.saml.get()
+client.prompts.versions.delete(...)
-
@@ -34829,7 +34622,7 @@ client.prompts.runs.cancel(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Retrieve SAML2 settings for the currently active organization.
+Delete a prompt version by ID
@@ -34849,7 +34642,10 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.sso.saml.get()
+client.prompts.versions.delete(
+ prompt_id=1,
+ version_id=1,
+)
```
@@ -34865,6 +34661,22 @@ client.sso.saml.get()
-
+**prompt_id:** `int`
+
+
+
+
+
+-
+
+**version_id:** `int`
+
+
+
+
+
+-
+
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -34877,7 +34689,7 @@ client.sso.saml.get()
-client.sso.saml.update(...)
+client.prompts.versions.update(...)
-
@@ -34895,7 +34707,7 @@ client.sso.saml.get()
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Update SAML2 settings for the currently active organization.
+Update a specific prompt version by ID.
@@ -34910,21 +34722,14 @@ Update SAML2 settings for the currently active organization.
```python
-from label_studio_sdk import LabelStudio, ProjectGroupRequest
+from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.sso.saml.update(
- projects_groups=[
- ProjectGroupRequest(
- group="groups_test",
- project_id=42,
- role="Inherit",
- )
- ],
- roles_groups=[["Administrator", "groups_test"]],
- workspaces_groups=[["Default workspace", "groups_test"]],
+client.prompts.versions.update(
+ prompt_id=1,
+ version_id=1,
)
```
@@ -34941,7 +34746,7 @@ client.sso.saml.update(
-
-**projects_groups:** `typing.Optional[typing.Sequence[ProjectGroupRequest]]`
+**prompt_id:** `int`
@@ -34949,7 +34754,7 @@ client.sso.saml.update(
-
-**roles_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+**version_id:** `int`
@@ -34957,7 +34762,7 @@ client.sso.saml.update(
-
-**workspaces_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+**model_provider_connection:** `typing.Optional[int]`
@@ -34965,70 +34770,61 @@ client.sso.saml.update(
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**organization:** `typing.Optional[int]`
-
-
+
+-
+**parent_model:** `typing.Optional[int]` — Parent model interface ID
+
-
-## Sso Scim
-client.sso.scim.get()
-
-#### 📝 Description
+**prompt:** `typing.Optional[str]` — Prompt to execute
+
+
+
-
-
--
+**provider:** `typing.Optional[ProviderEnum]`
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Retrieve SCIM settings for the currently active organization.
-
-
+The model provider to use e.g. OpenAI
+
+* `OpenAI` - OpenAI
+* `AzureOpenAI` - AzureOpenAI
+* `AzureAIFoundry` - AzureAIFoundry
+* `VertexAI` - VertexAI
+* `Gemini` - Gemini
+* `Anthropic` - Anthropic
+* `Custom` - Custom
+
-#### 🔌 Usage
-
-
--
-
-
-```python
-from label_studio_sdk import LabelStudio
-
-client = LabelStudio(
- api_key="YOUR_API_KEY",
-)
-client.sso.scim.get()
-
-```
-
-
+**provider_model_id:** `typing.Optional[str]` — The model ID to use within the given provider, e.g. gpt-3.5
+
-#### ⚙️ Parameters
-
-
+**title:** `typing.Optional[str]` — Model name
+
+
+
+
-
@@ -35044,7 +34840,7 @@ client.sso.scim.get()
-client.sso.scim.update(...)
+client.prompts.versions.cost_estimate(...)
-
@@ -35062,7 +34858,7 @@ client.sso.scim.get()
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Update SCIM settings for the currently active organization.
+Get an estimate of the cost for making an inference run on the selected Prompt Version and Project/ProjectSubset
@@ -35077,21 +34873,14 @@ Update SCIM settings for the currently active organization.
```python
-from label_studio_sdk import LabelStudio, ProjectGroupRequest
+from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.sso.scim.update(
- projects_groups=[
- ProjectGroupRequest(
- group="groups_test",
- project_id=42,
- role="Inherit",
- )
- ],
- roles_groups=[["Administrator", "groups_test"]],
- workspaces_groups=[["Default workspace", "groups_test"]],
+client.prompts.versions.cost_estimate(
+ prompt_id=1,
+ version_id=1,
)
```
@@ -35108,15 +34897,7 @@ client.sso.scim.update(
-
-**projects_groups:** `typing.Optional[typing.Sequence[ProjectGroupRequest]]`
-
-
-
-
-
--
-
-**roles_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+**prompt_id:** `int`
@@ -35124,7 +34905,7 @@ client.sso.scim.update(
-
-**workspaces_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+**version_id:** `int`
@@ -35144,8 +34925,7 @@ client.sso.scim.update(
-## Workspaces Members
-client.workspaces.members.list(...)
+client.prompts.versions.get_refined_prompt(...)
-
@@ -35157,13 +34937,7 @@ client.sso.scim.update(
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Get a list of all members in a specific workspace.
+Get the refined prompt based on the `refinement_job_id`.
@@ -35183,8 +34957,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.workspaces.members.list(
- id=1,
+client.prompts.versions.get_refined_prompt(
+ prompt_id=1,
+ version_id=1,
)
```
@@ -35201,7 +34976,7 @@ client.workspaces.members.list(
-
-**id:** `int`
+**prompt_id:** `int`
@@ -35209,11 +34984,1160 @@ client.workspaces.members.list(
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**version_id:** `int`
-
+
+
+-
+
+**refinement_job_id:** `typing.Optional[str]` — Refinement Job ID acquired from the `POST /api/prompts/{prompt_id}/versions/{version_id}/refine` endpoint
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.prompts.versions.refine_prompt(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Refine a prompt version using a teacher model and save the refined prompt as a new version.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.prompts.versions.refine_prompt(
+ prompt_id=1,
+ version_id=1,
+ project_id=1,
+ teacher_model_name="teacher_model_name",
+ teacher_model_provider_connection_id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**prompt_id:** `int`
+
+
+
+
+
+-
+
+**version_id:** `int`
+
+
+
+
+
+-
+
+**project_id:** `int` — Project ID to target the refined prompt for
+
+
+
+
+
+-
+
+**teacher_model_name:** `str` — Name of the model to use to refine the prompt
+
+
+
+
+
+-
+
+**teacher_model_provider_connection_id:** `int` — Model Provider Connection ID to use to refine the prompt
+
+
+
+
+
+-
+
+**async_:** `typing.Optional[bool]` — Whether to run the refinement asynchronously
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Prompts Runs
+client.prompts.runs.list(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Get information (status, metadata, etc) about an existing inference run
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.prompts.runs.list(
+ prompt_id=1,
+ version_id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**prompt_id:** `int`
+
+
+
+
+
+-
+
+**version_id:** `int`
+
+
+
+
+
+-
+
+**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
+
+
+
+
+
+-
+
+**parent_model:** `typing.Optional[int]` — The ID of the parent model for this Inference Run
+
+
+
+
+
+-
+
+**project:** `typing.Optional[int]` — The ID of the project this Inference Run makes predictions on
+
+
+
+
+
+-
+
+**project_subset:** `typing.Optional[RunsListRequestProjectSubset]` — Defines which tasks are operated on (e.g. HasGT will only operate on tasks with a ground truth annotation, but All will operate on all records)
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.prompts.runs.create(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Run a prompt inference.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.prompts.runs.create(
+ prompt_id=1,
+ version_id=1,
+ project=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**prompt_id:** `int`
+
+
+
+
+
+-
+
+**version_id:** `int`
+
+
+
+
+
+-
+
+**project:** `int`
+
+
+
+
+
+-
+
+**job_id:** `typing.Optional[str]` — Job ID for inference job for a ModelRun e.g. Adala job ID
+
+
+
+
+
+-
+
+**organization:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**predictions_updated_at:** `typing.Optional[dt.datetime]`
+
+
+
+
+
+-
+
+**project_subset:** `typing.Optional[ProjectSubsetEnum]`
+
+
+
+
+
+-
+
+**total_correct_predictions:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**total_predictions:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**total_tasks:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.prompts.runs.cancel(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Cancel the inference run for the given api
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.prompts.runs.cancel(
+ inference_run_id=1,
+ prompt_id=1,
+ version_id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**inference_run_id:** `int`
+
+
+
+
+
+-
+
+**prompt_id:** `int`
+
+
+
+
+
+-
+
+**version_id:** `int`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Sso Saml
+client.sso.saml.get()
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Retrieve SAML2 settings for the currently active organization.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.sso.saml.get()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.sso.saml.update(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Update SAML2 settings for the currently active organization.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio, ProjectGroupRequest
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.sso.saml.update(
+ projects_groups=[
+ ProjectGroupRequest(
+ group="groups_test",
+ project_id=42,
+ role="Inherit",
+ )
+ ],
+ roles_groups=[["Administrator", "groups_test"]],
+ workspaces_groups=[["Default workspace", "groups_test"]],
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**projects_groups:** `typing.Optional[typing.Sequence[ProjectGroupRequest]]`
+
+
+
+
+
+-
+
+**roles_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+
+
+
+
+
+-
+
+**workspaces_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Sso Scim
+client.sso.scim.get()
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Retrieve SCIM settings for the currently active organization.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.sso.scim.get()
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.sso.scim.update(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Update SCIM settings for the currently active organization.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio, ProjectGroupRequest
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.sso.scim.update(
+ projects_groups=[
+ ProjectGroupRequest(
+ group="groups_test",
+ project_id=42,
+ role="Inherit",
+ )
+ ],
+ roles_groups=[["Administrator", "groups_test"]],
+ workspaces_groups=[["Default workspace", "groups_test"]],
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**projects_groups:** `typing.Optional[typing.Sequence[ProjectGroupRequest]]`
+
+
+
+
+
+-
+
+**roles_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+
+
+
+
+
+-
+
+**workspaces_groups:** `typing.Optional[typing.Sequence[typing.Sequence[str]]]`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Workspaces Members
+client.workspaces.members.list(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Get a list of all members in a specific workspace.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.workspaces.members.list(
+ id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.workspaces.members.create(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Add a new workspace member by user ID.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.workspaces.members.create(
+ id=1,
+ user=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**user:** `int` — User ID
+
+
+
+
+
+-
+
+**workspace:** `typing.Optional[int]` — Workspace ID
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.workspaces.members.delete(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Remove a specific member by ID from a workspace. This endpoint expects an object like `{"user_id": 123}`.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.workspaces.members.delete(
+ id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Workspaces Projects
+client.workspaces.projects.list(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Retrieve a list of all projects in a specific workspace.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.workspaces.projects.list(
+ id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
@@ -35221,7 +36145,7 @@ client.workspaces.members.list(
-client.workspaces.members.create(...)
+client.workspaces.projects.add(...)
-
@@ -35239,7 +36163,7 @@ client.workspaces.members.list(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Add a new workspace member by user ID.
+Create a project in a specific workspace.
@@ -35259,9 +36183,8 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.workspaces.members.create(
+client.workspaces.projects.add(
id=1,
- user=1,
)
```
@@ -35286,7 +36209,7 @@ client.workspaces.members.create(
-
-**user:** `int` — User ID
+**color:** `typing.Optional[str]`
@@ -35294,7 +36217,215 @@ client.workspaces.members.create(
-
-**workspace:** `typing.Optional[int]` — Workspace ID
+**control_weights:** `typing.Optional[typing.Optional[typing.Any]]`
+
+
+
+
+
+-
+
+**created_by:** `typing.Optional[UserSimpleRequest]` — Project owner
+
+
+
+
+
+-
+
+**description:** `typing.Optional[str]` — Project description
+
+
+
+
+
+-
+
+**enable_empty_annotation:** `typing.Optional[bool]` — Allow annotators to submit empty annotations
+
+
+
+
+
+-
+
+**evaluate_predictions_automatically:** `typing.Optional[bool]` — Retrieve and display predictions when loading a task
+
+
+
+
+
+-
+
+**expert_instruction:** `typing.Optional[str]` — Labeling instructions in HTML format
+
+
+
+
+
+-
+
+**is_draft:** `typing.Optional[bool]` — Whether or not the project is in the middle of being created
+
+
+
+
+
+-
+
+**is_published:** `typing.Optional[bool]` — Whether or not the project is published to annotators
+
+
+
+
+
+-
+
+**label_config:** `typing.Optional[str]` — Label config in XML format. See more about it in documentation
+
+
+
+
+
+-
+
+**maximum_annotations:** `typing.Optional[int]` — Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
+
+
+
+
+
+-
+
+**min_annotations_to_start_training:** `typing.Optional[int]` — Minimum number of completed tasks after which model training is started
+
+
+
+
+
+-
+
+**model_version:** `typing.Optional[str]` — Machine learning model version
+
+
+
+
+
+-
+
+**organization:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**overlap_cohort_percentage:** `typing.Optional[int]`
+
+
+
+
+
+-
+
+**pinned_at:** `typing.Optional[dt.datetime]` — Pinned date and time
+
+
+
+
+
+-
+
+**reveal_preannotations_interactively:** `typing.Optional[bool]` — Reveal pre-annotations interactively
+
+
+
+
+
+-
+
+**sampling:** `typing.Optional[ProjectRequestSampling]`
+
+
+
+
+
+-
+
+**show_annotation_history:** `typing.Optional[bool]` — Show annotation history to annotator
+
+
+
+
+
+-
+
+**show_collab_predictions:** `typing.Optional[bool]` — If set, the annotator can view model predictions
+
+
+
+
+
+-
+
+**show_ground_truth_first:** `typing.Optional[bool]`
+
+
+
+
+
+-
+
+**show_instruction:** `typing.Optional[bool]` — Show instructions to the annotator before they start
+
+
+
+
+
+-
+
+**show_overlap_first:** `typing.Optional[bool]`
+
+
+
+
+
+-
+
+**show_skip_button:** `typing.Optional[bool]` — Show a skip button in interface and allow annotators to skip the task
+
+
+
+
+
+-
+
+**skip_queue:** `typing.Optional[ProjectRequestSkipQueue]`
+
+
+
+
+
+-
+
+**task_data_login:** `typing.Optional[str]` — Task data credentials: login
+
+
+
+
+
+-
+
+**task_data_password:** `typing.Optional[str]` — Task data credentials: password
+
+
+
+
+
+-
+
+**title:** `typing.Optional[str]` — Project name. Must be between 3 and 50 characters long.
@@ -35314,7 +36445,7 @@ client.workspaces.members.create(
-client.workspaces.members.delete(...)
+client.workspaces.projects.remove(...)
-
@@ -35332,7 +36463,7 @@ client.workspaces.members.create(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Remove a specific member by ID from a workspace. This endpoint expects an object like `{"user_id": 123}`.
+Delete projects from a specific workspace.
@@ -35352,7 +36483,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.workspaces.members.delete(
+client.workspaces.projects.remove(
id=1,
)
diff --git a/src/label_studio_sdk/__init__.py b/src/label_studio_sdk/__init__.py
index ee514b2de..a2d682b4b 100644
--- a/src/label_studio_sdk/__init__.py
+++ b/src/label_studio_sdk/__init__.py
@@ -90,6 +90,7 @@
LseProjectCreate,
LseProjectCreateSampling,
LseProjectCreateSkipQueue,
+ LseProjectParams,
LseProjectResponse,
LseProjectResponseSampling,
LseProjectResponseSkipQueue,
@@ -162,13 +163,18 @@
PauseRequest,
Prediction,
PredictionRequest,
+ Project,
ProjectGroup,
ProjectGroupRequest,
ProjectGroupRoleEnum,
ProjectImport,
ProjectLabelConfig,
ProjectLabelConfigRequest,
+ ProjectMember,
ProjectMemberBulkAssignRolesRequest,
+ ProjectRole,
+ ProjectSampling,
+ ProjectSkipQueue,
ProjectSubsetEnum,
ProjectSubsetItem,
ProjectSubsetTaskItem,
@@ -468,6 +474,7 @@
"LseProjectCreateRequestSkipQueue",
"LseProjectCreateSampling",
"LseProjectCreateSkipQueue",
+ "LseProjectParams",
"LseProjectResponse",
"LseProjectResponseSampling",
"LseProjectResponseSkipQueue",
@@ -549,13 +556,18 @@
"PauseRequest",
"Prediction",
"PredictionRequest",
+ "Project",
"ProjectGroup",
"ProjectGroupRequest",
"ProjectGroupRoleEnum",
"ProjectImport",
"ProjectLabelConfig",
"ProjectLabelConfigRequest",
+ "ProjectMember",
"ProjectMemberBulkAssignRolesRequest",
+ "ProjectRole",
+ "ProjectSampling",
+ "ProjectSkipQueue",
"ProjectSubsetEnum",
"ProjectSubsetItem",
"ProjectSubsetTaskItem",
diff --git a/src/label_studio_sdk/projects/__init__.py b/src/label_studio_sdk/projects/__init__.py
index 414784786..6a1dfa442 100644
--- a/src/label_studio_sdk/projects/__init__.py
+++ b/src/label_studio_sdk/projects/__init__.py
@@ -9,7 +9,7 @@
ProjectsImportPredictionsResponse,
ProjectsImportTasksResponse,
)
-from . import assignments, exports, members, metrics, pauses, stats
+from . import annotator_weights, assignments, exports, members, metrics, pauses, roles, stats
from .assignments import (
AssignmentsAssignRequestType,
AssignmentsBulkAssignRequestFilters,
@@ -95,10 +95,12 @@
"StatsUserReviewScoreResponse",
"StatsUserReviewScoreResponsePerformanceScore",
"StatsUserReviewScoreResponseReviewScore",
+ "annotator_weights",
"assignments",
"exports",
"members",
"metrics",
"pauses",
+ "roles",
"stats",
]
diff --git a/src/label_studio_sdk/projects/annotator_weights/__init__.py b/src/label_studio_sdk/projects/annotator_weights/__init__.py
new file mode 100644
index 000000000..f3ea2659b
--- /dev/null
+++ b/src/label_studio_sdk/projects/annotator_weights/__init__.py
@@ -0,0 +1,2 @@
+# This file was auto-generated by Fern from our API Definition.
+
diff --git a/src/label_studio_sdk/projects/annotator_weights/client.py b/src/label_studio_sdk/projects/annotator_weights/client.py
new file mode 100644
index 000000000..b7a619f5b
--- /dev/null
+++ b/src/label_studio_sdk/projects/annotator_weights/client.py
@@ -0,0 +1,288 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from ...core.client_wrapper import SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.lse_project_params import LseProjectParams
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.unchecked_base_model import construct_type
+from json.decoder import JSONDecodeError
+from ...core.api_error import ApiError
+from ...core.client_wrapper import AsyncClientWrapper
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class AnnotatorWeightsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> LseProjectParams:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LseProjectParams
+ Annotator weights retrieved
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.annotator_weights.get(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ LseProjectParams,
+ construct_type(
+ type_=LseProjectParams, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def create(
+ self,
+ id: int,
+ *,
+ annotator_params: typing.Optional[typing.Optional[typing.Any]] = OMIT,
+ use_kappa: typing.Optional[bool] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LseProjectParams:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
+
+ Parameters
+ ----------
+ id : int
+
+ annotator_params : typing.Optional[typing.Optional[typing.Any]]
+
+ use_kappa : typing.Optional[bool]
+ If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LseProjectParams
+ Annotator weights created/updated
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.annotator_weights.create(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
+ method="POST",
+ json={
+ "annotator_params": annotator_params,
+ "use_kappa": use_kappa,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ LseProjectParams,
+ construct_type(
+ type_=LseProjectParams, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+
+class AsyncAnnotatorWeightsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> LseProjectParams:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LseProjectParams
+ Annotator weights retrieved
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.annotator_weights.get(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ LseProjectParams,
+ construct_type(
+ type_=LseProjectParams, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def create(
+ self,
+ id: int,
+ *,
+ annotator_params: typing.Optional[typing.Optional[typing.Any]] = OMIT,
+ use_kappa: typing.Optional[bool] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> LseProjectParams:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
+
+ Parameters
+ ----------
+ id : int
+
+ annotator_params : typing.Optional[typing.Optional[typing.Any]]
+
+ use_kappa : typing.Optional[bool]
+ If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ LseProjectParams
+ Annotator weights created/updated
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.annotator_weights.create(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
+ method="POST",
+ json={
+ "annotator_params": annotator_params,
+ "use_kappa": use_kappa,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ LseProjectParams,
+ construct_type(
+ type_=LseProjectParams, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/src/label_studio_sdk/projects/client.py b/src/label_studio_sdk/projects/client.py
index 1fed8a684..20dc61708 100644
--- a/src/label_studio_sdk/projects/client.py
+++ b/src/label_studio_sdk/projects/client.py
@@ -2,9 +2,11 @@
import typing
from ..core.client_wrapper import SyncClientWrapper
+from .roles.client import RolesClient
from .exports.client import ExportsClient
from .members.client import MembersClient
from .metrics.client import MetricsClient
+from .annotator_weights.client import AnnotatorWeightsClient
from .stats.client import StatsClient
from .assignments.client import AssignmentsClient
from .pauses.client import PausesClient
@@ -39,9 +41,11 @@
from .types.projects_import_predictions_response import ProjectsImportPredictionsResponse
from ..types.project_label_config import ProjectLabelConfig
from ..core.client_wrapper import AsyncClientWrapper
+from .roles.client import AsyncRolesClient
from .exports.client import AsyncExportsClient
from .members.client import AsyncMembersClient
from .metrics.client import AsyncMetricsClient
+from .annotator_weights.client import AsyncAnnotatorWeightsClient
from .stats.client import AsyncStatsClient
from .assignments.client import AsyncAssignmentsClient
from .pauses.client import AsyncPausesClient
@@ -54,9 +58,11 @@
class ProjectsClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
self._client_wrapper = client_wrapper
+ self.roles = RolesClient(client_wrapper=self._client_wrapper)
self.exports = ExportsClient(client_wrapper=self._client_wrapper)
self.members = MembersClient(client_wrapper=self._client_wrapper)
self.metrics = MetricsClient(client_wrapper=self._client_wrapper)
+ self.annotator_weights = AnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.stats = StatsClient(client_wrapper=self._client_wrapper)
self.assignments = AssignmentsClient(client_wrapper=self._client_wrapper)
self.pauses = PausesClient(client_wrapper=self._client_wrapper)
@@ -1235,9 +1241,11 @@ def validate_label_config(
class AsyncProjectsClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
self._client_wrapper = client_wrapper
+ self.roles = AsyncRolesClient(client_wrapper=self._client_wrapper)
self.exports = AsyncExportsClient(client_wrapper=self._client_wrapper)
self.members = AsyncMembersClient(client_wrapper=self._client_wrapper)
self.metrics = AsyncMetricsClient(client_wrapper=self._client_wrapper)
+ self.annotator_weights = AsyncAnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.stats = AsyncStatsClient(client_wrapper=self._client_wrapper)
self.assignments = AsyncAssignmentsClient(client_wrapper=self._client_wrapper)
self.pauses = AsyncPausesClient(client_wrapper=self._client_wrapper)
diff --git a/src/label_studio_sdk/projects/members/client.py b/src/label_studio_sdk/projects/members/client.py
index e74d5e1d1..f0be02095 100644
--- a/src/label_studio_sdk/projects/members/client.py
+++ b/src/label_studio_sdk/projects/members/client.py
@@ -1,19 +1,23 @@
# This file was auto-generated by Fern from our API Definition.
+import typing
from ...core.client_wrapper import SyncClientWrapper
from .bulk.client import BulkClient
from .paginated.client import PaginatedClient
-import typing
from ...core.request_options import RequestOptions
from ...types.lse_user import LseUser
from ...core.jsonable_encoder import jsonable_encoder
from ...core.unchecked_base_model import construct_type
from json.decoder import JSONDecodeError
from ...core.api_error import ApiError
+from ...types.project_member import ProjectMember
from ...core.client_wrapper import AsyncClientWrapper
from .bulk.client import AsyncBulkClient
from .paginated.client import AsyncPaginatedClient
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
class MembersClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
@@ -81,6 +85,113 @@ def get(
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
+ def add(self, id: int, *, user: int, request_options: typing.Optional[RequestOptions] = None) -> ProjectMember:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Add a member to a specific project.
+
+ Parameters
+ ----------
+ id : int
+
+ user : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ProjectMember
+
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.members.add(
+ id=1,
+ user=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/members/",
+ method="POST",
+ json={
+ "user": user,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ProjectMember,
+ construct_type(
+ type_=ProjectMember, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Remove a member from a specific project.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.members.remove(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/members/",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
class AsyncMembersClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
@@ -155,3 +266,128 @@ async def main() -> None:
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def add(
+ self, id: int, *, user: int, request_options: typing.Optional[RequestOptions] = None
+ ) -> ProjectMember:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Add a member to a specific project.
+
+ Parameters
+ ----------
+ id : int
+
+ user : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ProjectMember
+
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.members.add(
+ id=1,
+ user=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/members/",
+ method="POST",
+ json={
+ "user": user,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ProjectMember,
+ construct_type(
+ type_=ProjectMember, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Remove a member from a specific project.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.members.remove(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/members/",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/src/label_studio_sdk/projects/roles/__init__.py b/src/label_studio_sdk/projects/roles/__init__.py
new file mode 100644
index 000000000..f3ea2659b
--- /dev/null
+++ b/src/label_studio_sdk/projects/roles/__init__.py
@@ -0,0 +1,2 @@
+# This file was auto-generated by Fern from our API Definition.
+
diff --git a/src/label_studio_sdk/projects/roles/client.py b/src/label_studio_sdk/projects/roles/client.py
new file mode 100644
index 000000000..9ab519f0d
--- /dev/null
+++ b/src/label_studio_sdk/projects/roles/client.py
@@ -0,0 +1,555 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from ...core.client_wrapper import SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.project_role import ProjectRole
+from ...core.unchecked_base_model import construct_type
+from json.decoder import JSONDecodeError
+from ...core.api_error import ApiError
+from ...types.role9e7enum import Role9E7Enum
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.client_wrapper import AsyncClientWrapper
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class RolesClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(
+ self,
+ *,
+ ids: typing.Optional[int] = None,
+ ordering: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[ProjectRole]:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ List project roles for requested IDs for the current user
+
+
+ Parameters
+ ----------
+ ids : typing.Optional[int]
+
+ ordering : typing.Optional[str]
+ Which field to use when ordering the results.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[ProjectRole]
+
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.roles.list()
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "api/projects/roles/",
+ method="GET",
+ params={
+ "ids": ids,
+ "ordering": ordering,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ typing.List[ProjectRole],
+ construct_type(
+ type_=typing.List[ProjectRole], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def add(
+ self, *, project: int, role: Role9E7Enum, user: int, request_options: typing.Optional[RequestOptions] = None
+ ) -> ProjectRole:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ Create project role for user allowing the user the same access level provided by organization role.
+
+
+ Parameters
+ ----------
+ project : int
+
+ role : Role9E7Enum
+ User role in project
+
+ * `OW` - Owner
+ * `AD` - Administrator
+ * `MA` - Manager
+ * `RE` - Reviewer
+ * `AN` - Annotator
+ * `DI` - Deactivated
+ * `NO` - Not Activated
+
+ user : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ProjectRole
+ Role created
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.roles.add(
+ project=1,
+ role="OW",
+ user=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "api/projects/roles/",
+ method="POST",
+ json={
+ "project": project,
+ "role": role,
+ "user": user,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ProjectRole,
+ construct_type(
+ type_=ProjectRole, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ Remove project role for user allowing the user the same access level provided by organization role.
+
+
+ Parameters
+ ----------
+ id : int
+ A unique integer value identifying this project role.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.roles.remove(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/roles/{jsonable_encoder(id)}/",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[ProjectRole]:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ List users and their project level roles for a given project.
+ If user is not listed here and is a member of the project then they would behave as assigned role in organization.
+
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[ProjectRole]
+
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.roles.get(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/roles",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ typing.List[ProjectRole],
+ construct_type(
+ type_=typing.List[ProjectRole], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+
+class AsyncRolesClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(
+ self,
+ *,
+ ids: typing.Optional[int] = None,
+ ordering: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> typing.List[ProjectRole]:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ List project roles for requested IDs for the current user
+
+
+ Parameters
+ ----------
+ ids : typing.Optional[int]
+
+ ordering : typing.Optional[str]
+ Which field to use when ordering the results.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[ProjectRole]
+
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.roles.list()
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "api/projects/roles/",
+ method="GET",
+ params={
+ "ids": ids,
+ "ordering": ordering,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ typing.List[ProjectRole],
+ construct_type(
+ type_=typing.List[ProjectRole], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def add(
+ self, *, project: int, role: Role9E7Enum, user: int, request_options: typing.Optional[RequestOptions] = None
+ ) -> ProjectRole:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ Create project role for user allowing the user the same access level provided by organization role.
+
+
+ Parameters
+ ----------
+ project : int
+
+ role : Role9E7Enum
+ User role in project
+
+ * `OW` - Owner
+ * `AD` - Administrator
+ * `MA` - Manager
+ * `RE` - Reviewer
+ * `AN` - Annotator
+ * `DI` - Deactivated
+ * `NO` - Not Activated
+
+ user : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ProjectRole
+ Role created
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.roles.add(
+ project=1,
+ role="OW",
+ user=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "api/projects/roles/",
+ method="POST",
+ json={
+ "project": project,
+ "role": role,
+ "user": user,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ProjectRole,
+ construct_type(
+ type_=ProjectRole, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ Remove project role for user allowing the user the same access level provided by organization role.
+
+
+ Parameters
+ ----------
+ id : int
+ A unique integer value identifying this project role.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.roles.remove(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/roles/{jsonable_encoder(id)}/",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def get(
+ self, id: int, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> typing.List[ProjectRole]:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+
+ List users and their project level roles for a given project.
+ If user is not listed here and is a member of the project then they would behave as assigned role in organization.
+
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ typing.List[ProjectRole]
+
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.roles.get(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/roles",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ typing.List[ProjectRole],
+ construct_type(
+ type_=typing.List[ProjectRole], # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/src/label_studio_sdk/types/__init__.py b/src/label_studio_sdk/types/__init__.py
index 9ddd92acf..d4c357cd9 100644
--- a/src/label_studio_sdk/types/__init__.py
+++ b/src/label_studio_sdk/types/__init__.py
@@ -91,6 +91,7 @@
from .lse_project_create import LseProjectCreate
from .lse_project_create_sampling import LseProjectCreateSampling
from .lse_project_create_skip_queue import LseProjectCreateSkipQueue
+from .lse_project_params import LseProjectParams
from .lse_project_response import LseProjectResponse
from .lse_project_response_sampling import LseProjectResponseSampling
from .lse_project_response_skip_queue import LseProjectResponseSkipQueue
@@ -163,13 +164,18 @@
from .pause_request import PauseRequest
from .prediction import Prediction
from .prediction_request import PredictionRequest
+from .project import Project
from .project_group import ProjectGroup
from .project_group_request import ProjectGroupRequest
from .project_group_role_enum import ProjectGroupRoleEnum
from .project_import import ProjectImport
from .project_label_config import ProjectLabelConfig
from .project_label_config_request import ProjectLabelConfigRequest
+from .project_member import ProjectMember
from .project_member_bulk_assign_roles_request import ProjectMemberBulkAssignRolesRequest
+from .project_role import ProjectRole
+from .project_sampling import ProjectSampling
+from .project_skip_queue import ProjectSkipQueue
from .project_subset_enum import ProjectSubsetEnum
from .project_subset_item import ProjectSubsetItem
from .project_subset_task_item import ProjectSubsetTaskItem
@@ -328,6 +334,7 @@
"LseProjectCreate",
"LseProjectCreateSampling",
"LseProjectCreateSkipQueue",
+ "LseProjectParams",
"LseProjectResponse",
"LseProjectResponseSampling",
"LseProjectResponseSkipQueue",
@@ -400,13 +407,18 @@
"PauseRequest",
"Prediction",
"PredictionRequest",
+ "Project",
"ProjectGroup",
"ProjectGroupRequest",
"ProjectGroupRoleEnum",
"ProjectImport",
"ProjectLabelConfig",
"ProjectLabelConfigRequest",
+ "ProjectMember",
"ProjectMemberBulkAssignRolesRequest",
+ "ProjectRole",
+ "ProjectSampling",
+ "ProjectSkipQueue",
"ProjectSubsetEnum",
"ProjectSubsetItem",
"ProjectSubsetTaskItem",
diff --git a/src/label_studio_sdk/types/lse_project_params.py b/src/label_studio_sdk/types/lse_project_params.py
new file mode 100644
index 000000000..a28485b93
--- /dev/null
+++ b/src/label_studio_sdk/types/lse_project_params.py
@@ -0,0 +1,23 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.unchecked_base_model import UncheckedBaseModel
+import typing
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+
+
+class LseProjectParams(UncheckedBaseModel):
+ annotator_params: typing.Optional[typing.Optional[typing.Any]] = None
+ use_kappa: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/types/project.py b/src/label_studio_sdk/types/project.py
new file mode 100644
index 000000000..8560ddd5d
--- /dev/null
+++ b/src/label_studio_sdk/types/project.py
@@ -0,0 +1,194 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.unchecked_base_model import UncheckedBaseModel
+import typing
+import pydantic
+import datetime as dt
+from .user_simple import UserSimple
+from .project_sampling import ProjectSampling
+from .project_skip_queue import ProjectSkipQueue
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+
+
+class Project(UncheckedBaseModel):
+ """
+ Serializer get numbers from project queryset annotation,
+ make sure, that you use correct one(Project.objects.with_counts())
+ """
+
+ color: typing.Optional[str] = None
+ config_has_control_tags: bool = pydantic.Field()
+ """
+ Flag to detect is project ready for labeling
+ """
+
+ config_suitable_for_bulk_annotation: bool = pydantic.Field()
+ """
+ Flag to detect is project ready for bulk annotation
+ """
+
+ control_weights: typing.Optional[typing.Optional[typing.Any]] = None
+ created_at: dt.datetime
+ created_by: typing.Optional[UserSimple] = pydantic.Field(default=None)
+ """
+ Project owner
+ """
+
+ description: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Project description
+ """
+
+ enable_empty_annotation: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Allow annotators to submit empty annotations
+ """
+
+ evaluate_predictions_automatically: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Retrieve and display predictions when loading a task
+ """
+
+ expert_instruction: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Labeling instructions in HTML format
+ """
+
+ finished_task_number: int = pydantic.Field()
+ """
+ Finished tasks
+ """
+
+ ground_truth_number: int = pydantic.Field()
+ """
+ Honeypot annotation number in project
+ """
+
+ id: int
+ is_draft: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether or not the project is in the middle of being created
+ """
+
+ is_published: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether or not the project is published to annotators
+ """
+
+ label_config: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Label config in XML format. See more about it in documentation
+ """
+
+ maximum_annotations: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
+ """
+
+ min_annotations_to_start_training: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ Minimum number of completed tasks after which model training is started
+ """
+
+ model_version: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Machine learning model version
+ """
+
+ num_tasks_with_annotations: int = pydantic.Field()
+ """
+ Tasks with annotations count
+ """
+
+ organization: typing.Optional[int] = None
+ overlap_cohort_percentage: typing.Optional[int] = None
+ parsed_label_config: typing.Optional[typing.Any] = None
+ pinned_at: typing.Optional[dt.datetime] = pydantic.Field(default=None)
+ """
+ Pinned date and time
+ """
+
+ queue_done: int
+ queue_total: int
+ reveal_preannotations_interactively: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Reveal pre-annotations interactively
+ """
+
+ sampling: typing.Optional[ProjectSampling] = None
+ show_annotation_history: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Show annotation history to annotator
+ """
+
+ show_collab_predictions: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ If set, the annotator can view model predictions
+ """
+
+ show_ground_truth_first: typing.Optional[bool] = None
+ show_instruction: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Show instructions to the annotator before they start
+ """
+
+ show_overlap_first: typing.Optional[bool] = None
+ show_skip_button: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Show a skip button in interface and allow annotators to skip the task
+ """
+
+ skip_queue: typing.Optional[ProjectSkipQueue] = None
+ skipped_annotations_number: int = pydantic.Field()
+ """
+ Skipped by collaborators annotation number in project
+ """
+
+ start_training_on_annotation_update: bool = pydantic.Field()
+ """
+ Start model training after any annotations are submitted or updated
+ """
+
+ task_data_login: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Task data credentials: login
+ """
+
+ task_data_password: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Task data credentials: password
+ """
+
+ task_number: int = pydantic.Field()
+ """
+ Total task number in project
+ """
+
+ title: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Project name. Must be between 3 and 50 characters long.
+ """
+
+ total_annotations_number: int = pydantic.Field()
+ """
+ Total annotations number in project including skipped_annotations_number and ground_truth_number.
+ """
+
+ total_predictions_number: int = pydantic.Field()
+ """
+ Total predictions number in project including skipped_annotations_number, ground_truth_number, and useful_annotation_number.
+ """
+
+ useful_annotation_number: int = pydantic.Field()
+ """
+ Useful annotation number in project not including skipped_annotations_number and ground_truth_number. Total annotations = annotation_number + skipped_annotations_number + ground_truth_number
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/types/project_member.py b/src/label_studio_sdk/types/project_member.py
new file mode 100644
index 000000000..352202892
--- /dev/null
+++ b/src/label_studio_sdk/types/project_member.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.unchecked_base_model import UncheckedBaseModel
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+import typing
+import pydantic
+
+
+class ProjectMember(UncheckedBaseModel):
+ user: int
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/types/project_role.py b/src/label_studio_sdk/types/project_role.py
new file mode 100644
index 000000000..5479cac28
--- /dev/null
+++ b/src/label_studio_sdk/types/project_role.py
@@ -0,0 +1,35 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.unchecked_base_model import UncheckedBaseModel
+from .role9e7enum import Role9E7Enum
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+import typing
+
+
+class ProjectRole(UncheckedBaseModel):
+ id: int
+ project: int
+ role: Role9E7Enum = pydantic.Field()
+ """
+ User role in project
+
+ * `OW` - Owner
+ * `AD` - Administrator
+ * `MA` - Manager
+ * `RE` - Reviewer
+ * `AN` - Annotator
+ * `DI` - Deactivated
+ * `NO` - Not Activated
+ """
+
+ user: int
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/types/project_sampling.py b/src/label_studio_sdk/types/project_sampling.py
new file mode 100644
index 000000000..a3aab25e4
--- /dev/null
+++ b/src/label_studio_sdk/types/project_sampling.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from .sampling_de5enum import SamplingDe5Enum
+from .null_enum import NullEnum
+
+ProjectSampling = typing.Union[SamplingDe5Enum, NullEnum]
diff --git a/src/label_studio_sdk/types/project_skip_queue.py b/src/label_studio_sdk/types/project_skip_queue.py
new file mode 100644
index 000000000..7ef691ccc
--- /dev/null
+++ b/src/label_studio_sdk/types/project_skip_queue.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from .skip_queue_enum import SkipQueueEnum
+from .null_enum import NullEnum
+
+ProjectSkipQueue = typing.Union[SkipQueueEnum, NullEnum]
diff --git a/src/label_studio_sdk/workspaces/__init__.py b/src/label_studio_sdk/workspaces/__init__.py
index ff24acaa4..f1f3ddee5 100644
--- a/src/label_studio_sdk/workspaces/__init__.py
+++ b/src/label_studio_sdk/workspaces/__init__.py
@@ -1,5 +1,6 @@
# This file was auto-generated by Fern from our API Definition.
-from . import members
+from . import members, projects
+from .projects import ProjectRequestSampling, ProjectRequestSkipQueue
-__all__ = ["members"]
+__all__ = ["ProjectRequestSampling", "ProjectRequestSkipQueue", "members", "projects"]
diff --git a/src/label_studio_sdk/workspaces/client.py b/src/label_studio_sdk/workspaces/client.py
index f918737ab..0b9a6d7c3 100644
--- a/src/label_studio_sdk/workspaces/client.py
+++ b/src/label_studio_sdk/workspaces/client.py
@@ -3,6 +3,7 @@
import typing
from ..core.client_wrapper import SyncClientWrapper
from .members.client import MembersClient
+from .projects.client import ProjectsClient
from ..core.request_options import RequestOptions
from ..types.workspace import Workspace
from ..core.unchecked_base_model import construct_type
@@ -11,6 +12,7 @@
from ..core.jsonable_encoder import jsonable_encoder
from ..core.client_wrapper import AsyncClientWrapper
from .members.client import AsyncMembersClient
+from .projects.client import AsyncProjectsClient
# this is used as the default value for optional parameters
OMIT = typing.cast(typing.Any, ...)
@@ -20,6 +22,7 @@ class WorkspacesClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
self._client_wrapper = client_wrapper
self.members = MembersClient(client_wrapper=self._client_wrapper)
+ self.projects = ProjectsClient(client_wrapper=self._client_wrapper)
def list(
self,
@@ -358,6 +361,7 @@ class AsyncWorkspacesClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
self._client_wrapper = client_wrapper
self.members = AsyncMembersClient(client_wrapper=self._client_wrapper)
+ self.projects = AsyncProjectsClient(client_wrapper=self._client_wrapper)
async def list(
self,
diff --git a/src/label_studio_sdk/workspaces/projects/__init__.py b/src/label_studio_sdk/workspaces/projects/__init__.py
new file mode 100644
index 000000000..c52cc96c8
--- /dev/null
+++ b/src/label_studio_sdk/workspaces/projects/__init__.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from .types import ProjectRequestSampling, ProjectRequestSkipQueue
+
+__all__ = ["ProjectRequestSampling", "ProjectRequestSkipQueue"]
diff --git a/src/label_studio_sdk/workspaces/projects/client.py b/src/label_studio_sdk/workspaces/projects/client.py
new file mode 100644
index 000000000..df5588d28
--- /dev/null
+++ b/src/label_studio_sdk/workspaces/projects/client.py
@@ -0,0 +1,649 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from ...core.client_wrapper import SyncClientWrapper
+from ...core.request_options import RequestOptions
+from ...types.project import Project
+from ...core.jsonable_encoder import jsonable_encoder
+from ...core.unchecked_base_model import construct_type
+from json.decoder import JSONDecodeError
+from ...core.api_error import ApiError
+from ...types.user_simple_request import UserSimpleRequest
+import datetime as dt
+from .types.project_request_sampling import ProjectRequestSampling
+from .types.project_request_skip_queue import ProjectRequestSkipQueue
+from ...core.serialization import convert_and_respect_annotation_metadata
+from ...core.client_wrapper import AsyncClientWrapper
+
+# this is used as the default value for optional parameters
+OMIT = typing.cast(typing.Any, ...)
+
+
+class ProjectsClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> Project:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Retrieve a list of all projects in a specific workspace.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ Project
+
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.workspaces.projects.list(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/workspaces/{jsonable_encoder(id)}/projects/",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ Project,
+ construct_type(
+ type_=Project, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def add(
+ self,
+ id: int,
+ *,
+ color: typing.Optional[str] = OMIT,
+ control_weights: typing.Optional[typing.Optional[typing.Any]] = OMIT,
+ created_by: typing.Optional[UserSimpleRequest] = OMIT,
+ description: typing.Optional[str] = OMIT,
+ enable_empty_annotation: typing.Optional[bool] = OMIT,
+ evaluate_predictions_automatically: typing.Optional[bool] = OMIT,
+ expert_instruction: typing.Optional[str] = OMIT,
+ is_draft: typing.Optional[bool] = OMIT,
+ is_published: typing.Optional[bool] = OMIT,
+ label_config: typing.Optional[str] = OMIT,
+ maximum_annotations: typing.Optional[int] = OMIT,
+ min_annotations_to_start_training: typing.Optional[int] = OMIT,
+ model_version: typing.Optional[str] = OMIT,
+ organization: typing.Optional[int] = OMIT,
+ overlap_cohort_percentage: typing.Optional[int] = OMIT,
+ pinned_at: typing.Optional[dt.datetime] = OMIT,
+ reveal_preannotations_interactively: typing.Optional[bool] = OMIT,
+ sampling: typing.Optional[ProjectRequestSampling] = OMIT,
+ show_annotation_history: typing.Optional[bool] = OMIT,
+ show_collab_predictions: typing.Optional[bool] = OMIT,
+ show_ground_truth_first: typing.Optional[bool] = OMIT,
+ show_instruction: typing.Optional[bool] = OMIT,
+ show_overlap_first: typing.Optional[bool] = OMIT,
+ show_skip_button: typing.Optional[bool] = OMIT,
+ skip_queue: typing.Optional[ProjectRequestSkipQueue] = OMIT,
+ task_data_login: typing.Optional[str] = OMIT,
+ task_data_password: typing.Optional[str] = OMIT,
+ title: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> Project:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Create a project in a specific workspace.
+
+ Parameters
+ ----------
+ id : int
+
+ color : typing.Optional[str]
+
+ control_weights : typing.Optional[typing.Optional[typing.Any]]
+
+ created_by : typing.Optional[UserSimpleRequest]
+ Project owner
+
+ description : typing.Optional[str]
+ Project description
+
+ enable_empty_annotation : typing.Optional[bool]
+ Allow annotators to submit empty annotations
+
+ evaluate_predictions_automatically : typing.Optional[bool]
+ Retrieve and display predictions when loading a task
+
+ expert_instruction : typing.Optional[str]
+ Labeling instructions in HTML format
+
+ is_draft : typing.Optional[bool]
+ Whether or not the project is in the middle of being created
+
+ is_published : typing.Optional[bool]
+ Whether or not the project is published to annotators
+
+ label_config : typing.Optional[str]
+ Label config in XML format. See more about it in documentation
+
+ maximum_annotations : typing.Optional[int]
+ Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
+
+ min_annotations_to_start_training : typing.Optional[int]
+ Minimum number of completed tasks after which model training is started
+
+ model_version : typing.Optional[str]
+ Machine learning model version
+
+ organization : typing.Optional[int]
+
+ overlap_cohort_percentage : typing.Optional[int]
+
+ pinned_at : typing.Optional[dt.datetime]
+ Pinned date and time
+
+ reveal_preannotations_interactively : typing.Optional[bool]
+ Reveal pre-annotations interactively
+
+ sampling : typing.Optional[ProjectRequestSampling]
+
+ show_annotation_history : typing.Optional[bool]
+ Show annotation history to annotator
+
+ show_collab_predictions : typing.Optional[bool]
+ If set, the annotator can view model predictions
+
+ show_ground_truth_first : typing.Optional[bool]
+
+ show_instruction : typing.Optional[bool]
+ Show instructions to the annotator before they start
+
+ show_overlap_first : typing.Optional[bool]
+
+ show_skip_button : typing.Optional[bool]
+ Show a skip button in interface and allow annotators to skip the task
+
+ skip_queue : typing.Optional[ProjectRequestSkipQueue]
+
+ task_data_login : typing.Optional[str]
+ Task data credentials: login
+
+ task_data_password : typing.Optional[str]
+ Task data credentials: password
+
+ title : typing.Optional[str]
+ Project name. Must be between 3 and 50 characters long.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ Project
+
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.workspaces.projects.add(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/workspaces/{jsonable_encoder(id)}/projects/",
+ method="POST",
+ json={
+ "color": color,
+ "control_weights": control_weights,
+ "created_by": convert_and_respect_annotation_metadata(
+ object_=created_by, annotation=UserSimpleRequest, direction="write"
+ ),
+ "description": description,
+ "enable_empty_annotation": enable_empty_annotation,
+ "evaluate_predictions_automatically": evaluate_predictions_automatically,
+ "expert_instruction": expert_instruction,
+ "is_draft": is_draft,
+ "is_published": is_published,
+ "label_config": label_config,
+ "maximum_annotations": maximum_annotations,
+ "min_annotations_to_start_training": min_annotations_to_start_training,
+ "model_version": model_version,
+ "organization": organization,
+ "overlap_cohort_percentage": overlap_cohort_percentage,
+ "pinned_at": pinned_at,
+ "reveal_preannotations_interactively": reveal_preannotations_interactively,
+ "sampling": convert_and_respect_annotation_metadata(
+ object_=sampling, annotation=ProjectRequestSampling, direction="write"
+ ),
+ "show_annotation_history": show_annotation_history,
+ "show_collab_predictions": show_collab_predictions,
+ "show_ground_truth_first": show_ground_truth_first,
+ "show_instruction": show_instruction,
+ "show_overlap_first": show_overlap_first,
+ "show_skip_button": show_skip_button,
+ "skip_queue": convert_and_respect_annotation_metadata(
+ object_=skip_queue, annotation=ProjectRequestSkipQueue, direction="write"
+ ),
+ "task_data_login": task_data_login,
+ "task_data_password": task_data_password,
+ "title": title,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ Project,
+ construct_type(
+ type_=Project, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Delete projects from a specific workspace.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.workspaces.projects.remove(
+ id=1,
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/workspaces/{jsonable_encoder(id)}/projects/",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+
+class AsyncProjectsClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> Project:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Retrieve a list of all projects in a specific workspace.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ Project
+
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.workspaces.projects.list(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/workspaces/{jsonable_encoder(id)}/projects/",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ Project,
+ construct_type(
+ type_=Project, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def add(
+ self,
+ id: int,
+ *,
+ color: typing.Optional[str] = OMIT,
+ control_weights: typing.Optional[typing.Optional[typing.Any]] = OMIT,
+ created_by: typing.Optional[UserSimpleRequest] = OMIT,
+ description: typing.Optional[str] = OMIT,
+ enable_empty_annotation: typing.Optional[bool] = OMIT,
+ evaluate_predictions_automatically: typing.Optional[bool] = OMIT,
+ expert_instruction: typing.Optional[str] = OMIT,
+ is_draft: typing.Optional[bool] = OMIT,
+ is_published: typing.Optional[bool] = OMIT,
+ label_config: typing.Optional[str] = OMIT,
+ maximum_annotations: typing.Optional[int] = OMIT,
+ min_annotations_to_start_training: typing.Optional[int] = OMIT,
+ model_version: typing.Optional[str] = OMIT,
+ organization: typing.Optional[int] = OMIT,
+ overlap_cohort_percentage: typing.Optional[int] = OMIT,
+ pinned_at: typing.Optional[dt.datetime] = OMIT,
+ reveal_preannotations_interactively: typing.Optional[bool] = OMIT,
+ sampling: typing.Optional[ProjectRequestSampling] = OMIT,
+ show_annotation_history: typing.Optional[bool] = OMIT,
+ show_collab_predictions: typing.Optional[bool] = OMIT,
+ show_ground_truth_first: typing.Optional[bool] = OMIT,
+ show_instruction: typing.Optional[bool] = OMIT,
+ show_overlap_first: typing.Optional[bool] = OMIT,
+ show_skip_button: typing.Optional[bool] = OMIT,
+ skip_queue: typing.Optional[ProjectRequestSkipQueue] = OMIT,
+ task_data_login: typing.Optional[str] = OMIT,
+ task_data_password: typing.Optional[str] = OMIT,
+ title: typing.Optional[str] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> Project:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Create a project in a specific workspace.
+
+ Parameters
+ ----------
+ id : int
+
+ color : typing.Optional[str]
+
+ control_weights : typing.Optional[typing.Optional[typing.Any]]
+
+ created_by : typing.Optional[UserSimpleRequest]
+ Project owner
+
+ description : typing.Optional[str]
+ Project description
+
+ enable_empty_annotation : typing.Optional[bool]
+ Allow annotators to submit empty annotations
+
+ evaluate_predictions_automatically : typing.Optional[bool]
+ Retrieve and display predictions when loading a task
+
+ expert_instruction : typing.Optional[str]
+ Labeling instructions in HTML format
+
+ is_draft : typing.Optional[bool]
+ Whether or not the project is in the middle of being created
+
+ is_published : typing.Optional[bool]
+ Whether or not the project is published to annotators
+
+ label_config : typing.Optional[str]
+ Label config in XML format. See more about it in documentation
+
+ maximum_annotations : typing.Optional[int]
+ Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
+
+ min_annotations_to_start_training : typing.Optional[int]
+ Minimum number of completed tasks after which model training is started
+
+ model_version : typing.Optional[str]
+ Machine learning model version
+
+ organization : typing.Optional[int]
+
+ overlap_cohort_percentage : typing.Optional[int]
+
+ pinned_at : typing.Optional[dt.datetime]
+ Pinned date and time
+
+ reveal_preannotations_interactively : typing.Optional[bool]
+ Reveal pre-annotations interactively
+
+ sampling : typing.Optional[ProjectRequestSampling]
+
+ show_annotation_history : typing.Optional[bool]
+ Show annotation history to annotator
+
+ show_collab_predictions : typing.Optional[bool]
+ If set, the annotator can view model predictions
+
+ show_ground_truth_first : typing.Optional[bool]
+
+ show_instruction : typing.Optional[bool]
+ Show instructions to the annotator before they start
+
+ show_overlap_first : typing.Optional[bool]
+
+ show_skip_button : typing.Optional[bool]
+ Show a skip button in interface and allow annotators to skip the task
+
+ skip_queue : typing.Optional[ProjectRequestSkipQueue]
+
+ task_data_login : typing.Optional[str]
+ Task data credentials: login
+
+ task_data_password : typing.Optional[str]
+ Task data credentials: password
+
+ title : typing.Optional[str]
+ Project name. Must be between 3 and 50 characters long.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ Project
+
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.workspaces.projects.add(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/workspaces/{jsonable_encoder(id)}/projects/",
+ method="POST",
+ json={
+ "color": color,
+ "control_weights": control_weights,
+ "created_by": convert_and_respect_annotation_metadata(
+ object_=created_by, annotation=UserSimpleRequest, direction="write"
+ ),
+ "description": description,
+ "enable_empty_annotation": enable_empty_annotation,
+ "evaluate_predictions_automatically": evaluate_predictions_automatically,
+ "expert_instruction": expert_instruction,
+ "is_draft": is_draft,
+ "is_published": is_published,
+ "label_config": label_config,
+ "maximum_annotations": maximum_annotations,
+ "min_annotations_to_start_training": min_annotations_to_start_training,
+ "model_version": model_version,
+ "organization": organization,
+ "overlap_cohort_percentage": overlap_cohort_percentage,
+ "pinned_at": pinned_at,
+ "reveal_preannotations_interactively": reveal_preannotations_interactively,
+ "sampling": convert_and_respect_annotation_metadata(
+ object_=sampling, annotation=ProjectRequestSampling, direction="write"
+ ),
+ "show_annotation_history": show_annotation_history,
+ "show_collab_predictions": show_collab_predictions,
+ "show_ground_truth_first": show_ground_truth_first,
+ "show_instruction": show_instruction,
+ "show_overlap_first": show_overlap_first,
+ "show_skip_button": show_skip_button,
+ "skip_queue": convert_and_respect_annotation_metadata(
+ object_=skip_queue, annotation=ProjectRequestSkipQueue, direction="write"
+ ),
+ "task_data_login": task_data_login,
+ "task_data_password": task_data_password,
+ "title": title,
+ },
+ headers={
+ "content-type": "application/json",
+ },
+ request_options=request_options,
+ omit=OMIT,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ Project,
+ construct_type(
+ type_=Project, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Delete projects from a specific workspace.
+
+ Parameters
+ ----------
+ id : int
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ None
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.workspaces.projects.remove(
+ id=1,
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/workspaces/{jsonable_encoder(id)}/projects/",
+ method="DELETE",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/src/label_studio_sdk/workspaces/projects/types/__init__.py b/src/label_studio_sdk/workspaces/projects/types/__init__.py
new file mode 100644
index 000000000..83f299ce6
--- /dev/null
+++ b/src/label_studio_sdk/workspaces/projects/types/__init__.py
@@ -0,0 +1,6 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from .project_request_sampling import ProjectRequestSampling
+from .project_request_skip_queue import ProjectRequestSkipQueue
+
+__all__ = ["ProjectRequestSampling", "ProjectRequestSkipQueue"]
diff --git a/src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py b/src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py
new file mode 100644
index 000000000..8cc4fed71
--- /dev/null
+++ b/src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from ....types.sampling_de5enum import SamplingDe5Enum
+from ....types.null_enum import NullEnum
+
+ProjectRequestSampling = typing.Union[SamplingDe5Enum, NullEnum]
diff --git a/src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py b/src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py
new file mode 100644
index 000000000..b4fc0196a
--- /dev/null
+++ b/src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+from ....types.skip_queue_enum import SkipQueueEnum
+from ....types.null_enum import NullEnum
+
+ProjectRequestSkipQueue = typing.Union[SkipQueueEnum, NullEnum]
diff --git a/tests/projects/test_annotator_weights.py b/tests/projects/test_annotator_weights.py
new file mode 100644
index 000000000..dd3ef91ca
--- /dev/null
+++ b/tests/projects/test_annotator_weights.py
@@ -0,0 +1,26 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from label_studio_sdk import LabelStudio
+from label_studio_sdk import AsyncLabelStudio
+import typing
+from ..utilities import validate_response
+
+
+async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"annotator_params": {"key": "value"}, "use_kappa": True}
+ expected_types: typing.Any = {"annotator_params": None, "use_kappa": None}
+ response = client.projects.annotator_weights.get(id=1)
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.annotator_weights.get(id=1)
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"annotator_params": {"key": "value"}, "use_kappa": True}
+ expected_types: typing.Any = {"annotator_params": None, "use_kappa": None}
+ response = client.projects.annotator_weights.create(id=1)
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.annotator_weights.create(id=1)
+ validate_response(async_response, expected_response, expected_types)
diff --git a/tests/projects/test_members.py b/tests/projects/test_members.py
index bc984ef0c..fcaa284f0 100644
--- a/tests/projects/test_members.py
+++ b/tests/projects/test_members.py
@@ -87,3 +87,26 @@ async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
async_response = await async_client.projects.members.get(id=1)
validate_response(async_response, expected_response, expected_types)
+
+
+async def test_add(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"user": 1}
+ expected_types: typing.Any = {"user": "integer"}
+ response = client.projects.members.add(id=1, user=1)
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.members.add(id=1, user=1)
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_remove(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ # Type ignore to avoid mypy complaining about the function not being meant to return a value
+ assert (
+ client.projects.members.remove(id=1) # type: ignore[func-returns-value]
+ is None
+ )
+
+ assert (
+ await async_client.projects.members.remove(id=1) # type: ignore[func-returns-value]
+ is None
+ )
diff --git a/tests/projects/test_roles.py b/tests/projects/test_roles.py
new file mode 100644
index 000000000..26355e74d
--- /dev/null
+++ b/tests/projects/test_roles.py
@@ -0,0 +1,55 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from label_studio_sdk import LabelStudio
+from label_studio_sdk import AsyncLabelStudio
+import typing
+from ..utilities import validate_response
+
+
+async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = [{"id": 1, "project": 1, "role": "OW", "user": 1}]
+ expected_types: typing.Tuple[typing.Any, typing.Any] = (
+ "list",
+ {0: {"id": "integer", "project": "integer", "role": None, "user": "integer"}},
+ )
+ response = client.projects.roles.list()
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.roles.list()
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_add(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"id": 1, "project": 1, "role": "OW", "user": 1}
+ expected_types: typing.Any = {"id": "integer", "project": "integer", "role": None, "user": "integer"}
+ response = client.projects.roles.add(project=1, role="OW", user=1)
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.roles.add(project=1, role="OW", user=1)
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_remove(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ # Type ignore to avoid mypy complaining about the function not being meant to return a value
+ assert (
+ client.projects.roles.remove(id=1) # type: ignore[func-returns-value]
+ is None
+ )
+
+ assert (
+ await async_client.projects.roles.remove(id=1) # type: ignore[func-returns-value]
+ is None
+ )
+
+
+async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = [{"id": 1, "project": 1, "role": "OW", "user": 1}]
+ expected_types: typing.Tuple[typing.Any, typing.Any] = (
+ "list",
+ {0: {"id": "integer", "project": "integer", "role": None, "user": "integer"}},
+ )
+ response = client.projects.roles.get(id=1)
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.roles.get(id=1)
+ validate_response(async_response, expected_response, expected_types)
diff --git a/tests/workspaces/test_projects.py b/tests/workspaces/test_projects.py
new file mode 100644
index 000000000..f236fbcfe
--- /dev/null
+++ b/tests/workspaces/test_projects.py
@@ -0,0 +1,231 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from label_studio_sdk import LabelStudio
+from label_studio_sdk import AsyncLabelStudio
+import typing
+from ..utilities import validate_response
+
+
+async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {
+ "color": "color",
+ "config_has_control_tags": True,
+ "config_suitable_for_bulk_annotation": True,
+ "control_weights": {"key": "value"},
+ "created_at": "2024-01-15T09:30:00Z",
+ "created_by": {
+ "avatar": "avatar",
+ "email": "email",
+ "first_name": "first_name",
+ "id": 1,
+ "last_name": "last_name",
+ },
+ "description": "description",
+ "enable_empty_annotation": True,
+ "evaluate_predictions_automatically": True,
+ "expert_instruction": "expert_instruction",
+ "finished_task_number": 1,
+ "ground_truth_number": 1,
+ "id": 1,
+ "is_draft": True,
+ "is_published": True,
+ "label_config": "label_config",
+ "maximum_annotations": 1,
+ "min_annotations_to_start_training": 1,
+ "model_version": "model_version",
+ "num_tasks_with_annotations": 1,
+ "organization": 1,
+ "overlap_cohort_percentage": 1,
+ "parsed_label_config": {"key": "value"},
+ "pinned_at": "2024-01-15T09:30:00Z",
+ "queue_done": 1,
+ "queue_total": 1,
+ "reveal_preannotations_interactively": True,
+ "sampling": "Sequential sampling",
+ "show_annotation_history": True,
+ "show_collab_predictions": True,
+ "show_ground_truth_first": True,
+ "show_instruction": True,
+ "show_overlap_first": True,
+ "show_skip_button": True,
+ "skip_queue": "REQUEUE_FOR_ME",
+ "skipped_annotations_number": 1,
+ "start_training_on_annotation_update": True,
+ "task_data_login": "task_data_login",
+ "task_data_password": "task_data_password",
+ "task_number": 1,
+ "title": "title",
+ "total_annotations_number": 1,
+ "total_predictions_number": 1,
+ "useful_annotation_number": 1,
+ }
+ expected_types: typing.Any = {
+ "color": None,
+ "config_has_control_tags": None,
+ "config_suitable_for_bulk_annotation": None,
+ "control_weights": None,
+ "created_at": "datetime",
+ "created_by": {"avatar": None, "email": None, "first_name": None, "id": "integer", "last_name": None},
+ "description": None,
+ "enable_empty_annotation": None,
+ "evaluate_predictions_automatically": None,
+ "expert_instruction": None,
+ "finished_task_number": "integer",
+ "ground_truth_number": "integer",
+ "id": "integer",
+ "is_draft": None,
+ "is_published": None,
+ "label_config": None,
+ "maximum_annotations": "integer",
+ "min_annotations_to_start_training": "integer",
+ "model_version": None,
+ "num_tasks_with_annotations": "integer",
+ "organization": "integer",
+ "overlap_cohort_percentage": "integer",
+ "parsed_label_config": None,
+ "pinned_at": "datetime",
+ "queue_done": "integer",
+ "queue_total": "integer",
+ "reveal_preannotations_interactively": None,
+ "sampling": None,
+ "show_annotation_history": None,
+ "show_collab_predictions": None,
+ "show_ground_truth_first": None,
+ "show_instruction": None,
+ "show_overlap_first": None,
+ "show_skip_button": None,
+ "skip_queue": None,
+ "skipped_annotations_number": "integer",
+ "start_training_on_annotation_update": None,
+ "task_data_login": None,
+ "task_data_password": None,
+ "task_number": "integer",
+ "title": None,
+ "total_annotations_number": "integer",
+ "total_predictions_number": "integer",
+ "useful_annotation_number": "integer",
+ }
+ response = client.workspaces.projects.list(id=1)
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.workspaces.projects.list(id=1)
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_add(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {
+ "color": "color",
+ "config_has_control_tags": True,
+ "config_suitable_for_bulk_annotation": True,
+ "control_weights": {"key": "value"},
+ "created_at": "2024-01-15T09:30:00Z",
+ "created_by": {
+ "avatar": "avatar",
+ "email": "email",
+ "first_name": "first_name",
+ "id": 1,
+ "last_name": "last_name",
+ },
+ "description": "description",
+ "enable_empty_annotation": True,
+ "evaluate_predictions_automatically": True,
+ "expert_instruction": "expert_instruction",
+ "finished_task_number": 1,
+ "ground_truth_number": 1,
+ "id": 1,
+ "is_draft": True,
+ "is_published": True,
+ "label_config": "label_config",
+ "maximum_annotations": 1,
+ "min_annotations_to_start_training": 1,
+ "model_version": "model_version",
+ "num_tasks_with_annotations": 1,
+ "organization": 1,
+ "overlap_cohort_percentage": 1,
+ "parsed_label_config": {"key": "value"},
+ "pinned_at": "2024-01-15T09:30:00Z",
+ "queue_done": 1,
+ "queue_total": 1,
+ "reveal_preannotations_interactively": True,
+ "sampling": "Sequential sampling",
+ "show_annotation_history": True,
+ "show_collab_predictions": True,
+ "show_ground_truth_first": True,
+ "show_instruction": True,
+ "show_overlap_first": True,
+ "show_skip_button": True,
+ "skip_queue": "REQUEUE_FOR_ME",
+ "skipped_annotations_number": 1,
+ "start_training_on_annotation_update": True,
+ "task_data_login": "task_data_login",
+ "task_data_password": "task_data_password",
+ "task_number": 1,
+ "title": "title",
+ "total_annotations_number": 1,
+ "total_predictions_number": 1,
+ "useful_annotation_number": 1,
+ }
+ expected_types: typing.Any = {
+ "color": None,
+ "config_has_control_tags": None,
+ "config_suitable_for_bulk_annotation": None,
+ "control_weights": None,
+ "created_at": "datetime",
+ "created_by": {"avatar": None, "email": None, "first_name": None, "id": "integer", "last_name": None},
+ "description": None,
+ "enable_empty_annotation": None,
+ "evaluate_predictions_automatically": None,
+ "expert_instruction": None,
+ "finished_task_number": "integer",
+ "ground_truth_number": "integer",
+ "id": "integer",
+ "is_draft": None,
+ "is_published": None,
+ "label_config": None,
+ "maximum_annotations": "integer",
+ "min_annotations_to_start_training": "integer",
+ "model_version": None,
+ "num_tasks_with_annotations": "integer",
+ "organization": "integer",
+ "overlap_cohort_percentage": "integer",
+ "parsed_label_config": None,
+ "pinned_at": "datetime",
+ "queue_done": "integer",
+ "queue_total": "integer",
+ "reveal_preannotations_interactively": None,
+ "sampling": None,
+ "show_annotation_history": None,
+ "show_collab_predictions": None,
+ "show_ground_truth_first": None,
+ "show_instruction": None,
+ "show_overlap_first": None,
+ "show_skip_button": None,
+ "skip_queue": None,
+ "skipped_annotations_number": "integer",
+ "start_training_on_annotation_update": None,
+ "task_data_login": None,
+ "task_data_password": None,
+ "task_number": "integer",
+ "title": None,
+ "total_annotations_number": "integer",
+ "total_predictions_number": "integer",
+ "useful_annotation_number": "integer",
+ }
+ response = client.workspaces.projects.add(id=1)
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.workspaces.projects.add(id=1)
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_remove(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ # Type ignore to avoid mypy complaining about the function not being meant to return a value
+ assert (
+ client.workspaces.projects.remove(id=1) # type: ignore[func-returns-value]
+ is None
+ )
+
+ assert (
+ await async_client.workspaces.projects.remove(id=1) # type: ignore[func-returns-value]
+ is None
+ )
From 895ceb9c8db1fd30bd3dc145986eaab4462a149f Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Fri, 3 Oct 2025 17:27:44 +0000
Subject: [PATCH 02/11] SDK regeneration
---
.mock/definition/projects/members.yml | 11 +-
.mock/openapi/openapi.yaml | 10 +-
pyproject.toml | 2 +-
reference.md | 84 -----------
.../projects/members/client.py | 131 +-----------------
tests/projects/test_members.py | 83 -----------
6 files changed, 9 insertions(+), 312 deletions(-)
diff --git a/.mock/definition/projects/members.yml b/.mock/definition/projects/members.yml
index 6171fe18a..911bfa1cd 100644
--- a/.mock/definition/projects/members.yml
+++ b/.mock/definition/projects/members.yml
@@ -9,14 +9,11 @@ service:
method: GET
auth: true
docs: >-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
Retrieve the members for a specific project. Optionally filter by user
IDs (comma-separated).
+
+
+ Does NOT include annotators. Deprecated; use paginated endpoint.
source:
openapi: openapi/openapi.yaml
path-parameters:
@@ -77,7 +74,7 @@ service:
phone: phone
username: username
audiences:
- - public
+ - internal
add:
path: /api/projects/{id}/members/
method: POST
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index 2bf1e131a..262898cf0 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -8254,13 +8254,9 @@ paths:
x-fern-sdk-method-name: remove
get:
description: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated).
+
+ Does NOT include annotators. Deprecated; use paginated endpoint.
operationId: api_projects_members_retrieve
parameters:
- in: path
@@ -8288,7 +8284,7 @@ paths:
tags:
- Projects
x-fern-audiences:
- - public
+ - internal
x-fern-sdk-group-name:
- projects
- members
diff --git a/pyproject.toml b/pyproject.toml
index 752b19af4..5a8ae116b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,7 +3,7 @@ name = "label-studio-sdk"
[tool.poetry]
name = "label-studio-sdk"
-version = "2.0.11"
+version = "2.0.12"
description = ""
readme = "README.md"
authors = []
diff --git a/reference.md b/reference.md
index 4b64ef18d..fa6344498 100644
--- a/reference.md
+++ b/reference.md
@@ -30891,90 +30891,6 @@ client.projects.exports.convert(
## Projects Members
-client.projects.members.get(...)
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated).
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from label_studio_sdk import LabelStudio
-
-client = LabelStudio(
- api_key="YOUR_API_KEY",
-)
-client.projects.members.get(
- id=1,
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**id:** `int`
-
-
-
-
-
--
-
-**user_ids:** `typing.Optional[str]` — Comma-separated list of user IDs to include. Example: user_ids=1,2,3
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
-
-
-
-
client.projects.members.add(...)
-
diff --git a/src/label_studio_sdk/projects/members/client.py b/src/label_studio_sdk/projects/members/client.py
index f0be02095..2d0ee38b5 100644
--- a/src/label_studio_sdk/projects/members/client.py
+++ b/src/label_studio_sdk/projects/members/client.py
@@ -5,12 +5,11 @@
from .bulk.client import BulkClient
from .paginated.client import PaginatedClient
from ...core.request_options import RequestOptions
-from ...types.lse_user import LseUser
+from ...types.project_member import ProjectMember
from ...core.jsonable_encoder import jsonable_encoder
from ...core.unchecked_base_model import construct_type
from json.decoder import JSONDecodeError
from ...core.api_error import ApiError
-from ...types.project_member import ProjectMember
from ...core.client_wrapper import AsyncClientWrapper
from .bulk.client import AsyncBulkClient
from .paginated.client import AsyncPaginatedClient
@@ -25,66 +24,6 @@ def __init__(self, *, client_wrapper: SyncClientWrapper):
self.bulk = BulkClient(client_wrapper=self._client_wrapper)
self.paginated = PaginatedClient(client_wrapper=self._client_wrapper)
- def get(
- self, id: int, *, user_ids: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
- ) -> typing.List[LseUser]:
- """
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated).
-
- Parameters
- ----------
- id : int
-
- user_ids : typing.Optional[str]
- Comma-separated list of user IDs to include. Example: user_ids=1,2,3
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- typing.List[LseUser]
- List of users with membership information
-
- Examples
- --------
- from label_studio_sdk import LabelStudio
-
- client = LabelStudio(
- api_key="YOUR_API_KEY",
- )
- client.projects.members.get(
- id=1,
- )
- """
- _response = self._client_wrapper.httpx_client.request(
- f"api/projects/{jsonable_encoder(id)}/members/",
- method="GET",
- params={
- "user_ids": user_ids,
- },
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- return typing.cast(
- typing.List[LseUser],
- construct_type(
- type_=typing.List[LseUser], # type: ignore
- object_=_response.json(),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, body=_response.text)
- raise ApiError(status_code=_response.status_code, body=_response_json)
-
def add(self, id: int, *, user: int, request_options: typing.Optional[RequestOptions] = None) -> ProjectMember:
"""
@@ -199,74 +138,6 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper):
self.bulk = AsyncBulkClient(client_wrapper=self._client_wrapper)
self.paginated = AsyncPaginatedClient(client_wrapper=self._client_wrapper)
- async def get(
- self, id: int, *, user_ids: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
- ) -> typing.List[LseUser]:
- """
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated).
-
- Parameters
- ----------
- id : int
-
- user_ids : typing.Optional[str]
- Comma-separated list of user IDs to include. Example: user_ids=1,2,3
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- typing.List[LseUser]
- List of users with membership information
-
- Examples
- --------
- import asyncio
-
- from label_studio_sdk import AsyncLabelStudio
-
- client = AsyncLabelStudio(
- api_key="YOUR_API_KEY",
- )
-
-
- async def main() -> None:
- await client.projects.members.get(
- id=1,
- )
-
-
- asyncio.run(main())
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"api/projects/{jsonable_encoder(id)}/members/",
- method="GET",
- params={
- "user_ids": user_ids,
- },
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- return typing.cast(
- typing.List[LseUser],
- construct_type(
- type_=typing.List[LseUser], # type: ignore
- object_=_response.json(),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, body=_response.text)
- raise ApiError(status_code=_response.status_code, body=_response_json)
-
async def add(
self, id: int, *, user: int, request_options: typing.Optional[RequestOptions] = None
) -> ProjectMember:
diff --git a/tests/projects/test_members.py b/tests/projects/test_members.py
index fcaa284f0..f132deae0 100644
--- a/tests/projects/test_members.py
+++ b/tests/projects/test_members.py
@@ -6,89 +6,6 @@
from ..utilities import validate_response
-async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
- expected_response: typing.Any = [
- {
- "active_organization": 1,
- "active_organization_meta": "active_organization_meta",
- "allow_newsletters": True,
- "avatar": "avatar",
- "custom_hotkeys": {"key": "value"},
- "date_joined": "2024-01-15T09:30:00Z",
- "email": "email",
- "first_name": "first_name",
- "id": 1,
- "initials": "initials",
- "last_activity": "2024-01-15T09:30:00Z",
- "last_name": "last_name",
- "lse_fields": {
- "email_notification_settings": "email_notification_settings",
- "invite_activated": True,
- "invite_expired": "invite_expired",
- "invite_expired_at": "invite_expired_at",
- "invited_at": "2024-01-15T09:30:00Z",
- "invited_by": 1,
- "onboarding_state": "not_started",
- "social_auth_finished": True,
- "trial_company": "trial_company",
- "trial_experience_labeling": "trial_experience_labeling",
- "trial_license_enterprise": True,
- "trial_models_in_production": "trial_models_in_production",
- "trial_role": "annotator",
- },
- "org_membership": [{"active": "active", "organization_id": 1, "role": "role"}],
- "organization_membership": {"active": "active", "organization_id": 1, "role": "role"},
- "pause": "pause",
- "phone": "phone",
- "username": "username",
- }
- ]
- expected_types: typing.Tuple[typing.Any, typing.Any] = (
- "list",
- {
- 0: {
- "active_organization": "integer",
- "active_organization_meta": None,
- "allow_newsletters": None,
- "avatar": None,
- "custom_hotkeys": None,
- "date_joined": "datetime",
- "email": None,
- "first_name": None,
- "id": "integer",
- "initials": None,
- "last_activity": "datetime",
- "last_name": None,
- "lse_fields": {
- "email_notification_settings": None,
- "invite_activated": None,
- "invite_expired": None,
- "invite_expired_at": None,
- "invited_at": "datetime",
- "invited_by": "integer",
- "onboarding_state": None,
- "social_auth_finished": None,
- "trial_company": None,
- "trial_experience_labeling": None,
- "trial_license_enterprise": None,
- "trial_models_in_production": None,
- "trial_role": None,
- },
- "org_membership": ("list", {0: {"active": None, "organization_id": "integer", "role": None}}),
- "organization_membership": {"active": None, "organization_id": "integer", "role": None},
- "pause": None,
- "phone": None,
- "username": None,
- }
- },
- )
- response = client.projects.members.get(id=1)
- validate_response(response, expected_response, expected_types)
-
- async_response = await async_client.projects.members.get(id=1)
- validate_response(async_response, expected_response, expected_types)
-
-
async def test_add(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
expected_response: typing.Any = {"user": 1}
expected_types: typing.Any = {"user": "integer"}
From dfee97fc42f4331e2178c2de574ee39c66da4437 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Fri, 3 Oct 2025 17:40:09 +0000
Subject: [PATCH 03/11] SDK regeneration
---
.mock/definition/projects/stats.yml | 122 +++++
.mock/definition/stats.yml | 132 ------
.mock/openapi/openapi.yaml | 57 ++-
reference.md | 291 +++++++++++-
src/label_studio_sdk/projects/__init__.py | 6 +
src/label_studio_sdk/projects/client.py | 8 +-
.../projects/stats/__init__.py | 6 +
src/label_studio_sdk/projects/stats/client.py | 415 +++++++++++++++++-
.../projects/stats/types/__init__.py | 6 +
...el_version_annotator_agreement_response.py | 19 +
...version_ground_truth_agreement_response.py | 19 +
...l_version_prediction_agreement_response.py | 19 +
tests/projects/test_stats.py | 36 ++
13 files changed, 974 insertions(+), 162 deletions(-)
delete mode 100644 .mock/definition/stats.yml
create mode 100644 src/label_studio_sdk/projects/stats/types/stats_model_version_annotator_agreement_response.py
create mode 100644 src/label_studio_sdk/projects/stats/types/stats_model_version_ground_truth_agreement_response.py
create mode 100644 src/label_studio_sdk/projects/stats/types/stats_model_version_prediction_agreement_response.py
diff --git a/.mock/definition/projects/stats.yml b/.mock/definition/projects/stats.yml
index 749bdfcc3..3b8c9c173 100644
--- a/.mock/definition/projects/stats.yml
+++ b/.mock/definition/projects/stats.yml
@@ -1,4 +1,19 @@
types:
+ StatsModelVersionAnnotatorAgreementResponse:
+ properties:
+ agreement: optional
+ source:
+ openapi: openapi/openapi.yaml
+ StatsModelVersionGroundTruthAgreementResponse:
+ properties:
+ agreement: optional
+ source:
+ openapi: openapi/openapi.yaml
+ StatsModelVersionPredictionAgreementResponse:
+ properties:
+ average_prediction_agreement_per_model: optional
+ source:
+ openapi: openapi/openapi.yaml
StatsIaaResponseIaa:
discriminated: false
docs: >-
@@ -216,6 +231,113 @@ service:
auth: false
base-path: ''
endpoints:
+ model_version_annotator_agreement:
+ path: /api/projects/{id}/model-stats/{model_version}/agreement
+ method: GET
+ auth: true
+ docs: >-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all annotators in the
+ project for overlapping tasks.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ model_version: string
+ display-name: Get model-version overall agreement vs annotators
+ response:
+ docs: Model-version overall agreement vs annotators
+ type: StatsModelVersionAnnotatorAgreementResponse
+ examples:
+ - path-parameters:
+ id: 1
+ model_version: model_version
+ response:
+ body:
+ agreement: 1.1
+ audiences:
+ - public
+ model_version_ground_truth_agreement:
+ path: /api/projects/{id}/model-stats/{model_version}/agreement-groundtruth
+ method: GET
+ auth: true
+ docs: >-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and ground truth annotations
+ in the project for overlapping tasks.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ model_version: string
+ display-name: Get model-version ground truth agreement
+ request:
+ name: StatsModelVersionGroundTruthAgreementRequest
+ query-parameters:
+ per_label:
+ type: optional
+ default: false
+ docs: Calculate agreement per label
+ response:
+ docs: Model-version ground truth agreement
+ type: StatsModelVersionGroundTruthAgreementResponse
+ examples:
+ - path-parameters:
+ id: 1
+ model_version: model_version
+ response:
+ body:
+ agreement: 1.1
+ audiences:
+ - public
+ model_version_prediction_agreement:
+ path: /api/projects/{id}/model-stats/{model_version}/prediction
+ method: GET
+ auth: true
+ docs: >-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all other model versions
+ in the project for overlapping tasks.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ model_version: string
+ display-name: Get model-version prediction agreement
+ request:
+ name: StatsModelVersionPredictionAgreementRequest
+ query-parameters:
+ per_label:
+ type: optional
+ default: false
+ docs: Calculate agreement per label
+ response:
+ docs: Model-version prediction agreement
+ type: StatsModelVersionPredictionAgreementResponse
+ examples:
+ - path-parameters:
+ id: 1
+ model_version: model_version
+ response:
+ body:
+ average_prediction_agreement_per_model: 1.1
+ audiences:
+ - public
iaa:
path: /api/projects/{id}/stats/IAA
method: GET
diff --git a/.mock/definition/stats.yml b/.mock/definition/stats.yml
deleted file mode 100644
index 6c150e67c..000000000
--- a/.mock/definition/stats.yml
+++ /dev/null
@@ -1,132 +0,0 @@
-types:
- ApiProjectsModelStatsAgreementRetrieveResponse:
- properties:
- agreement: optional
- source:
- openapi: openapi/openapi.yaml
- ApiProjectsModelStatsAgreementGroundtruthRetrieveResponse:
- properties:
- agreement: optional
- source:
- openapi: openapi/openapi.yaml
- ApiProjectsModelStatsPredictionRetrieveResponse:
- properties:
- average_prediction_agreement_per_model: optional
- source:
- openapi: openapi/openapi.yaml
-service:
- auth: false
- base-path: ''
- endpoints:
- api_projects_model_stats_agreement_retrieve:
- path: /api/projects/{id}/model-stats/{model_version}/agreement
- method: GET
- auth: true
- docs: >-
- Overall agreement between a given model version's predictions and all
- annotators on overlapping tasks.
-
- Computed as the average of per-annotator agreement vs this model version
- over annotators who overlap on at least one task.
-
- Mirrors IAA per annotator, but one side is the model.
-
- :return: {"agreement": float[0..1]}
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- model_version: string
- display-name: Get model-version overall agreement vs annotators
- response:
- docs: Model-version overall agreement vs annotators
- type: ApiProjectsModelStatsAgreementRetrieveResponse
- examples:
- - path-parameters:
- id: 1
- model_version: model_version
- response:
- body:
- agreement: 1.1
- api_projects_model_stats_agreement_groundtruth_retrieve:
- path: /api/projects/{id}/model-stats/{model_version}/agreement-groundtruth
- method: GET
- auth: true
- docs: >-
- Ground truth agreement for annotations that match predictions of a
- specific model version.
-
- This mirrors gt_per_user_agreement but filters stats by tasks where
- predictions have given model_version.
-
- :return: {"agreement": float[0..1]}
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- model_version: string
- display-name: Get model-version ground truth agreement
- request:
- name: ApiProjectsModelStatsAgreementGroundtruthRetrieveRequest
- query-parameters:
- per_label:
- type: optional
- default: false
- docs: Calculate agreement per label
- response:
- docs: Model-version ground truth agreement
- type: ApiProjectsModelStatsAgreementGroundtruthRetrieveResponse
- examples:
- - path-parameters:
- id: 1
- model_version: model_version
- response:
- body:
- agreement: 1.1
- api_projects_model_stats_prediction_retrieve:
- path: /api/projects/{id}/model-stats/{model_version}/prediction
- method: GET
- auth: true
- docs: >-
- Mean agreement between the given model version and all other model
- versions in the project.
-
-
- Computed as the average of pairwise model-to-model agreement scores from
- PredictionPairStats where either
-
- prediction pair's model_version_from or model_version_to equals the
- provided model_version.
-
-
- When per_label=true, returns a mapping of label -> average agreement
- across the same set of pairs.
-
-
- :return: {"average_prediction_agreement_per_model": float[0..1] |
- {label: float[0..1]}}
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- model_version: string
- display-name: Get model-version prediction agreement
- request:
- name: ApiProjectsModelStatsPredictionRetrieveRequest
- query-parameters:
- per_label:
- type: optional
- default: false
- docs: Calculate agreement per label
- response:
- docs: Model-version prediction agreement
- type: ApiProjectsModelStatsPredictionRetrieveResponse
- examples:
- - path-parameters:
- id: 1
- model_version: model_version
- response:
- body:
- average_prediction_agreement_per_model: 1.1
- source:
- openapi: openapi/openapi.yaml
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index 262898cf0..d5773eff1 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -8595,10 +8595,13 @@ paths:
/api/projects/{id}/model-stats/{model_version}/agreement:
get:
description: |-
- Overall agreement between a given model version's predictions and all annotators on overlapping tasks.
- Computed as the average of per-annotator agreement vs this model version over annotators who overlap on at least one task.
- Mirrors IAA per annotator, but one side is the model.
- :return: {"agreement": float[0..1]}
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all annotators in the project for overlapping tasks.
operationId: api_projects_model_stats_agreement_retrieve
parameters:
- in: path
@@ -8618,6 +8621,7 @@ paths:
schema:
properties:
agreement:
+ nullable: true
type: number
type: object
description: Model-version overall agreement vs annotators
@@ -8626,12 +8630,22 @@ paths:
summary: Get model-version overall agreement vs annotators
tags:
- Stats
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - stats
+ x-fern-sdk-method-name: model_version_annotator_agreement
/api/projects/{id}/model-stats/{model_version}/agreement-groundtruth:
get:
description: |-
- Ground truth agreement for annotations that match predictions of a specific model version.
- This mirrors gt_per_user_agreement but filters stats by tasks where predictions have given model_version.
- :return: {"agreement": float[0..1]}
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and ground truth annotations in the project for overlapping tasks.
operationId: api_projects_model_stats_agreement_groundtruth_retrieve
parameters:
- in: path
@@ -8657,6 +8671,7 @@ paths:
schema:
properties:
agreement:
+ nullable: true
type: number
type: object
description: Model-version ground truth agreement
@@ -8665,17 +8680,22 @@ paths:
summary: Get model-version ground truth agreement
tags:
- Stats
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - stats
+ x-fern-sdk-method-name: model_version_ground_truth_agreement
/api/projects/{id}/model-stats/{model_version}/prediction:
get:
description: |-
- Mean agreement between the given model version and all other model versions in the project.
-
- Computed as the average of pairwise model-to-model agreement scores from PredictionPairStats where either
- prediction pair's model_version_from or model_version_to equals the provided model_version.
-
- When per_label=true, returns a mapping of label -> average agreement across the same set of pairs.
-
- :return: {"average_prediction_agreement_per_model": float[0..1] | {label: float[0..1]}}
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all other model versions in the project for overlapping tasks.
operationId: api_projects_model_stats_prediction_retrieve
parameters:
- in: path
@@ -8701,6 +8721,7 @@ paths:
schema:
properties:
average_prediction_agreement_per_model:
+ nullable: true
type: number
type: object
description: Model-version prediction agreement
@@ -8709,6 +8730,12 @@ paths:
summary: Get model-version prediction agreement
tags:
- Stats
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - stats
+ x-fern-sdk-method-name: model_version_prediction_agreement
/api/projects/{id}/project-extra-params/:
get:
description: |-
diff --git a/reference.md b/reference.md
index fa6344498..f6d120a9d 100644
--- a/reference.md
+++ b/reference.md
@@ -31237,8 +31237,8 @@ client.projects.metrics.update(
-## Projects AnnotatorWeights
-client.projects.annotator_weights.get(...)
+## Projects Stats
+client.projects.stats.model_version_annotator_agreement(...)
-
@@ -31256,7 +31256,7 @@ client.projects.metrics.update(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
+Get agreement between a given model version and all annotators in the project for overlapping tasks.
@@ -31276,8 +31276,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.annotator_weights.get(
+client.projects.stats.model_version_annotator_agreement(
id=1,
+ model_version="model_version",
)
```
@@ -31302,6 +31303,14 @@ client.projects.annotator_weights.get(
-
+**model_version:** `str`
+
+
+
+
+
+-
+
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -31314,7 +31323,7 @@ client.projects.annotator_weights.get(
-client.projects.annotator_weights.create(...)
+client.projects.stats.model_version_ground_truth_agreement(...)
-
@@ -31332,7 +31341,7 @@ client.projects.annotator_weights.get(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
+Get agreement between a given model version and ground truth annotations in the project for overlapping tasks.
@@ -31352,8 +31361,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.projects.annotator_weights.create(
+client.projects.stats.model_version_ground_truth_agreement(
id=1,
+ model_version="model_version",
)
```
@@ -31378,7 +31388,7 @@ client.projects.annotator_weights.create(
-
-**annotator_params:** `typing.Optional[typing.Optional[typing.Any]]`
+**model_version:** `str`
@@ -31386,7 +31396,100 @@ client.projects.annotator_weights.create(
-
-**use_kappa:** `typing.Optional[bool]` — If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
+**per_label:** `typing.Optional[bool]` — Calculate agreement per label
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.projects.stats.model_version_prediction_agreement(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Get agreement between a given model version and all other model versions in the project for overlapping tasks.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.projects.stats.model_version_prediction_agreement(
+ id=1,
+ model_version="model_version",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**model_version:** `str`
+
+
+
+
+
+-
+
+**per_label:** `typing.Optional[bool]` — Calculate agreement per label
@@ -31406,7 +31509,6 @@ client.projects.annotator_weights.create(
-## Projects Stats
client.projects.stats.iaa(...)
-
@@ -32257,6 +32359,175 @@ client.projects.stats.user_ground_truth_agreement(
+
+
+
+
+## Projects AnnotatorWeights
+client.projects.annotator_weights.get(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.projects.annotator_weights.get(
+ id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.projects.annotator_weights.create(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.projects.annotator_weights.create(
+ id=1,
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**annotator_params:** `typing.Optional[typing.Optional[typing.Any]]`
+
+
+
+
+
+-
+
+**use_kappa:** `typing.Optional[bool]` — If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
diff --git a/src/label_studio_sdk/projects/__init__.py b/src/label_studio_sdk/projects/__init__.py
index 6a1dfa442..7101bd0f3 100644
--- a/src/label_studio_sdk/projects/__init__.py
+++ b/src/label_studio_sdk/projects/__init__.py
@@ -39,6 +39,9 @@
StatsIaaResponseStd,
StatsLeadTimeResponse,
StatsLeadTimeResponseLeadTimeStatsItem,
+ StatsModelVersionAnnotatorAgreementResponse,
+ StatsModelVersionGroundTruthAgreementResponse,
+ StatsModelVersionPredictionAgreementResponse,
StatsTotalAgreementResponse,
StatsTotalAgreementResponseOne,
StatsTotalAgreementResponseZero,
@@ -85,6 +88,9 @@
"StatsIaaResponseStd",
"StatsLeadTimeResponse",
"StatsLeadTimeResponseLeadTimeStatsItem",
+ "StatsModelVersionAnnotatorAgreementResponse",
+ "StatsModelVersionGroundTruthAgreementResponse",
+ "StatsModelVersionPredictionAgreementResponse",
"StatsTotalAgreementResponse",
"StatsTotalAgreementResponseOne",
"StatsTotalAgreementResponseZero",
diff --git a/src/label_studio_sdk/projects/client.py b/src/label_studio_sdk/projects/client.py
index 20dc61708..8d3686ded 100644
--- a/src/label_studio_sdk/projects/client.py
+++ b/src/label_studio_sdk/projects/client.py
@@ -6,8 +6,8 @@
from .exports.client import ExportsClient
from .members.client import MembersClient
from .metrics.client import MetricsClient
-from .annotator_weights.client import AnnotatorWeightsClient
from .stats.client import StatsClient
+from .annotator_weights.client import AnnotatorWeightsClient
from .assignments.client import AssignmentsClient
from .pauses.client import PausesClient
from ..core.request_options import RequestOptions
@@ -45,8 +45,8 @@
from .exports.client import AsyncExportsClient
from .members.client import AsyncMembersClient
from .metrics.client import AsyncMetricsClient
-from .annotator_weights.client import AsyncAnnotatorWeightsClient
from .stats.client import AsyncStatsClient
+from .annotator_weights.client import AsyncAnnotatorWeightsClient
from .assignments.client import AsyncAssignmentsClient
from .pauses.client import AsyncPausesClient
from ..core.pagination import AsyncPager
@@ -62,8 +62,8 @@ def __init__(self, *, client_wrapper: SyncClientWrapper):
self.exports = ExportsClient(client_wrapper=self._client_wrapper)
self.members = MembersClient(client_wrapper=self._client_wrapper)
self.metrics = MetricsClient(client_wrapper=self._client_wrapper)
- self.annotator_weights = AnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.stats = StatsClient(client_wrapper=self._client_wrapper)
+ self.annotator_weights = AnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.assignments = AssignmentsClient(client_wrapper=self._client_wrapper)
self.pauses = PausesClient(client_wrapper=self._client_wrapper)
@@ -1245,8 +1245,8 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper):
self.exports = AsyncExportsClient(client_wrapper=self._client_wrapper)
self.members = AsyncMembersClient(client_wrapper=self._client_wrapper)
self.metrics = AsyncMetricsClient(client_wrapper=self._client_wrapper)
- self.annotator_weights = AsyncAnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.stats = AsyncStatsClient(client_wrapper=self._client_wrapper)
+ self.annotator_weights = AsyncAnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.assignments = AsyncAssignmentsClient(client_wrapper=self._client_wrapper)
self.pauses = AsyncPausesClient(client_wrapper=self._client_wrapper)
diff --git a/src/label_studio_sdk/projects/stats/__init__.py b/src/label_studio_sdk/projects/stats/__init__.py
index 0cb78a0d6..d9f08c12b 100644
--- a/src/label_studio_sdk/projects/stats/__init__.py
+++ b/src/label_studio_sdk/projects/stats/__init__.py
@@ -12,6 +12,9 @@
StatsIaaResponseStd,
StatsLeadTimeResponse,
StatsLeadTimeResponseLeadTimeStatsItem,
+ StatsModelVersionAnnotatorAgreementResponse,
+ StatsModelVersionGroundTruthAgreementResponse,
+ StatsModelVersionPredictionAgreementResponse,
StatsTotalAgreementResponse,
StatsTotalAgreementResponseOne,
StatsTotalAgreementResponseZero,
@@ -36,6 +39,9 @@
"StatsIaaResponseStd",
"StatsLeadTimeResponse",
"StatsLeadTimeResponseLeadTimeStatsItem",
+ "StatsModelVersionAnnotatorAgreementResponse",
+ "StatsModelVersionGroundTruthAgreementResponse",
+ "StatsModelVersionPredictionAgreementResponse",
"StatsTotalAgreementResponse",
"StatsTotalAgreementResponseOne",
"StatsTotalAgreementResponseZero",
diff --git a/src/label_studio_sdk/projects/stats/client.py b/src/label_studio_sdk/projects/stats/client.py
index 46c609673..b2cf17a2b 100644
--- a/src/label_studio_sdk/projects/stats/client.py
+++ b/src/label_studio_sdk/projects/stats/client.py
@@ -3,11 +3,14 @@
from ...core.client_wrapper import SyncClientWrapper
import typing
from ...core.request_options import RequestOptions
-from .types.stats_iaa_response import StatsIaaResponse
+from .types.stats_model_version_annotator_agreement_response import StatsModelVersionAnnotatorAgreementResponse
from ...core.jsonable_encoder import jsonable_encoder
from ...core.unchecked_base_model import construct_type
from json.decoder import JSONDecodeError
from ...core.api_error import ApiError
+from .types.stats_model_version_ground_truth_agreement_response import StatsModelVersionGroundTruthAgreementResponse
+from .types.stats_model_version_prediction_agreement_response import StatsModelVersionPredictionAgreementResponse
+from .types.stats_iaa_response import StatsIaaResponse
from .types.stats_agreement_annotator_response import StatsAgreementAnnotatorResponse
from .types.stats_data_filters_response import StatsDataFiltersResponse
from .types.stats_finished_tasks_response import StatsFinishedTasksResponse
@@ -23,6 +26,199 @@ class StatsClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
self._client_wrapper = client_wrapper
+ def model_version_annotator_agreement(
+ self, id: int, model_version: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> StatsModelVersionAnnotatorAgreementResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all annotators in the project for overlapping tasks.
+
+ Parameters
+ ----------
+ id : int
+
+ model_version : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsModelVersionAnnotatorAgreementResponse
+ Model-version overall agreement vs annotators
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.stats.model_version_annotator_agreement(
+ id=1,
+ model_version="model_version",
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/model-stats/{jsonable_encoder(model_version)}/agreement",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsModelVersionAnnotatorAgreementResponse,
+ construct_type(
+ type_=StatsModelVersionAnnotatorAgreementResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def model_version_ground_truth_agreement(
+ self,
+ id: int,
+ model_version: str,
+ *,
+ per_label: typing.Optional[bool] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> StatsModelVersionGroundTruthAgreementResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and ground truth annotations in the project for overlapping tasks.
+
+ Parameters
+ ----------
+ id : int
+
+ model_version : str
+
+ per_label : typing.Optional[bool]
+ Calculate agreement per label
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsModelVersionGroundTruthAgreementResponse
+ Model-version ground truth agreement
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.stats.model_version_ground_truth_agreement(
+ id=1,
+ model_version="model_version",
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/model-stats/{jsonable_encoder(model_version)}/agreement-groundtruth",
+ method="GET",
+ params={
+ "per_label": per_label,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsModelVersionGroundTruthAgreementResponse,
+ construct_type(
+ type_=StatsModelVersionGroundTruthAgreementResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ def model_version_prediction_agreement(
+ self,
+ id: int,
+ model_version: str,
+ *,
+ per_label: typing.Optional[bool] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> StatsModelVersionPredictionAgreementResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all other model versions in the project for overlapping tasks.
+
+ Parameters
+ ----------
+ id : int
+
+ model_version : str
+
+ per_label : typing.Optional[bool]
+ Calculate agreement per label
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsModelVersionPredictionAgreementResponse
+ Model-version prediction agreement
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.stats.model_version_prediction_agreement(
+ id=1,
+ model_version="model_version",
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/model-stats/{jsonable_encoder(model_version)}/prediction",
+ method="GET",
+ params={
+ "per_label": per_label,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsModelVersionPredictionAgreementResponse,
+ construct_type(
+ type_=StatsModelVersionPredictionAgreementResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
def iaa(
self,
id: int,
@@ -640,6 +836,223 @@ class AsyncStatsClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
self._client_wrapper = client_wrapper
+ async def model_version_annotator_agreement(
+ self, id: int, model_version: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> StatsModelVersionAnnotatorAgreementResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all annotators in the project for overlapping tasks.
+
+ Parameters
+ ----------
+ id : int
+
+ model_version : str
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsModelVersionAnnotatorAgreementResponse
+ Model-version overall agreement vs annotators
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.stats.model_version_annotator_agreement(
+ id=1,
+ model_version="model_version",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/model-stats/{jsonable_encoder(model_version)}/agreement",
+ method="GET",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsModelVersionAnnotatorAgreementResponse,
+ construct_type(
+ type_=StatsModelVersionAnnotatorAgreementResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def model_version_ground_truth_agreement(
+ self,
+ id: int,
+ model_version: str,
+ *,
+ per_label: typing.Optional[bool] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> StatsModelVersionGroundTruthAgreementResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and ground truth annotations in the project for overlapping tasks.
+
+ Parameters
+ ----------
+ id : int
+
+ model_version : str
+
+ per_label : typing.Optional[bool]
+ Calculate agreement per label
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsModelVersionGroundTruthAgreementResponse
+ Model-version ground truth agreement
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.stats.model_version_ground_truth_agreement(
+ id=1,
+ model_version="model_version",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/model-stats/{jsonable_encoder(model_version)}/agreement-groundtruth",
+ method="GET",
+ params={
+ "per_label": per_label,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsModelVersionGroundTruthAgreementResponse,
+ construct_type(
+ type_=StatsModelVersionGroundTruthAgreementResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+ async def model_version_prediction_agreement(
+ self,
+ id: int,
+ model_version: str,
+ *,
+ per_label: typing.Optional[bool] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> StatsModelVersionPredictionAgreementResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement between a given model version and all other model versions in the project for overlapping tasks.
+
+ Parameters
+ ----------
+ id : int
+
+ model_version : str
+
+ per_label : typing.Optional[bool]
+ Calculate agreement per label
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsModelVersionPredictionAgreementResponse
+ Model-version prediction agreement
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.stats.model_version_prediction_agreement(
+ id=1,
+ model_version="model_version",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/model-stats/{jsonable_encoder(model_version)}/prediction",
+ method="GET",
+ params={
+ "per_label": per_label,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsModelVersionPredictionAgreementResponse,
+ construct_type(
+ type_=StatsModelVersionPredictionAgreementResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
async def iaa(
self,
id: int,
diff --git a/src/label_studio_sdk/projects/stats/types/__init__.py b/src/label_studio_sdk/projects/stats/types/__init__.py
index 85fe87687..7da9cb7fc 100644
--- a/src/label_studio_sdk/projects/stats/types/__init__.py
+++ b/src/label_studio_sdk/projects/stats/types/__init__.py
@@ -11,6 +11,9 @@
from .stats_iaa_response_std import StatsIaaResponseStd
from .stats_lead_time_response import StatsLeadTimeResponse
from .stats_lead_time_response_lead_time_stats_item import StatsLeadTimeResponseLeadTimeStatsItem
+from .stats_model_version_annotator_agreement_response import StatsModelVersionAnnotatorAgreementResponse
+from .stats_model_version_ground_truth_agreement_response import StatsModelVersionGroundTruthAgreementResponse
+from .stats_model_version_prediction_agreement_response import StatsModelVersionPredictionAgreementResponse
from .stats_total_agreement_response import StatsTotalAgreementResponse
from .stats_total_agreement_response_one import StatsTotalAgreementResponseOne
from .stats_total_agreement_response_zero import StatsTotalAgreementResponseZero
@@ -36,6 +39,9 @@
"StatsIaaResponseStd",
"StatsLeadTimeResponse",
"StatsLeadTimeResponseLeadTimeStatsItem",
+ "StatsModelVersionAnnotatorAgreementResponse",
+ "StatsModelVersionGroundTruthAgreementResponse",
+ "StatsModelVersionPredictionAgreementResponse",
"StatsTotalAgreementResponse",
"StatsTotalAgreementResponseOne",
"StatsTotalAgreementResponseZero",
diff --git a/src/label_studio_sdk/projects/stats/types/stats_model_version_annotator_agreement_response.py b/src/label_studio_sdk/projects/stats/types/stats_model_version_annotator_agreement_response.py
new file mode 100644
index 000000000..5a45f78af
--- /dev/null
+++ b/src/label_studio_sdk/projects/stats/types/stats_model_version_annotator_agreement_response.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ....core.unchecked_base_model import UncheckedBaseModel
+import typing
+from ....core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class StatsModelVersionAnnotatorAgreementResponse(UncheckedBaseModel):
+ agreement: typing.Optional[float] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/projects/stats/types/stats_model_version_ground_truth_agreement_response.py b/src/label_studio_sdk/projects/stats/types/stats_model_version_ground_truth_agreement_response.py
new file mode 100644
index 000000000..ae057d26f
--- /dev/null
+++ b/src/label_studio_sdk/projects/stats/types/stats_model_version_ground_truth_agreement_response.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ....core.unchecked_base_model import UncheckedBaseModel
+import typing
+from ....core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class StatsModelVersionGroundTruthAgreementResponse(UncheckedBaseModel):
+ agreement: typing.Optional[float] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/projects/stats/types/stats_model_version_prediction_agreement_response.py b/src/label_studio_sdk/projects/stats/types/stats_model_version_prediction_agreement_response.py
new file mode 100644
index 000000000..835943204
--- /dev/null
+++ b/src/label_studio_sdk/projects/stats/types/stats_model_version_prediction_agreement_response.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ....core.unchecked_base_model import UncheckedBaseModel
+import typing
+from ....core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class StatsModelVersionPredictionAgreementResponse(UncheckedBaseModel):
+ average_prediction_agreement_per_model: typing.Optional[float] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/tests/projects/test_stats.py b/tests/projects/test_stats.py
index 0a36d76af..cfac44c87 100644
--- a/tests/projects/test_stats.py
+++ b/tests/projects/test_stats.py
@@ -6,6 +6,42 @@
from ..utilities import validate_response
+async def test_model_version_annotator_agreement(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"agreement": 1.1}
+ expected_types: typing.Any = {"agreement": None}
+ response = client.projects.stats.model_version_annotator_agreement(id=1, model_version="model_version")
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.stats.model_version_annotator_agreement(
+ id=1, model_version="model_version"
+ )
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_model_version_ground_truth_agreement(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"agreement": 1.1}
+ expected_types: typing.Any = {"agreement": None}
+ response = client.projects.stats.model_version_ground_truth_agreement(id=1, model_version="model_version")
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.stats.model_version_ground_truth_agreement(
+ id=1, model_version="model_version"
+ )
+ validate_response(async_response, expected_response, expected_types)
+
+
+async def test_model_version_prediction_agreement(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"average_prediction_agreement_per_model": 1.1}
+ expected_types: typing.Any = {"average_prediction_agreement_per_model": None}
+ response = client.projects.stats.model_version_prediction_agreement(id=1, model_version="model_version")
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.stats.model_version_prediction_agreement(
+ id=1, model_version="model_version"
+ )
+ validate_response(async_response, expected_response, expected_types)
+
+
async def test_iaa(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
expected_response: typing.Any = {
"IAA": [[1, 0.5], [0.5, 1]],
From c4e9986b4fa83dd84f4b51ddce4dd981eca71d78 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Fri, 3 Oct 2025 17:54:20 +0000
Subject: [PATCH 04/11] SDK regeneration
---
.mock/definition/projects/annotatorWeights.yml | 9 +++++++--
.mock/openapi/openapi.yaml | 9 +++++++++
reference.md | 2 ++
.../projects/annotator_weights/client.py | 4 ++++
tests/projects/test_annotator_weights.py | 6 ++++--
5 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/.mock/definition/projects/annotatorWeights.yml b/.mock/definition/projects/annotatorWeights.yml
index 0f702a83c..a31be749a 100644
--- a/.mock/definition/projects/annotatorWeights.yml
+++ b/.mock/definition/projects/annotatorWeights.yml
@@ -70,9 +70,14 @@ service:
docs: Annotator weights created/updated
type: root.LseProjectParams
examples:
- - path-parameters:
+ - name: payload format for annotator_params
+ path-parameters:
id: 1
- request: {}
+ request:
+ annotator_params:
+ '123': 1
+ '456': 0.75
+ use_kappa: true
response:
body:
annotator_params:
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index d5773eff1..c03a98cb1 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -8792,6 +8792,15 @@ paths:
requestBody:
content:
application/json:
+ examples:
+ AnnotatorWeightsMapping:
+ description: annotator_params must be a mapping of user_id to weight (0..1).
+ summary: payload format for annotator_params
+ value:
+ annotator_params:
+ 123: 1.0
+ 456: 0.75
+ use_kappa: true
schema:
$ref: '#/components/schemas/LseProjectParamsRequest'
application/x-www-form-urlencoded:
diff --git a/reference.md b/reference.md
index f6d120a9d..da0fc91f1 100644
--- a/reference.md
+++ b/reference.md
@@ -32480,6 +32480,8 @@ client = LabelStudio(
)
client.projects.annotator_weights.create(
id=1,
+ annotator_params={"123": 1, "456": 0.75},
+ use_kappa=True,
)
```
diff --git a/src/label_studio_sdk/projects/annotator_weights/client.py b/src/label_studio_sdk/projects/annotator_weights/client.py
index b7a619f5b..d3f127fec 100644
--- a/src/label_studio_sdk/projects/annotator_weights/client.py
+++ b/src/label_studio_sdk/projects/annotator_weights/client.py
@@ -113,6 +113,8 @@ def create(
)
client.projects.annotator_weights.create(
id=1,
+ annotator_params={"123": 1, "456": 0.75},
+ use_kappa=True,
)
"""
_response = self._client_wrapper.httpx_client.request(
@@ -255,6 +257,8 @@ async def create(
async def main() -> None:
await client.projects.annotator_weights.create(
id=1,
+ annotator_params={"123": 1, "456": 0.75},
+ use_kappa=True,
)
diff --git a/tests/projects/test_annotator_weights.py b/tests/projects/test_annotator_weights.py
index dd3ef91ca..210b9d40a 100644
--- a/tests/projects/test_annotator_weights.py
+++ b/tests/projects/test_annotator_weights.py
@@ -19,8 +19,10 @@ async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
expected_response: typing.Any = {"annotator_params": {"key": "value"}, "use_kappa": True}
expected_types: typing.Any = {"annotator_params": None, "use_kappa": None}
- response = client.projects.annotator_weights.create(id=1)
+ response = client.projects.annotator_weights.create(id=1, annotator_params={"123": 1, "456": 0.75}, use_kappa=True)
validate_response(response, expected_response, expected_types)
- async_response = await async_client.projects.annotator_weights.create(id=1)
+ async_response = await async_client.projects.annotator_weights.create(
+ id=1, annotator_params={"123": 1, "456": 0.75}, use_kappa=True
+ )
validate_response(async_response, expected_response, expected_types)
From ca541952e13872764a7a231c494056c717be11c7 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Wed, 8 Oct 2025 15:46:06 +0000
Subject: [PATCH 05/11] SDK regeneration
---
.mock/definition/__package__.yml | 41 +-
.mock/definition/projects.yml | 12 +-
.mock/definition/projects/stats.yml | 48 +++
.mock/definition/workspaces/projects.yml | 282 +++-----------
.mock/openapi/openapi.yaml | 211 +++++------
poetry.lock | 262 ++++++-------
reference.md | 316 +++++-----------
src/label_studio_sdk/__init__.py | 2 +
src/label_studio_sdk/projects/__init__.py | 2 +
src/label_studio_sdk/projects/client.py | 4 +
.../projects/stats/__init__.py | 2 +
src/label_studio_sdk/projects/stats/client.py | 131 +++++++
.../projects/stats/types/__init__.py | 2 +
.../stats_agreement_annotators_response.py | 22 ++
src/label_studio_sdk/types/__init__.py | 2 +
.../types/all_roles_project_list.py | 6 +-
src/label_studio_sdk/types/lse_project.py | 6 +-
.../types/lse_project_create.py | 6 +-
.../types/lse_project_response.py | 6 +-
.../types/lse_project_update.py | 6 +-
src/label_studio_sdk/types/project.py | 6 +-
.../types/workspace_projects.py | 19 +
src/label_studio_sdk/workspaces/__init__.py | 3 +-
.../workspaces/projects/__init__.py | 3 -
.../workspaces/projects/client.py | 352 ++----------------
.../workspaces/projects/types/__init__.py | 6 -
.../types/project_request_sampling.py | 7 -
.../types/project_request_skip_queue.py | 7 -
tests/projects/test_stats.py | 10 +
tests/workspaces/test_projects.py | 311 ++++++----------
30 files changed, 841 insertions(+), 1252 deletions(-)
create mode 100644 src/label_studio_sdk/projects/stats/types/stats_agreement_annotators_response.py
create mode 100644 src/label_studio_sdk/types/workspace_projects.py
delete mode 100644 src/label_studio_sdk/workspaces/projects/types/__init__.py
delete mode 100644 src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py
delete mode 100644 src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py
diff --git a/.mock/definition/__package__.yml b/.mock/definition/__package__.yml
index 590d6ae30..b06154b43 100644
--- a/.mock/definition/__package__.yml
+++ b/.mock/definition/__package__.yml
@@ -318,7 +318,11 @@ types:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the labeling
+ stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
@@ -3846,7 +3850,11 @@ types:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the labeling
+ stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
@@ -4037,7 +4045,11 @@ types:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the labeling
+ stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
@@ -4258,7 +4270,11 @@ types:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the labeling
+ stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
@@ -4442,7 +4458,11 @@ types:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the labeling
+ stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
@@ -6474,7 +6494,11 @@ types:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the labeling
+ stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
@@ -8412,3 +8436,8 @@ types:
docs: Workspace ID
source:
openapi: openapi/openapi.yaml
+ WorkspaceProjects:
+ properties:
+ project: integer
+ source:
+ openapi: openapi/openapi.yaml
diff --git a/.mock/definition/projects.yml b/.mock/definition/projects.yml
index 3818022eb..78bf0f61e 100644
--- a/.mock/definition/projects.yml
+++ b/.mock/definition/projects.yml
@@ -235,7 +235,11 @@ service:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the
+ labeling stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
@@ -682,7 +686,11 @@ service:
show_collab_predictions:
type: optional
docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
+ show_ground_truth_first:
+ type: optional
+ docs: >-
+ Onboarding mode (true): show ground truth tasks first in the
+ labeling stream
show_instruction:
type: optional
docs: Show instructions to the annotator before they start
diff --git a/.mock/definition/projects/stats.yml b/.mock/definition/projects/stats.yml
index 3b8c9c173..600f92a50 100644
--- a/.mock/definition/projects/stats.yml
+++ b/.mock/definition/projects/stats.yml
@@ -83,6 +83,15 @@ types:
docs: Agreement score for the annotator (0-1)
source:
openapi: openapi/openapi.yaml
+ StatsAgreementAnnotatorsResponse:
+ properties:
+ agreement:
+ type: map
+ docs: >-
+ Mapping of annotator ID to their agreement score (0-1) or null if no
+ data
+ source:
+ openapi: openapi/openapi.yaml
StatsDataFiltersResponseUserFiltersStatsItem:
properties:
id:
@@ -465,6 +474,45 @@ service:
Agreement_per_annotator: 1.1
audiences:
- public
+ agreement_annotators:
+ path: /api/projects/{id}/stats/agreement_annotators
+ method: GET
+ auth: true
+ docs: |-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement statistics for multiple annotators within a project.
+ source:
+ openapi: openapi/openapi.yaml
+ path-parameters:
+ id: integer
+ display-name: Get agreement statistics for multiple annotators
+ request:
+ name: StatsAgreementAnnotatorsRequest
+ query-parameters:
+ ids:
+ type: string
+ docs: >-
+ Comma-separated list of annotator user IDs to get agreement scores
+ for
+ response:
+ docs: Multiple annotator agreement statistics
+ type: StatsAgreementAnnotatorsResponse
+ examples:
+ - path-parameters:
+ id: 1
+ query-parameters:
+ ids: ids
+ response:
+ body:
+ agreement:
+ key: 1.1
+ audiences:
+ - public
data_filters:
path: /api/projects/{id}/stats/data_filter
method: GET
diff --git a/.mock/definition/workspaces/projects.yml b/.mock/definition/workspaces/projects.yml
index 525827387..0d6093dc0 100644
--- a/.mock/definition/workspaces/projects.yml
+++ b/.mock/definition/workspaces/projects.yml
@@ -22,67 +22,67 @@ service:
id: integer
display-name: List workspace projects
response:
- docs: ''
- type: root.Project
+ docs: Projects list
+ type: list
examples:
- path-parameters:
id: 1
response:
body:
- color: color
- config_has_control_tags: true
- config_suitable_for_bulk_annotation: true
- control_weights:
- key: value
- created_at: '2024-01-15T09:30:00Z'
- created_by:
- avatar: avatar
- email: email
- first_name: first_name
+ - color: color
+ config_has_control_tags: true
+ config_suitable_for_bulk_annotation: true
+ control_weights:
+ key: value
+ created_at: '2024-01-15T09:30:00Z'
+ created_by:
+ avatar: avatar
+ email: email
+ first_name: first_name
+ id: 1
+ last_name: last_name
+ description: description
+ enable_empty_annotation: true
+ evaluate_predictions_automatically: true
+ expert_instruction: expert_instruction
+ finished_task_number: 1
+ ground_truth_number: 1
id: 1
- last_name: last_name
- description: description
- enable_empty_annotation: true
- evaluate_predictions_automatically: true
- expert_instruction: expert_instruction
- finished_task_number: 1
- ground_truth_number: 1
- id: 1
- is_draft: true
- is_published: true
- label_config: label_config
- maximum_annotations: 1
- min_annotations_to_start_training: 1
- model_version: model_version
- num_tasks_with_annotations: 1
- organization: 1
- overlap_cohort_percentage: 1
- parsed_label_config:
- key: value
- pinned_at: '2024-01-15T09:30:00Z'
- queue_done: 1
- queue_total: 1
- reveal_preannotations_interactively: true
- sampling: Sequential sampling
- show_annotation_history: true
- show_collab_predictions: true
- show_ground_truth_first: true
- show_instruction: true
- show_overlap_first: true
- show_skip_button: true
- skip_queue: REQUEUE_FOR_ME
- skipped_annotations_number: 1
- start_training_on_annotation_update: true
- task_data_login: task_data_login
- task_data_password: task_data_password
- task_number: 1
- title: title
- total_annotations_number: 1
- total_predictions_number: 1
- useful_annotation_number: 1
+ is_draft: true
+ is_published: true
+ label_config: label_config
+ maximum_annotations: 1
+ min_annotations_to_start_training: 1
+ model_version: model_version
+ num_tasks_with_annotations: 1
+ organization: 1
+ overlap_cohort_percentage: 1
+ parsed_label_config:
+ key: value
+ pinned_at: '2024-01-15T09:30:00Z'
+ queue_done: 1
+ queue_total: 1
+ reveal_preannotations_interactively: true
+ sampling: Sequential sampling
+ show_annotation_history: true
+ show_collab_predictions: true
+ show_ground_truth_first: true
+ show_instruction: true
+ show_overlap_first: true
+ show_skip_button: true
+ skip_queue: REQUEUE_FOR_ME
+ skipped_annotations_number: 1
+ start_training_on_annotation_update: true
+ task_data_login: task_data_login
+ task_data_password: task_data_password
+ task_number: 1
+ title: title
+ total_annotations_number: 1
+ total_predictions_number: 1
+ useful_annotation_number: 1
audiences:
- public
- add:
+ create:
path: /api/workspaces/{id}/projects/
method: POST
auth: true
@@ -100,168 +100,25 @@ service:
id: integer
display-name: Create workspace project
request:
- name: ProjectRequest
+ name: WorkspaceProjectsRequest
body:
properties:
- color:
- type: optional
- validation:
- maxLength: 16
- control_weights: optional
- created_by:
- type: optional
- docs: Project owner
- description:
- type: optional
- docs: Project description
- enable_empty_annotation:
- type: optional
- docs: Allow annotators to submit empty annotations
- evaluate_predictions_automatically:
- type: optional
- docs: Retrieve and display predictions when loading a task
- expert_instruction:
- type: optional
- docs: Labeling instructions in HTML format
- is_draft:
- type: optional
- docs: Whether or not the project is in the middle of being created
- is_published:
- type: optional
- docs: Whether or not the project is published to annotators
- label_config:
- type: optional
- docs: Label config in XML format. See more about it in documentation
- maximum_annotations:
- type: optional
- docs: >-
- Maximum number of annotations for one task. If the number of
- annotations per task is equal or greater to this value, the task
- is completed (is_labeled=True)
- validation:
- min: -2147483648
- max: 2147483647
- min_annotations_to_start_training:
- type: optional
- docs: >-
- Minimum number of completed tasks after which model training is
- started
- validation:
- min: -2147483648
- max: 2147483647
- model_version:
- type: optional
- docs: Machine learning model version
- organization: optional
- overlap_cohort_percentage:
- type: optional
- validation:
- min: -2147483648
- max: 2147483647
- pinned_at:
- type: optional
- docs: Pinned date and time
- reveal_preannotations_interactively:
- type: optional
- docs: Reveal pre-annotations interactively
- sampling: optional
- show_annotation_history:
- type: optional
- docs: Show annotation history to annotator
- show_collab_predictions:
- type: optional
- docs: If set, the annotator can view model predictions
- show_ground_truth_first: optional
- show_instruction:
- type: optional
- docs: Show instructions to the annotator before they start
- show_overlap_first: optional
- show_skip_button:
- type: optional
- docs: >-
- Show a skip button in interface and allow annotators to skip the
- task
- skip_queue: optional
- task_data_login:
- type: optional
- docs: 'Task data credentials: login'
- validation:
- maxLength: 256
- task_data_password:
- type: optional
- docs: 'Task data credentials: password'
- validation:
- maxLength: 256
- title:
- type: optional
- docs: Project name. Must be between 3 and 50 characters long.
- validation:
- minLength: 3
- maxLength: 50
+ project: integer
content-type: application/json
response:
- docs: ''
- type: root.Project
+ docs: Project created
+ type: root.WorkspaceProjects
examples:
- path-parameters:
id: 1
- request: {}
+ request:
+ project: 1
response:
body:
- color: color
- config_has_control_tags: true
- config_suitable_for_bulk_annotation: true
- control_weights:
- key: value
- created_at: '2024-01-15T09:30:00Z'
- created_by:
- avatar: avatar
- email: email
- first_name: first_name
- id: 1
- last_name: last_name
- description: description
- enable_empty_annotation: true
- evaluate_predictions_automatically: true
- expert_instruction: expert_instruction
- finished_task_number: 1
- ground_truth_number: 1
- id: 1
- is_draft: true
- is_published: true
- label_config: label_config
- maximum_annotations: 1
- min_annotations_to_start_training: 1
- model_version: model_version
- num_tasks_with_annotations: 1
- organization: 1
- overlap_cohort_percentage: 1
- parsed_label_config:
- key: value
- pinned_at: '2024-01-15T09:30:00Z'
- queue_done: 1
- queue_total: 1
- reveal_preannotations_interactively: true
- sampling: Sequential sampling
- show_annotation_history: true
- show_collab_predictions: true
- show_ground_truth_first: true
- show_instruction: true
- show_overlap_first: true
- show_skip_button: true
- skip_queue: REQUEUE_FOR_ME
- skipped_annotations_number: 1
- start_training_on_annotation_update: true
- task_data_login: task_data_login
- task_data_password: task_data_password
- task_number: 1
- title: title
- total_annotations_number: 1
- total_predictions_number: 1
- useful_annotation_number: 1
+ project: 1
audiences:
- public
- remove:
+ delete:
path: /api/workspaces/{id}/projects/
method: DELETE
auth: true
@@ -285,20 +142,3 @@ service:
- public
source:
openapi: openapi/openapi.yaml
-types:
- ProjectRequestSampling:
- discriminated: false
- union:
- - root.SamplingDe5Enum
- - root.NullEnum
- source:
- openapi: openapi/openapi.yaml
- inline: true
- ProjectRequestSkipQueue:
- discriminated: false
- union:
- - root.SkipQueueEnum
- - root.NullEnum
- source:
- openapi: openapi/openapi.yaml
- inline: true
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index c03a98cb1..9ad19dec8 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -9090,6 +9090,55 @@ paths:
- projects
- stats
x-fern-sdk-method-name: agreement_annotator
+ /api/projects/{id}/stats/agreement_annotators:
+ get:
+ description: |-
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement statistics for multiple annotators within a project.
+ operationId: api_projects_stats_agreement_annotators_retrieve
+ parameters:
+ - in: path
+ name: id
+ required: true
+ schema:
+ type: integer
+ - description: Comma-separated list of annotator user IDs to get agreement scores for
+ in: query
+ name: ids
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ properties:
+ agreement:
+ additionalProperties:
+ type: number
+ description: Mapping of annotator ID to their agreement score (0-1) or null if no data
+ type: object
+ required:
+ - agreement
+ type: object
+ description: Multiple annotator agreement statistics
+ security:
+ - Token: []
+ summary: Get agreement statistics for multiple annotators
+ tags:
+ - Stats
+ x-fern-audiences:
+ - public
+ x-fern-sdk-group-name:
+ - projects
+ - stats
+ x-fern-sdk-method-name: agreement_annotators
/api/projects/{id}/stats/data_filter:
get:
description: Get statistics about user data filters and their usage within a project.
@@ -18504,7 +18553,7 @@ paths:
type: integer
responses:
'204':
- description: No response body
+ description: Project deleted
security:
- Token: []
summary: Remove workspace projects
@@ -18515,7 +18564,7 @@ paths:
x-fern-sdk-group-name:
- workspaces
- projects
- x-fern-sdk-method-name: remove
+ x-fern-sdk-method-name: delete
get:
description: |-
@@ -18537,8 +18586,10 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/Project'
- description: ''
+ items:
+ $ref: '#/components/schemas/Project'
+ type: array
+ description: Projects list
security:
- Token: []
summary: List workspace projects
@@ -18570,20 +18621,21 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/ProjectRequest'
+ $ref: '#/components/schemas/WorkspaceProjectsRequest'
application/x-www-form-urlencoded:
schema:
- $ref: '#/components/schemas/ProjectRequest'
+ $ref: '#/components/schemas/WorkspaceProjectsRequest'
multipart/form-data:
schema:
- $ref: '#/components/schemas/ProjectRequest'
+ $ref: '#/components/schemas/WorkspaceProjectsRequest'
+ required: true
responses:
- '200':
+ '201':
content:
application/json:
schema:
- $ref: '#/components/schemas/Project'
- description: ''
+ $ref: '#/components/schemas/WorkspaceProjects'
+ description: Project created
security:
- Token: []
summary: Create workspace project
@@ -18594,7 +18646,7 @@ paths:
x-fern-sdk-group-name:
- workspaces
- projects
- x-fern-sdk-method-name: add
+ x-fern-sdk-method-name: create
/data/upload/{filename}:
get:
description: Download a specific uploaded file.
@@ -18986,6 +19038,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -23751,6 +23804,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -24032,6 +24086,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -24190,6 +24245,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -24437,6 +24493,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -24695,6 +24752,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -28452,6 +28510,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -29517,6 +29576,7 @@ components:
title: Show predictions to annotator
type: boolean
show_ground_truth_first:
+ description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
type: boolean
show_instruction:
description: Show instructions to the annotator before they start
@@ -29839,121 +29899,6 @@ components:
required:
- id
type: object
- ProjectRequest:
- description: |-
- Serializer get numbers from project queryset annotation,
- make sure, that you use correct one(Project.objects.with_counts())
- properties:
- color:
- maxLength: 16
- nullable: true
- type: string
- control_weights:
- description: 'Dict of weights for each control tag in metric calculation. Each control tag (e.g. label or choice) will have it''s own key in control weight dict with weight for each label and overall weight.For example, if bounding box annotation with control tag named my_bbox should be included with 0.33 weight in agreement calculation, and the first label Car should be twice more important than Airplaine, then you have to need the specify: {''my_bbox'': {''type'': ''RectangleLabels'', ''labels'': {''Car'': 1.0, ''Airplaine'': 0.5}, ''overall'': 0.33}'
- nullable: true
- created_by:
- allOf:
- - $ref: '#/components/schemas/UserSimpleRequest'
- description: Project owner
- description:
- description: Project description
- nullable: true
- type: string
- enable_empty_annotation:
- description: Allow annotators to submit empty annotations
- type: boolean
- evaluate_predictions_automatically:
- description: Retrieve and display predictions when loading a task
- type: boolean
- expert_instruction:
- description: Labeling instructions in HTML format
- nullable: true
- type: string
- is_draft:
- description: Whether or not the project is in the middle of being created
- type: boolean
- is_published:
- description: Whether or not the project is published to annotators
- title: Published
- type: boolean
- label_config:
- description: Label config in XML format. See more about it in documentation
- nullable: true
- type: string
- maximum_annotations:
- description: Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
- maximum: 2147483647
- minimum: -2147483648
- title: Maximum annotation number
- type: integer
- min_annotations_to_start_training:
- description: Minimum number of completed tasks after which model training is started
- maximum: 2147483647
- minimum: -2147483648
- type: integer
- model_version:
- description: Machine learning model version
- nullable: true
- type: string
- organization:
- nullable: true
- type: integer
- overlap_cohort_percentage:
- maximum: 2147483647
- minimum: -2147483648
- type: integer
- pinned_at:
- description: Pinned date and time
- format: date-time
- nullable: true
- type: string
- reveal_preannotations_interactively:
- description: Reveal pre-annotations interactively
- type: boolean
- sampling:
- nullable: true
- oneOf:
- - $ref: '#/components/schemas/SamplingDe5Enum'
- - $ref: '#/components/schemas/NullEnum'
- show_annotation_history:
- description: Show annotation history to annotator
- type: boolean
- show_collab_predictions:
- description: If set, the annotator can view model predictions
- title: Show predictions to annotator
- type: boolean
- show_ground_truth_first:
- type: boolean
- show_instruction:
- description: Show instructions to the annotator before they start
- type: boolean
- show_overlap_first:
- type: boolean
- show_skip_button:
- description: Show a skip button in interface and allow annotators to skip the task
- type: boolean
- skip_queue:
- nullable: true
- oneOf:
- - $ref: '#/components/schemas/SkipQueueEnum'
- - $ref: '#/components/schemas/NullEnum'
- task_data_login:
- description: 'Task data credentials: login'
- maxLength: 256
- nullable: true
- type: string
- task_data_password:
- description: 'Task data credentials: password'
- maxLength: 256
- nullable: true
- type: string
- title:
- description: Project name. Must be between 3 and 50 characters long.
- maxLength: 50
- minLength: 3
- nullable: true
- type: string
- type: object
ProjectRole:
properties:
id:
@@ -32370,6 +32315,20 @@ components:
required:
- user
type: object
+ WorkspaceProjects:
+ properties:
+ project:
+ type: integer
+ required:
+ - project
+ type: object
+ WorkspaceProjectsRequest:
+ properties:
+ project:
+ type: integer
+ required:
+ - project
+ type: object
WorkspaceRequest:
description: |-
A ModelSerializer that takes additional arguments for
diff --git a/poetry.lock b/poetry.lock
index 45b540a2a..5023d5589 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -58,23 +58,15 @@ test = ["coverage", "mypy", "pexpect", "ruff", "wheel"]
[[package]]
name = "attrs"
-version = "25.3.0"
+version = "25.4.0"
description = "Classes Without Boilerplate"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"},
- {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"},
+ {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"},
+ {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"},
]
-[package.extras]
-benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
-cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
-dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
-docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"]
-tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
-tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"]
-
[[package]]
name = "black"
version = "25.9.0"
@@ -124,13 +116,13 @@ uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "certifi"
-version = "2025.8.3"
+version = "2025.10.5"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.7"
files = [
- {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"},
- {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"},
+ {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"},
+ {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"},
]
[[package]]
@@ -334,13 +326,13 @@ test = ["pytest (>=6)"]
[[package]]
name = "faker"
-version = "37.8.0"
+version = "37.11.0"
description = "Faker is a Python package that generates fake data for you."
optional = false
python-versions = ">=3.9"
files = [
- {file = "faker-37.8.0-py3-none-any.whl", hash = "sha256:b08233118824423b5fc239f7dd51f145e7018082b4164f8da6a9994e1f1ae793"},
- {file = "faker-37.8.0.tar.gz", hash = "sha256:090bb5abbec2b30949a95ce1ba6b20d1d0ed222883d63483a0d4be4a970d6fb8"},
+ {file = "faker-37.11.0-py3-none-any.whl", hash = "sha256:1508d2da94dfd1e0087b36f386126d84f8583b3de19ac18e392a2831a6676c57"},
+ {file = "faker-37.11.0.tar.gz", hash = "sha256:22969803849ba0618be8eee2dd01d0d9e2cd3b75e6ff1a291fa9abcdb34da5e6"},
]
[package.dependencies]
@@ -1332,21 +1324,21 @@ testing = ["coverage", "pytest", "pytest-benchmark"]
[[package]]
name = "pydantic"
-version = "2.11.9"
+version = "2.12.0"
description = "Data validation using Python type hints"
optional = false
python-versions = ">=3.9"
files = [
- {file = "pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2"},
- {file = "pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2"},
+ {file = "pydantic-2.12.0-py3-none-any.whl", hash = "sha256:f6a1da352d42790537e95e83a8bdfb91c7efbae63ffd0b86fa823899e807116f"},
+ {file = "pydantic-2.12.0.tar.gz", hash = "sha256:c1a077e6270dbfb37bfd8b498b3981e2bb18f68103720e51fa6c306a5a9af563"},
]
[package.dependencies]
annotated-types = ">=0.6.0"
email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""}
-pydantic-core = "2.33.2"
-typing-extensions = ">=4.12.2"
-typing-inspection = ">=0.4.0"
+pydantic-core = "2.41.1"
+typing-extensions = ">=4.14.1"
+typing-inspection = ">=0.4.2"
[package.extras]
email = ["email-validator (>=2.0.0)"]
@@ -1354,114 +1346,128 @@ timezone = ["tzdata"]
[[package]]
name = "pydantic-core"
-version = "2.33.2"
+version = "2.41.1"
description = "Core functionality for Pydantic validation and serialization"
optional = false
python-versions = ">=3.9"
files = [
- {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"},
- {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"},
- {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"},
- {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"},
- {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"},
- {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"},
- {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"},
- {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"},
- {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"},
- {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"},
- {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"},
- {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"},
- {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"},
- {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"},
- {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"},
- {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"},
- {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"},
- {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"},
- {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"},
- {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"},
- {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"},
- {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"},
- {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"},
- {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"},
- {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"},
- {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"},
- {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"},
- {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"},
- {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"},
- {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"},
- {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"},
- {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"},
- {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"},
- {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"},
- {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"},
- {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"},
- {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"},
- {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"},
- {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"},
- {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"},
- {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"},
- {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"},
- {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"},
- {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"},
- {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"},
- {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"},
- {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"},
- {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"},
- {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"},
- {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"},
- {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"},
- {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"},
- {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"},
- {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"},
- {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"},
- {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"},
- {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"},
- {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"},
- {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"},
- {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"},
- {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"},
- {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"},
- {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"},
- {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"},
- {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"},
- {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"},
- {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"},
- {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"},
- {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"},
- {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"},
- {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"},
- {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"},
- {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"},
- {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"},
- {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e63036298322e9aea1c8b7c0a6c1204d615dbf6ec0668ce5b83ff27f07404a61"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:241299ca91fc77ef64f11ed909d2d9220a01834e8e6f8de61275c4dd16b7c936"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab7e594a2a5c24ab8013a7dc8cfe5f2260e80e490685814122081705c2cf2b0"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b054ef1a78519cb934b58e9c90c09e93b837c935dcd907b891f2b265b129eb6e"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2ab7d10d0ab2ed6da54c757233eb0f48ebfb4f86e9b88ccecb3f92bbd61a538"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2757606b7948bb853a27e4040820306eaa0ccb9e8f9f8a0fa40cb674e170f350"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cec0e75eb61f606bad0a32f2be87507087514e26e8c73db6cbdb8371ccd27917"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0234236514f44a5bf552105cfe2543a12f48203397d9d0f866affa569345a5b5"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1b974e41adfbb4ebb0f65fc4ca951347b17463d60893ba7d5f7b9bb087c83897"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:248dafb3204136113c383e91a4d815269f51562b6659b756cf3df14eefc7d0bb"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:678f9d76a91d6bcedd7568bbf6beb77ae8447f85d1aeebaab7e2f0829cfc3a13"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-win32.whl", hash = "sha256:dff5bee1d21ee58277900692a641925d2dddfde65182c972569b1a276d2ac8fb"},
+ {file = "pydantic_core-2.41.1-cp310-cp310-win_amd64.whl", hash = "sha256:5042da12e5d97d215f91567110fdfa2e2595a25f17c19b9ff024f31c34f9b53e"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4f276a6134fe1fc1daa692642a3eaa2b7b858599c49a7610816388f5e37566a1"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07588570a805296ece009c59d9a679dc08fab72fb337365afb4f3a14cfbfc176"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28527e4b53400cd60ffbd9812ccb2b5135d042129716d71afd7e45bf42b855c0"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46a1c935c9228bad738c8a41de06478770927baedf581d172494ab36a6b96575"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:447ddf56e2b7d28d200d3e9eafa936fe40485744b5a824b67039937580b3cb20"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63892ead40c1160ac860b5debcc95c95c5a0035e543a8b5a4eac70dd22e995f4"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4a9543ca355e6df8fbe9c83e9faab707701e9103ae857ecb40f1c0cf8b0e94d"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2611bdb694116c31e551ed82e20e39a90bea9b7ad9e54aaf2d045ad621aa7a1"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fecc130893a9b5f7bfe230be1bb8c61fe66a19db8ab704f808cb25a82aad0bc9"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:1e2df5f8344c99b6ea5219f00fdc8950b8e6f2c422fbc1cc122ec8641fac85a1"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:35291331e9d8ed94c257bab6be1cb3a380b5eee570a2784bffc055e18040a2ea"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-win32.whl", hash = "sha256:2876a095292668d753f1a868c4a57c4ac9f6acbd8edda8debe4218d5848cf42f"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-win_amd64.whl", hash = "sha256:b92d6c628e9a338846a28dfe3fcdc1a3279388624597898b105e078cdfc59298"},
+ {file = "pydantic_core-2.41.1-cp311-cp311-win_arm64.whl", hash = "sha256:7d82ae99409eb69d507a89835488fb657faa03ff9968a9379567b0d2e2e56bc5"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:db2f82c0ccbce8f021ad304ce35cbe02aa2f95f215cac388eed542b03b4d5eb4"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47694a31c710ced9205d5f1e7e8af3ca57cbb8a503d98cb9e33e27c97a501601"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e9decce94daf47baf9e9d392f5f2557e783085f7c5e522011545d9d6858e00"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab0adafdf2b89c8b84f847780a119437a0931eca469f7b44d356f2b426dd9741"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5da98cc81873f39fd56882e1569c4677940fbc12bce6213fad1ead784192d7c8"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:209910e88afb01fd0fd403947b809ba8dba0e08a095e1f703294fda0a8fdca51"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365109d1165d78d98e33c5bfd815a9b5d7d070f578caefaabcc5771825b4ecb5"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:706abf21e60a2857acdb09502bc853ee5bce732955e7b723b10311114f033115"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bf0bd5417acf7f6a7ec3b53f2109f587be176cb35f9cf016da87e6017437a72d"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2e71b1c6ceb9c78424ae9f63a07292fb769fb890a4e7efca5554c47f33a60ea5"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80745b9770b4a38c25015b517451c817799bfb9d6499b0d13d8227ec941cb513"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-win32.whl", hash = "sha256:83b64d70520e7890453f1aa21d66fda44e7b35f1cfea95adf7b4289a51e2b479"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-win_amd64.whl", hash = "sha256:377defd66ee2003748ee93c52bcef2d14fde48fe28a0b156f88c3dbf9bc49a50"},
+ {file = "pydantic_core-2.41.1-cp312-cp312-win_arm64.whl", hash = "sha256:c95caff279d49c1d6cdfe2996e6c2ad712571d3b9caaa209a404426c326c4bde"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70e790fce5f05204ef4403159857bfcd587779da78627b0babb3654f75361ebf"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9cebf1ca35f10930612d60bd0f78adfacee824c30a880e3534ba02c207cceceb"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:170406a37a5bc82c22c3274616bf6f17cc7df9c4a0a0a50449e559cb755db669"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12d4257fc9187a0ccd41b8b327d6a4e57281ab75e11dda66a9148ef2e1fb712f"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a75a33b4db105dd1c8d57839e17ee12db8d5ad18209e792fa325dbb4baeb00f4"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08a589f850803a74e0fcb16a72081cafb0d72a3cdda500106942b07e76b7bf62"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97939d6ea44763c456bd8a617ceada2c9b96bb5b8ab3dfa0d0827df7619014"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2ae423c65c556f09569524b80ffd11babff61f33055ef9773d7c9fabc11ed8d"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:4dc703015fbf8764d6a8001c327a87f1823b7328d40b47ce6000c65918ad2b4f"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:968e4ffdfd35698a5fe659e5e44c508b53664870a8e61c8f9d24d3d145d30257"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:fff2b76c8e172d34771cd4d4f0ade08072385310f214f823b5a6ad4006890d32"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-win32.whl", hash = "sha256:a38a5263185407ceb599f2f035faf4589d57e73c7146d64f10577f6449e8171d"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42ae7fd6760782c975897e1fdc810f483b021b32245b0105d40f6e7a3803e4b"},
+ {file = "pydantic_core-2.41.1-cp313-cp313-win_arm64.whl", hash = "sha256:ad4111acc63b7384e205c27a2f15e23ac0ee21a9d77ad6f2e9cb516ec90965fb"},
+ {file = "pydantic_core-2.41.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:440d0df7415b50084a4ba9d870480c16c5f67c0d1d4d5119e3f70925533a0edc"},
+ {file = "pydantic_core-2.41.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71eaa38d342099405dae6484216dcf1e8e4b0bebd9b44a4e08c9b43db6a2ab67"},
+ {file = "pydantic_core-2.41.1-cp313-cp313t-win_amd64.whl", hash = "sha256:555ecf7e50f1161d3f693bc49f23c82cf6cdeafc71fa37a06120772a09a38795"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:05226894a26f6f27e1deb735d7308f74ef5fa3a6de3e0135bb66cdcaee88f64b"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:85ff7911c6c3e2fd8d3779c50925f6406d770ea58ea6dde9c230d35b52b16b4a"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47f1f642a205687d59b52dc1a9a607f45e588f5a2e9eeae05edd80c7a8c47674"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df11c24e138876ace5ec6043e5cae925e34cf38af1a1b3d63589e8f7b5f5cdc4"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f0bf7f5c8f7bf345c527e8a0d72d6b26eda99c1227b0c34e7e59e181260de31"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82b887a711d341c2c47352375d73b029418f55b20bd7815446d175a70effa706"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5f1d5d6bbba484bdf220c72d8ecd0be460f4bd4c5e534a541bb2cd57589fb8b"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bf1917385ebe0f968dc5c6ab1375886d56992b93ddfe6bf52bff575d03662be"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:4f94f3ab188f44b9a73f7295663f3ecb8f2e2dd03a69c8f2ead50d37785ecb04"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:3925446673641d37c30bd84a9d597e49f72eacee8b43322c8999fa17d5ae5bc4"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:49bd51cc27adb980c7b97357ae036ce9b3c4d0bb406e84fbe16fb2d368b602a8"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-win32.whl", hash = "sha256:a31ca0cd0e4d12ea0df0077df2d487fc3eb9d7f96bbb13c3c5b88dcc21d05159"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-win_amd64.whl", hash = "sha256:1b5c4374a152e10a22175d7790e644fbd8ff58418890e07e2073ff9d4414efae"},
+ {file = "pydantic_core-2.41.1-cp314-cp314-win_arm64.whl", hash = "sha256:4fee76d757639b493eb600fba668f1e17475af34c17dd61db7a47e824d464ca9"},
+ {file = "pydantic_core-2.41.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f9b9c968cfe5cd576fdd7361f47f27adeb120517e637d1b189eea1c3ece573f4"},
+ {file = "pydantic_core-2.41.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ebc7ab67b856384aba09ed74e3e977dded40e693de18a4f197c67d0d4e6d8e"},
+ {file = "pydantic_core-2.41.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8ae0dc57b62a762985bc7fbf636be3412394acc0ddb4ade07fe104230f1b9762"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:10ce489cf09a4956a1549af839b983edc59b0f60e1b068c21b10154e58f54f80"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff548c908caffd9455fd1342366bcf8a1ec8a3fca42f35c7fc60883d6a901074"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d43bf082025082bda13be89a5f876cc2386b7727c7b322be2d2b706a45cea8e"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:666aee751faf1c6864b2db795775dd67b61fdcf646abefa309ed1da039a97209"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83aaeff0d7bde852c32e856f3ee410842ebc08bc55c510771d87dcd1c01e1ed"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:055c7931b0329cb8acde20cdde6d9c2cbc2a02a0a8e54a792cddd91e2ea92c65"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530bbb1347e3e5ca13a91ac087c4971d7da09630ef8febd27a20a10800c2d06d"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65a0ea16cfea7bfa9e43604c8bd726e63a3788b61c384c37664b55209fcb1d74"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8fa93fadff794c6d15c345c560513b160197342275c6d104cc879f932b978afc"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:c8a1af9ac51969a494c6a82b563abae6859dc082d3b999e8fa7ba5ee1b05e8e8"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30edab28829703f876897c9471a857e43d847b8799c3c9e2fbce644724b50aa4"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-win32.whl", hash = "sha256:84d0ff869f98be2e93efdf1ae31e5a15f0926d22af8677d51676e373abbfe57a"},
+ {file = "pydantic_core-2.41.1-cp39-cp39-win_amd64.whl", hash = "sha256:b5674314987cdde5a5511b029fa5fb1556b3d147a367e01dd583b19cfa8e35df"},
+ {file = "pydantic_core-2.41.1-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:68f2251559b8efa99041bb63571ec7cdd2d715ba74cc82b3bc9eff824ebc8bf0"},
+ {file = "pydantic_core-2.41.1-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:c7bc140c596097cb53b30546ca257dbe3f19282283190b1b5142928e5d5d3a20"},
+ {file = "pydantic_core-2.41.1-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2896510fce8f4725ec518f8b9d7f015a00db249d2fd40788f442af303480063d"},
+ {file = "pydantic_core-2.41.1-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ced20e62cfa0f496ba68fa5d6c7ee71114ea67e2a5da3114d6450d7f4683572a"},
+ {file = "pydantic_core-2.41.1-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b04fa9ed049461a7398138c604b00550bc89e3e1151d84b81ad6dc93e39c4c06"},
+ {file = "pydantic_core-2.41.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:b3b7d9cfbfdc43c80a16638c6dc2768e3956e73031fca64e8e1a3ae744d1faeb"},
+ {file = "pydantic_core-2.41.1-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eec83fc6abef04c7f9bec616e2d76ee9a6a4ae2a359b10c21d0f680e24a247ca"},
+ {file = "pydantic_core-2.41.1-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6771a2d9f83c4038dfad5970a3eef215940682b2175e32bcc817bdc639019b28"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fabcbdb12de6eada8d6e9a759097adb3c15440fafc675b3e94ae5c9cb8d678a0"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:80e97ccfaf0aaf67d55de5085b0ed0d994f57747d9d03f2de5cc9847ca737b08"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34df1fe8fea5d332484a763702e8b6a54048a9d4fe6ccf41e34a128238e01f52"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:421b5595f845842fc093f7250e24ee395f54ca62d494fdde96f43ecf9228ae01"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dce8b22663c134583aaad24827863306a933f576c79da450be3984924e2031d1"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:300a9c162fea9906cc5c103893ca2602afd84f0ec90d3be36f4cc360125d22e1"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e019167628f6e6161ae7ab9fb70f6d076a0bf0d55aa9b20833f86a320c70dd65"},
+ {file = "pydantic_core-2.41.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:13ab9cc2de6f9d4ab645a050ae5aee61a2424ac4d3a16ba23d4c2027705e0301"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:af2385d3f98243fb733862f806c5bb9122e5fba05b373e3af40e3c82d711cef1"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:6550617a0c2115be56f90c31a5370261d8ce9dbf051c3ed53b51172dd34da696"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc17b6ecf4983d298686014c92ebc955a9f9baf9f57dad4065e7906e7bee6222"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42ae9352cf211f08b04ea110563d6b1e415878eea5b4c70f6bdb17dca3b932d2"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e82947de92068b0a21681a13dd2102387197092fbe7defcfb8453e0913866506"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e244c37d5471c9acdcd282890c6c4c83747b77238bfa19429b8473586c907656"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1e798b4b304a995110d41ec93653e57975620ccb2842ba9420037985e7d7284e"},
+ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f1fc716c0eb1663c59699b024428ad5ec2bcc6b928527b8fe28de6cb89f47efb"},
+ {file = "pydantic_core-2.41.1.tar.gz", hash = "sha256:1ad375859a6d8c356b7704ec0f547a58e82ee80bb41baa811ad710e124bc8f2f"},
]
[package.dependencies]
-typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
+typing-extensions = ">=4.14.1"
[[package]]
name = "pyjwt"
@@ -2158,13 +2164,13 @@ telegram = ["requests"]
[[package]]
name = "types-python-dateutil"
-version = "2.9.0.20250822"
+version = "2.9.0.20251008"
description = "Typing stubs for python-dateutil"
optional = false
python-versions = ">=3.9"
files = [
- {file = "types_python_dateutil-2.9.0.20250822-py3-none-any.whl", hash = "sha256:849d52b737e10a6dc6621d2bd7940ec7c65fcb69e6aa2882acf4e56b2b508ddc"},
- {file = "types_python_dateutil-2.9.0.20250822.tar.gz", hash = "sha256:84c92c34bd8e68b117bff742bc00b692a1e8531262d4507b33afcc9f7716cd53"},
+ {file = "types_python_dateutil-2.9.0.20251008-py3-none-any.whl", hash = "sha256:b9a5232c8921cf7661b29c163ccc56055c418ab2c6eabe8f917cbcc73a4c4157"},
+ {file = "types_python_dateutil-2.9.0.20251008.tar.gz", hash = "sha256:c3826289c170c93ebd8360c3485311187df740166dbab9dd3b792e69f2bc1f9c"},
]
[[package]]
diff --git a/reference.md b/reference.md
index da0fc91f1..b7c450578 100644
--- a/reference.md
+++ b/reference.md
@@ -9134,7 +9134,7 @@ client.projects.create()
-
-**show_ground_truth_first:** `typing.Optional[bool]`
+**show_ground_truth_first:** `typing.Optional[bool]` — Onboarding mode (true): show ground truth tasks first in the labeling stream
@@ -9812,7 +9812,7 @@ client.projects.update(
-
-**show_ground_truth_first:** `typing.Optional[bool]`
+**show_ground_truth_first:** `typing.Optional[bool]` — Onboarding mode (true): show ground truth tasks first in the labeling stream
@@ -31698,6 +31698,91 @@ client.projects.stats.agreement_annotator(
+
+
+
+
+client.projects.stats.agreement_annotators(...)
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+Get agreement statistics for multiple annotators within a project.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from label_studio_sdk import LabelStudio
+
+client = LabelStudio(
+ api_key="YOUR_API_KEY",
+)
+client.projects.stats.agreement_annotators(
+ id=1,
+ ids="ids",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**id:** `int`
+
+
+
+
+
+-
+
+**ids:** `str` — Comma-separated list of annotator user IDs to get agreement scores for
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
@@ -36334,7 +36419,7 @@ client.workspaces.projects.list(
-client.workspaces.projects.add(...)
+client.workspaces.projects.create(...)
-
@@ -36372,8 +36457,9 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.workspaces.projects.add(
+client.workspaces.projects.create(
id=1,
+ project=1,
)
```
@@ -36398,223 +36484,7 @@ client.workspaces.projects.add(
-
-**color:** `typing.Optional[str]`
-
-
-
-
-
--
-
-**control_weights:** `typing.Optional[typing.Optional[typing.Any]]`
-
-
-
-
-
--
-
-**created_by:** `typing.Optional[UserSimpleRequest]` — Project owner
-
-
-
-
-
--
-
-**description:** `typing.Optional[str]` — Project description
-
-
-
-
-
--
-
-**enable_empty_annotation:** `typing.Optional[bool]` — Allow annotators to submit empty annotations
-
-
-
-
-
--
-
-**evaluate_predictions_automatically:** `typing.Optional[bool]` — Retrieve and display predictions when loading a task
-
-
-
-
-
--
-
-**expert_instruction:** `typing.Optional[str]` — Labeling instructions in HTML format
-
-
-
-
-
--
-
-**is_draft:** `typing.Optional[bool]` — Whether or not the project is in the middle of being created
-
-
-
-
-
--
-
-**is_published:** `typing.Optional[bool]` — Whether or not the project is published to annotators
-
-
-
-
-
--
-
-**label_config:** `typing.Optional[str]` — Label config in XML format. See more about it in documentation
-
-
-
-
-
--
-
-**maximum_annotations:** `typing.Optional[int]` — Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
-
-
-
-
-
--
-
-**min_annotations_to_start_training:** `typing.Optional[int]` — Minimum number of completed tasks after which model training is started
-
-
-
-
-
--
-
-**model_version:** `typing.Optional[str]` — Machine learning model version
-
-
-
-
-
--
-
-**organization:** `typing.Optional[int]`
-
-
-
-
-
--
-
-**overlap_cohort_percentage:** `typing.Optional[int]`
-
-
-
-
-
--
-
-**pinned_at:** `typing.Optional[dt.datetime]` — Pinned date and time
-
-
-
-
-
--
-
-**reveal_preannotations_interactively:** `typing.Optional[bool]` — Reveal pre-annotations interactively
-
-
-
-
-
--
-
-**sampling:** `typing.Optional[ProjectRequestSampling]`
-
-
-
-
-
--
-
-**show_annotation_history:** `typing.Optional[bool]` — Show annotation history to annotator
-
-
-
-
-
--
-
-**show_collab_predictions:** `typing.Optional[bool]` — If set, the annotator can view model predictions
-
-
-
-
-
--
-
-**show_ground_truth_first:** `typing.Optional[bool]`
-
-
-
-
-
--
-
-**show_instruction:** `typing.Optional[bool]` — Show instructions to the annotator before they start
-
-
-
-
-
--
-
-**show_overlap_first:** `typing.Optional[bool]`
-
-
-
-
-
--
-
-**show_skip_button:** `typing.Optional[bool]` — Show a skip button in interface and allow annotators to skip the task
-
-
-
-
-
--
-
-**skip_queue:** `typing.Optional[ProjectRequestSkipQueue]`
-
-
-
-
-
--
-
-**task_data_login:** `typing.Optional[str]` — Task data credentials: login
-
-
-
-
-
--
-
-**task_data_password:** `typing.Optional[str]` — Task data credentials: password
-
-
-
-
-
--
-
-**title:** `typing.Optional[str]` — Project name. Must be between 3 and 50 characters long.
+**project:** `int`
@@ -36634,7 +36504,7 @@ client.workspaces.projects.add(
-client.workspaces.projects.remove(...)
+client.workspaces.projects.delete(...)
-
@@ -36672,7 +36542,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.workspaces.projects.remove(
+client.workspaces.projects.delete(
id=1,
)
diff --git a/src/label_studio_sdk/__init__.py b/src/label_studio_sdk/__init__.py
index a2d682b4b..8afa6b637 100644
--- a/src/label_studio_sdk/__init__.py
+++ b/src/label_studio_sdk/__init__.py
@@ -242,6 +242,7 @@
Workspace,
WorkspaceMemberCreate,
WorkspaceMemberList,
+ WorkspaceProjects,
)
from .errors import (
BadRequestError,
@@ -675,6 +676,7 @@
"Workspace",
"WorkspaceMemberCreate",
"WorkspaceMemberList",
+ "WorkspaceProjects",
"__version__",
"actions",
"activity_logs",
diff --git a/src/label_studio_sdk/projects/__init__.py b/src/label_studio_sdk/projects/__init__.py
index 7101bd0f3..fcb2e8ebf 100644
--- a/src/label_studio_sdk/projects/__init__.py
+++ b/src/label_studio_sdk/projects/__init__.py
@@ -29,6 +29,7 @@
from .exports import ExportsConvertResponse
from .stats import (
StatsAgreementAnnotatorResponse,
+ StatsAgreementAnnotatorsResponse,
StatsDataFiltersResponse,
StatsDataFiltersResponseUserFilters,
StatsDataFiltersResponseUserFiltersStatsItem,
@@ -78,6 +79,7 @@
"ProjectsImportPredictionsResponse",
"ProjectsImportTasksResponse",
"StatsAgreementAnnotatorResponse",
+ "StatsAgreementAnnotatorsResponse",
"StatsDataFiltersResponse",
"StatsDataFiltersResponseUserFilters",
"StatsDataFiltersResponseUserFiltersStatsItem",
diff --git a/src/label_studio_sdk/projects/client.py b/src/label_studio_sdk/projects/client.py
index 8d3686ded..b43048943 100644
--- a/src/label_studio_sdk/projects/client.py
+++ b/src/label_studio_sdk/projects/client.py
@@ -282,6 +282,7 @@ def create(
If set, the annotator can view model predictions
show_ground_truth_first : typing.Optional[bool]
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
show_instruction : typing.Optional[bool]
Show instructions to the annotator before they start
@@ -708,6 +709,7 @@ def update(
If set, the annotator can view model predictions
show_ground_truth_first : typing.Optional[bool]
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
show_instruction : typing.Optional[bool]
Show instructions to the annotator before they start
@@ -1473,6 +1475,7 @@ async def create(
If set, the annotator can view model predictions
show_ground_truth_first : typing.Optional[bool]
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
show_instruction : typing.Optional[bool]
Show instructions to the annotator before they start
@@ -1931,6 +1934,7 @@ async def update(
If set, the annotator can view model predictions
show_ground_truth_first : typing.Optional[bool]
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
show_instruction : typing.Optional[bool]
Show instructions to the annotator before they start
diff --git a/src/label_studio_sdk/projects/stats/__init__.py b/src/label_studio_sdk/projects/stats/__init__.py
index d9f08c12b..8bda68459 100644
--- a/src/label_studio_sdk/projects/stats/__init__.py
+++ b/src/label_studio_sdk/projects/stats/__init__.py
@@ -2,6 +2,7 @@
from .types import (
StatsAgreementAnnotatorResponse,
+ StatsAgreementAnnotatorsResponse,
StatsDataFiltersResponse,
StatsDataFiltersResponseUserFilters,
StatsDataFiltersResponseUserFiltersStatsItem,
@@ -29,6 +30,7 @@
__all__ = [
"StatsAgreementAnnotatorResponse",
+ "StatsAgreementAnnotatorsResponse",
"StatsDataFiltersResponse",
"StatsDataFiltersResponseUserFilters",
"StatsDataFiltersResponseUserFiltersStatsItem",
diff --git a/src/label_studio_sdk/projects/stats/client.py b/src/label_studio_sdk/projects/stats/client.py
index b2cf17a2b..f1556c847 100644
--- a/src/label_studio_sdk/projects/stats/client.py
+++ b/src/label_studio_sdk/projects/stats/client.py
@@ -12,6 +12,7 @@
from .types.stats_model_version_prediction_agreement_response import StatsModelVersionPredictionAgreementResponse
from .types.stats_iaa_response import StatsIaaResponse
from .types.stats_agreement_annotator_response import StatsAgreementAnnotatorResponse
+from .types.stats_agreement_annotators_response import StatsAgreementAnnotatorsResponse
from .types.stats_data_filters_response import StatsDataFiltersResponse
from .types.stats_finished_tasks_response import StatsFinishedTasksResponse
from .types.stats_lead_time_response import StatsLeadTimeResponse
@@ -355,6 +356,67 @@ def agreement_annotator(
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
+ def agreement_annotators(
+ self, id: int, *, ids: str, request_options: typing.Optional[RequestOptions] = None
+ ) -> StatsAgreementAnnotatorsResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement statistics for multiple annotators within a project.
+
+ Parameters
+ ----------
+ id : int
+
+ ids : str
+ Comma-separated list of annotator user IDs to get agreement scores for
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsAgreementAnnotatorsResponse
+ Multiple annotator agreement statistics
+
+ Examples
+ --------
+ from label_studio_sdk import LabelStudio
+
+ client = LabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+ client.projects.stats.agreement_annotators(
+ id=1,
+ ids="ids",
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/stats/agreement_annotators",
+ method="GET",
+ params={
+ "ids": ids,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsAgreementAnnotatorsResponse,
+ construct_type(
+ type_=StatsAgreementAnnotatorsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
def data_filters(
self, id: int, *, request_options: typing.Optional[RequestOptions] = None
) -> StatsDataFiltersResponse:
@@ -1205,6 +1267,75 @@ async def main() -> None:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
+ async def agreement_annotators(
+ self, id: int, *, ids: str, request_options: typing.Optional[RequestOptions] = None
+ ) -> StatsAgreementAnnotatorsResponse:
+ """
+
+
+
+ This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
+
+
+ Get agreement statistics for multiple annotators within a project.
+
+ Parameters
+ ----------
+ id : int
+
+ ids : str
+ Comma-separated list of annotator user IDs to get agreement scores for
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ StatsAgreementAnnotatorsResponse
+ Multiple annotator agreement statistics
+
+ Examples
+ --------
+ import asyncio
+
+ from label_studio_sdk import AsyncLabelStudio
+
+ client = AsyncLabelStudio(
+ api_key="YOUR_API_KEY",
+ )
+
+
+ async def main() -> None:
+ await client.projects.stats.agreement_annotators(
+ id=1,
+ ids="ids",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"api/projects/{jsonable_encoder(id)}/stats/agreement_annotators",
+ method="GET",
+ params={
+ "ids": ids,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ StatsAgreementAnnotatorsResponse,
+ construct_type(
+ type_=StatsAgreementAnnotatorsResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
async def data_filters(
self, id: int, *, request_options: typing.Optional[RequestOptions] = None
) -> StatsDataFiltersResponse:
diff --git a/src/label_studio_sdk/projects/stats/types/__init__.py b/src/label_studio_sdk/projects/stats/types/__init__.py
index 7da9cb7fc..770c7e1fb 100644
--- a/src/label_studio_sdk/projects/stats/types/__init__.py
+++ b/src/label_studio_sdk/projects/stats/types/__init__.py
@@ -1,6 +1,7 @@
# This file was auto-generated by Fern from our API Definition.
from .stats_agreement_annotator_response import StatsAgreementAnnotatorResponse
+from .stats_agreement_annotators_response import StatsAgreementAnnotatorsResponse
from .stats_data_filters_response import StatsDataFiltersResponse
from .stats_data_filters_response_user_filters import StatsDataFiltersResponseUserFilters
from .stats_data_filters_response_user_filters_stats_item import StatsDataFiltersResponseUserFiltersStatsItem
@@ -29,6 +30,7 @@
__all__ = [
"StatsAgreementAnnotatorResponse",
+ "StatsAgreementAnnotatorsResponse",
"StatsDataFiltersResponse",
"StatsDataFiltersResponseUserFilters",
"StatsDataFiltersResponseUserFiltersStatsItem",
diff --git a/src/label_studio_sdk/projects/stats/types/stats_agreement_annotators_response.py b/src/label_studio_sdk/projects/stats/types/stats_agreement_annotators_response.py
new file mode 100644
index 000000000..8b9e01318
--- /dev/null
+++ b/src/label_studio_sdk/projects/stats/types/stats_agreement_annotators_response.py
@@ -0,0 +1,22 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ....core.unchecked_base_model import UncheckedBaseModel
+import typing
+import pydantic
+from ....core.pydantic_utilities import IS_PYDANTIC_V2
+
+
+class StatsAgreementAnnotatorsResponse(UncheckedBaseModel):
+ agreement: typing.Dict[str, float] = pydantic.Field()
+ """
+ Mapping of annotator ID to their agreement score (0-1) or null if no data
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/types/__init__.py b/src/label_studio_sdk/types/__init__.py
index d4c357cd9..80ced6142 100644
--- a/src/label_studio_sdk/types/__init__.py
+++ b/src/label_studio_sdk/types/__init__.py
@@ -243,6 +243,7 @@
from .workspace import Workspace
from .workspace_member_create import WorkspaceMemberCreate
from .workspace_member_list import WorkspaceMemberList
+from .workspace_projects import WorkspaceProjects
__all__ = [
"ActionEnum",
@@ -486,4 +487,5 @@
"Workspace",
"WorkspaceMemberCreate",
"WorkspaceMemberList",
+ "WorkspaceProjects",
]
diff --git a/src/label_studio_sdk/types/all_roles_project_list.py b/src/label_studio_sdk/types/all_roles_project_list.py
index 5e4513feb..99c694c42 100644
--- a/src/label_studio_sdk/types/all_roles_project_list.py
+++ b/src/label_studio_sdk/types/all_roles_project_list.py
@@ -151,7 +151,11 @@ class AllRolesProjectList(UncheckedBaseModel):
If set, the annotator can view model predictions
"""
- show_ground_truth_first: typing.Optional[bool] = None
+ show_ground_truth_first: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
+ """
+
show_instruction: typing.Optional[bool] = pydantic.Field(default=None)
"""
Show instructions to the annotator before they start
diff --git a/src/label_studio_sdk/types/lse_project.py b/src/label_studio_sdk/types/lse_project.py
index 29b04970d..de1d9499a 100644
--- a/src/label_studio_sdk/types/lse_project.py
+++ b/src/label_studio_sdk/types/lse_project.py
@@ -151,7 +151,11 @@ class LseProject(UncheckedBaseModel):
If set, the annotator can view model predictions
"""
- show_ground_truth_first: typing.Optional[bool] = None
+ show_ground_truth_first: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
+ """
+
show_instruction: typing.Optional[bool] = pydantic.Field(default=None)
"""
Show instructions to the annotator before they start
diff --git a/src/label_studio_sdk/types/lse_project_create.py b/src/label_studio_sdk/types/lse_project_create.py
index 5072f749c..c18785584 100644
--- a/src/label_studio_sdk/types/lse_project_create.py
+++ b/src/label_studio_sdk/types/lse_project_create.py
@@ -126,7 +126,11 @@ class LseProjectCreate(UncheckedBaseModel):
If set, the annotator can view model predictions
"""
- show_ground_truth_first: typing.Optional[bool] = None
+ show_ground_truth_first: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
+ """
+
show_instruction: typing.Optional[bool] = pydantic.Field(default=None)
"""
Show instructions to the annotator before they start
diff --git a/src/label_studio_sdk/types/lse_project_response.py b/src/label_studio_sdk/types/lse_project_response.py
index e9fb88454..bf3227e81 100644
--- a/src/label_studio_sdk/types/lse_project_response.py
+++ b/src/label_studio_sdk/types/lse_project_response.py
@@ -151,7 +151,11 @@ class LseProjectResponse(UncheckedBaseModel):
If set, the annotator can view model predictions
"""
- show_ground_truth_first: typing.Optional[bool] = None
+ show_ground_truth_first: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
+ """
+
show_instruction: typing.Optional[bool] = pydantic.Field(default=None)
"""
Show instructions to the annotator before they start
diff --git a/src/label_studio_sdk/types/lse_project_update.py b/src/label_studio_sdk/types/lse_project_update.py
index 2f7417a74..89d878e91 100644
--- a/src/label_studio_sdk/types/lse_project_update.py
+++ b/src/label_studio_sdk/types/lse_project_update.py
@@ -144,7 +144,11 @@ class LseProjectUpdate(UncheckedBaseModel):
If set, the annotator can view model predictions
"""
- show_ground_truth_first: typing.Optional[bool] = None
+ show_ground_truth_first: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
+ """
+
show_instruction: typing.Optional[bool] = pydantic.Field(default=None)
"""
Show instructions to the annotator before they start
diff --git a/src/label_studio_sdk/types/project.py b/src/label_studio_sdk/types/project.py
index 8560ddd5d..8cc0d394a 100644
--- a/src/label_studio_sdk/types/project.py
+++ b/src/label_studio_sdk/types/project.py
@@ -126,7 +126,11 @@ class Project(UncheckedBaseModel):
If set, the annotator can view model predictions
"""
- show_ground_truth_first: typing.Optional[bool] = None
+ show_ground_truth_first: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Onboarding mode (true): show ground truth tasks first in the labeling stream
+ """
+
show_instruction: typing.Optional[bool] = pydantic.Field(default=None)
"""
Show instructions to the annotator before they start
diff --git a/src/label_studio_sdk/types/workspace_projects.py b/src/label_studio_sdk/types/workspace_projects.py
new file mode 100644
index 000000000..512fa66d4
--- /dev/null
+++ b/src/label_studio_sdk/types/workspace_projects.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.unchecked_base_model import UncheckedBaseModel
+from ..core.pydantic_utilities import IS_PYDANTIC_V2
+import typing
+import pydantic
+
+
+class WorkspaceProjects(UncheckedBaseModel):
+ project: int
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/workspaces/__init__.py b/src/label_studio_sdk/workspaces/__init__.py
index f1f3ddee5..21c06996f 100644
--- a/src/label_studio_sdk/workspaces/__init__.py
+++ b/src/label_studio_sdk/workspaces/__init__.py
@@ -1,6 +1,5 @@
# This file was auto-generated by Fern from our API Definition.
from . import members, projects
-from .projects import ProjectRequestSampling, ProjectRequestSkipQueue
-__all__ = ["ProjectRequestSampling", "ProjectRequestSkipQueue", "members", "projects"]
+__all__ = ["members", "projects"]
diff --git a/src/label_studio_sdk/workspaces/projects/__init__.py b/src/label_studio_sdk/workspaces/projects/__init__.py
index c52cc96c8..f3ea2659b 100644
--- a/src/label_studio_sdk/workspaces/projects/__init__.py
+++ b/src/label_studio_sdk/workspaces/projects/__init__.py
@@ -1,5 +1,2 @@
# This file was auto-generated by Fern from our API Definition.
-from .types import ProjectRequestSampling, ProjectRequestSkipQueue
-
-__all__ = ["ProjectRequestSampling", "ProjectRequestSkipQueue"]
diff --git a/src/label_studio_sdk/workspaces/projects/client.py b/src/label_studio_sdk/workspaces/projects/client.py
index df5588d28..6ab90803b 100644
--- a/src/label_studio_sdk/workspaces/projects/client.py
+++ b/src/label_studio_sdk/workspaces/projects/client.py
@@ -8,11 +8,7 @@
from ...core.unchecked_base_model import construct_type
from json.decoder import JSONDecodeError
from ...core.api_error import ApiError
-from ...types.user_simple_request import UserSimpleRequest
-import datetime as dt
-from .types.project_request_sampling import ProjectRequestSampling
-from .types.project_request_skip_queue import ProjectRequestSkipQueue
-from ...core.serialization import convert_and_respect_annotation_metadata
+from ...types.workspace_projects import WorkspaceProjects
from ...core.client_wrapper import AsyncClientWrapper
# this is used as the default value for optional parameters
@@ -23,7 +19,7 @@ class ProjectsClient:
def __init__(self, *, client_wrapper: SyncClientWrapper):
self._client_wrapper = client_wrapper
- def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> Project:
+ def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[Project]:
"""
@@ -42,8 +38,8 @@ def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = No
Returns
-------
- Project
-
+ typing.List[Project]
+ Projects list
Examples
--------
@@ -64,9 +60,9 @@ def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = No
try:
if 200 <= _response.status_code < 300:
return typing.cast(
- Project,
+ typing.List[Project],
construct_type(
- type_=Project, # type: ignore
+ type_=typing.List[Project], # type: ignore
object_=_response.json(),
),
)
@@ -75,40 +71,9 @@ def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = No
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- def add(
- self,
- id: int,
- *,
- color: typing.Optional[str] = OMIT,
- control_weights: typing.Optional[typing.Optional[typing.Any]] = OMIT,
- created_by: typing.Optional[UserSimpleRequest] = OMIT,
- description: typing.Optional[str] = OMIT,
- enable_empty_annotation: typing.Optional[bool] = OMIT,
- evaluate_predictions_automatically: typing.Optional[bool] = OMIT,
- expert_instruction: typing.Optional[str] = OMIT,
- is_draft: typing.Optional[bool] = OMIT,
- is_published: typing.Optional[bool] = OMIT,
- label_config: typing.Optional[str] = OMIT,
- maximum_annotations: typing.Optional[int] = OMIT,
- min_annotations_to_start_training: typing.Optional[int] = OMIT,
- model_version: typing.Optional[str] = OMIT,
- organization: typing.Optional[int] = OMIT,
- overlap_cohort_percentage: typing.Optional[int] = OMIT,
- pinned_at: typing.Optional[dt.datetime] = OMIT,
- reveal_preannotations_interactively: typing.Optional[bool] = OMIT,
- sampling: typing.Optional[ProjectRequestSampling] = OMIT,
- show_annotation_history: typing.Optional[bool] = OMIT,
- show_collab_predictions: typing.Optional[bool] = OMIT,
- show_ground_truth_first: typing.Optional[bool] = OMIT,
- show_instruction: typing.Optional[bool] = OMIT,
- show_overlap_first: typing.Optional[bool] = OMIT,
- show_skip_button: typing.Optional[bool] = OMIT,
- skip_queue: typing.Optional[ProjectRequestSkipQueue] = OMIT,
- task_data_login: typing.Optional[str] = OMIT,
- task_data_password: typing.Optional[str] = OMIT,
- title: typing.Optional[str] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> Project:
+ def create(
+ self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None
+ ) -> WorkspaceProjects:
"""
@@ -122,89 +87,15 @@ def add(
----------
id : int
- color : typing.Optional[str]
-
- control_weights : typing.Optional[typing.Optional[typing.Any]]
-
- created_by : typing.Optional[UserSimpleRequest]
- Project owner
-
- description : typing.Optional[str]
- Project description
-
- enable_empty_annotation : typing.Optional[bool]
- Allow annotators to submit empty annotations
-
- evaluate_predictions_automatically : typing.Optional[bool]
- Retrieve and display predictions when loading a task
-
- expert_instruction : typing.Optional[str]
- Labeling instructions in HTML format
-
- is_draft : typing.Optional[bool]
- Whether or not the project is in the middle of being created
-
- is_published : typing.Optional[bool]
- Whether or not the project is published to annotators
-
- label_config : typing.Optional[str]
- Label config in XML format. See more about it in documentation
-
- maximum_annotations : typing.Optional[int]
- Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
-
- min_annotations_to_start_training : typing.Optional[int]
- Minimum number of completed tasks after which model training is started
-
- model_version : typing.Optional[str]
- Machine learning model version
-
- organization : typing.Optional[int]
-
- overlap_cohort_percentage : typing.Optional[int]
-
- pinned_at : typing.Optional[dt.datetime]
- Pinned date and time
-
- reveal_preannotations_interactively : typing.Optional[bool]
- Reveal pre-annotations interactively
-
- sampling : typing.Optional[ProjectRequestSampling]
-
- show_annotation_history : typing.Optional[bool]
- Show annotation history to annotator
-
- show_collab_predictions : typing.Optional[bool]
- If set, the annotator can view model predictions
-
- show_ground_truth_first : typing.Optional[bool]
-
- show_instruction : typing.Optional[bool]
- Show instructions to the annotator before they start
-
- show_overlap_first : typing.Optional[bool]
-
- show_skip_button : typing.Optional[bool]
- Show a skip button in interface and allow annotators to skip the task
-
- skip_queue : typing.Optional[ProjectRequestSkipQueue]
-
- task_data_login : typing.Optional[str]
- Task data credentials: login
-
- task_data_password : typing.Optional[str]
- Task data credentials: password
-
- title : typing.Optional[str]
- Project name. Must be between 3 and 50 characters long.
+ project : int
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
- Project
-
+ WorkspaceProjects
+ Project created
Examples
--------
@@ -213,48 +104,16 @@ def add(
client = LabelStudio(
api_key="YOUR_API_KEY",
)
- client.workspaces.projects.add(
+ client.workspaces.projects.create(
id=1,
+ project=1,
)
"""
_response = self._client_wrapper.httpx_client.request(
f"api/workspaces/{jsonable_encoder(id)}/projects/",
method="POST",
json={
- "color": color,
- "control_weights": control_weights,
- "created_by": convert_and_respect_annotation_metadata(
- object_=created_by, annotation=UserSimpleRequest, direction="write"
- ),
- "description": description,
- "enable_empty_annotation": enable_empty_annotation,
- "evaluate_predictions_automatically": evaluate_predictions_automatically,
- "expert_instruction": expert_instruction,
- "is_draft": is_draft,
- "is_published": is_published,
- "label_config": label_config,
- "maximum_annotations": maximum_annotations,
- "min_annotations_to_start_training": min_annotations_to_start_training,
- "model_version": model_version,
- "organization": organization,
- "overlap_cohort_percentage": overlap_cohort_percentage,
- "pinned_at": pinned_at,
- "reveal_preannotations_interactively": reveal_preannotations_interactively,
- "sampling": convert_and_respect_annotation_metadata(
- object_=sampling, annotation=ProjectRequestSampling, direction="write"
- ),
- "show_annotation_history": show_annotation_history,
- "show_collab_predictions": show_collab_predictions,
- "show_ground_truth_first": show_ground_truth_first,
- "show_instruction": show_instruction,
- "show_overlap_first": show_overlap_first,
- "show_skip_button": show_skip_button,
- "skip_queue": convert_and_respect_annotation_metadata(
- object_=skip_queue, annotation=ProjectRequestSkipQueue, direction="write"
- ),
- "task_data_login": task_data_login,
- "task_data_password": task_data_password,
- "title": title,
+ "project": project,
},
headers={
"content-type": "application/json",
@@ -265,9 +124,9 @@ def add(
try:
if 200 <= _response.status_code < 300:
return typing.cast(
- Project,
+ WorkspaceProjects,
construct_type(
- type_=Project, # type: ignore
+ type_=WorkspaceProjects, # type: ignore
object_=_response.json(),
),
)
@@ -276,7 +135,7 @@ def add(
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
"""
@@ -304,7 +163,7 @@ def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] =
client = LabelStudio(
api_key="YOUR_API_KEY",
)
- client.workspaces.projects.remove(
+ client.workspaces.projects.delete(
id=1,
)
"""
@@ -326,7 +185,7 @@ class AsyncProjectsClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
self._client_wrapper = client_wrapper
- async def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> Project:
+ async def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> typing.List[Project]:
"""
@@ -345,8 +204,8 @@ async def list(self, id: int, *, request_options: typing.Optional[RequestOptions
Returns
-------
- Project
-
+ typing.List[Project]
+ Projects list
Examples
--------
@@ -375,9 +234,9 @@ async def main() -> None:
try:
if 200 <= _response.status_code < 300:
return typing.cast(
- Project,
+ typing.List[Project],
construct_type(
- type_=Project, # type: ignore
+ type_=typing.List[Project], # type: ignore
object_=_response.json(),
),
)
@@ -386,40 +245,9 @@ async def main() -> None:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- async def add(
- self,
- id: int,
- *,
- color: typing.Optional[str] = OMIT,
- control_weights: typing.Optional[typing.Optional[typing.Any]] = OMIT,
- created_by: typing.Optional[UserSimpleRequest] = OMIT,
- description: typing.Optional[str] = OMIT,
- enable_empty_annotation: typing.Optional[bool] = OMIT,
- evaluate_predictions_automatically: typing.Optional[bool] = OMIT,
- expert_instruction: typing.Optional[str] = OMIT,
- is_draft: typing.Optional[bool] = OMIT,
- is_published: typing.Optional[bool] = OMIT,
- label_config: typing.Optional[str] = OMIT,
- maximum_annotations: typing.Optional[int] = OMIT,
- min_annotations_to_start_training: typing.Optional[int] = OMIT,
- model_version: typing.Optional[str] = OMIT,
- organization: typing.Optional[int] = OMIT,
- overlap_cohort_percentage: typing.Optional[int] = OMIT,
- pinned_at: typing.Optional[dt.datetime] = OMIT,
- reveal_preannotations_interactively: typing.Optional[bool] = OMIT,
- sampling: typing.Optional[ProjectRequestSampling] = OMIT,
- show_annotation_history: typing.Optional[bool] = OMIT,
- show_collab_predictions: typing.Optional[bool] = OMIT,
- show_ground_truth_first: typing.Optional[bool] = OMIT,
- show_instruction: typing.Optional[bool] = OMIT,
- show_overlap_first: typing.Optional[bool] = OMIT,
- show_skip_button: typing.Optional[bool] = OMIT,
- skip_queue: typing.Optional[ProjectRequestSkipQueue] = OMIT,
- task_data_login: typing.Optional[str] = OMIT,
- task_data_password: typing.Optional[str] = OMIT,
- title: typing.Optional[str] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> Project:
+ async def create(
+ self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None
+ ) -> WorkspaceProjects:
"""
@@ -433,89 +261,15 @@ async def add(
----------
id : int
- color : typing.Optional[str]
-
- control_weights : typing.Optional[typing.Optional[typing.Any]]
-
- created_by : typing.Optional[UserSimpleRequest]
- Project owner
-
- description : typing.Optional[str]
- Project description
-
- enable_empty_annotation : typing.Optional[bool]
- Allow annotators to submit empty annotations
-
- evaluate_predictions_automatically : typing.Optional[bool]
- Retrieve and display predictions when loading a task
-
- expert_instruction : typing.Optional[str]
- Labeling instructions in HTML format
-
- is_draft : typing.Optional[bool]
- Whether or not the project is in the middle of being created
-
- is_published : typing.Optional[bool]
- Whether or not the project is published to annotators
-
- label_config : typing.Optional[str]
- Label config in XML format. See more about it in documentation
-
- maximum_annotations : typing.Optional[int]
- Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
-
- min_annotations_to_start_training : typing.Optional[int]
- Minimum number of completed tasks after which model training is started
-
- model_version : typing.Optional[str]
- Machine learning model version
-
- organization : typing.Optional[int]
-
- overlap_cohort_percentage : typing.Optional[int]
-
- pinned_at : typing.Optional[dt.datetime]
- Pinned date and time
-
- reveal_preannotations_interactively : typing.Optional[bool]
- Reveal pre-annotations interactively
-
- sampling : typing.Optional[ProjectRequestSampling]
-
- show_annotation_history : typing.Optional[bool]
- Show annotation history to annotator
-
- show_collab_predictions : typing.Optional[bool]
- If set, the annotator can view model predictions
-
- show_ground_truth_first : typing.Optional[bool]
-
- show_instruction : typing.Optional[bool]
- Show instructions to the annotator before they start
-
- show_overlap_first : typing.Optional[bool]
-
- show_skip_button : typing.Optional[bool]
- Show a skip button in interface and allow annotators to skip the task
-
- skip_queue : typing.Optional[ProjectRequestSkipQueue]
-
- task_data_login : typing.Optional[str]
- Task data credentials: login
-
- task_data_password : typing.Optional[str]
- Task data credentials: password
-
- title : typing.Optional[str]
- Project name. Must be between 3 and 50 characters long.
+ project : int
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
- Project
-
+ WorkspaceProjects
+ Project created
Examples
--------
@@ -529,8 +283,9 @@ async def add(
async def main() -> None:
- await client.workspaces.projects.add(
+ await client.workspaces.projects.create(
id=1,
+ project=1,
)
@@ -540,40 +295,7 @@ async def main() -> None:
f"api/workspaces/{jsonable_encoder(id)}/projects/",
method="POST",
json={
- "color": color,
- "control_weights": control_weights,
- "created_by": convert_and_respect_annotation_metadata(
- object_=created_by, annotation=UserSimpleRequest, direction="write"
- ),
- "description": description,
- "enable_empty_annotation": enable_empty_annotation,
- "evaluate_predictions_automatically": evaluate_predictions_automatically,
- "expert_instruction": expert_instruction,
- "is_draft": is_draft,
- "is_published": is_published,
- "label_config": label_config,
- "maximum_annotations": maximum_annotations,
- "min_annotations_to_start_training": min_annotations_to_start_training,
- "model_version": model_version,
- "organization": organization,
- "overlap_cohort_percentage": overlap_cohort_percentage,
- "pinned_at": pinned_at,
- "reveal_preannotations_interactively": reveal_preannotations_interactively,
- "sampling": convert_and_respect_annotation_metadata(
- object_=sampling, annotation=ProjectRequestSampling, direction="write"
- ),
- "show_annotation_history": show_annotation_history,
- "show_collab_predictions": show_collab_predictions,
- "show_ground_truth_first": show_ground_truth_first,
- "show_instruction": show_instruction,
- "show_overlap_first": show_overlap_first,
- "show_skip_button": show_skip_button,
- "skip_queue": convert_and_respect_annotation_metadata(
- object_=skip_queue, annotation=ProjectRequestSkipQueue, direction="write"
- ),
- "task_data_login": task_data_login,
- "task_data_password": task_data_password,
- "title": title,
+ "project": project,
},
headers={
"content-type": "application/json",
@@ -584,9 +306,9 @@ async def main() -> None:
try:
if 200 <= _response.status_code < 300:
return typing.cast(
- Project,
+ WorkspaceProjects,
construct_type(
- type_=Project, # type: ignore
+ type_=WorkspaceProjects, # type: ignore
object_=_response.json(),
),
)
@@ -595,7 +317,7 @@ async def main() -> None:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- async def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ async def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
"""
@@ -628,7 +350,7 @@ async def remove(self, id: int, *, request_options: typing.Optional[RequestOptio
async def main() -> None:
- await client.workspaces.projects.remove(
+ await client.workspaces.projects.delete(
id=1,
)
diff --git a/src/label_studio_sdk/workspaces/projects/types/__init__.py b/src/label_studio_sdk/workspaces/projects/types/__init__.py
deleted file mode 100644
index 83f299ce6..000000000
--- a/src/label_studio_sdk/workspaces/projects/types/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-from .project_request_sampling import ProjectRequestSampling
-from .project_request_skip_queue import ProjectRequestSkipQueue
-
-__all__ = ["ProjectRequestSampling", "ProjectRequestSkipQueue"]
diff --git a/src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py b/src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py
deleted file mode 100644
index 8cc4fed71..000000000
--- a/src/label_studio_sdk/workspaces/projects/types/project_request_sampling.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-from ....types.sampling_de5enum import SamplingDe5Enum
-from ....types.null_enum import NullEnum
-
-ProjectRequestSampling = typing.Union[SamplingDe5Enum, NullEnum]
diff --git a/src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py b/src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py
deleted file mode 100644
index b4fc0196a..000000000
--- a/src/label_studio_sdk/workspaces/projects/types/project_request_skip_queue.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-from ....types.skip_queue_enum import SkipQueueEnum
-from ....types.null_enum import NullEnum
-
-ProjectRequestSkipQueue = typing.Union[SkipQueueEnum, NullEnum]
diff --git a/tests/projects/test_stats.py b/tests/projects/test_stats.py
index cfac44c87..a485a8fca 100644
--- a/tests/projects/test_stats.py
+++ b/tests/projects/test_stats.py
@@ -75,6 +75,16 @@ async def test_agreement_annotator(client: LabelStudio, async_client: AsyncLabel
validate_response(async_response, expected_response, expected_types)
+async def test_agreement_annotators(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"agreement": {"key": 1.1}}
+ expected_types: typing.Any = {"agreement": ("dict", {0: (None, None)})}
+ response = client.projects.stats.agreement_annotators(id=1, ids="ids")
+ validate_response(response, expected_response, expected_types)
+
+ async_response = await async_client.projects.stats.agreement_annotators(id=1, ids="ids")
+ validate_response(async_response, expected_response, expected_types)
+
+
async def test_data_filters(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
expected_response: typing.Any = {"user_filters": {"stats": [{}], "tasks_with_annotations": {"key": "value"}}}
expected_types: typing.Any = {
diff --git a/tests/workspaces/test_projects.py b/tests/workspaces/test_projects.py
index f236fbcfe..dfdcef4f8 100644
--- a/tests/workspaces/test_projects.py
+++ b/tests/workspaces/test_projects.py
@@ -7,104 +7,111 @@
async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
- expected_response: typing.Any = {
- "color": "color",
- "config_has_control_tags": True,
- "config_suitable_for_bulk_annotation": True,
- "control_weights": {"key": "value"},
- "created_at": "2024-01-15T09:30:00Z",
- "created_by": {
- "avatar": "avatar",
- "email": "email",
- "first_name": "first_name",
+ expected_response: typing.Any = [
+ {
+ "color": "color",
+ "config_has_control_tags": True,
+ "config_suitable_for_bulk_annotation": True,
+ "control_weights": {"key": "value"},
+ "created_at": "2024-01-15T09:30:00Z",
+ "created_by": {
+ "avatar": "avatar",
+ "email": "email",
+ "first_name": "first_name",
+ "id": 1,
+ "last_name": "last_name",
+ },
+ "description": "description",
+ "enable_empty_annotation": True,
+ "evaluate_predictions_automatically": True,
+ "expert_instruction": "expert_instruction",
+ "finished_task_number": 1,
+ "ground_truth_number": 1,
"id": 1,
- "last_name": "last_name",
+ "is_draft": True,
+ "is_published": True,
+ "label_config": "label_config",
+ "maximum_annotations": 1,
+ "min_annotations_to_start_training": 1,
+ "model_version": "model_version",
+ "num_tasks_with_annotations": 1,
+ "organization": 1,
+ "overlap_cohort_percentage": 1,
+ "parsed_label_config": {"key": "value"},
+ "pinned_at": "2024-01-15T09:30:00Z",
+ "queue_done": 1,
+ "queue_total": 1,
+ "reveal_preannotations_interactively": True,
+ "sampling": "Sequential sampling",
+ "show_annotation_history": True,
+ "show_collab_predictions": True,
+ "show_ground_truth_first": True,
+ "show_instruction": True,
+ "show_overlap_first": True,
+ "show_skip_button": True,
+ "skip_queue": "REQUEUE_FOR_ME",
+ "skipped_annotations_number": 1,
+ "start_training_on_annotation_update": True,
+ "task_data_login": "task_data_login",
+ "task_data_password": "task_data_password",
+ "task_number": 1,
+ "title": "title",
+ "total_annotations_number": 1,
+ "total_predictions_number": 1,
+ "useful_annotation_number": 1,
+ }
+ ]
+ expected_types: typing.Tuple[typing.Any, typing.Any] = (
+ "list",
+ {
+ 0: {
+ "color": None,
+ "config_has_control_tags": None,
+ "config_suitable_for_bulk_annotation": None,
+ "control_weights": None,
+ "created_at": "datetime",
+ "created_by": {"avatar": None, "email": None, "first_name": None, "id": "integer", "last_name": None},
+ "description": None,
+ "enable_empty_annotation": None,
+ "evaluate_predictions_automatically": None,
+ "expert_instruction": None,
+ "finished_task_number": "integer",
+ "ground_truth_number": "integer",
+ "id": "integer",
+ "is_draft": None,
+ "is_published": None,
+ "label_config": None,
+ "maximum_annotations": "integer",
+ "min_annotations_to_start_training": "integer",
+ "model_version": None,
+ "num_tasks_with_annotations": "integer",
+ "organization": "integer",
+ "overlap_cohort_percentage": "integer",
+ "parsed_label_config": None,
+ "pinned_at": "datetime",
+ "queue_done": "integer",
+ "queue_total": "integer",
+ "reveal_preannotations_interactively": None,
+ "sampling": None,
+ "show_annotation_history": None,
+ "show_collab_predictions": None,
+ "show_ground_truth_first": None,
+ "show_instruction": None,
+ "show_overlap_first": None,
+ "show_skip_button": None,
+ "skip_queue": None,
+ "skipped_annotations_number": "integer",
+ "start_training_on_annotation_update": None,
+ "task_data_login": None,
+ "task_data_password": None,
+ "task_number": "integer",
+ "title": None,
+ "total_annotations_number": "integer",
+ "total_predictions_number": "integer",
+ "useful_annotation_number": "integer",
+ }
},
- "description": "description",
- "enable_empty_annotation": True,
- "evaluate_predictions_automatically": True,
- "expert_instruction": "expert_instruction",
- "finished_task_number": 1,
- "ground_truth_number": 1,
- "id": 1,
- "is_draft": True,
- "is_published": True,
- "label_config": "label_config",
- "maximum_annotations": 1,
- "min_annotations_to_start_training": 1,
- "model_version": "model_version",
- "num_tasks_with_annotations": 1,
- "organization": 1,
- "overlap_cohort_percentage": 1,
- "parsed_label_config": {"key": "value"},
- "pinned_at": "2024-01-15T09:30:00Z",
- "queue_done": 1,
- "queue_total": 1,
- "reveal_preannotations_interactively": True,
- "sampling": "Sequential sampling",
- "show_annotation_history": True,
- "show_collab_predictions": True,
- "show_ground_truth_first": True,
- "show_instruction": True,
- "show_overlap_first": True,
- "show_skip_button": True,
- "skip_queue": "REQUEUE_FOR_ME",
- "skipped_annotations_number": 1,
- "start_training_on_annotation_update": True,
- "task_data_login": "task_data_login",
- "task_data_password": "task_data_password",
- "task_number": 1,
- "title": "title",
- "total_annotations_number": 1,
- "total_predictions_number": 1,
- "useful_annotation_number": 1,
- }
- expected_types: typing.Any = {
- "color": None,
- "config_has_control_tags": None,
- "config_suitable_for_bulk_annotation": None,
- "control_weights": None,
- "created_at": "datetime",
- "created_by": {"avatar": None, "email": None, "first_name": None, "id": "integer", "last_name": None},
- "description": None,
- "enable_empty_annotation": None,
- "evaluate_predictions_automatically": None,
- "expert_instruction": None,
- "finished_task_number": "integer",
- "ground_truth_number": "integer",
- "id": "integer",
- "is_draft": None,
- "is_published": None,
- "label_config": None,
- "maximum_annotations": "integer",
- "min_annotations_to_start_training": "integer",
- "model_version": None,
- "num_tasks_with_annotations": "integer",
- "organization": "integer",
- "overlap_cohort_percentage": "integer",
- "parsed_label_config": None,
- "pinned_at": "datetime",
- "queue_done": "integer",
- "queue_total": "integer",
- "reveal_preannotations_interactively": None,
- "sampling": None,
- "show_annotation_history": None,
- "show_collab_predictions": None,
- "show_ground_truth_first": None,
- "show_instruction": None,
- "show_overlap_first": None,
- "show_skip_button": None,
- "skip_queue": None,
- "skipped_annotations_number": "integer",
- "start_training_on_annotation_update": None,
- "task_data_login": None,
- "task_data_password": None,
- "task_number": "integer",
- "title": None,
- "total_annotations_number": "integer",
- "total_predictions_number": "integer",
- "useful_annotation_number": "integer",
- }
+ )
response = client.workspaces.projects.list(id=1)
validate_response(response, expected_response, expected_types)
@@ -112,120 +119,24 @@ async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> Non
validate_response(async_response, expected_response, expected_types)
-async def test_add(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
- expected_response: typing.Any = {
- "color": "color",
- "config_has_control_tags": True,
- "config_suitable_for_bulk_annotation": True,
- "control_weights": {"key": "value"},
- "created_at": "2024-01-15T09:30:00Z",
- "created_by": {
- "avatar": "avatar",
- "email": "email",
- "first_name": "first_name",
- "id": 1,
- "last_name": "last_name",
- },
- "description": "description",
- "enable_empty_annotation": True,
- "evaluate_predictions_automatically": True,
- "expert_instruction": "expert_instruction",
- "finished_task_number": 1,
- "ground_truth_number": 1,
- "id": 1,
- "is_draft": True,
- "is_published": True,
- "label_config": "label_config",
- "maximum_annotations": 1,
- "min_annotations_to_start_training": 1,
- "model_version": "model_version",
- "num_tasks_with_annotations": 1,
- "organization": 1,
- "overlap_cohort_percentage": 1,
- "parsed_label_config": {"key": "value"},
- "pinned_at": "2024-01-15T09:30:00Z",
- "queue_done": 1,
- "queue_total": 1,
- "reveal_preannotations_interactively": True,
- "sampling": "Sequential sampling",
- "show_annotation_history": True,
- "show_collab_predictions": True,
- "show_ground_truth_first": True,
- "show_instruction": True,
- "show_overlap_first": True,
- "show_skip_button": True,
- "skip_queue": "REQUEUE_FOR_ME",
- "skipped_annotations_number": 1,
- "start_training_on_annotation_update": True,
- "task_data_login": "task_data_login",
- "task_data_password": "task_data_password",
- "task_number": 1,
- "title": "title",
- "total_annotations_number": 1,
- "total_predictions_number": 1,
- "useful_annotation_number": 1,
- }
- expected_types: typing.Any = {
- "color": None,
- "config_has_control_tags": None,
- "config_suitable_for_bulk_annotation": None,
- "control_weights": None,
- "created_at": "datetime",
- "created_by": {"avatar": None, "email": None, "first_name": None, "id": "integer", "last_name": None},
- "description": None,
- "enable_empty_annotation": None,
- "evaluate_predictions_automatically": None,
- "expert_instruction": None,
- "finished_task_number": "integer",
- "ground_truth_number": "integer",
- "id": "integer",
- "is_draft": None,
- "is_published": None,
- "label_config": None,
- "maximum_annotations": "integer",
- "min_annotations_to_start_training": "integer",
- "model_version": None,
- "num_tasks_with_annotations": "integer",
- "organization": "integer",
- "overlap_cohort_percentage": "integer",
- "parsed_label_config": None,
- "pinned_at": "datetime",
- "queue_done": "integer",
- "queue_total": "integer",
- "reveal_preannotations_interactively": None,
- "sampling": None,
- "show_annotation_history": None,
- "show_collab_predictions": None,
- "show_ground_truth_first": None,
- "show_instruction": None,
- "show_overlap_first": None,
- "show_skip_button": None,
- "skip_queue": None,
- "skipped_annotations_number": "integer",
- "start_training_on_annotation_update": None,
- "task_data_login": None,
- "task_data_password": None,
- "task_number": "integer",
- "title": None,
- "total_annotations_number": "integer",
- "total_predictions_number": "integer",
- "useful_annotation_number": "integer",
- }
- response = client.workspaces.projects.add(id=1)
+async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+ expected_response: typing.Any = {"project": 1}
+ expected_types: typing.Any = {"project": "integer"}
+ response = client.workspaces.projects.create(id=1, project=1)
validate_response(response, expected_response, expected_types)
- async_response = await async_client.workspaces.projects.add(id=1)
+ async_response = await async_client.workspaces.projects.create(id=1, project=1)
validate_response(async_response, expected_response, expected_types)
-async def test_remove(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+async def test_delete(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
# Type ignore to avoid mypy complaining about the function not being meant to return a value
assert (
- client.workspaces.projects.remove(id=1) # type: ignore[func-returns-value]
+ client.workspaces.projects.delete(id=1) # type: ignore[func-returns-value]
is None
)
assert (
- await async_client.workspaces.projects.remove(id=1) # type: ignore[func-returns-value]
+ await async_client.workspaces.projects.delete(id=1) # type: ignore[func-returns-value]
is None
)
From de73cf5c8a5b2aeedbbf5529c4f79a816dfa0b91 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Wed, 8 Oct 2025 15:56:57 +0000
Subject: [PATCH 06/11] SDK regeneration
---
.../definition/projects/annotatorWeights.yml | 8 +-
.mock/openapi/openapi.yaml | 8 +-
reference.md | 171 ----------
src/label_studio_sdk/__init__.py | 2 -
src/label_studio_sdk/projects/__init__.py | 3 +-
.../projects/annotator_weights/__init__.py | 2 -
.../projects/annotator_weights/client.py | 292 ------------------
src/label_studio_sdk/projects/client.py | 4 -
src/label_studio_sdk/types/__init__.py | 2 -
.../types/lse_project_params.py | 23 --
tests/projects/test_annotator_weights.py | 28 --
11 files changed, 9 insertions(+), 534 deletions(-)
delete mode 100644 src/label_studio_sdk/projects/annotator_weights/__init__.py
delete mode 100644 src/label_studio_sdk/projects/annotator_weights/client.py
delete mode 100644 src/label_studio_sdk/types/lse_project_params.py
delete mode 100644 tests/projects/test_annotator_weights.py
diff --git a/.mock/definition/projects/annotatorWeights.yml b/.mock/definition/projects/annotatorWeights.yml
index a31be749a..af253a281 100644
--- a/.mock/definition/projects/annotatorWeights.yml
+++ b/.mock/definition/projects/annotatorWeights.yml
@@ -16,7 +16,7 @@ service:
Retrieve the annotator weights for statistics and Cohen's Kappa for a
- specific project.
+ specific project. Affects dashboard-members stats, but old and unused.
source:
openapi: openapi/openapi.yaml
path-parameters:
@@ -34,7 +34,7 @@ service:
key: value
use_kappa: true
audiences:
- - public
+ - internal
create:
path: /api/projects/{id}/project-extra-params/
method: POST
@@ -48,7 +48,7 @@ service:
Create annotator weights to be used in the annotation statistics for a
project, such as when calculating kappa metrics for inter-annotator
- agreement.
+ agreement. Affects dashboard-members stats, but old and unused.
source:
openapi: openapi/openapi.yaml
path-parameters:
@@ -84,6 +84,6 @@ service:
key: value
use_kappa: true
audiences:
- - public
+ - internal
source:
openapi: openapi/openapi.yaml
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index 9ad19dec8..bd9899e9a 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -8745,7 +8745,7 @@ paths:
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
+ Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project. Affects dashboard-members stats, but old and unused.
operationId: api_projects_project_extra_params_retrieve
parameters:
- in: path
@@ -8768,7 +8768,7 @@ paths:
tags:
- Projects
x-fern-audiences:
- - public
+ - internal
x-fern-sdk-group-name:
- projects
- annotator_weights
@@ -8781,7 +8781,7 @@ paths:
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
+ Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement. Affects dashboard-members stats, but old and unused.
operationId: api_projects_project_extra_params_create
parameters:
- in: path
@@ -8822,7 +8822,7 @@ paths:
tags:
- Projects
x-fern-audiences:
- - public
+ - internal
x-fern-sdk-group-name:
- projects
- annotator_weights
diff --git a/reference.md b/reference.md
index b7c450578..d7acbb51f 100644
--- a/reference.md
+++ b/reference.md
@@ -32444,177 +32444,6 @@ client.projects.stats.user_ground_truth_agreement(
-
-
-
-
-## Projects AnnotatorWeights
-client.projects.annotator_weights.get(...)
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from label_studio_sdk import LabelStudio
-
-client = LabelStudio(
- api_key="YOUR_API_KEY",
-)
-client.projects.annotator_weights.get(
- id=1,
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**id:** `int`
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
-
-
-
-
-client.projects.annotator_weights.create(...)
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
-Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from label_studio_sdk import LabelStudio
-
-client = LabelStudio(
- api_key="YOUR_API_KEY",
-)
-client.projects.annotator_weights.create(
- id=1,
- annotator_params={"123": 1, "456": 0.75},
- use_kappa=True,
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**id:** `int`
-
-
-
-
-
--
-
-**annotator_params:** `typing.Optional[typing.Optional[typing.Any]]`
-
-
-
-
-
--
-
-**use_kappa:** `typing.Optional[bool]` — If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
diff --git a/src/label_studio_sdk/__init__.py b/src/label_studio_sdk/__init__.py
index 8afa6b637..c97bbcada 100644
--- a/src/label_studio_sdk/__init__.py
+++ b/src/label_studio_sdk/__init__.py
@@ -90,7 +90,6 @@
LseProjectCreate,
LseProjectCreateSampling,
LseProjectCreateSkipQueue,
- LseProjectParams,
LseProjectResponse,
LseProjectResponseSampling,
LseProjectResponseSkipQueue,
@@ -475,7 +474,6 @@
"LseProjectCreateRequestSkipQueue",
"LseProjectCreateSampling",
"LseProjectCreateSkipQueue",
- "LseProjectParams",
"LseProjectResponse",
"LseProjectResponseSampling",
"LseProjectResponseSkipQueue",
diff --git a/src/label_studio_sdk/projects/__init__.py b/src/label_studio_sdk/projects/__init__.py
index fcb2e8ebf..7242173d3 100644
--- a/src/label_studio_sdk/projects/__init__.py
+++ b/src/label_studio_sdk/projects/__init__.py
@@ -9,7 +9,7 @@
ProjectsImportPredictionsResponse,
ProjectsImportTasksResponse,
)
-from . import annotator_weights, assignments, exports, members, metrics, pauses, roles, stats
+from . import assignments, exports, members, metrics, pauses, roles, stats
from .assignments import (
AssignmentsAssignRequestType,
AssignmentsBulkAssignRequestFilters,
@@ -103,7 +103,6 @@
"StatsUserReviewScoreResponse",
"StatsUserReviewScoreResponsePerformanceScore",
"StatsUserReviewScoreResponseReviewScore",
- "annotator_weights",
"assignments",
"exports",
"members",
diff --git a/src/label_studio_sdk/projects/annotator_weights/__init__.py b/src/label_studio_sdk/projects/annotator_weights/__init__.py
deleted file mode 100644
index f3ea2659b..000000000
--- a/src/label_studio_sdk/projects/annotator_weights/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
diff --git a/src/label_studio_sdk/projects/annotator_weights/client.py b/src/label_studio_sdk/projects/annotator_weights/client.py
deleted file mode 100644
index d3f127fec..000000000
--- a/src/label_studio_sdk/projects/annotator_weights/client.py
+++ /dev/null
@@ -1,292 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-from ...core.client_wrapper import SyncClientWrapper
-from ...core.request_options import RequestOptions
-from ...types.lse_project_params import LseProjectParams
-from ...core.jsonable_encoder import jsonable_encoder
-from ...core.unchecked_base_model import construct_type
-from json.decoder import JSONDecodeError
-from ...core.api_error import ApiError
-from ...core.client_wrapper import AsyncClientWrapper
-
-# this is used as the default value for optional parameters
-OMIT = typing.cast(typing.Any, ...)
-
-
-class AnnotatorWeightsClient:
- def __init__(self, *, client_wrapper: SyncClientWrapper):
- self._client_wrapper = client_wrapper
-
- def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> LseProjectParams:
- """
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
-
- Parameters
- ----------
- id : int
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- LseProjectParams
- Annotator weights retrieved
-
- Examples
- --------
- from label_studio_sdk import LabelStudio
-
- client = LabelStudio(
- api_key="YOUR_API_KEY",
- )
- client.projects.annotator_weights.get(
- id=1,
- )
- """
- _response = self._client_wrapper.httpx_client.request(
- f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
- method="GET",
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- return typing.cast(
- LseProjectParams,
- construct_type(
- type_=LseProjectParams, # type: ignore
- object_=_response.json(),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, body=_response.text)
- raise ApiError(status_code=_response.status_code, body=_response_json)
-
- def create(
- self,
- id: int,
- *,
- annotator_params: typing.Optional[typing.Optional[typing.Any]] = OMIT,
- use_kappa: typing.Optional[bool] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> LseProjectParams:
- """
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
-
- Parameters
- ----------
- id : int
-
- annotator_params : typing.Optional[typing.Optional[typing.Any]]
-
- use_kappa : typing.Optional[bool]
- If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- LseProjectParams
- Annotator weights created/updated
-
- Examples
- --------
- from label_studio_sdk import LabelStudio
-
- client = LabelStudio(
- api_key="YOUR_API_KEY",
- )
- client.projects.annotator_weights.create(
- id=1,
- annotator_params={"123": 1, "456": 0.75},
- use_kappa=True,
- )
- """
- _response = self._client_wrapper.httpx_client.request(
- f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
- method="POST",
- json={
- "annotator_params": annotator_params,
- "use_kappa": use_kappa,
- },
- headers={
- "content-type": "application/json",
- },
- request_options=request_options,
- omit=OMIT,
- )
- try:
- if 200 <= _response.status_code < 300:
- return typing.cast(
- LseProjectParams,
- construct_type(
- type_=LseProjectParams, # type: ignore
- object_=_response.json(),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, body=_response.text)
- raise ApiError(status_code=_response.status_code, body=_response_json)
-
-
-class AsyncAnnotatorWeightsClient:
- def __init__(self, *, client_wrapper: AsyncClientWrapper):
- self._client_wrapper = client_wrapper
-
- async def get(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> LseProjectParams:
- """
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Retrieve the annotator weights for statistics and Cohen's Kappa for a specific project.
-
- Parameters
- ----------
- id : int
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- LseProjectParams
- Annotator weights retrieved
-
- Examples
- --------
- import asyncio
-
- from label_studio_sdk import AsyncLabelStudio
-
- client = AsyncLabelStudio(
- api_key="YOUR_API_KEY",
- )
-
-
- async def main() -> None:
- await client.projects.annotator_weights.get(
- id=1,
- )
-
-
- asyncio.run(main())
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
- method="GET",
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- return typing.cast(
- LseProjectParams,
- construct_type(
- type_=LseProjectParams, # type: ignore
- object_=_response.json(),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, body=_response.text)
- raise ApiError(status_code=_response.status_code, body=_response_json)
-
- async def create(
- self,
- id: int,
- *,
- annotator_params: typing.Optional[typing.Optional[typing.Any]] = OMIT,
- use_kappa: typing.Optional[bool] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> LseProjectParams:
- """
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Create annotator weights to be used in the annotation statistics for a project, such as when calculating kappa metrics for inter-annotator agreement.
-
- Parameters
- ----------
- id : int
-
- annotator_params : typing.Optional[typing.Optional[typing.Any]]
-
- use_kappa : typing.Optional[bool]
- If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- LseProjectParams
- Annotator weights created/updated
-
- Examples
- --------
- import asyncio
-
- from label_studio_sdk import AsyncLabelStudio
-
- client = AsyncLabelStudio(
- api_key="YOUR_API_KEY",
- )
-
-
- async def main() -> None:
- await client.projects.annotator_weights.create(
- id=1,
- annotator_params={"123": 1, "456": 0.75},
- use_kappa=True,
- )
-
-
- asyncio.run(main())
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"api/projects/{jsonable_encoder(id)}/project-extra-params/",
- method="POST",
- json={
- "annotator_params": annotator_params,
- "use_kappa": use_kappa,
- },
- headers={
- "content-type": "application/json",
- },
- request_options=request_options,
- omit=OMIT,
- )
- try:
- if 200 <= _response.status_code < 300:
- return typing.cast(
- LseProjectParams,
- construct_type(
- type_=LseProjectParams, # type: ignore
- object_=_response.json(),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, body=_response.text)
- raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/src/label_studio_sdk/projects/client.py b/src/label_studio_sdk/projects/client.py
index b43048943..1fdb4adb1 100644
--- a/src/label_studio_sdk/projects/client.py
+++ b/src/label_studio_sdk/projects/client.py
@@ -7,7 +7,6 @@
from .members.client import MembersClient
from .metrics.client import MetricsClient
from .stats.client import StatsClient
-from .annotator_weights.client import AnnotatorWeightsClient
from .assignments.client import AssignmentsClient
from .pauses.client import PausesClient
from ..core.request_options import RequestOptions
@@ -46,7 +45,6 @@
from .members.client import AsyncMembersClient
from .metrics.client import AsyncMetricsClient
from .stats.client import AsyncStatsClient
-from .annotator_weights.client import AsyncAnnotatorWeightsClient
from .assignments.client import AsyncAssignmentsClient
from .pauses.client import AsyncPausesClient
from ..core.pagination import AsyncPager
@@ -63,7 +61,6 @@ def __init__(self, *, client_wrapper: SyncClientWrapper):
self.members = MembersClient(client_wrapper=self._client_wrapper)
self.metrics = MetricsClient(client_wrapper=self._client_wrapper)
self.stats = StatsClient(client_wrapper=self._client_wrapper)
- self.annotator_weights = AnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.assignments = AssignmentsClient(client_wrapper=self._client_wrapper)
self.pauses = PausesClient(client_wrapper=self._client_wrapper)
@@ -1248,7 +1245,6 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper):
self.members = AsyncMembersClient(client_wrapper=self._client_wrapper)
self.metrics = AsyncMetricsClient(client_wrapper=self._client_wrapper)
self.stats = AsyncStatsClient(client_wrapper=self._client_wrapper)
- self.annotator_weights = AsyncAnnotatorWeightsClient(client_wrapper=self._client_wrapper)
self.assignments = AsyncAssignmentsClient(client_wrapper=self._client_wrapper)
self.pauses = AsyncPausesClient(client_wrapper=self._client_wrapper)
diff --git a/src/label_studio_sdk/types/__init__.py b/src/label_studio_sdk/types/__init__.py
index 80ced6142..88a132721 100644
--- a/src/label_studio_sdk/types/__init__.py
+++ b/src/label_studio_sdk/types/__init__.py
@@ -91,7 +91,6 @@
from .lse_project_create import LseProjectCreate
from .lse_project_create_sampling import LseProjectCreateSampling
from .lse_project_create_skip_queue import LseProjectCreateSkipQueue
-from .lse_project_params import LseProjectParams
from .lse_project_response import LseProjectResponse
from .lse_project_response_sampling import LseProjectResponseSampling
from .lse_project_response_skip_queue import LseProjectResponseSkipQueue
@@ -335,7 +334,6 @@
"LseProjectCreate",
"LseProjectCreateSampling",
"LseProjectCreateSkipQueue",
- "LseProjectParams",
"LseProjectResponse",
"LseProjectResponseSampling",
"LseProjectResponseSkipQueue",
diff --git a/src/label_studio_sdk/types/lse_project_params.py b/src/label_studio_sdk/types/lse_project_params.py
deleted file mode 100644
index a28485b93..000000000
--- a/src/label_studio_sdk/types/lse_project_params.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-from ..core.unchecked_base_model import UncheckedBaseModel
-import typing
-import pydantic
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-
-
-class LseProjectParams(UncheckedBaseModel):
- annotator_params: typing.Optional[typing.Optional[typing.Any]] = None
- use_kappa: typing.Optional[bool] = pydantic.Field(default=None)
- """
- If categorical variables are used in labeling (e.g. choices), Cohen's Kappa statistic is computed to measure inter-rater reliability instead of basic agreement
- """
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/tests/projects/test_annotator_weights.py b/tests/projects/test_annotator_weights.py
deleted file mode 100644
index 210b9d40a..000000000
--- a/tests/projects/test_annotator_weights.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-from label_studio_sdk import LabelStudio
-from label_studio_sdk import AsyncLabelStudio
-import typing
-from ..utilities import validate_response
-
-
-async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
- expected_response: typing.Any = {"annotator_params": {"key": "value"}, "use_kappa": True}
- expected_types: typing.Any = {"annotator_params": None, "use_kappa": None}
- response = client.projects.annotator_weights.get(id=1)
- validate_response(response, expected_response, expected_types)
-
- async_response = await async_client.projects.annotator_weights.get(id=1)
- validate_response(async_response, expected_response, expected_types)
-
-
-async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
- expected_response: typing.Any = {"annotator_params": {"key": "value"}, "use_kappa": True}
- expected_types: typing.Any = {"annotator_params": None, "use_kappa": None}
- response = client.projects.annotator_weights.create(id=1, annotator_params={"123": 1, "456": 0.75}, use_kappa=True)
- validate_response(response, expected_response, expected_types)
-
- async_response = await async_client.projects.annotator_weights.create(
- id=1, annotator_params={"123": 1, "456": 0.75}, use_kappa=True
- )
- validate_response(async_response, expected_response, expected_types)
From e8045cb655067d6d90af1192f4a66ff560fd917b Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Wed, 8 Oct 2025 18:12:58 +0000
Subject: [PATCH 07/11] SDK regeneration
---
.mock/definition/workspaces/projects.yml | 4 ++--
.mock/openapi/openapi.yaml | 4 ++--
reference.md | 8 ++++----
.../workspaces/projects/client.py | 16 ++++++++--------
tests/workspaces/test_projects.py | 12 ++++++------
5 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/.mock/definition/workspaces/projects.yml b/.mock/definition/workspaces/projects.yml
index 0d6093dc0..ff9a5d5d9 100644
--- a/.mock/definition/workspaces/projects.yml
+++ b/.mock/definition/workspaces/projects.yml
@@ -82,7 +82,7 @@ service:
useful_annotation_number: 1
audiences:
- public
- create:
+ add:
path: /api/workspaces/{id}/projects/
method: POST
auth: true
@@ -118,7 +118,7 @@ service:
project: 1
audiences:
- public
- delete:
+ remove:
path: /api/workspaces/{id}/projects/
method: DELETE
auth: true
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index bd9899e9a..ce42df762 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -18564,7 +18564,7 @@ paths:
x-fern-sdk-group-name:
- workspaces
- projects
- x-fern-sdk-method-name: delete
+ x-fern-sdk-method-name: remove
get:
description: |-
@@ -18646,7 +18646,7 @@ paths:
x-fern-sdk-group-name:
- workspaces
- projects
- x-fern-sdk-method-name: create
+ x-fern-sdk-method-name: add
/data/upload/{filename}:
get:
description: Download a specific uploaded file.
diff --git a/reference.md b/reference.md
index d7acbb51f..e895bc388 100644
--- a/reference.md
+++ b/reference.md
@@ -36248,7 +36248,7 @@ client.workspaces.projects.list(
-client.workspaces.projects.create(...)
+client.workspaces.projects.add(...)
-
@@ -36286,7 +36286,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.workspaces.projects.create(
+client.workspaces.projects.add(
id=1,
project=1,
)
@@ -36333,7 +36333,7 @@ client.workspaces.projects.create(
-client.workspaces.projects.delete(...)
+client.workspaces.projects.remove(...)
-
@@ -36371,7 +36371,7 @@ from label_studio_sdk import LabelStudio
client = LabelStudio(
api_key="YOUR_API_KEY",
)
-client.workspaces.projects.delete(
+client.workspaces.projects.remove(
id=1,
)
diff --git a/src/label_studio_sdk/workspaces/projects/client.py b/src/label_studio_sdk/workspaces/projects/client.py
index 6ab90803b..38537ffa4 100644
--- a/src/label_studio_sdk/workspaces/projects/client.py
+++ b/src/label_studio_sdk/workspaces/projects/client.py
@@ -71,7 +71,7 @@ def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = No
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- def create(
+ def add(
self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None
) -> WorkspaceProjects:
"""
@@ -104,7 +104,7 @@ def create(
client = LabelStudio(
api_key="YOUR_API_KEY",
)
- client.workspaces.projects.create(
+ client.workspaces.projects.add(
id=1,
project=1,
)
@@ -135,7 +135,7 @@ def create(
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
"""
@@ -163,7 +163,7 @@ def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] =
client = LabelStudio(
api_key="YOUR_API_KEY",
)
- client.workspaces.projects.delete(
+ client.workspaces.projects.remove(
id=1,
)
"""
@@ -245,7 +245,7 @@ async def main() -> None:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- async def create(
+ async def add(
self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None
) -> WorkspaceProjects:
"""
@@ -283,7 +283,7 @@ async def create(
async def main() -> None:
- await client.workspaces.projects.create(
+ await client.workspaces.projects.add(
id=1,
project=1,
)
@@ -317,7 +317,7 @@ async def main() -> None:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- async def delete(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
+ async def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
"""
@@ -350,7 +350,7 @@ async def delete(self, id: int, *, request_options: typing.Optional[RequestOptio
async def main() -> None:
- await client.workspaces.projects.delete(
+ await client.workspaces.projects.remove(
id=1,
)
diff --git a/tests/workspaces/test_projects.py b/tests/workspaces/test_projects.py
index dfdcef4f8..bfb21cb83 100644
--- a/tests/workspaces/test_projects.py
+++ b/tests/workspaces/test_projects.py
@@ -119,24 +119,24 @@ async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> Non
validate_response(async_response, expected_response, expected_types)
-async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+async def test_add(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
expected_response: typing.Any = {"project": 1}
expected_types: typing.Any = {"project": "integer"}
- response = client.workspaces.projects.create(id=1, project=1)
+ response = client.workspaces.projects.add(id=1, project=1)
validate_response(response, expected_response, expected_types)
- async_response = await async_client.workspaces.projects.create(id=1, project=1)
+ async_response = await async_client.workspaces.projects.add(id=1, project=1)
validate_response(async_response, expected_response, expected_types)
-async def test_delete(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
+async def test_remove(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
# Type ignore to avoid mypy complaining about the function not being meant to return a value
assert (
- client.workspaces.projects.delete(id=1) # type: ignore[func-returns-value]
+ client.workspaces.projects.remove(id=1) # type: ignore[func-returns-value]
is None
)
assert (
- await async_client.workspaces.projects.delete(id=1) # type: ignore[func-returns-value]
+ await async_client.workspaces.projects.remove(id=1) # type: ignore[func-returns-value]
is None
)
From 2757dfda9610d181ea21516b0d10e8b897bdaa29 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Wed, 8 Oct 2025 19:04:29 +0000
Subject: [PATCH 08/11] SDK regeneration
---
.mock/definition/__package__.yml | 5 ---
.mock/definition/workspaces/projects.yml | 14 ++-----
.mock/openapi/openapi.yaml | 23 +++--------
reference.md | 4 +-
src/label_studio_sdk/__init__.py | 2 -
src/label_studio_sdk/types/__init__.py | 2 -
.../types/workspace_projects.py | 19 ---------
.../workspaces/projects/client.py | 39 +++++--------------
tests/workspaces/test_projects.py | 15 ++++---
9 files changed, 31 insertions(+), 92 deletions(-)
delete mode 100644 src/label_studio_sdk/types/workspace_projects.py
diff --git a/.mock/definition/__package__.yml b/.mock/definition/__package__.yml
index b06154b43..e1d997527 100644
--- a/.mock/definition/__package__.yml
+++ b/.mock/definition/__package__.yml
@@ -8436,8 +8436,3 @@ types:
docs: Workspace ID
source:
openapi: openapi/openapi.yaml
- WorkspaceProjects:
- properties:
- project: integer
- source:
- openapi: openapi/openapi.yaml
diff --git a/.mock/definition/workspaces/projects.yml b/.mock/definition/workspaces/projects.yml
index ff9a5d5d9..ecc289dd7 100644
--- a/.mock/definition/workspaces/projects.yml
+++ b/.mock/definition/workspaces/projects.yml
@@ -93,29 +93,23 @@ service:
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Create a project in a specific workspace.
+ Add a project to a specific workspace.
source:
openapi: openapi/openapi.yaml
path-parameters:
id: integer
- display-name: Create workspace project
+ display-name: Add workspace project
request:
name: WorkspaceProjectsRequest
body:
properties:
project: integer
content-type: application/json
- response:
- docs: Project created
- type: root.WorkspaceProjects
examples:
- path-parameters:
id: 1
request:
project: 1
- response:
- body:
- project: 1
audiences:
- public
remove:
@@ -129,12 +123,12 @@ service:
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Delete projects from a specific workspace.
+ Remove a project from a specific workspace.
source:
openapi: openapi/openapi.yaml
path-parameters:
id: integer
- display-name: Remove workspace projects
+ display-name: Remove workspace project
examples:
- path-parameters:
id: 1
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index ce42df762..6641797cd 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -18543,7 +18543,7 @@ paths:
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Delete projects from a specific workspace.
+ Remove a project from a specific workspace.
operationId: api_workspaces_projects_destroy
parameters:
- in: path
@@ -18553,10 +18553,10 @@ paths:
type: integer
responses:
'204':
- description: Project deleted
+ description: Project removed
security:
- Token: []
- summary: Remove workspace projects
+ summary: Remove workspace project
tags:
- Workspaces
x-fern-audiences:
@@ -18609,7 +18609,7 @@ paths:
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Create a project in a specific workspace.
+ Add a project to a specific workspace.
operationId: api_workspaces_projects_create
parameters:
- in: path
@@ -18631,14 +18631,10 @@ paths:
required: true
responses:
'201':
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/WorkspaceProjects'
- description: Project created
+ description: Project added
security:
- Token: []
- summary: Create workspace project
+ summary: Add workspace project
tags:
- Workspaces
x-fern-audiences:
@@ -32315,13 +32311,6 @@ components:
required:
- user
type: object
- WorkspaceProjects:
- properties:
- project:
- type: integer
- required:
- - project
- type: object
WorkspaceProjectsRequest:
properties:
project:
diff --git a/reference.md b/reference.md
index e895bc388..d6018ab86 100644
--- a/reference.md
+++ b/reference.md
@@ -36266,7 +36266,7 @@ client.workspaces.projects.list(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Create a project in a specific workspace.
+Add a project to a specific workspace.
@@ -36351,7 +36351,7 @@ client.workspaces.projects.add(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-Delete projects from a specific workspace.
+Remove a project from a specific workspace.
diff --git a/src/label_studio_sdk/__init__.py b/src/label_studio_sdk/__init__.py
index c97bbcada..6a1deb922 100644
--- a/src/label_studio_sdk/__init__.py
+++ b/src/label_studio_sdk/__init__.py
@@ -241,7 +241,6 @@
Workspace,
WorkspaceMemberCreate,
WorkspaceMemberList,
- WorkspaceProjects,
)
from .errors import (
BadRequestError,
@@ -674,7 +673,6 @@
"Workspace",
"WorkspaceMemberCreate",
"WorkspaceMemberList",
- "WorkspaceProjects",
"__version__",
"actions",
"activity_logs",
diff --git a/src/label_studio_sdk/types/__init__.py b/src/label_studio_sdk/types/__init__.py
index 88a132721..d4610a8fc 100644
--- a/src/label_studio_sdk/types/__init__.py
+++ b/src/label_studio_sdk/types/__init__.py
@@ -242,7 +242,6 @@
from .workspace import Workspace
from .workspace_member_create import WorkspaceMemberCreate
from .workspace_member_list import WorkspaceMemberList
-from .workspace_projects import WorkspaceProjects
__all__ = [
"ActionEnum",
@@ -485,5 +484,4 @@
"Workspace",
"WorkspaceMemberCreate",
"WorkspaceMemberList",
- "WorkspaceProjects",
]
diff --git a/src/label_studio_sdk/types/workspace_projects.py b/src/label_studio_sdk/types/workspace_projects.py
deleted file mode 100644
index 512fa66d4..000000000
--- a/src/label_studio_sdk/types/workspace_projects.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-from ..core.unchecked_base_model import UncheckedBaseModel
-from ..core.pydantic_utilities import IS_PYDANTIC_V2
-import typing
-import pydantic
-
-
-class WorkspaceProjects(UncheckedBaseModel):
- project: int
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/label_studio_sdk/workspaces/projects/client.py b/src/label_studio_sdk/workspaces/projects/client.py
index 38537ffa4..40a700e42 100644
--- a/src/label_studio_sdk/workspaces/projects/client.py
+++ b/src/label_studio_sdk/workspaces/projects/client.py
@@ -8,7 +8,6 @@
from ...core.unchecked_base_model import construct_type
from json.decoder import JSONDecodeError
from ...core.api_error import ApiError
-from ...types.workspace_projects import WorkspaceProjects
from ...core.client_wrapper import AsyncClientWrapper
# this is used as the default value for optional parameters
@@ -71,9 +70,7 @@ def list(self, id: int, *, request_options: typing.Optional[RequestOptions] = No
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- def add(
- self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None
- ) -> WorkspaceProjects:
+ def add(self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None) -> None:
"""
@@ -81,7 +78,7 @@ def add(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Create a project in a specific workspace.
+ Add a project to a specific workspace.
Parameters
----------
@@ -94,8 +91,7 @@ def add(
Returns
-------
- WorkspaceProjects
- Project created
+ None
Examples
--------
@@ -123,13 +119,7 @@ def add(
)
try:
if 200 <= _response.status_code < 300:
- return typing.cast(
- WorkspaceProjects,
- construct_type(
- type_=WorkspaceProjects, # type: ignore
- object_=_response.json(),
- ),
- )
+ return
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, body=_response.text)
@@ -143,7 +133,7 @@ def remove(self, id: int, *, request_options: typing.Optional[RequestOptions] =
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Delete projects from a specific workspace.
+ Remove a project from a specific workspace.
Parameters
----------
@@ -245,9 +235,7 @@ async def main() -> None:
raise ApiError(status_code=_response.status_code, body=_response.text)
raise ApiError(status_code=_response.status_code, body=_response_json)
- async def add(
- self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None
- ) -> WorkspaceProjects:
+ async def add(self, id: int, *, project: int, request_options: typing.Optional[RequestOptions] = None) -> None:
"""
@@ -255,7 +243,7 @@ async def add(
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Create a project in a specific workspace.
+ Add a project to a specific workspace.
Parameters
----------
@@ -268,8 +256,7 @@ async def add(
Returns
-------
- WorkspaceProjects
- Project created
+ None
Examples
--------
@@ -305,13 +292,7 @@ async def main() -> None:
)
try:
if 200 <= _response.status_code < 300:
- return typing.cast(
- WorkspaceProjects,
- construct_type(
- type_=WorkspaceProjects, # type: ignore
- object_=_response.json(),
- ),
- )
+ return
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, body=_response.text)
@@ -325,7 +306,7 @@ async def remove(self, id: int, *, request_options: typing.Optional[RequestOptio
This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
- Delete projects from a specific workspace.
+ Remove a project from a specific workspace.
Parameters
----------
diff --git a/tests/workspaces/test_projects.py b/tests/workspaces/test_projects.py
index bfb21cb83..4b900858f 100644
--- a/tests/workspaces/test_projects.py
+++ b/tests/workspaces/test_projects.py
@@ -120,13 +120,16 @@ async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> Non
async def test_add(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
- expected_response: typing.Any = {"project": 1}
- expected_types: typing.Any = {"project": "integer"}
- response = client.workspaces.projects.add(id=1, project=1)
- validate_response(response, expected_response, expected_types)
+ # Type ignore to avoid mypy complaining about the function not being meant to return a value
+ assert (
+ client.workspaces.projects.add(id=1, project=1) # type: ignore[func-returns-value]
+ is None
+ )
- async_response = await async_client.workspaces.projects.add(id=1, project=1)
- validate_response(async_response, expected_response, expected_types)
+ assert (
+ await async_client.workspaces.projects.add(id=1, project=1) # type: ignore[func-returns-value]
+ is None
+ )
async def test_remove(client: LabelStudio, async_client: AsyncLabelStudio) -> None:
From 81c235d0af753cc2c3f1264ef7f7e5cbe3337416 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Wed, 8 Oct 2025 21:59:26 +0000
Subject: [PATCH 09/11] SDK regeneration
---
.mock/definition/projects/members.yml | 1 +
.mock/openapi/openapi.yaml | 1 +
2 files changed, 2 insertions(+)
diff --git a/.mock/definition/projects/members.yml b/.mock/definition/projects/members.yml
index 911bfa1cd..d1353db6e 100644
--- a/.mock/definition/projects/members.yml
+++ b/.mock/definition/projects/members.yml
@@ -30,6 +30,7 @@ service:
response:
docs: List of users with membership information
type: list
+ availability: deprecated
examples:
- path-parameters:
id: 1
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index 6641797cd..210803f0f 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -8253,6 +8253,7 @@ paths:
- members
x-fern-sdk-method-name: remove
get:
+ deprecated: true
description: |-
Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated).
From d7ecb48417388c1298d23144644adcdd1f17cd19 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Thu, 9 Oct 2025 11:44:48 +0000
Subject: [PATCH 10/11] SDK regeneration
---
.mock/definition/workspaces.yml | 277 --------------------------------
.mock/openapi/openapi.yaml | 116 -------------
poetry.lock | 76 +++++----
3 files changed, 43 insertions(+), 426 deletions(-)
diff --git a/.mock/definition/workspaces.yml b/.mock/definition/workspaces.yml
index 8825b985a..df2461243 100644
--- a/.mock/definition/workspaces.yml
+++ b/.mock/definition/workspaces.yml
@@ -222,282 +222,5 @@ service:
title: title
audiences:
- public
- api_workspaces_projects_retrieve:
- path: /api/workspaces/{id}/projects/
- method: GET
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Retrieve a list of all projects in a specific workspace.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: List workspace projects
- response:
- docs: ''
- type: root.Project
- examples:
- - path-parameters:
- id: 1
- response:
- body:
- color: color
- config_has_control_tags: true
- config_suitable_for_bulk_annotation: true
- control_weights:
- key: value
- created_at: '2024-01-15T09:30:00Z'
- created_by:
- avatar: avatar
- email: email
- first_name: first_name
- id: 1
- last_name: last_name
- description: description
- enable_empty_annotation: true
- evaluate_predictions_automatically: true
- expert_instruction: expert_instruction
- finished_task_number: 1
- ground_truth_number: 1
- id: 1
- is_draft: true
- is_published: true
- label_config: label_config
- maximum_annotations: 1
- min_annotations_to_start_training: 1
- model_version: model_version
- num_tasks_with_annotations: 1
- organization: 1
- overlap_cohort_percentage: 1
- parsed_label_config:
- key: value
- pinned_at: '2024-01-15T09:30:00Z'
- queue_done: 1
- queue_total: 1
- reveal_preannotations_interactively: true
- sampling: Sequential sampling
- show_annotation_history: true
- show_collab_predictions: true
- show_ground_truth_first: true
- show_instruction: true
- show_overlap_first: true
- show_skip_button: true
- skip_queue: REQUEUE_FOR_ME
- skipped_annotations_number: 1
- start_training_on_annotation_update: true
- task_data_login: task_data_login
- task_data_password: task_data_password
- task_number: 1
- title: title
- total_annotations_number: 1
- total_predictions_number: 1
- useful_annotation_number: 1
- api_workspaces_projects_create:
- path: /api/workspaces/{id}/projects/
- method: POST
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Create a project in a specific workspace.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Create workspace project
- request:
- name: ProjectRequest
- body:
- properties:
- color:
- type: optional
- validation:
- maxLength: 16
- control_weights: optional
- created_by:
- type: optional
- docs: Project owner
- description:
- type: optional
- docs: Project description
- enable_empty_annotation:
- type: optional
- docs: Allow annotators to submit empty annotations
- evaluate_predictions_automatically:
- type: optional
- docs: Retrieve and display predictions when loading a task
- expert_instruction:
- type: optional
- docs: Labeling instructions in HTML format
- is_draft:
- type: optional
- docs: Whether or not the project is in the middle of being created
- is_published:
- type: optional
- docs: Whether or not the project is published to annotators
- label_config:
- type: optional
- docs: Label config in XML format. See more about it in documentation
- maximum_annotations:
- type: optional
- docs: >-
- Maximum number of annotations for one task. If the number of
- annotations per task is equal or greater to this value, the task
- is completed (is_labeled=True)
- validation:
- min: -2147483648
- max: 2147483647
- min_annotations_to_start_training:
- type: optional
- docs: >-
- Minimum number of completed tasks after which model training is
- started
- validation:
- min: -2147483648
- max: 2147483647
- model_version:
- type: optional
- docs: Machine learning model version
- organization: optional
- overlap_cohort_percentage:
- type: optional
- validation:
- min: -2147483648
- max: 2147483647
- pinned_at:
- type: optional
- docs: Pinned date and time
- reveal_preannotations_interactively:
- type: optional
- docs: Reveal pre-annotations interactively
- sampling: optional
- show_annotation_history:
- type: optional
- docs: Show annotation history to annotator
- show_collab_predictions:
- type: optional
- docs: If set, the annotator can view model predictions
- show_ground_truth_first:
- type: optional
- docs: >-
- Onboarding mode (true): show ground truth tasks first in the
- labeling stream
- show_instruction:
- type: optional
- docs: Show instructions to the annotator before they start
- show_overlap_first: optional
- show_skip_button:
- type: optional
- docs: >-
- Show a skip button in interface and allow annotators to skip the
- task
- skip_queue: optional
- task_data_login:
- type: optional
- docs: 'Task data credentials: login'
- validation:
- maxLength: 256
- task_data_password:
- type: optional
- docs: 'Task data credentials: password'
- validation:
- maxLength: 256
- title:
- type: optional
- docs: Project name. Must be between 3 and 50 characters long.
- validation:
- minLength: 3
- maxLength: 50
- content-type: application/json
- response:
- docs: ''
- type: root.Project
- examples:
- - path-parameters:
- id: 1
- request: {}
- response:
- body:
- color: color
- config_has_control_tags: true
- config_suitable_for_bulk_annotation: true
- control_weights:
- key: value
- created_at: '2024-01-15T09:30:00Z'
- created_by:
- avatar: avatar
- email: email
- first_name: first_name
- id: 1
- last_name: last_name
- description: description
- enable_empty_annotation: true
- evaluate_predictions_automatically: true
- expert_instruction: expert_instruction
- finished_task_number: 1
- ground_truth_number: 1
- id: 1
- is_draft: true
- is_published: true
- label_config: label_config
- maximum_annotations: 1
- min_annotations_to_start_training: 1
- model_version: model_version
- num_tasks_with_annotations: 1
- organization: 1
- overlap_cohort_percentage: 1
- parsed_label_config:
- key: value
- pinned_at: '2024-01-15T09:30:00Z'
- queue_done: 1
- queue_total: 1
- reveal_preannotations_interactively: true
- sampling: Sequential sampling
- show_annotation_history: true
- show_collab_predictions: true
- show_ground_truth_first: true
- show_instruction: true
- show_overlap_first: true
- show_skip_button: true
- skip_queue: REQUEUE_FOR_ME
- skipped_annotations_number: 1
- start_training_on_annotation_update: true
- task_data_login: task_data_login
- task_data_password: task_data_password
- task_number: 1
- title: title
- total_annotations_number: 1
- total_predictions_number: 1
- useful_annotation_number: 1
- api_workspaces_projects_destroy:
- path: /api/workspaces/{id}/projects/
- method: DELETE
- auth: true
- docs: |-
-
-
-
- This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
-
-
- Delete projects from a specific workspace.
- source:
- openapi: openapi/openapi.yaml
- path-parameters:
- id: integer
- display-name: Remove workspace projects
- examples:
- - path-parameters:
- id: 1
source:
openapi: openapi/openapi.yaml
diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml
index fb31185ad..210803f0f 100644
--- a/.mock/openapi/openapi.yaml
+++ b/.mock/openapi/openapi.yaml
@@ -29896,122 +29896,6 @@ components:
required:
- id
type: object
- ProjectRequest:
- description: |-
- Serializer get numbers from project queryset annotation,
- make sure, that you use correct one(Project.objects.with_counts())
- properties:
- color:
- maxLength: 16
- nullable: true
- type: string
- control_weights:
- description: 'Dict of weights for each control tag in metric calculation. Each control tag (e.g. label or choice) will have it''s own key in control weight dict with weight for each label and overall weight.For example, if bounding box annotation with control tag named my_bbox should be included with 0.33 weight in agreement calculation, and the first label Car should be twice more important than Airplaine, then you have to need the specify: {''my_bbox'': {''type'': ''RectangleLabels'', ''labels'': {''Car'': 1.0, ''Airplaine'': 0.5}, ''overall'': 0.33}'
- nullable: true
- created_by:
- allOf:
- - $ref: '#/components/schemas/UserSimpleRequest'
- description: Project owner
- description:
- description: Project description
- nullable: true
- type: string
- enable_empty_annotation:
- description: Allow annotators to submit empty annotations
- type: boolean
- evaluate_predictions_automatically:
- description: Retrieve and display predictions when loading a task
- type: boolean
- expert_instruction:
- description: Labeling instructions in HTML format
- nullable: true
- type: string
- is_draft:
- description: Whether or not the project is in the middle of being created
- type: boolean
- is_published:
- description: Whether or not the project is published to annotators
- title: Published
- type: boolean
- label_config:
- description: Label config in XML format. See more about it in documentation
- nullable: true
- type: string
- maximum_annotations:
- description: Maximum number of annotations for one task. If the number of annotations per task is equal or greater to this value, the task is completed (is_labeled=True)
- maximum: 2147483647
- minimum: -2147483648
- title: Maximum annotation number
- type: integer
- min_annotations_to_start_training:
- description: Minimum number of completed tasks after which model training is started
- maximum: 2147483647
- minimum: -2147483648
- type: integer
- model_version:
- description: Machine learning model version
- nullable: true
- type: string
- organization:
- nullable: true
- type: integer
- overlap_cohort_percentage:
- maximum: 2147483647
- minimum: -2147483648
- type: integer
- pinned_at:
- description: Pinned date and time
- format: date-time
- nullable: true
- type: string
- reveal_preannotations_interactively:
- description: Reveal pre-annotations interactively
- type: boolean
- sampling:
- nullable: true
- oneOf:
- - $ref: '#/components/schemas/SamplingDe5Enum'
- - $ref: '#/components/schemas/NullEnum'
- show_annotation_history:
- description: Show annotation history to annotator
- type: boolean
- show_collab_predictions:
- description: If set, the annotator can view model predictions
- title: Show predictions to annotator
- type: boolean
- show_ground_truth_first:
- description: 'Onboarding mode (true): show ground truth tasks first in the labeling stream'
- type: boolean
- show_instruction:
- description: Show instructions to the annotator before they start
- type: boolean
- show_overlap_first:
- type: boolean
- show_skip_button:
- description: Show a skip button in interface and allow annotators to skip the task
- type: boolean
- skip_queue:
- nullable: true
- oneOf:
- - $ref: '#/components/schemas/SkipQueueEnum'
- - $ref: '#/components/schemas/NullEnum'
- task_data_login:
- description: 'Task data credentials: login'
- maxLength: 256
- nullable: true
- type: string
- task_data_password:
- description: 'Task data credentials: password'
- maxLength: 256
- nullable: true
- type: string
- title:
- description: Project name. Must be between 3 and 50 characters long.
- maxLength: 50
- minLength: 3
- nullable: true
- type: string
- type: object
ProjectRole:
properties:
id:
diff --git a/poetry.lock b/poetry.lock
index 5023d5589..9fae6af33 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -2102,43 +2102,53 @@ files = [
[[package]]
name = "tomli"
-version = "2.2.1"
+version = "2.3.0"
description = "A lil' TOML parser"
optional = false
python-versions = ">=3.8"
files = [
- {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
- {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
- {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
- {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
- {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
- {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
- {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
- {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
- {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
- {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
- {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
- {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
- {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
- {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
- {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
- {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
- {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
- {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
- {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
- {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
- {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
- {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
- {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
- {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
- {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
- {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
- {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
- {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
- {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
- {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
- {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
- {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
+ {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"},
+ {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"},
+ {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"},
+ {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"},
+ {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"},
+ {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"},
+ {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"},
+ {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"},
+ {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"},
+ {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"},
+ {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"},
+ {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"},
+ {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"},
+ {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"},
+ {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"},
+ {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"},
+ {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"},
+ {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"},
+ {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"},
+ {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"},
+ {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"},
+ {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"},
+ {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"},
+ {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"},
+ {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"},
+ {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"},
+ {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"},
+ {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"},
+ {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"},
+ {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"},
+ {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"},
+ {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"},
+ {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"},
+ {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"},
+ {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"},
+ {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"},
+ {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"},
+ {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"},
+ {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"},
+ {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"},
+ {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"},
+ {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"},
]
[[package]]
From 5d085687def82b31c29ccab0a40ba16643cca494 Mon Sep 17 00:00:00 2001
From: fern-api <115122769+fern-api[bot]@users.noreply.github.com>
Date: Thu, 9 Oct 2025 13:14:22 +0000
Subject: [PATCH 11/11] SDK regeneration