robosystems-client 0.2.2__py3-none-any.whl → 0.2.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 robosystems-client might be problematic. Click here for more details.

Files changed (121) hide show
  1. robosystems_client/api/agent/auto_select_agent.py +1 -41
  2. robosystems_client/api/agent/batch_process_queries.py +1 -41
  3. robosystems_client/api/agent/execute_specific_agent.py +1 -41
  4. robosystems_client/api/agent/get_agent_metadata.py +5 -49
  5. robosystems_client/api/agent/list_agents.py +4 -42
  6. robosystems_client/api/agent/recommend_agent.py +5 -45
  7. robosystems_client/api/auth/generate_sso_token.py +0 -18
  8. robosystems_client/api/auth/get_current_auth_user.py +14 -74
  9. robosystems_client/api/auth/logout_user.py +14 -50
  10. robosystems_client/api/auth/refresh_auth_session.py +14 -50
  11. robosystems_client/api/auth/resend_verification_email.py +14 -74
  12. robosystems_client/api/backup/create_backup.py +5 -45
  13. robosystems_client/api/backup/get_backup_download_url.py +4 -42
  14. robosystems_client/api/backup/get_backup_stats.py +5 -49
  15. robosystems_client/api/backup/list_backups.py +4 -42
  16. robosystems_client/api/backup/restore_backup.py +5 -45
  17. robosystems_client/api/connections/create_connection.py +5 -45
  18. robosystems_client/api/connections/create_link_token.py +5 -45
  19. robosystems_client/api/connections/delete_connection.py +5 -49
  20. robosystems_client/api/connections/exchange_link_token.py +5 -45
  21. robosystems_client/api/connections/get_connection.py +5 -49
  22. robosystems_client/api/connections/get_connection_options.py +5 -49
  23. robosystems_client/api/connections/init_o_auth.py +5 -45
  24. robosystems_client/api/connections/list_connections.py +4 -42
  25. robosystems_client/api/connections/oauth_callback.py +5 -45
  26. robosystems_client/api/connections/sync_connection.py +5 -45
  27. robosystems_client/api/graph_analytics/get_graph_metrics.py +5 -49
  28. robosystems_client/api/graph_analytics/get_graph_usage_stats.py +4 -42
  29. robosystems_client/api/graph_billing/get_current_graph_bill.py +5 -49
  30. robosystems_client/api/graph_billing/get_graph_billing_history.py +4 -42
  31. robosystems_client/api/graph_billing/get_graph_monthly_bill.py +5 -49
  32. robosystems_client/api/graph_billing/get_graph_usage_details.py +4 -42
  33. robosystems_client/api/graph_credits/check_credit_balance.py +0 -38
  34. robosystems_client/api/graph_credits/check_storage_limits.py +1 -45
  35. robosystems_client/api/graph_credits/get_credit_summary.py +1 -45
  36. robosystems_client/api/graph_credits/get_storage_usage.py +0 -38
  37. robosystems_client/api/graph_credits/list_credit_transactions.py +4 -42
  38. robosystems_client/api/graph_health/get_database_health.py +5 -49
  39. robosystems_client/api/graph_info/get_database_info.py +5 -49
  40. robosystems_client/api/graph_limits/get_graph_limits.py +5 -49
  41. robosystems_client/api/graphs/create_graph.py +21 -57
  42. robosystems_client/api/graphs/get_available_extensions.py +131 -15
  43. robosystems_client/api/graphs/get_graphs.py +154 -79
  44. robosystems_client/api/graphs/select_graph.py +117 -49
  45. robosystems_client/api/mcp/call_mcp_tool.py +24 -47
  46. robosystems_client/api/mcp/list_mcp_tools.py +13 -61
  47. robosystems_client/api/operations/cancel_operation.py +1 -45
  48. robosystems_client/api/operations/get_operation_status.py +1 -45
  49. robosystems_client/api/query/execute_cypher_query.py +68 -57
  50. robosystems_client/api/schema/export_graph_schema.py +223 -65
  51. robosystems_client/api/schema/get_graph_schema.py +137 -79
  52. robosystems_client/api/schema/validate_schema.py +5 -45
  53. robosystems_client/api/subgraphs/create_subgraph.py +5 -45
  54. robosystems_client/api/subgraphs/delete_subgraph.py +5 -45
  55. robosystems_client/api/subgraphs/get_subgraph_info.py +5 -49
  56. robosystems_client/api/subgraphs/get_subgraph_quota.py +5 -49
  57. robosystems_client/api/subgraphs/list_subgraphs.py +5 -49
  58. robosystems_client/api/tables/delete_file.py +317 -0
  59. robosystems_client/api/tables/get_file_info.py +249 -0
  60. robosystems_client/api/tables/get_upload_url.py +352 -0
  61. robosystems_client/api/tables/ingest_tables.py +428 -0
  62. robosystems_client/api/tables/list_table_files.py +329 -0
  63. robosystems_client/api/tables/list_tables.py +316 -0
  64. robosystems_client/api/tables/query_tables.py +431 -0
  65. robosystems_client/api/tables/update_file_status.py +395 -0
  66. robosystems_client/api/user/create_user_api_key.py +1 -41
  67. robosystems_client/api/user/get_all_credit_summaries.py +14 -111
  68. robosystems_client/api/user/get_current_user.py +14 -75
  69. robosystems_client/api/user/list_user_api_keys.py +14 -75
  70. robosystems_client/api/user/revoke_user_api_key.py +1 -45
  71. robosystems_client/api/user/update_user.py +1 -41
  72. robosystems_client/api/user/update_user_api_key.py +1 -41
  73. robosystems_client/api/user/update_user_password.py +1 -41
  74. robosystems_client/api/user_analytics/get_detailed_user_analytics.py +0 -38
  75. robosystems_client/api/user_analytics/get_user_usage_overview.py +14 -75
  76. robosystems_client/api/user_limits/get_all_shared_repository_limits.py +14 -105
  77. robosystems_client/api/user_limits/get_shared_repository_limits.py +1 -45
  78. robosystems_client/api/user_limits/get_user_limits.py +14 -75
  79. robosystems_client/api/user_limits/get_user_usage.py +14 -75
  80. robosystems_client/api/user_subscriptions/cancel_shared_repository_subscription.py +1 -45
  81. robosystems_client/api/user_subscriptions/get_repository_credits.py +1 -45
  82. robosystems_client/api/user_subscriptions/get_shared_repository_credits.py +14 -75
  83. robosystems_client/api/user_subscriptions/get_user_shared_subscriptions.py +0 -38
  84. robosystems_client/api/user_subscriptions/subscribe_to_shared_repository.py +1 -41
  85. robosystems_client/api/user_subscriptions/upgrade_shared_repository_subscription.py +1 -41
  86. robosystems_client/extensions/__init__.py +8 -1
  87. robosystems_client/extensions/auth_integration.py +1 -2
  88. robosystems_client/extensions/graph_client.py +5 -0
  89. robosystems_client/extensions/query_client.py +3 -2
  90. robosystems_client/extensions/sse_client.py +1 -1
  91. robosystems_client/extensions/table_ingest_client.py +36 -40
  92. robosystems_client/extensions/utils.py +2 -2
  93. robosystems_client/models/__init__.py +17 -21
  94. robosystems_client/models/create_graph_request.py +15 -3
  95. robosystems_client/models/cypher_query_request.py +5 -22
  96. robosystems_client/models/{delete_file_v1_graphs_graph_id_tables_files_file_id_delete_response_delete_file_v1_graphs_graph_id_tables_files_file_id_delete.py → delete_file_response.py} +45 -9
  97. robosystems_client/models/file_info.py +169 -0
  98. robosystems_client/models/file_status_update.py +41 -0
  99. robosystems_client/models/get_file_info_response.py +205 -0
  100. robosystems_client/models/list_table_files_response.py +105 -0
  101. robosystems_client/models/schema_export_response.py +4 -2
  102. robosystems_client/models/schema_info_response.py +77 -0
  103. robosystems_client/models/{get_graph_schema_response_getgraphschema.py → schema_info_response_schema.py} +6 -6
  104. robosystems_client/models/schema_validation_response.py +7 -6
  105. robosystems_client/models/table_query_request.py +37 -2
  106. robosystems_client/models/{get_file_info_v1_graphs_graph_id_tables_files_file_id_get_response_get_file_info_v1_graphs_graph_id_tables_files_file_id_get.py → update_file_status_response_updatefilestatus.py} +5 -8
  107. {robosystems_client-0.2.2.dist-info → robosystems_client-0.2.4.dist-info}/METADATA +2 -4
  108. {robosystems_client-0.2.2.dist-info → robosystems_client-0.2.4.dist-info}/RECORD +110 -108
  109. robosystems_client/api/tables/delete_file_v1_graphs_graph_id_tables_files_file_id_delete.py +0 -287
  110. robosystems_client/api/tables/get_file_info_v1_graphs_graph_id_tables_files_file_id_get.py +0 -283
  111. robosystems_client/api/tables/get_upload_url_v1_graphs_graph_id_tables_table_name_files_post.py +0 -260
  112. robosystems_client/api/tables/ingest_tables_v1_graphs_graph_id_tables_ingest_post.py +0 -251
  113. robosystems_client/api/tables/list_table_files_v1_graphs_graph_id_tables_table_name_files_get.py +0 -283
  114. robosystems_client/api/tables/list_tables_v1_graphs_graph_id_tables_get.py +0 -224
  115. robosystems_client/api/tables/query_tables_v1_graphs_graph_id_tables_query_post.py +0 -247
  116. robosystems_client/api/tables/update_file_v1_graphs_graph_id_tables_files_file_id_patch.py +0 -306
  117. robosystems_client/models/file_update_request.py +0 -62
  118. robosystems_client/models/list_table_files_v1_graphs_graph_id_tables_table_name_files_get_response_list_table_files_v1_graphs_graph_id_tables_table_name_files_get.py +0 -47
  119. robosystems_client/models/update_file_v1_graphs_graph_id_tables_files_file_id_patch_response_update_file_v1_graphs_graph_id_tables_files_file_id_patch.py +0 -47
  120. {robosystems_client-0.2.2.dist-info → robosystems_client-0.2.4.dist-info}/WHEEL +0 -0
  121. {robosystems_client-0.2.2.dist-info → robosystems_client-0.2.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,428 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, Optional, Union, cast
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.bulk_ingest_request import BulkIngestRequest
9
+ from ...models.bulk_ingest_response import BulkIngestResponse
10
+ from ...models.error_response import ErrorResponse
11
+ from ...models.http_validation_error import HTTPValidationError
12
+ from ...types import Response
13
+
14
+
15
+ def _get_kwargs(
16
+ graph_id: str,
17
+ *,
18
+ body: BulkIngestRequest,
19
+ ) -> dict[str, Any]:
20
+ headers: dict[str, Any] = {}
21
+
22
+ _kwargs: dict[str, Any] = {
23
+ "method": "post",
24
+ "url": f"/v1/graphs/{graph_id}/tables/ingest",
25
+ }
26
+
27
+ _kwargs["json"] = body.to_dict()
28
+
29
+ headers["Content-Type"] = "application/json"
30
+
31
+ _kwargs["headers"] = headers
32
+ return _kwargs
33
+
34
+
35
+ def _parse_response(
36
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
37
+ ) -> Optional[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]:
38
+ if response.status_code == 200:
39
+ response_200 = BulkIngestResponse.from_dict(response.json())
40
+
41
+ return response_200
42
+
43
+ if response.status_code == 401:
44
+ response_401 = cast(Any, None)
45
+ return response_401
46
+
47
+ if response.status_code == 403:
48
+ response_403 = ErrorResponse.from_dict(response.json())
49
+
50
+ return response_403
51
+
52
+ if response.status_code == 404:
53
+ response_404 = ErrorResponse.from_dict(response.json())
54
+
55
+ return response_404
56
+
57
+ if response.status_code == 409:
58
+ response_409 = ErrorResponse.from_dict(response.json())
59
+
60
+ return response_409
61
+
62
+ if response.status_code == 422:
63
+ response_422 = HTTPValidationError.from_dict(response.json())
64
+
65
+ return response_422
66
+
67
+ if response.status_code == 500:
68
+ response_500 = ErrorResponse.from_dict(response.json())
69
+
70
+ return response_500
71
+
72
+ if client.raise_on_unexpected_status:
73
+ raise errors.UnexpectedStatus(response.status_code, response.content)
74
+ else:
75
+ return None
76
+
77
+
78
+ def _build_response(
79
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
80
+ ) -> Response[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]:
81
+ return Response(
82
+ status_code=HTTPStatus(response.status_code),
83
+ content=response.content,
84
+ headers=response.headers,
85
+ parsed=_parse_response(client=client, response=response),
86
+ )
87
+
88
+
89
+ def sync_detailed(
90
+ graph_id: str,
91
+ *,
92
+ client: AuthenticatedClient,
93
+ body: BulkIngestRequest,
94
+ ) -> Response[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]:
95
+ """Ingest Tables to Graph
96
+
97
+ Load all files from S3 into DuckDB staging tables and ingest into Kuzu graph database.
98
+
99
+ Orchestrates the complete data pipeline from S3 staging files into the Kuzu graph database.
100
+ Processes all tables in a single bulk operation with comprehensive error handling and metrics.
101
+
102
+ **Use Cases:**
103
+ - Initial graph population from uploaded data
104
+ - Incremental data updates with new files
105
+ - Complete database rebuild from source files
106
+ - Recovery from failed ingestion attempts
107
+
108
+ **Workflow:**
109
+ 1. Upload data files via `POST /tables/{table_name}/files`
110
+ 2. Files are validated and marked as 'uploaded'
111
+ 3. Trigger ingestion: `POST /tables/ingest`
112
+ 4. DuckDB staging tables created from S3 patterns
113
+ 5. Data copied row-by-row from DuckDB to Kuzu
114
+ 6. Per-table results and metrics returned
115
+
116
+ **Rebuild Feature:**
117
+ Setting `rebuild=true` regenerates the entire graph database from scratch:
118
+ - Deletes existing Kuzu database
119
+ - Recreates with fresh schema from active GraphSchema
120
+ - Ingests all data files
121
+ - Safe operation - S3 is source of truth
122
+ - Useful for schema changes or data corrections
123
+ - Graph marked as 'rebuilding' during process
124
+
125
+ **Error Handling:**
126
+ - Per-table error isolation with `ignore_errors` flag
127
+ - Partial success support (some tables succeed, some fail)
128
+ - Detailed error reporting per table
129
+ - Graph status tracking throughout process
130
+ - Automatic failure recovery and cleanup
131
+
132
+ **Performance:**
133
+ - Processes all tables in sequence
134
+ - Each table timed independently
135
+ - Total execution metrics provided
136
+ - Scales to thousands of files
137
+ - Optimized for large datasets
138
+
139
+ **Concurrency Control:**
140
+ Only one ingestion can run per graph at a time. If another ingestion is in progress,
141
+ you'll receive a 409 Conflict error. The distributed lock automatically expires after
142
+ the configured TTL (default: 1 hour) to prevent deadlocks from failed ingestions.
143
+
144
+ **Important Notes:**
145
+ - Only files with 'uploaded' status are processed
146
+ - Tables with no uploaded files are skipped
147
+ - Use `ignore_errors=false` for strict validation
148
+ - Monitor progress via per-table results
149
+ - Check graph metadata for rebuild status
150
+ - Wait for current ingestion to complete before starting another
151
+ - Table ingestion is included - no credit consumption
152
+
153
+ Args:
154
+ graph_id (str):
155
+ body (BulkIngestRequest):
156
+
157
+ Raises:
158
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
159
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
160
+
161
+ Returns:
162
+ Response[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]
163
+ """
164
+
165
+ kwargs = _get_kwargs(
166
+ graph_id=graph_id,
167
+ body=body,
168
+ )
169
+
170
+ response = client.get_httpx_client().request(
171
+ **kwargs,
172
+ )
173
+
174
+ return _build_response(client=client, response=response)
175
+
176
+
177
+ def sync(
178
+ graph_id: str,
179
+ *,
180
+ client: AuthenticatedClient,
181
+ body: BulkIngestRequest,
182
+ ) -> Optional[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]:
183
+ """Ingest Tables to Graph
184
+
185
+ Load all files from S3 into DuckDB staging tables and ingest into Kuzu graph database.
186
+
187
+ Orchestrates the complete data pipeline from S3 staging files into the Kuzu graph database.
188
+ Processes all tables in a single bulk operation with comprehensive error handling and metrics.
189
+
190
+ **Use Cases:**
191
+ - Initial graph population from uploaded data
192
+ - Incremental data updates with new files
193
+ - Complete database rebuild from source files
194
+ - Recovery from failed ingestion attempts
195
+
196
+ **Workflow:**
197
+ 1. Upload data files via `POST /tables/{table_name}/files`
198
+ 2. Files are validated and marked as 'uploaded'
199
+ 3. Trigger ingestion: `POST /tables/ingest`
200
+ 4. DuckDB staging tables created from S3 patterns
201
+ 5. Data copied row-by-row from DuckDB to Kuzu
202
+ 6. Per-table results and metrics returned
203
+
204
+ **Rebuild Feature:**
205
+ Setting `rebuild=true` regenerates the entire graph database from scratch:
206
+ - Deletes existing Kuzu database
207
+ - Recreates with fresh schema from active GraphSchema
208
+ - Ingests all data files
209
+ - Safe operation - S3 is source of truth
210
+ - Useful for schema changes or data corrections
211
+ - Graph marked as 'rebuilding' during process
212
+
213
+ **Error Handling:**
214
+ - Per-table error isolation with `ignore_errors` flag
215
+ - Partial success support (some tables succeed, some fail)
216
+ - Detailed error reporting per table
217
+ - Graph status tracking throughout process
218
+ - Automatic failure recovery and cleanup
219
+
220
+ **Performance:**
221
+ - Processes all tables in sequence
222
+ - Each table timed independently
223
+ - Total execution metrics provided
224
+ - Scales to thousands of files
225
+ - Optimized for large datasets
226
+
227
+ **Concurrency Control:**
228
+ Only one ingestion can run per graph at a time. If another ingestion is in progress,
229
+ you'll receive a 409 Conflict error. The distributed lock automatically expires after
230
+ the configured TTL (default: 1 hour) to prevent deadlocks from failed ingestions.
231
+
232
+ **Important Notes:**
233
+ - Only files with 'uploaded' status are processed
234
+ - Tables with no uploaded files are skipped
235
+ - Use `ignore_errors=false` for strict validation
236
+ - Monitor progress via per-table results
237
+ - Check graph metadata for rebuild status
238
+ - Wait for current ingestion to complete before starting another
239
+ - Table ingestion is included - no credit consumption
240
+
241
+ Args:
242
+ graph_id (str):
243
+ body (BulkIngestRequest):
244
+
245
+ Raises:
246
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
247
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
248
+
249
+ Returns:
250
+ Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]
251
+ """
252
+
253
+ return sync_detailed(
254
+ graph_id=graph_id,
255
+ client=client,
256
+ body=body,
257
+ ).parsed
258
+
259
+
260
+ async def asyncio_detailed(
261
+ graph_id: str,
262
+ *,
263
+ client: AuthenticatedClient,
264
+ body: BulkIngestRequest,
265
+ ) -> Response[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]:
266
+ """Ingest Tables to Graph
267
+
268
+ Load all files from S3 into DuckDB staging tables and ingest into Kuzu graph database.
269
+
270
+ Orchestrates the complete data pipeline from S3 staging files into the Kuzu graph database.
271
+ Processes all tables in a single bulk operation with comprehensive error handling and metrics.
272
+
273
+ **Use Cases:**
274
+ - Initial graph population from uploaded data
275
+ - Incremental data updates with new files
276
+ - Complete database rebuild from source files
277
+ - Recovery from failed ingestion attempts
278
+
279
+ **Workflow:**
280
+ 1. Upload data files via `POST /tables/{table_name}/files`
281
+ 2. Files are validated and marked as 'uploaded'
282
+ 3. Trigger ingestion: `POST /tables/ingest`
283
+ 4. DuckDB staging tables created from S3 patterns
284
+ 5. Data copied row-by-row from DuckDB to Kuzu
285
+ 6. Per-table results and metrics returned
286
+
287
+ **Rebuild Feature:**
288
+ Setting `rebuild=true` regenerates the entire graph database from scratch:
289
+ - Deletes existing Kuzu database
290
+ - Recreates with fresh schema from active GraphSchema
291
+ - Ingests all data files
292
+ - Safe operation - S3 is source of truth
293
+ - Useful for schema changes or data corrections
294
+ - Graph marked as 'rebuilding' during process
295
+
296
+ **Error Handling:**
297
+ - Per-table error isolation with `ignore_errors` flag
298
+ - Partial success support (some tables succeed, some fail)
299
+ - Detailed error reporting per table
300
+ - Graph status tracking throughout process
301
+ - Automatic failure recovery and cleanup
302
+
303
+ **Performance:**
304
+ - Processes all tables in sequence
305
+ - Each table timed independently
306
+ - Total execution metrics provided
307
+ - Scales to thousands of files
308
+ - Optimized for large datasets
309
+
310
+ **Concurrency Control:**
311
+ Only one ingestion can run per graph at a time. If another ingestion is in progress,
312
+ you'll receive a 409 Conflict error. The distributed lock automatically expires after
313
+ the configured TTL (default: 1 hour) to prevent deadlocks from failed ingestions.
314
+
315
+ **Important Notes:**
316
+ - Only files with 'uploaded' status are processed
317
+ - Tables with no uploaded files are skipped
318
+ - Use `ignore_errors=false` for strict validation
319
+ - Monitor progress via per-table results
320
+ - Check graph metadata for rebuild status
321
+ - Wait for current ingestion to complete before starting another
322
+ - Table ingestion is included - no credit consumption
323
+
324
+ Args:
325
+ graph_id (str):
326
+ body (BulkIngestRequest):
327
+
328
+ Raises:
329
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
330
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
331
+
332
+ Returns:
333
+ Response[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]
334
+ """
335
+
336
+ kwargs = _get_kwargs(
337
+ graph_id=graph_id,
338
+ body=body,
339
+ )
340
+
341
+ response = await client.get_async_httpx_client().request(**kwargs)
342
+
343
+ return _build_response(client=client, response=response)
344
+
345
+
346
+ async def asyncio(
347
+ graph_id: str,
348
+ *,
349
+ client: AuthenticatedClient,
350
+ body: BulkIngestRequest,
351
+ ) -> Optional[Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]]:
352
+ """Ingest Tables to Graph
353
+
354
+ Load all files from S3 into DuckDB staging tables and ingest into Kuzu graph database.
355
+
356
+ Orchestrates the complete data pipeline from S3 staging files into the Kuzu graph database.
357
+ Processes all tables in a single bulk operation with comprehensive error handling and metrics.
358
+
359
+ **Use Cases:**
360
+ - Initial graph population from uploaded data
361
+ - Incremental data updates with new files
362
+ - Complete database rebuild from source files
363
+ - Recovery from failed ingestion attempts
364
+
365
+ **Workflow:**
366
+ 1. Upload data files via `POST /tables/{table_name}/files`
367
+ 2. Files are validated and marked as 'uploaded'
368
+ 3. Trigger ingestion: `POST /tables/ingest`
369
+ 4. DuckDB staging tables created from S3 patterns
370
+ 5. Data copied row-by-row from DuckDB to Kuzu
371
+ 6. Per-table results and metrics returned
372
+
373
+ **Rebuild Feature:**
374
+ Setting `rebuild=true` regenerates the entire graph database from scratch:
375
+ - Deletes existing Kuzu database
376
+ - Recreates with fresh schema from active GraphSchema
377
+ - Ingests all data files
378
+ - Safe operation - S3 is source of truth
379
+ - Useful for schema changes or data corrections
380
+ - Graph marked as 'rebuilding' during process
381
+
382
+ **Error Handling:**
383
+ - Per-table error isolation with `ignore_errors` flag
384
+ - Partial success support (some tables succeed, some fail)
385
+ - Detailed error reporting per table
386
+ - Graph status tracking throughout process
387
+ - Automatic failure recovery and cleanup
388
+
389
+ **Performance:**
390
+ - Processes all tables in sequence
391
+ - Each table timed independently
392
+ - Total execution metrics provided
393
+ - Scales to thousands of files
394
+ - Optimized for large datasets
395
+
396
+ **Concurrency Control:**
397
+ Only one ingestion can run per graph at a time. If another ingestion is in progress,
398
+ you'll receive a 409 Conflict error. The distributed lock automatically expires after
399
+ the configured TTL (default: 1 hour) to prevent deadlocks from failed ingestions.
400
+
401
+ **Important Notes:**
402
+ - Only files with 'uploaded' status are processed
403
+ - Tables with no uploaded files are skipped
404
+ - Use `ignore_errors=false` for strict validation
405
+ - Monitor progress via per-table results
406
+ - Check graph metadata for rebuild status
407
+ - Wait for current ingestion to complete before starting another
408
+ - Table ingestion is included - no credit consumption
409
+
410
+ Args:
411
+ graph_id (str):
412
+ body (BulkIngestRequest):
413
+
414
+ Raises:
415
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
416
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
417
+
418
+ Returns:
419
+ Union[Any, BulkIngestResponse, ErrorResponse, HTTPValidationError]
420
+ """
421
+
422
+ return (
423
+ await asyncio_detailed(
424
+ graph_id=graph_id,
425
+ client=client,
426
+ body=body,
427
+ )
428
+ ).parsed