blaxel 0.1.22rc70__py3-none-any.whl → 0.2.0rc1__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 (419) hide show
  1. blaxel/__init__.py +6 -3
  2. blaxel/core/__init__.py +44 -0
  3. blaxel/{agents → core/agents}/__init__.py +30 -50
  4. blaxel/{authentication → core/authentication}/apikey.py +1 -0
  5. blaxel/{authentication → core/authentication}/clientcredentials.py +6 -2
  6. blaxel/{client → core/client}/api/agents/create_agent.py +1 -1
  7. blaxel/{client → core/client}/api/agents/update_agent.py +1 -1
  8. blaxel/{client → core/client}/api/compute/create_sandbox.py +1 -1
  9. blaxel/{client → core/client}/api/compute/create_sandbox_preview.py +1 -1
  10. blaxel/{client → core/client}/api/compute/create_sandbox_preview_token.py +1 -1
  11. blaxel/{client → core/client}/api/compute/update_sandbox.py +1 -1
  12. blaxel/{client → core/client}/api/compute/update_sandbox_preview.py +1 -1
  13. blaxel/{client → core/client}/api/functions/create_function.py +1 -1
  14. blaxel/{client → core/client}/api/functions/update_function.py +1 -1
  15. blaxel/{client → core/client}/api/integrations/create_integration_connection.py +1 -1
  16. blaxel/{client → core/client}/api/integrations/update_integration_connection.py +1 -1
  17. blaxel/{client → core/client}/api/jobs/create_job.py +1 -1
  18. blaxel/{client → core/client}/api/jobs/update_job.py +1 -1
  19. blaxel/{client → core/client}/api/knowledgebases/create_knowledgebase.py +1 -1
  20. blaxel/{client → core/client}/api/knowledgebases/update_knowledgebase.py +1 -1
  21. blaxel/{client → core/client}/api/models/create_model.py +1 -1
  22. blaxel/{client → core/client}/api/models/update_model.py +1 -1
  23. blaxel/{client → core/client}/api/policies/create_policy.py +1 -1
  24. blaxel/{client → core/client}/api/policies/update_policy.py +1 -1
  25. blaxel/{client → core/client}/api/service_accounts/create_api_key_for_service_account.py +1 -1
  26. blaxel/{client → core/client}/api/service_accounts/create_workspace_service_account.py +1 -1
  27. blaxel/{client → core/client}/api/service_accounts/update_workspace_service_account.py +1 -1
  28. blaxel/{client → core/client}/api/workspaces/check_workspace_availability.py +1 -1
  29. blaxel/{client → core/client}/api/workspaces/create_worspace.py +1 -1
  30. blaxel/{client → core/client}/api/workspaces/invite_workspace_user.py +1 -1
  31. blaxel/{client → core/client}/api/workspaces/update_workspace.py +1 -1
  32. blaxel/{client → core/client}/api/workspaces/update_workspace_user_role.py +1 -1
  33. blaxel/{client → core/client}/models/agent.py +1 -1
  34. blaxel/{client → core/client}/models/agent_spec.py +2 -2
  35. blaxel/{client → core/client}/models/core_spec.py +1 -1
  36. blaxel/{client → core/client}/models/function.py +1 -1
  37. blaxel/{client → core/client}/models/function_schema_properties.py +1 -1
  38. blaxel/{client → core/client}/models/function_spec.py +2 -2
  39. blaxel/{client → core/client}/models/integration.py +2 -2
  40. blaxel/{client → core/client}/models/integration_endpoints.py +1 -1
  41. blaxel/{client → core/client}/models/job.py +1 -1
  42. blaxel/{client → core/client}/models/job_spec.py +1 -1
  43. blaxel/{client → core/client}/models/knowledgebase.py +1 -1
  44. blaxel/{client → core/client}/models/location_response.py +1 -1
  45. blaxel/{client → core/client}/models/model.py +1 -1
  46. blaxel/{client → core/client}/models/model_spec.py +1 -1
  47. blaxel/{client → core/client}/models/policy_spec.py +2 -2
  48. blaxel/{client → core/client}/models/resource_metrics.py +3 -3
  49. blaxel/{client → core/client}/models/runtime.py +1 -1
  50. blaxel/{client → core/client}/models/sandbox.py +1 -1
  51. blaxel/{client → core/client}/models/sandbox_definition.py +1 -1
  52. blaxel/{client → core/client}/models/sandbox_spec.py +1 -1
  53. blaxel/{client → core/client}/models/store_agent.py +1 -1
  54. blaxel/{client → core/client}/models/store_configuration.py +1 -1
  55. blaxel/{client → core/client}/models/template.py +1 -1
  56. blaxel/core/common/__init__.py +6 -0
  57. blaxel/core/common/autoload.py +21 -0
  58. blaxel/{common → core/common}/internal.py +33 -62
  59. blaxel/core/common/logger.py +131 -0
  60. blaxel/{jobs → core/jobs}/__init__.py +40 -60
  61. blaxel/core/mcp/__init__.py +4 -0
  62. blaxel/{mcp → core/mcp}/client.py +13 -7
  63. blaxel/{mcp → core/mcp}/server.py +76 -17
  64. blaxel/core/models/__init__.py +52 -0
  65. blaxel/core/sandbox/__init__.py +29 -0
  66. blaxel/core/sandbox/action.py +79 -0
  67. blaxel/{sandbox → core/sandbox}/client/api/filesystem/put_filesystem_path.py +1 -1
  68. blaxel/{sandbox → core/sandbox}/client/api/network/post_network_process_pid_monitor.py +1 -1
  69. blaxel/core/sandbox/client/api/process/__init__.py +0 -0
  70. blaxel/{sandbox → core/sandbox}/client/api/process/post_process.py +1 -1
  71. blaxel/{sandbox → core/sandbox}/client/models/directory.py +2 -2
  72. blaxel/core/sandbox/filesystem.py +280 -0
  73. blaxel/core/sandbox/network.py +10 -0
  74. blaxel/{sandbox → core/sandbox}/preview.py +45 -17
  75. blaxel/core/sandbox/process.py +159 -0
  76. blaxel/{sandbox → core/sandbox}/sandbox.py +62 -5
  77. blaxel/core/sandbox/session.py +124 -0
  78. blaxel/core/sandbox/types.py +103 -0
  79. blaxel/{tools → core/tools}/__init__.py +62 -90
  80. blaxel/crewai/__init__.py +4 -0
  81. blaxel/{models/crewai.py → crewai/model.py} +4 -2
  82. blaxel/crewai/py.typed +0 -0
  83. blaxel/crewai/tools.py +26 -0
  84. blaxel/googleadk/__init__.py +4 -0
  85. blaxel/{models/googleadk.py → googleadk/model.py} +8 -2
  86. blaxel/googleadk/py.typed +0 -0
  87. blaxel/googleadk/tools.py +72 -0
  88. blaxel/langgraph/__init__.py +4 -0
  89. blaxel/{models/langchain.py → langgraph/model.py} +8 -4
  90. blaxel/langgraph/py.typed +0 -0
  91. blaxel/{tools/langchain.py → langgraph/tools.py} +7 -3
  92. blaxel/livekit/__init__.py +4 -0
  93. blaxel/{models/livekit.py → livekit/model.py} +7 -1
  94. blaxel/livekit/py.typed +0 -0
  95. blaxel/{tools/livekit.py → livekit/tools.py} +8 -1
  96. blaxel/llamaindex/__init__.py +4 -0
  97. blaxel/{models/llamaindex.py → llamaindex/model.py} +6 -3
  98. blaxel/llamaindex/py.typed +0 -0
  99. blaxel/{tools/llamaindex.py → llamaindex/tools.py} +7 -4
  100. blaxel/openai/__init__.py +4 -0
  101. blaxel/{models/openai.py → openai/model.py} +4 -2
  102. blaxel/openai/py.typed +0 -0
  103. blaxel/{tools/openai.py → openai/tools.py} +7 -3
  104. blaxel/pydantic/__init__.py +4 -0
  105. blaxel/{models/custom/pydantic → pydantic/custom}/gemini.py +0 -1
  106. blaxel/{models/pydantic.py → pydantic/model.py} +6 -4
  107. blaxel/pydantic/py.typed +0 -0
  108. blaxel/{tools/pydantic.py → pydantic/tools.py} +6 -3
  109. blaxel/telemetry/__init__.py +6 -0
  110. blaxel/telemetry/instrumentation/blaxel_core.py +124 -0
  111. blaxel/telemetry/instrumentation/blaxel_langgraph.py +74 -0
  112. blaxel/telemetry/instrumentation/blaxel_langgraph_gemini.py +360 -0
  113. blaxel/telemetry/instrumentation/blaxel_llamaindex.py +89 -0
  114. blaxel/telemetry/instrumentation/map.py +61 -0
  115. blaxel/telemetry/instrumentation/utils.py +74 -0
  116. blaxel/{common → telemetry/log}/logger.py +6 -12
  117. blaxel/{instrumentation → telemetry}/manager.py +20 -12
  118. blaxel/telemetry/py.typed +0 -0
  119. blaxel/{instrumentation → telemetry}/span.py +12 -1
  120. blaxel-0.2.0rc1.dist-info/METADATA +224 -0
  121. blaxel-0.2.0rc1.dist-info/RECORD +408 -0
  122. blaxel/common/autoload.py +0 -9
  123. blaxel/instrumentation/map.py +0 -49
  124. blaxel/mcp/__init__.py +0 -3
  125. blaxel/models/__init__.py +0 -104
  126. blaxel/sandbox/base.py +0 -67
  127. blaxel/sandbox/filesystem.py +0 -104
  128. blaxel/sandbox/process.py +0 -56
  129. blaxel/tools/crewai.py +0 -22
  130. blaxel/tools/googleadk.py +0 -66
  131. blaxel-0.1.22rc70.dist-info/METADATA +0 -169
  132. blaxel-0.1.22rc70.dist-info/RECORD +0 -379
  133. /blaxel/{authentication → core/authentication}/__init__.py +0 -0
  134. /blaxel/{authentication → core/authentication}/devicemode.py +0 -0
  135. /blaxel/{authentication → core/authentication}/oauth.py +0 -0
  136. /blaxel/{authentication → core/authentication}/types.py +0 -0
  137. /blaxel/{cache → core/cache}/__init__.py +0 -0
  138. /blaxel/{cache → core/cache}/cache.py +0 -0
  139. /blaxel/{client → core/client}/__init__.py +0 -0
  140. /blaxel/{client → core/client}/api/__init__.py +0 -0
  141. /blaxel/{client → core/client}/api/agents/__init__.py +0 -0
  142. /blaxel/{client → core/client}/api/agents/delete_agent.py +0 -0
  143. /blaxel/{client → core/client}/api/agents/get_agent.py +0 -0
  144. /blaxel/{client → core/client}/api/agents/list_agent_revisions.py +0 -0
  145. /blaxel/{client → core/client}/api/agents/list_agents.py +0 -0
  146. /blaxel/{client → core/client}/api/compute/__init__.py +0 -0
  147. /blaxel/{client → core/client}/api/compute/delete_sandbox.py +0 -0
  148. /blaxel/{client → core/client}/api/compute/delete_sandbox_preview.py +0 -0
  149. /blaxel/{client → core/client}/api/compute/delete_sandbox_preview_token.py +0 -0
  150. /blaxel/{client → core/client}/api/compute/get_sandbox.py +0 -0
  151. /blaxel/{client → core/client}/api/compute/get_sandbox_preview.py +0 -0
  152. /blaxel/{client → core/client}/api/compute/list_sandbox_preview_tokens.py +0 -0
  153. /blaxel/{client → core/client}/api/compute/list_sandbox_previews.py +0 -0
  154. /blaxel/{client → core/client}/api/compute/list_sandboxes.py +0 -0
  155. /blaxel/{client → core/client}/api/compute/start_sandbox.py +0 -0
  156. /blaxel/{client → core/client}/api/compute/stop_sandbox.py +0 -0
  157. /blaxel/{client → core/client}/api/configurations/__init__.py +0 -0
  158. /blaxel/{client → core/client}/api/configurations/get_configuration.py +0 -0
  159. /blaxel/{client → core/client}/api/default/__init__.py +0 -0
  160. /blaxel/{client → core/client}/api/default/get_template.py +0 -0
  161. /blaxel/{client → core/client}/api/default/list_mcp_hub_definitions.py +0 -0
  162. /blaxel/{client → core/client}/api/default/list_sandbox_hub_definitions.py +0 -0
  163. /blaxel/{client → core/client}/api/functions/__init__.py +0 -0
  164. /blaxel/{client → core/client}/api/functions/delete_function.py +0 -0
  165. /blaxel/{client → core/client}/api/functions/get_function.py +0 -0
  166. /blaxel/{client → core/client}/api/functions/list_function_revisions.py +0 -0
  167. /blaxel/{client → core/client}/api/functions/list_functions.py +0 -0
  168. /blaxel/{client → core/client}/api/integrations/__init__.py +0 -0
  169. /blaxel/{client → core/client}/api/integrations/delete_integration_connection.py +0 -0
  170. /blaxel/{client → core/client}/api/integrations/get_integration.py +0 -0
  171. /blaxel/{client → core/client}/api/integrations/get_integration_connection.py +0 -0
  172. /blaxel/{client → core/client}/api/integrations/get_integration_connection_model.py +0 -0
  173. /blaxel/{client → core/client}/api/integrations/get_integration_connection_model_endpoint_configurations.py +0 -0
  174. /blaxel/{client → core/client}/api/integrations/list_integration_connection_models.py +0 -0
  175. /blaxel/{client → core/client}/api/integrations/list_integration_connections.py +0 -0
  176. /blaxel/{client → core/client}/api/invitations/__init__.py +0 -0
  177. /blaxel/{client → core/client}/api/invitations/list_all_pending_invitations.py +0 -0
  178. /blaxel/{client → core/client}/api/jobs/__init__.py +0 -0
  179. /blaxel/{client → core/client}/api/jobs/delete_job.py +0 -0
  180. /blaxel/{client → core/client}/api/jobs/get_job.py +0 -0
  181. /blaxel/{client → core/client}/api/jobs/list_job_revisions.py +0 -0
  182. /blaxel/{client → core/client}/api/jobs/list_jobs.py +0 -0
  183. /blaxel/{client → core/client}/api/knowledgebases/__init__.py +0 -0
  184. /blaxel/{client → core/client}/api/knowledgebases/delete_knowledgebase.py +0 -0
  185. /blaxel/{client → core/client}/api/knowledgebases/get_knowledgebase.py +0 -0
  186. /blaxel/{client → core/client}/api/knowledgebases/list_knowledgebase_revisions.py +0 -0
  187. /blaxel/{client → core/client}/api/knowledgebases/list_knowledgebases.py +0 -0
  188. /blaxel/{client → core/client}/api/locations/__init__.py +0 -0
  189. /blaxel/{client → core/client}/api/locations/list_locations.py +0 -0
  190. /blaxel/{client → core/client}/api/models/__init__.py +0 -0
  191. /blaxel/{client → core/client}/api/models/delete_model.py +0 -0
  192. /blaxel/{client → core/client}/api/models/get_model.py +0 -0
  193. /blaxel/{client → core/client}/api/models/list_model_revisions.py +0 -0
  194. /blaxel/{client → core/client}/api/models/list_models.py +0 -0
  195. /blaxel/{client → core/client}/api/policies/__init__.py +0 -0
  196. /blaxel/{client → core/client}/api/policies/delete_policy.py +0 -0
  197. /blaxel/{client → core/client}/api/policies/get_policy.py +0 -0
  198. /blaxel/{client → core/client}/api/policies/list_policies.py +0 -0
  199. /blaxel/{client → core/client}/api/privateclusters/__init__.py +0 -0
  200. /blaxel/{client → core/client}/api/privateclusters/create_private_cluster.py +0 -0
  201. /blaxel/{client → core/client}/api/privateclusters/delete_private_cluster.py +0 -0
  202. /blaxel/{client → core/client}/api/privateclusters/get_private_cluster.py +0 -0
  203. /blaxel/{client → core/client}/api/privateclusters/get_private_cluster_health.py +0 -0
  204. /blaxel/{client → core/client}/api/privateclusters/list_private_clusters.py +0 -0
  205. /blaxel/{client → core/client}/api/privateclusters/update_private_cluster.py +0 -0
  206. /blaxel/{client → core/client}/api/privateclusters/update_private_cluster_health.py +0 -0
  207. /blaxel/{client → core/client}/api/service_accounts/__init__.py +0 -0
  208. /blaxel/{client → core/client}/api/service_accounts/delete_api_key_for_service_account.py +0 -0
  209. /blaxel/{client → core/client}/api/service_accounts/delete_workspace_service_account.py +0 -0
  210. /blaxel/{client → core/client}/api/service_accounts/get_workspace_service_accounts.py +0 -0
  211. /blaxel/{client → core/client}/api/service_accounts/list_api_keys_for_service_account.py +0 -0
  212. /blaxel/{client → core/client}/api/templates/__init__.py +0 -0
  213. /blaxel/{client → core/client}/api/templates/list_templates.py +0 -0
  214. /blaxel/{client → core/client}/api/workspaces/__init__.py +0 -0
  215. /blaxel/{client → core/client}/api/workspaces/accept_workspace_invitation.py +0 -0
  216. /blaxel/{client → core/client}/api/workspaces/decline_workspace_invitation.py +0 -0
  217. /blaxel/{client → core/client}/api/workspaces/delete_workspace.py +0 -0
  218. /blaxel/{client → core/client}/api/workspaces/get_workspace.py +0 -0
  219. /blaxel/{client → core/client}/api/workspaces/leave_workspace.py +0 -0
  220. /blaxel/{client → core/client}/api/workspaces/list_workspace_users.py +0 -0
  221. /blaxel/{client → core/client}/api/workspaces/list_workspaces.py +0 -0
  222. /blaxel/{client → core/client}/api/workspaces/remove_workspace_user.py +0 -0
  223. /blaxel/{client → core/client}/client.py +0 -0
  224. /blaxel/{client → core/client}/errors.py +0 -0
  225. /blaxel/{client → core/client}/models/__init__.py +0 -0
  226. /blaxel/{client → core/client}/models/acl.py +0 -0
  227. /blaxel/{client → core/client}/models/api_key.py +0 -0
  228. /blaxel/{client → core/client}/models/billable_time_metric.py +0 -0
  229. /blaxel/{client → core/client}/models/check_workspace_availability_body.py +0 -0
  230. /blaxel/{client → core/client}/models/configuration.py +0 -0
  231. /blaxel/{client → core/client}/models/continent.py +0 -0
  232. /blaxel/{client → core/client}/models/core_event.py +0 -0
  233. /blaxel/{client → core/client}/models/core_spec_configurations.py +0 -0
  234. /blaxel/{client → core/client}/models/country.py +0 -0
  235. /blaxel/{client → core/client}/models/create_api_key_for_service_account_body.py +0 -0
  236. /blaxel/{client → core/client}/models/create_workspace_service_account_body.py +0 -0
  237. /blaxel/{client → core/client}/models/create_workspace_service_account_response_200.py +0 -0
  238. /blaxel/{client → core/client}/models/delete_sandbox_preview_token_response_200.py +0 -0
  239. /blaxel/{client → core/client}/models/delete_workspace_service_account_response_200.py +0 -0
  240. /blaxel/{client → core/client}/models/entrypoint.py +0 -0
  241. /blaxel/{client → core/client}/models/entrypoint_env.py +0 -0
  242. /blaxel/{client → core/client}/models/flavor.py +0 -0
  243. /blaxel/{client → core/client}/models/form.py +0 -0
  244. /blaxel/{client → core/client}/models/form_config.py +0 -0
  245. /blaxel/{client → core/client}/models/form_oauth.py +0 -0
  246. /blaxel/{client → core/client}/models/form_secrets.py +0 -0
  247. /blaxel/{client → core/client}/models/function_kit.py +0 -0
  248. /blaxel/{client → core/client}/models/function_schema.py +0 -0
  249. /blaxel/{client → core/client}/models/function_schema_not.py +0 -0
  250. /blaxel/{client → core/client}/models/function_schema_or_bool.py +0 -0
  251. /blaxel/{client → core/client}/models/get_workspace_service_accounts_response_200_item.py +0 -0
  252. /blaxel/{client → core/client}/models/histogram_bucket.py +0 -0
  253. /blaxel/{client → core/client}/models/histogram_stats.py +0 -0
  254. /blaxel/{client → core/client}/models/integration_additional_infos.py +0 -0
  255. /blaxel/{client → core/client}/models/integration_connection.py +0 -0
  256. /blaxel/{client → core/client}/models/integration_connection_spec.py +0 -0
  257. /blaxel/{client → core/client}/models/integration_connection_spec_config.py +0 -0
  258. /blaxel/{client → core/client}/models/integration_connection_spec_secret.py +0 -0
  259. /blaxel/{client → core/client}/models/integration_endpoint.py +0 -0
  260. /blaxel/{client → core/client}/models/integration_endpoint_token.py +0 -0
  261. /blaxel/{client → core/client}/models/integration_headers.py +0 -0
  262. /blaxel/{client → core/client}/models/integration_model.py +0 -0
  263. /blaxel/{client → core/client}/models/integration_organization.py +0 -0
  264. /blaxel/{client → core/client}/models/integration_query_params.py +0 -0
  265. /blaxel/{client → core/client}/models/integration_repository.py +0 -0
  266. /blaxel/{client → core/client}/models/invite_workspace_user_body.py +0 -0
  267. /blaxel/{client → core/client}/models/job_execution_config.py +0 -0
  268. /blaxel/{client → core/client}/models/job_metrics.py +0 -0
  269. /blaxel/{client → core/client}/models/job_metrics_executions_chart.py +0 -0
  270. /blaxel/{client → core/client}/models/job_metrics_executions_total.py +0 -0
  271. /blaxel/{client → core/client}/models/job_metrics_tasks_chart.py +0 -0
  272. /blaxel/{client → core/client}/models/job_metrics_tasks_total.py +0 -0
  273. /blaxel/{client → core/client}/models/jobs_chart.py +0 -0
  274. /blaxel/{client → core/client}/models/jobs_chart_value.py +0 -0
  275. /blaxel/{client → core/client}/models/jobs_executions.py +0 -0
  276. /blaxel/{client → core/client}/models/jobs_network_chart.py +0 -0
  277. /blaxel/{client → core/client}/models/jobs_success_failed_chart.py +0 -0
  278. /blaxel/{client → core/client}/models/jobs_tasks.py +0 -0
  279. /blaxel/{client → core/client}/models/jobs_total.py +0 -0
  280. /blaxel/{client → core/client}/models/knowledgebase_spec.py +0 -0
  281. /blaxel/{client → core/client}/models/knowledgebase_spec_options.py +0 -0
  282. /blaxel/{client → core/client}/models/last_n_requests_metric.py +0 -0
  283. /blaxel/{client → core/client}/models/latency_metric.py +0 -0
  284. /blaxel/{client → core/client}/models/logs_response.py +0 -0
  285. /blaxel/{client → core/client}/models/logs_response_data.py +0 -0
  286. /blaxel/{client → core/client}/models/mcp_definition.py +0 -0
  287. /blaxel/{client → core/client}/models/mcp_definition_entrypoint.py +0 -0
  288. /blaxel/{client → core/client}/models/mcp_definition_form.py +0 -0
  289. /blaxel/{client → core/client}/models/memory_allocation_by_name.py +0 -0
  290. /blaxel/{client → core/client}/models/memory_allocation_metric.py +0 -0
  291. /blaxel/{client → core/client}/models/metadata.py +0 -0
  292. /blaxel/{client → core/client}/models/metadata_labels.py +0 -0
  293. /blaxel/{client → core/client}/models/metric.py +0 -0
  294. /blaxel/{client → core/client}/models/metrics.py +0 -0
  295. /blaxel/{client → core/client}/models/metrics_models.py +0 -0
  296. /blaxel/{client → core/client}/models/metrics_request_total_per_code.py +0 -0
  297. /blaxel/{client → core/client}/models/metrics_rps_per_code.py +0 -0
  298. /blaxel/{client → core/client}/models/model_private_cluster.py +0 -0
  299. /blaxel/{client → core/client}/models/o_auth.py +0 -0
  300. /blaxel/{client → core/client}/models/owner_fields.py +0 -0
  301. /blaxel/{client → core/client}/models/pending_invitation.py +0 -0
  302. /blaxel/{client → core/client}/models/pending_invitation_accept.py +0 -0
  303. /blaxel/{client → core/client}/models/pending_invitation_render.py +0 -0
  304. /blaxel/{client → core/client}/models/pending_invitation_render_invited_by.py +0 -0
  305. /blaxel/{client → core/client}/models/pending_invitation_render_workspace.py +0 -0
  306. /blaxel/{client → core/client}/models/pending_invitation_workspace_details.py +0 -0
  307. /blaxel/{client → core/client}/models/pod_template_spec.py +0 -0
  308. /blaxel/{client → core/client}/models/policy.py +0 -0
  309. /blaxel/{client → core/client}/models/policy_location.py +0 -0
  310. /blaxel/{client → core/client}/models/policy_max_tokens.py +0 -0
  311. /blaxel/{client → core/client}/models/port.py +0 -0
  312. /blaxel/{client → core/client}/models/preview.py +0 -0
  313. /blaxel/{client → core/client}/models/preview_metadata.py +0 -0
  314. /blaxel/{client → core/client}/models/preview_spec.py +0 -0
  315. /blaxel/{client → core/client}/models/preview_spec_request_headers.py +0 -0
  316. /blaxel/{client → core/client}/models/preview_spec_response_headers.py +0 -0
  317. /blaxel/{client → core/client}/models/preview_token.py +0 -0
  318. /blaxel/{client → core/client}/models/preview_token_metadata.py +0 -0
  319. /blaxel/{client → core/client}/models/preview_token_spec.py +0 -0
  320. /blaxel/{client → core/client}/models/private_cluster.py +0 -0
  321. /blaxel/{client → core/client}/models/private_location.py +0 -0
  322. /blaxel/{client → core/client}/models/repository.py +0 -0
  323. /blaxel/{client → core/client}/models/request_duration_over_time_metric.py +0 -0
  324. /blaxel/{client → core/client}/models/request_duration_over_time_metrics.py +0 -0
  325. /blaxel/{client → core/client}/models/request_total_by_origin_metric.py +0 -0
  326. /blaxel/{client → core/client}/models/request_total_by_origin_metric_request_total_by_origin.py +0 -0
  327. /blaxel/{client → core/client}/models/request_total_by_origin_metric_request_total_by_origin_and_code.py +0 -0
  328. /blaxel/{client → core/client}/models/request_total_metric.py +0 -0
  329. /blaxel/{client → core/client}/models/request_total_metric_request_total_per_code.py +0 -0
  330. /blaxel/{client → core/client}/models/request_total_metric_rps_per_code.py +0 -0
  331. /blaxel/{client → core/client}/models/request_total_response_data.py +0 -0
  332. /blaxel/{client → core/client}/models/resource.py +0 -0
  333. /blaxel/{client → core/client}/models/resource_log.py +0 -0
  334. /blaxel/{client → core/client}/models/resource_log_chart.py +0 -0
  335. /blaxel/{client → core/client}/models/resource_log_response.py +0 -0
  336. /blaxel/{client → core/client}/models/resource_metrics_request_total_per_code.py +0 -0
  337. /blaxel/{client → core/client}/models/resource_metrics_request_total_per_code_previous.py +0 -0
  338. /blaxel/{client → core/client}/models/resource_metrics_rps_per_code.py +0 -0
  339. /blaxel/{client → core/client}/models/resource_metrics_rps_per_code_previous.py +0 -0
  340. /blaxel/{client → core/client}/models/resource_trace.py +0 -0
  341. /blaxel/{client → core/client}/models/revision_configuration.py +0 -0
  342. /blaxel/{client → core/client}/models/revision_metadata.py +0 -0
  343. /blaxel/{client → core/client}/models/runtime_configuration.py +0 -0
  344. /blaxel/{client → core/client}/models/runtime_startup_probe.py +0 -0
  345. /blaxel/{client → core/client}/models/serverless_config.py +0 -0
  346. /blaxel/{client → core/client}/models/serverless_config_configuration.py +0 -0
  347. /blaxel/{client → core/client}/models/spec_configuration.py +0 -0
  348. /blaxel/{client → core/client}/models/start_sandbox.py +0 -0
  349. /blaxel/{client → core/client}/models/stop_sandbox.py +0 -0
  350. /blaxel/{client → core/client}/models/store_agent_labels.py +0 -0
  351. /blaxel/{client → core/client}/models/store_configuration_option.py +0 -0
  352. /blaxel/{client → core/client}/models/template_variable.py +0 -0
  353. /blaxel/{client → core/client}/models/time_fields.py +0 -0
  354. /blaxel/{client → core/client}/models/time_to_first_token_over_time_metrics.py +0 -0
  355. /blaxel/{client → core/client}/models/token_rate_metric.py +0 -0
  356. /blaxel/{client → core/client}/models/token_rate_metrics.py +0 -0
  357. /blaxel/{client → core/client}/models/token_total_metric.py +0 -0
  358. /blaxel/{client → core/client}/models/trace_ids_response.py +0 -0
  359. /blaxel/{client → core/client}/models/trigger.py +0 -0
  360. /blaxel/{client → core/client}/models/trigger_configuration.py +0 -0
  361. /blaxel/{client → core/client}/models/update_workspace_service_account_body.py +0 -0
  362. /blaxel/{client → core/client}/models/update_workspace_service_account_response_200.py +0 -0
  363. /blaxel/{client → core/client}/models/update_workspace_user_role_body.py +0 -0
  364. /blaxel/{client → core/client}/models/websocket_channel.py +0 -0
  365. /blaxel/{client → core/client}/models/websocket_message.py +0 -0
  366. /blaxel/{client → core/client}/models/workspace.py +0 -0
  367. /blaxel/{client → core/client}/models/workspace_labels.py +0 -0
  368. /blaxel/{client → core/client}/models/workspace_runtime.py +0 -0
  369. /blaxel/{client → core/client}/models/workspace_user.py +0 -0
  370. /blaxel/{client → core/client}/py.typed +0 -0
  371. /blaxel/{client → core/client}/types.py +0 -0
  372. /blaxel/{common → core/common}/env.py +0 -0
  373. /blaxel/{common → core/common}/settings.py +0 -0
  374. /blaxel/{sandbox/client/api/filesystem/__init__.py → core/py.typed} +0 -0
  375. /blaxel/{sandbox → core/sandbox}/client/__init__.py +0 -0
  376. /blaxel/{sandbox → core/sandbox}/client/api/__init__.py +0 -0
  377. /blaxel/{sandbox/client/api/network → core/sandbox/client/api/filesystem}/__init__.py +0 -0
  378. /blaxel/{sandbox → core/sandbox}/client/api/filesystem/delete_filesystem_path.py +0 -0
  379. /blaxel/{sandbox → core/sandbox}/client/api/filesystem/get_filesystem_path.py +0 -0
  380. /blaxel/{sandbox → core/sandbox}/client/api/filesystem/get_watch_filesystem_path.py +0 -0
  381. /blaxel/{sandbox → core/sandbox}/client/api/filesystem/get_ws_watch_filesystem_path.py +0 -0
  382. /blaxel/{sandbox/client/api/process → core/sandbox/client/api/network}/__init__.py +0 -0
  383. /blaxel/{sandbox → core/sandbox}/client/api/network/delete_network_process_pid_monitor.py +0 -0
  384. /blaxel/{sandbox → core/sandbox}/client/api/network/get_network_process_pid_ports.py +0 -0
  385. /blaxel/{sandbox → core/sandbox}/client/api/process/delete_process_identifier.py +0 -0
  386. /blaxel/{sandbox → core/sandbox}/client/api/process/delete_process_identifier_kill.py +0 -0
  387. /blaxel/{sandbox → core/sandbox}/client/api/process/get_process.py +0 -0
  388. /blaxel/{sandbox → core/sandbox}/client/api/process/get_process_identifier.py +0 -0
  389. /blaxel/{sandbox → core/sandbox}/client/api/process/get_process_identifier_logs.py +0 -0
  390. /blaxel/{sandbox → core/sandbox}/client/api/process/get_process_identifier_logs_stream.py +0 -0
  391. /blaxel/{sandbox → core/sandbox}/client/api/process/get_ws_process_identifier_logs_stream.py +0 -0
  392. /blaxel/{sandbox → core/sandbox}/client/client.py +0 -0
  393. /blaxel/{sandbox → core/sandbox}/client/errors.py +0 -0
  394. /blaxel/{sandbox → core/sandbox}/client/models/__init__.py +0 -0
  395. /blaxel/{sandbox → core/sandbox}/client/models/delete_network_process_pid_monitor_response_200.py +0 -0
  396. /blaxel/{sandbox → core/sandbox}/client/models/error_response.py +0 -0
  397. /blaxel/{sandbox → core/sandbox}/client/models/file.py +0 -0
  398. /blaxel/{sandbox → core/sandbox}/client/models/file_request.py +0 -0
  399. /blaxel/{sandbox → core/sandbox}/client/models/file_with_content.py +0 -0
  400. /blaxel/{sandbox → core/sandbox}/client/models/get_network_process_pid_ports_response_200.py +0 -0
  401. /blaxel/{sandbox → core/sandbox}/client/models/port_monitor_request.py +0 -0
  402. /blaxel/{sandbox → core/sandbox}/client/models/post_network_process_pid_monitor_response_200.py +0 -0
  403. /blaxel/{sandbox → core/sandbox}/client/models/process_logs.py +0 -0
  404. /blaxel/{sandbox → core/sandbox}/client/models/process_request.py +0 -0
  405. /blaxel/{sandbox → core/sandbox}/client/models/process_request_env.py +0 -0
  406. /blaxel/{sandbox → core/sandbox}/client/models/process_response.py +0 -0
  407. /blaxel/{sandbox → core/sandbox}/client/models/process_response_status.py +0 -0
  408. /blaxel/{sandbox → core/sandbox}/client/models/subdirectory.py +0 -0
  409. /blaxel/{sandbox → core/sandbox}/client/models/success_response.py +0 -0
  410. /blaxel/{sandbox → core/sandbox}/client/py.typed +0 -0
  411. /blaxel/{sandbox → core/sandbox}/client/types.py +0 -0
  412. /blaxel/{tools → core/tools}/common.py +0 -0
  413. /blaxel/{tools → core/tools}/types.py +0 -0
  414. /blaxel/{models/custom/langchain → langgraph/custom}/gemini.py +0 -0
  415. /blaxel/{models/custom/llamaindex → llamaindex/custom}/cohere.py +0 -0
  416. /blaxel/{instrumentation → telemetry}/exporters.py +0 -0
  417. /blaxel/{instrumentation → telemetry/log}/log.py +0 -0
  418. {blaxel-0.1.22rc70.dist-info → blaxel-0.2.0rc1.dist-info}/WHEEL +0 -0
  419. {blaxel-0.1.22rc70.dist-info → blaxel-0.2.0rc1.dist-info}/licenses/LICENSE +0 -0
