blaxel 0.2.34__py3-none-any.whl → 0.2.35__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 (276) hide show
  1. blaxel/__init__.py +2 -2
  2. blaxel/core/client/api/agents/create_agent.py +64 -19
  3. blaxel/core/client/api/agents/delete_agent.py +44 -15
  4. blaxel/core/client/api/agents/get_agent.py +43 -14
  5. blaxel/core/client/api/agents/list_agents.py +40 -11
  6. blaxel/core/client/api/agents/update_agent.py +60 -19
  7. blaxel/core/client/api/compute/create_sandbox.py +60 -23
  8. blaxel/core/client/api/compute/delete_sandbox.py +40 -19
  9. blaxel/core/client/api/compute/get_sandbox.py +39 -18
  10. blaxel/core/client/api/compute/list_sandboxes.py +40 -19
  11. blaxel/core/client/api/compute/update_sandbox.py +56 -23
  12. blaxel/core/client/api/configurations/get_configuration.py +16 -4
  13. blaxel/core/client/api/customdomains/create_custom_domain.py +12 -0
  14. blaxel/core/client/api/customdomains/list_custom_domains.py +16 -4
  15. blaxel/core/client/api/default/get_template.py +8 -4
  16. blaxel/core/client/api/functions/create_function.py +62 -19
  17. blaxel/core/client/api/functions/delete_function.py +46 -15
  18. blaxel/core/client/api/functions/get_function.py +45 -14
  19. blaxel/core/client/api/functions/list_functions.py +44 -15
  20. blaxel/core/client/api/functions/update_function.py +62 -19
  21. blaxel/core/client/api/images/cleanup_images.py +12 -12
  22. blaxel/core/client/api/images/delete_image.py +12 -8
  23. blaxel/core/client/api/images/delete_image_tag.py +12 -8
  24. blaxel/core/client/api/images/get_image.py +12 -8
  25. blaxel/core/client/api/images/list_images.py +12 -8
  26. blaxel/core/client/api/integrations/create_integration_connection.py +56 -23
  27. blaxel/core/client/api/integrations/delete_integration_connection.py +48 -19
  28. blaxel/core/client/api/integrations/get_integration.py +12 -8
  29. blaxel/core/client/api/integrations/get_integration_connection.py +44 -19
  30. blaxel/core/client/api/integrations/get_integration_connection_model.py +2 -2
  31. blaxel/core/client/api/integrations/list_integration_connections.py +36 -19
  32. blaxel/core/client/api/integrations/update_integration_connection.py +52 -19
  33. blaxel/core/client/api/jobs/create_job.py +20 -12
  34. blaxel/core/client/api/jobs/create_job_execution.py +22 -16
  35. blaxel/core/client/api/jobs/delete_job.py +12 -8
  36. blaxel/core/client/api/jobs/delete_job_execution.py +12 -8
  37. blaxel/core/client/api/jobs/get_job.py +24 -20
  38. blaxel/core/client/api/jobs/get_job_execution.py +8 -4
  39. blaxel/core/client/api/jobs/list_job_executions.py +8 -4
  40. blaxel/core/client/api/jobs/list_jobs.py +12 -8
  41. blaxel/core/client/api/jobs/update_job.py +20 -12
  42. blaxel/core/client/api/locations/list_locations.py +12 -8
  43. blaxel/core/client/api/{default → mcphub}/list_mcp_hub_definitions.py +20 -4
  44. blaxel/core/client/api/models/create_model.py +52 -23
  45. blaxel/core/client/api/models/delete_model.py +40 -19
  46. blaxel/core/client/api/models/get_model.py +40 -19
  47. blaxel/core/client/api/models/list_models.py +40 -19
  48. blaxel/core/client/api/models/update_model.py +52 -23
  49. blaxel/core/client/api/policies/create_policy.py +12 -8
  50. blaxel/core/client/api/policies/delete_policy.py +12 -8
  51. blaxel/core/client/api/policies/get_policy.py +12 -8
  52. blaxel/core/client/api/policies/list_policies.py +12 -8
  53. blaxel/core/client/api/policies/update_policy.py +12 -8
  54. blaxel/core/client/api/public_ipslist/list_public_ips.py +37 -5
  55. blaxel/core/client/api/sandboxhub/__init__.py +0 -0
  56. blaxel/core/client/api/{default → sandboxhub}/list_sandbox_hub_definitions.py +20 -4
  57. blaxel/core/client/api/service_accounts/create_api_key_for_service_account.py +12 -8
  58. blaxel/core/client/api/service_accounts/create_workspace_service_account.py +12 -8
  59. blaxel/core/client/api/service_accounts/delete_api_key_for_service_account.py +6 -4
  60. blaxel/core/client/api/service_accounts/delete_workspace_service_account.py +12 -8
  61. blaxel/core/client/api/service_accounts/get_workspace_service_accounts.py +12 -8
  62. blaxel/core/client/api/service_accounts/list_api_keys_for_service_account.py +12 -8
  63. blaxel/core/client/api/service_accounts/update_workspace_service_account.py +8 -8
  64. blaxel/core/client/api/templates/list_templates.py +12 -8
  65. blaxel/core/client/api/volume_templates/create_volume_template.py +8 -4
  66. blaxel/core/client/api/volume_templates/list_volume_templates.py +8 -4
  67. blaxel/core/client/api/volumes/create_volume.py +56 -23
  68. blaxel/core/client/api/volumes/delete_volume.py +44 -19
  69. blaxel/core/client/api/volumes/get_volume.py +40 -19
  70. blaxel/core/client/api/volumes/list_volumes.py +40 -19
  71. blaxel/core/client/api/workspaces/create_workspace.py +54 -23
  72. blaxel/core/client/api/workspaces/delete_workspace.py +42 -19
  73. blaxel/core/client/api/workspaces/get_workspace.py +42 -19
  74. blaxel/core/client/api/workspaces/invite_workspace_user.py +8 -4
  75. blaxel/core/client/api/workspaces/list_workspace_users.py +12 -8
  76. blaxel/core/client/api/workspaces/list_workspaces.py +36 -19
  77. blaxel/core/client/api/workspaces/update_workspace.py +50 -19
  78. blaxel/core/client/models/__init__.py +76 -146
  79. blaxel/core/client/models/agent.py +43 -47
  80. blaxel/core/client/models/agent_runtime.py +139 -0
  81. blaxel/core/client/models/agent_runtime_generation.py +18 -0
  82. blaxel/core/client/models/agent_spec.py +33 -110
  83. blaxel/core/client/models/api_key.py +5 -4
  84. blaxel/core/client/models/core_event.py +5 -5
  85. blaxel/core/client/models/create_api_key_for_service_account_body.py +2 -1
  86. blaxel/core/client/models/create_job_execution_request.py +1 -1
  87. blaxel/core/client/models/create_job_execution_response.py +13 -9
  88. blaxel/core/client/models/custom_domain.py +19 -36
  89. blaxel/core/client/models/custom_domain_metadata.py +4 -3
  90. blaxel/core/client/models/custom_domain_spec.py +14 -5
  91. blaxel/core/client/models/custom_domain_spec_status.py +19 -0
  92. blaxel/core/client/models/entrypoint.py +39 -13
  93. blaxel/core/client/models/{workspace_labels.py → entrypoint_args_item.py} +6 -6
  94. blaxel/core/client/models/entrypoint_env.py +3 -3
  95. blaxel/core/client/models/{job_metrics_executions_total.py → entrypoint_super_gateway_args_item.py} +6 -6
  96. blaxel/core/client/models/{spec_configuration.py → env.py} +17 -8
  97. blaxel/core/{sandbox/client/models/welcome_response.py → client/models/error.py} +26 -23
  98. blaxel/core/client/models/expiration_policy.py +30 -11
  99. blaxel/core/client/models/expiration_policy_action.py +17 -0
  100. blaxel/core/client/models/expiration_policy_type.py +19 -0
  101. blaxel/core/client/models/flavor.py +13 -5
  102. blaxel/core/client/models/flavor_type.py +18 -0
  103. blaxel/core/client/models/form.py +6 -6
  104. blaxel/core/client/models/function.py +43 -47
  105. blaxel/core/client/models/function_runtime.py +138 -0
  106. blaxel/core/client/models/function_runtime_generation.py +18 -0
  107. blaxel/core/client/models/function_spec.py +27 -73
  108. blaxel/core/client/models/function_spec_transport.py +18 -0
  109. blaxel/core/client/models/image.py +19 -36
  110. blaxel/core/client/models/integration_connection.py +25 -39
  111. blaxel/core/client/models/integration_connection_spec.py +8 -5
  112. blaxel/core/client/models/integration_connection_spec_config.py +1 -1
  113. blaxel/core/client/models/integration_connection_spec_secret.py +1 -1
  114. blaxel/core/client/models/integration_endpoint.py +41 -11
  115. blaxel/core/client/models/integration_endpoint_ignore_models_item.py +45 -0
  116. blaxel/core/client/models/{mcp_definition_entrypoint.py → integration_endpoint_models_item.py} +6 -6
  117. blaxel/core/client/models/job.py +43 -47
  118. blaxel/core/client/models/job_execution.py +30 -37
  119. blaxel/core/client/models/job_execution_metadata.py +3 -3
  120. blaxel/core/client/models/job_execution_spec.py +2 -2
  121. blaxel/core/client/models/job_execution_stats.py +5 -5
  122. blaxel/core/client/models/job_execution_status.py +24 -0
  123. blaxel/core/client/models/job_execution_task.py +12 -4
  124. blaxel/core/client/models/job_execution_task_metadata.py +1 -1
  125. blaxel/core/client/models/job_execution_task_spec.py +2 -2
  126. blaxel/core/client/models/job_execution_task_status.py +23 -0
  127. blaxel/core/client/models/job_runtime.py +172 -0
  128. blaxel/core/client/models/job_runtime_generation.py +18 -0
  129. blaxel/core/client/models/job_spec.py +20 -88
  130. blaxel/core/client/models/location_response.py +5 -5
  131. blaxel/core/client/models/mcp_definition.py +30 -17
  132. blaxel/core/client/models/{job_metrics_tasks_total.py → mcp_definition_categories_item.py} +6 -6
  133. blaxel/core/client/models/metadata.py +23 -17
  134. blaxel/core/client/models/metadata_labels.py +4 -1
  135. blaxel/core/client/models/model.py +43 -47
  136. blaxel/core/client/models/model_runtime.py +99 -0
  137. blaxel/core/client/models/model_runtime_type.py +34 -0
  138. blaxel/core/client/models/model_spec.py +12 -58
  139. blaxel/core/client/models/o_auth.py +23 -6
  140. blaxel/core/client/models/{form_oauth.py → o_auth_scope_item.py} +6 -6
  141. blaxel/core/client/models/pending_invitation_accept.py +2 -1
  142. blaxel/core/client/models/pending_invitation_workspace_details.py +27 -6
  143. blaxel/core/client/models/{metrics_request_total_per_code.py → pending_invitation_workspace_details_emails_item.py} +6 -6
  144. blaxel/core/client/models/policy.py +20 -36
  145. blaxel/core/client/models/policy_location.py +13 -5
  146. blaxel/core/client/models/policy_location_type.py +19 -0
  147. blaxel/core/client/models/policy_max_tokens.py +6 -6
  148. blaxel/core/client/models/policy_resource_type.py +20 -0
  149. blaxel/core/client/models/policy_spec.py +31 -10
  150. blaxel/core/client/models/policy_spec_type.py +19 -0
  151. blaxel/core/client/models/port.py +25 -15
  152. blaxel/core/client/models/port_protocol.py +19 -0
  153. blaxel/core/client/models/preview.py +19 -36
  154. blaxel/core/client/models/preview_metadata.py +12 -10
  155. blaxel/core/client/models/preview_token.py +19 -36
  156. blaxel/core/client/models/preview_token_metadata.py +8 -6
  157. blaxel/core/client/models/repository.py +2 -2
  158. blaxel/core/client/models/revision_configuration.py +3 -3
  159. blaxel/core/client/models/sandbox.py +45 -58
  160. blaxel/core/client/models/sandbox_definition.py +37 -22
  161. blaxel/core/client/models/sandbox_definition_categories_item.py +45 -0
  162. blaxel/core/client/models/sandbox_error.py +148 -0
  163. blaxel/core/client/models/sandbox_error_details.py +45 -0
  164. blaxel/core/client/models/sandbox_lifecycle.py +3 -2
  165. blaxel/core/client/models/sandbox_runtime.py +145 -0
  166. blaxel/core/client/models/sandbox_spec.py +33 -134
  167. blaxel/core/client/models/status.py +25 -0
  168. blaxel/core/client/models/template.py +8 -7
  169. blaxel/core/client/models/template_variable.py +5 -5
  170. blaxel/core/client/models/trigger.py +14 -6
  171. blaxel/core/client/models/trigger_configuration.py +7 -6
  172. blaxel/core/client/models/trigger_type.py +19 -0
  173. blaxel/core/client/models/volume.py +35 -47
  174. blaxel/core/client/models/volume_attachment.py +6 -4
  175. blaxel/core/client/models/volume_spec.py +7 -4
  176. blaxel/core/client/models/volume_state.py +3 -3
  177. blaxel/core/client/models/volume_template.py +19 -33
  178. blaxel/core/client/models/volume_template_state.py +12 -4
  179. blaxel/core/client/models/volume_template_state_status.py +19 -0
  180. blaxel/core/client/models/volume_template_version.py +12 -4
  181. blaxel/core/client/models/volume_template_version_status.py +19 -0
  182. blaxel/core/client/models/workspace.py +35 -25
  183. blaxel/core/client/models/workspace_runtime.py +3 -2
  184. blaxel/core/client/models/workspace_status.py +22 -0
  185. blaxel/core/common/__init__.py +1 -1
  186. blaxel/core/jobs/__init__.py +0 -1
  187. blaxel/core/sandbox/__init__.py +2 -0
  188. blaxel/core/sandbox/client/api/process/post_process.py +8 -4
  189. blaxel/core/sandbox/client/models/__init__.py +0 -2
  190. blaxel/core/sandbox/client/models/process_response.py +16 -0
  191. blaxel/core/sandbox/client/models/process_response_status.py +9 -0
  192. blaxel/core/sandbox/default/__init__.py +2 -0
  193. blaxel/core/sandbox/default/interpreter.py +5 -1
  194. blaxel/core/sandbox/default/preview.py +3 -1
  195. blaxel/core/sandbox/default/sandbox.py +51 -16
  196. blaxel/core/sandbox/sync/process.py +2 -1
  197. blaxel/core/sandbox/sync/sandbox.py +34 -13
  198. blaxel/core/tools/common.py +16 -2
  199. blaxel/core/volume/__init__.py +2 -2
  200. blaxel/core/volume/volume.py +32 -10
  201. blaxel/langgraph/tools.py +34 -2
  202. blaxel/openai/tools.py +33 -1
  203. {blaxel-0.2.34.dist-info → blaxel-0.2.35.dist-info}/METADATA +3 -3
  204. {blaxel-0.2.34.dist-info → blaxel-0.2.35.dist-info}/RECORD +207 -246
  205. blaxel/core/client/models/acl.py +0 -133
  206. blaxel/core/client/models/billable_time_metric.py +0 -89
  207. blaxel/core/client/models/core_spec.py +0 -194
  208. blaxel/core/client/models/core_spec_configurations.py +0 -77
  209. blaxel/core/client/models/histogram_bucket.py +0 -79
  210. blaxel/core/client/models/histogram_stats.py +0 -88
  211. blaxel/core/client/models/integration_model.py +0 -162
  212. blaxel/core/client/models/job_execution_config.py +0 -79
  213. blaxel/core/client/models/job_metrics.py +0 -262
  214. blaxel/core/client/models/jobs_chart_value.py +0 -70
  215. blaxel/core/client/models/jobs_network_chart.py +0 -102
  216. blaxel/core/client/models/jobs_success_failed_chart.py +0 -147
  217. blaxel/core/client/models/jobs_total.py +0 -88
  218. blaxel/core/client/models/last_n_requests_metric.py +0 -97
  219. blaxel/core/client/models/latency_metric.py +0 -148
  220. blaxel/core/client/models/logs_response.py +0 -63
  221. blaxel/core/client/models/logs_response_data.py +0 -99
  222. blaxel/core/client/models/mcp_definition_form.py +0 -45
  223. blaxel/core/client/models/memory_allocation_by_name.py +0 -70
  224. blaxel/core/client/models/memory_allocation_metric.py +0 -61
  225. blaxel/core/client/models/metric.py +0 -79
  226. blaxel/core/client/models/metrics.py +0 -273
  227. blaxel/core/client/models/metrics_models.py +0 -45
  228. blaxel/core/client/models/metrics_rps_per_code.py +0 -45
  229. blaxel/core/client/models/pod_template_spec.py +0 -45
  230. blaxel/core/client/models/request_duration_over_time_metric.py +0 -97
  231. blaxel/core/client/models/request_duration_over_time_metrics.py +0 -84
  232. blaxel/core/client/models/request_total_by_origin_metric.py +0 -129
  233. blaxel/core/client/models/request_total_by_origin_metric_request_total_by_origin.py +0 -45
  234. blaxel/core/client/models/request_total_by_origin_metric_request_total_by_origin_and_code.py +0 -45
  235. blaxel/core/client/models/request_total_metric.py +0 -155
  236. blaxel/core/client/models/request_total_metric_request_total_per_code.py +0 -45
  237. blaxel/core/client/models/request_total_metric_rps_per_code.py +0 -45
  238. blaxel/core/client/models/request_total_response_data.py +0 -97
  239. blaxel/core/client/models/resource.py +0 -99
  240. blaxel/core/client/models/resource_log.py +0 -88
  241. blaxel/core/client/models/resource_log_chart.py +0 -133
  242. blaxel/core/client/models/resource_log_response.py +0 -83
  243. blaxel/core/client/models/resource_metrics.py +0 -618
  244. blaxel/core/client/models/resource_metrics_request_total_per_code.py +0 -45
  245. blaxel/core/client/models/resource_metrics_request_total_per_code_previous.py +0 -45
  246. blaxel/core/client/models/resource_metrics_rps_per_code.py +0 -45
  247. blaxel/core/client/models/resource_metrics_rps_per_code_previous.py +0 -45
  248. blaxel/core/client/models/resource_trace.py +0 -97
  249. blaxel/core/client/models/runtime.py +0 -317
  250. blaxel/core/client/models/runtime_configuration.py +0 -45
  251. blaxel/core/client/models/runtime_startup_probe.py +0 -45
  252. blaxel/core/client/models/sandbox_metrics.py +0 -88
  253. blaxel/core/client/models/serverless_config.py +0 -117
  254. blaxel/core/client/models/serverless_config_configuration.py +0 -45
  255. blaxel/core/client/models/start_sandbox.py +0 -98
  256. blaxel/core/client/models/stop_sandbox.py +0 -98
  257. blaxel/core/client/models/store_agent.py +0 -181
  258. blaxel/core/client/models/store_agent_labels.py +0 -45
  259. blaxel/core/client/models/store_configuration.py +0 -156
  260. blaxel/core/client/models/store_configuration_option.py +0 -79
  261. blaxel/core/client/models/time_to_first_token_over_time_metrics.py +0 -87
  262. blaxel/core/client/models/token_rate_metric.py +0 -106
  263. blaxel/core/client/models/token_rate_metrics.py +0 -124
  264. blaxel/core/client/models/token_total_metric.py +0 -112
  265. blaxel/core/client/models/trace_ids_response.py +0 -45
  266. blaxel/core/client/models/websocket_channel.py +0 -97
  267. blaxel/core/client/models/websocket_message.py +0 -106
  268. blaxel/core/sandbox/client/api/root/delete.py +0 -130
  269. blaxel/core/sandbox/client/api/root/get.py +0 -130
  270. blaxel/core/sandbox/client/api/root/options.py +0 -130
  271. blaxel/core/sandbox/client/api/root/patch.py +0 -130
  272. blaxel/core/sandbox/client/api/root/post.py +0 -130
  273. blaxel/core/sandbox/client/api/root/put.py +0 -130
  274. /blaxel/core/{sandbox/client/api/root → client/api/mcphub}/__init__.py +0 -0
  275. {blaxel-0.2.34.dist-info → blaxel-0.2.35.dist-info}/WHEEL +0 -0
  276. {blaxel-0.2.34.dist-info → blaxel-0.2.35.dist-info}/licenses/LICENSE +0 -0
