blaxel 0.1.22rc70__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +26 -15
  63. blaxel/{mcp → core/mcp}/server.py +12 -37
  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 +125 -0
  111. blaxel/telemetry/instrumentation/blaxel_langgraph.py +99 -0
  112. blaxel/telemetry/instrumentation/blaxel_langgraph_gemini.py +346 -0
  113. blaxel/telemetry/instrumentation/blaxel_llamaindex.py +85 -0
  114. blaxel/telemetry/instrumentation/map.py +62 -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.0.dist-info/METADATA +224 -0
  121. blaxel-0.2.0.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.0.dist-info}/WHEEL +0 -0
  419. {blaxel-0.1.22rc70.dist-info → blaxel-0.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,72 @@
1
+ import inspect
2
+ from typing import Any, Optional, override
3
+
4
+ from google.adk.tools import BaseTool, ToolContext
5
+ from google.genai import types
6
+
7
+ from blaxel.core.tools import bl_tools as bl_tools_core
8
+ from blaxel.core.tools.types import Tool
9
+
10
+
11
+ class GoogleADKTool(BaseTool):
12
+ _tool: Tool
13
+
14
+ def __init__(self, tool: Tool):
15
+ super().__init__(
16
+ name=tool.name,
17
+ description=tool.description,
18
+ )
19
+ self._tool = tool
20
+
21
+ def _clean_schema(self, schema: dict) -> dict:
22
+ if not isinstance(schema, dict):
23
+ return schema
24
+
25
+ # Create a copy of the schema
26
+ cleaned_schema = schema.copy()
27
+
28
+ # Remove $schema and additionalProperties at current level
29
+ if "$schema" in cleaned_schema:
30
+ del cleaned_schema["$schema"]
31
+ if "additionalProperties" in cleaned_schema:
32
+ del cleaned_schema["additionalProperties"]
33
+
34
+ # Recursively clean properties if they exist
35
+ if "properties" in cleaned_schema:
36
+ cleaned_schema["properties"] = {
37
+ k: self._clean_schema(v) for k, v in cleaned_schema["properties"].items()
38
+ }
39
+
40
+ return cleaned_schema
41
+
42
+ @override
43
+ def _get_declaration(self) -> Optional[types.FunctionDeclaration]:
44
+ # Clean the schema recursively
45
+ schema = self._clean_schema(self._tool.input_schema)
46
+
47
+ function_decl = types.FunctionDeclaration.model_validate(
48
+ types.FunctionDeclaration(
49
+ name=self._tool.name,
50
+ description=self._tool.description,
51
+ parameters=schema,
52
+ )
53
+ )
54
+
55
+ return function_decl
56
+
57
+ @override
58
+ async def run_async(
59
+ self, *, args: dict[str, Any], tool_context: ToolContext
60
+ ) -> Any:
61
+ args_to_call = args.copy()
62
+ signature = inspect.signature(self._tool.coroutine)
63
+ if 'tool_context' in signature.parameters:
64
+ args_to_call['tool_context'] = tool_context
65
+ return await self._tool.coroutine(**args_to_call) or {}
66
+
67
+
68
+ async def bl_tools(tools_names: list[str], **kwargs: Any) -> list[BaseTool]:
69
+ tools = bl_tools_core(tools_names, **kwargs)
70
+ await tools.initialize()
71
+ return [GoogleADKTool(tool) for tool in tools.get_tools()]
72
+ return [GoogleADKTool(tool) for tool in tools.get_tools()]
@@ -0,0 +1,4 @@
1
+ """Blaxel LangGraph integration module."""
2
+
3
+ from .model import * # noqa: F403, F401
4
+ from .tools import * # noqa: F403, F401
@@ -7,12 +7,16 @@ from langchain_deepseek import ChatDeepSeek
7
7
  from langchain_openai import ChatOpenAI
8
8
  from langchain_xai import ChatXAI
9
9
 
10
- from ..common.settings import settings
11
- from .custom.langchain.gemini import ChatGoogleGenerativeAI
10
+ from blaxel.core import bl_model as bl_model_core
11
+ from blaxel.core import settings
12
+
13
+ from .custom.gemini import ChatGoogleGenerativeAI
12
14
 
13
15
  logger = getLogger(__name__)
14
16
 
15
- async def get_langchain_model(url: str,type: str, model: str, **kwargs):
17
+
18
+ async def bl_model(name: str, **kwargs):
19
+ url, type, model = await bl_model_core(name).get_parameters()
16
20
  if type == 'mistral':
17
21
  return ChatOpenAI(
18
22
  api_key=settings.auth.token,
@@ -72,4 +76,4 @@ async def get_langchain_model(url: str,type: str, model: str, **kwargs):
72
76
  model=model,
73
77
  base_url=f"{url}/v1",
74
78
  **kwargs
75
- )
79
+ )
File without changes
@@ -3,7 +3,8 @@ from typing import Any
3
3
  from langchain_core.tools import StructuredTool