@@ -1,26 +1,33 @@
1
1
  import asyncio
2
2
  import logging
3
3
  import time
4
- from typing import List
4
+ from typing import Any, Dict, List, Union
5
5
 
6
6
  from ..client.api.compute.create_sandbox import asyncio as create_sandbox
7
7
  from ..client.api.compute.delete_sandbox import asyncio as delete_sandbox
8
8
  from ..client.api.compute.get_sandbox import asyncio as get_sandbox
9
9
  from ..client.api.compute.list_sandboxes import asyncio as list_sandboxes
10
10
  from ..client.client import client
11
- from ..client.models import Sandbox
11
+ from ..client.models import Metadata, Sandbox
12
12
  from .filesystem import SandboxFileSystem
13
+ from .network import SandboxNetwork
13
14
  from .preview import SandboxPreviews
14
15
  from .process import SandboxProcess
16
+ from .session import SandboxSessions
17
+ from .types import SandboxConfiguration, SessionWithToken
15
18
 
16
19
  logger = logging.getLogger(__name__)
17
20
 
21
+
18
22
  class SandboxInstance:
19
23
  def __init__(self, sandbox: Sandbox):
20
24
  self.sandbox = sandbox
21
- self.fs = SandboxFileSystem(sandbox)
22
- self.process = SandboxProcess(sandbox)
25
+ self.config = SandboxConfiguration(sandbox)
26
+ self.fs = SandboxFileSystem(self.config)
27
+ self.process = SandboxProcess(self.config)
23
28
  self.previews = SandboxPreviews(sandbox)
