scalekit-sdk-python 2.12.0__tar.gz → 2.13.0__tar.gz

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.
Files changed (262) hide show
  1. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/PKG-INFO +13 -13
  2. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/_version.py +1 -1
  3. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/actions.py +18 -3
  4. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/common/exceptions.py +79 -0
  5. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/core.py +9 -1
  6. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit_sdk_python.egg-info/PKG-INFO +13 -13
  7. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit_sdk_python.egg-info/SOURCES.txt +1 -0
  8. scalekit_sdk_python-2.13.0/scalekit_sdk_python.egg-info/requires.txt +16 -0
  9. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/setup.py +12 -12
  10. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_actions.py +1 -1
  11. scalekit_sdk_python-2.13.0/tests/test_sk819_retry_behavior.py +442 -0
  12. scalekit_sdk_python-2.12.0/scalekit_sdk_python.egg-info/requires.txt +0 -16
  13. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/LICENSE +0 -0
  14. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/README.md +0 -0
  15. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/__init__.py +0 -0
  16. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/__init__.py +0 -0
  17. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/expression_pb2.py +0 -0
  18. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/expression_pb2.pyi +0 -0
  19. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/expression_pb2_grpc.py +0 -0
  20. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/priv/__init__.py +0 -0
  21. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/priv/private_pb2.py +0 -0
  22. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/priv/private_pb2.pyi +0 -0
  23. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/priv/private_pb2_grpc.py +0 -0
  24. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/validate_pb2.py +0 -0
  25. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/validate_pb2.pyi +0 -0
  26. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/buf/validate/validate_pb2_grpc.py +0 -0
  27. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/pyproject.toml +0 -0
  28. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/__init__.py +0 -0
  29. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/__init__.py +0 -0
  30. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/frameworks/__init__.py +0 -0
  31. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/frameworks/google_adk.py +0 -0
  32. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/frameworks/langchain.py +0 -0
  33. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/frameworks/types/__init__.py +0 -0
  34. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
  35. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/frameworks/util.py +0 -0
  36. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/__init__.py +0 -0
  37. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/custom_provider.py +0 -0
  38. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/mcp_config.py +0 -0
  39. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/mcp_connection_auth_state.py +0 -0
  40. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/mcp_instance.py +0 -0
  41. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/__init__.py +0 -0
  42. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/create_connected_account_request.py +0 -0
  43. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/create_custom_provider_request.py +0 -0
  44. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/delete_custom_provider_request.py +0 -0
  45. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/list_providers_request.py +0 -0
  46. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/mcp_request.py +0 -0
  47. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/tool_request.py +0 -0
  48. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
  49. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/requests/update_custom_provider_request.py +0 -0
  50. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/__init__.py +0 -0
  51. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
  52. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/create_custom_provider_response.py +0 -0
  53. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
  54. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
  55. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/create_mcp_session_token_response.py +0 -0
  56. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
  57. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/delete_custom_provider_response.py +0 -0
  58. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
  59. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
  60. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
  61. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
  62. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
  63. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/get_mcp_instance_auth_state_response.py +0 -0
  64. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
  65. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
  66. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
  67. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
  68. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/list_mcp_connected_accounts_response.py +0 -0
  69. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
  70. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/list_providers_response.py +0 -0
  71. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/magic_link_response.py +0 -0
  72. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
  73. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/update_custom_provider_response.py +0 -0
  74. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
  75. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
  76. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/responses/verify_connected_account_user_response.py +0 -0
  77. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/tool_input_output.py +0 -0
  78. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/models/tool_mapping.py +0 -0
  79. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/modifier.py +0 -0
  80. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/actions/types.py +0 -0
  81. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/auth.py +0 -0
  82. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/client.py +0 -0
  83. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/common/__init__.py +0 -0
  84. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/common/scalekit.py +0 -0
  85. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/common/user.py +0 -0
  86. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/connected_accounts.py +0 -0
  87. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/connection.py +0 -0
  88. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/constants/__init__.py +0 -0
  89. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/constants/user.py +0 -0
  90. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/directory.py +0 -0
  91. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/domain.py +0 -0
  92. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/m2m_client.py +0 -0
  93. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/mcp.py +0 -0
  94. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/organization.py +0 -0
  95. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/passwordless.py +0 -0
  96. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/permissions.py +0 -0
  97. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/providers.py +0 -0
  98. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/role.py +0 -0
  99. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/sessions.py +0 -0
  100. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/token.py +0 -0
  101. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/tools.py +0 -0
  102. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/users.py +0 -0
  103. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/utils/__init__.py +0 -0
  104. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/utils/directory.py +0 -0
  105. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/__init__.py +0 -0
  106. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/agentkit_logs/__init__.py +0 -0
  107. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.py +0 -0
  108. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.pyi +0 -0
  109. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2_grpc.py +0 -0
  110. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.py +0 -0
  111. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.pyi +0 -0
  112. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2_grpc.py +0 -0
  113. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auditlogs/__init__.py +0 -0
  114. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -0
  115. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +0 -0
  116. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
  117. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/__init__.py +0 -0
  118. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/auth_pb2.py +0 -0
  119. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/auth_pb2.pyi +0 -0
  120. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/auth_pb2_grpc.py +0 -0
  121. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/passwordless_pb2.py +0 -0
  122. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
  123. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
  124. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/totp_pb2.py +0 -0
  125. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/totp_pb2.pyi +0 -0
  126. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
  127. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/webauthn_pb2.py +0 -0
  128. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
  129. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
  130. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/clients/__init__.py +0 -0
  131. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/clients/clients_pb2.py +0 -0
  132. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/clients/clients_pb2.pyi +0 -0
  133. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/clients/clients_pb2_grpc.py +0 -0
  134. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/commons/__init__.py +0 -0
  135. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/commons/commons_pb2.py +0 -0
  136. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/commons/commons_pb2.pyi +0 -0
  137. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
  138. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connected_accounts/__init__.py +0 -0
  139. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +0 -0
  140. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +0 -0
  141. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +0 -0
  142. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connections/__init__.py +0 -0
  143. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connections/connections_pb2.py +0 -0
  144. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connections/connections_pb2.pyi +0 -0
  145. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/connections/connections_pb2_grpc.py +0 -0
  146. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/directories/__init__.py +0 -0
  147. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/directories/directories_pb2.py +0 -0
  148. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/directories/directories_pb2.pyi +0 -0
  149. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/directories/directories_pb2_grpc.py +0 -0
  150. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/domains/__init__.py +0 -0
  151. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/domains/domains_pb2.py +0 -0
  152. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/domains/domains_pb2.pyi +0 -0
  153. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
  154. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/emails/__init__.py +0 -0
  155. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/emails/emails_pb2.py +0 -0
  156. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/emails/emails_pb2.pyi +0 -0
  157. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
  158. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/environments/__init__.py +0 -0
  159. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/environments/environments_pb2.py +0 -0
  160. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/environments/environments_pb2.pyi +0 -0
  161. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/environments/environments_pb2_grpc.py +0 -0
  162. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/errdetails/__init__.py +0 -0
  163. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
  164. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
  165. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
  166. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/events/__init__.py +0 -0
  167. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/events/events_pb2.py +0 -0
  168. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/events/events_pb2.pyi +0 -0
  169. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/events/events_pb2_grpc.py +0 -0
  170. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/interceptors/__init__.py +0 -0
  171. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/interceptors/interceptors_pb2.py +0 -0
  172. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
  173. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
  174. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/keys/__init__.py +0 -0
  175. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/keys/keys_pb2.py +0 -0
  176. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/keys/keys_pb2.pyi +0 -0
  177. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/keys/keys_pb2_grpc.py +0 -0
  178. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/mcp/__init__.py +0 -0
  179. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/mcp/mcp_pb2.py +0 -0
  180. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
  181. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
  182. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/members/__init__.py +0 -0
  183. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/members/members_pb2.py +0 -0
  184. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/members/members_pb2.pyi +0 -0
  185. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/members/members_pb2_grpc.py +0 -0
  186. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/migrations/__init__.py +0 -0
  187. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/migrations/migrations_pb2.py +0 -0
  188. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/migrations/migrations_pb2.pyi +0 -0
  189. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/migrations/migrations_pb2_grpc.py +0 -0
  190. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/options/__init__.py +0 -0
  191. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/options/options_pb2.py +0 -0
  192. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/options/options_pb2.pyi +0 -0
  193. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/options/options_pb2_grpc.py +0 -0
  194. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/organizations/__init__.py +0 -0
  195. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/organizations/organizations_pb2.py +0 -0
  196. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
  197. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/organizations/organizations_pb2_grpc.py +0 -0
  198. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/providers/__init__.py +0 -0
  199. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/providers/providers_pb2.py +0 -0
  200. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/providers/providers_pb2.pyi +0 -0
  201. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/providers/providers_pb2_grpc.py +0 -0
  202. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/roles/__init__.py +0 -0
  203. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/roles/roles_pb2.py +0 -0
  204. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/roles/roles_pb2.pyi +0 -0
  205. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
  206. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/secrets/__init__.py +0 -0
  207. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/secrets/secrets_pb2.py +0 -0
  208. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
  209. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
  210. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/sessions/__init__.py +0 -0
  211. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/sessions/sessions_pb2.py +0 -0
  212. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
  213. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
  214. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tokens/__init__.py +0 -0
  215. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tokens/tokens_pb2.py +0 -0
  216. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
  217. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
  218. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tools/__init__.py +0 -0
  219. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tools/tools_pb2.py +0 -0
  220. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tools/tools_pb2.pyi +0 -0
  221. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/tools/tools_pb2_grpc.py +0 -0
  222. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/user_attributes/__init__.py +0 -0
  223. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/user_attributes/user_attributes_pb2.py +0 -0
  224. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
  225. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
  226. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/users/__init__.py +0 -0
  227. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/users/users_pb2.py +0 -0
  228. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/users/users_pb2.pyi +0 -0
  229. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/users/users_pb2_grpc.py +0 -0
  230. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/webhooks/__init__.py +0 -0
  231. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/webhooks/webhooks_pb2.py +0 -0
  232. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
  233. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
  234. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/workspaces/__init__.py +0 -0
  235. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/workspaces/workspaces_pb2.py +0 -0
  236. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/workspaces/workspaces_pb2.pyi +0 -0
  237. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +0 -0
  238. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit/webauthn.py +0 -0
  239. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
  240. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
  241. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/setup.cfg +0 -0
  242. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_connected_accounts.py +0 -0
  243. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_connection.py +0 -0
  244. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_directory.py +0 -0
  245. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_domain.py +0 -0
  246. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_m2m_client.py +0 -0
  247. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_mcp.py +0 -0
  248. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_org_roles.py +0 -0
  249. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_organization.py +0 -0
  250. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_organization_session_policy.py +0 -0
  251. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_organization_slug_logo.py +0 -0
  252. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_passwordless.py +0 -0
  253. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_permissions.py +0 -0
  254. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_providers.py +0 -0
  255. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_role_defaults_dependent.py +0 -0
  256. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_roles.py +0 -0
  257. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_sessions.py +0 -0
  258. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_tokens.py +0 -0
  259. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_tools.py +0 -0
  260. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_user_roles_permissions.py +0 -0
  261. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_users.py +0 -0
  262. {scalekit_sdk_python-2.12.0 → scalekit_sdk_python-2.13.0}/tests/test_webauthn_credentials.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalekit-sdk-python