@@ -11,9 +11,19 @@ from ..client.api.volumes.list_volumes import asyncio as list_volumes
11
11
  from ..client.api.volumes.list_volumes import sync as list_volumes_sync
12
12
  from ..client.client import client
13
13
  from ..client.models import Metadata, Volume, VolumeSpec
14
+ from ..client.models.error import Error
14
15
  from ..client.types import UNSET
15
16
 
16
17
 
18
+ class VolumeAPIError(Exception):
19
+ """Exception raised when volume API returns an error."""
20
+
21
+ def __init__(self, message: str, status_code: int | None = None, code: str | None = None):
22
+ super().__init__(message)
23
+ self.status_code = status_code
24
+ self.code = code
25
+
26
+
17
27
  class _AsyncDeleteDescriptor:
18
28
  """Descriptor that provides both class-level and instance-level delete functionality."""
19
29
 
@@ -171,11 +181,19 @@ class VolumeInstance:
171
181
  volume.spec.size = default_size
172
182
 
173
183
  response = await create_volume(client=client, body=volume)
184
+ if isinstance(response, Error):
185
+ status_code = int(response.code) if response.code is not UNSET else None
186
+ message = response.message if response.message is not UNSET else response.error
187
+ raise VolumeAPIError(message, status_code=status_code, code=response.error)
174
188
  return cls(response)
