Entity Enricher REST API 让你能够以编程方式丰富实体、管理 schema 并检索记录。所有响应均为 JSON。实时进度使用服务器发送事件 (SSE)。
通过三个步骤集成 Entity Enricher:
GET /api/schema/saved列出已保存的模式,或根据示例数据生成一个
POST /api/single/enrich/stream启动充实,获取用于 SSE 流式传输的作业 ID
GET /api/records/{id}检索完整的 enrichment record 及其结构化输出
所有 API 端点(登录/注册除外)都需要身份验证。使用带有组织访问密钥的 X-API-Key 请求头:
curl -H "X-API-Key: ent_your_key_here" \
https://your-instance.example.com/api/enrichment/options在 API 密钥页面或通过 POST /api/auth/api-keys 创建 API 密钥。有关密钥类型和权限的详情,请参阅API 密钥指南。
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/enrichment/options | 可用的模型、语言和策略 |
| POST | /api/single/enrich/stream | 启动单个实体充实(返回用于 SSE 的 job_id) |
| POST | /api/single/enrich/sync | 面向非 SSE 客户端(Make.com、curl)的阻塞式单条增强 |
| POST | /api/enrichment/batch/start | 为多个实体启动批量充实 |
| POST | /api/enrichment/batch/fetch | 从外部 URL 获取实体 |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/llm/stream/{job_id} | 适用于任何 LLM 作业(扩充、模式、融合)的 SSE 流 |
| POST | /api/llm/cancel/{job_id} | 取消正在运行或已暂停的作业 |
| POST | /api/llm/continue/{job_id} | 恢复已暂停的作业(例如在分类不匹配之后) |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/schema/saved | 列出所有已保存的模式 |
| POST | /api/schema/saved | 创建新架构 |
| POST | /api/schema/generate/stream | 从示例数据生成模式(SSE) |
| POST | /api/schema/saved/{id}/prompt/stream | 使用自然语言进行 AI 模式编辑(SSE) |
| POST | /api/schema/analyze-sample | 分析示例 JSON,找出有歧义的属性名(在其父级上下文中可有多种解读,或无从解读),以及将实体事实与各父级专属事实混在一起的关联项(无状态报告,附重命名建议) |
| POST | /api/schema/saved/{id}/analyze | 对已保存的架构运行歧义检查和身份范围检查,并写入相应注释(为每个有歧义的名称重写描述) |
| POST | /api/schema/scoping-split | 对样本集应用一次身份界定拆分——关联实体自身的事实会移入独立的子对象(确定性、免费、不保存任何内容) |
| DELETE | /api/schema/saved/{id}/enrichment-data | 清除某个 schema 的补全数据——记录和实体状态——但保留该 schema(所有者及以上) |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/records | 分页并筛选列出记录 |
| GET | /api/records/{id} | 通过结构化输出获取完整的记录详情 |
| POST | /api/records/batch-delete | 删除多条记录(最多 100 条) |
| POST | /api/fusion/merge | 合并来自多个 model 的结果 |
| 方法 | 端点 | 描述 |
|---|---|---|
| POST | /api/attachments | 上传一个或多个文件(multipart/form-data) |
| POST | /api/attachments/base64 | 通过 JSON base64 上传一个文件(用于非 multipart 客户端) |
| GET | /api/attachments/{id}/download | 下载原始文件字节 |
| DELETE | /api/attachments/{id} | 删除附件(丰富后清理) |
| 方法 | 端点 | 描述 |
|---|---|---|
| POST | /api/schema/saved/{id}/publish | 将关联模式的工作副本发布为增强及其数据库所依据的契约。在此之前,任何结构性变更都不会生效 |
| POST | /api/schema/sample/generate/stream | 生成 1..N 个同一实体类型的样本 JSON 对象(返回用于 SSE 的 job_id) |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/databases | 列出组织的数据库注册项,以及待处理的增量数量 |
| POST | /api/databases | 为模式注册数据库 |
| GET | /api/databases/{id}/snapshot | 以 .sql 快照形式下载完整状态——从零开始初始化 |
| GET | /api/databases/{id}/changes | 获取下一个 FIFO 增量窗口;认领这些增量以租约方式实现确认送达 |
| POST | /api/databases/{id}/ack | 确认已应用的增量直到指定 id — 释放租约 |
| POST | /api/databases/{id}/clear-acked | 清除已投递并已确认的增量 |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/semantic-concepts | 浏览概念词汇表,按类型筛选并相对参考概念评分 |
| GET | /api/semantic-concepts/types | 列出概念类型及其数量和嵌入模型 |
| POST | /api/semantic-concepts/probe | 针对一段文本试运行解析阶梯——看它会匹配到什么,以及匹配程度如何 |
| GET | /api/semantic-concepts/duplicates | 略低于合并阈值的概念对 |
| POST | /api/semantic-concepts/import | 批量解析包含身份文本的 CSV(铸造需要所有者权限) |
| GET | /api/semantic-concepts/export | 将词汇表导出为 CSV |
| POST | /api/semantic-concepts/delete-impact | 删除概念会影响什么——使用计数与重新同步成本 |
| GET | /api/semantic-concepts/migration/status | 嵌入模型迁移的状态(如果正在进行) |
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/benchmarks | 列出基准测试场景 |
| POST | /api/benchmarks/{id}/run | 在多个模型上运行同一场景——每个结果都会自动评分 |
| POST | /api/benchmarks/{id}/reference | 保存并验证场景评分所依据的黄金参考答案 |
| GET | /api/billing/balance | 当前积分余额 |
| GET | /api/billing/transactions | 积分交易记录,含嵌入消耗 |
| GET | /api/billing/plans | 可用套餐及其限制 |
富集、schema 生成和融合操作使用 Server-Sent Events 实现实时进度。启动任务后获取 job_id,然后连接到 SSE 流:
| 事件 | 描述 |
|---|---|
| model_started | 模型处理开始 |
| expertise_completed | 一个专业领域已完成(含部分结果) |
| model_completed | 模型已完成,返回 result、record_id 和 cost |
| fusion_started / fusion_completed | 多模型融合生命周期事件 |
| entity_started / entity_completed | 批次专用的每实体事件(包含 entity_index) |
| completed | 终止事件 - 关闭连接 |
| error | 发生作业级错误 |
一个完整的工作流程:列出 schema、启动扩充、流式传输结果并获取最终记录:
import httpx
import json
BASE = "https://your-instance.example.com"
KEY = "ent_your_api_key"
HEADERS = {"X-API-Key": KEY, "Content-Type": "application/json"}
# 1. List saved schemas
schemas = httpx.get(f"{BASE}/api/schema/saved", headers=HEADERS).json()
schema_id = schemas["schemas"][0]["id"]
# 2. Start enrichment
resp = httpx.post(f"{BASE}/api/single/enrich/stream", headers=HEADERS, json={
"entity_data": {"name": "Moderna Inc", "country": "US"},
"schema_id": schema_id,
"models": ["anthropic::claude-sonnet-4-5-20250514"],
"strategy": "multi_expertise",
})
job_id = resp.json()["job_id"]
# 3. Stream SSE events
record_id = None
with httpx.stream("GET", f"{BASE}/api/llm/stream/{job_id}", headers=HEADERS) as stream:
for line in stream.iter_lines():
if not line.startswith("data: "):
continue
event = json.loads(line[6:])
if event["type"] == "model_completed" and event.get("record_id"):
record_id = event["record_id"]
elif event["type"] == "completed":
break
# 4. Retrieve the enrichment record
if record_id:
record = httpx.get(f"{BASE}/api/records/{record_id}", headers=HEADERS).json()
print(json.dumps(record["structured_output"], indent=2))使用两个模型启动批量充实并流式传输结果:
# Start batch enrichment
JOB_ID=$(curl -s -X POST \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
"$BASE/api/enrichment/batch/start" \
-d '{
"entities": [
{"name": "Pfizer Inc", "country": "US"},
{"name": "Roche", "country": "CH"}
],
"schema_id": "your-schema-uuid",
"models": ["anthropic::claude-sonnet-4-5-20250514", "openai::gpt-4o"],
"strategy": "multi_expertise",
"arbitration_model": "anthropic::claude-sonnet-4-5-20250514"
}' | jq -r '.job_id')
# Stream events
curl -N -H "X-API-Key: $KEY" "$BASE/api/llm/stream/$JOB_ID"
# List resulting records
curl -s -H "X-API-Key: $KEY" \
"$BASE/api/records?type=enrichment&page_size=10" | jq '.records'| 状态 | 含义 | 示例 |
|---|---|---|
| 200 | 成功 | 请求已完成 |
| 400 | 错误的请求 | 模型键无效或字段缺失 |
| 401 | 未授权 | API 密钥缺失或无效 |
| 402 | 需要付款 | 套餐限制或积分余额——配额耗尽、模型或语言过多、功能不在套餐内。响应体中除 detail 外还带有机器可读的 code。 |
| 403 | 禁止 | 角色权限不足,无法访问此端点 |
| 404 | 未找到 | 未找到记录、模式或任务 |
| 500 | 服务器错误 | 内部故障 |
错误响应包含一个 detail 字段,内含可读的错误信息。套餐和计费类失败(402)还会附带结构化响应体,其中包含稳定的 code——prompt_limit_reached、insufficient_credits、model_limit_exceeded、benchmarks_not_in_plan——以及相关的限额和用量数值,便于客户端按原因分支处理,而无需解析文字描述。若流式传输过程中发生故障,SSE 流会在终止事件 completed 之前发出 error 事件类型。
模型通过 provider_name::model_name 格式的复合键标识。使用 GET /api/enrichment/options 列出可用模型及其键。
在 enrichment、schema 生成和示例生成中,model 参数为可选:省略它(或传入字面量 "auto"),服务器将选择你所在组织的默认模型 — 如果在设置中固定了按任务的默认值,则使用该固定值,否则使用你的评分来源基准中综合分数最高的模型。选项响应中的 default_models 字段会显示自动当前解析出的模型,而 model_auto_selected SSE 事件会在每个任务中报告所选模型。自动始终解析为单个模型(它绝不会触发 fusion);如需可复现的流水线,请继续传入明确的模型。
请求选项会约束自动选择:设置 enable_web_search: true 后,仅会考虑支持网络搜索的模型(选项响应中的 default_models_web_search 字段会预览此次选择),而二进制附件则要求模型能够读取它们(PDF、视觉、音频)。当没有符合条件的模型满足这些约束时,请求会返回 HTTP 400 no_capable_default_model 错误,而不会悄悄丢弃该选项。
anthropic::claude-sonnet-4-5-20250514openai::gpt-4ogoogle::gemini-2.5-prodeepseek::deepseek-chat该应用包含带有请求/响应示例的交互式 API 文档。需要管理员身份验证才能访问: