robosystems-client 0.1.19__py3-none-any.whl → 0.2.1__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 (141) hide show
  1. robosystems_client/api/agent/auto_select_agent.py +9 -3
  2. robosystems_client/api/agent/batch_process_queries.py +8 -3
  3. robosystems_client/api/agent/execute_specific_agent.py +10 -3
  4. robosystems_client/api/agent/get_agent_metadata.py +3 -0
  5. robosystems_client/api/agent/list_agents.py +3 -0
  6. robosystems_client/api/agent/recommend_agent.py +3 -0
  7. robosystems_client/api/auth/check_password_strength.py +2 -0
  8. robosystems_client/api/auth/complete_sso_auth.py +3 -0
  9. robosystems_client/api/auth/forgot_password.py +6 -3
  10. robosystems_client/api/auth/generate_sso_token.py +3 -0
  11. robosystems_client/api/auth/get_captcha_config.py +1 -0
  12. robosystems_client/api/auth/get_current_auth_user.py +3 -0
  13. robosystems_client/api/auth/get_password_policy.py +1 -0
  14. robosystems_client/api/auth/login_user.py +7 -3
  15. robosystems_client/api/auth/logout_user.py +2 -0
  16. robosystems_client/api/auth/refresh_auth_session.py +3 -0
  17. robosystems_client/api/auth/register_user.py +11 -6
  18. robosystems_client/api/auth/resend_verification_email.py +8 -3
  19. robosystems_client/api/auth/reset_password.py +3 -0
  20. robosystems_client/api/auth/sso_token_exchange.py +7 -3
  21. robosystems_client/api/auth/validate_reset_token.py +2 -0
  22. robosystems_client/api/auth/verify_email.py +3 -0
  23. robosystems_client/api/backup/create_backup.py +13 -7
  24. robosystems_client/api/backup/get_backup_download_url.py +8 -3
  25. robosystems_client/api/backup/get_backup_stats.py +2 -0
  26. robosystems_client/api/backup/list_backups.py +6 -4
  27. robosystems_client/api/backup/restore_backup.py +27 -8
  28. robosystems_client/api/connections/create_connection.py +13 -7
  29. robosystems_client/api/connections/create_link_token.py +8 -3
  30. robosystems_client/api/connections/delete_connection.py +12 -7
  31. robosystems_client/api/connections/exchange_link_token.py +8 -3
  32. robosystems_client/api/connections/get_connection.py +8 -3
  33. robosystems_client/api/connections/get_connection_options.py +7 -3
  34. robosystems_client/api/connections/init_o_auth.py +2 -0
  35. robosystems_client/api/connections/list_connections.py +7 -3
  36. robosystems_client/api/connections/oauth_callback.py +9 -3
  37. robosystems_client/api/connections/sync_connection.py +12 -7
  38. robosystems_client/api/graph_analytics/get_graph_metrics.py +12 -7
  39. robosystems_client/api/graph_analytics/get_graph_usage_stats.py +11 -7
  40. robosystems_client/api/graph_billing/get_current_graph_bill.py +8 -3
  41. robosystems_client/api/graph_billing/get_graph_billing_history.py +8 -3
  42. robosystems_client/api/graph_billing/get_graph_monthly_bill.py +9 -3
  43. robosystems_client/api/graph_billing/get_graph_usage_details.py +9 -3
  44. robosystems_client/api/graph_credits/check_credit_balance.py +8 -3
  45. robosystems_client/api/graph_credits/check_storage_limits.py +8 -3
  46. robosystems_client/api/graph_credits/get_credit_summary.py +8 -3
  47. robosystems_client/api/graph_credits/get_storage_usage.py +7 -3
  48. robosystems_client/api/graph_credits/list_credit_transactions.py +8 -3
  49. robosystems_client/api/graph_health/get_database_health.py +8 -3
  50. robosystems_client/api/graph_info/get_database_info.py +8 -3
  51. robosystems_client/api/graph_limits/get_graph_limits.py +8 -3
  52. robosystems_client/api/graphs/create_graph.py +6 -4
  53. robosystems_client/api/graphs/get_available_extensions.py +1 -0
  54. robosystems_client/api/graphs/get_graphs.py +2 -0
  55. robosystems_client/api/graphs/select_graph.py +8 -3
  56. robosystems_client/api/mcp/call_mcp_tool.py +17 -7
  57. robosystems_client/api/mcp/list_mcp_tools.py +11 -7
  58. robosystems_client/api/operations/cancel_operation.py +9 -3
  59. robosystems_client/api/operations/get_operation_status.py +8 -3
  60. robosystems_client/api/operations/stream_operation_events.py +8 -3
  61. robosystems_client/api/query/execute_cypher_query.py +48 -15
  62. robosystems_client/api/schema/export_graph_schema.py +2 -0
  63. robosystems_client/api/schema/{get_graph_schema_info.py → get_graph_schema.py} +37 -47
  64. robosystems_client/api/schema/validate_schema.py +9 -4
  65. robosystems_client/api/service_offerings/get_service_offerings.py +2 -0
  66. robosystems_client/api/status/get_service_status.py +1 -0
  67. robosystems_client/api/subgraphs/create_subgraph.py +2 -0
  68. robosystems_client/api/subgraphs/delete_subgraph.py +14 -6
  69. robosystems_client/api/subgraphs/get_subgraph_info.py +13 -6
  70. robosystems_client/api/subgraphs/get_subgraph_quota.py +9 -3
  71. robosystems_client/api/subgraphs/list_subgraphs.py +2 -0
  72. robosystems_client/api/tables/delete_file_v1_graphs_graph_id_tables_files_file_id_delete.py +287 -0
  73. robosystems_client/api/tables/get_file_info_v1_graphs_graph_id_tables_files_file_id_get.py +283 -0
  74. robosystems_client/api/tables/get_upload_url_v1_graphs_graph_id_tables_table_name_files_post.py +260 -0
  75. robosystems_client/api/tables/ingest_tables_v1_graphs_graph_id_tables_ingest_post.py +251 -0
  76. robosystems_client/api/tables/list_table_files_v1_graphs_graph_id_tables_table_name_files_get.py +283 -0
  77. robosystems_client/api/{backup/export_backup.py → tables/list_tables_v1_graphs_graph_id_tables_get.py} +36 -36
  78. robosystems_client/api/{schema/list_schema_extensions.py → tables/query_tables_v1_graphs_graph_id_tables_query_post.py} +67 -43
  79. robosystems_client/api/tables/update_file_v1_graphs_graph_id_tables_files_file_id_patch.py +306 -0
  80. robosystems_client/api/user/create_user_api_key.py +2 -0
  81. robosystems_client/api/user/get_all_credit_summaries.py +6 -3
  82. robosystems_client/api/user/get_current_user.py +2 -0
  83. robosystems_client/api/user/list_user_api_keys.py +2 -0
  84. robosystems_client/api/user/revoke_user_api_key.py +7 -3
  85. robosystems_client/api/user/update_user.py +2 -0
  86. robosystems_client/api/user/update_user_api_key.py +2 -0
  87. robosystems_client/api/user/update_user_password.py +8 -3
  88. robosystems_client/api/user_analytics/get_detailed_user_analytics.py +2 -0
  89. robosystems_client/api/user_analytics/get_user_usage_overview.py +2 -0
  90. robosystems_client/api/user_limits/get_all_shared_repository_limits.py +2 -0
  91. robosystems_client/api/user_limits/get_shared_repository_limits.py +6 -4
  92. robosystems_client/api/user_limits/get_user_limits.py +3 -0
  93. robosystems_client/api/user_limits/get_user_usage.py +2 -0
  94. robosystems_client/api/user_subscriptions/cancel_shared_repository_subscription.py +11 -6
  95. robosystems_client/api/user_subscriptions/get_repository_credits.py +7 -3
  96. robosystems_client/api/user_subscriptions/get_shared_repository_credits.py +7 -3
  97. robosystems_client/api/user_subscriptions/get_user_shared_subscriptions.py +7 -3
  98. robosystems_client/api/user_subscriptions/subscribe_to_shared_repository.py +8 -3
  99. robosystems_client/api/user_subscriptions/upgrade_shared_repository_subscription.py +12 -6
  100. robosystems_client/extensions/README.md +1 -212
  101. robosystems_client/extensions/__init__.py +12 -28
  102. robosystems_client/extensions/extensions.py +3 -17
  103. robosystems_client/extensions/operation_client.py +12 -4
  104. robosystems_client/extensions/query_client.py +38 -24
  105. robosystems_client/extensions/sse_client.py +11 -0
  106. robosystems_client/extensions/table_ingest_client.py +466 -0
  107. robosystems_client/models/__init__.py +39 -29
  108. robosystems_client/models/backup_restore_request.py +1 -12
  109. robosystems_client/models/bulk_ingest_request.py +50 -0
  110. robosystems_client/models/bulk_ingest_response.py +137 -0
  111. robosystems_client/models/create_graph_request.py +4 -3
  112. 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 +47 -0
  113. robosystems_client/models/file_update_request.py +62 -0
  114. robosystems_client/models/file_upload_request.py +51 -0
  115. robosystems_client/models/file_upload_response.py +83 -0
  116. robosystems_client/models/{get_graph_schema_info_response_getgraphschemainfo.py → 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} +8 -5
  117. robosystems_client/models/{copy_response_error_details_type_0.py → get_graph_schema_response_getgraphschema.py} +5 -5
  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 +47 -0
  119. robosystems_client/models/table_info.py +107 -0
  120. robosystems_client/models/table_ingest_result.py +107 -0
  121. robosystems_client/models/table_list_response.py +81 -0
  122. robosystems_client/models/table_query_request.py +40 -0
  123. robosystems_client/models/table_query_response.py +92 -0
  124. robosystems_client/models/{list_schema_extensions_response_listschemaextensions.py → update_file_v1_graphs_graph_id_tables_files_file_id_patch_response_update_file_v1_graphs_graph_id_tables_files_file_id_patch.py} +8 -5
  125. {robosystems_client-0.1.19.dist-info → robosystems_client-0.2.1.dist-info}/METADATA +25 -12
  126. {robosystems_client-0.1.19.dist-info → robosystems_client-0.2.1.dist-info}/RECORD +129 -122
  127. robosystems_client/api/copy/copy_data_to_graph.py +0 -486
  128. robosystems_client/extensions/copy_client.py +0 -479
  129. robosystems_client/models/copy_response.py +0 -275
  130. robosystems_client/models/copy_response_status.py +0 -11
  131. robosystems_client/models/data_frame_copy_request.py +0 -125
  132. robosystems_client/models/data_frame_copy_request_format.py +0 -10
  133. robosystems_client/models/s3_copy_request.py +0 -378
  134. robosystems_client/models/s3_copy_request_file_format.py +0 -12
  135. robosystems_client/models/s3_copy_request_s3_url_style_type_0.py +0 -9
  136. robosystems_client/models/url_copy_request.py +0 -157
  137. robosystems_client/models/url_copy_request_file_format.py +0 -10
  138. robosystems_client/models/url_copy_request_headers_type_0.py +0 -44
  139. /robosystems_client/api/{copy → tables}/__init__.py +0 -0
  140. {robosystems_client-0.1.19.dist-info → robosystems_client-0.2.1.dist-info}/WHEEL +0 -0
  141. {robosystems_client-0.1.19.dist-info → robosystems_client-0.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -54,22 +54,27 @@ def _parse_response(
54
54
  response_200 = SuccessResponse.from_dict(response.json())
55
55
 
56
56
  return response_200
57
+
57
58
  if response.status_code == 400:
58
59
  response_400 = ErrorResponse.from_dict(response.json())
59
60
 
60
61
  return response_400
62
+
61
63
  if response.status_code == 404:
62
64
  response_404 = ErrorResponse.from_dict(response.json())
63
65
 
64
66
  return response_404
65
- if response.status_code == 500:
66
- response_500 = ErrorResponse.from_dict(response.json())
67
67
 
68
- return response_500
69
68
  if response.status_code == 422:
70
69
  response_422 = HTTPValidationError.from_dict(response.json())
71
70
 
72
71
  return response_422
72
+
73
+ if response.status_code == 500:
74
+ response_500 = ErrorResponse.from_dict(response.json())
75
+
76
+ return response_500
77
+
73
78
  if client.raise_on_unexpected_status:
74
79
  raise errors.UnexpectedStatus(response.status_code, response.content)
75
80
  else:
@@ -53,10 +53,12 @@ def _parse_response(
53
53
  response_200 = UserAnalyticsResponse.from_dict(response.json())
54
54
 
55
55
  return response_200
56
+
56
57
  if response.status_code == 422:
57
58
  response_422 = HTTPValidationError.from_dict(response.json())
58
59
 
59
60
  return response_422
61
+
60
62
  if client.raise_on_unexpected_status:
61
63
  raise errors.UnexpectedStatus(response.status_code, response.content)
62
64
  else:
@@ -47,10 +47,12 @@ def _parse_response(
47
47
  response_200 = UserUsageSummaryResponse.from_dict(response.json())
48
48
 
49
49
  return response_200
50
+
50
51
  if response.status_code == 422:
51
52
  response_422 = HTTPValidationError.from_dict(response.json())
52
53
 
53
54
  return response_422
55
+
54
56
  if client.raise_on_unexpected_status:
55
57
  raise errors.UnexpectedStatus(response.status_code, response.content)
56
58
  else:
@@ -58,10 +58,12 @@ def _parse_response(
58
58
  )
59
59
 
60
60
  return response_200
61
+
61
62
  if response.status_code == 422:
62
63
  response_422 = HTTPValidationError.from_dict(response.json())
63
64
 
64
65
  return response_422
66
+
65
67
  if client.raise_on_unexpected_status:
66
68
  raise errors.UnexpectedStatus(response.status_code, response.content)
67
69
  else:
@@ -54,10 +54,12 @@ def _parse_response(
54
54
  )
55
55
 
56
56
  return response_200
57
+
57
58
  if response.status_code == 422:
58
59
  response_422 = HTTPValidationError.from_dict(response.json())
59
60
 
60
61
  return response_422
62
+
61
63
  if client.raise_on_unexpected_status:
62
64
  raise errors.UnexpectedStatus(response.status_code, response.content)
63
65
  else:
@@ -96,7 +98,7 @@ def sync_detailed(
96
98
  - Remaining quota
97
99
  - Reset times
98
100
 
99
- Note: All queries are FREE - this only shows rate limit status.
101
+ Note: All queries are included - this only shows rate limit status.
100
102
 
101
103
  Args:
102
104
  repository (str): Repository name (e.g., 'sec')
@@ -143,7 +145,7 @@ def sync(
143
145
  - Remaining quota
144
146
  - Reset times
145
147
 
146
- Note: All queries are FREE - this only shows rate limit status.
148
+ Note: All queries are included - this only shows rate limit status.
147
149
 
148
150
  Args:
149
151
  repository (str): Repository name (e.g., 'sec')
@@ -185,7 +187,7 @@ async def asyncio_detailed(
185
187
  - Remaining quota
186
188
  - Reset times
187
189
 
188
- Note: All queries are FREE - this only shows rate limit status.
190
+ Note: All queries are included - this only shows rate limit status.
189
191
 
190
192
  Args:
191
193
  repository (str): Repository name (e.g., 'sec')
@@ -230,7 +232,7 @@ async def asyncio(
230
232
  - Remaining quota
231
233
  - Reset times
232
234
 
233
- Note: All queries are FREE - this only shows rate limit status.
235
+ Note: All queries are included - this only shows rate limit status.
234
236
 
235
237
  Args:
236
238
  repository (str): Repository name (e.g., 'sec')
@@ -47,13 +47,16 @@ def _parse_response(
47
47
  response_200 = UserLimitsResponse.from_dict(response.json())
48
48
 
49
49
  return response_200
50
+
50
51
  if response.status_code == 404:
51
52
  response_404 = cast(Any, None)
52
53
  return response_404
54
+
53
55
  if response.status_code == 422:
54
56
  response_422 = HTTPValidationError.from_dict(response.json())
55
57
 
56
58
  return response_422
59
+
57
60
  if client.raise_on_unexpected_status:
58
61
  raise errors.UnexpectedStatus(response.status_code, response.content)
59
62
  else:
@@ -47,10 +47,12 @@ def _parse_response(
47
47
  response_200 = UserUsageResponse.from_dict(response.json())
48
48
 
49
49
  return response_200
50
+
50
51
  if response.status_code == 422:
51
52
  response_422 = HTTPValidationError.from_dict(response.json())
52
53
 
53
54
  return response_422
55
+
54
56
  if client.raise_on_unexpected_status:
55
57
  raise errors.UnexpectedStatus(response.status_code, response.content)
56
58
  else:
@@ -48,19 +48,24 @@ def _parse_response(
48
48
  response_200 = CancellationResponse.from_dict(response.json())
49
49
 
50
50
  return response_200
51
- if response.status_code == 404:
52
- response_404 = cast(Any, None)
53
- return response_404
51
+
54
52
  if response.status_code == 401:
55
53
  response_401 = cast(Any, None)
56
54
  return response_401
57
- if response.status_code == 500:
58
- response_500 = cast(Any, None)
59
- return response_500
55
+
56
+ if response.status_code == 404:
57
+ response_404 = cast(Any, None)
58
+ return response_404
59
+
60
60
  if response.status_code == 422:
61
61
  response_422 = HTTPValidationError.from_dict(response.json())
62
62
 
63
63
  return response_422
64
+
65
+ if response.status_code == 500:
66
+ response_500 = cast(Any, None)
67
+ return response_500
68
+
64
69
  if client.raise_on_unexpected_status:
65
70
  raise errors.UnexpectedStatus(response.status_code, response.content)
66
71
  else:
@@ -48,16 +48,20 @@ def _parse_response(
48
48
  response_200 = RepositoryCreditsResponse.from_dict(response.json())
49
49
 
50
50
  return response_200
51
+
51
52
  if response.status_code == 401:
52
53
  response_401 = cast(Any, None)
53
54
  return response_401
54
- if response.status_code == 500:
55
- response_500 = cast(Any, None)
56
- return response_500
55
+
57
56
  if response.status_code == 422:
58
57
  response_422 = HTTPValidationError.from_dict(response.json())
59
58
 
60
59
  return response_422
60
+
61
+ if response.status_code == 500:
62
+ response_500 = cast(Any, None)
63
+ return response_500
64
+
61
65
  if client.raise_on_unexpected_status:
62
66
  raise errors.UnexpectedStatus(response.status_code, response.content)
63
67
  else:
@@ -47,16 +47,20 @@ def _parse_response(
47
47
  response_200 = CreditsSummaryResponse.from_dict(response.json())
48
48
 
49
49
  return response_200
50
+
50
51
  if response.status_code == 401:
51
52
  response_401 = cast(Any, None)
52
53
  return response_401
53
- if response.status_code == 500:
54
- response_500 = cast(Any, None)
55
- return response_500
54
+
56
55
  if response.status_code == 422:
57
56
  response_422 = HTTPValidationError.from_dict(response.json())
58
57
 
59
58
  return response_422
59
+
60
+ if response.status_code == 500:
61
+ response_500 = cast(Any, None)
62
+ return response_500
63
+
60
64
  if client.raise_on_unexpected_status:
61
65
  raise errors.UnexpectedStatus(response.status_code, response.content)
62
66
  else:
@@ -50,16 +50,20 @@ def _parse_response(
50
50
  response_200 = UserSubscriptionsResponse.from_dict(response.json())
51
51
 
52
52
  return response_200
53
+
53
54
  if response.status_code == 401:
54
55
  response_401 = cast(Any, None)
55
56
  return response_401
56
- if response.status_code == 500:
57
- response_500 = cast(Any, None)
58
- return response_500
57
+
59
58
  if response.status_code == 422:
60
59
  response_422 = HTTPValidationError.from_dict(response.json())
61
60
 
62
61
  return response_422
62
+
63
+ if response.status_code == 500:
64
+ response_500 = cast(Any, None)
65
+ return response_500
66
+
63
67
  if client.raise_on_unexpected_status:
64
68
  raise errors.UnexpectedStatus(response.status_code, response.content)
65
69
  else:
@@ -53,19 +53,24 @@ def _parse_response(
53
53
  response_201 = SubscriptionResponse.from_dict(response.json())
54
54
 
55
55
  return response_201
56
+
56
57
  if response.status_code == 400:
57
58
  response_400 = cast(Any, None)
58
59
  return response_400
60
+
59
61
  if response.status_code == 401:
60
62
  response_401 = cast(Any, None)
61
63
  return response_401
62
- if response.status_code == 500:
63
- response_500 = cast(Any, None)
64
- return response_500
64
+
65
65
  if response.status_code == 422:
66
66
  response_422 = HTTPValidationError.from_dict(response.json())
67
67
 
68
68
  return response_422
69
+
70
+ if response.status_code == 500:
71
+ response_500 = cast(Any, None)
72
+ return response_500
73
+
69
74
  if client.raise_on_unexpected_status:
70
75
  raise errors.UnexpectedStatus(response.status_code, response.content)
71
76
  else:
@@ -52,22 +52,28 @@ def _parse_response(
52
52
  if response.status_code == 200:
53
53
  response_200 = response.json()
54
54
  return response_200
55
+
55
56
  if response.status_code == 400:
56
57
  response_400 = cast(Any, None)
57
58
  return response_400
58
- if response.status_code == 404:
59
- response_404 = cast(Any, None)
60
- return response_404
59
+
61
60
  if response.status_code == 401:
62
61
  response_401 = cast(Any, None)
63
62
  return response_401
64
- if response.status_code == 500:
65
- response_500 = cast(Any, None)
66
- return response_500
63
+
64
+ if response.status_code == 404:
65
+ response_404 = cast(Any, None)
66
+ return response_404
67
+
67
68
  if response.status_code == 422:
68
69
  response_422 = HTTPValidationError.from_dict(response.json())
69
70
 
70
71
  return response_422
72
+
73
+ if response.status_code == 500:
74
+ response_500 = cast(Any, None)
75
+ return response_500
76
+
71
77
  if client.raise_on_unexpected_status:
72
78
  raise errors.UnexpectedStatus(response.status_code, response.content)
73
79
  else:
@@ -11,8 +11,7 @@ The RoboSystems Python Client Extensions provide enhanced functionality for the
11
11
 
12
12
  - **Server-Sent Events (SSE)** streaming with automatic reconnection
13
13
  - **Smart Query Execution** with automatic strategy selection
14
- - **Data Copy Operations** with S3 import and real-time progress tracking
15
- - **Operation Monitoring** for long-running operations
14
+ - **Operation Monitoring** for long-running operations
16
15
  - **Connection Pooling** and intelligent resource management
17
16
  - **Result Processing** and format conversion utilities
18
17
  - **Caching** with TTL and LRU eviction
@@ -85,62 +84,6 @@ async def main():
85
84
  asyncio.run(main())
86
85
  ```
87
86
 
88
- ### Data Copy Operations
89
-
90
- ```python
91
- from robosystems_client.extensions import CopyClient, CopyOptions
92
- from robosystems_client.models.s3_copy_request import S3CopyRequest
93
- from robosystems_client.models.s3_copy_request_file_format import S3CopyRequestFileFormat
94
-
95
- # Initialize copy client
96
- copy_client = CopyClient({
97
- "base_url": "https://api.robosystems.ai",
98
- "api_key": "your-api-key",
99
- })
100
-
101
- # Create S3 copy request
102
- request = S3CopyRequest(
103
- table_name="companies",
104
- s3_path="s3://my-bucket/data/companies.csv",
105
- s3_access_key_id="AWS_ACCESS_KEY",
106
- s3_secret_access_key="AWS_SECRET_KEY",
107
- s3_region="us-east-1",
108
- file_format=S3CopyRequestFileFormat.CSV,
109
- ignore_errors=False, # Stop on first error
110
- )
111
-
112
- # Set up progress callbacks
113
- def on_progress(message, percent):
114
- if percent:
115
- print(f"Progress: {message} ({percent}%)")
116
- else:
117
- print(f"Progress: {message}")
118
-
119
- def on_warning(warning):
120
- print(f"Warning: {warning}")
121
-
122
- options = CopyOptions(
123
- on_progress=on_progress,
124
- on_warning=on_warning,
125
- )
126
-
127
- # Execute copy with progress monitoring
128
- result = copy_client.copy_from_s3("your_graph_id", request, options)
129
-
130
- # Check results
131
- if result.status == "completed":
132
- print(f"✅ Successfully imported {result.rows_imported:,} rows")
133
- stats = copy_client.calculate_statistics(result)
134
- if stats:
135
- print(f"Throughput: {stats.throughput:.2f} rows/second")
136
- elif result.status == "partial":
137
- print(f"⚠️ Imported {result.rows_imported:,} rows, skipped {result.rows_skipped:,}")
138
- else:
139
- print(f"❌ Copy failed: {result.error}")
140
-
141
- copy_client.close()
142
- ```
143
-
144
87
  ## 🔐 Authentication
145
88
 
146
89
  ### API Key Authentication (Recommended)
@@ -198,79 +141,6 @@ dev_ext = create_extensions(
198
141
 
199
142
  ## 🛠 Advanced Features
200
143
 
201
- ### Copy Operations with Advanced Features
202
-
203
- ```python
204
- from robosystems_client.extensions import CopyClient, CopySourceType
205
-
206
- # Batch copy multiple tables
207
- copy_client = CopyClient({
208
- "base_url": "https://api.robosystems.ai",
209
- "api_key": "your-api-key",
210
- })
211
-
212
- copies = [
213
- {
214
- "request": S3CopyRequest(
215
- table_name="companies",
216
- s3_path="s3://bucket/companies.csv",
217
- s3_access_key_id="KEY",
218
- s3_secret_access_key="SECRET",
219
- file_format=S3CopyRequestFileFormat.CSV,
220
- ),
221
- },
222
- {
223
- "request": S3CopyRequest(
224
- table_name="transactions",
225
- s3_path="s3://bucket/transactions.parquet",
226
- s3_access_key_id="KEY",
227
- s3_secret_access_key="SECRET",
228
- file_format=S3CopyRequestFileFormat.PARQUET,
229
- ignore_errors=True, # Continue on errors
230
- ),
231
- },
232
- ]
233
-
234
- # Execute batch copy
235
- results = copy_client.batch_copy_from_s3("graph_id", copies)
236
-
237
- for i, result in enumerate(results):
238
- table_name = copies[i]["request"].table_name
239
- print(f"{table_name}: {result.status}")
240
- if result.rows_imported:
241
- print(f" Imported: {result.rows_imported:,} rows")
242
-
243
- # Copy with retry logic for resilient operations
244
- result = copy_client.copy_with_retry(
245
- graph_id="graph_id",
246
- request=S3CopyRequest(
247
- table_name="large_dataset",
248
- s3_path="s3://bucket/large-dataset.csv",
249
- s3_access_key_id="KEY",
250
- s3_secret_access_key="SECRET",
251
- max_file_size_gb=50,
252
- extended_timeout=True,
253
- ),
254
- source_type=CopySourceType.S3,
255
- max_retries=3,
256
- options=CopyOptions(
257
- on_progress=lambda msg, _: print(msg)
258
- ),
259
- )
260
-
261
- # Monitor multiple concurrent copy operations
262
- operation_ids = ["op-123", "op-456", "op-789"]
263
- results = copy_client.monitor_multiple_copies(operation_ids, options)
264
-
265
- for op_id, result in results.items():
266
- print(f"Operation {op_id}: {result.status}")
267
- if result.status == "completed":
268
- stats = copy_client.calculate_statistics(result)
269
- print(f" Throughput: {stats.throughput:.2f} rows/sec")
270
-
271
- copy_client.close()
272
- ```
273
-
274
144
  ### Query Builder
275
145
 
276
146
  Build complex Cypher queries programmatically:
@@ -403,87 +273,6 @@ client.close()
403
273
 
404
274
  ## 📊 Examples
405
275
 
406
- ### Data Import with Real-Time Monitoring
407
-
408
- ```python
409
- from robosystems_client.extensions import CopyClient, CopyOptions
410
- import time
411
-
412
- def import_financial_data():
413
- """Import financial data with comprehensive monitoring"""
414
-
415
- copy_client = CopyClient({
416
- "base_url": "https://api.robosystems.ai",
417
- "api_key": "your-api-key",
418
- })
419
-
420
- # Track progress history
421
- progress_history = []
422
- warnings_count = 0
423
-
424
- def on_progress(message, percent):
425
- timestamp = time.strftime("%H:%M:%S")
426
- progress_history.append({
427
- "time": timestamp,
428
- "message": message,
429
- "percent": percent,
430
- })
431
- print(f"[{timestamp}] {message}" + (f" ({percent}%)" if percent else ""))
432
-
433
- def on_warning(warning):
434
- nonlocal warnings_count
435
- warnings_count += 1
436
- print(f"⚠️ Warning #{warnings_count}: {warning}")
437
-
438
- def on_queue_update(position, wait_time):
439
- print(f"📊 Queue position: {position} (ETA: {wait_time}s)")
440
-
441
- # Configure copy with all callbacks
442
- options = CopyOptions(
443
- on_progress=on_progress,
444
- on_warning=on_warning,
445
- on_queue_update=on_queue_update,
446
- timeout=1800000, # 30 minutes
447
- )
448
-
449
- # Execute copy operation
450
- start_time = time.time()
451
-
452
- result = copy_client.copy_s3(
453
- graph_id="financial_graph",
454
- table_name="quarterly_reports",
455
- s3_path="s3://financial-data/reports-2024-q1.parquet",
456
- access_key_id="AWS_KEY",
457
- secret_access_key="AWS_SECRET",
458
- file_format="parquet",
459
- ignore_errors=True, # Continue on validation errors
460
- )
461
-
462
- # Print summary
463
- elapsed = time.time() - start_time
464
-
465
- print("\n" + "="*50)
466
- print("📈 IMPORT SUMMARY")
467
- print("="*50)
468
- print(f"Status: {result.status.upper()}")
469
- print(f"Rows Imported: {result.rows_imported or 0:,}")
470
- print(f"Rows Skipped: {result.rows_skipped or 0:,}")
471
- print(f"Warnings: {warnings_count}")
472
- print(f"Execution Time: {elapsed:.2f} seconds")
473
-
474
- if result.status == "completed":
475
- stats = copy_client.calculate_statistics(result)
476
- if stats:
477
- print(f"Throughput: {stats.throughput:.2f} rows/second")
478
- print(f"Data Processed: {stats.bytes_processed / (1024*1024):.2f} MB")
479
-
480
- copy_client.close()
481
- return result
482
-
483
- # Run the import
484
- result = import_financial_data()
485
- ```
486
-
487
276
  ### Financial Data Analysis
488
277
 
489
278
  ```python
@@ -20,13 +20,12 @@ from .operation_client import (
20
20
  OperationProgress,
21
21
  OperationResult,
22
22
  )
23
- from .copy_client import (
24
- CopyClient,
25
- AsyncCopyClient,
26
- CopySourceType,
27
- CopyOptions,
28
- CopyResult,
29
- CopyStatistics,
23
+ from .table_ingest_client import (
24
+ TableIngestClient,
25
+ UploadOptions,
26
+ IngestOptions,
27
+ UploadResult,
28
+ TableInfo,
30
29
  )
31
30
  from .extensions import (
32
31
  RoboSystemsExtensions,
@@ -117,13 +116,12 @@ __all__ = [
117
116
  "OperationStatus",
118
117
  "OperationProgress",
119
118
  "OperationResult",
120
- # Copy Client
121
- "CopyClient",
122
- "AsyncCopyClient",
123
- "CopySourceType",
124
- "CopyOptions",
125
- "CopyResult",
126
- "CopyStatistics",
119
+ # Table Ingest Client
120
+ "TableIngestClient",
121
+ "UploadOptions",
122
+ "IngestOptions",
123
+ "UploadResult",
124
+ "TableInfo",
127
125
  # Utilities
128
126
  "QueryBuilder",
129
127
  "ResultProcessor",
@@ -179,20 +177,6 @@ def stream_query(graph_id: str, query: str, parameters=None, chunk_size=None):
179
177
  return extensions.query.stream_query(graph_id, query, parameters, chunk_size)
180
178
 
181
179
 
182
- def copy_from_s3(
183
- graph_id: str,
184
- table_name: str,
185
- s3_path: str,
186
- access_key_id: str,
187
- secret_access_key: str,
188
- **kwargs,
189
- ):
190
- """Copy data from S3 using the default extensions instance"""
191
- return extensions.copy_from_s3(
192
- graph_id, table_name, s3_path, access_key_id, secret_access_key, **kwargs
193
- )
194
-
195
-
196
180
  # DataFrame convenience functions (if pandas is available)
197
181
  if HAS_PANDAS:
198
182
 
@@ -8,7 +8,7 @@ from typing import Dict, Any, Optional, Callable
8
8
 
9
9
  from .query_client import QueryClient
10
10
  from .operation_client import OperationClient
11
- from .copy_client import CopyClient
11
+ from .table_ingest_client import TableIngestClient
12
12
  from .sse_client import SSEClient
13
13
 
14
14
 
@@ -56,9 +56,9 @@ class RoboSystemsExtensions:
56
56
  self.config["token"] = token
57
57
 
58
58
  # Initialize clients
59
- self.copy = CopyClient(self.config)
60
59
  self.query = QueryClient(self.config)
61
60
  self.operations = OperationClient(self.config)
61
+ self.tables = TableIngestClient(self.config)
62
62
 
63
63
  def monitor_operation(
64
64
  self, operation_id: str, on_progress: Optional[Callable] = None
@@ -85,9 +85,9 @@ class RoboSystemsExtensions:
85
85
 
86
86
  def close(self):
87
87
  """Clean up all active connections"""
88
- self.copy.close()
89
88
  self.query.close()
90
89
  self.operations.close_all()
90
+ self.tables.close()
91
91
 
92
92
  # Convenience methods that delegate to the appropriate clients
93
93
  def execute_query(self, graph_id: str, query: str, parameters: Dict[str, Any] = None):
@@ -112,20 +112,6 @@ class RoboSystemsExtensions:
112
112
  """Cancel an operation using the operation client"""
113
113
  return self.operations.cancel_operation(operation_id)
114
114
 
115
- def copy_from_s3(
116
- self,
117
- graph_id: str,
118
- table_name: str,
119
- s3_path: str,
120
- access_key_id: str,
121
- secret_access_key: str,
122
- **kwargs,
123
- ):
124
- """Copy data from S3 using the copy client"""
125
- return self.copy.copy_s3(
126
- graph_id, table_name, s3_path, access_key_id, secret_access_key, **kwargs
127
- )
128
-
129
115
 
130
116
  class AsyncRoboSystemsExtensions:
131
117
  """Async version of the extensions class"""