{"id":8078,"date":"2023-11-02T09:44:58","date_gmt":"2023-11-02T17:44:58","guid":{"rendered":"https:\/\/live-cometml.pantheonsite.io\/?p=8078"},"modified":"2025-04-24T17:04:52","modified_gmt":"2025-04-24T17:04:52","slug":"how-to-build-a-customized-panel-in-comet","status":"publish","type":"post","link":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet\/","title":{"rendered":"How to Build a Customized Panel in Comet"},"content":{"rendered":"\n<div class=\"fl fm fn fo fp\">\n<div class=\"ab ca\">\n<div class=\"ch bg ex ey ez fa\">\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*k7Vajg2dWqy15-S1\" alt=\"\" width=\"700\" height=\"467\"><\/figure><div class=\"mq mr ms\"><picture><\/picture><\/div>\n<\/div><figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Photo by <a class=\"af nk\" href=\"https:\/\/unsplash.com\/@mrthetrain?utm_source=medium&amp;utm_medium=referral\" target=\"_blank\" rel=\"noopener ugc nofollow\">Joshua Hoehne<\/a> on <a class=\"af nk\" href=\"https:\/\/unsplash.com\/?utm_source=medium&amp;utm_medium=referral\" target=\"_blank\" rel=\"noopener ugc nofollow\">Unsplash<\/a><\/figcaption><\/figure>\n<p data-selectable-paragraph=\"\">\n<\/p><p id=\"6ea7\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Recently I have discovered a very interesting feature provided by <a class=\"af nk\" href=\"https:\/\/www.comet.com\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Comet<\/a>: <strong class=\"be og\">customized Panels<\/strong>. A Panel is a visual display that shows some results as tables or graphs. Results may include performance metrics, dataset statistics, or simply generic data.<\/p>\n<p id=\"cda2\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Comet provides a dashboard to build generic Panels. In addition, it provides an SDK that permits the creation of custom Panels either in Python or Javascript. In this article, I describe how to build a custom Panel in Comet.<\/p>\n<h2 id=\"6518\" class=\"oh oi fs be oj ok ol gx om on oo ha op oq or os ot ou ov ow ox oy oz pa pb pc bj\">The Concept of Panels in Comet<\/h2>\n<p id=\"615e\" class=\"pw-post-body-paragraph nl nm fs be b gv pd no np gy pe nr ns nt pf nv nw nx pg nz oa ob ph od oe of fl bj\" data-selectable-paragraph=\"\">Comet is an experimentation platform that provides users with tools and features to track and monitor machine learning experiments. To summarize the results of the experiments, Comet provides a feature called Panels. You can build as many Panels as you want.<\/p>\n<p id=\"687a\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">A Panel is not necessarily linked to a specific experiment; rather, it can show results across the different experiments.<\/p>\n<p id=\"b07c\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">To create a new Panel, after one or more experiments run, you can simply click on the \u2018Add\u2019 button at the top right corner of your dashboard and click \u2018New Panel.\u2019 Then you can choose one of the built-in or featured Panels, as shown in the following figure:<\/p>\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*z-AGSEJLAhv_1zWYL-zXaQ.png\" alt=\"\" width=\"700\" height=\"290\"><\/figure><div class=\"mq mr pi\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*z-AGSEJLAhv_1zWYL-zXaQ.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Image by Author<\/figcaption>\n<\/figure>\n<p id=\"e64e\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The following figure shows an example of a Panel in Comet:<\/p>\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg\" alt=\"\" width=\"700\" height=\"350\"><\/figure><div class=\"mq mr pj\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*BKWcX76iOJB-Jlyo96hSXQ.jpeg 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Image by Author<\/figcaption>\n<\/figure>\n<h2 id=\"7442\" class=\"oh oi fs be oj ok ol gx om on oo ha op oq or os ot ou ov ow ox oy oz pa pb pc bj\">Custom Panels<\/h2>\n<p id=\"3d70\" class=\"pw-post-body-paragraph nl nm fs be b gv pd no np gy pe nr ns nt pf nv nw nx pg nz oa ob ph od oe of fl bj\" data-selectable-paragraph=\"\">Comet provides a Python\/Javascript SDK that permits the creation of custom Panels. At the moment, you can create custom Panels only from the online GUI. To access the GUI, you can click \u2018Add \u2192New Panel\u2019 from the dashboard, and then click on \u2018Create New.\u2019 A new window opens, with an online SDK, as shown in the following figure:<\/p>\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*n6pMBfr9SZachoEWi9VTbw.png\" alt=\"\" width=\"700\" height=\"339\"><\/figure><div class=\"mq mr pk\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*n6pMBfr9SZachoEWi9VTbw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*n6pMBfr9SZachoEWi9VTbw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*n6pMBfr9SZachoEWi9VTbw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*n6pMBfr9SZachoEWi9VTbw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*n6pMBfr9SZachoEWi9VTbw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*n6pMBfr9SZachoEWi9VTbw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*n6pMBfr9SZachoEWi9VTbw.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*n6pMBfr9SZachoEWi9VTbw.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*n6pMBfr9SZachoEWi9VTbw.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*n6pMBfr9SZachoEWi9VTbw.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*n6pMBfr9SZachoEWi9VTbw.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*n6pMBfr9SZachoEWi9VTbw.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*n6pMBfr9SZachoEWi9VTbw.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*n6pMBfr9SZachoEWi9VTbw.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Image by Author<\/figcaption>\n<\/figure>\n<p data-selectable-paragraph=\"\">\n<\/p><p id=\"52db\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The SDK presents an editor on the left where you can write your code and a preview of the result on the right. To see the preview, you should click the run button. In the top part of the SDK, you can select your preferred language (Python or Javascript).<\/p>\n<p id=\"9807\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">A Comet Panel can receive many options as input. You can specify them in the Options tab of the SDK. You can define options as key-value pairs, as follows:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"d8b0\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">{\n \"key1\" : \"value1\",\n \"key2\" : \"value2\",\n ...\n \"keyN\" : \"valueN\"\n}<\/span><\/pre>\n<h2 id=\"b98c\" class=\"pq oi fs be oj pu pv pw om px py pz op nt qa qb qc nx qd qe qf ob qg qh qi fy bj\" data-selectable-paragraph=\"\">Custom Panels in Python<\/h2>\n<p id=\"5c14\" class=\"pw-post-body-paragraph nl nm fs be b gv pd no np gy pe nr ns nt pf nv nw nx pg nz oa ob ph od oe of fl bj\" data-selectable-paragraph=\"\">Comet defines the <code class=\"cw qj qk ql pm b\">ui<\/code> subpackage to customize your Panel. Before using it, you must import it as follows:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"4a82\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">from comet_ml import ui<\/span><\/pre>\n<p id=\"706f\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The <code class=\"cw qj qk ql pm b\">ui<\/code> subpackage defines the following methods:<\/p>\n<ul class=\"\">\n<li id=\"e086\" class=\"nl nm fs be b gv nn no np gy nq nr ns nt qm nv nw nx qn nz oa ob qo od oe of qp qq qr bj\" data-selectable-paragraph=\"\"><code class=\"cw qj qk ql pm b\">ui.display()<\/code><\/li>\n<li id=\"d96d\" class=\"nl nm fs be b gv qs no np gy qt nr ns nt qu nv nw nx qv nz oa ob qw od oe of qp qq qr bj\" data-selectable-paragraph=\"\"><code class=\"cw qj qk ql pm b\">ui.display_figure()<\/code><\/li>\n<li id=\"8cbe\" class=\"nl nm fs be b gv qs no np gy qt nr ns nt qu nv nw nx qv nz oa ob qw od oe of qp qq qr bj\" data-selectable-paragraph=\"\"><code class=\"cw qj qk ql pm b\">ui.display_image()<\/code><\/li>\n<li id=\"b10a\" class=\"nl nm fs be b gv qs no np gy qt nr ns nt qu nv nw nx qv nz oa ob qw od oe of qp qq qr bj\" data-selectable-paragraph=\"\"><code class=\"cw qj qk ql pm b\">ui.display_text()<\/code><\/li>\n<li id=\"6a8b\" class=\"nl nm fs be b gv qs no np gy qt nr ns nt qu nv nw nx qv nz oa ob qw od oe of qp qq qr bj\" data-selectable-paragraph=\"\"><code class=\"cw qj qk ql pm b\">ui.display_markdown()<\/code><\/li>\n<\/ul>\n<p id=\"d1c1\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The function names are self-explanatory. However, for more information, you can refer to the Comet <a class=\"af nk\" href=\"https:\/\/www.comet.com\/docs\/user-interface\/python-panels\/overview\/#ui\" target=\"_blank\" rel=\"noopener ugc nofollow\">official documentation<\/a>.<\/p>\n<p id=\"e1bb\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Comet panels are integrated with Matplotlib and Plotly graphs, as well as with the PIL Image Library.<\/p>\n<p id=\"e7fa\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">To retrieve input options, you can use the <code class=\"cw qj qk ql pm b\">get_panel_options()<\/code> function provided by the <code class=\"cw qj qk ql pm b\">API()<\/code> class:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"8f3e\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">from comet_ml import API\n\napi = API()\noptions = api.get_panel_options()<\/span><\/pre>\n<h2 id=\"a60b\" class=\"pq oi fs be oj pu pv pw om px py pz op nt qa qb qc nx qd qe qf ob qg qh qi fy bj\" data-selectable-paragraph=\"\">Custom Panels in Javascript<\/h2>\n<p id=\"0671\" class=\"pw-post-body-paragraph nl nm fs be b gv pd no np gy pe nr ns nt pf nv nw nx pg nz oa ob ph od oe of fl bj\" data-selectable-paragraph=\"\">A Javascript Panel should extend the Panel class as follows:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"6817\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">class MyPanel extends Comet.Panel {\n  ...\n}<\/span><\/pre>\n<p id=\"25fd\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The <code class=\"cw qj qk ql pm b\">Comet.Panel<\/code> class defines different methods, as explained in the Comet <a class=\"af nk\" href=\"https:\/\/www.comet.com\/docs\/javascript-sdk\/getting-started\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">official documentation<\/a>. To draw something in your Panel, you can use the <code class=\"cw qj qk ql pm b\">draw()<\/code> method. You can access the input options through the <code class=\"cw qj qk ql pm b\">this.options<\/code>variable.<\/p>\n<p id=\"3ded\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Javascript panels are compatible with the Javascript <a class=\"af nk\" href=\"https:\/\/plotly.com\/javascript\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Plotly<\/a> library.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"fl fm fn fo fp\">\n<div class=\"ab ca\">\n<div class=\"ch bg ex ey ez fa\">\n<blockquote class=\"rf\"><p id=\"aac5\" class=\"rg rh fs be ri rj rk rl rm rn ro of dw\" data-selectable-paragraph=\"\">Want to see more of Comet in action? Check out our <a class=\"af nk\" href=\"https:\/\/www.youtube.com\/watch?v=VNH-Lv8Igtc&amp;list=PLX9GmL8cVn_yFApy5E0QdC7VTqFgxbqmP\" target=\"_blank\" rel=\"noopener ugc nofollow\">Hacker News project on YouTube<\/a>!<\/p><\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"fl fm fn fo fp\">\n<div class=\"ab ca\">\n<div class=\"ch bg ex ey ez fa\">\n<h2 id=\"a1bf\" class=\"oh oi fs be oj ok rp gx om on rq ha op oq rr os ot ou rs ow ox oy rt pa pb pc bj\">A Practical Example<\/h2>\n<p id=\"8b20\" class=\"pw-post-body-paragraph nl nm fs be b gv pd no np gy pe nr ns nt pf nv nw nx pg nz oa ob ph od oe of fl bj\" data-selectable-paragraph=\"\">Let us suppose that you have built your own machine learning model and you have calculated precision, recall, and f1-score. Let us further suppose that you have tracked your metrics in Comet through the <code class=\"cw qj qk ql pm b\">log_metric()<\/code> method of the Experiment class. Finally, you have run different experiments. Now you want to build a custom Panel in Python that shows the values of a given metric across all the experiments.<\/p>\n<p id=\"58ba\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">You open the Python SDK in Comet and begin to write your code. Firstly, you import the needed libraries:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"98d5\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">from comet_ml import API, ui\nimport matplotlib.pyplot as plt<\/span><\/pre>\n<p id=\"de39\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Then, you get all the available metrics through the <code class=\"cw qj qk ql pm b\">get_panel_metrics_names()<\/code>provided by the Comet API:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"123f\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">api = API()\nmetrics = api.get_panel_metrics_names()<\/span><\/pre>\n<p id=\"cf11\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Now, you add a dropdown menu that permits the user to select a metric. You use the <code class=\"cw qj qk ql pm b\">dropdown()<\/code> function provided by the Comet UI:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"a782\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">selected_metric = ui.dropdown('Select a metric:', metrics)<\/span><\/pre>\n<p id=\"b581\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Then, you retrieve all the experiment\u2019s keys and the associated information for the selected metric:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"ca76\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">experiment_keys = api.get_panel_experiment_keys()\nmetrics = api.get_metrics_for_chart(experiment_keys, [selected_metric])<\/span><\/pre>\n<p id=\"807f\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The <code class=\"cw qj qk ql pm b\">metrics<\/code> variable looks like this:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"d9d9\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">{'YOUR EXPERIMENT KEY': {\n   'experimentKey': 'YOUR EXPERIMENT KEY',\n   'steps': None,\n   'epochs': None,\n   'metrics': [{\n      'metricName': 'f1',\n      'values': [0.9444444444444444],\n      'steps': [None],\n      'epochs': [None],\n      'timestamps': [1642501827141],\n      'durations': [0]\n    }],\n    'params': None,\n    'empty': False\n},\n 'ANOTHER EXPERIMENT KEY': {...},\n...\n}<\/span><\/pre>\n<p id=\"455f\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Your objective is to extract the values for the selected metric across all the experiments. Thus, you loop across the metrics variable and then you extract the values. You plot all the metric values as a gray bar, save for a specific experiment where you plot the bar in red:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"fa88\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">fig, ax = plt.subplots()\nfor experiment_key in metrics:\n    for metric in metrics[experiment_key][\"metrics\"]:\n        if experiment_key == 'YOUR SPECIFIC EXPERIMENT':\n            plt.bar(experiment_key, metric['values'], color='red')\n        else:\n            plt.bar(experiment_key, metric['values'], color='gray')<\/span><span id=\"6052\" class=\"pq oi fs pm b ii ru ps l jb pt\" data-selectable-paragraph=\"\">plt.xticks(rotation=90)\nax.spines[\"right\"].set_visible(False)\nax.spines[\"top\"].set_visible(False)<\/span><\/pre>\n<p id=\"8461\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Now, you call the <code class=\"cw qj qk ql pm b\">display()<\/code> function of the Comet <code class=\"cw qj qk ql pm b\">ui<\/code> to draw the graph:<\/p>\n<pre class=\"mt mu mv mw mx pl pm pn po ax pp bj\"><span id=\"acf2\" class=\"pq oi fs pm b ii pr ps l jb pt\" data-selectable-paragraph=\"\">ui.display(plt)<\/span><\/pre>\n<p id=\"e667\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">The following figure shows the final output:<\/p>\n<figure class=\"mt mu mv mw mx my mq mr paragraph-image\">\n<div class=\"mz na ee nb bg nc\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg nd ne c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*tZwnU4bb3dBhG9Mi-qnOkA.png\" alt=\"\" width=\"700\" height=\"271\"><\/figure><div class=\"mq mr rv\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*tZwnU4bb3dBhG9Mi-qnOkA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<figcaption class=\"nf ng nh mq mr ni nj be b bf z dw\" data-selectable-paragraph=\"\">Image by Author<\/figcaption>\n<\/figure>\n<h2 id=\"6f31\" class=\"oh oi fs be oj ok ol gx om on oo ha op oq or os ot ou ov ow ox oy oz pa pb pc bj\">Summary<\/h2>\n<p id=\"fec9\" class=\"pw-post-body-paragraph nl nm fs be b gv pd no np gy pe nr ns nt pf nv nw nx pg nz oa ob ph od oe of fl bj\" data-selectable-paragraph=\"\">Congratulations! You have just built your first custom Panel in Comet! Custom Panels can be personalized as you want, thus you can build incredible visualizations in Comet either in Python or Javascript. You can read more on Comet Panels in the Comet official documentation available at <a class=\"af nk\" href=\"https:\/\/www.comet.com\/docs\/user-interface\/gallery\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">this link<\/a>.<\/p>\n<p id=\"2701\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Comet also can be used for other purposes, including <a class=\"af nk\" href=\"https:\/\/heartbeat.comet.ml\/hyperparameter-tuning-in-comet-e7aa637f124c\" target=\"_blank\" rel=\"noopener ugc nofollow\">hyperparameter tuning<\/a>, <a class=\"af nk\" href=\"https:\/\/heartbeat.comet.ml\/monitoring-spark-nlp-pipelines-in-comet-474b785892b3\" target=\"_blank\" rel=\"noopener ugc nofollow\">Natural Language Processing<\/a>, and much more.<\/p>\n<p id=\"413b\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">And now you just have to try <a class=\"af nk\" href=\"https:\/\/www.comet.com\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">Comet<\/a>!<\/p>\n<p id=\"dcf9\" class=\"pw-post-body-paragraph nl nm fs be b gv nn no np gy nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of fl bj\" data-selectable-paragraph=\"\">Happy coding, happy Comet!<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Photo by Joshua Hoehne on Unsplash Recently I have discovered a very interesting feature provided by Comet: customized Panels. A Panel is a visual display that shows some results as tables or graphs. Results may include performance metrics, dataset statistics, or simply generic data. Comet provides a dashboard to build generic Panels. In addition, it [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"customer_name":"","customer_description":"","customer_industry":"","customer_technologies":"","customer_logo":"","footnotes":""},"categories":[9,7],"tags":[],"coauthors":[132],"class_list":["post-8078","post","type-post","status-publish","format-standard","hentry","category-product","category-tutorials"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Build a Customized Panel in Comet<\/title>\n<meta name=\"description\" content=\"Learn how to build a Comet Panel. They can be personalized and you can build incredible visualizations in Comet in Python or Javascript.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Build a Customized Panel in Comet\" \/>\n<meta property=\"og:description\" content=\"Learn how to build a Comet Panel. They can be personalized and you can build incredible visualizations in Comet in Python or Javascript.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet\" \/>\n<meta property=\"og:site_name\" content=\"Comet\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cometdotml\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-02T17:44:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-24T17:04:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*k7Vajg2dWqy15-S1\" \/>\n<meta name=\"author\" content=\"Angelica Lo Duca\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Cometml\" \/>\n<meta name=\"twitter:site\" content=\"@Cometml\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Angelica Lo Duca\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Build a Customized Panel in Comet","description":"Learn how to build a Comet Panel. They can be personalized and you can build incredible visualizations in Comet in Python or Javascript.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet","og_locale":"en_US","og_type":"article","og_title":"How to Build a Customized Panel in Comet","og_description":"Learn how to build a Comet Panel. They can be personalized and you can build incredible visualizations in Comet in Python or Javascript.","og_url":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet","og_site_name":"Comet","article_publisher":"https:\/\/www.facebook.com\/cometdotml","article_published_time":"2023-11-02T17:44:58+00:00","article_modified_time":"2025-04-24T17:04:52+00:00","og_image":[{"url":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*k7Vajg2dWqy15-S1","type":"","width":"","height":""}],"author":"Angelica Lo Duca","twitter_card":"summary_large_image","twitter_creator":"@Cometml","twitter_site":"@Cometml","twitter_misc":{"Written by":"Angelica Lo Duca","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet#article","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet\/"},"author":{"name":"Team Comet Digital","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/6266601170c60a7a82b3e0043fbe8ddf"},"headline":"How to Build a Customized Panel in Comet","datePublished":"2023-11-02T17:44:58+00:00","dateModified":"2025-04-24T17:04:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet\/"},"wordCount":807,"publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*k7Vajg2dWqy15-S1","articleSection":["Product","Tutorials"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet\/","url":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet","name":"How to Build a Customized Panel in Comet","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet#primaryimage"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*k7Vajg2dWqy15-S1","datePublished":"2023-11-02T17:44:58+00:00","dateModified":"2025-04-24T17:04:52+00:00","description":"Learn how to build a Comet Panel. They can be personalized and you can build incredible visualizations in Comet in Python or Javascript.","breadcrumb":{"@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet#primaryimage","url":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*k7Vajg2dWqy15-S1","contentUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/0*k7Vajg2dWqy15-S1"},{"@type":"BreadcrumbList","@id":"https:\/\/www.comet.com\/site\/blog\/how-to-build-a-customized-panel-in-comet#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.comet.com\/site\/"},{"@type":"ListItem","position":2,"name":"How to Build a Customized Panel in Comet"}]},{"@type":"WebSite","@id":"https:\/\/www.comet.com\/site\/#website","url":"https:\/\/www.comet.com\/site\/","name":"Comet","description":"Build Better Models Faster","publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.comet.com\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.comet.com\/site\/#organization","name":"Comet ML, Inc.","alternateName":"Comet","url":"https:\/\/www.comet.com\/site\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","width":310,"height":310,"caption":"Comet ML, Inc."},"image":{"@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cometdotml","https:\/\/x.com\/Cometml","https:\/\/www.youtube.com\/channel\/UCmN63HKvfXSCS-UwVwmK8Hw"]},{"@type":"Person","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/6266601170c60a7a82b3e0043fbe8ddf","name":"Team Comet Digital","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/image\/4f0c0a8cc7c0e87c636ff6a420a6647c","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2023\/08\/Screen-Shot-2023-08-12-at-8.58.50-AM-96x96.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2023\/08\/Screen-Shot-2023-08-12-at-8.58.50-AM-96x96.png","caption":"Team Comet Digital"},"sameAs":["https:\/\/www.comet.ml\/"],"url":"https:\/\/www.comet.com\/site\/blog\/author\/teamcometdigital\/"}]}},"_links":{"self":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8078","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/comments?post=8078"}],"version-history":[{"count":1,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8078\/revisions"}],"predecessor-version":[{"id":15470,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8078\/revisions\/15470"}],"wp:attachment":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media?parent=8078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/categories?post=8078"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/tags?post=8078"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/coauthors?post=8078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}