4
4
  from mcp.types import CallToolResult, EmbeddedResource, ImageContent, TextContent
5
5
 
6
- from .types import Tool, ToolException
6
+ from blaxel.core.tools import bl_tools as bl_tools_core
7
+ from blaxel.core.tools.types import Tool, ToolException
7
8
 
8
9
  NonTextContent = ImageContent | EmbeddedResource
9
10
 
@@ -37,5 +38,8 @@ def get_langchain_tool(tool: Tool) -> StructuredTool:
37
38
  sync_coroutine=tool.sync_coroutine,
38
39
  )
39
40
 
40
- def get_langchain_tools(tools: list[Tool]) -> list[StructuredTool]:
41
- return [get_langchain_tool(tool) for tool in tools]
41
+
42
+ async def bl_tools(tools_names: list[str], **kwargs) -> list[StructuredTool]:
43
+ tools = bl_tools_core(tools_names, **kwargs)
44
+ await tools.initialize()
45
+ return [get_langchain_tool(tool) for tool in tools.get_tools()]
@@ -0,0 +1,4 @@
1
+ """Blaxel LiveKit 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 livekit.plugins import groq, openai
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
 
@@ -23,3 +24,8 @@ async def get_livekit_model(url: str, type: str, model: str, **kwargs):
23
24
  base_url=f"{url}/v1",
24
25
  **kwargs
25
26
  )
27
+
28
+ async def bl_model(name: str, **kwargs):
29
+ url, type, model = await bl_model_core(name).get_parameters()
30
+ return await get_livekit_model(url, type, model, **kwargs)
31
+ return await get_livekit_model(url, type, model, **kwargs)
File without changes
@@ -1,6 +1,7 @@
1
1
  from livekit.agents import function_tool, llm
2
2
 
3
- from .types import Tool
3
+ from blaxel.core.tools import bl_tools as bl_tools_core
4
+ from blaxel.core.tools.types import Tool
4
5
 
5
6
 
6
7
  def livekit_coroutine(tool: Tool):
@@ -21,3 +22,9 @@ def get_livekit_tools(tools: list[Tool]) -> list[llm.FunctionTool]:
21
22
  },
22
23
  ))
23
24
  return livekit_tools
25
+
26
+ async def bl_tools(tools_names: list[str], **kwargs) -> list[llm.FunctionTool]:
27
+ tools = bl_tools_core(tools_names, **kwargs)
28
+ await tools.initialize()
29
+ return get_livekit_tools(tools.get_tools())
30
+ return get_livekit_tools(tools.get_tools())
@@ -0,0 +1,4 @@
1
+ """Blaxel LlamaIndex integration module."""
2
+
3
+ from .model import * # noqa: F403, F401
4
+ from .tools import * # noqa: F403, F401
@@ -14,12 +14,15 @@ from llama_index.llms.groq import Groq
14
14
  from llama_index.llms.mistralai import MistralAI
15
15
  from llama_index.llms.openai import OpenAI
16
16
 
17
- from ..common.settings import settings
18
- from .custom.llamaindex.cohere import Cohere
17
+ from blaxel.core import bl_model as bl_model_core
18
+ from blaxel.core import settings
19
+
20
+ from .custom.cohere import Cohere
19
21
 
20
22
  logger = getLogger(__name__)
21
23
 
22
- async def get_llamaindex_model(url: str, type: str, model: str, **kwargs):
24
+ async def bl_model(name, **kwargs):
25
+ url, type, model = await bl_model_core(name).get_parameters()
23
26
  if type == 'anthropic':
24
27
  return Anthropic(
25
28
  model=model,
File without changes
@@ -3,8 +3,9 @@
3
3
  from llama_index.core.tools import FunctionTool
4
4
  from llama_index.core.tools.types import ToolMetadata
5
5
 
6
- from .common import create_model_from_json_schema
7
- from .types import Tool
6
+ from blaxel.core.tools import bl_tools as bl_tools_core
7
+ from blaxel.core.tools.common import create_model_from_json_schema
8
+ from blaxel.core.tools.types import Tool
8
9
 
9
10
 
10
11
  def get_llamaindex_tool(tool: Tool) -> FunctionTool:
@@ -21,5 +22,7 @@ def get_llamaindex_tool(tool: Tool) -> FunctionTool:
21
22
  ),
22
23
  )
23
24
 
24
- def get_llamaindex_tools(tools: list[Tool]) -> list[FunctionTool]:
25
- return [get_llamaindex_tool(tool) for tool in tools]
25
+ async def bl_tools(tools_names: list[str], **kwargs) -> list[FunctionTool]:
26
+ tools = bl_tools_core(tools_names, **kwargs)
27
+ await tools.initialize()
28
+ return [get_llamaindex_tool(tool) for tool in tools.get_tools()]
@@ -0,0 +1,4 @@
1
+ """Blaxel OpenAI integration module."""
2
+
3
+ from .model import * # noqa: F403, F401
4
+ from .tools import * # noqa: F403, F401
@@ -1,9 +1,11 @@
1
1
  from agents import AsyncOpenAI, OpenAIChatCompletionsModel
2
2
 
3
- from ..common.settings import settings
3
+ from blaxel.core import bl_model as bl_model_core
4
+ from blaxel.core import settings
4
5
 
5
6
 
6
- async def get_openai_model(url: str, type: str, model: str, **kwargs):
7
+ async def bl_model(name, **kwargs):
8
+ url, type, model = await bl_model_core(name).get_parameters()
7
9
  if type != "openai":
8
10
  raise ValueError(f"Invalid model type: {type}")
9
11
  external_client = AsyncOpenAI(
blaxel/openai/py.typed ADDED
File without changes
@@ -3,7 +3,8 @@ from typing import Any
3
3
 
4
4
  from agents import FunctionTool, RunContextWrapper
5
5
 
6
- from .types import Tool
6
+ from blaxel.core.tools import bl_tools as bl_tools_core
7
+ from blaxel.core.tools.types import Tool
7
8
 
8
9
 
9
10
  def get_openai_tool(tool: Tool) -> FunctionTool:
@@ -21,5 +22,8 @@ def get_openai_tool(tool: Tool) -> FunctionTool:
21
22
  on_invoke_tool=openai_coroutine,
22
23
  )
23
24
 
24
- def get_openai_tools(tools: list[Tool]) -> list[FunctionTool]:
25
- return [get_openai_tool(tool) for tool in tools]
25
+ async def bl_tools(tools_names: list[str], **kwargs) -> list[FunctionTool]:
26
+ tools = bl_tools_core(tools_names, **kwargs)
27
+ await tools.initialize()
28
+ return [get_openai_tool(tool) for tool in tools.get_tools()]
29
+ return [get_openai_tool(tool) for tool in tools.get_tools()]
@@ -0,0 +1,4 @@
1
+ """Blaxel Pydantic AI integration module."""
2
+
3
+ from .model import * # noqa: F403, F401
4
+ from .tools import * # noqa: F403, F401
@@ -1,4 +1,3 @@
1
-
2
1
  import httpx
3
2
  from httpx import AsyncClient
4
3
  from pydantic_ai.providers import Provider
@@ -14,13 +14,15 @@ from pydantic_ai.providers.cohere import CohereProvider
14
14
  from pydantic_ai.providers.mistral import MistralProvider
15
15
  from pydantic_ai.providers.openai import OpenAIProvider
16
16
 
17
- from blaxel.common.settings import settings
17
+ from blaxel.core import bl_model as bl_model_core
18
+ from blaxel.core import settings
19
+ from blaxel.core.client import client
18
20
 
19
- from ..client import client
20
- from .custom.pydantic.gemini import GoogleGLAProvider
21
+ from .custom.gemini import GoogleGLAProvider
21
22
 
22
23
  logger = logging.getLogger(__name__)
23
- async def get_pydantic_model(url: str,type: str, model: str, **kwargs) -> Model:
24
+ async def bl_model(name: str, **kwargs) -> Model:
25
+ url, type, model = await bl_model_core(name).get_parameters()
24
26
  if type == 'mistral':
25
27
  return MistralModel(
26
28
  model_name=model,
File without changes
@@ -2,7 +2,8 @@ from pydantic_ai import RunContext
2
2
  from pydantic_ai.tools import Tool as PydanticTool
3
3
  from pydantic_ai.tools import ToolDefinition
4
4
 
5
- from .types import Tool
5
+ from blaxel.core.tools import Tool
6
+ from blaxel.core.tools import bl_tools as bl_tools_core
6
7
 
7
8
 
8
9
  def get_pydantic_tool(tool: Tool) -> PydanticTool:
@@ -44,5 +45,7 @@ def get_pydantic_tool(tool: Tool) -> PydanticTool:
44
45
  )
45
46
 
46
47
 
47
- def get_pydantic_tools(tools: list[Tool]) -> list[PydanticTool]:
48
- return [get_pydantic_tool(tool) for tool in tools]
48
+ async def bl_tools(tools_names: list[str], **kwargs) -> list[PydanticTool]:
49
+ tools = bl_tools_core(tools_names, **kwargs)
50
+ await tools.initialize()
51
+ return [get_pydantic_tool(tool) for tool in tools.get_tools()]
@@ -0,0 +1,6 @@
1
+ """Blaxel telemetry module."""
2
+
3
+ from .exporters import * # noqa: F403, F401
4
+ from .instrumentation import * # noqa: F403, F401
5
+ from .log import * # noqa: F403, F401
6
+ from .manager import * # noqa: F403, F401
@@ -0,0 +1,125 @@
1
+ import json
2
+ import logging
3
+
4
+ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
5
+ from opentelemetry.trace import Tracer, get_tracer
6
+
7
+ import blaxel.core.agents
8
+ import blaxel.core.jobs
9
+ from blaxel.telemetry.span import SpanManager
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class BlaxelCoreInstrumentor(BaseInstrumentor):
15
+ def instrumentation_dependencies(self):
16
+ return []
17
+
18
+ def _instrument(self, **kwargs):
19
+ tracer_provider = kwargs.get("tracer_provider")
20
+ tracer = get_tracer(__name__, "0.2.0", tracer_provider)
21
+ self._patch_agent(tracer)
22
+ self._patch_job(tracer)
23
+ self._patch_tools(tracer)
24
+
25
+ def _uninstrument(self, **kwargs):
26
+ # Optionally restore original methods
27
+ pass
28
+
29
+ def _patch_agent(self, tracer: Tracer):
30
+ orig_run = blaxel.core.agents.BlAgent.run
31
+
32
+ def traced_run(self, *args, **kwargs):
33
+ attributes = {
34
+ "agent.name": self.name,
35
+ "agent.args": str(args),
36
+ "span.type": "agent.run",
37
+ **SpanManager.get_default_attributes(),
38
+ }
39
+ with tracer.start_span(self.name, attributes=attributes) as span:
40
+ try:
41
+ result = orig_run(self, *args, **kwargs)
42
+ span.set_attribute("agent.run.result", result)
43
+ return result
44
+ except Exception as e:
45
+ span.set_attribute("agent.run.error", str(e))
46
+ raise
47
+
48
+ blaxel.core.agents.BlAgent.run = traced_run
49
+
50
+ def _patch_job(self, tracer: Tracer):
51
+ orig_run = blaxel.core.jobs.BlJob.run
52
+
53
+ def traced_run(self, *args, **kwargs):
54
+ attributes = {
55
+ "job.name": self.name,
56
+ "span.type": "job.run",
57
+ **SpanManager.get_default_attributes(),
58
+ }
59
+ with tracer.start_span(self.name, attributes=attributes) as span:
60
+ try:
61
+ result = orig_run(self, *args, **kwargs)
62
+ span.set_attribute("job.run.result", result)
63
+ return result
64
+ except Exception as e:
65
+ span.set_attribute("job.run.error", str(e))
66
+ raise
67
+
68
+ blaxel.core.jobs.BlJob.run = traced_run
69
+
70
+ def _patch_tools(self, tracer: Tracer):
71
+ # Patch PersistentWebSocket.list_tools
72
+ orig_list_tools = blaxel.core.tools.PersistentWebSocket.list_tools
73
+
74
+ async def traced_list_tools(self, *args, **kwargs):
75
+ span_attributes = {
76
+ "tool.server": self.url,
77
+ "tool.server_name": self.name,
78
+ "span.type": "tool.list",
79
+ **SpanManager.get_default_attributes(),
80
+ }
81
+ with tracer.start_span(self.name, attributes=span_attributes):
82
+ result = await orig_list_tools(self, *args, **kwargs)
83
+ # Optionally: span.set_attribute("tool.list.result", str(result))
84
+ return result
85
+
86
+ blaxel.core.tools.PersistentWebSocket.list_tools = traced_list_tools
87
+
88
+ # Patch convert_mcp_tool_to_blaxel_tool to wrap tool calls
89
+ orig_convert = blaxel.core.tools.convert_mcp_tool_to_blaxel_tool
90
+
91
+ def traced_convert_mcp_tool_to_blaxel_tool(websocket_client, name, url, tool):
92
+ Tool = orig_convert(websocket_client, name, url, tool)
93
+ orig_coroutine = Tool.coroutine
94
+ orig_sync_coroutine = Tool.sync_coroutine
95
+
96
+ async def traced_coroutine(*args, **kwargs):
97
+ span_attributes = {
98
+ "tool.name": tool.name,
99
+ "tool.args": json.dumps(kwargs),
100
+ "tool.server": url,
101
+ "tool.server_name": name,
102
+ "span.type": "tool.call",
103
+ **SpanManager.get_default_attributes(),
104
+ }
105
+ logger.info(span_attributes)
106
+ with tracer.start_span("blaxel-tool-call", attributes=span_attributes):
107
+ return await orig_coroutine(*args, **kwargs)
108
+
109
+ def traced_sync_coroutine(*args, **kwargs):
110
+ span_attributes = {
111
+ "tool.name": tool.name,
112
+ "tool.args": json.dumps(kwargs),
113
+ "tool.server": url,
114
+ "tool.server_name": name,
115
+ "span.type": "tool.call",
116
+ **SpanManager.get_default_attributes(),
117
+ }
118
+ with tracer.start_span("blaxel-tool-call", attributes=span_attributes):
119
+ return orig_sync_coroutine(*args, **kwargs)
120
+
121
+ Tool.coroutine = traced_coroutine
122
+ Tool.sync_coroutine = traced_sync_coroutine
123
+ return Tool
124
+
125
+ blaxel.core.tools.convert_mcp_tool_to_blaxel_tool = traced_convert_mcp_tool_to_blaxel_tool
@@ -0,0 +1,99 @@
1
+ import logging
2
+
3
+ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
4
+ from opentelemetry.trace import Tracer, get_tracer
5
+ from wrapt import wrap_function_wrapper
6
+
7
+ from blaxel.telemetry.span import SpanManager
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class BlaxelLanggraphInstrumentor(BaseInstrumentor):
13
+ def instrumentation_dependencies(self):
14
+ return ["langgraph"]
15
+
16
+ def _instrument(self, **kwargs):
17
+ tracer_provider = kwargs.get("tracer_provider")
18
+ tracer = get_tracer(__name__, "0.2.0", tracer_provider)
19
+ # self._patch_gemini(tracer)
20
+ self._patch_tool(tracer)
21
+
22
+ def _uninstrument(self, **kwargs):
23
+ import blaxel.langgraph.custom.gemini
24
+
25
+ # Restore original methods
26
+ if hasattr(
27
+ blaxel.langgraph.custom.gemini.GeminiRestClient, "_blaxel_original_generate_content"
28
+ ):
29
+ blaxel.langgraph.custom.gemini.GeminiRestClient.generate_content = (
30
+ blaxel.langgraph.custom.gemini.GeminiRestClient._blaxel_original_generate_content
31
+ )
32
+ delattr(
33
+ blaxel.langgraph.custom.gemini.GeminiRestClient, "_blaxel_original_generate_content"
34
+ )
35
+
36
+ if hasattr(
37
+ blaxel.langgraph.custom.gemini.GeminiRestClient,
38
+ "_blaxel_original_generate_content_async",
39
+ ):
40
+ blaxel.langgraph.custom.gemini.GeminiRestClient.generate_content_async = blaxel.langgraph.custom.gemini.GeminiRestClient._blaxel_original_generate_content_async
41
+ delattr(
42
+ blaxel.langgraph.custom.gemini.GeminiRestClient,
43
+ "_blaxel_original_generate_content_async",
44
+ )
45
+
46
+ if hasattr(
47
+ blaxel.langgraph.custom.gemini.GeminiRestClient,
48
+ "_blaxel_original_stream_generate_content",
49
+ ):
50
+ blaxel.langgraph.custom.gemini.GeminiRestClient.stream_generate_content = blaxel.langgraph.custom.gemini.GeminiRestClient._blaxel_original_stream_generate_content
51
+ delattr(
52
+ blaxel.langgraph.custom.gemini.GeminiRestClient,
53
+ "_blaxel_original_stream_generate_content",
54
+ )
55
+
56
+ if hasattr(
57
+ blaxel.langgraph.custom.gemini.GeminiRestClient,
58
+ "_blaxel_original_stream_generate_content_async",
59
+ ):
60
+ blaxel.langgraph.custom.gemini.GeminiRestClient.stream_generate_content_async = blaxel.langgraph.custom.gemini.GeminiRestClient._blaxel_original_stream_generate_content_async
61
+ delattr(
62
+ blaxel.langgraph.custom.gemini.GeminiRestClient,
63
+ "_blaxel_original_stream_generate_content_async",
64
+ )
65
+
66
+ def _patch_tool(self, tracer: Tracer):
67
+ def _traced_run(original, instance, args, kwargs):
68
+ attributes = {
69
+ "tool.type": "langgraph",
70
+ "span.type": "tool.call",
71
+ **SpanManager.get_default_attributes(),
72
+ }
73
+ with tracer.start_span("langgraph.tool", attributes=attributes) as span:
74
+ try:
75
+ result = original(*args, **kwargs)
76
+ span.set_attribute("tool.name", result.name)
77
+ return result
78
+ except Exception as e:
79
+ span.set_attribute("tool.error", str(e))
80
+ raise
81
+
82
+ async def _traced_arun(original, instance, args, kwargs):
83
+ attributes = {
84
+ "tool.type": "langgraph",
85
+ "span.type": "tool.call",
86
+ **SpanManager.get_default_attributes(),
87
+ }
88
+ with tracer.start_span("langgraph.tool", attributes=attributes) as span:
89
+ try:
90
+ result = await original(*args, **kwargs)
91
+ span.set_attribute("tool.name", result.name)
92
+ return result
93
+ except Exception as e:
94
+ span.set_attribute("tool.error", str(e))
95
+ raise
96
+
97
+ wrap_function_wrapper("langchain_core.tools", "BaseTool.run", _traced_run)
98
+ wrap_function_wrapper("langchain_core.tools", "BaseTool.arun", _traced_arun)
99
+ wrap_function_wrapper("langchain_core.tools", "BaseTool.arun", _traced_arun)