查询任务术语
检索指定任务在 术语扫描(TB_SCAN) 阶段发现的新术语条目。结果字段与控制台「术语扫描报告」页面一致。
触发条件
术语扫描是 创建翻译任务 链路的第一步:系统从任务的 content 里提取所有候选词,过滤掉项目术语库已存在的,剩余部分送入 TB_SCAN 工作流进行分类评分。
scan_status 的 5 种取值
| 状态 | 含义 |
|---|---|
pending | 任务刚受理,后台还没决定是否要扫描(CSV 还在上传 / 参数还在解析) |
running | TB_SCAN 工作流在跑,此时可能已能查到部分结果 |
completed | TB_SCAN 成功结束,返回的是完整结果 |
skipped | 后台直接跳到翻译,没有扫描过程。可能原因:所有 content 都已在项目术语库 / 无新内容 / 创建时 scan_terms=false / 准备阶段异常降级 |
failed | 任务整体因前置步骤失败(例如 xlsx_url 下载失败、CSV 上传失败) |
请求地址
GET {BASE_URL}/api/open/v1/tasks/terms也支持 POST(参数可放在 body 里,JSON 格式)。
鉴权 Header
和 创建翻译任务 完全一样:
| Header | 值 |
|---|---|
X-Loxily-AppKey | 项目 App Key |
X-Loxily-Timestamp | Unix 秒(5 分钟有效) |
X-Loxily-Sign | MD5(timestamp + "" + appSecret) —— GET 无 body,body 以空字符串参与签名 |
查询参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
task_id | string | 是 | — | 创建任务时返回的 task_id |
page | number | 否 | 1 | 页码,从 1 起 |
page_size | number | 否 | 100 | 单页大小,上限 500 |
响应字段
成功(HTTP 200):
json
{
"success": true,
"code": 0,
"msg": "ok",
"trace_id": "...",
"data": {
"task_id": "68a12cb7e1f9a88b4ea23c77",
"scan_status": "completed",
"page": 1,
"page_size": 100,
"total": 42,
"items": [
{
"id": "6626f0a32e8e5d24b6c9f1a2",
"term": "战斗力",
"content": "总战斗力的构成由其它战斗力按权重加和得出",
"source_language": "zh-cn",
"category": "Attributes",
"glossary_score": 4.0,
"judgment": "Extracted '战斗力' from content. Refers to a game stat, 'Combat Power', which likely requires consistent translation.",
"translation_source": "ai",
"translations": {
"en": "Combat Power",
"zh-cn": "Combat Power"
},
"updated_at": "2026-04-22T10:25:17.455Z"
}
]
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
task_id | string | 回显 |
scan_status | string | "pending" / "running" / "completed" / "skipped" / "failed",见上方详细说明 |
page / page_size / total | number | 分页信息;total 为本次扫描发现的术语总数 |
items[].id | string | 该条术语的唯一 ID(对应 /tasks/terms/update / /tasks/terms/delete 的入参 id) |
items[].term | string | AI 从 content 中提取出来的术语本身 |
items[].content | string | 出现该术语的源文上下文 |
items[].source_language | string | 源语言代码 |
items[].category | string | AI 判定的术语类别(如 Character / Location / Item / Attributes / Skill 等) |
items[].glossary_score | number | 术语重要度评分 0–10(越高越应该加入术语库) |
items[].judgment | string | AI 给出的推荐理由 |
items[].translation_source | string | 译文来源:ai / tm / manual 等 |
items[].translations | object | 各目标语言的译文,key 为语言代码(连字符格式,如 en / zh-cn / ja);空值会被省略 |
items[].updated_at | string | ISO 8601 时间 |
错误码
| code | 说明 |
|---|---|
| 400 | 缺少 task_id / 签名 Header 无效 |
| 401 | 签名校验失败或时间戳过期 |
| 403 | 任务不属于该 App Key |
| 404 | task_id 不存在 |
| 500 | 系统错误 |
示例
cURL
bash
APP_KEY="5685414646a54423c891d87194d87f3f"
APP_SECRET="<你的 App Secret>"
TASK_ID="68a12cb7e1f9a88b4ea23c77"
BASE_URL="https://api.loxily.com"
TIMESTAMP=$(date +%s)
# GET 无 body,body 以空字符串参与签名
SIGN=$(printf '%s' "${TIMESTAMP}${APP_SECRET}" | md5)
curl -s "${BASE_URL}/api/open/v1/tasks/terms?task_id=${TASK_ID}&page=1&page_size=100" \
-H "X-Loxily-AppKey: ${APP_KEY}" \
-H "X-Loxily-Timestamp: ${TIMESTAMP}" \
-H "X-Loxily-Sign: ${SIGN}"Node.js
javascript
import crypto from 'crypto';
const timestamp = Math.floor(Date.now() / 1000).toString();
const body = ''; // GET 无 body
const sign = crypto.createHash('md5')
.update(`${timestamp}${body}${process.env.LOXILY_APP_SECRET}`, 'utf8')
.digest('hex');
const qs = new URLSearchParams({ task_id: taskId, page: '1', page_size: '100' });
const resp = await fetch(
`${process.env.LOXILY_BASE_URL}/api/open/v1/tasks/terms?${qs}`,
{
headers: {
'X-Loxily-AppKey': process.env.LOXILY_APP_KEY,
'X-Loxily-Timestamp': timestamp,
'X-Loxily-Sign': sign,
},
},
);
const { data } = await resp.json();
console.log(`Found ${data.total} terms, status=${data.scan_status}`);
for (const item of data.items) {
console.log(`${item.term} (${item.category}, score ${item.glossary_score})`);
}使用时机
推荐的集成流程:
- 调
POST /api/open/v1/tasks/create创建任务 - 收到回调
term_scan.completed后(或者直接轮询也行),调本接口一次就能拿到所有术语 - 业务侧自行决定如何处理这些术语(比如落库审核、自动追加到本地术语库、提示给翻译操作人员等)