IgorSlinko commited on
Commit
d9831c7
Β·
1 Parent(s): 00808db

Move routing charts to end + add Indexes/Percentages toggle

Browse files

- Move routing_plots_row to the end (after Tokens/Cost per Trajectory)
- Add Radio button for 'Replace part of trajectory': Indexes vs Percentages
- Indexes mode: start/end are step numbers (0-based)
- Percentages mode: start/end are percentages (0-100)
- Default: Percentages with start=0, end=50

Files changed (1) hide show
  1. app.py +47 -25
app.py CHANGED
@@ -29,19 +29,22 @@ _calculated_tokens_cache = {}
29
  _trajectory_steps_cache = {}
30
 
31
 
32
- def parse_step_or_ratio(value: float, total_steps: int) -> int:
33
  """
34
- Parse a value as either step number or ratio.
35
 
36
- If value is integer (e.g., 3.0, 5.0) -> treat as step number
37
- If value is float with decimal (e.g., 0.5, 0.25) -> treat as ratio of total_steps
 
 
 
38
 
39
- Returns: step index (0-based)
40
  """
41
- if value == int(value) and value >= 1:
42
- return int(value)
43
  else:
44
- return int(value * total_steps)
45
 
46
 
47
  def get_routed_steps(total_steps: int, strategy: str, params: dict) -> set:
@@ -66,8 +69,8 @@ def get_routed_steps(total_steps: int, strategy: str, params: dict) -> set:
66
  routed = set(range(0, total_steps, k))
67
 
68
  elif strategy == "Replace part of trajectory":
69
- start = parse_step_or_ratio(params.get("start", 0), total_steps)
70
- end = parse_step_or_ratio(params.get("end", 0.5), total_steps)
71
  routed = set(range(start, min(end, total_steps)))
72
 
73
  return routed
@@ -1221,14 +1224,14 @@ def build_app():
1221
  plot_tokens = gr.Plot(label="Token Usage by Type")
1222
  plot_tokens_cost = gr.Plot(label="Cost by Token Type ($)")
1223
 
1224
- with gr.Row(visible=False) as routing_plots_row:
1225
- routing_tokens_plot = gr.Plot(label="Tokens by Type (per Model)")
1226
- routing_cost_plot = gr.Plot(label="Cost by Type (per Model)")
1227
-
1228
  with gr.Row():
1229
  plot_stacked = gr.Plot(label="Tokens per Trajectory")
1230
  plot_cost_breakdown = gr.Plot(label="Cost per Trajectory ($)")
1231
 
 
 
 
 
1232
  with gr.Column(scale=1):
1233
  selected_folder = gr.State("")
1234
  gr.Markdown("### Selected Model")
@@ -1302,9 +1305,15 @@ def build_app():
1302
  random_pct_1 = gr.Number(label="Percentage (%)", value=50, minimum=0, maximum=100, precision=0, interactive=True)
1303
  with gr.Row(visible=False) as every_k_params_1:
1304
  step_k_1 = gr.Number(label="k", value=2, minimum=1, precision=0, interactive=True)
1305
- with gr.Row(visible=False) as part_params_1:
1306
- start_step_1 = gr.Number(label="Start (int=step; 0,0-1,0=ratio)", value=0, minimum=0, precision=2, interactive=True)
1307
- end_step_1 = gr.Number(label="End (int=step; 0,0-1,0=ratio)", value=0.5, minimum=0, precision=2, interactive=True)
 
 
 
 
 
 
1308
 
1309
  add_model_2_btn = gr.Button("+ Add another model", size="sm", visible=False)
1310
 
@@ -1332,9 +1341,15 @@ def build_app():
1332
  random_pct_2 = gr.Number(label="Percentage (%)", value=50, minimum=0, maximum=100, precision=0, interactive=True)
1333
  with gr.Row(visible=False) as every_k_params_2:
1334
  step_k_2 = gr.Number(label="k", value=2, minimum=1, precision=0, interactive=True)
1335
- with gr.Row(visible=False) as part_params_2:
1336
- start_step_2 = gr.Number(label="Start (int=step; 0,0-1,0=ratio)", value=0, minimum=0, precision=2, interactive=True)
1337
- end_step_2 = gr.Number(label="End (int=step; 0,0-1,0=ratio)", value=0.5, minimum=0, precision=2, interactive=True)
 
 
 
 
 
 
1338
 
