airweave-sdk 0.8.64__py3-none-any.whl → 0.8.66__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.
- airweave/__init__.py +44 -38
- airweave/client.py +19 -16
- airweave/collections/__init__.py +3 -6
- airweave/collections/client.py +273 -113
- airweave/collections/raw_client.py +633 -94
- airweave/collections/types/__init__.py +2 -4
- airweave/core/client_wrapper.py +4 -30
- airweave/errors/__init__.py +10 -2
- airweave/errors/conflict_error.py +11 -0
- airweave/errors/not_found_error.py +11 -0
- airweave/errors/too_many_requests_error.py +11 -0
- airweave/errors/unprocessable_entity_error.py +1 -2
- airweave/{types/message_status.py → events/__init__.py} +2 -1
- airweave/events/client.py +919 -0
- airweave/events/raw_client.py +1435 -0
- airweave/source_connections/client.py +210 -162
- airweave/source_connections/raw_client.py +574 -137
- airweave/sources/client.py +42 -18
- airweave/sources/raw_client.py +118 -17
- airweave/types/__init__.py +33 -33
- airweave/types/{create_subscription_request.py → conflict_error_response.py} +9 -6
- airweave/types/delivery_attempt.py +61 -0
- airweave/types/event_message.py +55 -0
- airweave/types/event_message_with_attempts.py +59 -0
- airweave/types/{endpoint_secret_out.py → not_found_error_response.py} +9 -2
- airweave/types/{subscription_with_attempts_out.py → rate_limit_error_response.py} +9 -6
- airweave/types/recovery_task.py +35 -0
- airweave/types/search_request.py +13 -10
- airweave/types/search_response.py +6 -3
- airweave/types/source_connection.py +73 -18
- airweave/types/source_connection_job.py +65 -15
- airweave/types/source_connection_list_item.py +45 -10
- airweave/types/sync_event_payload.py +72 -0
- airweave/types/{patch_subscription_request.py → validation_error_detail.py} +16 -5
- airweave/types/validation_error_response.py +30 -0
- airweave/types/webhook_subscription.py +68 -0
- {airweave_sdk-0.8.64.dist-info → airweave_sdk-0.8.66.dist-info}/METADATA +1 -5
- {airweave_sdk-0.8.64.dist-info → airweave_sdk-0.8.66.dist-info}/RECORD +39 -34
- airweave/collections/types/search_collections_readable_id_search_post_response.py +0 -8
- airweave/types/collection_update.py +0 -35
- airweave/types/endpoint_out.py +0 -35
- airweave/types/message_attempt_out.py +0 -37
- airweave/types/message_attempt_trigger_type.py +0 -3
- airweave/types/message_out.py +0 -29
- airweave/types/message_status_text.py +0 -5
- {airweave_sdk-0.8.64.dist-info → airweave_sdk-0.8.66.dist-info}/WHEEL +0 -0
|
@@ -39,7 +39,13 @@ class SourceConnectionsClient:
|
|
|
39
39
|
request_options: typing.Optional[RequestOptions] = None,
|
|
40
40
|
) -> typing.List[SourceConnectionListItem]:
|
|
41
41
|
"""
|
|
42
|
-
|
|
42
|
+
Retrieve all source connections for your organization.
|
|
43
|
+
|
|
44
|
+
Returns a lightweight list of source connections with essential fields for
|
|
45
|
+
display and navigation. Use the collection filter to see connections within
|
|
46
|
+
a specific collection.
|
|
47
|
+
|
|
48
|
+
For full connection details including sync history, use the GET /{id} endpoint.
|
|
43
49
|
|
|
44
50
|
Parameters
|
|
45
51
|
----------
|
|
@@ -47,8 +53,10 @@ class SourceConnectionsClient:
|
|
|
47
53
|
Filter by collection readable ID
|
|
48
54
|
|
|
49
55
|
skip : typing.Optional[int]
|
|
56
|
+
Number of connections to skip for pagination
|
|
50
57
|
|
|
51
58
|
limit : typing.Optional[int]
|
|
59
|
+
Maximum number of connections to return (1-1000)
|
|
52
60
|
|
|
53
61
|
request_options : typing.Optional[RequestOptions]
|
|
54
62
|
Request-specific configuration.
|
|
@@ -56,21 +64,19 @@ class SourceConnectionsClient:
|
|
|
56
64
|
Returns
|
|
57
65
|
-------
|
|
58
66
|
typing.List[SourceConnectionListItem]
|
|
59
|
-
|
|
67
|
+
List of source connections
|
|
60
68
|
|
|
61
69
|
Examples
|
|
62
70
|
--------
|
|
63
71
|
from airweave import AirweaveSDK
|
|
64
72
|
|
|
65
73
|
client = AirweaveSDK(
|
|
66
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
67
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
68
74
|
api_key="YOUR_API_KEY",
|
|
69
75
|
)
|
|
70
76
|
client.source_connections.list(
|
|
71
77
|
collection="collection",
|
|
72
|
-
skip=
|
|
73
|
-
limit=
|
|
78
|
+
skip=0,
|
|
79
|
+
limit=100,
|
|
74
80
|
)
|
|
75
81
|
"""
|
|
76
82
|
_response = self._raw_client.list(
|
|
@@ -93,45 +99,42 @@ class SourceConnectionsClient:
|
|
|
93
99
|
request_options: typing.Optional[RequestOptions] = None,
|
|
94
100
|
) -> SourceConnection:
|
|
95
101
|
"""
|
|
96
|
-
Create a new source connection.
|
|
102
|
+
Create a new source connection to sync data from an external source.
|
|
97
103
|
|
|
98
|
-
The authentication
|
|
99
|
-
- DirectAuthentication: Immediate creation with provided credentials
|
|
100
|
-
- OAuthBrowserAuthentication: Returns shell with authentication URL
|
|
101
|
-
- OAuthTokenAuthentication: Immediate creation with provided token
|
|
102
|
-
- AuthProviderAuthentication: Using external auth provider
|
|
104
|
+
The authentication method determines the creation flow:
|
|
103
105
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
- **Direct**: Provide credentials (API key, token) directly. Connection is created immediately.
|
|
107
|
+
- **OAuth Browser**: Returns a connection with an `auth_url` to redirect users for authentication.
|
|
108
|
+
- **OAuth Token**: Provide an existing OAuth token. Connection is created immediately.
|
|
109
|
+
- **Auth Provider**: Use a pre-configured auth provider (e.g., Composio, Pipedream).
|
|
106
110
|
|
|
107
|
-
|
|
108
|
-
- True for: direct, oauth_token, auth_provider
|
|
109
|
-
- False for: oauth_browser, oauth_byoc (these sync after authentication)
|
|
111
|
+
After successful authentication, data sync can begin automatically or on-demand.
|
|
110
112
|
|
|
111
113
|
Parameters
|
|
112
114
|
----------
|
|
113
115
|
short_name : str
|
|
114
|
-
Source identifier (e.g., 'slack', 'github')
|
|
116
|
+
Source type identifier (e.g., 'slack', 'github', 'notion')
|
|
115
117
|
|
|
116
118
|
readable_collection_id : str
|
|
117
|
-
|
|
119
|
+
The readable ID of the collection to add this connection to
|
|
118
120
|
|
|
119
121
|
name : typing.Optional[str]
|
|
120
|
-
|
|
122
|
+
Display name for the connection. If not provided, defaults to '{Source Name} Connection'.
|
|
121
123
|
|
|
122
124
|
description : typing.Optional[str]
|
|
123
|
-
|
|
125
|
+
Optional description of what this connection is used for
|
|
124
126
|
|
|
125
127
|
config : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
126
|
-
Source-specific configuration
|
|
128
|
+
Source-specific configuration (e.g., repository name, filters)
|
|
127
129
|
|
|
128
130
|
schedule : typing.Optional[ScheduleConfig]
|
|
131
|
+
Optional sync schedule configuration
|
|
129
132
|
|
|
130
133
|
sync_immediately : typing.Optional[bool]
|
|
131
134
|
Run initial sync after creation. Defaults to True for direct/token/auth_provider, False for OAuth browser/BYOC flows (which sync after authentication)
|
|
132
135
|
|
|
133
136
|
authentication : typing.Optional[Authentication]
|
|
134
|
-
Authentication
|
|
137
|
+
Authentication configuration. Type is auto-detected from provided fields.
|
|
135
138
|
|
|
136
139
|
redirect_url : typing.Optional[str]
|
|
137
140
|
URL to redirect to after OAuth flow completes (only used for OAuth flows)
|
|
@@ -142,20 +145,18 @@ class SourceConnectionsClient:
|
|
|
142
145
|
Returns
|
|
143
146
|
-------
|
|
144
147
|
SourceConnection
|
|
145
|
-
|
|
148
|
+
Created source connection
|
|
146
149
|
|
|
147
150
|
Examples
|
|
148
151
|
--------
|
|
149
152
|
from airweave import AirweaveSDK
|
|
150
153
|
|
|
151
154
|
client = AirweaveSDK(
|
|
152
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
153
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
154
155
|
api_key="YOUR_API_KEY",
|
|
155
156
|
)
|
|
156
157
|
client.source_connections.create(
|
|
157
|
-
short_name="
|
|
158
|
-
readable_collection_id="
|
|
158
|
+
short_name="github",
|
|
159
|
+
readable_collection_id="customer-support-tickets-x7k9m",
|
|
159
160
|
)
|
|
160
161
|
"""
|
|
161
162
|
_response = self._raw_client.create(
|
|
@@ -176,11 +177,18 @@ class SourceConnectionsClient:
|
|
|
176
177
|
self, source_connection_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
177
178
|
) -> SourceConnection:
|
|
178
179
|
"""
|
|
179
|
-
|
|
180
|
+
Retrieve details of a specific source connection.
|
|
181
|
+
|
|
182
|
+
Returns complete information about the connection including:
|
|
183
|
+
- Configuration settings
|
|
184
|
+
- Authentication status
|
|
185
|
+
- Sync schedule and history
|
|
186
|
+
- Entity statistics
|
|
180
187
|
|
|
181
188
|
Parameters
|
|
182
189
|
----------
|
|
183
190
|
source_connection_id : str
|
|
191
|
+
Unique identifier of the source connection (UUID)
|
|
184
192
|
|
|
185
193
|
request_options : typing.Optional[RequestOptions]
|
|
186
194
|
Request-specific configuration.
|
|
@@ -188,19 +196,17 @@ class SourceConnectionsClient:
|
|
|
188
196
|
Returns
|
|
189
197
|
-------
|
|
190
198
|
SourceConnection
|
|
191
|
-
|
|
199
|
+
Source connection details
|
|
192
200
|
|
|
193
201
|
Examples
|
|
194
202
|
--------
|
|
195
203
|
from airweave import AirweaveSDK
|
|
196
204
|
|
|
197
205
|
client = AirweaveSDK(
|
|
198
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
199
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
200
206
|
api_key="YOUR_API_KEY",
|
|
201
207
|
)
|
|
202
208
|
client.source_connections.get(
|
|
203
|
-
source_connection_id="
|
|
209
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
204
210
|
)
|
|
205
211
|
"""
|
|
206
212
|
_response = self._raw_client.get(source_connection_id, request_options=request_options)
|
|
@@ -210,11 +216,19 @@ class SourceConnectionsClient:
|
|
|
210
216
|
self, source_connection_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
211
217
|
) -> SourceConnection:
|
|
212
218
|
"""
|
|
213
|
-
|
|
219
|
+
Permanently delete a source connection and all its synced data.
|
|
220
|
+
|
|
221
|
+
This operation:
|
|
222
|
+
- Removes all entities synced from this source from the vector database
|
|
223
|
+
- Cancels any scheduled or running sync jobs
|
|
224
|
+
- Deletes the connection configuration and credentials
|
|
225
|
+
|
|
226
|
+
**Warning**: This action cannot be undone. All synced data will be permanently deleted.
|
|
214
227
|
|
|
215
228
|
Parameters
|
|
216
229
|
----------
|
|
217
230
|
source_connection_id : str
|
|
231
|
+
Unique identifier of the source connection to delete (UUID)
|
|
218
232
|
|
|
219
233
|
request_options : typing.Optional[RequestOptions]
|
|
220
234
|
Request-specific configuration.
|
|
@@ -222,19 +236,17 @@ class SourceConnectionsClient:
|
|
|
222
236
|
Returns
|
|
223
237
|
-------
|
|
224
238
|
SourceConnection
|
|
225
|
-
|
|
239
|
+
Deleted source connection
|
|
226
240
|
|
|
227
241
|
Examples
|
|
228
242
|
--------
|
|
229
243
|
from airweave import AirweaveSDK
|
|
230
244
|
|
|
231
245
|
client = AirweaveSDK(
|
|
232
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
233
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
234
246
|
api_key="YOUR_API_KEY",
|
|
235
247
|
)
|
|
236
248
|
client.source_connections.delete(
|
|
237
|
-
source_connection_id="
|
|
249
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
238
250
|
)
|
|
239
251
|
"""
|
|
240
252
|
_response = self._raw_client.delete(source_connection_id, request_options=request_options)
|
|
@@ -252,29 +264,35 @@ class SourceConnectionsClient:
|
|
|
252
264
|
request_options: typing.Optional[RequestOptions] = None,
|
|
253
265
|
) -> SourceConnection:
|
|
254
266
|
"""
|
|
255
|
-
Update
|
|
267
|
+
Update an existing source connection's configuration.
|
|
256
268
|
|
|
257
|
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
269
|
+
You can modify:
|
|
270
|
+
- **Name and description**: Display information
|
|
271
|
+
- **Configuration**: Source-specific settings (e.g., repository name, filters)
|
|
272
|
+
- **Schedule**: Cron expression for automatic syncs
|
|
273
|
+
- **Authentication**: Update credentials (direct auth only)
|
|
274
|
+
|
|
275
|
+
Only include the fields you want to change; omitted fields retain their current values.
|
|
262
276
|
|
|
263
277
|
Parameters
|
|
264
278
|
----------
|
|
265
279
|
source_connection_id : str
|
|
280
|
+
Unique identifier of the source connection to update (UUID)
|
|
266
281
|
|
|
267
282
|
name : typing.Optional[str]
|
|
283
|
+
Updated display name for the connection
|
|
268
284
|
|
|
269
285
|
description : typing.Optional[str]
|
|
286
|
+
Updated description
|
|
270
287
|
|
|
271
288
|
config : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
272
|
-
|
|
289
|
+
Updated source-specific configuration
|
|
273
290
|
|
|
274
291
|
schedule : typing.Optional[ScheduleConfig]
|
|
292
|
+
Updated sync schedule configuration
|
|
275
293
|
|
|
276
294
|
authentication : typing.Optional[Authentication]
|
|
277
|
-
|
|
295
|
+
Updated authentication credentials (direct auth only)
|
|
278
296
|
|
|
279
297
|
request_options : typing.Optional[RequestOptions]
|
|
280
298
|
Request-specific configuration.
|
|
@@ -282,19 +300,17 @@ class SourceConnectionsClient:
|
|
|
282
300
|
Returns
|
|
283
301
|
-------
|
|
284
302
|
SourceConnection
|
|
285
|
-
|
|
303
|
+
Updated source connection
|
|
286
304
|
|
|
287
305
|
Examples
|
|
288
306
|
--------
|
|
289
307
|
from airweave import AirweaveSDK
|
|
290
308
|
|
|
291
309
|
client = AirweaveSDK(
|
|
292
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
293
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
294
310
|
api_key="YOUR_API_KEY",
|
|
295
311
|
)
|
|
296
312
|
client.source_connections.update(
|
|
297
|
-
source_connection_id="
|
|
313
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
298
314
|
)
|
|
299
315
|
"""
|
|
300
316
|
_response = self._raw_client.update(
|
|
@@ -316,25 +332,22 @@ class SourceConnectionsClient:
|
|
|
316
332
|
request_options: typing.Optional[RequestOptions] = None,
|
|
317
333
|
) -> SourceConnectionJob:
|
|
318
334
|
"""
|
|
319
|
-
Trigger a
|
|
335
|
+
Trigger a data synchronization job for a source connection.
|
|
320
336
|
|
|
321
|
-
|
|
337
|
+
Starts an asynchronous sync job that pulls the latest data from the connected
|
|
338
|
+
source. The job runs in the background and you can monitor its progress using
|
|
339
|
+
the jobs endpoint.
|
|
322
340
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
source_connection_id: ID of the source connection to run
|
|
326
|
-
ctx: API context with organization and user information
|
|
327
|
-
guard_rail: Guard rail service for usage limits
|
|
328
|
-
force_full_sync: If True, forces a full sync with orphaned entity cleanup
|
|
329
|
-
for continuous syncs. Raises 400 error if used on
|
|
330
|
-
non-continuous syncs (which are always full syncs).
|
|
341
|
+
For continuous sync connections, this performs an incremental sync by default.
|
|
342
|
+
Use `force_full_sync=true` to perform a complete re-sync of all data.
|
|
331
343
|
|
|
332
344
|
Parameters
|
|
333
345
|
----------
|
|
334
346
|
source_connection_id : str
|
|
347
|
+
Unique identifier of the source connection to sync (UUID)
|
|
335
348
|
|
|
336
349
|
force_full_sync : typing.Optional[bool]
|
|
337
|
-
Force a full sync ignoring cursor data
|
|
350
|
+
Force a full sync ignoring cursor data. Only applies to continuous sync connections. Non-continuous connections always perform full syncs.
|
|
338
351
|
|
|
339
352
|
request_options : typing.Optional[RequestOptions]
|
|
340
353
|
Request-specific configuration.
|
|
@@ -342,20 +355,18 @@ class SourceConnectionsClient:
|
|
|
342
355
|
Returns
|
|
343
356
|
-------
|
|
344
357
|
SourceConnectionJob
|
|
345
|
-
|
|
358
|
+
Created sync job
|
|
346
359
|
|
|
347
360
|
Examples
|
|
348
361
|
--------
|
|
349
362
|
from airweave import AirweaveSDK
|
|
350
363
|
|
|
351
364
|
client = AirweaveSDK(
|
|
352
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
353
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
354
365
|
api_key="YOUR_API_KEY",
|
|
355
366
|
)
|
|
356
367
|
client.source_connections.run(
|
|
357
|
-
source_connection_id="
|
|
358
|
-
force_full_sync=
|
|
368
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
369
|
+
force_full_sync=False,
|
|
359
370
|
)
|
|
360
371
|
"""
|
|
361
372
|
_response = self._raw_client.run(
|
|
@@ -371,13 +382,26 @@ class SourceConnectionsClient:
|
|
|
371
382
|
request_options: typing.Optional[RequestOptions] = None,
|
|
372
383
|
) -> typing.List[SourceConnectionJob]:
|
|
373
384
|
"""
|
|
374
|
-
|
|
385
|
+
Retrieve the sync job history for a source connection.
|
|
386
|
+
|
|
387
|
+
Returns a list of sync jobs ordered by creation time (newest first). Each job
|
|
388
|
+
includes status, timing information, and entity counts.
|
|
389
|
+
|
|
390
|
+
Job statuses:
|
|
391
|
+
- **PENDING**: Job is queued and waiting to start
|
|
392
|
+
- **RUNNING**: Sync is actively pulling and processing data
|
|
393
|
+
- **COMPLETED**: Sync finished successfully
|
|
394
|
+
- **FAILED**: Sync encountered an error
|
|
395
|
+
- **CANCELLED**: Sync was manually cancelled
|
|
396
|
+
- **CANCELLING**: Cancellation has been requested
|
|
375
397
|
|
|
376
398
|
Parameters
|
|
377
399
|
----------
|
|
378
400
|
source_connection_id : str
|
|
401
|
+
Unique identifier of the source connection (UUID)
|
|
379
402
|
|
|
380
403
|
limit : typing.Optional[int]
|
|
404
|
+
Maximum number of jobs to return (1-1000)
|
|
381
405
|
|
|
382
406
|
request_options : typing.Optional[RequestOptions]
|
|
383
407
|
Request-specific configuration.
|
|
@@ -385,20 +409,18 @@ class SourceConnectionsClient:
|
|
|
385
409
|
Returns
|
|
386
410
|
-------
|
|
387
411
|
typing.List[SourceConnectionJob]
|
|
388
|
-
|
|
412
|
+
List of sync jobs
|
|
389
413
|
|
|
390
414
|
Examples
|
|
391
415
|
--------
|
|
392
416
|
from airweave import AirweaveSDK
|
|
393
417
|
|
|
394
418
|
client = AirweaveSDK(
|
|
395
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
396
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
397
419
|
api_key="YOUR_API_KEY",
|
|
398
420
|
)
|
|
399
421
|
client.source_connections.get_source_connection_jobs(
|
|
400
|
-
source_connection_id="
|
|
401
|
-
limit=
|
|
422
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
423
|
+
limit=100,
|
|
402
424
|
)
|
|
403
425
|
"""
|
|
404
426
|
_response = self._raw_client.get_source_connection_jobs(
|
|
@@ -410,17 +432,21 @@ class SourceConnectionsClient:
|
|
|
410
432
|
self, source_connection_id: str, job_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
411
433
|
) -> SourceConnectionJob:
|
|
412
434
|
"""
|
|
413
|
-
|
|
435
|
+
Request cancellation of a running sync job.
|
|
436
|
+
|
|
437
|
+
The job will be marked as CANCELLING and the sync workflow will stop at the
|
|
438
|
+
next checkpoint. Already-processed entities are retained.
|
|
414
439
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
the cancellation request.
|
|
440
|
+
**Note**: Cancellation is asynchronous. The job status will change to CANCELLED
|
|
441
|
+
once the workflow has fully stopped.
|
|
418
442
|
|
|
419
443
|
Parameters
|
|
420
444
|
----------
|
|
421
445
|
source_connection_id : str
|
|
446
|
+
Unique identifier of the source connection (UUID)
|
|
422
447
|
|
|
423
448
|
job_id : str
|
|
449
|
+
Unique identifier of the sync job to cancel (UUID)
|
|
424
450
|
|
|
425
451
|
request_options : typing.Optional[RequestOptions]
|
|
426
452
|
Request-specific configuration.
|
|
@@ -428,20 +454,18 @@ class SourceConnectionsClient:
|
|
|
428
454
|
Returns
|
|
429
455
|
-------
|
|
430
456
|
SourceConnectionJob
|
|
431
|
-
|
|
457
|
+
Job with cancellation status
|
|
432
458
|
|
|
433
459
|
Examples
|
|
434
460
|
--------
|
|
435
461
|
from airweave import AirweaveSDK
|
|
436
462
|
|
|
437
463
|
client = AirweaveSDK(
|
|
438
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
439
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
440
464
|
api_key="YOUR_API_KEY",
|
|
441
465
|
)
|
|
442
466
|
client.source_connections.cancel_job(
|
|
443
|
-
source_connection_id="
|
|
444
|
-
job_id="
|
|
467
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
468
|
+
job_id="660e8400-e29b-41d4-a716-446655440001",
|
|
445
469
|
)
|
|
446
470
|
"""
|
|
447
471
|
_response = self._raw_client.cancel_job(source_connection_id, job_id, request_options=request_options)
|
|
@@ -472,7 +496,13 @@ class AsyncSourceConnectionsClient:
|
|
|
472
496
|
request_options: typing.Optional[RequestOptions] = None,
|
|
473
497
|
) -> typing.List[SourceConnectionListItem]:
|
|
474
498
|
"""
|
|
475
|
-
|
|
499
|
+
Retrieve all source connections for your organization.
|
|
500
|
+
|
|
501
|
+
Returns a lightweight list of source connections with essential fields for
|
|
502
|
+
display and navigation. Use the collection filter to see connections within
|
|
503
|
+
a specific collection.
|
|
504
|
+
|
|
505
|
+
For full connection details including sync history, use the GET /{id} endpoint.
|
|
476
506
|
|
|
477
507
|
Parameters
|
|
478
508
|
----------
|
|
@@ -480,8 +510,10 @@ class AsyncSourceConnectionsClient:
|
|
|
480
510
|
Filter by collection readable ID
|
|
481
511
|
|
|
482
512
|
skip : typing.Optional[int]
|
|
513
|
+
Number of connections to skip for pagination
|
|
483
514
|
|
|
484
515
|
limit : typing.Optional[int]
|
|
516
|
+
Maximum number of connections to return (1-1000)
|
|
485
517
|
|
|
486
518
|
request_options : typing.Optional[RequestOptions]
|
|
487
519
|
Request-specific configuration.
|
|
@@ -489,7 +521,7 @@ class AsyncSourceConnectionsClient:
|
|
|
489
521
|
Returns
|
|
490
522
|
-------
|
|
491
523
|
typing.List[SourceConnectionListItem]
|
|
492
|
-
|
|
524
|
+
List of source connections
|
|
493
525
|
|
|
494
526
|
Examples
|
|
495
527
|
--------
|
|
@@ -498,8 +530,6 @@ class AsyncSourceConnectionsClient:
|
|
|
498
530
|
from airweave import AsyncAirweaveSDK
|
|
499
531
|
|
|
500
532
|
client = AsyncAirweaveSDK(
|
|
501
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
502
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
503
533
|
api_key="YOUR_API_KEY",
|
|
504
534
|
)
|
|
505
535
|
|
|
@@ -507,8 +537,8 @@ class AsyncSourceConnectionsClient:
|
|
|
507
537
|
async def main() -> None:
|
|
508
538
|
await client.source_connections.list(
|
|
509
539
|
collection="collection",
|
|
510
|
-
skip=
|
|
511
|
-
limit=
|
|
540
|
+
skip=0,
|
|
541
|
+
limit=100,
|
|
512
542
|
)
|
|
513
543
|
|
|
514
544
|
|
|
@@ -534,45 +564,42 @@ class AsyncSourceConnectionsClient:
|
|
|
534
564
|
request_options: typing.Optional[RequestOptions] = None,
|
|
535
565
|
) -> SourceConnection:
|
|
536
566
|
"""
|
|
537
|
-
Create a new source connection.
|
|
567
|
+
Create a new source connection to sync data from an external source.
|
|
538
568
|
|
|
539
|
-
The authentication
|
|
540
|
-
- DirectAuthentication: Immediate creation with provided credentials
|
|
541
|
-
- OAuthBrowserAuthentication: Returns shell with authentication URL
|
|
542
|
-
- OAuthTokenAuthentication: Immediate creation with provided token
|
|
543
|
-
- AuthProviderAuthentication: Using external auth provider
|
|
569
|
+
The authentication method determines the creation flow:
|
|
544
570
|
|
|
545
|
-
|
|
546
|
-
|
|
571
|
+
- **Direct**: Provide credentials (API key, token) directly. Connection is created immediately.
|
|
572
|
+
- **OAuth Browser**: Returns a connection with an `auth_url` to redirect users for authentication.
|
|
573
|
+
- **OAuth Token**: Provide an existing OAuth token. Connection is created immediately.
|
|
574
|
+
- **Auth Provider**: Use a pre-configured auth provider (e.g., Composio, Pipedream).
|
|
547
575
|
|
|
548
|
-
|
|
549
|
-
- True for: direct, oauth_token, auth_provider
|
|
550
|
-
- False for: oauth_browser, oauth_byoc (these sync after authentication)
|
|
576
|
+
After successful authentication, data sync can begin automatically or on-demand.
|
|
551
577
|
|
|
552
578
|
Parameters
|
|
553
579
|
----------
|
|
554
580
|
short_name : str
|
|
555
|
-
Source identifier (e.g., 'slack', 'github')
|
|
581
|
+
Source type identifier (e.g., 'slack', 'github', 'notion')
|
|
556
582
|
|
|
557
583
|
readable_collection_id : str
|
|
558
|
-
|
|
584
|
+
The readable ID of the collection to add this connection to
|
|
559
585
|
|
|
560
586
|
name : typing.Optional[str]
|
|
561
|
-
|
|
587
|
+
Display name for the connection. If not provided, defaults to '{Source Name} Connection'.
|
|
562
588
|
|
|
563
589
|
description : typing.Optional[str]
|
|
564
|
-
|
|
590
|
+
Optional description of what this connection is used for
|
|
565
591
|
|
|
566
592
|
config : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
567
|
-
Source-specific configuration
|
|
593
|
+
Source-specific configuration (e.g., repository name, filters)
|
|
568
594
|
|
|
569
595
|
schedule : typing.Optional[ScheduleConfig]
|
|
596
|
+
Optional sync schedule configuration
|
|
570
597
|
|
|
571
598
|
sync_immediately : typing.Optional[bool]
|
|
572
599
|
Run initial sync after creation. Defaults to True for direct/token/auth_provider, False for OAuth browser/BYOC flows (which sync after authentication)
|
|
573
600
|
|
|
574
601
|
authentication : typing.Optional[Authentication]
|
|
575
|
-
Authentication
|
|
602
|
+
Authentication configuration. Type is auto-detected from provided fields.
|
|
576
603
|
|
|
577
604
|
redirect_url : typing.Optional[str]
|
|
578
605
|
URL to redirect to after OAuth flow completes (only used for OAuth flows)
|
|
@@ -583,7 +610,7 @@ class AsyncSourceConnectionsClient:
|
|
|
583
610
|
Returns
|
|
584
611
|
-------
|
|
585
612
|
SourceConnection
|
|
586
|
-
|
|
613
|
+
Created source connection
|
|
587
614
|
|
|
588
615
|
Examples
|
|
589
616
|
--------
|
|
@@ -592,16 +619,14 @@ class AsyncSourceConnectionsClient:
|
|
|
592
619
|
from airweave import AsyncAirweaveSDK
|
|
593
620
|
|
|
594
621
|
client = AsyncAirweaveSDK(
|
|
595
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
596
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
597
622
|
api_key="YOUR_API_KEY",
|
|
598
623
|
)
|
|
599
624
|
|
|
600
625
|
|
|
601
626
|
async def main() -> None:
|
|
602
627
|
await client.source_connections.create(
|
|
603
|
-
short_name="
|
|
604
|
-
readable_collection_id="
|
|
628
|
+
short_name="github",
|
|
629
|
+
readable_collection_id="customer-support-tickets-x7k9m",
|
|
605
630
|
)
|
|
606
631
|
|
|
607
632
|
|
|
@@ -625,11 +650,18 @@ class AsyncSourceConnectionsClient:
|
|
|
625
650
|
self, source_connection_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
626
651
|
) -> SourceConnection:
|
|
627
652
|
"""
|
|
628
|
-
|
|
653
|
+
Retrieve details of a specific source connection.
|
|
654
|
+
|
|
655
|
+
Returns complete information about the connection including:
|
|
656
|
+
- Configuration settings
|
|
657
|
+
- Authentication status
|
|
658
|
+
- Sync schedule and history
|
|
659
|
+
- Entity statistics
|
|
629
660
|
|
|
630
661
|
Parameters
|
|
631
662
|
----------
|
|
632
663
|
source_connection_id : str
|
|
664
|
+
Unique identifier of the source connection (UUID)
|
|
633
665
|
|
|
634
666
|
request_options : typing.Optional[RequestOptions]
|
|
635
667
|
Request-specific configuration.
|
|
@@ -637,7 +669,7 @@ class AsyncSourceConnectionsClient:
|
|
|
637
669
|
Returns
|
|
638
670
|
-------
|
|
639
671
|
SourceConnection
|
|
640
|
-
|
|
672
|
+
Source connection details
|
|
641
673
|
|
|
642
674
|
Examples
|
|
643
675
|
--------
|
|
@@ -646,15 +678,13 @@ class AsyncSourceConnectionsClient:
|
|
|
646
678
|
from airweave import AsyncAirweaveSDK
|
|
647
679
|
|
|
648
680
|
client = AsyncAirweaveSDK(
|
|
649
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
650
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
651
681
|
api_key="YOUR_API_KEY",
|
|
652
682
|
)
|
|
653
683
|
|
|
654
684
|
|
|
655
685
|
async def main() -> None:
|
|
656
686
|
await client.source_connections.get(
|
|
657
|
-
source_connection_id="
|
|
687
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
658
688
|
)
|
|
659
689
|
|
|
660
690
|
|
|
@@ -667,11 +697,19 @@ class AsyncSourceConnectionsClient:
|
|
|
667
697
|
self, source_connection_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
668
698
|
) -> SourceConnection:
|
|
669
699
|
"""
|
|
670
|
-
|
|
700
|
+
Permanently delete a source connection and all its synced data.
|
|
701
|
+
|
|
702
|
+
This operation:
|
|
703
|
+
- Removes all entities synced from this source from the vector database
|
|
704
|
+
- Cancels any scheduled or running sync jobs
|
|
705
|
+
- Deletes the connection configuration and credentials
|
|
706
|
+
|
|
707
|
+
**Warning**: This action cannot be undone. All synced data will be permanently deleted.
|
|
671
708
|
|
|
672
709
|
Parameters
|
|
673
710
|
----------
|
|
674
711
|
source_connection_id : str
|
|
712
|
+
Unique identifier of the source connection to delete (UUID)
|
|
675
713
|
|
|
676
714
|
request_options : typing.Optional[RequestOptions]
|
|
677
715
|
Request-specific configuration.
|
|
@@ -679,7 +717,7 @@ class AsyncSourceConnectionsClient:
|
|
|
679
717
|
Returns
|
|
680
718
|
-------
|
|
681
719
|
SourceConnection
|
|
682
|
-
|
|
720
|
+
Deleted source connection
|
|
683
721
|
|
|
684
722
|
Examples
|
|
685
723
|
--------
|
|
@@ -688,15 +726,13 @@ class AsyncSourceConnectionsClient:
|
|
|
688
726
|
from airweave import AsyncAirweaveSDK
|
|
689
727
|
|
|
690
728
|
client = AsyncAirweaveSDK(
|
|
691
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
692
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
693
729
|
api_key="YOUR_API_KEY",
|
|
694
730
|
)
|
|
695
731
|
|
|
696
732
|
|
|
697
733
|
async def main() -> None:
|
|
698
734
|
await client.source_connections.delete(
|
|
699
|
-
source_connection_id="
|
|
735
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
700
736
|
)
|
|
701
737
|
|
|
702
738
|
|
|
@@ -717,29 +753,35 @@ class AsyncSourceConnectionsClient:
|
|
|
717
753
|
request_options: typing.Optional[RequestOptions] = None,
|
|
718
754
|
) -> SourceConnection:
|
|
719
755
|
"""
|
|
720
|
-
Update
|
|
756
|
+
Update an existing source connection's configuration.
|
|
721
757
|
|
|
722
|
-
|
|
723
|
-
-
|
|
724
|
-
-
|
|
725
|
-
-
|
|
726
|
-
-
|
|
758
|
+
You can modify:
|
|
759
|
+
- **Name and description**: Display information
|
|
760
|
+
- **Configuration**: Source-specific settings (e.g., repository name, filters)
|
|
761
|
+
- **Schedule**: Cron expression for automatic syncs
|
|
762
|
+
- **Authentication**: Update credentials (direct auth only)
|
|
763
|
+
|
|
764
|
+
Only include the fields you want to change; omitted fields retain their current values.
|
|
727
765
|
|
|
728
766
|
Parameters
|
|
729
767
|
----------
|
|
730
768
|
source_connection_id : str
|
|
769
|
+
Unique identifier of the source connection to update (UUID)
|
|
731
770
|
|
|
732
771
|
name : typing.Optional[str]
|
|
772
|
+
Updated display name for the connection
|
|
733
773
|
|
|
734
774
|
description : typing.Optional[str]
|
|
775
|
+
Updated description
|
|
735
776
|
|
|
736
777
|
config : typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]
|
|
737
|
-
|
|
778
|
+
Updated source-specific configuration
|
|
738
779
|
|
|
739
780
|
schedule : typing.Optional[ScheduleConfig]
|
|
781
|
+
Updated sync schedule configuration
|
|
740
782
|
|
|
741
783
|
authentication : typing.Optional[Authentication]
|
|
742
|
-
|
|
784
|
+
Updated authentication credentials (direct auth only)
|
|
743
785
|
|
|
744
786
|
request_options : typing.Optional[RequestOptions]
|
|
745
787
|
Request-specific configuration.
|
|
@@ -747,7 +789,7 @@ class AsyncSourceConnectionsClient:
|
|
|
747
789
|
Returns
|
|
748
790
|
-------
|
|
749
791
|
SourceConnection
|
|
750
|
-
|
|
792
|
+
Updated source connection
|
|
751
793
|
|
|
752
794
|
Examples
|
|
753
795
|
--------
|
|
@@ -756,15 +798,13 @@ class AsyncSourceConnectionsClient:
|
|
|
756
798
|
from airweave import AsyncAirweaveSDK
|
|
757
799
|
|
|
758
800
|
client = AsyncAirweaveSDK(
|
|
759
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
760
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
761
801
|
api_key="YOUR_API_KEY",
|
|
762
802
|
)
|
|
763
803
|
|
|
764
804
|
|
|
765
805
|
async def main() -> None:
|
|
766
806
|
await client.source_connections.update(
|
|
767
|
-
source_connection_id="
|
|
807
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
768
808
|
)
|
|
769
809
|
|
|
770
810
|
|
|
@@ -789,25 +829,22 @@ class AsyncSourceConnectionsClient:
|
|
|
789
829
|
request_options: typing.Optional[RequestOptions] = None,
|
|
790
830
|
) -> SourceConnectionJob:
|
|
791
831
|
"""
|
|
792
|
-
Trigger a
|
|
832
|
+
Trigger a data synchronization job for a source connection.
|
|
793
833
|
|
|
794
|
-
|
|
834
|
+
Starts an asynchronous sync job that pulls the latest data from the connected
|
|
835
|
+
source. The job runs in the background and you can monitor its progress using
|
|
836
|
+
the jobs endpoint.
|
|
795
837
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
source_connection_id: ID of the source connection to run
|
|
799
|
-
ctx: API context with organization and user information
|
|
800
|
-
guard_rail: Guard rail service for usage limits
|
|
801
|
-
force_full_sync: If True, forces a full sync with orphaned entity cleanup
|
|
802
|
-
for continuous syncs. Raises 400 error if used on
|
|
803
|
-
non-continuous syncs (which are always full syncs).
|
|
838
|
+
For continuous sync connections, this performs an incremental sync by default.
|
|
839
|
+
Use `force_full_sync=true` to perform a complete re-sync of all data.
|
|
804
840
|
|
|
805
841
|
Parameters
|
|
806
842
|
----------
|
|
807
843
|
source_connection_id : str
|
|
844
|
+
Unique identifier of the source connection to sync (UUID)
|
|
808
845
|
|
|
809
846
|
force_full_sync : typing.Optional[bool]
|
|
810
|
-
Force a full sync ignoring cursor data
|
|
847
|
+
Force a full sync ignoring cursor data. Only applies to continuous sync connections. Non-continuous connections always perform full syncs.
|
|
811
848
|
|
|
812
849
|
request_options : typing.Optional[RequestOptions]
|
|
813
850
|
Request-specific configuration.
|
|
@@ -815,7 +852,7 @@ class AsyncSourceConnectionsClient:
|
|
|
815
852
|
Returns
|
|
816
853
|
-------
|
|
817
854
|
SourceConnectionJob
|
|
818
|
-
|
|
855
|
+
Created sync job
|
|
819
856
|
|
|
820
857
|
Examples
|
|
821
858
|
--------
|
|
@@ -824,16 +861,14 @@ class AsyncSourceConnectionsClient:
|
|
|
824
861
|
from airweave import AsyncAirweaveSDK
|
|
825
862
|
|
|
826
863
|
client = AsyncAirweaveSDK(
|
|
827
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
828
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
829
864
|
api_key="YOUR_API_KEY",
|
|
830
865
|
)
|
|
831
866
|
|
|
832
867
|
|
|
833
868
|
async def main() -> None:
|
|
834
869
|
await client.source_connections.run(
|
|
835
|
-
source_connection_id="
|
|
836
|
-
force_full_sync=
|
|
870
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
871
|
+
force_full_sync=False,
|
|
837
872
|
)
|
|
838
873
|
|
|
839
874
|
|
|
@@ -852,13 +887,26 @@ class AsyncSourceConnectionsClient:
|
|
|
852
887
|
request_options: typing.Optional[RequestOptions] = None,
|
|
853
888
|
) -> typing.List[SourceConnectionJob]:
|
|
854
889
|
"""
|
|
855
|
-
|
|
890
|
+
Retrieve the sync job history for a source connection.
|
|
891
|
+
|
|
892
|
+
Returns a list of sync jobs ordered by creation time (newest first). Each job
|
|
893
|
+
includes status, timing information, and entity counts.
|
|
894
|
+
|
|
895
|
+
Job statuses:
|
|
896
|
+
- **PENDING**: Job is queued and waiting to start
|
|
897
|
+
- **RUNNING**: Sync is actively pulling and processing data
|
|
898
|
+
- **COMPLETED**: Sync finished successfully
|
|
899
|
+
- **FAILED**: Sync encountered an error
|
|
900
|
+
- **CANCELLED**: Sync was manually cancelled
|
|
901
|
+
- **CANCELLING**: Cancellation has been requested
|
|
856
902
|
|
|
857
903
|
Parameters
|
|
858
904
|
----------
|
|
859
905
|
source_connection_id : str
|
|
906
|
+
Unique identifier of the source connection (UUID)
|
|
860
907
|
|
|
861
908
|
limit : typing.Optional[int]
|
|
909
|
+
Maximum number of jobs to return (1-1000)
|
|
862
910
|
|
|
863
911
|
request_options : typing.Optional[RequestOptions]
|
|
864
912
|
Request-specific configuration.
|
|
@@ -866,7 +914,7 @@ class AsyncSourceConnectionsClient:
|
|
|
866
914
|
Returns
|
|
867
915
|
-------
|
|
868
916
|
typing.List[SourceConnectionJob]
|
|
869
|
-
|
|
917
|
+
List of sync jobs
|
|
870
918
|
|
|
871
919
|
Examples
|
|
872
920
|
--------
|
|
@@ -875,16 +923,14 @@ class AsyncSourceConnectionsClient:
|
|
|
875
923
|
from airweave import AsyncAirweaveSDK
|
|
876
924
|
|
|
877
925
|
client = AsyncAirweaveSDK(
|
|
878
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
879
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
880
926
|
api_key="YOUR_API_KEY",
|
|
881
927
|
)
|
|
882
928
|
|
|
883
929
|
|
|
884
930
|
async def main() -> None:
|
|
885
931
|
await client.source_connections.get_source_connection_jobs(
|
|
886
|
-
source_connection_id="
|
|
887
|
-
limit=
|
|
932
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
933
|
+
limit=100,
|
|
888
934
|
)
|
|
889
935
|
|
|
890
936
|
|
|
@@ -899,17 +945,21 @@ class AsyncSourceConnectionsClient:
|
|
|
899
945
|
self, source_connection_id: str, job_id: str, *, request_options: typing.Optional[RequestOptions] = None
|
|
900
946
|
) -> SourceConnectionJob:
|
|
901
947
|
"""
|
|
902
|
-
|
|
948
|
+
Request cancellation of a running sync job.
|
|
949
|
+
|
|
950
|
+
The job will be marked as CANCELLING and the sync workflow will stop at the
|
|
951
|
+
next checkpoint. Already-processed entities are retained.
|
|
903
952
|
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
the cancellation request.
|
|
953
|
+
**Note**: Cancellation is asynchronous. The job status will change to CANCELLED
|
|
954
|
+
once the workflow has fully stopped.
|
|
907
955
|
|
|
908
956
|
Parameters
|
|
909
957
|
----------
|
|
910
958
|
source_connection_id : str
|
|
959
|
+
Unique identifier of the source connection (UUID)
|
|
911
960
|
|
|
912
961
|
job_id : str
|
|
962
|
+
Unique identifier of the sync job to cancel (UUID)
|
|
913
963
|
|
|
914
964
|
request_options : typing.Optional[RequestOptions]
|
|
915
965
|
Request-specific configuration.
|
|
@@ -917,7 +967,7 @@ class AsyncSourceConnectionsClient:
|
|
|
917
967
|
Returns
|
|
918
968
|
-------
|
|
919
969
|
SourceConnectionJob
|
|
920
|
-
|
|
970
|
+
Job with cancellation status
|
|
921
971
|
|
|
922
972
|
Examples
|
|
923
973
|
--------
|
|
@@ -926,16 +976,14 @@ class AsyncSourceConnectionsClient:
|
|
|
926
976
|
from airweave import AsyncAirweaveSDK
|
|
927
977
|
|
|
928
978
|
client = AsyncAirweaveSDK(
|
|
929
|
-
framework_name="YOUR_FRAMEWORK_NAME",
|
|
930
|
-
framework_version="YOUR_FRAMEWORK_VERSION",
|
|
931
979
|
api_key="YOUR_API_KEY",
|
|
932
980
|
)
|
|
933
981
|
|
|
934
982
|
|
|
935
983
|
async def main() -> None:
|
|
936
984
|
await client.source_connections.cancel_job(
|
|
937
|
-
source_connection_id="
|
|
938
|
-
job_id="
|
|
985
|
+
source_connection_id="550e8400-e29b-41d4-a716-446655440000",
|
|
986
|
+
job_id="660e8400-e29b-41d4-a716-446655440001",
|
|
939
987
|
)
|
|
940
988
|
|
|
941
989
|
|