@things-factory/integration-label-studio 9.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/EXTERNAL_DATA_SOURCING.md +484 -0
  3. package/IMPLEMENTATION_GUIDE.md +469 -0
  4. package/INTEGRATION.md +279 -0
  5. package/README.md +1014 -0
  6. package/SETUP_GUIDE.md +577 -0
  7. package/TEST_GUIDE.md +387 -0
  8. package/UI_CUSTOMIZATION.md +395 -0
  9. package/USER_SYNC_GUIDE.md +514 -0
  10. package/client/bootstrap.ts +1 -0
  11. package/client/index.ts +1 -0
  12. package/client/label-studio-label-page.ts +52 -0
  13. package/client/label-studio-project-create.ts +216 -0
  14. package/client/label-studio-project-list.ts +214 -0
  15. package/client/label-studio-wrapper.ts +294 -0
  16. package/client/route.ts +15 -0
  17. package/client/tsconfig.json +13 -0
  18. package/config/config.development.js +124 -0
  19. package/config/config.production.js +182 -0
  20. package/dist-client/bootstrap.d.ts +1 -0
  21. package/dist-client/bootstrap.js +2 -0
  22. package/dist-client/bootstrap.js.map +1 -0
  23. package/dist-client/index.d.ts +1 -0
  24. package/dist-client/index.js +2 -0
  25. package/dist-client/index.js.map +1 -0
  26. package/dist-client/label-studio-label-page.d.ts +8 -0
  27. package/dist-client/label-studio-label-page.js +54 -0
  28. package/dist-client/label-studio-label-page.js.map +1 -0
  29. package/dist-client/label-studio-project-create.d.ts +16 -0
  30. package/dist-client/label-studio-project-create.js +235 -0
  31. package/dist-client/label-studio-project-create.js.map +1 -0
  32. package/dist-client/label-studio-project-list.d.ts +16 -0
  33. package/dist-client/label-studio-project-list.js +222 -0
  34. package/dist-client/label-studio-project-list.js.map +1 -0
  35. package/dist-client/label-studio-wrapper.d.ts +57 -0
  36. package/dist-client/label-studio-wrapper.js +304 -0
  37. package/dist-client/label-studio-wrapper.js.map +1 -0
  38. package/dist-client/route.d.ts +1 -0
  39. package/dist-client/route.js +14 -0
  40. package/dist-client/route.js.map +1 -0
  41. package/dist-client/tsconfig.tsbuildinfo +1 -0
  42. package/dist-server/controller/label-studio-role-mapper.d.ts +35 -0
  43. package/dist-server/controller/label-studio-role-mapper.js +65 -0
  44. package/dist-server/controller/label-studio-role-mapper.js.map +1 -0
  45. package/dist-server/controller/user-provisioning-service.d.ts +66 -0
  46. package/dist-server/controller/user-provisioning-service.js +264 -0
  47. package/dist-server/controller/user-provisioning-service.js.map +1 -0
  48. package/dist-server/index.d.ts +7 -0
  49. package/dist-server/index.js +19 -0
  50. package/dist-server/index.js.map +1 -0
  51. package/dist-server/route/label-studio-sso.d.ts +2 -0
  52. package/dist-server/route/label-studio-sso.js +156 -0
  53. package/dist-server/route/label-studio-sso.js.map +1 -0
  54. package/dist-server/route/webhook.d.ts +65 -0
  55. package/dist-server/route/webhook.js +248 -0
  56. package/dist-server/route/webhook.js.map +1 -0
  57. package/dist-server/route.d.ts +1 -0
  58. package/dist-server/route.js +21 -0
  59. package/dist-server/route.js.map +1 -0
  60. package/dist-server/service/ai-prediction-service.d.ts +27 -0
  61. package/dist-server/service/ai-prediction-service.js +222 -0
  62. package/dist-server/service/ai-prediction-service.js.map +1 -0
  63. package/dist-server/service/dataset-labeling-integration.d.ts +44 -0
  64. package/dist-server/service/dataset-labeling-integration.js +512 -0
  65. package/dist-server/service/dataset-labeling-integration.js.map +1 -0
  66. package/dist-server/service/external-data-source-service.d.ts +78 -0
  67. package/dist-server/service/external-data-source-service.js +415 -0
  68. package/dist-server/service/external-data-source-service.js.map +1 -0
  69. package/dist-server/service/index.d.ts +12 -0
  70. package/dist-server/service/index.js +27 -0
  71. package/dist-server/service/index.js.map +1 -0
  72. package/dist-server/service/label-studio-sso-service.d.ts +38 -0
  73. package/dist-server/service/label-studio-sso-service.js +98 -0
  74. package/dist-server/service/label-studio-sso-service.js.map +1 -0
  75. package/dist-server/service/ml/ml-backend-service.d.ts +23 -0
  76. package/dist-server/service/ml/ml-backend-service.js +153 -0
  77. package/dist-server/service/ml/ml-backend-service.js.map +1 -0
  78. package/dist-server/service/prediction/prediction-management.d.ts +32 -0
  79. package/dist-server/service/prediction/prediction-management.js +299 -0
  80. package/dist-server/service/prediction/prediction-management.js.map +1 -0
  81. package/dist-server/service/project/project-management.d.ts +36 -0
  82. package/dist-server/service/project/project-management.js +309 -0
  83. package/dist-server/service/project/project-management.js.map +1 -0
  84. package/dist-server/service/task/task-management.d.ts +42 -0
  85. package/dist-server/service/task/task-management.js +372 -0
  86. package/dist-server/service/task/task-management.js.map +1 -0
  87. package/dist-server/service/user-provisioning/user-sync-mutation.d.ts +28 -0
  88. package/dist-server/service/user-provisioning/user-sync-mutation.js +111 -0
  89. package/dist-server/service/user-provisioning/user-sync-mutation.js.map +1 -0
  90. package/dist-server/service/webhook/webhook-management.d.ts +21 -0
  91. package/dist-server/service/webhook/webhook-management.js +134 -0
  92. package/dist-server/service/webhook/webhook-management.js.map +1 -0
  93. package/dist-server/tsconfig.tsbuildinfo +1 -0
  94. package/dist-server/types/dataset-labeling-types.d.ts +71 -0
  95. package/dist-server/types/dataset-labeling-types.js +259 -0
  96. package/dist-server/types/dataset-labeling-types.js.map +1 -0
  97. package/dist-server/types/label-studio-types.d.ts +128 -0
  98. package/dist-server/types/label-studio-types.js +494 -0
  99. package/dist-server/types/label-studio-types.js.map +1 -0
  100. package/dist-server/types/prediction-types.d.ts +39 -0
  101. package/dist-server/types/prediction-types.js +121 -0
  102. package/dist-server/types/prediction-types.js.map +1 -0
  103. package/dist-server/utils/annotation-exporter.d.ts +104 -0
  104. package/dist-server/utils/annotation-exporter.js +261 -0
  105. package/dist-server/utils/annotation-exporter.js.map +1 -0
  106. package/dist-server/utils/label-config-builder.d.ts +117 -0
  107. package/dist-server/utils/label-config-builder.js +286 -0
  108. package/dist-server/utils/label-config-builder.js.map +1 -0
  109. package/dist-server/utils/label-studio-api-client.d.ts +180 -0
  110. package/dist-server/utils/label-studio-api-client.js +401 -0
  111. package/dist-server/utils/label-studio-api-client.js.map +1 -0
  112. package/dist-server/utils/media-url-extractor.d.ts +45 -0
  113. package/dist-server/utils/media-url-extractor.js +152 -0
  114. package/dist-server/utils/media-url-extractor.js.map +1 -0
  115. package/dist-server/utils/task-transformer.d.ts +108 -0
  116. package/dist-server/utils/task-transformer.js +260 -0
  117. package/dist-server/utils/task-transformer.js.map +1 -0
  118. package/package.json +47 -0
  119. package/server/SERVER_STRUCTURE.md +351 -0
  120. package/server/controller/label-studio-role-mapper.ts +76 -0
  121. package/server/controller/user-provisioning-service.ts +340 -0
  122. package/server/index.ts +19 -0
  123. package/server/route/label-studio-sso.ts +194 -0
  124. package/server/route/webhook.ts +304 -0
  125. package/server/route.ts +35 -0
  126. package/server/service/ai-prediction-service.ts +239 -0
  127. package/server/service/dataset-labeling-integration.ts +590 -0
  128. package/server/service/external-data-source-service.ts +438 -0
  129. package/server/service/index.ts +24 -0
  130. package/server/service/label-studio-sso-service.ts +108 -0
  131. package/server/service/labeling-scenario-service.ts.deprecated +566 -0
  132. package/server/service/ml/ml-backend-service.ts +127 -0
  133. package/server/service/prediction/prediction-management.ts +281 -0
  134. package/server/service/project/project-management.ts +284 -0
  135. package/server/service/task/task-management.ts +363 -0
  136. package/server/service/user-provisioning/user-sync-mutation.ts +80 -0
  137. package/server/service/webhook/webhook-management.ts +109 -0
  138. package/server/tsconfig.json +11 -0
  139. package/server/types/dataset-labeling-types.ts +181 -0
  140. package/server/types/global.d.ts +23 -0
  141. package/server/types/label-studio-types.ts +346 -0
  142. package/server/types/prediction-types.ts +86 -0
  143. package/server/types/scenario-types.ts.deprecated +362 -0
  144. package/server/utils/annotation-exporter.ts +340 -0
  145. package/server/utils/label-config-builder.ts +340 -0
  146. package/server/utils/label-studio-api-client.ts +487 -0
  147. package/server/utils/media-url-extractor.ts +193 -0
  148. package/server/utils/task-transformer.ts +342 -0
  149. package/test-ai-prediction.js +268 -0
  150. package/test-dataset-integration.js +449 -0
  151. package/test-simple.js +89 -0
  152. package/things-factory.config.js +12 -0