175
189
 
176
190
  @classmethod
177
191
  async def get(cls, volume_name: str) -> "VolumeInstance":
178
192
  response = await get_volume(volume_name=volume_name, client=client)
193
+ if isinstance(response, Error):
194
+ status_code = int(response.code) if response.code is not UNSET else None
195
+ message = response.message if response.message is not UNSET else response.error
196
+ raise VolumeAPIError(message, status_code=status_code, code=response.error)
179
197
  return cls(response)
180
198
 
181
199
  @classmethod
@@ -190,11 +208,9 @@ class VolumeInstance:
190
208
  """Create a volume if it doesn't exist, otherwise return existing."""
191
209
  try:
192
210
  return await cls.create(config)
193
- except Exception as e:
211
+ except VolumeAPIError as e:
194
212
  # Check if it's a 409 conflict error (volume already exists)
195
- if (hasattr(e, "status_code") and e.status_code == 409) or (
196
- hasattr(e, "code") and e.code in [409, "VOLUME_ALREADY_EXISTS"]
197
- ):
213
+ if e.status_code == 409 or e.code in ["409", "VOLUME_ALREADY_EXISTS"]:
198
214
  # Extract name from different configuration types
199
215
  if isinstance(config, VolumeCreateConfiguration):
200
216
  name = config.name
