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.

@@ -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
- from synapse_sdk.clients.base import BaseClient
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
- # BaseClient는 일반적으로 직접 사용되지 않습니다
29
- # 대신 BackendClient 또는 AgentClient를 사용하세요
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) - 작업 및 주석 관리