3
- Version: 2.12.0
3
+ Version: 2.13.0
4
4
  Summary: Scalekit official Python SDK
5
5
  Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
6
6
  Author: Team Scalekit
@@ -11,22 +11,22 @@ Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Operating System :: OS Independent
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: grpcio>=1.64.1
15
- Requires-Dist: protobuf<7.0.0,>=5.29.5
14
+ Requires-Dist: grpcio<2.0,>=1.81.0
15
+ Requires-Dist: protobuf<8.0.0,>=5.29.5
16
16
  Requires-Dist: google>=3.0
17
- Requires-Dist: requests>=2.32.3
18
- Requires-Dist: PyJWT>=2.12.0
17
+ Requires-Dist: requests>=2.34.0
18
+ Requires-Dist: PyJWT>=2.13.0
19
19
  Requires-Dist: cffi>=1.15.1
20
- Requires-Dist: cryptography<47,==46.0.6
21
- Requires-Dist: setuptools<81.0,>=78.1.1
22
- Requires-Dist: grpcio-status<1.67,>=1.64
20
+ Requires-Dist: cryptography<49,>=46.0.6
21
+ Requires-Dist: setuptools<83.0,>=82.0.1
22
+ Requires-Dist: grpcio-status<2.0,>=1.81.0
23
23
  Requires-Dist: protoc-gen-openapiv2>=0.0.1
