Spaces:
Running
Running
| import itertools | |
| import os | |
| import sys | |
| import urllib.parse | |
| from dataclasses import dataclass, field | |
| import mesop as me | |
| # Get the directory from the environment variable | |
| EVAL_DIR = os.environ.get("EVAL_DIR") | |
| if EVAL_DIR: | |
| print(f"Directory set to: {EVAL_DIR}") | |
| else: | |
| print( | |
| "No directory specified. Exiting! Set the EVAL_DIR environment variable." | |
| ) | |
| sys.exit(1) | |
| EVAL_DIR_2 = os.environ.get("EVAL_DIR_2") | |
| if EVAL_DIR_2: | |
| print(f"Eval directory 2 set to: {EVAL_DIR_2}") | |
| class Item: | |
| query: str = "" | |
| input: str = "" | |
| output: str = "" | |
| class EvalGroup: | |
| items: list[Item] = field(default_factory=list) | |
| class State: | |
| directories: list[str] | |
| group_1: EvalGroup | |
| group_2: EvalGroup | |
| def load_eval_dir(eval_dir: str): | |
| # Read all directories from args.dir | |
| directories = [ | |
| d for d in os.listdir(eval_dir) if os.path.isdir(os.path.join(eval_dir, d)) | |
| ] | |
| items: list[Item] = [] | |
| for dir in directories: | |
| input_path = os.path.join(eval_dir, dir, "input.txt") | |
| output_path = os.path.join(eval_dir, dir, "output.txt") | |
| with open(input_path) as f: | |
| input_content = f.read() | |
| with open(output_path) as f: | |
| output_content = f.read() | |
| item = Item( | |
| input=input_content, | |
| output=output_content, | |
| query=urllib.parse.unquote(dir), | |
| ) | |
| items.append(item) | |
| return items | |
| def on_load(e: me.LoadEvent): | |
| state = me.state(State) | |
| assert EVAL_DIR | |
| state.group_1.items = load_eval_dir(EVAL_DIR) | |
| if EVAL_DIR_2: | |
| state.group_2.items = load_eval_dir(EVAL_DIR_2) | |
| print("state.group_2.items", state.group_2.items) | |
| # Store the directories in the state for later use | |
| # me.state(State).directories = directories | |
| def index(): | |
| state = me.state(State) | |
| with scrollable(): | |
| with me.box( | |
| style=me.Style( | |
| margin=me.Margin.symmetric(horizontal="auto", vertical=24), | |
| # background="white", | |
| padding=me.Padding.symmetric(horizontal=16), | |
| ) | |
| ): | |
| me.text("Eval viewer", type="headline-3") | |
| me.text(f"Group 1: {len(state.group_1.items)} items") | |
| me.text(f"Group 2: {len(state.group_2.items)} items") | |
| # Zip group_1 and group_2 items | |
| zipped_items = list( | |
| itertools.zip_longest( | |
| state.group_1.items, state.group_2.items, fillvalue=None | |
| ) | |
| ) | |
| with me.box( | |
| style=me.Style( | |
| display="grid", | |
| grid_template_columns="160px 300px 1fr 300px 1fr" | |
| if state.group_2.items | |
| else "160px 1fr 1fr", | |
| gap=16, | |
| ) | |
| ): | |
| # Header | |
| me.text("Query", style=me.Style(font_weight=500)) | |
| me.text("Input (1)", style=me.Style(font_weight=500)) | |
| me.text("Output (1)", style=me.Style(font_weight=500)) | |
| if state.group_2.items: | |
| me.text("Input (2)", style=me.Style(font_weight=500)) | |
| me.text("Output (2)", style=me.Style(font_weight=500)) | |
| # Body | |
| for item_1, item_2 in zipped_items: | |
| if item_1: | |
| me.text(item_1.query, style=me.Style(font_weight=500)) | |
| me.markdown( | |
| item_1.input, style=me.Style(overflow_y="auto", max_height=400) | |
| ) | |
| me.text(item_1.output) | |
| if item_2: | |
| me.markdown( | |
| item_2.input, style=me.Style(overflow_y="auto", max_height=400) | |
| ) | |
| me.text(item_2.output) | |
| def scrollable( | |
| *, | |
| key: str | None = None, | |
| ): | |
| return me.insert_web_component( | |
| name="scrollable-component", | |
| key=key, | |
| ) | |