synapse-sdk 2025.9.1__py3-none-any.whl → 2025.9.4__py3-none-any.whl

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.

Potentially problematic release.


This version of synapse-sdk might be problematic. Click here for more details.

Files changed (81) hide show
  1. synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +378 -0
  2. synapse_sdk/devtools/docs/docs/api/clients/backend.md +368 -1
  3. synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +477 -0
  4. synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +422 -0
  5. synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +554 -0
  6. synapse_sdk/devtools/docs/docs/api/clients/index.md +391 -0
  7. synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +571 -0
  8. synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +578 -0
  9. synapse_sdk/devtools/docs/docs/plugins/developing-upload-template.md +1463 -0
  10. synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +161 -34
  11. synapse_sdk/devtools/docs/docs/plugins/upload-plugins.md +1497 -213
  12. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +289 -0
  13. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +378 -11
  14. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +417 -0
  15. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +356 -0
  16. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +192 -0
  17. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +391 -0
  18. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +479 -0
  19. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +284 -0
  20. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/developing-upload-template.md +1463 -0
  21. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +161 -34
  22. synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/upload-plugins.md +1752 -572
  23. synapse_sdk/devtools/docs/sidebars.ts +7 -0
  24. synapse_sdk/plugins/README.md +1 -2
  25. synapse_sdk/plugins/categories/base.py +7 -0
  26. synapse_sdk/plugins/categories/export/actions/__init__.py +3 -0
  27. synapse_sdk/plugins/categories/export/actions/export/__init__.py +28 -0
  28. synapse_sdk/plugins/categories/export/actions/export/action.py +160 -0
  29. synapse_sdk/plugins/categories/export/actions/export/enums.py +113 -0
  30. synapse_sdk/plugins/categories/export/actions/export/exceptions.py +53 -0
  31. synapse_sdk/plugins/categories/export/actions/export/models.py +74 -0
  32. synapse_sdk/plugins/categories/export/actions/export/run.py +195 -0
  33. synapse_sdk/plugins/categories/export/actions/export/utils.py +187 -0
  34. synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +1 -1
  35. synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +1 -2
  36. synapse_sdk/plugins/categories/upload/actions/upload/action.py +154 -531
  37. synapse_sdk/plugins/categories/upload/actions/upload/context.py +185 -0
  38. synapse_sdk/plugins/categories/upload/actions/upload/factory.py +143 -0
  39. synapse_sdk/plugins/categories/upload/actions/upload/models.py +66 -29
  40. synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +182 -0
  41. synapse_sdk/plugins/categories/upload/actions/upload/registry.py +113 -0
  42. synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +1 -0
  43. synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +106 -0
  44. synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +62 -0
  45. synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +62 -0
  46. synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +80 -0
  47. synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +66 -0
  48. synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +101 -0
  49. synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +89 -0
  50. synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +96 -0
  51. synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +61 -0
  52. synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +1 -0
  53. synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +86 -0
  54. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +1 -0
  55. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +39 -0
  56. synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +34 -0
  57. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +1 -0
  58. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +233 -0
  59. synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +253 -0
  60. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +1 -0
  61. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +174 -0
  62. synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +16 -0
  63. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +1 -0
  64. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/async_upload.py +109 -0
  65. synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +43 -0
  66. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +1 -0
  67. synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +45 -0
  68. synapse_sdk/plugins/categories/upload/actions/upload/utils.py +194 -83
  69. synapse_sdk/plugins/categories/upload/templates/config.yaml +4 -0
  70. synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +269 -0
  71. synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +71 -27
  72. synapse_sdk/plugins/models.py +7 -0
  73. synapse_sdk/shared/__init__.py +21 -0
  74. {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/METADATA +2 -1
  75. {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/RECORD +79 -28
  76. synapse_sdk/plugins/categories/export/actions/export.py +0 -385
  77. synapse_sdk/plugins/categories/export/enums.py +0 -7
  78. {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/WHEEL +0 -0
  79. {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/entry_points.txt +0 -0
  80. {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/licenses/LICENSE +0 -0
  81. {synapse_sdk-2025.9.1.dist-info → synapse_sdk-2025.9.4.dist-info}/top_level.txt +0 -0
@@ -47,43 +47,43 @@ classDiagram
47
47
  +export_items: Generator
48
48
  +path_root: Path
49
49
  +params: dict
50
-
50
+
51
51
  %% Main workflow methods
52
52
  +export(export_items, results, **kwargs) dict
53
53
  +process_data_conversion(export_item) object
54
54
  +process_file_saving(...) bool
55
55
  +setup_output_directories(path, flag) dict
56
-
56
+
57
57
  %% Abstract methods (to be implemented)
58
58
  +convert_data(data)* object
59
- +before_convert(data)* object
59
+ +before_convert(data)* object
60
60
  +after_convert(data)* object
61
-
61
+
62
62
  %% File operations
63
63
  +save_original_file(result, path, errors) ExportStatus
64
64
  +save_as_json(result, path, errors) ExportStatus
65
65
  +get_original_file_name(files) str
66
-
66
+
67
67
  %% Helper methods
68
68
  -_create_unique_export_path(name) Path
69
69
  -_save_error_list(path, json_errors, file_errors)
70
70
  -_process_original_file_saving(...) bool
71
71
  -_process_json_file_saving(...) bool
72
72
  }
73
-
73
+
74
74
  class Exporter {
75
75
  %% Inherited from BaseExporter
76
76
  +export(export_items, results, **kwargs) dict
77
-
77
+
78
78
  %% Implemented abstract methods
79
79
  +convert_data(data) object
80
80
  +before_convert(data) object
81
81
  +after_convert(data) object
82
82
  }
83
-
83
+
84
84
  %% Inheritance relationship
85
85
  BaseExporter <|-- Exporter
86
-
86
+
87
87
  %% Apply styles
88
88
  class BaseExporter baseClass
89
89
  class Exporter childClass
@@ -99,44 +99,44 @@ flowchart TD
99
99
  A[export 메서드 호출] --> B[경로와 메트릭 초기화]
100
100
  B --> C[출력 디렉토리 설정]
101
101
  C --> D[export_items 순환]
102
-
102
+
103
103
  %% Data processing pipeline
104
104
  D --> E[process_data_conversion]
105
105
  E --> F[before_convert]
106
106
  F --> G[convert_data]
107
107
  G --> H[after_convert]
108
-
108
+
109
109
  %% File saving pipeline
110
110
  H --> I[process_file_saving]
111
111
  I --> J{원본 파일 저장?}
112
112
  J -->|예| K[_process_original_file_saving]
113
113
  J -->|아니오| L[_process_json_file_saving]
114
114
  K --> L
115
-
115
+
116
116
  %% Continue or finish
117
117
  L --> M{더 많은 항목?}
118
118
  M -->|예| D
119
119
  M -->|아니오| N[오류 목록 저장]
120
120
  N --> O[내보내기 경로 반환]
121
-
121
+
122
122
  %% Error handling
123
123
  K --> P{원본 파일 실패?}
124
124
  P -->|예| Q[다음 항목으로 건너뛰기]
125
125
  P -->|아니오| L
126
-
126
+
127
127
  L --> R{JSON 파일 실패?}
128
128
  R -->|예| Q
129
129
  R -->|아니오| S[메트릭 업데이트]
130
130
  S --> M
131
131
  Q --> M
132
-
132
+
133
133
  %% Styling for light/dark compatibility
134
134
  classDef startEnd fill:#e1f5fe,stroke:#01579b,color:#000
135
135
  classDef process fill:#f3e5f5,stroke:#4a148c,color:#000
136
136
  classDef decision fill:#fff3e0,stroke:#e65100,color:#000
137
137
  classDef data fill:#e8f5e8,stroke:#2e7d32,color:#000
138
138
  classDef error fill:#ffebee,stroke:#c62828,color:#000
139
-
139
+
140
140
  class A,O startEnd
141
141
  class B,C,E,F,G,H,I,K,L,N,S process
142
142
  class J,M,P,R decision
@@ -147,18 +147,21 @@ flowchart TD
147
147
  ### 주요 관계 및 책임
148
148
 
149
149
  **BaseExporter (추상 기본 클래스)**
150
+
150
151
  - **핵심 기능**: 완전한 내보내기 워크플로우 인프라 제공
151
152
  - **템플릿 메서드**: `export()` 메서드가 전체 프로세스 조율
152
153
  - **훅 메서드**: 커스터마이징을 위한 `convert_data()`, `before_convert()`, `after_convert()`
153
154
  - **유틸리티**: 파일 작업, 디렉토리 설정, 오류 처리, 진행률 추적
154
155
 
155
- **Exporter (구체적 구현)**
156
+ **Exporter (구체적 구현)**
157
+
156
158
  - **상속**: `BaseExporter` 확장
157
159
  - **최소 구현**: 추상 메서드들의 기본 구현 제공
158
160
  - **위임 동작**: 대부분의 메서드가 부모 클래스에 위임
159
161
  - **커스터마이징 지점**: 특정 로직을 위해 변환 메서드 오버라이드
160
162
 
161
163
  ### 메서드 카테고리
164
+
162
165
  - **🔵 핵심 워크플로우**: 주요 내보내기 조율 메서드
163
166
  - **🟢 템플릿/훅**: 서브클래스에서 오버라이드하도록 설계된 메서드
164
167
  - **🟡 파일 작업**: 구체적인 파일 저장 및 처리 메서드
@@ -240,11 +243,11 @@ class Exporter(BaseExporter):
240
243
  ```python
241
244
  def additional_file_saving(self, unique_export_path):
242
245
  """모든 export 항목 처리 후 추가 파일 저장.
243
-
246
+
244
247
  이 메서드는 주 export 루프가 완료된 후 호출되며, 모든 처리된 export 항목의
245
- 집합적 데이터를 기반으로 생성되어야 하는 파일들(예: 메타데이터 파일,
248
+ 집합적 데이터를 기반으로 생성되어야 하는 파일들(예: 메타데이터 파일,
246
249
  설정 파일, 요약 파일 등)을 저장하기 위한 것입니다.
247
-
250
+
248
251
  Args:
249
252
  unique_export_path (str): 추가 파일이 저장될 고유한 export 디렉토리 경로.
250
253
  """
@@ -263,7 +266,7 @@ class YOLOExporter(BaseExporter):
263
266
  'total_annotations': 0,
264
267
  'class_distribution': {}
265
268
  }
266
-
269
+
267
270
  def convert_data(self, data):
268
271
  # 변환 중 클래스와 통계 추적
269
272
  for annotation in data.get('annotations', []):
@@ -271,24 +274,24 @@ class YOLOExporter(BaseExporter):
271
274
  self.class_names.add(class_name)
272
275
  self.dataset_stats['class_distribution'][class_name] = \
273
276
  self.dataset_stats['class_distribution'].get(class_name, 0) + 1
274
-
277
+
275
278
  self.dataset_stats['total_images'] += 1
276
279
  self.dataset_stats['total_annotations'] += len(data.get('annotations', []))
277
-
280
+
278
281
  return data # ... 나머지 변환 로직
279
-
282
+
280
283
  def additional_file_saving(self, unique_export_path):
281
284
  """YOLO 설정 및 메타데이터 파일 저장."""
282
285
  data_dir = Path(unique_export_path) / 'data'
283
286
  data_dir.mkdir(exist_ok=True)
284
-
287
+
285
288
  # 1. classes.txt 파일 저장
286
289
  classes_file = data_dir / 'classes.txt'
287
290
  with classes_file.open('w') as f:
288
291
  for class_name in sorted(self.class_names):
289
292
  f.write(f"{class_name}\n")
290
293
  self.run.log_message(f"클래스 파일 저장: {classes_file}")
291
-
294
+
292
295
  # 2. dataset.yaml 파일 저장
293
296
  dataset_config = {
294
297
  'path': str(unique_export_path),
@@ -296,12 +299,12 @@ class YOLOExporter(BaseExporter):
296
299
  'val': 'images',
297
300
  'names': {i: name for i, name in enumerate(sorted(self.class_names))}
298
301
  }
299
-
302
+
300
303
  dataset_file = data_dir / 'dataset.yaml'
301
304
  with dataset_file.open('w') as f:
302
305
  yaml.dump(dataset_config, f, default_flow_style=False)
303
306
  self.run.log_message(f"데이터셋 설정 저장: {dataset_file}")
304
-
307
+
305
308
  # 3. export 통계 저장
306
309
  stats_file = data_dir / 'export_stats.json'
307
310
  with stats_file.open('w') as f:
@@ -312,6 +315,7 @@ class YOLOExporter(BaseExporter):
312
315
  ### 일반적인 사용 사례
313
316
 
314
317
  #### 1. 데이터셋 설정 파일
318
+
315
319
  ```python
316
320
  def additional_file_saving(self, unique_export_path):
317
321
  # 훈련 프레임워크용 데이터셋 설정 생성
@@ -321,13 +325,14 @@ def additional_file_saving(self, unique_export_path):
321
325
  'total_samples': len(self.processed_items),
322
326
  'classes': list(self.class_mapping.keys())
323
327
  }
324
-
328
+
325
329
  config_file = Path(unique_export_path) / 'dataset_config.json'
326
330
  with config_file.open('w') as f:
327
331
  json.dump(config, f, indent=2)
328
332
  ```
329
333
 
330
334
  #### 2. Export 요약 보고서
335
+
331
336
  ```python
332
337
  def additional_file_saving(self, unique_export_path):
333
338
  # export 요약 생성
@@ -340,13 +345,14 @@ def additional_file_saving(self, unique_export_path):
340
345
  'statistics': self.get_export_statistics(),
341
346
  'errors': self.get_error_summary()
342
347
  }
343
-
348
+
344
349
  summary_file = Path(unique_export_path) / 'export_summary.json'
345
350
  with summary_file.open('w') as f:
346
351
  json.dump(summary, f, indent=2)
347
352
  ```
348
353
 
349
354
  #### 3. 인덱스 및 매니페스트 파일
355
+
350
356
  ```python
351
357
  def additional_file_saving(self, unique_export_path):
352
358
  # 처리된 항목들에 대한 파일 인덱스 생성
@@ -357,7 +363,7 @@ def additional_file_saving(self, unique_export_path):
357
363
  'json_file': f"{item['stem']}.json",
358
364
  'processed_at': item['timestamp']
359
365
  })