24
- Requires-Dist: googleapis-common-protos>=1.72.0
24
+ Requires-Dist: googleapis-common-protos>=1.75.0
25
25
  Requires-Dist: deprecation>=2.1.0
26
- Requires-Dist: python-dotenv~=1.1.1
27
- Requires-Dist: Faker~=25.8.0
28
- Requires-Dist: pydantic>=2.10.6
29
- Requires-Dist: mcp>=1.23.0
26
+ Requires-Dist: python-dotenv<2.0,>=1.2.2
27
+ Requires-Dist: Faker<41.0,>=33.0.0
28
+ Requires-Dist: pydantic>=2.13.4
29
+ Requires-Dist: mcp>=1.27.2
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -1,3 +1,3 @@
1
1
  # Single source of truth for the SDK version.
2
2
  # Import this in setup.py and scalekit/core.py — never hardcode the version elsewhere.
3
- __version__ = "2.12.0"
3
+ __version__ = "2.13.0"
@@ -791,10 +791,22 @@ class ActionClient:
791
791
  organization_id=organization_id,
792
792
  user_id=user_id
793
793
  )
794
-
795
- # If we found it, convert the GetConnectedAccountAuthResponse to CreateConnectedAccountResponse format
794
+
795
+ # True upsert: if credentials were supplied, apply them regardless of
796
+ # the account's current status (PENDING_AUTH, ACTIVE, EXPIRED, DISCONNECTED).
797
+ if authorization_details:
798
+ update_response = self.update_connected_account(
799
+ connection_name=connection_name,
800
+ identifier=identifier,
801
+ authorization_details=authorization_details,
802
+ organization_id=organization_id,
803
+ user_id=user_id,
804
+ api_config=api_config
805
+ )
806
+ return CreateConnectedAccountResponse(connected_account=update_response.connected_account)
807
+
796
808
  return CreateConnectedAccountResponse(connected_account=existing_response.connected_account)
