本设计文档描述了标注平台外部API增强功能的技术实现方案,包括:
graph TB
subgraph External System
ES[样本中心]
end
subgraph Backend API
ER[External Router]
ES_SVC[External Service]
JWT[JWT Service]
end
subgraph Database
DB[(MySQL)]
end
subgraph Scripts
TOKEN_SCRIPT[generate_admin_token.py]
TEST_SCRIPT[test_external_api.py]
end
ES -->|POST /api/external/projects/init| ER
ER --> ES_SVC
ES_SVC --> DB
JWT --> ES_SVC
TOKEN_SCRIPT --> JWT
TEST_SCRIPT -->|HTTP Requests| ER
class TagItem(BaseModel):
"""标签项"""
tag: str # 标签名称
color: Optional[str] = None # 颜色,可选,格式: #RRGGBB
class ProjectInitRequest(BaseModel):
name: str
description: Optional[str] = ""
task_type: TaskType # 新增 polygon 类型
data: List[TaskDataItem]
external_id: Optional[str] = None
tags: Optional[List[TagItem]] = None # 新增标签列表
class TaskType(str, Enum):
TEXT_CLASSIFICATION = "text_classification"
IMAGE_CLASSIFICATION = "image_classification"
OBJECT_DETECTION = "object_detection"
NER = "ner"
POLYGON = "polygon" # 新增多边形标注
根据任务类型和标签生成对应的XML配置:
def generate_config_with_tags(task_type: TaskType, tags: List[TagItem]) -> str:
"""根据任务类型和标签生成XML配置"""
# 为没有颜色的标签生成随机颜色
# 根据任务类型选择对应的标签组件
# 生成完整的XML配置
def generate_random_color() -> str:
"""生成随机颜色,返回 #RRGGBB 格式"""
import random
return f"#{random.randint(0, 0xFFFFFF):06x}"
标签信息直接嵌入到项目的XML配置中,不需要额外的数据库表。
文本分类(带标签):
<View>
<Text name="text" value="$text"/>
<Choices name="label" toName="text" choice="single">
<Choice value="猫猫" style="background-color: #FF5733"/>
<Choice value="狗狗" style="background-color: #33FF57"/>
</Choices>
</View>
多边形标注:
<View>
<Image name="image" value="$image"/>
<PolygonLabels name="label" toName="image">
<Label value="区域A" background="#FF5733"/>
<Label value="区域B" background="#33FF57"/>
</PolygonLabels>
</View>
A property is a characteristic or behavior that should hold true across all valid executions of a system—essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.
For any 项目初始化请求包含tags参数,创建的项目配置中应包含所有传入的标签,且:
Validates: Requirements 1.1, 1.2, 1.3, 1.4
For any polygon类型的项目创建请求,生成的XML配置应包含PolygonLabels组件,且所有传入的标签都作为Label子元素存在。
Validates: Requirements 2.1, 2.2
| 场景 | 错误码 | HTTP状态码 | 处理方式 |
|---|---|---|---|
| 无效的颜色格式 | INVALID_COLOR_FORMAT | 400 | 返回错误信息,指出无效的颜色值 |
| 标签名称为空 | INVALID_TAG_NAME | 400 | 返回错误信息,要求提供有效的标签名 |
| 不支持的任务类型 | INVALID_TASK_TYPE | 400 | 返回错误信息,列出支持的任务类型 |
import re
def validate_color(color: str) -> bool:
"""验证颜色格式是否为有效的 #RRGGBB"""
return bool(re.match(r'^#[0-9A-Fa-f]{6}$', color))
颜色生成测试
XML配置生成测试
标签验证测试
使用 Hypothesis 库进行属性测试:
标签处理属性测试
Polygon配置属性测试
backend/test/ 目录"""
生成长期有效的管理员Token脚本
功能:
1. 查找或创建管理员用户
2. 生成99999天有效期的Token
3. 输出Token并验证有效性
使用方式:
python scripts/generate_admin_token.py
"""
"""
外部API测试脚本
功能:
1. 测试5种标注类型的项目创建
2. 测试进度查询接口
3. 测试数据导出接口
4. 验证标签传入功能
使用方式:
python scripts/test_external_api.py --base-url http://localhost:8003 --token <admin_token>
"""
| 文件 | 变更类型 | 说明 |
|---|---|---|
| backend/schemas/external.py | 修改 | 添加TagItem、更新TaskType枚举、更新ProjectInitRequest |
| backend/services/external_service.py | 修改 | 添加标签处理逻辑、添加polygon配置模板 |
| backend/EXTERNAL_API_DOCUMENTATION.md | 修改 | 更新API文档,添加tags参数说明 |
| backend/scripts/generate_admin_token.py | 新增 | 生成长期Token脚本 |
| backend/scripts/test_external_api.py | 新增 | API测试脚本 |
| backend/test/test_external_api_tags.py | 新增 | 标签功能单元测试 |