@@ -210,7 +226,7 @@ class VolumeInstance:
210
226
 
211
227
  volume_instance = await cls.get(name)
212
228
  return volume_instance
213
- raise e
229
+ raise
214
230
 
215
231
 
216
232
  class SyncVolumeInstance:
@@ -306,12 +322,20 @@ class SyncVolumeInstance:
306
322
  volume.spec.size = default_size
307
323
 
308
324
  response = create_volume_sync(client=client, body=volume)
325
+ if isinstance(response, Error):
326
+ status_code = int(response.code) if response.code is not UNSET else None
327
+ message = response.message if response.message is not UNSET else response.error
328
+ raise VolumeAPIError(message, status_code=status_code, code=response.error)
309
329
  return cls(response)
310
330
 
311
331
  @classmethod
312
332
  def get(cls, volume_name: str) -> "SyncVolumeInstance":
313
333
  """Get a volume by name synchronously."""
314
334
  response = get_volume_sync(volume_name=volume_name, client=client)
335
+ if isinstance(response, Error):
336
+ status_code = int(response.code) if response.code is not UNSET else None
337
+ message = response.message if response.message is not UNSET else response.error
338
+ raise VolumeAPIError(message, status_code=status_code, code=response.error)
315
339
  return cls(response)
316
340
 