360
-
366
+
361
367
  index_file = Path(unique_export_path) / 'file_index.json'
362
368
  with index_file.open('w') as f:
363
369
  json.dump(file_index, f, indent=2)
@@ -540,6 +546,127 @@ my_plugin/
540
546
  └── manifest.yaml # 플러그인 메타데이터
541
547
  ```
542
548
 
549
+ ## Export 액션 아키텍처
550
+
551
+ 데이터 내보내기 처리의 다양한 측면을 위한 특화된 구성 요소를 갖춘 모듈화된 아키텍처로 export 시스템이 리팩터링되었습니다:
552
+
553
+ ```mermaid
554
+ classDiagram
555
+ %% Light/Dark mode compatible colors with semi-transparency
556
+ classDef baseClass fill:#e1f5fe80,stroke:#0288d1,stroke-width:2px
557
+ classDef childClass fill:#c8e6c980,stroke:#388e3c,stroke-width:2px
558
+ classDef modelClass fill:#fff9c480,stroke:#f57c00,stroke-width:2px
559
+ classDef utilClass fill:#f5f5f580,stroke:#616161,stroke-width:2px
560
+ classDef enumClass fill:#ffccbc80,stroke:#d32f2f,stroke-width:2px
561
+
562
+ class ExportAction {
563
+ +name: str = "export"
564
+ +category: PluginCategory.EXPORT
565
+ +method: RunMethod.JOB
566
+ +run_class: ExportRun
567
+ +params_model: ExportParams
568
+ +progress_categories: dict
569
+ +metrics_categories: dict
570
+
571
+ +start() dict
572
+ +get_exporter(...) object
573
+ +_get_export_items(target, filter) Generator
574
+ +_create_target_handler(target) object
575
+ }
576
+
577
+ class ExportRun {
578
+ +log_message_with_code(code, args, level) None
579
+ +log_export_event(code, args, level) None
580
+ +export_log_json_file(id, file_info, status) None
581
+ +export_log_original_file(id, file_info, status) None
582
+ +ExportEventLog: BaseModel
583
+ +DataFileLog: BaseModel
584
+ +MetricsRecord: BaseModel
585
+ }
586
+
587
+ class ExportParams {
588
+ +name: str
589
+ +storage: int
590
+ +target: Literal["assignment", "ground_truth", "task"]
591
+ +filter: dict
592
+ +path: str
593
+ +save_original_file: bool = True
594
+ +extra_params: dict = {}
595
+
596
+ +check_storage_exists(value) str
597
+ +validate_target_filter(cls, values) dict
598
+ }
599
+
600
+ class LogCode {
601
+ +EXPORT_STARTED: str
602
+ +ITEMS_DISCOVERED: str
603
+ +CONVERSION_STARTED: str
604
+ +CONVERSION_COMPLETED: str
605
+ +FILE_SAVED: str
606
+ +EXPORT_COMPLETED: str
607
+ +EXPORT_FAILED: str
608
+ }
609
+
610
+ class ExportStatus {
611
+ +SUCCESS: str = "success"
612
+ +FAILED: str = "failed"
613
+ +SKIPPED: str = "skipped"
614
+ }
615
+
616
+ class ExportError {
617
+ +message: str
618
+ +code: str
619
+ }
620
+
621
+ class ExportValidationError {
622
+ +message: str
623
+ +field: str
624
+ }
625
+
626
+ class ExportTargetError {
627
+ +message: str
628
+ +target: str
629
+ }
630
+
631
+ %% Relationships
632
+ ExportAction --> ExportRun : uses
633
+ ExportAction --> ExportParams : validates with
634
+ ExportRun --> LogCode : logs with
635
+ ExportRun --> ExportStatus : tracks status
636
+ ExportAction --> ExportError : may raise
637
+ ExportAction --> ExportValidationError : may raise
638
+ ExportAction --> ExportTargetError : may raise
639
+
640
+ %% Apply styles
641
+ class ExportAction baseClass
642
+ class ExportRun childClass
643
+ class ExportParams modelClass
644
+ class LogCode,ExportStatus enumClass
645
+ class ExportError,ExportValidationError,ExportTargetError utilClass
646
+ ```
647
+
648
+ ### 모듈화된 구조
649
+
650
+ Export 액션은 깔끔한 모듈화된 구성을 따릅니다:
651
+
652
+ ```
653
+ synapse_sdk/plugins/categories/export/actions/export/
654
+ ├── __init__.py # 깔끔한 모듈 인터페이스
655
+ ├── action.py # ExportAction 클래스
656
+ ├── enums.py # ExportStatus, LogCode + LOG_MESSAGES
657
+ ├── exceptions.py # Export 특화 예외
658
+ ├── models.py # ExportParams 모델
659
+ ├── run.py # ExportRun 클래스
660
+ └── utils.py # 대상 핸들러 및 유틸리티
661
+ ```
662
+
663
+ **주요 장점:**
664
+
665
+ - **향상된 유지보수성**: 작고 집중된 파일로 이해하고 수정하기 쉬움
666
+ - **코드 일관성**: Export 액션이 이제 upload 액션과 동일한 패턴을 따름
667
+ - **더 나은 구성**: 관련 기능이 논리적으로 그룹화됨
668
+ - **향상된 가독성**: 모듈 전반에 걸친 명확한 관심사 분리
669
+
543
670
  ## Export 플러그인 생성
544
671
 
545
672
  Export 플러그인은 더 나은 구성과 재사용성을 위해 BaseExporter 클래스 기반 접근 방식을 사용합니다. 커스텀 export 플러그인을 생성하는 방법은 다음과 같습니다:
@@ -557,7 +684,7 @@ synapse plugin create
557
684
  `ExportParams` 모델이 필요한 매개변수를 정의합니다:
558
685
 
559
686
  ```python
