synapse-sdk 1.0.0b12__py3-none-any.whl → 1.0.0b14__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.
- locale/ko/LC_MESSAGES/messages.mo +0 -0
- synapse_sdk/clients/agent/ray.py +9 -11
- synapse_sdk/clients/backend/annotation.py +1 -1
- synapse_sdk/clients/backend/core.py +31 -4
- synapse_sdk/clients/backend/data_collection.py +78 -5
- synapse_sdk/clients/backend/hitl.py +1 -1
- synapse_sdk/clients/backend/ml.py +1 -1
- synapse_sdk/clients/base.py +23 -16
- synapse_sdk/devtools/docs/docs/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/docs/api/clients/backend.md +53 -0
- synapse_sdk/devtools/docs/docs/api/clients/base.md +35 -0
- synapse_sdk/devtools/docs/docs/api/clients/ray.md +321 -0
- synapse_sdk/devtools/docs/docs/api/index.md +52 -0
- synapse_sdk/devtools/docs/docs/api/plugins/categories.md +43 -0
- synapse_sdk/devtools/docs/docs/api/plugins/models.md +59 -0
- synapse_sdk/devtools/docs/docs/api/plugins/utils.md +328 -0
- synapse_sdk/devtools/docs/docs/api/utils/file.md +195 -0
- synapse_sdk/devtools/docs/docs/api/utils/network.md +378 -0
- synapse_sdk/devtools/docs/docs/api/utils/storage.md +57 -0
- synapse_sdk/devtools/docs/docs/api/utils/types.md +51 -0
- synapse_sdk/devtools/docs/docs/categories.md +0 -0
- synapse_sdk/devtools/docs/docs/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/docs/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/docs/configuration.md +83 -0
- synapse_sdk/devtools/docs/docs/contributing.md +306 -0
- synapse_sdk/devtools/docs/docs/examples/index.md +29 -0
- synapse_sdk/devtools/docs/docs/faq.md +179 -0
- synapse_sdk/devtools/docs/docs/features/converters/index.md +455 -0
- synapse_sdk/devtools/docs/docs/features/index.md +24 -0
- synapse_sdk/devtools/docs/docs/features/plugins/index.md +509 -0
- synapse_sdk/devtools/docs/docs/installation.md +94 -0
- synapse_sdk/devtools/docs/docs/introduction.md +47 -0
- synapse_sdk/devtools/docs/docs/quickstart.md +78 -0
- synapse_sdk/devtools/docs/docs/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +8 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +23 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +34 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +57 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +43 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +31 -0
- synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +152 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +7 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +55 -0
- synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +88 -0
- synapse_sdk/devtools/docs/docusaurus.config.ts +5 -3
- synapse_sdk/devtools/docs/i18n/ko/code.json +325 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +43 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +53 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +35 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +321 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +52 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/file.md +195 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/network.md +378 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/storage.md +60 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/utils/types.md +51 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +280 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +38 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +83 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +306 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +29 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +179 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +30 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +24 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/plugins/index.md +30 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +94 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +47 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +78 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +519 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +22 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +42 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +18 -0
- synapse_sdk/devtools/docs/node_modules/shell-quote/print.py +3 -0
- synapse_sdk/devtools/docs/package.json +1 -1
- synapse_sdk/plugins/categories/export/actions/export.py +50 -2
- synapse_sdk/plugins/categories/export/templates/plugin/export.py +15 -2
- synapse_sdk/plugins/categories/upload/actions/upload.py +42 -27
- synapse_sdk/utils/file.py +77 -0
- {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/METADATA +1 -1
- {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/RECORD +86 -20
- {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/WHEEL +0 -0
- {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-1.0.0b12.dist-info → synapse_sdk-1.0.0b14.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: network
|
|
3
|
+
title: Network Utilities
|
|
4
|
+
sidebar_position: 4
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Network Utilities
|
|
8
|
+
|
|
9
|
+
스트리밍, 유효성 검사 및 연결 관리를 위한 포괄적인 네트워킹 유틸리티입니다.
|
|
10
|
+
|
|
11
|
+
## 개요
|
|
12
|
+
|
|
13
|
+
`synapse_sdk.utils.network` 모듈은 Ray 및 기타 클라이언트에서 안전하고 강력한 스트리밍 작업 및 입력 유효성 검사를 위해 사용하는 필수 네트워킹 구성 요소를 제공합니다.
|
|
14
|
+
|
|
15
|
+
## StreamLimits
|
|
16
|
+
|
|
17
|
+
리소스 고갈을 방지하기 위한 스트리밍 작업 제한을 위한 구성 클래스입니다.
|
|
18
|
+
|
|
19
|
+
### Constructor
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
from synapse_sdk.utils.network import StreamLimits
|
|
23
|
+
|
|
24
|
+
limits = StreamLimits(
|
|
25
|
+
max_messages=10000,
|
|
26
|
+
max_lines=50000,
|
|
27
|
+
max_bytes=50 * 1024 * 1024, # 50MB
|
|
28
|
+
max_message_size=10240, # 10KB
|
|
29
|
+
queue_size=1000,
|
|
30
|
+
exception_queue_size=10
|
|
31
|
+
)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Parameters
|
|
35
|
+
|
|
36
|
+
- `max_messages` (int): 처리할 최대 메시지 수 (기본값: 10,000)
|
|
37
|
+
- `max_lines` (int): 스트리밍할 최대 라인 수 (기본값: 50,000)
|
|
38
|
+
- `max_bytes` (int): 처리할 최대 총 바이트 (기본값: 50MB)
|
|
39
|
+
- `max_message_size` (int): 메시지당 최대 크기 (기본값: 10KB)
|
|
40
|
+
- `queue_size` (int): 메시지 버퍼링을 위한 내부 큐 크기 (기본값: 1,000)
|
|
41
|
+
- `exception_queue_size` (int): 예외 처리를 위한 큐 크기 (기본값: 10)
|
|
42
|
+
|
|
43
|
+
### 사용법
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
# 대용량 스트리밍을 위한 사용자 정의 제한
|
|
47
|
+
custom_limits = StreamLimits(
|
|
48
|
+
max_messages=50000,
|
|
49
|
+
max_lines=100000,
|
|
50
|
+
max_bytes=100 * 1024 * 1024 # 100MB
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# 스트림 매니저와 함께 사용
|
|
54
|
+
websocket_manager = WebSocketStreamManager(thread_pool, custom_limits)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## WebSocketStreamManager
|
|
58
|
+
|
|
59
|
+
자동 오류 처리 및 리소스 정리를 통한 실시간 로그 스트리밍을 위해 WebSocket 연결을 관리합니다.
|
|
60
|
+
|
|
61
|
+
### Constructor
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
from synapse_sdk.utils.network import WebSocketStreamManager
|
|
65
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
66
|
+
|
|
67
|
+
thread_pool = ThreadPoolExecutor(max_workers=5)
|
|
68
|
+
limits = StreamLimits()
|
|
69
|
+
manager = WebSocketStreamManager(thread_pool, limits)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Methods
|
|
73
|
+
|
|
74
|
+
#### `stream_logs(ws_url, headers, timeout, context)`
|
|
75
|
+
|
|
76
|
+
WebSocket 엔드포인트에서 로그를 스트리밍합니다.
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
# 오류 처리가 있는 로그 스트리밍
|
|
80
|
+
try:
|
|
81
|
+
for log_line in manager.stream_logs(
|
|
82
|
+
ws_url="wss://ray-cluster:8265/logs/ws/",
|
|
83
|
+
headers={"Authorization": "Bearer token"},
|
|
84
|
+
timeout=30.0,
|
|
85
|
+
context="job job-12345"
|
|
86
|
+
):
|
|
87
|
+
print(log_line.strip())
|
|
88
|
+
except ClientError as e:
|
|
89
|
+
print(f"스트리밍 실패: {e}")
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 오류 처리
|
|
93
|
+
|
|
94
|
+
- **500**: WebSocket 라이브러리 사용 불가
|
|
95
|
+
- **503**: 연결 실패
|
|
96
|
+
- **408**: 연결 timeout
|
|
97
|
+
- **429**: 스트림 제한 초과
|
|
98
|
+
|
|
99
|
+
## HTTPStreamManager
|
|
100
|
+
|
|
101
|
+
신뢰할 수 있는 로그 스트리밍을 위해 청크 전송 인코딩을 사용하여 HTTP 스트리밍 연결을 관리합니다.
|
|
102
|
+
|
|
103
|
+
### Constructor
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
from synapse_sdk.utils.network import HTTPStreamManager
|
|
107
|
+
import requests
|
|
108
|
+
|
|
109
|
+
session = requests.Session()
|
|
110
|
+
limits = StreamLimits()
|
|
111
|
+
manager = HTTPStreamManager(session, limits)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Methods
|
|
115
|
+
|
|
116
|
+
#### `stream_logs(url, headers, timeout, context)`
|
|
117
|
+
|
|
118
|
+
청크 전송 인코딩을 사용하여 HTTP 엔드포인트에서 로그를 스트리밍합니다.
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
# 사용자 정의 timeout으로 로그 스트리밍
|
|
122
|
+
for log_line in manager.stream_logs(
|
|
123
|
+
url="http://ray-cluster:8265/logs/stream",
|
|
124
|
+
headers={"Authorization": "Bearer token"},
|
|
125
|
+
timeout=(5, 60), # (connect, read) timeout
|
|
126
|
+
context="job job-12345"
|
|
127
|
+
):
|
|
128
|
+
if 'ERROR' in log_line:
|
|
129
|
+
print(f"오류 감지: {log_line}")
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 기능
|
|
133
|
+
|
|
134
|
+
- **자동 리소스 정리**: HTTP 응답이 적절하게 닫힘
|
|
135
|
+
- **라인 크기 필터링**: 대용량 라인 (>10KB)이 자동으로 필터링됨
|
|
136
|
+
- **스트림 제한**: 메모리 고갈 방지
|
|
137
|
+
- **오류 복구**: 적절한 정리를 통한 강력한 오류 처리
|
|
138
|
+
|
|
139
|
+
### 오류 처리
|
|
140
|
+
|
|
141
|
+
- **503**: 연결 거부 또는 네트워크 오류
|
|
142
|
+
- **408**: 연결 또는 읽기 timeout
|
|
143
|
+
- **404**: 엔드포인트를 찾을 수 없음
|
|
144
|
+
- **429**: 스트림 제한 초과
|
|
145
|
+
- **500**: 예상치 못한 스트리밍 오류
|
|
146
|
+
|
|
147
|
+
## 유효성 검사 함수
|
|
148
|
+
|
|
149
|
+
### `validate_resource_id(resource_id, resource_name='resource')`
|
|
150
|
+
|
|
151
|
+
주입 공격을 방지하기 위해 리소스 식별자를 유효성 검사합니다.
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
from synapse_sdk.utils.network import validate_resource_id
|
|
155
|
+
|
|
156
|
+
# 유효한 사용
|
|
157
|
+
job_id = validate_resource_id('job-12345', 'job')
|
|
158
|
+
node_id = validate_resource_id('node_abc_123', 'node')
|
|
159
|
+
|
|
160
|
+
# 잘못된 사용은 ClientError를 발생시킴
|
|
161
|
+
try:
|
|
162
|
+
validate_resource_id('job/../malicious', 'job')
|
|
163
|
+
except ClientError as e:
|
|
164
|
+
print(f"잘못된 ID: {e}") # Status 400
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
#### 유효성 검사 규칙
|
|
168
|
+
|
|
169
|
+
- 비어있으면 안됨
|
|
170
|
+
- 영숫자, 하이픈, 밑줄만 허용
|
|
171
|
+
- 최대 길이: 100자
|
|
172
|
+
- 패턴: `^[a-zA-Z0-9\-_]+$`
|
|
173
|
+
|
|
174
|
+
#### Parameters
|
|
175
|
+
|
|
176
|
+
- `resource_id` (Any): 유효성 검사할 ID (문자열로 변환됨)
|
|
177
|
+
- `resource_name` (str): 오류 메시지를 위한 이름 (기본값: 'resource')
|
|
178
|
+
|
|
179
|
+
#### Returns
|
|
180
|
+
|
|
181
|
+
- `str`: 유효성 검사된 리소스 ID
|
|
182
|
+
|
|
183
|
+
#### Raises
|
|
184
|
+
|
|
185
|
+
- `ClientError` (400): 유효성 검사 실패 시
|
|
186
|
+
|
|
187
|
+
### `validate_timeout(timeout, max_timeout=300)`
|
|
188
|
+
|
|
189
|
+
경계 확인을 통한 timeout 값 유효성 검사입니다.
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
from synapse_sdk.utils.network import validate_timeout
|
|
193
|
+
|
|
194
|
+
# 유효한 timeout
|
|
195
|
+
timeout = validate_timeout(30) # 30초
|
|
196
|
+
timeout = validate_timeout(10.5) # 10.5초
|
|
197
|
+
|
|
198
|
+
# 잘못된 timeout은 ClientError를 발생시킴
|
|
199
|
+
try:
|
|
200
|
+
validate_timeout(-1) # 음수 timeout
|
|
201
|
+
validate_timeout(500) # 최대값 초과
|
|
202
|
+
except ClientError as e:
|
|
203
|
+
print(f"잘못된 timeout: {e}") # Status 400
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
#### Parameters
|
|
207
|
+
|
|
208
|
+
- `timeout` (int|float): 초 단위 timeout 값
|
|
209
|
+
- `max_timeout` (int): 허용되는 최대 timeout (기본값: 300)
|
|
210
|
+
|
|
211
|
+
#### Returns
|
|
212
|
+
|
|
213
|
+
- `float`: 유효성 검사된 timeout 값
|
|
214
|
+
|
|
215
|
+
#### Raises
|
|
216
|
+
|
|
217
|
+
- `ClientError` (400): timeout이 유효하지 않은 경우
|
|
218
|
+
|
|
219
|
+
## URL Utilities
|
|
220
|
+
|
|
221
|
+
### `http_to_websocket_url(http_url)`
|
|
222
|
+
|
|
223
|
+
HTTP URL을 WebSocket URL로 변환합니다.
|
|
224
|
+
|
|
225
|
+
```python
|
|
226
|
+
from synapse_sdk.utils.network import http_to_websocket_url
|
|
227
|
+
|
|
228
|
+
# URL 변환
|
|
229
|
+
ws_url = http_to_websocket_url("http://ray-cluster:8265/logs/")
|
|
230
|
+
# 결과: "ws://ray-cluster:8265/logs/"
|
|
231
|
+
|
|
232
|
+
wss_url = http_to_websocket_url("https://ray-cluster:8265/logs/")
|
|
233
|
+
# 결과: "wss://ray-cluster:8265/logs/"
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
#### Parameters
|
|
237
|
+
|
|
238
|
+
- `http_url` (str): HTTP 또는 HTTPS URL
|
|
239
|
+
|
|
240
|
+
#### Returns
|
|
241
|
+
|
|
242
|
+
- `str`: WebSocket URL (ws:// 또는 wss://)
|
|
243
|
+
|
|
244
|
+
## 오류 Utilities
|
|
245
|
+
|
|
246
|
+
### `sanitize_error_message(message, context)`
|
|
247
|
+
|
|
248
|
+
디버깅 컨텍스트를 유지하면서 정보 유출을 방지하기 위해 오류 메시지를 정제합니다.
|
|
249
|
+
|
|
250
|
+
```python
|
|
251
|
+
from synapse_sdk.utils.network import sanitize_error_message
|
|
252
|
+
|
|
253
|
+
# 로깅을 위한 오류 정제
|
|
254
|
+
clean_message = sanitize_error_message(
|
|
255
|
+
"Connection failed: Invalid token abc123",
|
|
256
|
+
"job job-12345"
|
|
257
|
+
)
|
|
258
|
+
# 결과: 컨텍스트가 포함된 정제된 오류 메시지
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
#### Parameters
|
|
262
|
+
|
|
263
|
+
- `message` (str): 원본 오류 메시지
|
|
264
|
+
- `context` (str): 디버깅을 위한 컨텍스트 (예: "job job-12345")
|
|
265
|
+
|
|
266
|
+
#### Returns
|
|
267
|
+
|
|
268
|
+
- `str`: 정제된 오류 메시지
|
|
269
|
+
|
|
270
|
+
## 완전한 예제
|
|
271
|
+
|
|
272
|
+
```python
|
|
273
|
+
import asyncio
|
|
274
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
275
|
+
from synapse_sdk.utils.network import (
|
|
276
|
+
StreamLimits,
|
|
277
|
+
WebSocketStreamManager,
|
|
278
|
+
HTTPStreamManager,
|
|
279
|
+
validate_resource_id,
|
|
280
|
+
validate_timeout,
|
|
281
|
+
http_to_websocket_url
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
class StreamingExample:
|
|
285
|
+
def __init__(self):
|
|
286
|
+
# 구성 요소 설정
|
|
287
|
+
self.thread_pool = ThreadPoolExecutor(max_workers=3)
|
|
288
|
+
self.limits = StreamLimits(max_lines=10000)
|
|
289
|
+
self.ws_manager = WebSocketStreamManager(self.thread_pool, self.limits)
|
|
290
|
+
|
|
291
|
+
# HTTP 스트리밍을 위한 HTTP 세션
|
|
292
|
+
import requests
|
|
293
|
+
self.session = requests.Session()
|
|
294
|
+
self.http_manager = HTTPStreamManager(self.session, self.limits)
|
|
295
|
+
|
|
296
|
+
def stream_job_logs(self, job_id, protocol='websocket'):
|
|
297
|
+
# 입력 유효성 검사
|
|
298
|
+
validated_id = validate_resource_id(job_id, 'job')
|
|
299
|
+
timeout = validate_timeout(30)
|
|
300
|
+
|
|
301
|
+
if protocol == 'websocket':
|
|
302
|
+
return self._websocket_stream(validated_id, timeout)
|
|
303
|
+
else:
|
|
304
|
+
return self._http_stream(validated_id, timeout)
|
|
305
|
+
|
|
306
|
+
def _websocket_stream(self, job_id, timeout):
|
|
307
|
+
url = f"http://ray-cluster:8265/jobs/{job_id}/logs/"
|
|
308
|
+
ws_url = http_to_websocket_url(url)
|
|
309
|
+
headers = {"Authorization": "Bearer token"}
|
|
310
|
+
context = f"job {job_id}"
|
|
311
|
+
|
|
312
|
+
return self.ws_manager.stream_logs(ws_url, headers, timeout, context)
|
|
313
|
+
|
|
314
|
+
def _http_stream(self, job_id, timeout):
|
|
315
|
+
url = f"http://ray-cluster:8265/jobs/{job_id}/logs/stream"
|
|
316
|
+
headers = {"Authorization": "Bearer token"}
|
|
317
|
+
timeout_tuple = (5, timeout)
|
|
318
|
+
context = f"job {job_id}"
|
|
319
|
+
|
|
320
|
+
return self.http_manager.stream_logs(url, headers, timeout_tuple, context)
|
|
321
|
+
|
|
322
|
+
# 사용법
|
|
323
|
+
example = StreamingExample()
|
|
324
|
+
|
|
325
|
+
# WebSocket으로 스트리밍
|
|
326
|
+
for log_line in example.stream_job_logs('job-12345', 'websocket'):
|
|
327
|
+
print(log_line.strip())
|
|
328
|
+
|
|
329
|
+
# HTTP 폴백으로 스트리밍
|
|
330
|
+
for log_line in example.stream_job_logs('job-12345', 'http'):
|
|
331
|
+
print(log_line.strip())
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## 모범 사례
|
|
335
|
+
|
|
336
|
+
### 1. 리소스 관리
|
|
337
|
+
|
|
338
|
+
```python
|
|
339
|
+
# 항상 적절한 정리 사용
|
|
340
|
+
thread_pool = ThreadPoolExecutor(max_workers=5)
|
|
341
|
+
try:
|
|
342
|
+
manager = WebSocketStreamManager(thread_pool, StreamLimits())
|
|
343
|
+
# 매니저 사용...
|
|
344
|
+
finally:
|
|
345
|
+
thread_pool.shutdown(wait=True)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### 2. 오류 처리
|
|
349
|
+
|
|
350
|
+
```python
|
|
351
|
+
from synapse_sdk.clients.exceptions import ClientError
|
|
352
|
+
|
|
353
|
+
try:
|
|
354
|
+
job_id = validate_resource_id(user_input, 'job')
|
|
355
|
+
timeout = validate_timeout(user_timeout)
|
|
356
|
+
# 유효성 검사된 입력으로 진행...
|
|
357
|
+
except ClientError as e:
|
|
358
|
+
logger.error(f"유효성 검사 실패: {e}")
|
|
359
|
+
return error_response(e.status, str(e))
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### 3. 스트림 제한 구성
|
|
363
|
+
|
|
364
|
+
```python
|
|
365
|
+
# 사용 사례에 따라 제한 구성
|
|
366
|
+
production_limits = StreamLimits(
|
|
367
|
+
max_messages=20000, # 프로덕션을 위해 더 높게
|
|
368
|
+
max_lines=100000, # 더 많은 라인 허용
|
|
369
|
+
max_bytes=200 * 1024 * 1024, # 큰 로그를 위해 200MB
|
|
370
|
+
queue_size=2000 # 더 큰 버퍼
|
|
371
|
+
)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## 참고
|
|
375
|
+
|
|
376
|
+
- [RayClient](../clients/ray.md) - 네트워크 유틸리티의 주요 소비자
|
|
377
|
+
- [File Utils](./file.md) - 파일 작업 및 처리
|
|
378
|
+
- [Storage](./storage.md) - Storage 제공자
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: storage
|
|
3
|
+
title: Storage Providers
|
|
4
|
+
sidebar_position: 2
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Storage Providers
|
|
8
|
+
|
|
9
|
+
여러 클라우드 제공자를 지원하는 스토리지 추상화 레이어입니다.
|
|
10
|
+
|
|
11
|
+
## 지원되는 제공자
|
|
12
|
+
|
|
13
|
+
### Amazon S3
|
|
14
|
+
|
|
15
|
+
Amazon Simple Storage Service 통합입니다.
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
from synapse_sdk.utils.storage.providers.s3 import S3Provider
|
|
19
|
+
|
|
20
|
+
provider = S3Provider(
|
|
21
|
+
bucket="my-bucket",
|
|
22
|
+
region="us-west-2"
|
|
23
|
+
)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Google Cloud Storage
|
|
27
|
+
|
|
28
|
+
Google Cloud Storage 통합입니다.
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
from synapse_sdk.utils.storage.providers.gcp import GCPProvider
|
|
32
|
+
|
|
33
|
+
provider = GCPProvider(
|
|
34
|
+
bucket="my-bucket",
|
|
35
|
+
project="my-project"
|
|
36
|
+
)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### SFTP
|
|
40
|
+
|
|
41
|
+
Secure File Transfer Protocol 지원입니다.
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
from synapse_sdk.utils.storage.providers.sftp import SFTPProvider
|
|
45
|
+
|
|
46
|
+
provider = SFTPProvider(
|
|
47
|
+
host="sftp.example.com",
|
|
48
|
+
username="user"
|
|
49
|
+
)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 사용법
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
from synapse_sdk.utils.storage import get_storage
|
|
56
|
+
|
|
57
|
+
# URL에서 자동 제공자 감지
|
|
58
|
+
storage = get_storage("s3://my-bucket/file.csv")
|
|
59
|
+
local_path = storage.download()
|
|
60
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: types
|
|
3
|
+
title: Custom Types
|
|
4
|
+
sidebar_position: 3
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Custom Types
|
|
8
|
+
|
|
9
|
+
SDK 전반에 걸쳐 사용되는 사용자 정의 타입 및 Pydantic 필드입니다.
|
|
10
|
+
|
|
11
|
+
## FileField
|
|
12
|
+
|
|
13
|
+
자동 다운로드 기능이 있는 파일 URL 처리를 위한 사용자 정의 Pydantic 필드입니다.
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from synapse_sdk.types import FileField
|
|
17
|
+
from pydantic import BaseModel
|
|
18
|
+
|
|
19
|
+
class MyParams(BaseModel):
|
|
20
|
+
input_file: FileField # 파일을 자동으로 다운로드
|
|
21
|
+
|
|
22
|
+
def process(params: MyParams):
|
|
23
|
+
file_path = params.input_file # 로컬 파일 경로
|
|
24
|
+
# 파일 처리...
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 기능
|
|
28
|
+
|
|
29
|
+
- URL에서 자동 파일 다운로드
|
|
30
|
+
- 임시 파일 관리
|
|
31
|
+
- 다양한 파일 형식 지원
|
|
32
|
+
- 파일 존재 여부 유효성 검사
|
|
33
|
+
|
|
34
|
+
## 사용 예제
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
# 플러그인 매개변수에서
|
|
38
|
+
class ProcessParams(BaseModel):
|
|
39
|
+
data_file: FileField
|
|
40
|
+
config_file: FileField = None # 선택적 파일
|
|
41
|
+
|
|
42
|
+
# FileField는 자동으로:
|
|
43
|
+
# 1. URL에서 파일 다운로드
|
|
44
|
+
# 2. 파일 존재 여부 유효성 검사
|
|
45
|
+
# 3. 로컬 파일 경로 반환
|
|
46
|
+
# 4. 임시 파일 정리
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 타입 유효성 검사
|
|
50
|
+
|
|
51
|
+
SDK 전반에 걸쳐 타입 안전성을 보장하기 위한 사용자 정의 유효성 검사기입니다.
|
|
File without changes
|