kaze-browser / browser_agent.py
AIgoose's picture
diag: switch to print() for visibility, add elapsed timing
075c0cc verified
Raw
History Blame Contribute Delete
2.68 kB
import asyncio
import logging
import os
import re
from langchain_openai import ChatOpenAI
from browser_use import Agent
logger = logging.getLogger(__name__)
_RETRY_RE = re.compile(r'\b(429|500)\b|Failed to connect to LLM')
OPENROUTER_BASE = "https://openrouter.ai/api/v1"
PRIMARY_MODEL = "google/gemini-2.5-flash-lite" # paid ~$0.0001/1k calls, no rate limits
FALLBACK_MODEL = "meta-llama/llama-3.3-70b-instruct:free"
def _make_llm(model: str) -> ChatOpenAI:
api_key = os.getenv("OPENROUTER_API_KEY")
if not api_key:
raise EnvironmentError("OPENROUTER_API_KEY environment variable is not set")
return ChatOpenAI(model=model, api_key=api_key, base_url=OPENROUTER_BASE)
def _extract_result(history) -> str:
if hasattr(history, "final_result"):
r = history.final_result()
if r:
return str(r)
if hasattr(history, "all_results"):
for action_result in reversed(history.all_results):
if getattr(action_result, "extracted_content", None):
return str(action_result.extracted_content)
return str(history)
async def _execute(llm: ChatOpenAI, task: str, timeout: int) -> dict:
import time as _time
t0 = _time.monotonic()
print(f"[KAZE] _execute start task={task[:60]!r}", flush=True)
agent = Agent(task=task, llm=llm)
print("[KAZE] agent created, running (max_steps=25)...", flush=True)
try:
history = await asyncio.wait_for(agent.run(max_steps=25), timeout=timeout)
except Exception:
print(f"[KAZE] agent.run() raised after {_time.monotonic()-t0:.1f}s", flush=True)
logger.exception("[KAZE] agent.run() raised")
raise
n_r = len(history.all_results) if hasattr(history, "all_results") else "?"
n_o = len(history.all_model_outputs) if hasattr(history, "all_model_outputs") else "?"
final = history.final_result() if hasattr(history, "final_result") else None
elapsed = _time.monotonic() - t0
print(f"[KAZE] run done in {elapsed:.1f}s: results={n_r} outputs={n_o} final={final!r}", flush=True)
logger.info("[KAZE] run done: results=%s outputs=%s final=%r", n_r, n_o, final)
return {"result": _extract_result(history), "screenshots": []}
async def run_task(task: str, timeout: int = 120) -> dict:
llm = _make_llm(PRIMARY_MODEL)
try:
return await _execute(llm, task, timeout)
except Exception as e:
logger.exception("[KAZE] primary model failed: %s", e)
if _RETRY_RE.search(str(e)):
logger.info("[KAZE] retrying with fallback model")
llm = _make_llm(FALLBACK_MODEL)
return await _execute(llm, task, timeout)
raise