experiments/arena/pages/history.py (133 lines of code) (raw):
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
""" History page"""
import mesop as me
from common.metadata import get_latest_votes
from components.header import header
from components.dialog import dialog
from components.page_scaffold import (
page_scaffold,
page_frame,
)
@me.stateclass
class PageState:
is_open: bool = False
image_url: str = ""
def history_page_content(app_state: me.state):
"""History Mesop Page"""
with page_scaffold(): # pylint: disable=not-context-manager
with page_frame(): # pylint: disable=not-context-manager
page_state = me.state(PageState)
header("History", "history")
votes = get_latest_votes(app_state.study)
print(f"retrieved {len(votes)} votes")
with dialog( # pylint: disable=not-context-manager
is_open=page_state.is_open,
on_click_background=on_click_background_close,
):
me.image(src=page_state.image_url)
with me.box(
style=me.Style(
display="flex",
flex_direction="column",
align_items="center",
width="90hv",
)
):
for v in votes:
model1 = v.get("model1")
image1 = v.get("image1")
model2 = v.get("model2")
image2 = v.get("image2")
winner = v.get("winner")
timestamp = v.get("timestamp").strftime("%Y-%m-%d %H:%M")
prompt = v.get("prompt")
with me.box(
style=me.Style(
padding=me.Padding.all(10),
display="flex",
flex_direction="column",
align_items="center",
width="50%",
gap=10,
)
):
# images
image1_url = gcs_to_http(image1)
image2_url = gcs_to_http(image2)
with me.box(
style=me.Style(
display="flex",
flex_direction="column",
gap=10,
align_items="center"
),
):
with me.box(
style=me.Style(
flex_direction="row",
display="flex",
align_items="center",
padding=me.Padding(bottom=40, top=45)
),
):
with me.content_button(
key=image1_url,
on_click=on_click_image_dialog,
style=me.Style(
flex_direction="column",
display="flex",
align_items="center",
),
):
me.image(
src=image1_url,
style=(
WINNER_THUMBNAIL_STYLE if winner == model1 else THUMBNAIL_STYLE
),
)
me.text(
model1,
style=me.Style(font_size="10pt", color="black"),
)
with me.content_button(
key=image2_url,
on_click=on_click_image_dialog,
style=me.Style(
flex_direction="column",
display="flex",
align_items="center",
),
):
me.image(
src=image2_url,
style=(
WINNER_THUMBNAIL_STYLE if winner == model2 else THUMBNAIL_STYLE
),
)
me.text(
model2,
style=me.Style(font_size="10pt", color="black"),
)
me.html(
html=f"{timestamp}: {model1} vs. {model2}: <strong>{winner}</strong> won."
)
me.html(html=f'With prompt: "<em>{prompt}</em>"')
def on_click_image_dialog(e: me.ClickEvent):
"""show larger image"""
page_state = me.state(PageState)
page_state.image_url = e.key
page_state.is_open = True
def on_click_background_close(e: me.ClickEvent):
"""implementation dialog component's close event """
page_state = me.state(PageState)
page_state.is_open = False
def gcs_to_http(gcs_uri: str) -> str:
"""replaces gcsuri with http uri"""
return gcs_uri.replace(
"gs://",
#"https://storage.mtls.cloud.google.com/", # secure
"https://storage.googleapis.com/" # public
)
WINNER_THUMBNAIL_STYLE = me.Style(
height="100px",
margin=me.Margin(top=10),
border_radius="18px",
border=me.Border().all(me.BorderSide(color="green", style="inset", width="5px")),
)
THUMBNAIL_STYLE = me.Style(
height="100px",
margin=me.Margin(top=10),
border_radius="18px",
)