797
-
809
+
798
810
  except ScalekitNotFoundException:
799
811
  # Connected account doesn't exist, create a new one
800
812
  return self.create_connected_account(
@@ -806,6 +818,9 @@ class ActionClient:
806
818
  api_config=api_config
807
819
  )
808
820
 
821
+ #: Alias for :meth:`get_or_create_connected_account` — preferred name for upsert semantics.
822
+ upsert_connected_account = get_or_create_connected_account
823
+
809
824
  def update_connected_account(
810
825
  self,
811
826
  connection_name: str,
@@ -103,11 +103,41 @@ class ScalekitServerException(ScalekitException):
103
103
  if not self._error_code:
104
104
  self._error_code = info.error_code
105
105
 
106
+ @staticmethod
107
+ def _extract_error_code(error: grpc.RpcError) -> str | None:
108
+ """ Extract error_code from gRPC trailing metadata without constructing a full exception """
109
+ from grpc_status import rpc_status
110
+ try:
111
+ status = rpc_status.from_call(error)
112
+ if status is None:
113
+ return None
114
+ for detail in status.details:
115
+ info = ErrorInfo()
116
+ detail.Unpack(info)
117
+ if info.error_code:
118
+ return info.error_code
119
+ except Exception:
120
+ pass
121
+ return None
122
+
106
123
  @staticmethod
107
124
  def promote(error: Response | grpc.RpcError):
108
125
  """ Promote a ScalekitServerException (Response or RpcError) to a specific error type """
109
126
  grpc_status = HTTP_TO_GRPC.get(error.status_code) if isinstance(error, Response) else error.code()
110
127
 
128
+ # Check for upstream provider errors signaled by error_code == "TOOL_ERROR"
129
+ if isinstance(error, grpc.RpcError):
130
+ error_code = ScalekitServerException._extract_error_code(error)
131
+ if error_code == "TOOL_ERROR":
132
+ if grpc_status == StatusCode.RESOURCE_EXHAUSTED:
133
+ return ScalekitToolRateLimitException(error)
134
+ elif grpc_status == StatusCode.UNAUTHENTICATED:
135
+ return ScalekitToolUnauthorizedException(error)
136
+ elif grpc_status == StatusCode.PERMISSION_DENIED:
137
+ return ScalekitToolForbiddenException(error)
138
+ else:
139
+ return ScalekitToolException(error)
140
+
111
141
  if grpc_status == StatusCode.INVALID_ARGUMENT:
112
142
  return ScalekitBadRequestException(error)
113
143
  elif grpc_status == StatusCode.FAILED_PRECONDITION:
@@ -258,3 +288,52 @@ class ScalekitCancelledException(ScalekitServerException):
258
288
  class ScalekitUnknownException(ScalekitServerException):
259
289
  def __init__(self, error: Response | grpc.RpcError):
260
290
  super().__init__(error)
291
+
292
+
293
+ class ScalekitToolException(ScalekitServerException):
294
+ """ Base class for upstream provider tool errors (error_code == 'TOOL_ERROR') """
295
+ def __init__(self, error: Response | grpc.RpcError):
296
+ super().__init__(error)
297
+ # Extract ToolErrorInfo from the unpacked ErrorInfo details
298
+ self._tool_error_code = None
299
+ self._tool_error_message = None
300
+ self._execution_id = None
301
+ for info in self._unpacked_details:
302
+ if info.HasField("tool_error_info"):
303
+ self._tool_error_code = info.tool_error_info.tool_error_code or None
304
+ self._tool_error_message = info.tool_error_info.tool_error_message or None
305
+ self._execution_id = info.tool_error_info.execution_id or None
306
+ break
307
+
308
+ @property
309
+ def tool_error_code(self):
310
+ """ Provider-specific error code from tool execution """
311
+ return self._tool_error_code
312
+
313
+ @property
314
+ def tool_error_message(self):
315
+ """ Provider-specific error message from tool execution """
316
+ return self._tool_error_message
317
+
318
+ @property
319
+ def execution_id(self):
320
+ """ Execution ID for the tool call that failed """
321
+ return self._execution_id
322
+
323
+
324
+ class ScalekitToolRateLimitException(ScalekitToolException, ScalekitTooManyRequestsException):
325
+ """ Provider returned 429/rate-limit during tool execution """
326
+ def __init__(self, error: Response | grpc.RpcError):
327
+ ScalekitToolException.__init__(self, error)
328
+
329
+
330
+ class ScalekitToolUnauthorizedException(ScalekitToolException, ScalekitUnauthorizedException):
331
+ """ Provider returned 401/unauthorized during tool execution """
332
+ def __init__(self, error: Response | grpc.RpcError):
333
+ ScalekitToolException.__init__(self, error)
334
+
335
+
336
+ class ScalekitToolForbiddenException(ScalekitToolException, ScalekitForbiddenException):
337
+ """ Provider returned 403/forbidden during tool execution """
338
+ def __init__(self, error: Response | grpc.RpcError):
339
+ ScalekitToolException.__init__(self, error)
@@ -10,7 +10,7 @@ from urllib.parse import urlparse
10
10
  from cryptography.hazmat.primitives import serialization
11
11
  from scalekit._version import __version__ as _sdk_version
12
12
  from scalekit.common.scalekit import GrantType
13
- from scalekit.common.exceptions import ScalekitServerException, ScalekitException
13
+ from scalekit.common.exceptions import ScalekitServerException, ScalekitException, ScalekitTooManyRequestsException
14
14
 
15
15
  TRequest = TypeVar("TRequest")
16
16
  TResponse = TypeVar("TResponse")
@@ -163,6 +163,11 @@ class CoreClient:
163
163
  )
