render_sdk 0.1.2__py3-none-any.whl → 0.2.0__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.
Files changed (156) hide show
  1. render_sdk/__init__.py +41 -4
  2. render_sdk/client/__init__.py +25 -0
  3. render_sdk/client/client.py +5 -0
  4. render_sdk/client/sse.py +5 -1
  5. render_sdk/client/tests/test_client.py +6 -4
  6. render_sdk/client/tests/test_sse.py +1 -0
  7. render_sdk/client/types.py +2 -1
  8. render_sdk/client/workflows.py +13 -3
  9. render_sdk/experimental/__init__.py +31 -0
  10. render_sdk/experimental/experimental.py +71 -0
  11. render_sdk/experimental/object/__init__.py +30 -0
  12. render_sdk/experimental/object/api.py +260 -0
  13. render_sdk/experimental/object/client.py +475 -0
  14. render_sdk/experimental/object/types.py +87 -0
  15. render_sdk/public_api/api/audit_logs/list_organization_audit_logs.py +303 -0
  16. render_sdk/public_api/api/audit_logs/list_owner_audit_logs.py +303 -0
  17. render_sdk/public_api/api/blob_storage/delete_blob.py +215 -0
  18. render_sdk/public_api/api/blob_storage/get_blob.py +221 -0
  19. render_sdk/public_api/api/{workflows/list_workflow_versions.py → blob_storage/list_blobs.py} +52 -30
  20. render_sdk/public_api/api/blob_storage/put_blob.py +248 -0
  21. render_sdk/public_api/api/blueprints/validate_blueprint.py +212 -0
  22. render_sdk/public_api/api/key_value/resume_key_value.py +203 -0
  23. render_sdk/public_api/api/key_value/suspend_key_value.py +203 -0
  24. render_sdk/public_api/api/metrics/get_bandwidth_sources.py +251 -0
  25. render_sdk/public_api/api/postgres/create_postgres_user.py +229 -0
  26. render_sdk/public_api/api/postgres/delete_postgres_user.py +201 -0
  27. render_sdk/public_api/api/postgres/list_postgres_users.py +195 -0
  28. render_sdk/public_api/api/redis_deprecated/__init__.py +1 -0
  29. render_sdk/public_api/api/{redis → redis_deprecated}/create_redis.py +4 -4
  30. render_sdk/public_api/api/{redis → redis_deprecated}/delete_redis.py +4 -4
  31. render_sdk/public_api/api/{redis → redis_deprecated}/list_redis.py +4 -0
  32. render_sdk/public_api/api/{redis → redis_deprecated}/retrieve_redis.py +4 -4
  33. render_sdk/public_api/api/{redis → redis_deprecated}/retrieve_redis_connection_info.py +4 -0
  34. render_sdk/public_api/api/{redis → redis_deprecated}/update_redis.py +4 -4
  35. render_sdk/public_api/api/services/create_service.py +4 -4
  36. render_sdk/public_api/api/workflow_tasks_ea/__init__.py +1 -0
  37. render_sdk/public_api/api/{workflows → workflow_tasks_ea}/cancel_task_run.py +12 -4
  38. render_sdk/public_api/api/{workflows → workflow_tasks_ea}/create_task.py +12 -4
  39. render_sdk/public_api/api/{workflows → workflow_tasks_ea}/get_task.py +12 -4
  40. render_sdk/public_api/api/{workflows → workflow_tasks_ea}/get_task_run.py +12 -4
  41. render_sdk/public_api/api/{workflows → workflow_tasks_ea}/list_task_runs.py +12 -0
  42. render_sdk/public_api/api/{workflows → workflow_tasks_ea}/list_tasks.py +24 -12
  43. render_sdk/public_api/api/workflows_ea/__init__.py +1 -0
  44. render_sdk/public_api/api/workflows_ea/create_workflow.py +199 -0
  45. render_sdk/public_api/api/{workflows/deploy_workflow.py → workflows_ea/create_workflow_version.py} +31 -14
  46. render_sdk/public_api/api/{workflows → workflows_ea}/delete_workflow.py +12 -4
  47. render_sdk/public_api/api/{workflows → workflows_ea}/get_workflow.py +32 -14
  48. render_sdk/public_api/api/{workflows → workflows_ea}/get_workflow_version.py +12 -4
  49. render_sdk/public_api/api/workflows_ea/list_workflow_versions.py +275 -0
  50. render_sdk/public_api/api/{workflows → workflows_ea}/list_workflows.py +41 -14
  51. render_sdk/public_api/api/workflows_ea/update_workflow.py +212 -0
  52. render_sdk/public_api/api/workspaces/remove_workspace_member.py +206 -0
  53. render_sdk/public_api/api/workspaces/update_workspace_member.py +235 -0
  54. render_sdk/public_api/models/__init__.py +82 -4
  55. render_sdk/public_api/models/audit_log.py +113 -0
  56. render_sdk/public_api/models/audit_log_actor.py +80 -0
  57. render_sdk/public_api/models/audit_log_actor_type.py +10 -0
  58. render_sdk/public_api/models/audit_log_event.py +80 -0
  59. render_sdk/public_api/models/audit_log_metadata.py +49 -0
  60. render_sdk/public_api/models/audit_log_status.py +9 -0
  61. render_sdk/public_api/models/audit_log_with_cursor.py +73 -0
  62. render_sdk/public_api/models/background_worker_details.py +2 -2
  63. render_sdk/public_api/models/background_worker_details_patch.py +1 -1
  64. render_sdk/public_api/models/background_worker_details_post.py +1 -1
  65. render_sdk/public_api/models/blob_metadata.py +85 -0
  66. render_sdk/public_api/models/blob_with_cursor.py +73 -0
  67. render_sdk/public_api/models/cache.py +6 -4
  68. render_sdk/public_api/models/cache_profile.py +10 -0
  69. render_sdk/public_api/models/create_deploy_body.py +23 -0
  70. render_sdk/public_api/models/create_version.py +70 -0
  71. render_sdk/public_api/models/credential_create_input.py +59 -0
  72. render_sdk/public_api/models/cron_job_details.py +2 -2
  73. render_sdk/public_api/models/cron_job_details_patch.py +1 -1
  74. render_sdk/public_api/models/cron_job_details_post.py +1 -1
  75. render_sdk/public_api/models/deploy_mode.py +9 -0
  76. render_sdk/public_api/models/event.py +11 -27
  77. render_sdk/public_api/models/event_type.py +1 -1
  78. render_sdk/public_api/models/get_bandwidth_sources_response_200.py +75 -0
  79. render_sdk/public_api/models/get_bandwidth_sources_response_200_data_item.py +101 -0
  80. render_sdk/public_api/models/get_bandwidth_sources_response_200_data_item_labels.py +78 -0
  81. render_sdk/public_api/models/get_bandwidth_sources_response_200_data_item_labels_traffic_source.py +12 -0
  82. render_sdk/public_api/models/get_bandwidth_sources_response_200_data_item_values_item.py +68 -0
  83. render_sdk/public_api/models/{server_unhealthy.py → get_bandwidth_sources_response_400.py} +12 -12
  84. render_sdk/public_api/models/get_blob_output.py +71 -0
  85. render_sdk/public_api/models/list_postgres_users_response_200_item.py +86 -0
  86. render_sdk/public_api/models/otel_provider_type.py +2 -0
  87. render_sdk/public_api/models/postgres.py +8 -0
  88. render_sdk/public_api/models/postgres_detail.py +26 -0
  89. render_sdk/public_api/models/postgres_parameter_overrides.py +44 -0
  90. render_sdk/public_api/models/postgres_patch_input.py +27 -0
  91. render_sdk/public_api/models/postgres_post_input.py +27 -0
  92. render_sdk/public_api/models/postgres_version.py +1 -0
  93. render_sdk/public_api/models/preview_input.py +2 -2
  94. render_sdk/public_api/models/private_service_details.py +2 -2
  95. render_sdk/public_api/models/private_service_details_patch.py +1 -1
  96. render_sdk/public_api/models/private_service_details_post.py +1 -1
  97. render_sdk/public_api/models/project_post_environment_input.py +26 -1
  98. render_sdk/public_api/models/put_blob_input.py +59 -0
  99. render_sdk/public_api/models/put_blob_output.py +79 -0
  100. render_sdk/public_api/models/read_replica.py +25 -1
  101. render_sdk/public_api/models/read_replica_input.py +25 -1
  102. render_sdk/public_api/models/run_task.py +35 -7
  103. render_sdk/public_api/models/service_event.py +12 -27
  104. render_sdk/public_api/models/service_event_type.py +0 -1
  105. render_sdk/public_api/models/service_post.py +9 -6
  106. render_sdk/public_api/models/task_attempt.py +88 -0
  107. render_sdk/public_api/models/task_attempt_details.py +108 -0
  108. render_sdk/public_api/models/task_data_type_1.py +44 -0
  109. render_sdk/public_api/models/task_run.py +23 -1
  110. render_sdk/public_api/models/task_run_details.py +50 -5
  111. render_sdk/public_api/models/task_run_status.py +1 -0
  112. render_sdk/public_api/models/task_with_cursor.py +73 -0
  113. render_sdk/public_api/models/team_member.py +5 -4
  114. render_sdk/public_api/models/team_member_role.py +12 -0
  115. render_sdk/public_api/models/update_workspace_member_body.py +61 -0
  116. render_sdk/public_api/models/validate_blueprint_request.py +84 -0
  117. render_sdk/public_api/models/validate_blueprint_response.py +105 -0
  118. render_sdk/public_api/models/validation_error.py +88 -0
  119. render_sdk/public_api/models/validation_plan_summary.py +107 -0
  120. render_sdk/public_api/models/web_service_details.py +2 -2
  121. render_sdk/public_api/models/web_service_details_patch.py +6 -5
  122. render_sdk/public_api/models/web_service_details_post.py +6 -5
  123. render_sdk/public_api/models/workflow.py +144 -0
  124. render_sdk/public_api/models/workflow_create.py +99 -0
  125. render_sdk/public_api/models/workflow_update.py +90 -0
  126. render_sdk/public_api/models/workflow_version.py +10 -14
  127. render_sdk/public_api/models/workflow_version_status.py +13 -0
  128. render_sdk/public_api/models/workflow_version_with_cursor.py +73 -0
  129. render_sdk/public_api/models/workflow_with_cursor.py +73 -0
  130. render_sdk/render.py +65 -0
  131. render_sdk/version.py +27 -0
  132. render_sdk/workflows/__init__.py +5 -1
  133. render_sdk/workflows/app.py +262 -0
  134. render_sdk/workflows/callback_api/models/__init__.py +2 -0
  135. render_sdk/workflows/callback_api/models/task.py +21 -0
  136. render_sdk/workflows/callback_api/models/task_options.py +18 -0
  137. render_sdk/workflows/callback_api/models/task_parameter.py +88 -0
  138. render_sdk/workflows/callback_api/py.typed +1 -1
  139. render_sdk/workflows/cli.py +58 -0
  140. render_sdk/workflows/client.py +8 -9
  141. render_sdk/workflows/executor.py +19 -7
  142. render_sdk/workflows/runner.py +43 -10
  143. render_sdk/workflows/task.py +84 -5
  144. render_sdk/workflows/tests/test_app.py +412 -0
  145. render_sdk/workflows/tests/test_cli.py +134 -0
  146. render_sdk/workflows/tests/test_end_to_end.py +71 -1
  147. render_sdk/workflows/tests/test_registration.py +58 -1
  148. {render_sdk-0.1.2.dist-info → render_sdk-0.2.0.dist-info}/METADATA +4 -3
  149. {render_sdk-0.1.2.dist-info → render_sdk-0.2.0.dist-info}/RECORD +155 -83
  150. {render_sdk-0.1.2.dist-info → render_sdk-0.2.0.dist-info}/WHEEL +1 -1
  151. render_sdk-0.2.0.dist-info/entry_points.txt +3 -0
  152. render_sdk/public_api/models/image_version.py +0 -79
  153. /render_sdk/public_api/api/{redis → audit_logs}/__init__.py +0 -0
  154. /render_sdk/public_api/api/{workflows → blob_storage}/__init__.py +0 -0
  155. /render_sdk/public_api/api/{workflows → workflow_tasks_ea}/stream_task_runs_events.py +0 -0
  156. {render_sdk-0.1.2.dist-info → render_sdk-0.2.0.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,90 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, TypeVar, Union
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ from ..types import UNSET, Unset
8
+
9
+ if TYPE_CHECKING:
10
+ from ..models.build_config import BuildConfig
11
+
12
+
13
+ T = TypeVar("T", bound="WorkflowUpdate")
14
+
15
+
16
+ @_attrs_define
17
+ class WorkflowUpdate:
18
+ """
19
+ Attributes:
20
+ name (Union[Unset, str]):
21
+ build_config (Union[Unset, BuildConfig]):
22
+ run_command (Union[Unset, str]): The command to run the workflow
23
+ """
24
+
25
+ name: Union[Unset, str] = UNSET
26
+ build_config: Union[Unset, "BuildConfig"] = UNSET
27
+ run_command: Union[Unset, str] = UNSET
28
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
29
+
30
+ def to_dict(self) -> dict[str, Any]:
31
+ name = self.name
32
+
33
+ build_config: Union[Unset, dict[str, Any]] = UNSET
34
+ if not isinstance(self.build_config, Unset):
35
+ build_config = self.build_config.to_dict()
36
+
37
+ run_command = self.run_command
38
+
39
+ field_dict: dict[str, Any] = {}
40
+ field_dict.update(self.additional_properties)
41
+ field_dict.update({})
42
+ if name is not UNSET:
43
+ field_dict["name"] = name
44
+ if build_config is not UNSET:
45
+ field_dict["buildConfig"] = build_config
46
+ if run_command is not UNSET:
47
+ field_dict["runCommand"] = run_command
48
+
49
+ return field_dict
50
+
51
+ @classmethod
52
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
53
+ from ..models.build_config import BuildConfig
54
+
55
+ d = dict(src_dict)
56
+ name = d.pop("name", UNSET)
57
+
58
+ _build_config = d.pop("buildConfig", UNSET)
59
+ build_config: Union[Unset, BuildConfig]
60
+ if isinstance(_build_config, Unset):
61
+ build_config = UNSET
62
+ else:
63
+ build_config = BuildConfig.from_dict(_build_config)
64
+
65
+ run_command = d.pop("runCommand", UNSET)
66
+
67
+ workflow_update = cls(
68
+ name=name,
69
+ build_config=build_config,
70
+ run_command=run_command,
71
+ )
72
+
73
+ workflow_update.additional_properties = d
74
+ return workflow_update
75
+
76
+ @property
77
+ def additional_keys(self) -> list[str]:
78
+ return list(self.additional_properties.keys())
79
+
80
+ def __getitem__(self, key: str) -> Any:
81
+ return self.additional_properties[key]
82
+
83
+ def __setitem__(self, key: str, value: Any) -> None:
84
+ self.additional_properties[key] = value
85
+
86
+ def __delitem__(self, key: str) -> None:
87
+ del self.additional_properties[key]
88
+
89
+ def __contains__(self, key: str) -> bool:
90
+ return key in self.additional_properties
@@ -1,14 +1,12 @@
1
1
  import datetime
2
2
  from collections.abc import Mapping
3
- from typing import TYPE_CHECKING, Any, TypeVar
3
+ from typing import Any, TypeVar
4
4
 
5
5
  from attrs import define as _attrs_define
6
6
  from attrs import field as _attrs_field
7
7
  from dateutil.parser import isoparse
8
8
 
9
- if TYPE_CHECKING:
10
- from ..models.image_version import ImageVersion
11
-
9
+ from ..models.workflow_version_status import WorkflowVersionStatus
12
10
 
13
11
  T = TypeVar("T", bound="WorkflowVersion")
14
12
 
@@ -20,15 +18,15 @@ class WorkflowVersion:
20
18
  id (str):
21
19
  workflow_id (str):
22
20
  name (str):
23
- image (ImageVersion):
24
21
  created_at (datetime.datetime):
22
+ status (WorkflowVersionStatus):
25
23
  """
26
24
 
27
25
  id: str
28
26
  workflow_id: str
29
27
  name: str
30
- image: "ImageVersion"
31
28
  created_at: datetime.datetime
29
+ status: WorkflowVersionStatus
32
30
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
33
31
 
34
32
  def to_dict(self) -> dict[str, Any]:
@@ -38,10 +36,10 @@ class WorkflowVersion:
38
36
 
39
37
  name = self.name
40
38
 
41
- image = self.image.to_dict()
42
-
43
39
  created_at = self.created_at.isoformat()
44
40
 
41
+ status = self.status.value
42
+
45
43
  field_dict: dict[str, Any] = {}
46
44
  field_dict.update(self.additional_properties)
47
45
  field_dict.update(
@@ -49,8 +47,8 @@ class WorkflowVersion:
49
47
  "id": id,
50
48
  "workflowId": workflow_id,
51
49
  "name": name,
52
- "image": image,
53
50
  "createdAt": created_at,
51
+ "status": status,
54
52
  }
55
53
  )
56
54
 
@@ -58,8 +56,6 @@ class WorkflowVersion:
58
56
 
59
57
  @classmethod
60
58
  def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
61
- from ..models.image_version import ImageVersion
62
-
63
59
  d = dict(src_dict)
64
60
  id = d.pop("id")
65
61
 
@@ -67,16 +63,16 @@ class WorkflowVersion:
67
63
 
68
64
  name = d.pop("name")
69
65
 
70
- image = ImageVersion.from_dict(d.pop("image"))
71
-
72
66
  created_at = isoparse(d.pop("createdAt"))
73
67
 
68
+ status = WorkflowVersionStatus(d.pop("status"))
69
+
74
70
  workflow_version = cls(
75
71
  id=id,
76
72
  workflow_id=workflow_id,
77
73
  name=name,
78
- image=image,
79
74
  created_at=created_at,
75
+ status=status,
80
76
  )
81
77
 
82
78
  workflow_version.additional_properties = d
@@ -0,0 +1,13 @@
1
+ from enum import Enum
2
+
3
+
4
+ class WorkflowVersionStatus(str, Enum):
5
+ BUILDING = "building"
6
+ BUILD_FAILED = "build_failed"
7
+ CREATED = "created"
8
+ READY = "ready"
9
+ REGISTERING = "registering"
10
+ REGISTRATION_FAILED = "registration_failed"
11
+
12
+ def __str__(self) -> str:
13
+ return str(self.value)
@@ -0,0 +1,73 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ if TYPE_CHECKING:
8
+ from ..models.workflow_version import WorkflowVersion
9
+
10
+
11
+ T = TypeVar("T", bound="WorkflowVersionWithCursor")
12
+
13
+
14
+ @_attrs_define
15
+ class WorkflowVersionWithCursor:
16
+ """
17
+ Attributes:
18
+ workflow_version (WorkflowVersion):
19
+ cursor (str):
20
+ """
21
+
22
+ workflow_version: "WorkflowVersion"
23
+ cursor: str
24
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
25
+
26
+ def to_dict(self) -> dict[str, Any]:
27
+ workflow_version = self.workflow_version.to_dict()
28
+
29
+ cursor = self.cursor
30
+
31
+ field_dict: dict[str, Any] = {}
32
+ field_dict.update(self.additional_properties)
33
+ field_dict.update(
34
+ {
35
+ "workflowVersion": workflow_version,
36
+ "cursor": cursor,
37
+ }
38
+ )
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
44
+ from ..models.workflow_version import WorkflowVersion
45
+
46
+ d = dict(src_dict)
47
+ workflow_version = WorkflowVersion.from_dict(d.pop("workflowVersion"))
48
+
49
+ cursor = d.pop("cursor")
50
+
51
+ workflow_version_with_cursor = cls(
52
+ workflow_version=workflow_version,
53
+ cursor=cursor,
54
+ )
55
+
56
+ workflow_version_with_cursor.additional_properties = d
57
+ return workflow_version_with_cursor
58
+
59
+ @property
60
+ def additional_keys(self) -> list[str]:
61
+ return list(self.additional_properties.keys())
62
+
63
+ def __getitem__(self, key: str) -> Any:
64
+ return self.additional_properties[key]
65
+
66
+ def __setitem__(self, key: str, value: Any) -> None:
67
+ self.additional_properties[key] = value
68
+
69
+ def __delitem__(self, key: str) -> None:
70
+ del self.additional_properties[key]
71
+
72
+ def __contains__(self, key: str) -> bool:
73
+ return key in self.additional_properties
@@ -0,0 +1,73 @@
1
+ from collections.abc import Mapping
2
+ from typing import TYPE_CHECKING, Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ if TYPE_CHECKING:
8
+ from ..models.workflow import Workflow
9
+
10
+
11
+ T = TypeVar("T", bound="WorkflowWithCursor")
12
+
13
+
14
+ @_attrs_define
15
+ class WorkflowWithCursor:
16
+ """
17
+ Attributes:
18
+ workflow (Workflow):
19
+ cursor (str):
20
+ """
21
+
22
+ workflow: "Workflow"
23
+ cursor: str
24
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
25
+
26
+ def to_dict(self) -> dict[str, Any]:
27
+ workflow = self.workflow.to_dict()
28
+
29
+ cursor = self.cursor
30
+
31
+ field_dict: dict[str, Any] = {}
32
+ field_dict.update(self.additional_properties)
33
+ field_dict.update(
34
+ {
35
+ "workflow": workflow,
36
+ "cursor": cursor,
37
+ }
38
+ )
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
44
+ from ..models.workflow import Workflow
45
+
46
+ d = dict(src_dict)
47
+ workflow = Workflow.from_dict(d.pop("workflow"))
48
+
49
+ cursor = d.pop("cursor")
50
+
51
+ workflow_with_cursor = cls(
52
+ workflow=workflow,
53
+ cursor=cursor,
54
+ )
55
+
56
+ workflow_with_cursor.additional_properties = d
57
+ return workflow_with_cursor
58
+
59
+ @property
60
+ def additional_keys(self) -> list[str]:
61
+ return list(self.additional_properties.keys())
62
+
63
+ def __getitem__(self, key: str) -> Any:
64
+ return self.additional_properties[key]
65
+
66
+ def __setitem__(self, key: str, value: Any) -> None:
67
+ self.additional_properties[key] = value
68
+
69
+ def __delitem__(self, key: str) -> None:
70
+ del self.additional_properties[key]
71
+
72
+ def __contains__(self, key: str) -> bool:
73
+ return key in self.additional_properties
render_sdk/render.py ADDED
@@ -0,0 +1,65 @@
1
+ """Unified REST API client for Render services."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ if TYPE_CHECKING:
8
+ from render_sdk.client import Client
9
+ from render_sdk.client.workflows import WorkflowsService
10
+
11
+
12
+ class Render:
13
+ """
14
+ Unified REST API client for all Render services.
15
+
16
+ This is the primary entry point for interacting with Render's APIs.
17
+
18
+ Example:
19
+ render = Render() # Uses RENDER_API_KEY from environment
20
+
21
+ # Run a task
22
+ result = await render.workflows.run_task("my-workflow/my-task", [42])
23
+
24
+ # Direct client access for advanced use cases
25
+ render.client.workflows.run_task(...)
26
+ """
27
+
28
+ _client: Client
29
+
30
+ def __init__(
31
+ self,
32
+ *,
33
+ token: str | None = None,
34
+ base_url: str = "https://api.render.com",
35
+ ) -> None:
36
+ """
37
+ Initialize the Render SDK.
38
+
39
+ Args:
40
+ token: API token. If not provided, uses RENDER_API_KEY env var.
41
+ base_url: API base URL (rarely needed).
42
+ """
43
+ from render_sdk.client import Client
44
+
45
+ self._client = Client(token=token, base_url=base_url)
46
+
47
+ @property
48
+ def client(self) -> Client:
49
+ """
50
+ Access to the underlying API client.
51
+
52
+ Use this for fine-grained control or advanced use cases.
53
+
54
+ Example:
55
+ render = Render()
56
+
57
+ # Access client directly
58
+ render.client.workflows.run_task(...)
59
+ """
60
+ return self._client
61
+
62
+ @property
63
+ def workflows(self) -> WorkflowsService:
64
+ """REST API for workflow operations (run tasks, get status)."""
65
+ return self._client.workflows
render_sdk/version.py ADDED
@@ -0,0 +1,27 @@
1
+ """Version information for the Render SDK."""
2
+
3
+ import importlib.metadata
4
+ import platform
5
+
6
+
7
+ def get_version() -> str:
8
+ """Get the SDK version from package metadata."""
9
+ try:
10
+ return importlib.metadata.version("render_sdk")
11
+ except importlib.metadata.PackageNotFoundError:
12
+ return "unknown"
13
+
14
+
15
+ def get_user_agent() -> str:
16
+ """Get the User-Agent string for the SDK.
17
+
18
+ Returns a string like:
19
+ render-sdk-python/0.1.3 (cpython/3.11.4; darwin/arm64)
20
+ """
21
+ version = get_version()
22
+ impl = platform.python_implementation().lower()
23
+ py_version = platform.python_version()
24
+ os_name = platform.system().lower()
25
+ arch = platform.machine().lower()
26
+
27
+ return f"render-sdk-python/{version} ({impl}/{py_version}; {os_name}/{arch})"
@@ -1,3 +1,6 @@
1
+ """Render SDK - Durable Workflows Task Definition"""
2
+
3
+ from render_sdk.workflows.app import Workflows
1
4
  from render_sdk.workflows.runner import start
2
5
  from render_sdk.workflows.task import Options, Retry, TaskRegistry, task
3
6
 
@@ -5,7 +8,8 @@ __all__ = [
5
8
  "Options",
6
9
  "Retry",
7
10
  "TaskRegistry",
8
- "create_task_decorator",
11
+ "Workflows",
12
+ # Deprecated: use Workflows.task and Workflows.start() instead
9
13
  "start",
10
14
  "task",
11
15
  ]