API 참조 - Entity Enricher 문서

API 참조

Entity Enricher REST API를 사용하면 엔터티를 강화하고, 스키마를 관리하며, 레코드를 프로그래밍 방식으로 검색할 수 있습니다. 모든 응답은 JSON입니다. 실시간 진행 상황은 Server-Sent Events(SSE)를 사용합니다.

빠른 시작

세 단계로 Entity Enricher를 통합합니다:

1

스키마 가져오기

GET /api/schema/saved

저장된 스키마를 나열하거나 샘플 데이터로부터 하나를 생성합니다

2

보강

POST /api/single/enrich/stream

강화를 시작하고 SSE 스트리밍용 작업 ID를 받으세요

3

결과 가져오기

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 Keys 페이지 또는 POST /api/auth/api-keys를 통해 API key를 생성하세요. key 유형과 권한에 대한 자세한 내용은 API Keys 가이드를 참조하세요.

주요 엔드포인트

보강

메서드엔드포인트설명
GET/api/enrichment/options사용 가능한 model, 언어 및 전략
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새 schema 생성
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-dataschema의 enrichment 데이터 — 레코드와 엔터티 상태 — 를 삭제하고 schema는 유지합니다 (소유자+)

레코드 및 융합

메서드엔드포인트설명
GET/api/records페이지네이션 및 필터링으로 레코드 목록 표시
GET/api/records/{id}구조화된 출력으로 전체 레코드 상세 정보 가져오기
POST/api/records/batch-delete여러 레코드 삭제 (최대 100개)
POST/api/fusion/merge여러 model의 결과를 fusion합니다

첨부 파일

메서드엔드포인트설명
POST/api/attachments하나 이상의 파일을 업로드합니다(multipart/form-data)
POST/api/attachments/base64JSON base64로 파일 하나를 업로드합니다(multipart를 지원하지 않는 클라이언트용)
GET/api/attachments/{id}/download원본 파일 바이트를 다운로드합니다
DELETE/api/attachments/{id}첨부 파일 삭제 (강화 후 정리)

스키마 게시 및 샘플

메서드엔드포인트설명
POST/api/schema/saved/{id}/publish연결된 스키마의 작업 사본을 보강과 해당 데이터베이스가 따르는 계약으로 게시합니다. 이 작업을 실행하기 전까지는 구조적 변경이 적용되지 않습니다
POST/api/schema/sample/generate/stream단일 엔티티 유형의 샘플 JSON 객체를 1..N개 생성합니다(SSE용 job_id 반환)

Database Sync

메서드엔드포인트설명
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-impactconcept 삭제 시 영향을 받는 항목 — 사용 횟수와 재동기화 비용
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이용 가능한 플랜과 제한 사항

SSE 스트리밍

강화, 스키마 생성 및 융합 작업은 실시간 진행 상황을 위해 Server-Sent Events를 사용합니다. 작업을 시작하고 job_id를 받은 다음 SSE 스트림에 연결합니다:

SSE 이벤트 흐름

data: {"type":"model_started","model":"anthropic::claude-sonnet-4-5"}
data: {"type":"expertise_completed","expertise_key":"financial","partial_result":{...}}
data: {"type":"model_completed","success":true,"result":{...},"record_id":"uuid"}
data: {"type":"completed"}

주요 이벤트 유형

이벤트설명
model_started모델 처리가 시작됩니다
expertise_completed전문 분야 하나 완료(부분 결과 포함)
model_completed모델이 result, record_id, cost와 함께 완료되었습니다
fusion_started / fusion_completed다중 모델 퓨전 수명 주기 이벤트
entity_started / entity_completed배치 전용 엔티티별 이벤트(entity_index 포함)
completed종료 이벤트 - 연결을 닫습니다
error작업 수준 오류가 발생했습니다

Python 예제

스키마를 나열하고, 강화를 시작하고, 결과를 스트리밍하고, 최종 레코드를 가져오는 완전한 워크플로:

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))

curl 예제

두 개의 모델로 배치 강화를 시작하고 결과를 스트리밍하세요:

# 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결제가 필요합니다요금제 한도 또는 크레딧 잔액 문제입니다 — 할당량 소진, 너무 많은 모델 또는 언어, 요금제에 포함되지 않은 기능. 본문에는 상세 정보와 함께 기계가 읽을 수 있는 코드가 포함됩니다.
403금지됨이 엔드포인트에 대한 권한이 부족합니다
404찾을 수 없음레코드, 스키마 또는 작업을 찾을 수 없습니다
500서버 오류내부 오류

오류 응답에는 사람이 읽을 수 있는 오류 메시지가 담긴 detail 필드가 포함됩니다. 플랜 및 결제 관련 실패(402)에는 안정적인 code 값(prompt_limit_reached, insufficient_credits, model_limit_exceeded, benchmarks_not_in_plan)과 해당 한도 및 사용량 수치가 담긴 구조화된 본문이 추가로 포함되므로, 클라이언트는 문장을 파싱하지 않고 원인에 따라 분기할 수 있습니다. 스트리밍 도중 오류가 발생하면 SSE 스트림은 error 이벤트 타입을 최종 completed 이벤트보다 먼저 내보냅니다.

모델 복합 키

모델은 provider_name::model_name 형식의 복합 키로 식별됩니다. 사용 가능한 모델과 해당 키를 나열하려면 GET /api/enrichment/options를 사용하세요.

model 파라미터는 enrichment, schema 생성, 샘플 생성에서 선택 사항입니다: 생략하거나(또는 리터럴 "auto"를 전달하면) 서버가 organization의 기본 model을 선택합니다 — Settings에 설정된 경우 작업별 고정 기본값을, 그렇지 않으면 점수 산정용 benchmark에서 전체 점수가 가장 높은 model을 사용합니다. options 응답의 default_models 필드는 자동이 현재 무엇으로 해석되는지 보여주며, model_auto_selected SSE 이벤트가 모든 작업에서 선택 결과를 알려줍니다. 자동은 항상 단일 model로 해석되며(fusion을 트리거하지 않습니다), 재현 가능한 파이프라인을 위해서는 계속 명시적인 model을 전달하세요.

요청 옵션은 자동 선택을 제한합니다. enable_web_search: true를 사용하면 웹 검색을 지원하는 모델만 고려되며(옵션 응답의 default_models_web_search 필드가 해당 선택을 미리 보여줍니다), 바이너리 첨부파일은 이를 읽을 수 있는 모델(PDF, 비전, 오디오)이 필요합니다. 적합한 모델이 제약 조건을 충족하지 못하면, 옵션을 조용히 무시하는 대신 요청이 HTTP 400 no_capable_default_model으로 실패합니다.

Anthropic
anthropic::claude-sonnet-4-5-20250514
OpenAI
openai::gpt-4o
Google
google::gemini-2.5-pro
DeepSeek
deepseek::deepseek-chat

대화형 API 문서

애플리케이션에는 요청/응답 예시가 포함된 대화형 API 문서가 있습니다. 접근하려면 관리자 인증이 필요합니다:

다음 단계