29
+ self.sessions = SandboxSessions(self.config)
30
+ self.network = SandboxNetwork(self.config)
24
31
 
25
32
  @property
26
33
  def metadata(self):
@@ -49,6 +56,7 @@ class SandboxInstance:
49
56
  )
50
57
  logger.info(f"Waiting for sandbox to be deployed, status: {response.status}")
51
58
  self.sandbox = response
59
+ self.config = SandboxConfiguration(self.sandbox)
52
60
  except Exception as e:
53
61
  logger.error("Could not retrieve sandbox", exc_info=e)
54
62
 
@@ -59,7 +67,10 @@ class SandboxInstance:
59
67
  raise Exception("Sandbox did not deploy in time")
60
68
 
61
69
  @classmethod
62
- async def create(cls, sandbox: Sandbox) -> "SandboxInstance":
70
+ async def create(cls, sandbox: Union[Sandbox, Dict[str, Any]]) -> "SandboxInstance":
71
+ if isinstance(sandbox, dict):
72
+ sandbox = Sandbox.from_dict(sandbox)
73
+
63
74
  if not sandbox.spec:
64
75
  raise Exception("Sandbox spec is required")
65
76
  if not sandbox.spec.runtime:
@@ -92,3 +103,49 @@ class SandboxInstance:
92
103
  client=client,
