Label Extraction API

把一段脑电实验的任务描述,解析成结构化的任务分类、标签集合与标注粒度。 脑电数据里最贵的不是信号,是标签——这个接口解决的就是「标签从哪来」。 引擎与 BrainDataOS 的标签抽取 Agent 同一套规则口径,服务端计算,客户端不可篡改。

● 服务在线 23 条匹配规则 3 类标注粒度 500 次 / 月免费 60 次 / 分钟 零依赖 Node
/ 01

快速开始

三步接进来:签发密钥 → 发一个 POST → 拿到结构化标签。不需要安装 SDK,用 curl 就能验证。

cURL
Python
Node.js

        
/ 02

密钥与配额

这个沙箱环境支持即时签发,无需审核。平台只保存密钥的 SHA-256 摘要,服务端无法反推明文—— 所以完整密钥只在签发和轮换时显示一次。

先给密钥起个名字(方便区分是哪个项目在用),然后签发。
每个密钥 500 次/月、60 次/分钟。轮换后旧密钥立即失效。
你的 API Key
—
本月配额
0 / 500 次已用 剩余 500
密钥 ID — 创建于 — 累计调用 0
为什么做成「只显示一次」? 密钥是长期凭证,明文落库意味着任何一次数据库泄露都会变成批量盗用。只存摘要、签发时给一次, 是几乎所有开放平台的通行做法——这个取舍比多做一个华丽按钮更接近真实的平台设计。 — 与自建模型网关里的密钥治理同一套思路
/ 03

试运行

真实调用线上接口,不是本地模拟。响应里会带回本次消耗和剩余配额。

运动想象
情绪评分
睡眠分期
面孔 + 再认
Oddball / P300
静息态
需要先签发密钥
待发送
// 点左侧「发送请求」,这里会显示真实响应
为什么不直接返回一个 task 字符串就完事? 真实数据里,一段描述经常同时提到多个范式(比如「看面孔图片 + 事后再认测试」)。 只给一个答案会把不确定性藏起来。所以响应里带 confidence、 review_required 和 alternatives—— 低于 0.5 置信度直接提示需要人工复核,候选答案摊开让下游自己判断。 产品设计上,这比假装 100% 准确要负责任。 — alternatives / review_required 是对原 CLI 版本的增量改进
/ 04

接口参考

Base URL 与当前控制台同源。完整机器可读描述见 /openapi.json。

POST/v1/labels/extractBearer单条抽取 · 1 次配额

把一条实验描述解析为结构化标签。

请求体
{
  "text": "participant performs left and right hand motor imagery",
  "min_confidence": 0.45   // 可选,低于该值则抑制结果
}
响应 200
{
  "request_id": "req_00012_a3f1c9",
  "input": "participant performs left and right hand motor imagery",
  "task": "motor_imagery",
  "task_category": "motor_imagery",
  "labels": ["left_hand", "right_hand", "feet", "tongue", "rest"],
  "label_type": "trial_level",
  "matched_keyword": "motor imagery",
  "confidence": 0.65,
  "review_required": false,
  "alternatives": [],
  "evidence": { "text": "motor imagery", "span": { "start": 38, "end": 51 } },
  "meta": { "engine": "rules", "version": "v1", "quota_remaining": 499 }
}
响应头
X-Quota-Limit: 500
X-Quota-Remaining: 499
X-RateLimit-Limit: 60
POST/v1/labels/extract/batchBearer最多 50 条 · 计 1 次

批量抽取,返回逐条结果与类别分布。批量计 1 次配额,是刻意的产品决策——鼓励合并请求,降低双方的连接开销。

请求体
{ "items": ["overnight polysomnography for sleep staging", "auditory oddball with P300"] }
响应 200(节选)
{
  "count": 2,
  "results": [ { "index": 0, "task": "sleep_staging", ... }, ... ],
  "summary": {
    "category_distribution": { "sleep": 1, "attention": 1 },
    "label_types": { "epoch_level": 1, "trial_level": 1 },
    "review_required": 0,
    "mean_confidence": 0.44
  }
}
GET/v1/usageBearer查询用量 · 0 次

返回当前密钥的配额、已用量与重置日期。查询本身不计配额。

响应 200
{
  "key_id": "key_9f2c1a",
  "prefix": "bdos_live_9f2c…7a1e",
  "quota": { "limit": 500, "used": 12, "remaining": 488, "window": "monthly", "resets_on": "2026-12-01" },
  "total_used": 12
}
POST/v1/keys公开签发密钥 · 0 次

沙箱环境即时签发。{"name":"my-app"} 仅用于标识,不影响权限。

响应 201
{
  "key": "bdos_live_5f3a…(完整值仅此一次)",
  "id": "key_9f2c1a",
  "preview_prefix": "bdos_live_5f3a…",
  "quota": { "limit": 500, "window": "monthly", "rate_limit_per_min": 60 }
}
同时支持

POST /v1/keys/rotate 轮换(旧值立即失效)、DELETE /v1/keys 吊销。均需 Bearer。

GET/v1/rules公开规则表 · 0 次

返回全部 23 条匹配规则:关键词 → 任务 → 标签集合 → 标注粒度。接口的判定逻辑是公开的,可被审计,这是做数据类平台的基本要求。

GET/v1/meta  ·  /health公开服务信息 · 探针

/health 用于探针与状态灯,同时暴露规则数与活跃密钥数;/v1/meta 返回版本、配额策略与全局调用量。

/ 05

代码示例

示例里的密钥会随你在上方签发的密钥自动更新。

cURL
Python
Node.js

        
/ 06

错误码

统一响应体 {request_id, error:{code,message,hint}}——前端可以按 code 分支处理,不用正则匹配文案。

HTTPcode含义怎么处理
400invalid_argument必填字段缺失或类型错误检查 body 里的 text / items
400invalid_json请求体不是合法 JSON检查引号转义与 Content-Type
400text_too_long单条超过 2000 字符拆条后走批量接口
400batch_too_large单批超过 50 条分多次提交
401missing_key没有 Authorization 头带上 Bearer 密钥
401invalid_key密钥不存在或已被轮换使用最近一次签发的值
401revoked_key密钥已吊销重新签发
413payload_too_large请求体超过 64KB拆分请求
429rate_limited超过 60 次/分钟降低频率或改用批量
429quota_exceeded本月 500 次用尽次月 1 日重置
404endpoint_not_found路径不存在对照 /openapi.json
500internal_error服务端异常带 request_id 反馈
/ 07

配额与限流

两套阈值解决两种滥用:配额防长期占用,限流防瞬时打爆。

维度阈值为什么这么定
月度配额500 次 / 密钥够一个人把整份数据集跑完,但不够被当成免费算力薅
分钟限流60 次 / 分钟批量接口已覆盖高吞吐场景,单条高频多半是脚本失控
批量折算50 条 = 1 次把成本推向「合并请求」,同时降低双方连接开销
用量查询不计配额计量本身不该成为被计量的成本
重置周期每月 1 日自然月边界,用户心智模型最清楚
这个控制台本身也是作品的一部分:密钥签发、轮换、吊销、配额计量、限流、错误码、OpenAPI 描述—— 开放平台产品经理真正要设计的东西,几乎都在这几件小事里。 功能谁都能加上,阈值怎么定、失败怎么表达、成本怎么分摊才是产品判断。 — Sylvia Zhong · AI 平台产品经理