1339
  add_model_3_btn = gr.Button("+ Add another model", size="sm", visible=False)
1340
 
@@ -1362,9 +1377,15 @@ def build_app():
1362
  random_pct_3 = gr.Number(label="Percentage (%)", value=50, minimum=0, maximum=100, precision=0, interactive=True)
1363
  with gr.Row(visible=False) as every_k_params_3:
1364
  step_k_3 = gr.Number(label="k", value=2, minimum=1, precision=0, interactive=True)
1365
- with gr.Row(visible=False) as part_params_3:
1366
- start_step_3 = gr.Number(label="Start (int=step; 0,0-1,0=ratio)", value=0, minimum=0, precision=2, interactive=True)
1367
- end_step_3 = gr.Number(label="End (int=step; 0,0-1,0=ratio)", value=0.5, minimum=0, precision=2, interactive=True)
 
 
 
 
 
 
1368
 
1369
  gr.Markdown("---")
1370
  route_btn = gr.Button("πŸš€ Let's ROUTE!!", variant="primary", size="lg", interactive=False)
@@ -1500,7 +1521,7 @@ def build_app():
1500
  state_data,
1501
  base_input, base_cache_read, base_cache_creation, base_completion,
1502
  routing_model_1_val, r1_input, r1_cache_read, r1_cache_creation, r1_completion,
1503
- strategy_1_val, random_pct_1_val, step_k_1_val, start_1_val, end_1_val,
1504
  source, overhead, with_cache
1505
  ):
1506
  if state_data is None:
@@ -1563,6 +1584,7 @@ def build_app():
1563
  elif strategy_1_val == "Replace every step k":
1564
  strategy_params["k"] = step_k_1_val
1565
  elif strategy_1_val == "Replace part of trajectory":
 
1566
  strategy_params["start"] = start_1_val
1567
  strategy_params["end"] = end_1_val
1568
 
@@ -1688,7 +1710,7 @@ def build_app():
1688
  trajectories_state,
1689
  price_input, price_cache_read, price_cache_creation, price_completion,
1690
  routing_model_1, routing_price_1_input, routing_price_1_cache_read, routing_price_1_cache_creation, routing_price_1_completion,
1691
- strategy_1, random_pct_1, step_k_1, start_step_1, end_step_1,
1692
  token_source, thinking_overhead, use_cache,
1693
  ],
1694
  outputs=[routing_result, routing_plots_row, routing_tokens_plot, routing_cost_plot],
 
29
  _trajectory_steps_cache = {}
30
 
31
 
32
+ def parse_start_end(start: float, end: float, total_steps: int, mode: str) -> tuple[int, int]:
33
  """
34
+ Parse start and end values based on mode.
35
 
36
+ Args:
37
+ start: start value
38
+ end: end value
39
+ total_steps: total number of steps in trajectory
40
+ mode: "Indexes" or "Percentages"
41
 
42
+ Returns: (start_idx, end_idx) - both 0-based
43
  """
44
+ if mode == "Indexes":
45
+ return int(start), int(end)
46
  else:
47
+ return int(start * total_steps / 100), int(end * total_steps / 100)
48
 
49
 
50
  def get_routed_steps(total_steps: int, strategy: str, params: dict) -> set:
 
69
  routed = set(range(0, total_steps, k))
70
 
71
  elif strategy == "Replace part of trajectory":
72
+ mode = params.get("mode", "Percentages")
73
+ start, end = parse_start_end(params.get("start", 0), params.get("end", 50), total_steps, mode)
74
  routed = set(range(start, min(end, total_steps)))
75
 
76
  return routed
 
1224
  plot_tokens = gr.Plot(label="Token Usage by Type")
1225
  plot_tokens_cost = gr.Plot(label="Cost by Token Type ($)")
1226
 
 
 
 
 
1227
  with gr.Row():
1228
  plot_stacked = gr.Plot(label="Tokens per Trajectory")
1229
  plot_cost_breakdown = gr.Plot(label="Cost per Trajectory ($)")
1230
 
1231
+ with gr.Row(visible=False) as routing_plots_row:
1232
+ routing_tokens_plot = gr.Plot(label="Tokens by Type (per Model)")
1233
+ routing_cost_plot = gr.Plot(label="Cost by Type (per Model)")
1234
+
1235
  with gr.Column(scale=1):