317
341
  @classmethod
@@ -327,11 +351,9 @@ class SyncVolumeInstance:
327
351
  """Create a volume if it doesn't exist, otherwise return existing."""
328
352
  try:
329
353
  return cls.create(config)
330
- except Exception as e:
354
+ except VolumeAPIError as e:
331
355
  # Check if it's a 409 conflict error (volume already exists)
332
- if (hasattr(e, "status_code") and e.status_code == 409) or (
333
- hasattr(e, "code") and e.code in [409, "VOLUME_ALREADY_EXISTS"]
334
- ):
356
+ if e.status_code == 409 or e.code in ["409", "VOLUME_ALREADY_EXISTS"]:
335
357
  # Extract name from different configuration types
336
358
  if isinstance(config, VolumeCreateConfiguration):
337
359
  name = config.name
@@ -347,7 +369,7 @@ class SyncVolumeInstance:
347
369
 
348
370
  volume_instance = cls.get(name)
349
371
  return volume_instance
350
- raise e
372
+ raise
351
373
 
352
374
 
353
375
  async def _delete_volume_by_name(volume_name: str) -> Volume:
blaxel/langgraph/tools.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Any
1
+ from typing import Any, Dict
2
2
 
3
3
  from langchain_core.tools import StructuredTool
4
4
  from mcp.types import (
@@ -14,6 +14,35 @@ from blaxel.core.tools.types import Tool, ToolException
14
14
  NonTextContent = ImageContent | EmbeddedResource
15
15
 
16
16
 
17
+ def _clean_schema_for_openai(schema: Dict[str, Any]) -> Dict[str, Any]:
18
+ """Clean JSON schema to be compatible with OpenAI function calling.
19
+
20
+ OpenAI requires object schemas to have a 'properties' field, even if empty.
21
+ This function ensures the schema is properly formatted.
22
+ """
23
+ if not isinstance(schema, dict):
24
+ return schema
25
+
26
+ cleaned = schema.copy()
27
+
28
+ # Ensure object type schemas have properties
29
+ if cleaned.get("type") == "object":
30
+ if "properties" not in cleaned:
31
+ cleaned["properties"] = {}
32
+ if "required" not in cleaned:
33
+ cleaned["required"] = []
34
+
35
+ # Recursively clean nested schemas
36
+ if "properties" in cleaned:
37
+ cleaned["properties"] = {
38
+ k: _clean_schema_for_openai(v) for k, v in cleaned["properties"].items()
39
+ }
40
+ if "items" in cleaned and isinstance(cleaned["items"], dict):
41
+ cleaned["items"] = _clean_schema_for_openai(cleaned["items"])
42
+
43
+ return cleaned
44
+
45
+
17
46
  def get_langchain_tool(tool: Tool) -> StructuredTool:
18
47
  async def langchain_coroutine(
19
48
  **arguments: dict[str, Any],
@@ -36,10 +65,13 @@ def get_langchain_tool(tool: Tool) -> StructuredTool:
36
65
 
37
66
  return tool_content, non_text_contents or None
38
67
 
68
+ # Clean the schema to ensure OpenAI compatibility
69
+ cleaned_schema = _clean_schema_for_openai(tool.input_schema)
70
+
39
71
  return StructuredTool(
40
72
  name=tool.name,
41
73
  description=tool.description,
42
- args_schema=tool.input_schema,
74
+ args_schema=cleaned_schema,
43
75
  coroutine=langchain_coroutine,
44
76
  sync_coroutine=tool.sync_coroutine,
45
77
  )
blaxel/openai/tools.py CHANGED
@@ -7,6 +7,36 @@ from blaxel.core.tools import bl_tools as bl_tools_core
7
7
  from blaxel.core.tools.types import Tool
8
8
 
9
9
 
10
+ def _clean_schema_for_openai(schema: dict) -> dict:
11
+ """Clean JSON schema to be compatible with OpenAI agents SDK.
12
+
13
+ OpenAI agents SDK doesn't allow additionalProperties on object types.
14
+ This function recursively removes additionalProperties and $schema fields.
15
+ """
16
+ if not isinstance(schema, dict):
17
+ return schema
18
+
19
+ cleaned_schema = schema.copy()
20
+
21
+ # Remove $schema and additionalProperties at current level
22
+ if "$schema" in cleaned_schema:
23
+ del cleaned_schema["$schema"]
24
+ if "additionalProperties" in cleaned_schema:
25
+ del cleaned_schema["additionalProperties"]
26
+
27
+ # Recursively clean properties if they exist
28
+ if "properties" in cleaned_schema:
29
+ cleaned_schema["properties"] = {
30
+ k: _clean_schema_for_openai(v) for k, v in cleaned_schema["properties"].items()
31
+ }
32
+
33
+ # Recursively clean items for array types
34
+ if "items" in cleaned_schema:
35
+ cleaned_schema["items"] = _clean_schema_for_openai(cleaned_schema["items"])
36
+
37
+ return cleaned_schema
38
+
39
+
10
40
  def get_openai_tool(tool: Tool) -> FunctionTool:
11
41
  async def openai_coroutine(
12
42
  _: RunContextWrapper,
@@ -15,10 +45,12 @@ def get_openai_tool(tool: Tool) -> FunctionTool:
15
45
  result = await tool.coroutine(**json.loads(arguments))
16
46
  return result
17
47
 
48
+ cleaned_schema = _clean_schema_for_openai(tool.input_schema)
49
+
18
50
  return FunctionTool(
19
51
  name=tool.name,
20
52
  description=tool.description,
21
- params_json_schema=tool.input_schema,
53
+ params_json_schema=cleaned_schema,
22
54
  on_invoke_tool=openai_coroutine,
23
55
  )
24
56
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blaxel
3
- Version: 0.2.34
3
+ Version: 0.2.35
4
4
  Summary: Blaxel - AI development platform SDK
5
5
  Project-URL: Homepage, https://blaxel.ai
6
6
  Project-URL: Documentation, https://docs.blaxel.ai
@@ -23,7 +23,7 @@ Provides-Extra: all
23
23
  Requires-Dist: crewai==0.159.0; extra == 'all'
24
24
  Requires-Dist: google-adk>=1.4.0; extra == 'all'
25
25
  Requires-Dist: langchain-anthropic>=0.3.10; extra == 'all'
26
- Requires-Dist: langchain-cerebras>=0.5.0; extra == 'all'
26
+ Requires-Dist: langchain-cerebras<0.6.0,>=0.5.0; extra == 'all'
27
27
  Requires-Dist: langchain-cohere>=0.4.3; extra == 'all'
28
28
  Requires-Dist: langchain-community<0.4.0,>=0.3.3; extra == 'all'
29
29
  Requires-Dist: langchain-core<0.4.0,>=0.3.13; extra == 'all'
@@ -74,7 +74,7 @@ Requires-Dist: google-adk>=1.4.0; extra == 'googleadk'
74
74
  Requires-Dist: litellm>=1.63.11; extra == 'googleadk'
75
75
  Provides-Extra: langgraph
76
76
  Requires-Dist: langchain-anthropic>=0.3.10; extra == 'langgraph'
77
- Requires-Dist: langchain-cerebras>=0.5.0; extra == 'langgraph'
77
+ Requires-Dist: langchain-cerebras<0.6.0,>=0.5.0; extra == 'langgraph'
78
78
  Requires-Dist: langchain-cohere>=0.4.3; extra == 'langgraph'
79
79
  Requires-Dist: langchain-community<0.4.0,>=0.3.3; extra == 'langgraph'
80
80
  Requires-Dist: langchain-core<0.4.0,>=0.3.13; extra == 'langgraph'