93
104
  )
94
105
  return response
106
+
107
+ @classmethod
108
+ async def create_if_not_exists(
109
+ cls, sandbox: Union[Sandbox, Dict[str, Any]]
110
+ ) -> "SandboxInstance":
111
+ """Create a sandbox if it doesn't exist, otherwise return existing."""
112
+ if isinstance(sandbox, dict):
113
+ sandbox = Sandbox.from_dict(sandbox)
114
+
115
+ try:
116
+ sandbox_instance = await cls.get(sandbox.metadata.name)
117
+ return sandbox_instance
118
+ except Exception as e:
119
+ # Check if it's a 404 error (sandbox not found)
120
+ if hasattr(e, "status_code") and e.status_code == 404:
121
+ return await cls.create(sandbox)
122
+ raise e
123
+
124
+ @classmethod
125
+ async def from_session(
126
+ cls, session: Union[SessionWithToken, Dict[str, Any]]
127
+ ) -> "SandboxInstance":
128
+ """Create a sandbox instance from a session with token."""
129
+ if isinstance(session, dict):
130
+ session = SessionWithToken.from_dict(session)
131
+
132
+ # Create a minimal sandbox configuration for session-based access
133
+ sandbox_name = session.name.split("-")[0] if "-" in session.name else session.name
134
+ sandbox = Sandbox(metadata=Metadata(name=sandbox_name))
135
+ config = SandboxConfiguration(
136
+ sandbox=sandbox,
137
+ force_url=session.url,
138
+ headers={"X-Blaxel-Preview-Token": session.token},
139
+ params={"bl_preview_token": session.token},
140
+ )
141
+
142
+ instance = cls.__new__(cls)
143
+ instance.sandbox = sandbox
144
+ instance.config = config
145
+ instance.fs = SandboxFileSystem(config)
146
+ instance.process = SandboxProcess(config)
147
+ instance.previews = SandboxPreviews(sandbox)
148
+ instance.sessions = SandboxSessions(config)
149
+ instance.network = SandboxNetwork(config)
150
+
151
+ return instance
@@ -0,0 +1,124 @@
1
+ from datetime import datetime, timedelta
2
+ from typing import Any, Dict, List, Optional, Union
3
+
4
+ from ..client.api.compute import (
5
+ create_sandbox_preview,
6
+ delete_sandbox_preview,
7
+ get_sandbox_preview,
8
+ list_sandbox_preview_tokens,
9
+ list_sandbox_previews,
10
+ )
11
+ from ..client.client import client
12
+ from ..client.models import Metadata, Preview, PreviewSpec
13
+ from .preview import SandboxPreview
14
+ from .types import SandboxConfiguration, SessionCreateOptions, SessionWithToken
15
+
16
+
17
+ class SandboxSessions:
18
+ def __init__(self, sandbox_config: SandboxConfiguration):
19
+ self.sandbox_config = sandbox_config
20
+
21
+ @property
22
+ def sandbox_name(self) -> str:
23
+ return self.sandbox_config.metadata.name if self.sandbox_config.metadata else ""
24
+
25
+ async def create(
26
+ self, options: Optional[Union[SessionCreateOptions, Dict[str, Any]]] = None
27
+ ) -> SessionWithToken:
28
+ if options is None:
29
+ options = SessionCreateOptions()
30
+ elif isinstance(options, dict):
31
+ options = SessionCreateOptions.from_dict(options)
32
+
33
+ expires_at = options.expires_at or datetime.now() + timedelta(days=1)
34
+
35
+ preview_body = Preview(
36
+ metadata=Metadata(name=f"session-{int(datetime.now().timestamp() * 1000)}"),
37
+ spec=PreviewSpec(
38
+ port=443,
39
+ public=False,
40
+ request_headers=options.request_headers,
41
+ response_headers=options.response_headers,
42
+ ),
43
+ )
44
+
45
+ preview_response = await create_sandbox_preview.asyncio(
46
+ self.sandbox_name, client=client, body=preview_body
47
+ )
48
+
49
+ preview = SandboxPreview(preview_response, self.sandbox_name)
50
+ token_obj = await preview.tokens.create(expires_at)
51
+
52
+ return SessionWithToken(
53
+ name=preview_body.metadata.name,
54
+ url=preview.spec.url or "",
55
+ token=token_obj.value,
56
+ expires_at=token_obj.expires_at,
57
+ )
58
+
59
+ async def create_if_expired(
60
+ self,
61
+ options: Optional[Union[SessionCreateOptions, Dict[str, Any]]] = None,
62
+ delta_seconds: int = 3600, # 1 hour
63
+ ) -> SessionWithToken:
64
+ if options is None:
65
+ options = SessionCreateOptions()
66
+ elif isinstance(options, dict):
67
+ options = SessionCreateOptions.from_dict(options)
68
+
69
+ all_sessions = await self.list()
70
+ now = datetime.now()
71
+ threshold = now + timedelta(seconds=delta_seconds)
72
+
73
+ if all_sessions:
74
+ session_data = all_sessions[0]
75
+ if session_data.expires_at < threshold:
76
+ await self.delete(session_data.name)
77
+ session_data = await self.create(options)
78
+ else:
79
+ session_data = await self.create(options)
80
+
81
+ return session_data
82
+
83
+ async def list(self) -> List[SessionWithToken]:
84
+ previews_response = await list_sandbox_previews.asyncio(self.sandbox_name, client=client)
85
+
86
+ sessions = []
87
+ for preview in previews_response:
88
+ if preview.metadata and preview.metadata.name and "session-" in preview.metadata.name:
89
+ token = await self.get_token(preview.metadata.name)
90
+ if token:
91
+ sessions.append(
92
+ SessionWithToken(
93
+ name=preview.metadata.name,
94
+ url=preview.spec.url or "",
95
+ token=token.spec.token or "",
96
+ expires_at=token.spec.expires_at or datetime.now(),
97
+ )
98
+ )
99
+
100
+ return sessions
101
+
102
+ async def get(self, name: str) -> SessionWithToken:
103
+ preview_response = await get_sandbox_preview.asyncio(self.sandbox_name, name, client=client)
104
+
105
+ token = await self.get_token(name)
106
+
107
+ return SessionWithToken(
108
+ name=name,
109
+ url=preview_response.spec.url or "",
110
+ token=token.spec.token or "" if token else "",
111
+ expires_at=token.spec.expires_at or datetime.now() if token else datetime.now(),
112
+ )
113
+
114
+ async def delete(self, name: str):
115
+ return await delete_sandbox_preview.asyncio(self.sandbox_name, name, client=client)
116
+
117
+ async def get_token(self, preview_name: str):
118
+ tokens_response = await list_sandbox_preview_tokens.asyncio(
119
+ self.sandbox_name, preview_name, client=client
120
+ )
121
+
122
+ if not tokens_response:
123
+ return None
124
+ return tokens_response[0]
@@ -0,0 +1,103 @@
1
+ from datetime import datetime
2
+ from typing import Any, Dict, Optional
3
+
4
+ from ..client.models import Sandbox
5
+
6
+
7
+ class SessionCreateOptions:
8
+ def __init__(
9
+ self,
10
+ expires_at: Optional[datetime] = None,
11
+ response_headers: Optional[Dict[str, str]] = None,
12
+ request_headers: Optional[Dict[str, str]] = None,
13
+ ):
14
+ self.expires_at = expires_at
15
+ self.response_headers = response_headers or {}
16
+ self.request_headers = request_headers or {}
17
+
18
+ @classmethod
19
+ def from_dict(cls, data: Dict[str, Any]) -> "SessionCreateOptions":
20
+ expires_at = None
21
+ if "expires_at" in data and data["expires_at"]:
22
+ if isinstance(data["expires_at"], str):
23
+ expires_at = datetime.fromisoformat(data["expires_at"].replace("Z", "+00:00"))
24
+ elif isinstance(data["expires_at"], datetime):
25
+ expires_at = data["expires_at"]
26
+
27
+ return cls(
28
+ expires_at=expires_at,
29
+ response_headers=data.get("response_headers"),
30
+ request_headers=data.get("request_headers"),
31
+ )
32
+
33
+
34
+ class SessionWithToken:
35
+ def __init__(self, name: str, url: str, token: str, expires_at: datetime):
36
+ self.name = name
37
+ self.url = url
38
+ self.token = token
39
+ self.expires_at = expires_at
40
+
41
+ @classmethod
42
+ def from_dict(cls, data: Dict[str, Any]) -> "SessionWithToken":
43
+ expires_at = data["expires_at"]
44
+ if isinstance(expires_at, str):
45
+ expires_at = datetime.fromisoformat(expires_at.replace("Z", "+00:00"))
46
+
47
+ return cls(
48
+ name=data["name"],
49
+ url=data["url"],
50
+ token=data["token"],
51
+ expires_at=expires_at,
52
+ )
53
+
54
+
55
+ class SandboxConfiguration:
56
+ def __init__(
57
+ self,
58
+ sandbox: Sandbox,
59
+ force_url: Optional[str] = None,
60
+ headers: Optional[Dict[str, str]] = None,
61
+ params: Optional[Dict[str, str]] = None,
62
+ ):
63
+ self.sandbox = sandbox
64
+ self.force_url = force_url
65
+ self.headers = headers or {}
66
+ self.params = params or {}
67
+
68
+ @property
69
+ def metadata(self):
70
+ return self.sandbox.metadata
71
+
72
+ @property
73
+ def status(self):
74
+ return self.sandbox.status
75
+
76
+ @property
77
+ def spec(self):
78
+ return self.sandbox.spec
79
+
80
+
81
+ class WatchEvent:
82
+ def __init__(self, op: str, path: str, name: str, content: Optional[str] = None):
83
+ self.op = op
84
+ self.path = path
85
+ self.name = name
86
+ self.content = content
87
+
88
+
89
+ class SandboxFilesystemFile:
90
+ def __init__(self, path: str, content: str):
91
+ self.path = path
92
+ self.content = content
93
+
94
+ @classmethod
95
+ def from_dict(cls, data: Dict[str, Any]) -> "SandboxFilesystemFile":
96
+ return cls(data["path"], data["content"])
97
+
98
+
99
+ class CopyResponse:
100
+ def __init__(self, message: str, source: str, destination: str):
101
+ self.message = message
102
+ self.source = source
103
+ self.destination = destination
@@ -1,5 +1,4 @@
1
1
  import asyncio
