Skip to content

Commit 4ee24b7

Browse files
authored
Merge pull request #358 from algoz098/main
feat: allow chrome cdp in env
2 parents 4dbf564 + f35e7b5 commit 4ee24b7

File tree

3 files changed

+57
-16
lines changed

3 files changed

+57
-16
lines changed

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ CHROME_DEBUGGING_PORT=9222
3737
CHROME_DEBUGGING_HOST=localhost
3838
# Set to true to keep browser open between AI tasks
3939
CHROME_PERSISTENT_SESSION=false
40-
40+
CHROME_CDP=http://localhost:9222
4141
# Display settings
4242
# Format: WIDTHxHEIGHTxDEPTH
4343
RESOLUTION=1920x1080x24

src/utils/deep_research.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ async def deep_research(task, llm, agent_state=None, **kwargs):
4444

4545
use_own_browser = kwargs.get("use_own_browser", False)
4646
extra_chromium_args = []
47+
cdp_url = kwargs.get("chrome_cdp", None)
4748
if use_own_browser:
49+
cdp_url = os.getenv("CHROME_CDP", kwargs.get("chrome_cdp", None))
4850
# TODO: if use own browser, max query num must be 1 per iter, how to solve it?
4951
max_query_num = 1
5052
chrome_path = os.getenv("CHROME_PATH", None)
@@ -57,6 +59,7 @@ async def deep_research(task, llm, agent_state=None, **kwargs):
5759
browser = CustomBrowser(
5860
config=BrowserConfig(
5961
headless=kwargs.get("headless", False),
62+
cdp_url=cdp_url,
6063
disable_security=kwargs.get("disable_security", True),
6164
chrome_instance_path=chrome_path,
6265
extra_chromium_args=extra_chromium_args,

webui.py

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ async def run_browser_agent(
143143
max_steps,
144144
use_vision,
145145
max_actions_per_step,
146-
tool_calling_method
146+
tool_calling_method,
147+
chrome_cdp
147148
):
148149
global _global_agent_state
149150
_global_agent_state.clear_stop() # Clear any previous stop requests
@@ -192,7 +193,8 @@ async def run_browser_agent(
192193
max_steps=max_steps,
193194
use_vision=use_vision,
194195
max_actions_per_step=max_actions_per_step,
195-
tool_calling_method=tool_calling_method
196+
tool_calling_method=tool_calling_method,
197+
chrome_cdp=chrome_cdp
196198
)
197199
elif agent_type == "custom":
198200
final_result, errors, model_actions, model_thoughts, trace_file, history_file = await run_custom_agent(
@@ -211,7 +213,8 @@ async def run_browser_agent(
211213
max_steps=max_steps,
212214
use_vision=use_vision,
213215
max_actions_per_step=max_actions_per_step,
214-
tool_calling_method=tool_calling_method
216+
tool_calling_method=tool_calling_method,
217+
chrome_cdp=chrome_cdp
215218
)
216219
else:
217220
raise ValueError(f"Invalid agent type: {agent_type}")
@@ -273,7 +276,8 @@ async def run_org_agent(
273276
max_steps,
274277
use_vision,
275278
max_actions_per_step,
276-
tool_calling_method
279+
tool_calling_method,
280+
chrome_cdp
277281
):
278282
try:
279283
global _global_browser, _global_browser_context, _global_agent_state, _global_agent
@@ -282,7 +286,10 @@ async def run_org_agent(
282286
_global_agent_state.clear_stop()
283287

284288
extra_chromium_args = [f"--window-size={window_w},{window_h}"]
289+
cdp_url = chrome_cdp
290+
285291
if use_own_browser:
292+
cdp_url = os.getenv("CHROME_CDP", chrome_cdp)
286293
chrome_path = os.getenv("CHROME_PATH", None)
287294
if chrome_path == "":
288295
chrome_path = None
@@ -293,9 +300,11 @@ async def run_org_agent(
293300
chrome_path = None
294301

295302
if _global_browser is None:
303+
296304
_global_browser = Browser(
297305
config=BrowserConfig(
298306
headless=headless,
307+
cdp_url=cdp_url,
299308
disable_security=disable_security,
300309
chrome_instance_path=chrome_path,
301310
extra_chromium_args=extra_chromium_args,
@@ -307,6 +316,7 @@ async def run_org_agent(
307316
config=BrowserContextConfig(
308317
trace_path=save_trace_path if save_trace_path else None,
309318
save_recording_path=save_recording_path if save_recording_path else None,
319+
cdp_url=cdp_url,
310320
no_viewport=False,
311321
browser_window_size=BrowserContextWindowSize(
312322
width=window_w, height=window_h
@@ -370,7 +380,8 @@ async def run_custom_agent(
370380
max_steps,
371381
use_vision,
372382
max_actions_per_step,
373-
tool_calling_method
383+
tool_calling_method,
384+
chrome_cdp
374385
):
375386
try:
376387
global _global_browser, _global_browser_context, _global_agent_state, _global_agent
@@ -379,7 +390,10 @@ async def run_custom_agent(
379390
_global_agent_state.clear_stop()
380391

381392
extra_chromium_args = [f"--window-size={window_w},{window_h}"]
393+
cdp_url = chrome_cdp
382394
if use_own_browser:
395+
cdp_url = os.getenv("CHROME_CDP", chrome_cdp)
396+
383397
chrome_path = os.getenv("CHROME_PATH", None)
384398
if chrome_path == "":
385399
chrome_path = None
@@ -392,17 +406,19 @@ async def run_custom_agent(
392406
controller = CustomController()
393407

394408
# Initialize global browser if needed
395-
if _global_browser is None:
409+
#if chrome_cdp not empty string nor None
410+
if ((_global_browser is None) or (cdp_url and cdp_url != "" and cdp_url != None)) :
396411
_global_browser = CustomBrowser(
397412
config=BrowserConfig(
398413
headless=headless,
399414
disable_security=disable_security,
415+
cdp_url=cdp_url,
400416
chrome_instance_path=chrome_path,
401417
extra_chromium_args=extra_chromium_args,
402418
)
403419
)
404420

405-
if _global_browser_context is None:
421+
if (_global_browser_context is None or (chrome_cdp and cdp_url != "" and cdp_url != None)):
406422
_global_browser_context = await _global_browser.new_context(
407423
config=BrowserContextConfig(
408424
trace_path=save_trace_path if save_trace_path else None,
@@ -413,7 +429,8 @@ async def run_custom_agent(
413429
),
414430
)
415431
)
416-
432+
433+
417434
# Create and run agent
418435
if _global_agent is None:
419436
_global_agent = CustomAgent(
@@ -482,7 +499,8 @@ async def run_with_stream(
482499
max_steps,
483500
use_vision,
484501
max_actions_per_step,
485-
tool_calling_method
502+
tool_calling_method,
503+
chrome_cdp
486504
):
487505
global _global_agent_state
488506
stream_vw = 80
@@ -511,7 +529,8 @@ async def run_with_stream(
511529
max_steps=max_steps,
512530
use_vision=use_vision,
513531
max_actions_per_step=max_actions_per_step,
514-
tool_calling_method=tool_calling_method
532+
tool_calling_method=tool_calling_method,
533+
chrome_cdp=chrome_cdp
515534
)
516535
# Add HTML content at the start of the result array
517536
html_content = f"<h1 style='width:{stream_vw}vw; height:{stream_vh}vh'>Using browser...</h1>"
@@ -544,7 +563,8 @@ async def run_with_stream(
544563
max_steps=max_steps,
545564
use_vision=use_vision,
546565
max_actions_per_step=max_actions_per_step,
547-
tool_calling_method=tool_calling_method
566+
tool_calling_method=tool_calling_method,
567+
chrome_cdp=chrome_cdp
548568
)
549569
)
550570

@@ -658,7 +678,7 @@ async def close_global_browser():
658678
await _global_browser.close()
659679
_global_browser = None
660680

661-
async def run_deep_search(research_task, max_search_iteration_input, max_query_per_iter_input, llm_provider, llm_model_name, llm_num_ctx, llm_temperature, llm_base_url, llm_api_key, use_vision, use_own_browser, headless):
681+
async def run_deep_search(research_task, max_search_iteration_input, max_query_per_iter_input, llm_provider, llm_model_name, llm_num_ctx, llm_temperature, llm_base_url, llm_api_key, use_vision, use_own_browser, headless, chrome_cdp):
662682
from src.utils.deep_research import deep_research
663683
global _global_agent_state
664684

@@ -678,7 +698,8 @@ async def run_deep_search(research_task, max_search_iteration_input, max_query_p
678698
max_query_num=max_query_per_iter_input,
679699
use_vision=use_vision,
680700
headless=headless,
681-
use_own_browser=use_own_browser
701+
use_own_browser=use_own_browser,
702+
chrome_cdp=chrome_cdp
682703
)
683704

684705
return markdown_content, file_path, gr.update(value="Stop", interactive=True), gr.update(interactive=True)
@@ -854,6 +875,23 @@ def update_llm_num_ctx_visibility(llm_provider):
854875
info="Browser window height",
855876
)
856877

878+
879+
save_recording_path = gr.Textbox(
880+
label="Recording Path",
881+
placeholder="e.g. ./tmp/record_videos",
882+
value=config['save_recording_path'],
883+
info="Path to save browser recordings",
884+
interactive=True, # Allow editing only if recording is enabled
885+
)
886+
887+
chrome_cdp = gr.Textbox(
888+
label="CDP URL",
889+
placeholder="http://localhost:9222",
890+
value="",
891+
info="CDP for google remote debugging",
892+
interactive=True, # Allow editing only if recording is enabled
893+
)
894+
857895
save_recording_path = gr.Textbox(
858896
label="Recording Path",
859897
placeholder="e.g. ./tmp/record_videos",
@@ -958,7 +996,7 @@ def update_llm_num_ctx_visibility(llm_provider):
958996
agent_type, llm_provider, llm_model_name, llm_num_ctx, llm_temperature, llm_base_url, llm_api_key,
959997
use_own_browser, keep_browser_open, headless, disable_security, window_w, window_h,
960998
save_recording_path, save_agent_history_path, save_trace_path, # Include the new path
961-
enable_recording, task, add_infos, max_steps, use_vision, max_actions_per_step, tool_calling_method
999+
enable_recording, task, add_infos, max_steps, use_vision, max_actions_per_step, tool_calling_method, chrome_cdp
9621000
],
9631001
outputs=[
9641002
browser_view, # Browser view
@@ -977,7 +1015,7 @@ def update_llm_num_ctx_visibility(llm_provider):
9771015
# Run Deep Research
9781016
research_button.click(
9791017
fn=run_deep_search,
980-
inputs=[research_task_input, max_search_iteration_input, max_query_per_iter_input, llm_provider, llm_model_name, llm_num_ctx, llm_temperature, llm_base_url, llm_api_key, use_vision, use_own_browser, headless],
1018+
inputs=[research_task_input, max_search_iteration_input, max_query_per_iter_input, llm_provider, llm_model_name, llm_num_ctx, llm_temperature, llm_base_url, llm_api_key, use_vision, use_own_browser, headless, chrome_cdp],
9811019
outputs=[markdown_output_display, markdown_download, stop_research_button, research_button]
9821020
)
9831021
# Bind the stop button click event after errors_output is defined

0 commit comments

Comments
 (0)