blaxel 0.2.26rc119__py3-none-any.whl → 0.2.28__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 (118) hide show
  1. blaxel/__init__.py +2 -2
  2. blaxel/core/__init__.py +9 -1
  3. blaxel/core/client/api/{privateclusters/create_private_cluster.py → images/cleanup_images.py} +31 -25
  4. blaxel/core/client/models/__init__.py +2 -4
  5. blaxel/core/client/models/agent.py +1 -0
  6. blaxel/core/client/models/agent_spec.py +1 -24
  7. blaxel/core/client/models/billable_time_metric.py +1 -0
  8. blaxel/core/{sandbox/client/models/find_match.py → client/models/cleanup_images_response_200.py} +19 -19
  9. blaxel/core/client/models/configuration.py +1 -0
  10. blaxel/core/client/models/core_event.py +9 -0
  11. blaxel/core/client/models/core_spec.py +1 -24
  12. blaxel/core/client/models/core_spec_configurations.py +1 -0
  13. blaxel/core/client/models/create_job_execution_request.py +1 -0
  14. blaxel/core/client/models/create_job_execution_response.py +1 -0
  15. blaxel/core/client/models/custom_domain.py +1 -0
  16. blaxel/core/client/models/custom_domain_metadata.py +1 -0
  17. blaxel/core/client/models/custom_domain_spec.py +1 -0
  18. blaxel/core/client/models/delete_volume_template_version_response_200.py +1 -0
  19. blaxel/core/client/models/entrypoint.py +1 -0
  20. blaxel/core/client/models/form.py +1 -0
  21. blaxel/core/client/models/function.py +1 -0
  22. blaxel/core/client/models/function_spec.py +1 -24
  23. blaxel/core/client/models/image.py +1 -0
  24. blaxel/core/client/models/image_spec.py +1 -0
  25. blaxel/core/client/models/integration.py +1 -0
  26. blaxel/core/client/models/integration_connection.py +1 -0
  27. blaxel/core/client/models/integration_connection_spec.py +1 -0
  28. blaxel/core/client/models/integration_endpoint.py +1 -0
  29. blaxel/core/client/models/integration_endpoints.py +2 -0
  30. blaxel/core/client/models/job.py +1 -0
  31. blaxel/core/client/models/job_execution.py +1 -0
  32. blaxel/core/client/models/job_execution_spec.py +1 -0
  33. blaxel/core/client/models/job_execution_task.py +1 -0
  34. blaxel/core/client/models/job_metrics.py +1 -0
  35. blaxel/core/client/models/job_spec.py +1 -24
  36. blaxel/core/client/models/jobs_network_chart.py +1 -0
  37. blaxel/core/client/models/jobs_success_failed_chart.py +1 -0
  38. blaxel/core/client/models/latency_metric.py +1 -0
  39. blaxel/core/client/models/location_response.py +1 -0
  40. blaxel/core/client/models/mcp_definition.py +1 -0
  41. blaxel/core/client/models/metadata.py +1 -0
  42. blaxel/core/client/models/metrics.py +34 -0
  43. blaxel/core/client/models/model.py +1 -0
  44. blaxel/core/client/models/model_spec.py +1 -24
  45. blaxel/core/client/models/pending_invitation_accept.py +1 -0
  46. blaxel/core/client/models/pending_invitation_render.py +1 -0
  47. blaxel/core/client/models/policy.py +1 -0
  48. blaxel/core/client/models/policy_spec.py +1 -0
  49. blaxel/core/client/models/preview.py +1 -0
  50. blaxel/core/client/models/preview_spec.py +1 -0
  51. blaxel/core/client/models/preview_token.py +1 -0
  52. blaxel/core/client/models/public_ips.py +1 -0
  53. blaxel/core/client/models/request_duration_over_time_metrics.py +1 -0
  54. blaxel/core/client/models/request_total_by_origin_metric.py +1 -0
  55. blaxel/core/client/models/request_total_metric.py +1 -0
  56. blaxel/core/client/models/resource_metrics.py +1 -0
  57. blaxel/core/client/models/revision_configuration.py +9 -0
  58. blaxel/core/client/models/runtime.py +1 -0
  59. blaxel/core/client/models/sandbox.py +1 -0
  60. blaxel/core/client/models/sandbox_definition.py +1 -0
  61. blaxel/core/client/models/sandbox_lifecycle.py +1 -0
  62. blaxel/core/client/models/sandbox_spec.py +1 -24
  63. blaxel/core/client/models/serverless_config.py +1 -0
  64. blaxel/core/client/models/start_sandbox.py +1 -0
  65. blaxel/core/client/models/stop_sandbox.py +1 -0
  66. blaxel/core/client/models/store_agent.py +1 -0
  67. blaxel/core/client/models/store_configuration.py +1 -0
  68. blaxel/core/client/models/template.py +1 -0
  69. blaxel/core/client/models/time_to_first_token_over_time_metrics.py +1 -0
  70. blaxel/core/client/models/token_rate_metrics.py +1 -0
  71. blaxel/core/client/models/trigger.py +10 -0
  72. blaxel/core/client/models/trigger_configuration.py +28 -0
  73. blaxel/core/client/models/volume.py +1 -0
  74. blaxel/core/client/models/volume_template.py +1 -0
  75. blaxel/core/client/models/websocket_channel.py +9 -0
  76. blaxel/core/client/models/workspace.py +1 -0
  77. blaxel/core/client/response_interceptor.py +0 -1
  78. blaxel/core/common/__init__.py +10 -0
  79. blaxel/core/common/autoload.py +5 -4
  80. blaxel/core/common/settings.py +29 -0
  81. blaxel/core/common/webhook.py +187 -0
  82. blaxel/core/jobs/__init__.py +355 -8
  83. blaxel/core/sandbox/client/models/__init__.py +0 -16
  84. blaxel/core/sandbox/default/action.py +10 -27
  85. blaxel/core/sandbox/default/filesystem.py +52 -187
  86. blaxel/core/sandbox/default/interpreter.py +55 -62
  87. blaxel/core/sandbox/default/process.py +46 -66
  88. blaxel/core/sandbox/sync/filesystem.py +5 -2
  89. blaxel/googleadk/model.py +0 -1
  90. blaxel/livekit/model.py +0 -1
  91. {blaxel-0.2.26rc119.dist-info → blaxel-0.2.28.dist-info}/METADATA +2 -2
  92. {blaxel-0.2.26rc119.dist-info → blaxel-0.2.28.dist-info}/RECORD +94 -117
  93. blaxel/core/client/api/privateclusters/__init__.py +0 -0
  94. blaxel/core/client/api/privateclusters/delete_private_cluster.py +0 -152
  95. blaxel/core/client/api/privateclusters/get_private_cluster.py +0 -155
  96. blaxel/core/client/api/privateclusters/get_private_cluster_health.py +0 -97
  97. blaxel/core/client/api/privateclusters/list_private_clusters.py +0 -136
  98. blaxel/core/client/api/privateclusters/update_private_cluster.py +0 -152
  99. blaxel/core/client/api/privateclusters/update_private_cluster_health.py +0 -97
  100. blaxel/core/client/models/model_private_cluster.py +0 -79
  101. blaxel/core/client/models/private_cluster.py +0 -183
  102. blaxel/core/sandbox/client/api/filesystem/delete_filesystem_tree_path.py +0 -188
  103. blaxel/core/sandbox/client/api/filesystem/get_filesystem_content_search_path.py +0 -265
  104. blaxel/core/sandbox/client/api/filesystem/get_filesystem_find_path.py +0 -248
  105. blaxel/core/sandbox/client/api/filesystem/get_filesystem_search_path.py +0 -237
  106. blaxel/core/sandbox/client/api/filesystem/get_filesystem_tree_path.py +0 -197
  107. blaxel/core/sandbox/client/api/filesystem/put_filesystem_tree_path.py +0 -223
  108. blaxel/core/sandbox/client/api/websocket/__init__.py +0 -0
  109. blaxel/core/sandbox/client/api/websocket/get_ws.py +0 -81
  110. blaxel/core/sandbox/client/models/content_search_match.py +0 -98
  111. blaxel/core/sandbox/client/models/content_search_response.py +0 -97
  112. blaxel/core/sandbox/client/models/find_response.py +0 -88
  113. blaxel/core/sandbox/client/models/fuzzy_search_match.py +0 -78
  114. blaxel/core/sandbox/client/models/fuzzy_search_response.py +0 -88
  115. blaxel/core/sandbox/client/models/tree_request.py +0 -76
  116. blaxel/core/sandbox/client/models/tree_request_files.py +0 -49
  117. {blaxel-0.2.26rc119.dist-info → blaxel-0.2.28.dist-info}/WHEEL +0 -0
  118. {blaxel-0.2.26rc119.dist-info → blaxel-0.2.28.dist-info}/licenses/LICENSE +0 -0
