Label Studio API 实战指南:从认证、任务导入到标注导出的完整调用链

Label Studio API 实战指南:从认证、任务导入到标注导出的完整调用链 Label Studio API 实战指南从认证、任务导入到标注导出的完整调用链【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studioLabel Studio 提供了一套完整的 HTTP API用于导入待标注数据、导出标注结果、接入机器学习训练流程以及与各类云存储同步任务。本文以仓库中的 API 指南 为骨架结合label_studio/下的源码实现系统讲解 API 认证方式、项目与任务的增删查改、标注导出的完整调用链帮助你在不依赖 Web 界面或脱离人工点击的情况下用 curl 与 Python SDK 自动化驱动整个标注流水线。一、API 能力总览与路由结构Label Studio 的 API 遵循 REST 风格所有端点都挂在/api/前缀之下由多个 Django app 分别负责不同领域。从 core/urls.py 的路由注册可以看到/api/路径被拆分为下列模块模块覆盖范围主要路由文件organizations组织与成员管理label_studio/organizations/urls.pyprojects项目创建、配置、任务流projects/urls.pydata_import任务批量导入label_studio/data_import/urls.pydata_manager数据管理过滤、排序、选择label_studio/data_manager/urls.pydata_export标注导出data_export/urls.pyusers用户信息label_studio/users/urls.pytasks任务、标注、草稿、预测tasks/urls.pyio_storages云存储S3、GCS、Azure、本地label_studio/io_storages/urls.pymlML 后端接入label_studio/ml/urls.pywebhooks事件回调label_studio/webhooks/urls.pyjwt_auth令牌认证jwt_auth/urls.py此外core/urls.py 还挂载了基于 drf-spectacular 的 OpenAPI Schema 端点/docs/api/schema/JSON/YAML/Swagger UI/Redoc 均可访问你可以在浏览器中直接查看当前部署实例的全部端点定义与交互式测试页面。二、认证到 APIAccess Token 的获取与使用在调用任何 API 之前必须先获取访问令牌Access Token。在 Label Studio 中access tokens 与 API keys 是同一个概念可以互换使用。系统支持两类令牌Personal Access TokensPATs与Legacy Tokens二者的行为差异详见 Access Tokens特性Personal Access TokenPATLegacy Token有效期可在组织级设置 TTLEnterprise 支持不过期展示方式仅创建时展示一次一直列在账户设置中本质JWT refresh token传统字符串令牌吊销支持手动吊销支持手动吊销安全上不如 PATHTTP API 用法Authorization: Bearer tokenAuthorization: Token tokenSDK 用法两种令牌无差别直接作为api_key传入同左2.1 在界面上找到你的令牌打开 Label Studio点击右上角用户图标选择Account Settings在左侧选择Personal Access Token或Legacy Token按页面提示生成新令牌或直接复制已显示的令牌。能否创建令牌、能创建哪种类型取决于所在组织的设置。从 jwt_auth/models.py 的JWTSettings模型可见组织级有三个开关api_tokens_enabled默认True是否允许 JWT API 令牌认证api_token_ttl_days默认200 * 365即约 200 年源码注释称之为 eternityPAT 的生存天数legacy_api_tokens_enabled默认False是否启用 Legacy Token 认证。当某个令牌类型在组织中被禁用后已存在的该类令牌将无法再通过认证。2.2 使用 PAT 认证 HTTP API 请求PAT 属于 JWT refresh token使用时通过Authorization: Bearer头携带curl -X method Label Studio URL/api/endpoint -H Authorization: Bearer token不过要注意PAT 不能直接用于每次请求。由于它是 JWT refresh token你需要先用它换取一个短期的 access token。向 jwt_auth/views.py 中的DecoratedTokenRefreshView所对应的/api/token/refresh/端点发起 POSTcurl -X POST your-label-studio-url/api/token/refresh \ -H Content-Type: application/json \ -d {refresh: your-personal-access-token}响应会返回一个短期 access token{ access: your-new-access-token }然后用这个 access token 发起业务请求curl -X method Label Studio URL/api/endpoint -H Authorization: Bearer your-new-access-token该 access token 大约5 分钟后过期过期后请求会返回 401需要再次用 PAT 换取新 token——这也正是 PAT 比 Legacy Token 多出的一层安全防护。你也可以用 PyJWT 检查令牌的过期时间# pip install pyjwt from datetime import datetime, timezone import jwt decoded jwt.decode(token) exp decoded.get(exp) token_is_expired (exp datetime.now(timezone.utc).timestamp())2.3 使用 Legacy Token 认证 HTTP API 请求Legacy Token 无需 refresh直接用Authorization: Token头注意与 PAT 的Bearer不同curl -X method Label Studio URL/api/endpoint -H Authorization: Token token2.4 使用 Python SDK 认证使用 SDK 时无需区分 PAT 与 Legacy Token二者都作为api_key传入即可# Define the URL where Label Studio is accessible LABEL_STUDIO_URL YOUR_BASE_URL # API key can be either your PAT or legacy access token LABEL_STUDIO_API_KEY YOUR_API_KEY # Import the SDK and the client module from label_studio_sdk import LabelStudio client LabelStudio(base_urlLABEL_STUDIO_URL, api_keyLABEL_STUDIO_API_KEY)2.5 令牌管理的完整端点族从 jwt_auth/urls.py 可以看到令牌相关的全部端点端点方法作用对应视图/api/jwt/settingsGET / POST读取/更新当前组织的 JWT 设置JWTSettingsAPI/api/token/GET / POST列出/创建当前用户的 API 令牌LSAPITokenView/api/token/refresh/POST用 refresh token 换取 access tokenDecoratedTokenRefreshView/api/token/blacklist/POST将 refresh token 加入黑名单吊销LSTokenBlacklistView/api/token/rotate/POST创建新 refresh token 并将当前 token 加入黑名单LSAPITokenRotateView在实现层面LSAPIToken见 jwt_auth/models.py继承自RefreshToken默认生命周期为 200 年数据库里只存储去掉签名的截断 tokenLSTokenBackend.encode仅保留 header 与 payload以保护签名不被前端泄露。每次创建前LSAPITokenView.perform_create会先检查是否已存在有效令牌若已存在则返回 409 ConflictTokenExistsError提示需要先吊销旧令牌。三、列出所有项目确定 project IDpk大多数 API 操作都需要指定项目 ID即pk。如果不确定项目 ID可以先调用列表端点获取自己有权访问的全部项目。例如获取项目列表curl -X GET https://localhost:8080/api/projects/ -H Authorization: Token abc123该端点在 projects/api.py 中由ProjectListAPI实现GET对应权限projects_view它支持以下实用参数分页默认每页 30 条可通过page与page_size控制page_size最大 100见ProjectListPagination过滤支持ids按多个 ID 过滤与title按标题模糊匹配不区分大小写定义于ProjectFilterSet稀疏字段通过fields参数只返回指定字段排序通过ordering参数控制默认按置顶与创建时间倒序。对于只关心项目规模统计的场景还有GET /api/projects/counts/端点ProjectCountsListAPI可返回各项目的任务数、标注数、预测数等计数信息。四、创建项目并配置标注界面通过 API 创建项目时需要在请求体中提交项目标题与标注配置 XML即label_configcurl -H Content-Type:application/json -H Authorization: Token abc123 \ -X POST https://localhost:8080/api/projects \ --data {title: My project, label_config: View/View}该请求由同一个ProjectListAPI的POST方法处理权限projects_create。从源码看创建时会绑定当前用户的active_organization并通过 webhook 广播PROJECT_CREATED事件如果已存在同名的同用户项目会抛出ProjectExistException409。在正式提交之前校验标注配置是一个好习惯。Label Studio 提供POST /api/projects/validate/端点LabelConfigValidateAPI可以在不落库的情况下验证label_configXML 的合法性标签是否定义、引用是否完整等避免把非法配置写入项目后再返工。一个创建好的项目其GET /api/projects/{id}/响应对应ProjectAPI会返回完整字段例如id、title、label_config、task_number、total_annotations_number、queue_total等——这些字段足以支撑你在外部系统中构建项目看板。五、用 API 导入任务数据创建项目后即可向项目导入待标注任务。需要先明确目标项目的 ID然后调用导入端点curl -X POST https://localhost:8080/api/projects/{id}/import \ -H Authorization: Token abc123 \ -H Content-Type: application/json \ -d [{data: {text: Hello world}}]该端点由 data_import/api.py 的ImportAPI实现注意它要求projects_change权限。底层流程sync_import大致为解析请求中的原始数据JSON、CSV、图片文件等统一转换为任务结构如果请求包含preannotated_from_fields把扁平 JSON 中的预测字段转换为标准predictions结构当项目已有非默认标注配置时用LabelInterface逐条校验预测结果是否符合标签配置不合法的预测会被记录或直接拒绝取决于特性开关fflag_feat_utc_210_prediction_validation_15082025落库创建任务同时更新项目的任务计数与状态并广播TASKS_CREATEDwebhook。同一模块还提供了TasksBulkCreateAPI批量创建与ReImportAPI重新导入文件上传场景则走FileUploadListAPI/FileUploadAPI。六、检索任务与标注导入数据之后可以通过任务列表端点检索某个项目的任务。支持分页与过滤参数如按projectID、page等若需要把任务连同标注一起取回也可以直接用这个端点替代导出流程curl -X GET https://localhost:8080/api/tasks/?project{id} \ -H Authorization: Token abc123路由定义于 tasks/urls.py与任务相关的完整端点族包括端点作用GET /api/tasks/分页列出任务TaskListAPIGET /api/tasks/{id}/获取单个任务详情GET /api/tasks/{id}/annotations/获取某任务的全部标注GET /api/tasks/{id}/drafts获取任务的草稿标注GET /api/annotations/{id}/获取单个标注详情POST /api/tasks/{id}/annotations/为任务创建标注此外还有项目级任务入口GET /api/projects/{id}/tasks/见 projects/urls.py以及用于流水线派发的GET /api/projects/{id}/next/获取下一个待标注任务。七、导出标注结果导出的第一步是确认项目当前支持哪些导出格式。请求curl -X GET https://localhost:8080/api/projects/{id}/export/formats \ -H Authorization: Token abc123返回的格式列表由 data_export/models.py 的get_export_formats生成它遍历转换器的all_formats()对照converter.supported_formats标记当前是否可用disabled字段并按可用性排序。从data_export/urls.py可见完整导出端点端点作用GET /api/projects/{id}/export?exportTypeJSON同步导出指定格式如JSON、CSV、COCO、YOLO等GET /api/projects/{id}/export/formats列出可用导出格式GET /api/projects/{id}/export/files获取已生成导出文件的下载信息POST /api/projects/{id}/exports/创建异步导出任务适合大数据量GET /api/projects/{id}/exports/{export_pk}查询异步导出任务状态与结果同步导出的底层流程generate_export_file见 data_export/models.py会把任务数据序列化为中间 JSON再交给转换器转成目标格式导出文件通常打包为 zip 归档供下载。对于超大项目建议使用异步导出接口POST .../exports/避免请求超时随后轮询导出任务状态直到完成。八、SDK 快速串联全流程把以上步骤串联起来用 Python SDK 可以在一段脚本内完成创建项目 → 导入任务 → 查询任务 → 导出标注的完整闭环from label_studio_sdk import LabelStudio client LabelStudio(base_urlhttp://localhost:8080, api_keyYOUR_API_KEY) # 1. 创建项目并写入标注配置 project client.projects.create( titleMy project, label_configViewText nametext value$text/Choices namelabel toNametext Choice valuePositive/Choice valueNegative//Choices/View, ) project_id project.id # 2. 导入任务 client.tasks.create(projectproject_id, data[{text: Hello world}]) # 3. 导出标注 export client.projects.exports.create(idproject_id, export_typeJSON)九、从源码理解认证与路由的底层机制令牌双轨制PAT 与 Legacy Token 由 jwt_auth/models.py 中的JWTSettings组织级开关控制二者在 SDK 层无差别但在 HTTP 层分别使用Bearer与Token两种认证头且 PAT 需先经/api/token/refresh/换取短期 access token。JWT 截断存储LSTokenBackend.encode只把 token 的 header payload 存入数据库签名在存储时被丢弃兼顾了前端展示与签名安全。令牌吊销/api/token/blacklist/与/api/token/rotate/分别实现立即吊销与轮换吊销对应LSTokenBlacklistView和LSAPITokenRotateView的源码逻辑。路由分发所有业务端点由 core/urls.py 统一include到各 app且/docs/api/schema/系列为 drf-spectacular 自动生成的 OpenAPI 文档是排查端点参数最直接的参考。十、常见问题与注意事项401 未授权对于 PAT多半是短期 access token 已过期约 5 分钟需要重新调用/api/token/refresh/换取新 token对于 Legacy Token则检查是否已被组织禁用或手动吊销。409 创建令牌冲突每个用户同时只能持有一个有效 PAT创建前需先吊销旧令牌TokenExistsError。项目 ID 拿不准用GET /api/projects/或GET /api/projects/counts/先列出再从中提取id。导出格式不可用部分格式依赖额外依赖或项目配置/export/formats返回中的disabled字段会明确标注大数据量优先走异步导出。标注配置校验提交label_config前先用POST /api/projects/validate/校验避免把无效 XML 写入项目。十一、进一步阅读完整的令牌类型对比与组织级开关操作Access Tokens使用 SDK 编写 Python 脚本的更多示例Label Studio Python SDK 指南导入数据的格式规范任务数据格式说明导出格式与数据结构的细节导出指南让 ML 模型通过 API 接入预标注流程ML 后端接入【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考