Spaces:
Running
Running
Upload folder using huggingface_hub
Browse files
webui.py
CHANGED
|
@@ -132,9 +132,10 @@ async def run_org_agent(
|
|
| 132 |
model_thoughts = history.model_thoughts()
|
| 133 |
|
| 134 |
recorded_files = get_latest_files(save_recording_path)
|
|
|
|
| 135 |
|
| 136 |
await browser.close()
|
| 137 |
-
return final_result, errors, model_actions, model_thoughts, recorded_files.get('.webm'),
|
| 138 |
else:
|
| 139 |
# Reuse existing context
|
| 140 |
agent = Agent(
|
|
@@ -149,7 +150,8 @@ async def run_org_agent(
|
|
| 149 |
model_actions = history.model_actions()
|
| 150 |
model_thoughts = history.model_thoughts()
|
| 151 |
recorded_files = get_latest_files(save_recording_path)
|
| 152 |
-
|
|
|
|
| 153 |
|
| 154 |
|
| 155 |
async def run_custom_agent(
|
|
@@ -209,7 +211,8 @@ async def run_custom_agent(
|
|
| 209 |
model_actions = history.model_actions()
|
| 210 |
model_thoughts = history.model_thoughts()
|
| 211 |
recorded_files = get_latest_files(save_recording_path)
|
| 212 |
-
|
|
|
|
| 213 |
else:
|
| 214 |
browser = CustomBrowser(
|
| 215 |
config=BrowserConfig(
|
|
@@ -301,7 +304,7 @@ async def run_with_stream(*args):
|
|
| 301 |
html_content = f"<div class='error'>Screenshot error: {str(e)}</div>"
|
| 302 |
|
| 303 |
yield [html_content, final_result, errors, model_actions, model_thoughts, recording, trace]
|
| 304 |
-
await asyncio.sleep(0.
|
| 305 |
|
| 306 |
# Get agent results when done
|
| 307 |
try:
|
|
@@ -343,65 +346,77 @@ def main():
|
|
| 343 |
# Gradio UI setup
|
| 344 |
with gr.Blocks(title="Browser Use WebUI", theme=gr.themes.Soft(font=[gr.themes.GoogleFont("Plus Jakarta Sans")])) as demo:
|
| 345 |
gr.Markdown("<center><h1>Browser Use WebUI</h1></center>")
|
| 346 |
-
with gr.Row():
|
| 347 |
-
agent_type = gr.Radio(["org", "custom"], label="Agent Type", value="custom")
|
| 348 |
-
max_steps = gr.Number(label="max run steps", value=100)
|
| 349 |
-
use_vision = gr.Checkbox(label="use vision", value=True)
|
| 350 |
-
with gr.Row():
|
| 351 |
-
llm_provider = gr.Dropdown(
|
| 352 |
-
["anthropic", "openai", "gemini", "azure_openai", "deepseek"], label="LLM Provider", value="gemini"
|
| 353 |
-
)
|
| 354 |
-
llm_model_name = gr.Textbox(label="LLM Model Name", value="gemini-2.0-flash-exp")
|
| 355 |
-
llm_temperature = gr.Number(label="LLM Temperature", value=1.0)
|
| 356 |
-
with gr.Row():
|
| 357 |
-
llm_base_url = gr.Textbox(label="LLM Base URL")
|
| 358 |
-
llm_api_key = gr.Textbox(label="LLM API Key", type="password")
|
| 359 |
-
|
| 360 |
-
with gr.Accordion("Browser Settings", open=False):
|
| 361 |
-
use_own_browser = gr.Checkbox(label="Use Own Browser", value=False)
|
| 362 |
-
headless = gr.Checkbox(label="Headless", value=False)
|
| 363 |
-
disable_security = gr.Checkbox(label="Disable Security", value=True)
|
| 364 |
-
with gr.Row():
|
| 365 |
-
window_w = gr.Number(label="Window Width", value=1920)
|
| 366 |
-
window_h = gr.Number(label="Window Height", value=1080)
|
| 367 |
-
save_recording_path = gr.Textbox(label="Save Recording Path", placeholder="e.g. ./tmp/record_videos",
|
| 368 |
-
value="./tmp/record_videos")
|
| 369 |
-
with gr.Accordion("Task Settings", open=True):
|
| 370 |
-
task = gr.Textbox(label="Task", lines=10,
|
| 371 |
-
value="go to google.com and type 'OpenAI' click search and give me the first url")
|
| 372 |
-
add_infos = gr.Textbox(label="Additional Infos(Optional): Hints to help LLM complete Task", lines=5)
|
| 373 |
-
|
| 374 |
-
run_button = gr.Button("Run Agent", variant="primary")
|
| 375 |
-
with gr.Column():
|
| 376 |
-
# Add live stream viewer before other components
|
| 377 |
-
browser_view = gr.HTML(
|
| 378 |
-
label="Live Browser View",
|
| 379 |
-
value="<div style='width:100%; height:600px; border:1px solid #ccc; display:flex; align-items:center; justify-content:center;'><p>Waiting for browser session...</p></div>"
|
| 380 |
-
)
|
| 381 |
-
final_result_output = gr.Textbox(label="Final Result", lines=5)
|
| 382 |
-
errors_output = gr.Textbox(label="Errors", lines=5)
|
| 383 |
-
model_actions_output = gr.Textbox(label="Model Actions", lines=5)
|
| 384 |
-
model_thoughts_output = gr.Textbox(label="Model Thoughts", lines=5)
|
| 385 |
-
with gr.Row():
|
| 386 |
-
recording_file = gr.Video(label="Recording File") # Changed from gr.File to gr.Video
|
| 387 |
-
trace_file = gr.File(label="Trace File (ZIP)")
|
| 388 |
-
|
| 389 |
-
# Add a refresh button
|
| 390 |
-
refresh_button = gr.Button("Refresh Files")
|
| 391 |
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 398 |
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
inputs=[],
|
| 402 |
-
outputs=[recording_file, trace_file]
|
| 403 |
-
)
|
| 404 |
-
|
| 405 |
run_button.click(
|
| 406 |
fn=run_with_stream,
|
| 407 |
inputs=[
|
|
@@ -422,7 +437,7 @@ def main():
|
|
| 422 |
max_steps,
|
| 423 |
use_vision
|
| 424 |
],
|
| 425 |
-
outputs=[
|
| 426 |
browser_view,
|
| 427 |
final_result_output,
|
| 428 |
errors_output,
|
|
@@ -441,8 +456,8 @@ if __name__ == "__main__":
|
|
| 441 |
# For local development
|
| 442 |
import argparse
|
| 443 |
parser = argparse.ArgumentParser(description="Gradio UI for Browser Agent")
|
| 444 |
-
parser.add_argument("--ip", type=str, default="
|
| 445 |
-
parser.add_argument("--port", type=int, default=
|
| 446 |
args = parser.parse_args()
|
| 447 |
main()
|
| 448 |
else:
|
|
|
|
| 132 |
model_thoughts = history.model_thoughts()
|
| 133 |
|
| 134 |
recorded_files = get_latest_files(save_recording_path)
|
| 135 |
+
trace_file = get_latest_files(save_recording_path + "/../traces")
|
| 136 |
|
| 137 |
await browser.close()
|
| 138 |
+
return final_result, errors, model_actions, model_thoughts, recorded_files.get('.webm'), trace_file.get('.zip')
|
| 139 |
else:
|
| 140 |
# Reuse existing context
|
| 141 |
agent = Agent(
|
|
|
|
| 150 |
model_actions = history.model_actions()
|
| 151 |
model_thoughts = history.model_thoughts()
|
| 152 |
recorded_files = get_latest_files(save_recording_path)
|
| 153 |
+
trace_file = get_latest_files(save_recording_path + "/../traces")
|
| 154 |
+
return final_result, errors, model_actions, model_thoughts, recorded_files.get('.webm'), trace_file.get('.zip')
|
| 155 |
|
| 156 |
|
| 157 |
async def run_custom_agent(
|
|
|
|
| 211 |
model_actions = history.model_actions()
|
| 212 |
model_thoughts = history.model_thoughts()
|
| 213 |
recorded_files = get_latest_files(save_recording_path)
|
| 214 |
+
trace_file = get_latest_files(save_recording_path + "/../traces")
|
| 215 |
+
return final_result, errors, model_actions, model_thoughts, recorded_files.get('.webm'), trace_file.get('.zip')
|
| 216 |
else:
|
| 217 |
browser = CustomBrowser(
|
| 218 |
config=BrowserConfig(
|
|
|
|
| 304 |
html_content = f"<div class='error'>Screenshot error: {str(e)}</div>"
|
| 305 |
|
| 306 |
yield [html_content, final_result, errors, model_actions, model_thoughts, recording, trace]
|
| 307 |
+
await asyncio.sleep(0.01)
|
| 308 |
|
| 309 |
# Get agent results when done
|
| 310 |
try:
|
|
|
|
| 346 |
# Gradio UI setup
|
| 347 |
with gr.Blocks(title="Browser Use WebUI", theme=gr.themes.Soft(font=[gr.themes.GoogleFont("Plus Jakarta Sans")])) as demo:
|
| 348 |
gr.Markdown("<center><h1>Browser Use WebUI</h1></center>")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 349 |
|
| 350 |
+
with gr.Tabs():
|
| 351 |
+
# Tab for LLM Settings
|
| 352 |
+
with gr.Tab("LLM Settings"):
|
| 353 |
+
with gr.Row():
|
| 354 |
+
llm_provider = gr.Dropdown(
|
| 355 |
+
["anthropic", "openai", "gemini", "azure_openai", "deepseek"], label="LLM Provider", value="gemini"
|
| 356 |
+
)
|
| 357 |
+
llm_model_name = gr.Textbox(label="LLM Model Name", value="gemini-2.0-flash-exp")
|
| 358 |
+
llm_temperature = gr.Number(label="LLM Temperature", value=1.0)
|
| 359 |
+
with gr.Row():
|
| 360 |
+
llm_base_url = gr.Textbox(label="LLM Base URL")
|
| 361 |
+
llm_api_key = gr.Textbox(label="LLM API Key", type="password")
|
| 362 |
+
|
| 363 |
+
# Tab for Browser Settings
|
| 364 |
+
with gr.Tab("Browser Settings"):
|
| 365 |
+
with gr.Accordion("Browser Settings", open=True):
|
| 366 |
+
use_own_browser = gr.Checkbox(label="Use Own Browser", value=False)
|
| 367 |
+
headless = gr.Checkbox(label="Headless", value=False)
|
| 368 |
+
disable_security = gr.Checkbox(label="Disable Security", value=True)
|
| 369 |
+
with gr.Row():
|
| 370 |
+
window_w = gr.Number(label="Window Width", value=1920)
|
| 371 |
+
window_h = gr.Number(label="Window Height", value=1080)
|
| 372 |
+
save_recording_path = gr.Textbox(label="Save Recording Path", placeholder="e.g. ./tmp/record_videos",
|
| 373 |
+
value="./tmp/record_videos")
|
| 374 |
+
|
| 375 |
+
# Tab for Task Settings
|
| 376 |
+
with gr.Tab("Task Settings"):
|
| 377 |
+
with gr.Accordion("Task Settings", open=True):
|
| 378 |
+
task = gr.Textbox(label="Task", lines=10,
|
| 379 |
+
value="go to google.com and type 'OpenAI' click search and give me the first url")
|
| 380 |
+
add_infos = gr.Textbox(label="Additional Infos (Optional): Hints to help LLM complete Task", lines=5)
|
| 381 |
+
agent_type = gr.Radio(["org", "custom"], label="Agent Type", value="custom")
|
| 382 |
+
max_steps = gr.Number(label="Max Run Steps", value=100)
|
| 383 |
+
use_vision = gr.Checkbox(label="Use Vision", value=True)
|
| 384 |
+
|
| 385 |
+
# Tab for Stream + File Download and Agent Thoughts
|
| 386 |
+
with gr.Tab("Results"):
|
| 387 |
+
with gr.Column():
|
| 388 |
+
# Add live stream viewer before other components
|
| 389 |
+
browser_view = gr.HTML(
|
| 390 |
+
label="Live Browser View",
|
| 391 |
+
value="<div style='width:100%; height:600px; border:1px solid #ccc; display:flex; align-items:center; justify-content:center;'><p>Waiting for browser session...</p></div>"
|
| 392 |
+
)
|
| 393 |
+
final_result_output = gr.Textbox(label="Final Result", lines=5)
|
| 394 |
+
errors_output = gr.Textbox(label="Errors", lines=5)
|
| 395 |
+
model_actions_output = gr.Textbox(label="Model Actions", lines=5)
|
| 396 |
+
model_thoughts_output = gr.Textbox(label="Model Thoughts", lines=5)
|
| 397 |
+
with gr.Row():
|
| 398 |
+
recording_file = gr.Video(label="Recording File") # Changed from gr.File to gr.Video
|
| 399 |
+
trace_file = gr.File(label="Trace File (ZIP)")
|
| 400 |
+
|
| 401 |
+
# Add a refresh button
|
| 402 |
+
refresh_button = gr.Button("Refresh Files")
|
| 403 |
+
|
| 404 |
+
def refresh_files():
|
| 405 |
+
recorded_files = get_latest_files("./tmp/record_videos")
|
| 406 |
+
trace_file = get_latest_files("./tmp/traces")
|
| 407 |
+
return (
|
| 408 |
+
recorded_files.get('.webm') if recorded_files.get('.webm') else None,
|
| 409 |
+
trace_file.get('.zip') if trace_file.get('.zip') else None
|
| 410 |
+
)
|
| 411 |
+
|
| 412 |
+
refresh_button.click(
|
| 413 |
+
fn=refresh_files,
|
| 414 |
+
inputs=[],
|
| 415 |
+
outputs=[recording_file, trace_file]
|
| 416 |
+
)
|
| 417 |
|
| 418 |
+
# Run button outside tabs for global execution
|
| 419 |
+
run_button = gr.Button("Run Agent", variant="primary")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 420 |
run_button.click(
|
| 421 |
fn=run_with_stream,
|
| 422 |
inputs=[
|
|
|
|
| 437 |
max_steps,
|
| 438 |
use_vision
|
| 439 |
],
|
| 440 |
+
outputs=[
|
| 441 |
browser_view,
|
| 442 |
final_result_output,
|
| 443 |
errors_output,
|
|
|
|
| 456 |
# For local development
|
| 457 |
import argparse
|
| 458 |
parser = argparse.ArgumentParser(description="Gradio UI for Browser Agent")
|
| 459 |
+
parser.add_argument("--ip", type=str, default="0.0.0.0", help="IP address to bind to")
|
| 460 |
+
parser.add_argument("--port", type=int, default=7860, help="Port to listen on")
|
| 461 |
args = parser.parse_args()
|
| 462 |
main()
|
| 463 |
else:
|