forked from VRAutomatize/browser-use
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbrowser.py
More file actions
138 lines (122 loc) · 5.56 KB
/
Copy pathbrowser.py
File metadata and controls
138 lines (122 loc) · 5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import logging
from typing import Dict, Any
from datetime import datetime
import time
import json
from collections import defaultdict
from logging_config import setup_logging, log_info, log_error, log_debug, log_warning
from settings import get_llm, AgentResponse, ModelConfig
from browser_use import Agent, BrowserConfig, Browser, AgentHistoryList
# from browser_use.agent.views import AgentHistory
# Logging configuration
logger = logging.getLogger('browser-use.browser')
class MetricsCollector:
def __init__(self):
self.metrics = defaultdict(list)
self.start_time = time.time()
def record_metric(self, name: str, value: float):
self.metrics[name].append({
"value": value,
"timestamp": datetime.now().isoformat()
})
def get_metrics(self) -> Dict[str, Any]:
return {
"uptime": time.time() - self.start_time,
"metrics": dict(self.metrics)
}
class BrowserManager:
def __init__(self):
self.browser = None
self.context = None
self.page = None
log_info(logger, "BrowserManager initialized")
self.metrics_collector = MetricsCollector()
async def execute_task(self, task: str, config: Dict[str, Any], task_id: str) -> AgentResponse:
"""Execute an automation task"""
try:
# Configure LLM model
llm_config = ModelConfig(
provider=config.get("llm_config", {}).get("provider", "OpenAI"),
model_name=config.get("llm_config", {}).get("model_name", "chat"),
api_key=config.get("llm_config", {}).get("api_key", None),
temperature=config.get("llm_config", {}).get("temperature", 0.5)
)
llm = get_llm(llm_config)
bconfig = config.get("browser_config", {})
history = config.get("history", None)
run_history = config.get("run_history", False)
# Configure browser
browser_config = BrowserConfig(
headless=bconfig.get("headless", True),
disable_security=bconfig.get("disable_security", True),
extra_chromium_args=bconfig.get("extra_chromium_args", []),
proxy=bconfig.get("proxy", None)
)
# Initialize browser
browser = Browser(config=browser_config)
tool_calling_method = "auto"
if "deepseek-r1" in llm_config.model_name:
tool_calling_method = "json_mode"
# Initialize and run agent
agent = Agent(
task=task,
llm=llm,
browser=browser,
max_failures=config.get("max_failures", 5),
use_vision=config.get("use_vision", True),
memory_interval=config.get("memory_interval", 10),
planner_interval=config.get("planner_interval", 1),
tool_calling_method=tool_calling_method
)
history_path = f'./history/{task_id}.json'
# Extract result
success = False
content = "Task not completed"
steps_executed = 0
async def onStepEnd(self: Agent):
self.save_history(history_path)
if run_history == True:
log_info(logger, f"TASK {task_id} run history {str(history)}")
with open(history_path, "w") as f:
json.dump(history, f)
result = await agent.rerun_history(
history=AgentHistoryList.load_from_file(history_path, agent.AgentOutput),
max_retries=config.get("max_retries", 3),
skip_failures=config.get("skip_failures", False),
delay_between_actions=config.get("delay_between_actions", 2.0)
)
last_item = result[-1]
success = last_item.success
steps_executed = len(result)
content = last_item.extracted_content
# await (await browser.get_playwright_browser()).close()
else:
log_info(logger, f"TASK {task_id} run ai")
result = await agent.run(max_steps=config.get("max_steps", 5),
on_step_start=None,
on_step_end=onStepEnd)
if result and result.history and len(result.history) > 0:
steps_executed = len(result.history)
last_item = result.history[-1]
if last_item.result and len(last_item.result) > 0:
last_result = last_item.result[-1]
content = last_result.extracted_content or "No content extracted"
success = last_result.is_done
# Close browser after use
await browser.close()
videopath = agent.videopath
return AgentResponse(
task=task,
result=content,
success=success,
steps_executed=steps_executed,
videopath=videopath
)
except Exception as e:
logger.error(f"Error executing task: {str(e)}")
self.metrics_collector.record_metric("task_errors", 1)
return AgentResponse(task=task, result=None, success=False, error=str(e))
def get_metrics(self) -> Dict[str, Any]:
"""Return browser manager metrics"""
metrics = self.metrics_collector.get_metrics()
return metrics