2
- import json
3
2
  import os
4
3
  import traceback
5
4
  from contextlib import AsyncExitStack
@@ -12,7 +11,6 @@ from mcp.types import Tool as MCPTool
12
11
 
13
12
  from ..common.internal import get_forced_url, get_global_unique_hash
14
13
  from ..common.settings import settings
15
- from ..instrumentation.span import SpanManager
16
14
  from ..mcp.client import websocket_client
17
15
  from .types import Tool
18
16
 
@@ -22,8 +20,11 @@ DEFAULT_TIMEOUT = 1
22
20
  if os.getenv("BL_SERVER_PORT"):
23
21
  DEFAULT_TIMEOUT = 5
24
22
 
23
+
25
24
  class PersistentWebSocket:
26
- def __init__(self, url: str, name: str, timeout: int = DEFAULT_TIMEOUT, timeout_enabled: bool = True):
25
+ def __init__(
26
+ self, url: str, name: str, timeout: int = DEFAULT_TIMEOUT, timeout_enabled: bool = True
27
+ ):
27
28
  self.url = url
28
29
  self.name = name
29
30
  self.timeout = timeout
@@ -58,32 +59,30 @@ class PersistentWebSocket:
58
59
  except Exception as e:
59
60
  logger.error(f"Error calling tool {tool_name}: {e}\n{traceback.format_exc()}")