164
164
  return resp
165
165
  except grpc.RpcError as exp:
166
+ # Check for upstream provider errors first — never retry, never refresh M2M
167
+ error_code = ScalekitServerException._extract_error_code(exp)
168
+ if error_code == "TOOL_ERROR":
169
+ raise ScalekitServerException.promote(exp)
170
+
166
171
  if exp.code() == grpc.StatusCode.UNAUTHENTICATED:
167
172
  if retry <= 0:
168
173
  raise ScalekitServerException.promote(exp)
@@ -171,6 +176,9 @@ class CoreClient:
171
176
  return self.grpc_exec(func, data, retry=retry-1)
172
177
  except Exception as refresh_exp:
173
178
  raise ScalekitServerException.promote(exp)
179
+ elif exp.code() == grpc.StatusCode.RESOURCE_EXHAUSTED:
180
+ # Surface Scalekit rate-limits immediately — retrying triples the damage
181
+ raise ScalekitServerException.promote(exp)
174
182
  elif retry > 0:
175
183
  return self.grpc_exec(func, data, retry=retry - 1)
176
184
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalekit-sdk-python
3
- Version: 2.12.0
3
+ Version: 2.13.0
4
4
  Summary: Scalekit official Python SDK
5
5
  Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
6
6
  Author: Team Scalekit