@@ -95,6 +95,7 @@ class ResourceMetrics:
95
95
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
96
96
 
97
97
  def to_dict(self) -> dict[str, Any]:
98
+
98
99
  billable_time: Union[Unset, dict[str, Any]] = UNSET
99
100
  if (
100
101
  self.billable_time
@@ -16,12 +16,14 @@ class RevisionConfiguration:
16
16
  active (Union[Unset, str]): Active revision id
17
17
  canary (Union[Unset, str]): Canary revision id
18
18
  canary_percent (Union[Unset, int]): Canary revision percent
19
+ sticky_session_ttl (Union[Unset, int]): Sticky session TTL in seconds (0 = disabled)
19
20
  traffic (Union[Unset, int]): Traffic percentage
20
21
  """
21
22
 
22
23
  active: Union[Unset, str] = UNSET
23
24
  canary: Union[Unset, str] = UNSET
24
25
  canary_percent: Union[Unset, int] = UNSET
26
+ sticky_session_ttl: Union[Unset, int] = UNSET
25
27
  traffic: Union[Unset, int] = UNSET
26
28
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
27
29
 
@@ -32,6 +34,8 @@ class RevisionConfiguration:
32
34
 
33
35
  canary_percent = self.canary_percent
34
36
 
37
+ sticky_session_ttl = self.sticky_session_ttl
38
+
35
39
  traffic = self.traffic
36
40
 
37
41
  field_dict: dict[str, Any] = {}
@@ -43,6 +47,8 @@ class RevisionConfiguration:
43
47
  field_dict["canary"] = canary
44
48
  if canary_percent is not UNSET:
45
49
  field_dict["canaryPercent"] = canary_percent
50
+ if sticky_session_ttl is not UNSET:
51
+ field_dict["stickySessionTtl"] = sticky_session_ttl
46
52
  if traffic is not UNSET:
47
53
  field_dict["traffic"] = traffic
48
54
 
@@ -59,12 +65,15 @@ class RevisionConfiguration:
59
65
 
60
66
  canary_percent = d.pop("canaryPercent", UNSET)
61
67
 
68
+ sticky_session_ttl = d.pop("stickySessionTtl", UNSET)
69
+
62
70
  traffic = d.pop("traffic", UNSET)
63
71
 
64
72
  revision_configuration = cls(
65
73
  active=active,
66
74
  canary=canary,
67
75
  canary_percent=canary_percent,
76
+ sticky_session_ttl=sticky_session_ttl,
68
77
  traffic=traffic,
69
78
  )
70
79
 
@@ -73,6 +73,7 @@ class Runtime:
73
73
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
74
74
 
75
75
  def to_dict(self) -> dict[str, Any]:
76
+
76
77
  args: Union[Unset, list[Any]] = UNSET
77
78
  if not isinstance(self.args, Unset):
78
79
  args = self.args
@@ -36,6 +36,7 @@ class Sandbox:
36
36
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
37
37
 
38
38
  def to_dict(self) -> dict[str, Any]:
39
+
39
40
  events: Union[Unset, list[dict[str, Any]]] = UNSET
40
41
  if not isinstance(self.events, Unset):
41
42
  events = []
@@ -50,6 +50,7 @@ class SandboxDefinition:
50
50
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
51
51
 
52
52
  def to_dict(self) -> dict[str, Any]:
53
+
53
54
  categories: Union[Unset, list[Any]] = UNSET
54
55
  if not isinstance(self.categories, Unset):
55
56
  categories = self.categories
@@ -24,6 +24,7 @@ class SandboxLifecycle:
24
24
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
25
25
 
26
26
  def to_dict(self) -> dict[str, Any]:
27
+
27
28
  expiration_policies: Union[Unset, list[dict[str, Any]]] = UNSET
28
29
  if not isinstance(self.expiration_policies, Unset):
29
30
  expiration_policies = []
@@ -8,7 +8,6 @@ from ..types import UNSET, Unset
8
8
  if TYPE_CHECKING:
9
9
  from ..models.core_spec_configurations import CoreSpecConfigurations
10
10
  from ..models.flavor import Flavor
11
- from ..models.model_private_cluster import ModelPrivateCluster
12
11
  from ..models.revision_configuration import RevisionConfiguration
13
12
  from ..models.runtime import Runtime
14
13
  from ..models.sandbox_lifecycle import SandboxLifecycle
@@ -28,7 +27,6 @@ class SandboxSpec:
28
27
  flavors (Union[Unset, list['Flavor']]): Types of hardware available for deployments
29
28
  integration_connections (Union[Unset, list[str]]):
30
29
  policies (Union[Unset, list[str]]):
31
- private_clusters (Union[Unset, ModelPrivateCluster]): Private cluster where the model deployment is deployed
32
30
  revision (Union[Unset, RevisionConfiguration]): Revision configuration
33
31
  runtime (Union[Unset, Runtime]): Set of configurations for a deployment
34
32
  sandbox (Union[Unset, bool]): Sandbox mode
@@ -42,7 +40,6 @@ class SandboxSpec:
42
40
  flavors: Union[Unset, list["Flavor"]] = UNSET
43
41
  integration_connections: Union[Unset, list[str]] = UNSET
44
42
  policies: Union[Unset, list[str]] = UNSET
45
- private_clusters: Union[Unset, "ModelPrivateCluster"] = UNSET
46
43
  revision: Union[Unset, "RevisionConfiguration"] = UNSET
47
44
  runtime: Union[Unset, "Runtime"] = UNSET
48
45
  sandbox: Union[Unset, bool] = UNSET
@@ -52,6 +49,7 @@ class SandboxSpec:
52
49
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
53
50
 
54
51
  def to_dict(self) -> dict[str, Any]:
52
+
55
53
  configurations: Union[Unset, dict[str, Any]] = UNSET
56
54
  if (
57
55
  self.configurations
@@ -82,16 +80,6 @@ class SandboxSpec:
82
80
  if not isinstance(self.policies, Unset):
83
81
  policies = self.policies
84
82
 
85
- private_clusters: Union[Unset, dict[str, Any]] = UNSET
86
- if (
87
- self.private_clusters
88
- and not isinstance(self.private_clusters, Unset)
89
- and not isinstance(self.private_clusters, dict)
90
- ):
91
- private_clusters = self.private_clusters.to_dict()
92
- elif self.private_clusters and isinstance(self.private_clusters, dict):
93
- private_clusters = self.private_clusters
94
-
95
83
  revision: Union[Unset, dict[str, Any]] = UNSET
96
84
  if self.revision and not isinstance(self.revision, Unset) and not isinstance(self.revision, dict):
97
85
  revision = self.revision.to_dict()
@@ -137,8 +125,6 @@ class SandboxSpec:
137
125
  field_dict["integrationConnections"] = integration_connections
138
126
  if policies is not UNSET:
139
127
  field_dict["policies"] = policies
140
- if private_clusters is not UNSET:
141
- field_dict["privateClusters"] = private_clusters
142
128
  if revision is not UNSET:
143
129
  field_dict["revision"] = revision
144
130
  if runtime is not UNSET:
@@ -158,7 +144,6 @@ class SandboxSpec:
158
144
  def from_dict(cls: type[T], src_dict: dict[str, Any]) -> T:
159
145
  from ..models.core_spec_configurations import CoreSpecConfigurations
160
146
  from ..models.flavor import Flavor
161
- from ..models.model_private_cluster import ModelPrivateCluster
162
147
  from ..models.revision_configuration import RevisionConfiguration
163
148
  from ..models.runtime import Runtime
164
149
  from ..models.sandbox_lifecycle import SandboxLifecycle
@@ -187,13 +172,6 @@ class SandboxSpec:
187
172
 
188
173
  policies = cast(list[str], d.pop("policies", UNSET))
189
174
 
190
- _private_clusters = d.pop("privateClusters", UNSET)
191
- private_clusters: Union[Unset, ModelPrivateCluster]
192
- if isinstance(_private_clusters, Unset):
193
- private_clusters = UNSET
194
- else:
195
- private_clusters = ModelPrivateCluster.from_dict(_private_clusters)
196
-
197
175
  _revision = d.pop("revision", UNSET)
198
176
  revision: Union[Unset, RevisionConfiguration]
199
177
  if isinstance(_revision, Unset):
@@ -234,7 +212,6 @@ class SandboxSpec:
234
212
  flavors=flavors,
235
213
  integration_connections=integration_connections,
236
214
  policies=policies,
237
- private_clusters=private_clusters,
238
215
  revision=revision,
239
216
  runtime=runtime,
240
217
  sandbox=sandbox,
@@ -33,6 +33,7 @@ class ServerlessConfig:
33
33
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
34
34
 
35
35
  def to_dict(self) -> dict[str, Any]:
36
+
36
37
  configuration: Union[Unset, dict[str, Any]] = UNSET
37
38
  if (
38
39
  self.configuration
@@ -28,6 +28,7 @@ class StartSandbox:
28
28
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
29
29
 
30
30
  def to_dict(self) -> dict[str, Any]:
31
+
31
32
  message = self.message
32
33
 
33
34
  metadata: Union[Unset, dict[str, Any]] = UNSET
@@ -28,6 +28,7 @@ class StopSandbox:
28
28
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
29
29
 
30
30
  def to_dict(self) -> dict[str, Any]:
31
+
31
32
  message = self.message
32
33
 
33
34
  metadata: Union[Unset, dict[str, Any]] = UNSET
@@ -45,6 +45,7 @@ class StoreAgent:
45
45
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
46
46
 
47
47
  def to_dict(self) -> dict[str, Any]:
48
+
48
49
  created_at = self.created_at
49
50
 
50
51
  updated_at = self.updated_at
@@ -40,6 +40,7 @@ class StoreConfiguration:
40
40
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
41
41
 
42
42
  def to_dict(self) -> dict[str, Any]:
43
+
43
44
  available_models: Union[Unset, list[str]] = UNSET
44
45
  if not isinstance(self.available_models, Unset):
45
46
  available_models = self.available_models
@@ -46,6 +46,7 @@ class Template:
46
46
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
47
47
 
48
48
  def to_dict(self) -> dict[str, Any]:
49
+
49
50
  default_branch = self.default_branch
50
51
 
51
52
  description = self.description
@@ -25,6 +25,7 @@ class TimeToFirstTokenOverTimeMetrics:
25
25
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
26
26
 
27
27
  def to_dict(self) -> dict[str, Any]:
28
+
28
29
  time_to_first_token_over_time: Union[Unset, list[dict[str, Any]]] = UNSET
29
30
  if not isinstance(self.time_to_first_token_over_time, Unset):
30
31
  time_to_first_token_over_time = []
@@ -28,6 +28,7 @@ class TokenRateMetrics:
28
28
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
29
29
 
30
30
  def to_dict(self) -> dict[str, Any]:
31
+
31
32
  token_rate: Union[Unset, list[dict[str, Any]]] = UNSET
32
33
  if not isinstance(self.token_rate, Unset):
33
34
  token_rate = []
@@ -18,16 +18,19 @@ class Trigger:
18
18
 
19
19
  Attributes:
20
20
  configuration (Union[Unset, TriggerConfiguration]): Trigger configuration
21
+ enabled (Union[Unset, bool]): Enable or disable the trigger (default: true)
21
22
  id (Union[Unset, str]): The id of the trigger
22
23
  type_ (Union[Unset, str]): The type of trigger, can be http or http-async
23
24
  """
24
25
 
25
26
  configuration: Union[Unset, "TriggerConfiguration"] = UNSET
27
+ enabled: Union[Unset, bool] = UNSET
26
28
  id: Union[Unset, str] = UNSET
27
29
  type_: Union[Unset, str] = UNSET
28
30
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
29
31
 
30
32
  def to_dict(self) -> dict[str, Any]:
33
+
31
34
  configuration: Union[Unset, dict[str, Any]] = UNSET
32
35
  if (
33
36
  self.configuration
@@ -38,6 +41,8 @@ class Trigger:
38
41
  elif self.configuration and isinstance(self.configuration, dict):
39
42
  configuration = self.configuration
40
43
 
44
+ enabled = self.enabled
45
+
41
46
  id = self.id
42
47
 
43
48
  type_ = self.type_
@@ -47,6 +52,8 @@ class Trigger:
47
52
  field_dict.update({})
48
53
  if configuration is not UNSET:
49
54
  field_dict["configuration"] = configuration
55
+ if enabled is not UNSET:
56
+ field_dict["enabled"] = enabled
50
57
  if id is not UNSET:
51
58
  field_dict["id"] = id
52
59
  if type_ is not UNSET:
@@ -68,12 +75,15 @@ class Trigger:
68
75
  else:
69
76
  configuration = TriggerConfiguration.from_dict(_configuration)
70
77
 
78
+ enabled = d.pop("enabled", UNSET)
79
+
71
80
  id = d.pop("id", UNSET)
72
81
 
73
82
  type_ = d.pop("type", UNSET)
74
83
 
75
84
  trigger = cls(
76
85
  configuration=configuration,
86
+ enabled=enabled,
77
87
  id=id,
78
88
  type_=type_,
79
89
  )
@@ -18,22 +18,33 @@ class TriggerConfiguration:
18
18
 
19
19
  Attributes:
20
20
  authentication_type (Union[Unset, str]): The authentication type of the trigger
21
+ callback_secret (Union[Unset, str]): The callback secret for async triggers (auto-generated, encrypted)
22
+ callback_url (Union[Unset, str]): The callback URL for async triggers (optional)
21
23
  path (Union[Unset, str]): The path of the trigger
22
24
  retry (Union[Unset, int]): The retry of the trigger
23
25
  schedule (Union[Unset, str]): The schedule of the trigger, cron expression * * * * *
24
26
  tasks (Union[Unset, list['TriggerConfigurationTask']]): The tasks configuration of the cronjob
27
+ timeout (Union[Unset, int]): The timeout in seconds for async triggers (max 900s, MK3 only)
25
28
  """
26
29
 
27
30
  authentication_type: Union[Unset, str] = UNSET
31
+ callback_secret: Union[Unset, str] = UNSET
32
+ callback_url: Union[Unset, str] = UNSET
28
33
  path: Union[Unset, str] = UNSET
29
34
  retry: Union[Unset, int] = UNSET
30
35
  schedule: Union[Unset, str] = UNSET
31
36
  tasks: Union[Unset, list["TriggerConfigurationTask"]] = UNSET
37
+ timeout: Union[Unset, int] = UNSET
32
38
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
33
39
 
34
40
  def to_dict(self) -> dict[str, Any]:
41
+
35
42
  authentication_type = self.authentication_type
36
43
 
44
+ callback_secret = self.callback_secret
45
+
46
+ callback_url = self.callback_url
47
+
37
48
  path = self.path
38
49
 
39
50
  retry = self.retry
@@ -50,11 +61,17 @@ class TriggerConfiguration:
50
61
  tasks_item = tasks_item_data.to_dict()
51
62
  tasks.append(tasks_item)
52
63
 
64
+ timeout = self.timeout
65
+
53
66
  field_dict: dict[str, Any] = {}
54
67
  field_dict.update(self.additional_properties)
55
68
  field_dict.update({})
56
69
  if authentication_type is not UNSET:
57
70
  field_dict["authenticationType"] = authentication_type
71
+ if callback_secret is not UNSET:
72
+ field_dict["callbackSecret"] = callback_secret
73
+ if callback_url is not UNSET:
74
+ field_dict["callbackUrl"] = callback_url
58
75
  if path is not UNSET:
59
76
  field_dict["path"] = path
60
77
  if retry is not UNSET:
@@ -63,6 +80,8 @@ class TriggerConfiguration:
63
80
  field_dict["schedule"] = schedule
64
81
  if tasks is not UNSET:
65
82
  field_dict["tasks"] = tasks
83
+ if timeout is not UNSET:
84
+ field_dict["timeout"] = timeout
66
85
 
67
86
  return field_dict
68
87
 
@@ -75,6 +94,10 @@ class TriggerConfiguration:
75
94
  d = src_dict.copy()
76
95
  authentication_type = d.pop("authenticationType", UNSET)
77
96
 
97
+ callback_secret = d.pop("callbackSecret", UNSET)
98
+
99
+ callback_url = d.pop("callbackUrl", UNSET)
100
+
78
101
  path = d.pop("path", UNSET)
79
102
 
80
103
  retry = d.pop("retry", UNSET)
@@ -88,12 +111,17 @@ class TriggerConfiguration:
88
111
 
89
112
  tasks.append(tasks_item)
90
113
 
114
+ timeout = d.pop("timeout", UNSET)
115
+
91
116
  trigger_configuration = cls(
92
117
  authentication_type=authentication_type,
118
+ callback_secret=callback_secret,
119
+ callback_url=callback_url,
93
120
  path=path,
94
121
  retry=retry,
95
122
  schedule=schedule,
96
123
  tasks=tasks,
124
+ timeout=timeout,
97
125
  )
98
126
 
99
127
  trigger_configuration.additional_properties = d
@@ -37,6 +37,7 @@ class Volume:
37
37
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
38
38
 
39
39
  def to_dict(self) -> dict[str, Any]:
40
+
40
41
  events: Union[Unset, list[dict[str, Any]]] = UNSET
41
42
  if not isinstance(self.events, Unset):
42
43
  events = []
@@ -33,6 +33,7 @@ class VolumeTemplate:
33
33
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
34
34
 
35
35
  def to_dict(self) -> dict[str, Any]:
36
+
36
37
  metadata: Union[Unset, dict[str, Any]] = UNSET
37
38
  if self.metadata and not isinstance(self.metadata, Unset) and not isinstance(self.metadata, dict):
38
39
  metadata = self.metadata.to_dict()
@@ -16,12 +16,14 @@ class WebsocketChannel:
16
16
  created_at (Union[Unset, str]): The date and time when the resource was created
17
17
  updated_at (Union[Unset, str]): The date and time when the resource was updated
18
18
  connection_id (Union[Unset, str]): Unique connection ID
19
+ source_region (Union[Unset, str]): Source region the connection belongs to
19
20
  workspace (Union[Unset, str]): Workspace the connection belongs to
20
21
  """
21
22
 
22
23
  created_at: Union[Unset, str] = UNSET
23
24
  updated_at: Union[Unset, str] = UNSET
24
25
  connection_id: Union[Unset, str] = UNSET
26
+ source_region: Union[Unset, str] = UNSET
25
27
  workspace: Union[Unset, str] = UNSET
26
28
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
27
29
 
@@ -32,6 +34,8 @@ class WebsocketChannel:
32
34
 
33
35
  connection_id = self.connection_id
34
36
 
37
+ source_region = self.source_region
38
+
35
39
  workspace = self.workspace
36
40
 
37
41
  field_dict: dict[str, Any] = {}
@@ -43,6 +47,8 @@ class WebsocketChannel:
43
47
  field_dict["updatedAt"] = updated_at
44
48
  if connection_id is not UNSET:
45
49
  field_dict["connection_id"] = connection_id
50
+ if source_region is not UNSET:
51
+ field_dict["sourceRegion"] = source_region
46
52
  if workspace is not UNSET:
47
53
  field_dict["workspace"] = workspace
48
54
 
@@ -59,12 +65,15 @@ class WebsocketChannel:
59
65
 
60
66
  connection_id = d.pop("connection_id", UNSET)
61
67
 
68
+ source_region = d.pop("sourceRegion", UNSET)
69
+
62
70
  workspace = d.pop("workspace", UNSET)
63
71
 
64
72
  websocket_channel = cls(
65
73
  created_at=created_at,
66
74
  updated_at=updated_at,
67
75
  connection_id=connection_id,
76
+ source_region=source_region,
68
77
  workspace=workspace,
69
78
  )
70
79
 
@@ -50,6 +50,7 @@ class Workspace:
50
50
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
51
51
 
52
52
  def to_dict(self) -> dict[str, Any]:
53
+
53
54
  created_at = self.created_at
54
55
 
55
56
  updated_at = self.updated_at
@@ -94,4 +94,3 @@ response_interceptors_sync = [
94
94
  response_interceptors_async = [
95
95
  authentication_error_interceptor_async,
96
96
  ]
97
-
@@ -2,6 +2,12 @@ from .autoload import autoload, capture_exception
2
2
  from .env import env
3
3
  from .internal import get_alphanumeric_limited_hash, get_global_unique_hash
4
4
  from .settings import Settings, settings
5
+ from .webhook import (
6
+ AsyncSidecarCallback,
7
+ RequestLike,
8
+ verify_webhook_from_request,
9
+ verify_webhook_signature,
10
+ )
5
11
 
6
12
  __all__ = [
7
13
  "autoload",
@@ -11,4 +17,8 @@ __all__ = [
11
17
  "env",
12
18
  "get_alphanumeric_limited_hash",
13
19
  "get_global_unique_hash",
20
+ "verify_webhook_signature",
21
+ "verify_webhook_from_request",
22
+ "AsyncSidecarCallback",
23
+ "RequestLike",
14
24
  ]
@@ -112,10 +112,11 @@ def autoload() -> None:
112
112
  httpx_sandbox_async_client = client_sandbox.get_async_httpx_client()
113
113
  httpx_sandbox_async_client.event_hooks["response"] = response_interceptors_async
114
114
 
115
- try:
116
- sentry()
117
- except Exception:
118
- pass
115
+ if settings.tracking:
116
+ try:
117
+ sentry()
118
+ except Exception:
119
+ pass
119
120
 
120
121
  try:
121
122
  telemetry()
@@ -1,7 +1,10 @@
1
1
  import os
2
2
  import platform
3
+ from pathlib import Path
3
4
  from typing import Dict
4
5
 
6
+ import yaml
7
+
5
8
  from ..authentication import BlaxelAuth, auth
6
9
  from .logger import init_logger
7
10
 
@@ -136,4 +139,30 @@ class Settings:
136
139
  """Get the enable opentelemetry."""
137
140
  return os.getenv("BL_ENABLE_OPENTELEMETRY", "false").lower() == "true"
138
141
 
142
+ @property
143
+ def tracking(self) -> bool:
144
+ """
145
+ Get the tracking setting.
146
+
147
+ Priority:
148
+ 1. Environment variable BL_TRACKING (true/false)
149
+ 2. config.yaml tracking field
150
+ 3. Default: true
151
+ """
152
+ env_value = os.environ.get("BL_TRACKING")
153
+ if env_value is not None:
154
+ return env_value.lower() == "true"
155
+
156
+ try:
157
+ home_dir = Path.home()
158
+ config_path = home_dir / ".blaxel" / "config.yaml"
159
+ with open(config_path, encoding="utf-8") as f:
160
+ config = yaml.safe_load(f)
161
+ if config and "tracking" in config:
162
+ return bool(config["tracking"])
163
+ except Exception:
164
+ pass
165
+
166
+ return True
167
+
139
168
  settings = Settings()