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: |- - - Label Studio Enterprise badge -

- 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: |- - - Label Studio Enterprise badge -

- 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: >- - - Label Studio Enterprise badge -

- 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: >- - - Label Studio Enterprise badge -

- 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: >- + + Label Studio Enterprise badge +

+ 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: >- + + Label Studio Enterprise badge +

+ 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: |- + + Label Studio Enterprise badge +

+ 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: |- + + Label Studio Enterprise badge +

+ 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: |- - - Label Studio Enterprise badge -

- 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: |- - - Label Studio Enterprise badge -

- 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: |- - - Label Studio Enterprise badge -

- 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: |- + + Label Studio Enterprise badge +

+ 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: |- + + Label Studio Enterprise badge +

+ 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: |- + + Label Studio Enterprise badge +

+ 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 \"Label\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 \"Label\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. + + Label Studio Enterprise badge +

+ 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. + + Label Studio Enterprise badge +

+ 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. + + Label Studio Enterprise badge +

+ 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]` - + + Label Studio Enterprise badge +

+ 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]` + +
+
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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. + + Label Studio Enterprise badge +

+ 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. + + Label Studio Enterprise badge +

+ 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. + + Label Studio Enterprise badge +

+ 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 + + Label Studio Enterprise badge +

+ 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(
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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. + + Label Studio Enterprise badge +

+ 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. + + Label Studio Enterprise badge +

+ 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 + + Label Studio Enterprise badge +

+ 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. + + Label Studio Enterprise badge +

+ 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 - -
-
- - Label Studio Enterprise badge -

- 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
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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`. + + Label Studio Enterprise badge +

+ 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. + + Label Studio Enterprise badge +

+ 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]` - - Label Studio Enterprise badge -

- 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(
- - Label Studio Enterprise badge -

- 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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]: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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]: + """ + + Label Studio Enterprise badge +

+ 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]: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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]: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: >- - - Label Studio Enterprise badge -

- 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: |- - - Label Studio Enterprise badge -

- 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 - -
-
- -
-
- - - Label Studio Enterprise badge -

- 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]: - """ - - Label Studio Enterprise badge -

- 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]: - """ - - Label Studio Enterprise badge -

- 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: >- + + Label Studio Enterprise badge +

+ 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: >- + + Label Studio Enterprise badge +

+ 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: >- + + Label Studio Enterprise badge +

+ 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]} + + Label Studio Enterprise badge +

+ 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]} + + Label Studio Enterprise badge +

+ 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]}} + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: |- + + Label Studio Enterprise badge +

+ 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: |- + + Label Studio Enterprise badge +

+ 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 + +
+
+ +
+
+ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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: + """ + + Label Studio Enterprise badge +

+ 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]: """ Label Studio Enterprise badge @@ -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: """ Label Studio Enterprise badge @@ -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: """ Label Studio Enterprise badge @@ -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]: """ Label Studio Enterprise badge @@ -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: """ Label Studio Enterprise badge @@ -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: """ Label Studio Enterprise badge @@ -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 - -
-
- -
-
- - - Label Studio Enterprise badge -

- 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 - -
-
- -
-
- - - Label Studio Enterprise badge -

- 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: - """ - - Label Studio Enterprise badge -

- 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: - """ - - Label Studio Enterprise badge -

- 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: - """ - - Label Studio Enterprise badge -

- 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: - """ - - Label Studio Enterprise badge -

- 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: """ Label Studio Enterprise badge @@ -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: """ Label Studio Enterprise badge @@ -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: """ Label Studio Enterprise badge @@ -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: """ Label Studio Enterprise badge @@ -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: |- - - Label Studio Enterprise badge -

- 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: |- - - Label Studio Enterprise badge -

- 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: |- - - Label Studio Enterprise badge -

- 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