@@ -11,22 +11,22 @@ Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Operating System :: OS Independent
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: grpcio>=1.64.1
15
- Requires-Dist: protobuf<7.0.0,>=5.29.5
14
+ Requires-Dist: grpcio<2.0,>=1.81.0
15
+ Requires-Dist: protobuf<8.0.0,>=5.29.5
16
16
  Requires-Dist: google>=3.0
17
- Requires-Dist: requests>=2.32.3
18
- Requires-Dist: PyJWT>=2.12.0
17
+ Requires-Dist: requests>=2.34.0
18
+ Requires-Dist: PyJWT>=2.13.0
19
19
  Requires-Dist: cffi>=1.15.1
20
- Requires-Dist: cryptography<47,==46.0.6
21
- Requires-Dist: setuptools<81.0,>=78.1.1
22
- Requires-Dist: grpcio-status<1.67,>=1.64
20
+ Requires-Dist: cryptography<49,>=46.0.6
21
+ Requires-Dist: setuptools<83.0,>=82.0.1
22
+ Requires-Dist: grpcio-status<2.0,>=1.81.0
23
23
  Requires-Dist: protoc-gen-openapiv2>=0.0.1
24
- Requires-Dist: googleapis-common-protos>=1.72.0
24
+ Requires-Dist: googleapis-common-protos>=1.75.0
25
25
  Requires-Dist: deprecation>=2.1.0