60
61
  return CallToolResult(
61
- content=[{"type": "text", "text": f"Error calling tool {tool_name}: {e}\n{traceback.format_exc()}"}],
62
+ content=[
63
+ {
64
+ "type": "text",
65
+ "text": f"Error calling tool {tool_name}: {e}\n{traceback.format_exc()}",
66
+ }
67
+ ],
62
68
  isError=True,
63
69
  )
64
70
 
65
71
  async def list_tools(self):
66
72
  logger.debug(f"Listing tools for {self.name}")
67
- span_attributes = {
68
- "tool.server": self.url,
69
- "tool.server_name": self.name,
70
- "span.type": "tool.list",
71
- }
72
- with SpanManager("blaxel-tracer").create_active_span(self.name, span_attributes) as span:
73
- await self._initialize()
74
- logger.debug(f"Initialized websocket for {self.name}")
75
- if self.timeout_enabled:
76
- self._remove_timer()
77
- logger.debug("Listing tools")
78
- list_tools_result = await self.session.list_tools()
79
- self.tools_cache = list_tools_result.tools
80
- logger.debug(f"Tools listed: {list_tools_result}")
81
- if self.timeout_enabled:
82
- self._reset_timer()
83
- else:
84
- await self._close()
85
- span.set_attribute("tool.list.result", list_tools_result.model_dump_json())
86
- return list_tools_result
73
+ await self._initialize()
74
+ logger.debug(f"Initialized websocket for {self.name}")
75
+ if self.timeout_enabled:
76
+ self._remove_timer()
77
+ logger.debug("Listing tools")
78
+ list_tools_result = await self.session.list_tools()
79
+ self.tools_cache = list_tools_result.tools
80
+ logger.debug(f"Tools listed: {list_tools_result}")
81
+ if self.timeout_enabled:
82
+ self._reset_timer()
83
+ else:
84
+ await self._close()
85
+ return list_tools_result
87
86
 