560
- from synapse_sdk.plugins.categories.export.actions.export import ExportParams
687
+ from synapse_sdk.plugins.categories.export.actions.export.models import ExportParams
561
688
  from pydantic import BaseModel
562
689
  from typing import Literal
563
690
 
@@ -664,7 +791,7 @@ BaseExporter 메서드를 오버라이드하여 파일 저장 및 구성을 커
664
791
  ```python
665
792
  import json
666
793
  from pathlib import Path
667
- from synapse_sdk.plugins.categories.export.enums import ExportStatus
794
+ from synapse_sdk.plugins.categories.export.actions.export.enums import ExportStatus
668
795
 
669
796
  class Exporter(BaseExporter):
670
797
  """다중 형식 지원을 포함한 커스텀 export 플러그인."""
@@ -923,4 +1050,4 @@ A: `process_file_saving()` 메서드를 오버라이드하여 여러 형식으
923
1050
  A: `convert_data()`에서 한 번에 모든 데이터를 로드하지 말고, 스트리밍 방식으로 처리하는 것을 고려해보세요.
924
1051
 
925
1052
  **Q: 진행률이 올바르게 표시되지 않는다면?**
926
- A: `self.run.set_progress()`를 적절한 간격으로 호출하고 있는지 확인하세요. 0-100 사이의 정수 값을 사용해야 합니다.
1053
+ A: `self.run.set_progress()`를 적절한 간격으로 호출하고 있는지 확인하세요. 0-100 사이의 정수 값을 사용해야 합니다.