26
- Requires-Dist: python-dotenv~=1.1.1
27
- Requires-Dist: Faker~=25.8.0
28
- Requires-Dist: pydantic>=2.10.6
29
- Requires-Dist: mcp>=1.23.0
26
+ Requires-Dist: python-dotenv<2.0,>=1.2.2
27
+ Requires-Dist: Faker<41.0,>=33.0.0
28
+ Requires-Dist: pydantic>=2.13.4
29
+ Requires-Dist: mcp>=1.27.2
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -251,6 +251,7 @@ tests/test_providers.py
251
251
  tests/test_role_defaults_dependent.py
252
252
  tests/test_roles.py
253
253
  tests/test_sessions.py
254
+ tests/test_sk819_retry_behavior.py
254
255
  tests/test_tokens.py
255
256
  tests/test_tools.py
256
257
  tests/test_user_roles_permissions.py
@@ -0,0 +1,16 @@
1
+ grpcio<2.0,>=1.81.0
2
+ protobuf<8.0.0,>=5.29.5
3
+ google>=3.0
4
+ requests>=2.34.0
5
+ PyJWT>=2.13.0
6
+ cffi>=1.15.1
7
+ cryptography<49,>=46.0.6
8
+ setuptools<83.0,>=82.0.1
9
+ grpcio-status<2.0,>=1.81.0
10
+ protoc-gen-openapiv2>=0.0.1
11
+ googleapis-common-protos>=1.75.0
12
+ deprecation>=2.1.0
13
+ python-dotenv<2.0,>=1.2.2
14
+ Faker<41.0,>=33.0.0
15
+ pydantic>=2.13.4
16
+ mcp>=1.27.2
@@ -10,22 +10,22 @@ setup(
10
10
  version=__version__,
11
11
  packages=find_packages(),
12
12
  install_requires=[
13
- "grpcio>=1.64.1",
14
- "protobuf>=5.29.5,<7.0.0",
13
+ "grpcio>=1.81.0,<2.0",
14
+ "protobuf>=5.29.5,<8.0.0",
15
15
  "google>=3.0",
16
- "requests>=2.32.3",
17
- "PyJWT>=2.12.0",
16
+ "requests>=2.34.0",
17
+ "PyJWT>=2.13.0",
18
18
  "cffi>=1.15.1",
19
- "cryptography==46.0.6,<47",
20
- "setuptools>=78.1.1,<81.0",
21
- "grpcio-status>=1.64,<1.67",
19
+ "cryptography>=46.0.6,<49",
20
+ "setuptools>=82.0.1,<83.0",
21
+ "grpcio-status>=1.81.0,<2.0",
22
22
  "protoc-gen-openapiv2>=0.0.1",
23
- "googleapis-common-protos>=1.72.0",
23
+ "googleapis-common-protos>=1.75.0",
24
24
  "deprecation>=2.1.0",
25
- "python-dotenv~=1.1.1",
26
- "Faker~=25.8.0",
27
- "pydantic>=2.10.6",
28
- "mcp>= 1.23.0",
25
+ "python-dotenv>=1.2.2,<2.0",
26
+ "Faker>=33.0.0,<41.0",
27
+ "pydantic>=2.13.4",
28
+ "mcp>=1.27.2",
29
29
  ],
30
30
  url="https://github.com/scalekit-inc/scalekit-sdk-python",
31
31
  license="MIT",
@@ -348,7 +348,7 @@ class TestConnect(BaseTest):
348
348
  """Method to test execute_tool with connection_name parameter"""
349
349
  try:
350
350
  result = self.scalekit_client.actions.execute_tool(
351
- tool_input={"url": "https://docs.apify.com/platform/storage/usage"},
351
+ tool_input={"url": "https://docs.apify.com/platform/storage"},
352
352
  tool_name="c-myapifymcp_fetch-apify-docs",
353
353
  identifier="akshay.parihar",
354
354
  connection_name="myapifymcp",