1236
  selected_folder = gr.State("")
1237
  gr.Markdown("### Selected Model")
 
1305
  random_pct_1 = gr.Number(label="Percentage (%)", value=50, minimum=0, maximum=100, precision=0, interactive=True)
1306
  with gr.Row(visible=False) as every_k_params_1:
1307
  step_k_1 = gr.Number(label="k", value=2, minimum=1, precision=0, interactive=True)
1308
+ with gr.Column(visible=False) as part_params_1:
1309
+ part_mode_1 = gr.Radio(
1310
+ choices=["Indexes", "Percentages"],
1311
+ value="Percentages",
1312
+ label="Mode",
1313
+ )
1314
+ with gr.Row():
1315
+ start_step_1 = gr.Number(label="Start", value=0, minimum=0, precision=0, interactive=True)
1316
+ end_step_1 = gr.Number(label="End", value=50, minimum=0, precision=0, interactive=True)
1317
 
1318
  add_model_2_btn = gr.Button("+ Add another model", size="sm", visible=False)
1319
 
 
1341
  random_pct_2 = gr.Number(label="Percentage (%)", value=50, minimum=0, maximum=100, precision=0, interactive=True)
1342
  with gr.Row(visible=False) as every_k_params_2:
1343
  step_k_2 = gr.Number(label="k", value=2, minimum=1, precision=0, interactive=True)
1344
+ with gr.Column(visible=False) as part_params_2:
1345
+ part_mode_2 = gr.Radio(
1346
+ choices=["Indexes", "Percentages"],
1347
+ value="Percentages",
1348
+ label="Mode",
1349
+ )
1350
+ with gr.Row():
1351
+ start_step_2 = gr.Number(label="Start", value=0, minimum=0, precision=0, interactive=True)
1352
+ end_step_2 = gr.Number(label="End", value=50, minimum=0, precision=0, interactive=True)
1353
 
1354
  add_model_3_btn = gr.Button("+ Add another model", size="sm", visible=False)
1355
 
 
1377
  random_pct_3 = gr.Number(label="Percentage (%)", value=50, minimum=0, maximum=100, precision=0, interactive=True)
1378
  with gr.Row(visible=False) as every_k_params_3:
1379
  step_k_3 = gr.Number(label="k", value=2, minimum=1, precision=0, interactive=True)
1380
+ with gr.Column(visible=False) as part_params_3:
1381
+ part_mode_3 = gr.Radio(
1382
+ choices=["Indexes", "Percentages"],
1383
+ value="Percentages",
1384
+ label="Mode",
1385
+ )
1386
+ with gr.Row():
1387
+ start_step_3 = gr.Number(label="Start", value=0, minimum=0, precision=0, interactive=True)
1388
+ end_step_3 = gr.Number(label="End", value=50, minimum=0, precision=0, interactive=True)
1389
 
1390
  gr.Markdown("---")
1391
  route_btn = gr.Button("πŸš€ Let's ROUTE!!", variant="primary", size="lg", interactive=False)
 
1521
  state_data,
1522
  base_input, base_cache_read, base_cache_creation, base_completion,
1523
  routing_model_1_val, r1_input, r1_cache_read, r1_cache_creation, r1_completion,
1524
+ strategy_1_val, random_pct_1_val, step_k_1_val, part_mode_1_val, start_1_val, end_1_val,
1525
  source, overhead, with_cache
1526
  ):
1527
  if state_data is None:
 
1584
  elif strategy_1_val == "Replace every step k":
1585
  strategy_params["k"] = step_k_1_val
1586
  elif strategy_1_val == "Replace part of trajectory":
1587
+ strategy_params["mode"] = part_mode_1_val
1588
  strategy_params["start"] = start_1_val
1589
  strategy_params["end"] = end_1_val
1590
 
 
1710
  trajectories_state,
1711
  price_input, price_cache_read, price_cache_creation, price_completion,
1712
  routing_model_1, routing_price_1_input, routing_price_1_cache_read, routing_price_1_cache_creation, routing_price_1_completion,
1713
+ strategy_1, random_pct_1, step_k_1, part_mode_1, start_step_1, end_step_1,
1714
  token_source, thinking_overhead, use_cache,
1715
  ],
1716
  outputs=[routing_result, routing_plots_row, routing_tokens_plot, routing_cost_plot],