Phase 1.5: 엔티티/클레임 직접 입력 — OntologyEditorPage + 3탭 (엔티티/클레임/JSON 일괄)
백엔드 (crawler_platform/app/api/routes.py):
- POST /projects/{n}/entities: 단일 엔티티 직접 생성 (upsert)
- CreateEntityRequest (entity_type, name, metadata)
- POST /projects/{n}/entities/bulk: 다수 엔티티 일괄 생성
- BulkCreateEntitiesRequest, 응답 created 수 + entities
- DELETE /projects/{n}/entities/{id}: 단일 엔티티 삭제
- POST /projects/{n}/claims: 단일 클레임 직접 생성
- CreateClaimRequest (source_name, subject_entity_id, predicate,
object_entity_id|object_value, confidence, confidence_reason, evidence_text)
- claim_hash로 중복 검출 → 있으면 confidence/메타 갱신
- status="validated_claim", extraction_method="manual"
- evidence_text 있으면 Evidence 자동 생성
- DELETE /projects/{n}/claims/{id}: 단일 클레임 삭제
프론트엔드 API (src/lib/api/):
- entities.ts: list/create/bulkCreate/delete + Zod 스키마
- claims.ts: list/create/delete + Zod 스키마 (passthrough)
TanStack Query 훅 (src/hooks/):
- useEntities.ts: useEntities, useCreateEntity, useBulkCreateEntities, useDeleteEntity
- useClaims.ts: useClaims, useCreateClaim, useDeleteClaim
- queryKeys에 entities.list, claims.list 키 팩토리
UI 프리미티브 (src/components/ui/):
- tabs.tsx: Tabs, TabsList, TabsTrigger, TabsContent (Context API 기반)
OntologyEditorPage 신규 (src/pages/):
- 3개 탭 구조:
* 엔티티 탭: 도메인의 entity_types에서 타입 선택 + 이름 입력 → 추가
+ 엔티티 목록 (max-h scroll, 타입 배지, 삭제 버튼)
* 클레임 탭: 소스/주어/술어/목적어(엔티티 or 리터럴)/신뢰도 입력
+ 클레임 목록 (S-P-O 시각화, 신뢰도, status 배지)
* JSON 일괄 탭: textarea에 { entities: [...] } 붙여넣기 → 파싱 → bulkCreate
- react-hook-form + zod 검증
- useOntology(domain)으로 entity_types/predicates 자동 로드
- 삭제 confirm 대화상자, sonner 토스트
라우팅 & Sidebar:
- App.tsx: /editor/:projectId 라우트 추가
- AppShell: 사이드바에 "온톨로지 편집" 메뉴 (Network 아이콘)
i18n: editor.*, nav.editor 키 (한/영)
UI_REBUILD_PLAN.md 업데이트:
- Phase 1.4 `00786a4` 커밋 기록
- Phase 1.5 완료 표시 + 대기 보드 Phase 2/3 재정렬
다음 단계: Phase 2 — 그래프 시각화/편집 (Cytoscape React 래퍼)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
"sources": "Sources",
|
||||
"crawl": "Crawl",
|
||||
"research": "Research",
|
||||
"editor": "Editor",
|
||||
"review": "Review",
|
||||
"toggleSidebar": "Toggle sidebar"
|
||||
},
|
||||
@@ -92,6 +93,47 @@
|
||||
"historyEmpty": "No sessions yet",
|
||||
"pages": "pages"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Ontology Editor",
|
||||
"entitiesTab": "Entities",
|
||||
"claimsTab": "Claims",
|
||||
"bulkTab": "JSON Bulk",
|
||||
"addEntity": "Add Entity",
|
||||
"addEntityDesc": "Pick from the domain's entity_types",
|
||||
"entityType": "Type",
|
||||
"pickType": "Pick type...",
|
||||
"entityName": "Name",
|
||||
"add": "Add",
|
||||
"entitiesList": "Entities",
|
||||
"entityCount": "{{count}} total",
|
||||
"entitiesEmpty": "No entities yet",
|
||||
"entityAdded": "Entity added: {{name}}",
|
||||
"entityAddFailed": "Add failed: {{msg}}",
|
||||
"confirmDeleteEntity": "Delete entity '{{name}}'?",
|
||||
"addClaim": "Add Claim",
|
||||
"addClaimDesc": "Subject-Predicate-Object form",
|
||||
"source": "Source",
|
||||
"pickSource": "Pick source...",
|
||||
"subject": "Subject",
|
||||
"pickSubject": "Pick entity...",
|
||||
"predicate": "Predicate",
|
||||
"pickPredicate": "Pick predicate...",
|
||||
"objectKind": "Object kind",
|
||||
"objectEntity": "Other entity",
|
||||
"objectValue": "Literal value",
|
||||
"pickObject": "Pick entity...",
|
||||
"confidence": "Confidence",
|
||||
"claimsList": "Claims",
|
||||
"claimCount": "{{count}} total",
|
||||
"claimsEmpty": "No claims yet",
|
||||
"claimAdded": "Claim added",
|
||||
"claimAddFailed": "Add failed: {{msg}}",
|
||||
"confirmDeleteClaim": "Delete this claim?",
|
||||
"bulkTitle": "JSON Bulk Input",
|
||||
"bulkDesc": "JSON of shape { entities: [{ entity_type, name, metadata? }] }",
|
||||
"bulkSubmit": "Bulk Add",
|
||||
"bulkAdded": "{{count}} entities added"
|
||||
},
|
||||
"crawl": {
|
||||
"title": "Seed Crawl",
|
||||
"formTitle": "Crawl Settings",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"sources": "참고 소스",
|
||||
"crawl": "크롤 진행",
|
||||
"research": "자율 연구",
|
||||
"editor": "온톨로지 편집",
|
||||
"review": "결과 검토",
|
||||
"toggleSidebar": "사이드바 토글"
|
||||
},
|
||||
@@ -92,6 +93,47 @@
|
||||
"historyEmpty": "아직 실행된 세션이 없습니다",
|
||||
"pages": "페이지"
|
||||
},
|
||||
"editor": {
|
||||
"title": "온톨로지 직접 편집",
|
||||
"entitiesTab": "엔티티",
|
||||
"claimsTab": "클레임",
|
||||
"bulkTab": "JSON 일괄 입력",
|
||||
"addEntity": "엔티티 추가",
|
||||
"addEntityDesc": "온톨로지 도메인의 entity_types 중에서 선택",
|
||||
"entityType": "타입",
|
||||
"pickType": "타입 선택...",
|
||||
"entityName": "이름",
|
||||
"add": "추가",
|
||||
"entitiesList": "엔티티 목록",
|
||||
"entityCount": "{{count}}개",
|
||||
"entitiesEmpty": "아직 등록된 엔티티가 없습니다",
|
||||
"entityAdded": "엔티티가 추가되었습니다: {{name}}",
|
||||
"entityAddFailed": "추가 실패: {{msg}}",
|
||||
"confirmDeleteEntity": "엔티티 '{{name}}'을 삭제하시겠습니까?",
|
||||
"addClaim": "클레임 추가",
|
||||
"addClaimDesc": "주어-술어-목적어 형태로 직접 입력",
|
||||
"source": "소스",
|
||||
"pickSource": "소스 선택...",
|
||||
"subject": "주어 (Subject)",
|
||||
"pickSubject": "엔티티 선택...",
|
||||
"predicate": "술어 (Predicate)",
|
||||
"pickPredicate": "술어 선택...",
|
||||
"objectKind": "목적어 유형",
|
||||
"objectEntity": "다른 엔티티",
|
||||
"objectValue": "리터럴 값",
|
||||
"pickObject": "엔티티 선택...",
|
||||
"confidence": "신뢰도",
|
||||
"claimsList": "클레임 목록",
|
||||
"claimCount": "{{count}}개",
|
||||
"claimsEmpty": "아직 등록된 클레임이 없습니다",
|
||||
"claimAdded": "클레임이 추가되었습니다",
|
||||
"claimAddFailed": "추가 실패: {{msg}}",
|
||||
"confirmDeleteClaim": "클레임을 삭제하시겠습니까?",
|
||||
"bulkTitle": "JSON 일괄 입력",
|
||||
"bulkDesc": "{ entities: [{ entity_type, name, metadata? }] } 형태의 JSON",
|
||||
"bulkSubmit": "일괄 추가",
|
||||
"bulkAdded": "{{count}}개 엔티티가 추가되었습니다"
|
||||
},
|
||||
"crawl": {
|
||||
"title": "시드 크롤",
|
||||
"formTitle": "크롤 설정",
|
||||
|
||||
Reference in New Issue
Block a user