@@ -302,6 +302,11 @@ def run_gradio(results_dir: Path):
302302 action_info = gr .Markdown (label = "Action Info" , elem_classes = "my-markdown" )
303303 state_error = gr .Markdown (label = "Next Step Error" , elem_classes = "my-markdown" )
304304
305+ with gr .Row (variant = "panel" ):
306+ prev_btn = gr .Button ("◀ Previous" , size = "md" , scale = 0 )
307+ next_btn = gr .Button ("Next ▶" , size = "md" , scale = 0 )
308+ step_indicator = gr .Markdown ("**Step 0/0**" )
309+
305310 profiling_gr = gr .Image (
306311 label = "Profiling" , show_label = False , interactive = False , show_download_button = False
307312 )
@@ -537,13 +542,38 @@ def run_gradio(results_dir: Path):
537542 outputs = [hidden_key_input , step_id ],
538543 )
539544
545+ # Simple navigation button events - reuse keyboard logic
546+ prev_btn .click (
547+ lambda step_id : handle_key_event ("Cmd+Left" , step_id )[1 ],
548+ inputs = [step_id ],
549+ outputs = [step_id ],
550+ )
551+ next_btn .click (
552+ lambda step_id : handle_key_event ("Cmd+Right" , step_id )[1 ],
553+ inputs = [step_id ],
554+ outputs = [step_id ],
555+ )
556+
557+ # Update step indicator display
558+ def format_step_indicator (step_id ):
559+ global info
560+ if not step_id or not info .exp_result or not info .exp_result .steps_info :
561+ return "Step 0/0"
562+ # 1-based for user, total steps is len-1 (last is terminal)
563+ current = (step_id .step + 1 ) if step_id .step is not None else 0
564+ total = max (len (info .exp_result .steps_info ) - 1 , 0 )
565+ return f"Step { current } /{ total } "
566+
567+ step_id .change (format_step_indicator , inputs = [step_id ], outputs = [step_indicator ])
568+
540569 demo .queue ()
541570
542571 do_share = os .getenv ("AGENTXRAY_SHARE_GRADIO" , "false" ).lower () == "true"
543572 port = os .getenv ("AGENTXRAY_APP_PORT" , None )
573+ server_name = "0.0.0.0" if os .getenv ("AGENTXRAY_PUBLIC" , "false" ) == "true" else "127.0.0.1"
544574 if isinstance (port , str ):
545575 port = int (port )
546- demo .launch (server_port = port , share = do_share )
576+ demo .launch (server_name = server_name , server_port = port , share = do_share )
547577
548578
549579def handle_key_event (key_event , step_id : StepId ):
@@ -947,7 +977,7 @@ def get_episode_info(info: Info):
947977
948978 info = f"""\
949979 ### { env_args .task_name } (seed: { env_args .task_seed } )
950- ### Step { info . step } / { len ( steps_info ) - 1 } (Reward: { cum_reward :.1f} )
980+ ### (Reward: { cum_reward :.1f} )
951981
952982**Goal:**
953983
0 commit comments