diff --git a/tensorboard/notebook.py b/tensorboard/notebook.py index 8e6e024901..b4c09d4558 100644 --- a/tensorboard/notebook.py +++ b/tensorboard/notebook.py @@ -345,7 +345,8 @@ def _display_colab(port, height, display_handle): shell = """ (async () => { - const url = await google.colab.kernel.proxyPort(%PORT%, {"cache": true}); + const url = new URL(await google.colab.kernel.proxyPort(%PORT%, {'cache': true})); + url.searchParams.set('tensorboardColab', 'true'); const iframe = document.createElement('iframe'); iframe.src = url; iframe.setAttribute('width', '100%'); diff --git a/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.ts b/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.ts index 4e88141549..dab3471429 100644 --- a/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.ts +++ b/tensorboard/plugins/scalar/tf_scalar_dashboard/tf-scalar-card.ts @@ -264,6 +264,40 @@ export class TfScalarCard extends PolymerElement { items, onLoad, onFinish + ) => { + const inColab = + new URLSearchParams(window.location.search).get('tensorboardColab') === + 'true'; + if (inColab) { + // Google-internal Colab doesn't support HTTP POST requests, so we fall + // back to HTTP GET (even though public Colab supports POST). + return this._requestDataGet(items, onLoad, onFinish); + } else { + return this._requestDataPost(items, onLoad, onFinish); + } + }; + + _requestDataGet: RequestDataCallback = ( + items, + onLoad, + onFinish + ) => { + const router = getRouter(); + const baseUrl = router.pluginRoute('scalars', '/scalars'); + Promise.all( + items.map((item) => { + const url = addParams(baseUrl, {tag: item.tag, run: item.run}); + return this.requestManager + .request(url) + .then((data) => void onLoad({item, data})); + }) + ).finally(() => void onFinish()); + }; + + _requestDataPost: RequestDataCallback = ( + items, + onLoad, + onFinish ) => { const router = getRouter(); const url = router.pluginRoute('scalars', '/scalars_multirun');