From f6e3fbbc6203a21a167f7e912e452fe13d505637 Mon Sep 17 00:00:00 2001 From: Thibault Pelletier Date: Tue, 9 Jun 2026 16:24:55 +0200 Subject: [PATCH] feat(google-colab): add support for google colab iframe --- trame_client/ui/core.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/trame_client/ui/core.py b/trame_client/ui/core.py index 1fd2161..dd00fba 100644 --- a/trame_client/ui/core.py +++ b/trame_client/ui/core.py @@ -118,13 +118,35 @@ def iframe_url_builder_jupyter_hub_host(layout): } +def iframe_url_builder_google_colab(layout): + from google.colab.output import eval_js + + server = layout.server + url_base = eval_js(f"google.colab.kernel.proxyPort({server.port})") + if url_base.endswith("/"): + url_base = url_base[:-1] + + src = f"{url_base}/index.html?ui={layout.template_name}&reconnect=auto" + elem_id = f"{server.name}_{layout._template_name}" + + return { + "id": elem_id, + "src": src, + "style": layout.iframe_style, + **layout.iframe_attrs, + } + + def get_iframe_builder(name="default"): if isinstance(name, Callable): return name # Try to detect JupyterHub automatically - if name == "default" and "JUPYTERHUB_SERVICE_PREFIX" in os.environ: - name = "jupyter-hub" + if name == "default": + if "JUPYTERHUB_SERVICE_PREFIX" in os.environ: + name = "jupyter-hub" + if "COLAB_RELEASE_TAG" in os.environ or "COLAB_BACKEND_VERSION" in os.environ: + name = "google-colab" builder_type = os.environ.get("TRAME_IFRAME_BUILDER", name) builder = iframe_url_builder_default @@ -135,6 +157,8 @@ def get_iframe_builder(name="default"): builder = iframe_url_builder_jupyter_extension elif builder_type == "jupyter-hub": builder = iframe_url_builder_jupyter_hub + elif builder_type == "google-colab": + builder = iframe_url_builder_google_colab elif builder_type == "jupyter-hub-host": builder = iframe_url_builder_jupyter_hub_host