88
87
  def get_tools(self):
89
88
  return self.tools_cache
@@ -91,8 +90,13 @@ class PersistentWebSocket:
91
90
  async def _initialize(self):
92
91
  if not self.session:
93
92
  logger.debug(f"Initializing websocket client for {self.url}")
94
- read, write = await self.client_exit_stack.enter_async_context(websocket_client(self.url, settings.headers))
95
- self.session = cast(ClientSession, await self.session_exit_stack.enter_async_context(ClientSession(read, write)))
93
+ read, write = await self.client_exit_stack.enter_async_context(
94
+ websocket_client(self.url, settings.headers)
95
+ )
96
+ self.session = cast(
97
+ ClientSession,
98
+ await self.session_exit_stack.enter_async_context(ClientSession(read, write)),
99
+ )
96
100
  await self.session.initialize()
97
101
 
98
102
  def _reset_timer(self):
@@ -108,7 +112,6 @@ class PersistentWebSocket:
108
112
  await self._close()
109
113
  self.session = None
110
114
 
111
-
112
115
  async def _close(self):
113
116
  logger.debug(f"Closing websocket client {self.url}")
114
117
  if self.session:
@@ -123,6 +126,7 @@ class PersistentWebSocket:
123
126
  logger.debug(f"Error closing client exit stack: {e}")
124
127
  logger.debug("WebSocket connection closed due to inactivity.")
125
128
 
