synapse-sdk 2025.10.5__py3-none-any.whl → 2025.10.6__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.
- synapse_sdk/clients/base.py +129 -9
- synapse_sdk/devtools/docs/docs/api/clients/base.md +230 -8
- synapse_sdk/devtools/docs/docs/plugins/categories/neural-net-plugins/train-action-overview.md +663 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +230 -8
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/neural-net-plugins/train-action-overview.md +621 -0
- synapse_sdk/devtools/docs/sidebars.ts +11 -0
- synapse_sdk/plugins/categories/neural_net/actions/train.py +592 -22
- synapse_sdk/plugins/categories/neural_net/actions/tune.py +150 -3
- synapse_sdk/plugins/categories/upload/templates/README.md +61 -32
- synapse_sdk/utils/file/download.py +261 -0
- {synapse_sdk-2025.10.5.dist-info → synapse_sdk-2025.10.6.dist-info}/METADATA +1 -1
- {synapse_sdk-2025.10.5.dist-info → synapse_sdk-2025.10.6.dist-info}/RECORD +16 -14
- {synapse_sdk-2025.10.5.dist-info → synapse_sdk-2025.10.6.dist-info}/WHEEL +0 -0
- {synapse_sdk-2025.10.5.dist-info → synapse_sdk-2025.10.6.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-2025.10.5.dist-info → synapse_sdk-2025.10.6.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-2025.10.5.dist-info → synapse_sdk-2025.10.6.dist-info}/top_level.txt +0 -0
synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md
CHANGED
|
@@ -6,30 +6,252 @@ sidebar_position: 3
|
|
|
6
6
|
|
|
7
7
|
# BaseClient
|
|
8
8
|
|
|
9
|
-
모든 Synapse SDK 클라이언트의 기본 클래스입니다.
|
|
9
|
+
핵심 HTTP 작업 및 페이지네이션 기능을 제공하는 모든 Synapse SDK 클라이언트의 기본 클래스입니다.
|
|
10
10
|
|
|
11
11
|
## 개요
|
|
12
12
|
|
|
13
|
-
`BaseClient`는 다른 모든 클라이언트에서 사용하는 HTTP 작업, 오류
|
|
13
|
+
`BaseClient`는 다른 모든 클라이언트에서 사용하는 HTTP 작업, 오류 처리, 요청 관리 및 페이지네이션을 위한 공통 기능을 제공합니다. 자동 파일 URL 변환 기능과 함께 효율적인 페이지네이션 처리를 구현합니다.
|
|
14
14
|
|
|
15
15
|
## 기능
|
|
16
16
|
|
|
17
17
|
- 재시도 로직이 있는 HTTP 요청 처리
|
|
18
18
|
- 자동 timeout 관리
|
|
19
|
-
-
|
|
19
|
+
- 제너레이터를 사용한 효율적인 페이지네이션
|
|
20
|
+
- 파일 URL을 로컬 경로로 자동 변환
|
|
20
21
|
- Pydantic 모델 유효성 검사
|
|
21
22
|
- 연결 풀링
|
|
22
23
|
|
|
23
|
-
##
|
|
24
|
+
## 핵심 HTTP 메서드
|
|
25
|
+
|
|
26
|
+
BaseClient는 모든 클라이언트 믹스인에서 내부적으로 사용하는 저수준 HTTP 메서드를 제공합니다:
|
|
27
|
+
|
|
28
|
+
- `_get()` - 선택적 응답 모델 검증을 포함한 GET 요청
|
|
29
|
+
- `_post()` - 요청/응답 검증을 포함한 POST 요청
|
|
30
|
+
- `_put()` - 모델 검증을 포함한 PUT 요청
|
|
31
|
+
- `_patch()` - 모델 검증을 포함한 PATCH 요청
|
|
32
|
+
- `_delete()` - 모델 검증을 포함한 DELETE 요청
|
|
33
|
+
|
|
34
|
+
이러한 메서드는 일반적으로 직접 호출되지 않습니다. 대신 클라이언트 믹스인에서 제공하는 상위 수준 메서드를 사용하세요.
|
|
35
|
+
|
|
36
|
+
## 페이지네이션 메서드
|
|
37
|
+
|
|
38
|
+
### `_list(path, url_conversion=None, list_all=False, params=None, **kwargs)`
|
|
39
|
+
|
|
40
|
+
선택적 자동 페이지네이션 및 파일 URL 변환 기능을 갖춘 페이지네이션 API 엔드포인트에서 리소스를 나열합니다.
|
|
41
|
+
|
|
42
|
+
**매개변수:**
|
|
43
|
+
|
|
44
|
+
- `path` (str): 요청할 URL 경로
|
|
45
|
+
- `url_conversion` (dict, optional): 파일 URL을 로컬 경로로 변환하기 위한 설정
|
|
46
|
+
- 구조: `{'files_fields': ['field1', 'field2'], 'is_list': True}`
|
|
47
|
+
- 자동으로 파일을 다운로드하고 URL을 로컬 경로로 대체
|
|
48
|
+
- `list_all` (bool): True인 경우 제너레이터를 사용하여 모든 페이지의 모든 결과 반환
|
|
49
|
+
- `params` (dict, optional): 쿼리 매개변수 (필터, 정렬 등)
|
|
50
|
+
- `**kwargs`: 추가 요청 인자
|
|
51
|
+
|
|
52
|
+
**반환값:**
|
|
53
|
+
|
|
54
|
+
- `list_all=False`인 경우: `results`, `count`, `next`, `previous`를 포함한 딕셔너리
|
|
55
|
+
- `list_all=True`인 경우: `(generator, total_count)` 튜플
|
|
56
|
+
|
|
57
|
+
**예제:**
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
# 첫 페이지만 가져오기
|
|
61
|
+
response = client._list('api/tasks/')
|
|
62
|
+
tasks = response['results'] # 첫 페이지의 작업들
|
|
63
|
+
total = response['count'] # 전체 작업 수
|
|
64
|
+
|
|
65
|
+
# 제너레이터를 사용하여 모든 결과 가져오기 (메모리 효율적)
|
|
66
|
+
generator, total_count = client._list('api/tasks/', list_all=True)
|
|
67
|
+
all_tasks = list(generator) # 자동으로 모든 페이지 가져오기
|
|
68
|
+
|
|
69
|
+
# 필터와 함께 사용
|
|
70
|
+
params = {'status': 'pending', 'priority': 'high'}
|
|
71
|
+
response = client._list('api/tasks/', params=params)
|
|
72
|
+
|
|
73
|
+
# 파일 필드에 url_conversion 사용
|
|
74
|
+
url_conversion = {'files_fields': ['files'], 'is_list': True}
|
|
75
|
+
generator, count = client._list(
|
|
76
|
+
'api/data_units/',
|
|
77
|
+
url_conversion=url_conversion,
|
|
78
|
+
list_all=True,
|
|
79
|
+
params={'status': 'active'}
|
|
80
|
+
)
|
|
81
|
+
# 'files' 필드의 파일 URL이 자동으로 다운로드되어 로컬 경로로 변환됨
|
|
82
|
+
for unit in generator:
|
|
83
|
+
print(unit['files']) # URL이 아닌 로컬 파일 경로
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### `_list_all(path, url_conversion=None, params=None, **kwargs)`
|
|
87
|
+
|
|
88
|
+
페이지네이션된 API 엔드포인트에서 모든 결과를 생성하는 제너레이터입니다.
|
|
89
|
+
|
|
90
|
+
이 메서드는 `list_all=True`일 때 `_list()`에 의해 내부적으로 호출됩니다. `next` URL을 따라가며 자동으로 페이지네이션을 처리하고, 깊은 페이지네이션에서 스택 오버플로우를 방지하기 위해 재귀 대신 반복적 접근 방식(while 루프)을 사용합니다.
|
|
91
|
+
|
|
92
|
+
**주요 개선사항 (SYN-5757):**
|
|
93
|
+
|
|
94
|
+
1. **page_size 중복 제거**: `page_size` 매개변수는 첫 번째 요청에만 추가됩니다. 후속 요청은 이미 모든 필요한 매개변수를 포함하는 `next` URL을 직접 사용합니다.
|
|
95
|
+
|
|
96
|
+
2. **적절한 params 처리**: 사용자가 지정한 쿼리 매개변수가 첫 번째 요청에 올바르게 전달되고 `next` URL을 통해 페이지네이션 전체에 보존됩니다.
|
|
97
|
+
|
|
98
|
+
3. **모든 페이지에 url_conversion 적용**: URL 변환이 첫 번째 페이지뿐만 아니라 모든 페이지에 적용됩니다.
|
|
99
|
+
|
|
100
|
+
4. **재귀 대신 반복**: 더 나은 메모리 효율성과 대용량 데이터셋에서 스택 오버플로우 방지를 위해 재귀 대신 while 루프를 사용합니다.
|
|
101
|
+
|
|
102
|
+
**매개변수:**
|
|
103
|
+
|
|
104
|
+
- `path` (str): 초기 URL 경로
|
|
105
|
+
- `url_conversion` (dict, optional): 모든 페이지에 적용
|
|
106
|
+
- `params` (dict, optional): 첫 번째 요청에만 사용되는 쿼리 매개변수
|
|
107
|
+
- `**kwargs`: 추가 요청 인자
|
|
108
|
+
|
|
109
|
+
**생성:**
|
|
110
|
+
|
|
111
|
+
모든 페이지의 개별 결과 항목을 지연 방식으로 가져옵니다.
|
|
112
|
+
|
|
113
|
+
**예제:**
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
# 기본: 모든 작업 반복
|
|
117
|
+
for task in client._list_all('api/tasks/'):
|
|
118
|
+
process_task(task)
|
|
119
|
+
|
|
120
|
+
# 필터와 함께
|
|
121
|
+
params = {'status': 'pending'}
|
|
122
|
+
for task in client._list_all('api/tasks/', params=params):
|
|
123
|
+
print(task['id'])
|
|
124
|
+
|
|
125
|
+
# 중첩된 파일 필드에 url_conversion 사용
|
|
126
|
+
url_conversion = {'files_fields': ['data.files', 'metadata.attachments'], 'is_list': True}
|
|
127
|
+
for item in client._list_all('api/items/', url_conversion=url_conversion):
|
|
128
|
+
print(item['data']['files']) # 로컬 경로
|
|
129
|
+
|
|
130
|
+
# 모든 결과 수집 (대용량 데이터셋의 경우 메모리 집약적)
|
|
131
|
+
all_results = list(client._list_all('api/tasks/'))
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 파일 다운로드를 위한 URL 변환
|
|
135
|
+
|
|
136
|
+
`url_conversion` 매개변수는 API 응답에서 URL로 참조되는 파일의 자동 다운로드를 활성화합니다. 이는 파일 참조를 포함하는 데이터 유닛, 작업 또는 모든 리소스로 작업할 때 특히 유용합니다.
|
|
137
|
+
|
|
138
|
+
### URL 변환 구조
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
url_conversion = {
|
|
142
|
+
'files_fields': ['files', 'images', 'data.attachments'], # 필드 경로
|
|
143
|
+
'is_list': True # 항목 목록을 처리하는지 여부
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
- `files_fields`: 필드 경로 목록 (중첩 필드를 위한 점 표기법 지원)
|
|
148
|
+
- `is_list`: 페이지네이션된 목록 응답의 경우 `True`로 설정
|
|
149
|
+
|
|
150
|
+
### 작동 방식
|
|
151
|
+
|
|
152
|
+
1. API가 파일 URL이 포함된 응답 반환
|
|
153
|
+
2. `url_conversion`이 URL을 포함하는 필드 식별
|
|
154
|
+
3. 파일이 임시 디렉토리에 자동으로 다운로드됨
|
|
155
|
+
4. URL이 로컬 파일 경로로 대체됨
|
|
156
|
+
5. 코드가 URL 대신 로컬 경로가 포함된 응답 수신
|
|
157
|
+
|
|
158
|
+
### 예제
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
# 단순 파일 필드
|
|
162
|
+
url_conversion = {'files_fields': ['image_url'], 'is_list': True}
|
|
163
|
+
generator, count = client._list(
|
|
164
|
+
'api/photos/',
|
|
165
|
+
url_conversion=url_conversion,
|
|
166
|
+
list_all=True
|
|
167
|
+
)
|
|
168
|
+
for photo in generator:
|
|
169
|
+
# photo['image_url']은 이제 URL이 아닌 로컬 Path 객체
|
|
170
|
+
with open(photo['image_url'], 'rb') as f:
|
|
171
|
+
process_image(f)
|
|
172
|
+
|
|
173
|
+
# 여러 파일 필드
|
|
174
|
+
url_conversion = {
|
|
175
|
+
'files_fields': ['thumbnail', 'full_image', 'raw_data'],
|
|
176
|
+
'is_list': True
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
# 점 표기법을 사용한 중첩 필드
|
|
180
|
+
url_conversion = {
|
|
181
|
+
'files_fields': ['data.files', 'metadata.preview', 'annotations.image'],
|
|
182
|
+
'is_list': True
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# 더 나은 성능을 위한 비동기 다운로드
|
|
186
|
+
from synapse_sdk.utils.file import files_url_to_path_from_objs
|
|
187
|
+
|
|
188
|
+
results = client._list('api/data_units/')['results']
|
|
189
|
+
files_url_to_path_from_objs(
|
|
190
|
+
results,
|
|
191
|
+
files_fields=['files'],
|
|
192
|
+
is_list=True,
|
|
193
|
+
is_async=True # 모든 파일 동시 다운로드
|
|
194
|
+
)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## 성능 고려사항
|
|
198
|
+
|
|
199
|
+
### 메모리 효율성
|
|
200
|
+
|
|
201
|
+
대용량 데이터셋으로 작업할 때는 모든 결과를 메모리에 로드하는 대신 제너레이터를 사용하세요:
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
# ❌ 메모리 집약적 - 모든 결과 로드
|
|
205
|
+
all_tasks = list(client._list('api/tasks/', list_all=True)[0])
|
|
206
|
+
|
|
207
|
+
# ✅ 메모리 효율적 - 한 번에 하나씩 처리
|
|
208
|
+
generator, _ = client._list('api/tasks/', list_all=True)
|
|
209
|
+
for task in generator:
|
|
210
|
+
process_task(task)
|
|
211
|
+
# 작업이 처리되고 가비지 컬렉션될 수 있음
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### 페이지네이션 모범 사례
|
|
215
|
+
|
|
216
|
+
1. **한 페이지보다 큰 데이터셋에는 list_all=True 사용**
|
|
217
|
+
2. **기본값(100)이 최적이 아닌 경우 params에서 적절한 page_size 설정**
|
|
218
|
+
3. **파일을 처리해야 할 때만 url_conversion 사용**
|
|
219
|
+
4. **항목당 여러 파일이 있는 경우 비동기 다운로드 고려**
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
# 대용량 데이터셋을 위한 최적 페이지네이션
|
|
223
|
+
params = {'page_size': 50} # 더 빠른 첫 응답을 위한 작은 페이지
|
|
224
|
+
generator, total = client._list(
|
|
225
|
+
'api/large_dataset/',
|
|
226
|
+
list_all=True,
|
|
227
|
+
params=params
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# 진행 상황 추적과 함께 처리
|
|
231
|
+
from tqdm import tqdm
|
|
232
|
+
for item in tqdm(generator, total=total):
|
|
233
|
+
process_item(item)
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## 클라이언트 믹스인에서의 사용
|
|
237
|
+
|
|
238
|
+
BaseClient 페이지네이션 메서드는 모든 클라이언트 믹스인에서 내부적으로 사용됩니다:
|
|
24
239
|
|
|
25
240
|
```python
|
|
26
|
-
|
|
241
|
+
# DataCollectionClientMixin
|
|
242
|
+
def list_data_units(self, params=None, url_conversion=None, list_all=False):
|
|
243
|
+
return self._list('data_units/', params=params,
|
|
244
|
+
url_conversion=url_conversion, list_all=list_all)
|
|
27
245
|
|
|
28
|
-
#
|
|
29
|
-
|
|
246
|
+
# AnnotationClientMixin
|
|
247
|
+
def list_tasks(self, params=None, url_conversion=None, list_all=False):
|
|
248
|
+
return self._list('sdk/tasks/', params=params,
|
|
249
|
+
url_conversion=url_conversion, list_all=list_all)
|
|
30
250
|
```
|
|
31
251
|
|
|
32
252
|
## 참고
|
|
33
253
|
|
|
34
254
|
- [BackendClient](./backend.md) - 메인 클라이언트 구현
|
|
35
|
-
- [AgentClient](./agent.md) - Agent 전용 작업
|
|
255
|
+
- [AgentClient](./agent.md) - Agent 전용 작업
|
|
256
|
+
- [DataCollectionClientMixin](./data-collection-mixin.md) - 데이터 및 파일 작업
|
|
257
|
+
- [AnnotationClientMixin](./annotation-mixin.md) - 작업 및 주석 관리
|