@@ -0,0 +1,469 @@
1
+ # Label Studio Integration - 구현 가이드
2
+
3
+ ## 개요
4
+
5
+ Things-Factory와 Label Studio의 완전한 통합을 위한 구현이 완료되었습니다.
6
+
7
+ ## 구현된 기능
8
+
9
+ ### ✅ Phase 1: 프로젝트 및 태스크 관리
10
+
11
+ #### 1. 프로젝트 관리 GraphQL API
12
+
13
+ **Query:**
14
+ ```graphql
15
+ # 프로젝트 목록 조회
16
+ query {
17
+ labelStudioProjects {
18
+ id
19
+ title
20
+ description
21
+ taskCount
22
+ completedTaskCount
23
+ completionRate
24
+ createdAt
25
+ updatedAt
26
+ }
27
+ }
28
+
29
+ # 단일 프로젝트 조회
30
+ query {
31
+ labelStudioProject(projectId: 1) {
32
+ id
33
+ title
34
+ labelConfig
35
+ }
36
+ }
37
+
38
+ # 프로젝트 통계
39
+ query {
40
+ labelStudioProjectMetrics(projectId: 1) {
41
+ totalTasks
42
+ completedTasks
43
+ completionRate
44
+ annotatorStats {
45
+ email
46
+ annotationCount
47
+ avgTime
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ **Mutation:**
54
+ ```graphql
55
+ # 프로젝트 생성
56
+ mutation {
57
+ createLabelStudioProject(input: {
58
+ title: "New Project"
59
+ description: "Project description"
60
+ labelConfig: "<View>...</View>"
61
+ }) {
62
+ id
63
+ title
64
+ }
65
+ }
66
+
67
+ # 프로젝트 삭제
68
+ mutation {
69
+ deleteLabelStudioProject(projectId: 1)
70
+ }
71
+ ```
72
+
73
+ #### 2. 태스크 관리 GraphQL API
74
+
75
+ **Query:**
76
+ ```graphql
77
+ # 태스크 목록
78
+ query {
79
+ labelStudioTasks(projectId: 1, page: 1, pageSize: 100) {
80
+ id
81
+ data
82
+ annotationCount
83
+ isCompleted
84
+ }
85
+ }
86
+
87
+ # 어노테이션 조회
88
+ query {
89
+ labelStudioTaskAnnotations(taskId: 1) {
90
+ id
91
+ result
92
+ completedBy
93
+ leadTime
94
+ }
95
+ }
96
+ ```
97
+
98
+ **Mutation:**
99
+ ```graphql
100
+ # 태스크 임포트
101
+ mutation {
102
+ importTasksToLabelStudio(
103
+ projectId: 1
104
+ tasks: [
105
+ { data: "{\"text\": \"Sample text\"}" }
106
+ ]
107
+ ) {
108
+ imported
109
+ failed
110
+ taskIds
111
+ }
112
+ }
113
+
114
+ # 어노테이션 익스포트
115
+ mutation {
116
+ exportLabelStudioAnnotations(projectId: 1, format: "JSON") {
117
+ exportPath
118
+ annotationCount
119
+ format
120
+ }
121
+ }
122
+
123
+ # 어노테이션 동기화
124
+ mutation {
125
+ syncAnnotationsToDatabase(projectId: 1)
126
+ }
127
+ ```
128
+
129
+ ### ✅ Phase 2: 웹훅 및 실시간 동기화
130
+
131
+ #### 3. 웹훅 관리
132
+
133
+ **GraphQL API:**
134
+ ```graphql
135
+ # 웹훅 등록
136
+ mutation {
137
+ registerLabelStudioWebhook(projectId: 1) {
138
+ id
139
+ url
140
+ isActive
141
+ }
142
+ }
143
+
144
+ # 웹훅 조회
145
+ query {
146
+ labelStudioWebhooks(projectId: 1) {
147
+ id
148
+ url
149
+ isActive
150
+ }
151
+ }
152
+
153
+ # 웹훅 삭제
154
+ mutation {
155
+ deleteLabelStudioWebhook(webhookId: 1)
156
+ }
157
+ ```
158
+
159
+ **REST API 엔드포인트:**
160
+ ```bash
161
+ # 웹훅 수신 (Label Studio → Things-Factory)
162
+ POST /label-studio/webhook
163
+
164
+ # 웹훅 등록 (Things-Factory → Label Studio)
165
+ POST /label-studio/webhook/register
166
+ {
167
+ "projectId": 1
168
+ }
169
+
170
+ # 웹훅 조회
171
+ GET /label-studio/webhook/:projectId
172
+ ```
173
+
174
+ **지원하는 이벤트:**
175
+ - `ANNOTATION_CREATED` - 어노테이션 생성
176
+ - `ANNOTATION_UPDATED` - 어노테이션 수정
177
+ - `ANNOTATION_DELETED` - 어노테이션 삭제
178
+ - `TASK_CREATED` - 태스크 생성
179
+ - `PROJECT_UPDATED` - 프로젝트 업데이트
180
+
181
+ ### ✅ Phase 3: ML Backend 연동
182
+
183
+ #### 4. ML Backend 관리
184
+
185
+ **GraphQL API:**
186
+ ```graphql
187
+ # ML Backend 조회
188
+ query {
189
+ labelStudioMLBackends(projectId: 1) {
190
+ id
191
+ url
192
+ title
193
+ isInteractive
194
+ modelVersion
195
+ }
196
+ }
197
+
198
+ # ML Backend 추가
199
+ mutation {
200
+ addMLBackendToProject(
201
+ projectId: 1
202
+ input: {
203
+ url: "http://ml-backend:9090"
204
+ title: "Auto-labeling Model"
205
+ isInteractive: true
206
+ }
207
+ ) {
208
+ id
209
+ url
210
+ }
211
+ }
212
+
213
+ # 예측 실행
214
+ mutation {
215
+ triggerLabelStudioPredictions(
216
+ projectId: 1
217
+ taskIds: [1, 2, 3]
218
+ )
219
+ }
220
+
221
+ # 모델 학습
222
+ mutation {
223
+ trainLabelStudioModel(mlBackendId: 1)
224
+ }
225
+ ```
226
+
227
+ ### ✅ Phase 4: 클라이언트 UI 컴포넌트
228
+
229
+ #### 5. UI 컴포넌트
230
+
231
+ **프로젝트 목록 컴포넌트:**
232
+ ```html
233
+ <label-studio-project-list></label-studio-project-list>
234
+ ```
235
+
236
+ **기능:**
237
+ - 프로젝트 카드 그리드 뷰
238
+ - 프로젝트 통계 표시 (완료율, 태스크 수)
239
+ - 프로젝트 생성 버튼
240
+ - 프로젝트 클릭 → Label Studio 오픈
241
+
242
+ ## 아키텍처
243
+
244
+ ```
245
+ ┌─────────────────────────────────────────────────────────────┐
246
+ │ Things-Factory │
247
+ │ │
248
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
249
+ │ │ GraphQL │ │ Webhook │ │ UI Components │ │
250
+ │ │ Resolvers │ │ Handler │ │ │ │
251
+ │ └──────┬───────┘ └──────┬───────┘ └────────┬─────────┘ │
252
+ │ │ │ │ │
253
+ │ └─────────────────┴───────────────────┘ │
254
+ │ │ │
255
+ │ ┌────────▼────────┐ │
256
+ │ │ API Client │ │
257
+ │ └────────┬────────┘ │
258
+ └───────────────────────────┼─────────────────────────────────┘
259
+
260
+ ┌────────▼────────┐
261
+ │ Label Studio │
262
+ │ REST API │
263
+ └─────────────────┘
264
+ ```
265
+
266
+ ## 사용 방법
267
+
268
+ ### 1. 환경 설정
269
+
270
+ **config/label-studio.config.js:**
271
+ ```javascript
272
+ module.exports = {
273
+ labelStudio: {
274
+ serverUrl: process.env.LABEL_STUDIO_URL,
275
+ apiToken: process.env.LABEL_STUDIO_API_TOKEN
276
+ }
277
+ }
278
+ ```
279
+
280
+ **.env:**
281
+ ```bash
282
+ LABEL_STUDIO_URL=https://label-studio.example.com
283
+ LABEL_STUDIO_API_TOKEN=your-api-token
284
+ SERVER_URL=https://things-factory.example.com
285
+ ```
286
+
287
+ ### 2. 프로젝트 생성 워크플로우
288
+
289
+ ```graphql
290
+ # 1. 프로젝트 생성
291
+ mutation {
292
+ createLabelStudioProject(input: {
293
+ title: "Image Classification"
294
+ labelConfig: """
295
+ <View>
296
+ <Image name="image" value="$image"/>
297
+ <Choices name="choice" toName="image">
298
+ <Choice value="Cat"/>
299
+ <Choice value="Dog"/>
300
+ </Choices>
301
+ </View>
302
+ """
303
+ }) {
304
+ id
305
+ }
306
+ }
307
+
308
+ # 2. 태스크 임포트
309
+ mutation {
310
+ importTasksToLabelStudio(
311
+ projectId: 1
312
+ tasks: [
313
+ { data: "{\"image\": \"https://example.com/cat.jpg\"}" }
314
+ ]
315
+ ) {
316
+ imported
317
+ }
318
+ }
319
+
320
+ # 3. 웹훅 등록 (실시간 업데이트)
321
+ mutation {
322
+ registerLabelStudioWebhook(projectId: 1) {
323
+ id
324
+ }
325
+ }
326
+
327
+ # 4. ML Backend 추가 (선택사항)
328
+ mutation {
329
+ addMLBackendToProject(
330
+ projectId: 1
331
+ input: {
332
+ url: "http://ml-backend:9090"
333
+ title: "Image Classifier"
334
+ }
335
+ ) {
336
+ id
337
+ }
338
+ }
339
+ ```
340
+
341
+ ### 3. 어노테이션 수집 워크플로우
342
+
343
+ ```graphql
344
+ # 1. 어노테이션 조회
345
+ query {
346
+ labelStudioTaskAnnotations(taskId: 1) {
347
+ id
348
+ result
349
+ completedBy
350
+ }
351
+ }
352
+
353
+ # 2. 익스포트
354
+ mutation {
355
+ exportLabelStudioAnnotations(projectId: 1, format: "JSON") {
356
+ exportPath
357
+ annotationCount
358
+ }
359
+ }
360
+
361
+ # 3. Things-Factory DB에 저장
362
+ mutation {
363
+ syncAnnotationsToDatabase(projectId: 1)
364
+ }
365
+ ```
366
+
367
+ ## 확장 포인트
368
+
369
+ ### 1. 커스텀 웹훅 핸들러
370
+
371
+ `server/route/webhook.ts`에서 핸들러 커스터마이징:
372
+
373
+ ```typescript
374
+ async function handleAnnotationCreated(payload: WebhookPayload) {
375
+ // 1. Things-Factory DB에 저장
376
+ // 2. 비즈니스 로직 실행
377
+ // 3. 알림 발송
378
+ // 4. 외부 시스템 연동
379
+ }
380
+ ```
381
+
382
+ ### 2. 데이터 소스 연동
383
+
384
+ Things-Factory 데이터를 Label Studio로 자동 임포트:
385
+
386
+ ```typescript
387
+ // server/service/storage/storage-sync.ts
388
+ @Mutation()
389
+ async syncBizplaceDataToLabelStudio(
390
+ @Arg('bizplaceId') bizplaceId: string,
391
+ @Arg('projectId') projectId: number
392
+ ) {
393
+ // Bizplace 데이터 조회
394
+ // Label Studio 태스크로 변환
395
+ // 자동 임포트
396
+ }
397
+ ```
398
+
399
+ ### 3. 어노테이션 결과 활용
400
+
401
+ ```typescript
402
+ // server/service/annotation/annotation-processor.ts
403
+ @Mutation()
404
+ async processAnnotationResults(
405
+ @Arg('projectId') projectId: number
406
+ ) {
407
+ // 어노테이션 익스포트
408
+ // 결과 분석
409
+ // Things-Factory 엔티티 업데이트
410
+ }
411
+ ```
412
+
413
+ ## 테스트
414
+
415
+ ### GraphQL Playground에서 테스트
416
+
417
+ ```bash
418
+ # Things-Factory 실행
419
+ yarn workspace @things-factory/operato-mms run serve:dev
420
+
421
+ # GraphQL Playground 접속
422
+ http://localhost:3000/graphql
423
+ ```
424
+
425
+ ### 웹훅 테스트
426
+
427
+ ```bash
428
+ # Webhook 엔드포인트 테스트
429
+ curl -X POST http://localhost:3000/label-studio/webhook \
430
+ -H "Content-Type: application/json" \
431
+ -d '{
432
+ "action": "ANNOTATION_CREATED",
433
+ "project": {"id": 1, "title": "Test"},
434
+ "annotation": {
435
+ "id": 1,
436
+ "result": [...]
437
+ }
438
+ }'
439
+ ```
440
+
441
+ ## 다음 단계
442
+
443
+ ### 추가 개발 항목
444
+
445
+ 1. **실시간 대시보드**
446
+ - 프로젝트별 진행률 실시간 표시
447
+ - 사용자별 생산성 차트
448
+ - 어노테이션 품질 메트릭
449
+
450
+ 2. **데이터 소스 자동 연동**
451
+ - Things-Factory Storage → Label Studio
452
+ - 파일 업로드 자동 감지
453
+ - 태스크 자동 생성
454
+
455
+ 3. **어노테이션 검증**
456
+ - Inter-annotator agreement 계산
457
+ - 품질 관리 워크플로우
458
+ - 자동 리뷰 시스템
459
+
460
+ 4. **Advanced ML 통합**
461
+ - Active Learning 구현
462
+ - 모델 성능 모니터링
463
+ - A/B 테스트 지원
464
+
465
+ ## 참고 자료
466
+
467
+ - [Label Studio API Documentation](https://labelstud.io/api)
468
+ - [Things-Factory Module Development Guide](../../CLAUDE.md)
469
+ - [Integration Examples](./docs/examples/)