129
+
126
130
  def convert_mcp_tool_to_blaxel_tool(
127
131
  websocket_client: PersistentWebSocket,
128
132
  name: str,
@@ -145,18 +149,10 @@ def convert_mcp_tool_to_blaxel_tool(
145
149
  *args: Any,
146
150
  **arguments: dict[str, Any],
147
151
  ) -> CallToolResult:
148
- span_attributes = {
149
- "tool.name": tool.name,
150
- "tool.args": json.dumps(arguments),
151
- "tool.server": url,
152
- "tool.server_name": name,
153
- "span.type": "tool.call",
154
- }
155
- with SpanManager("blaxel-tracer").create_active_span("blaxel-tool-call", span_attributes):
156
- logger.debug(f"Calling tool {tool.name} with arguments {arguments}")
157
- call_tool_result = await websocket_client.call_tool(tool.name, arguments)
158
- logger.debug(f"Tool {tool.name} returned {call_tool_result}")
159
- return call_tool_result
152
+ logger.debug(f"Calling tool {tool.name} with arguments {arguments}")
153
+ call_tool_result = await websocket_client.call_tool(tool.name, arguments)
154
+ logger.debug(f"Tool {tool.name} returned {call_tool_result}")
155
+ return call_tool_result
160
156
 
161
157
  async def call_tool(
162
158
  *args: Any,
@@ -180,10 +176,18 @@ def convert_mcp_tool_to_blaxel_tool(
180
176
  response_format="content_and_artifact",
181
177
  )
182
178
 
179
+
183
180
  toolPersistances: dict[str, PersistentWebSocket] = {}
184
181
 
182
+
185
183
  class BlTools:
186
- def __init__(self, functions: list[str], metas: dict[str, Any] = {}, timeout: int = DEFAULT_TIMEOUT, timeout_enabled: bool = True):
184
+ def __init__(
185
+ self,
186
+ functions: list[str],
187
+ metas: dict[str, Any] = {},
188
+ timeout: int = DEFAULT_TIMEOUT,
189
+ timeout_enabled: bool = True,
190
+ ):
187
191
  self.functions = functions
188
192
  self.metas = metas
189
193
  self.timeout = timeout
@@ -224,52 +228,13 @@ class BlTools:
224
228
  toolPersistances.get(name).with_metas(self.metas)
225
229
  websocket = toolPersistances.get(name)
226
230
  tools = websocket.get_tools()
227
- converted_tools = [convert_mcp_tool_to_blaxel_tool(websocket, name, self._url(name), tool) for tool in tools]
231
+ converted_tools = [
232
+ convert_mcp_tool_to_blaxel_tool(websocket, name, self._url(name), tool)
233
+ for tool in tools
234
+ ]
228
235
  all_tools.extend(converted_tools)
229
236
  return all_tools
230
237
 
231
- async def to_langchain(self):
232
- from .langchain import get_langchain_tools
233
-
234
- await self.initialize()
235
- return get_langchain_tools(self.get_tools())
236
-
237
- async def to_llamaindex(self):
238
- from .llamaindex import get_llamaindex_tools
239
-
240
- await self.initialize()
241
- return get_llamaindex_tools(self.get_tools())
242
-
243
- async def to_crewai(self):
244
- from .crewai import get_crewai_tools
245
-
246
- await self.initialize()
247
- return get_crewai_tools(self.get_tools())
248
-
249
- async def to_openai(self):
250
- from .openai import get_openai_tools
251
-
252
- await self.initialize()
253
- return get_openai_tools(self.get_tools())
254
-
255
- async def to_pydantic(self):
256
- from .pydantic import get_pydantic_tools
257
-
258
- await self.initialize()
259
- return get_pydantic_tools(self.get_tools())
260
-
261
- async def to_google_adk(self):
262
- from .googleadk import get_google_adk_tools
263
-
264
- await self.initialize()
265
- return get_google_adk_tools(self.get_tools())
266
-
267
- async def to_livekit(self):
268
- from .livekit import get_livekit_tools
269
-
270
- await self.initialize()
271
- return get_livekit_tools(self.get_tools())
272
-
273
238
  async def connect(self, name: str):
274
239
  # Create and store the connection
275
240
  try:
@@ -283,12 +248,12 @@ class BlTools:
283
248
  try:
284
249
  await self.connect_with_url(name, url)
285
250
  except Exception as e:
286
- logger.error(f"Error connecting to {name} with fallback URL: {e}\n{traceback.format_exc()}")
251
+ logger.error(
252
+ f"Error connecting to {name} with fallback URL: {e}\n{traceback.format_exc()}"
253
+ )
287
254
  raise e
288
255
 
289
- async def connect_with_url(
290
- self, name: str, url: str
291
- ) -> None:
256
+ async def connect_with_url(self, name: str, url: str) -> None:
292
257
  """Initialize a session and load tools from it.
293
258
 
294
259
  Args:
@@ -299,17 +264,24 @@ class BlTools:
299
264
 
300
265
  if not toolPersistances.get(name):
301
266
  logger.debug(f"Creating new persistent websocket for {name}")
302
- toolPersistances[name] = PersistentWebSocket(url, name, timeout=self.timeout, timeout_enabled=self.timeout_enabled)
267
+ toolPersistances[name] = PersistentWebSocket(
268
+ url, name, timeout=self.timeout, timeout_enabled=self.timeout_enabled
269
+ )
303
270
  await toolPersistances[name].list_tools()
304
271
  logger.debug(f"Loaded {len(toolPersistances[name].get_tools())} tools from {url}")
305
272
  return toolPersistances[name].with_metas(self.metas)
306
273
 
307
274
  async def initialize(self) -> "BlTools":
308
275
  for i in range(0, len(self.functions), 10):
309
- batch = self.functions[i:i+10]
276
+ batch = self.functions[i : i + 10]
310
277
  await asyncio.gather(*(self.connect(name) for name in batch))
311
278
  return self
312
279
 
313
280
 
314
- def bl_tools(functions: list[str], metas: dict[str, Any] = {}, timeout: int = DEFAULT_TIMEOUT, timeout_enabled: bool = True) -> BlTools:
281
+ def bl_tools(
282
+ functions: list[str],
283
+ metas: dict[str, Any] = {},
284
+ timeout: int = DEFAULT_TIMEOUT,
285
+ timeout_enabled: bool = True,
286
+ ) -> BlTools:
315
287
  return BlTools(functions, metas=metas, timeout=timeout, timeout_enabled=timeout_enabled)
@@ -0,0 +1,4 @@
1
+ """Blaxel CrewAI integration module."""
2
+
3
+ from .model import * # noqa: F403, F401
4
+ from .tools import * # noqa: F403, F401
@@ -2,11 +2,13 @@ from logging import getLogger
2
2
 
3
3
  from crewai import LLM
4
4
 
5
- from ..common.settings import settings
5
+ from blaxel.core import bl_model as bl_model_core
6
+ from blaxel.core import settings
6
7
 
7
8
  logger = getLogger(__name__)
8
9
 
9
- async def get_crewai_model(url: str, type: str, model: str, **kwargs):
10
+ async def bl_model(name: str, **kwargs):
11
+ url, type, model = await bl_model_core(name).get_parameters()
10
12
  if type == 'mistral':
11
13
  return LLM(
12
14
  model=f"mistral/{model}",
blaxel/crewai/py.typed ADDED
File without changes
blaxel/crewai/tools.py ADDED
@@ -0,0 +1,26 @@
1
+ from crewai.tools import BaseTool
2
+
3
+ from blaxel.core.tools import bl_tools as bl_tools_core
4
+ from blaxel.core.tools.common import create_model_from_json_schema
5
+ from blaxel.core.tools.types import Tool
6
+
7
+
8
+ class CrewAITool(BaseTool):
9
+ _tool: Tool
10
+
11
+ def __init__(self, tool: Tool):
12
+ super().__init__(
13
+ name=tool.name,
14
+ description=tool.description,
15
+ args_schema=create_model_from_json_schema(tool.input_schema),
16
+ )
17
+ self._tool = tool
18
+
19
+ def _run(self, *args, **kwargs):
20
+ return self._tool.sync_coroutine(**kwargs)
21
+
22
+ async def bl_tools(tools_names: list[str], **kwargs) -> list[BaseTool]:
23
+ tools = bl_tools_core(tools_names, **kwargs)
24
+ await tools.initialize()
25
+ return [CrewAITool(tool) for tool in tools.get_tools()]
26
+ return [CrewAITool(tool) for tool in tools.get_tools()]
@@ -0,0 +1,4 @@
1
+ """Blaxel Google ADK integration module."""
2
+
3
+ from .model import * # noqa: F403, F401
4
+ from .tools import * # noqa: F403, F401
@@ -2,7 +2,8 @@ from logging import getLogger
2
2
 
3
3
  from google.adk.models.lite_llm import LiteLlm
4
4
 
5
- from ..common.settings import settings
5
+ from blaxel.core import bl_model as bl_model_core
6
+ from blaxel.core import settings
6
7
 
7
8
  logger = getLogger(__name__)
8
9
 
@@ -64,4 +65,9 @@ async def get_google_adk_model(url: str, type: str, model: str, **kwargs):
64
65
  api_key=settings.auth.token,
65
66
  api_base=f"{url}/v1",
66
67
  **kwargs
67
- )
68
+ )
69
+
70
+ async def bl_model(name: str, **kwargs):
71
+ url, type, model = await bl_model_core(name).get_parameters()
72
+ return await get_google_adk_model(url, type, model, **kwargs)
73
+ return await get_google_adk_model(url, type, model, **kwargs)
File without changes