when the internet_browser tool is launched, the bot sends a message with a link to the browser in which the agent is running

This commit is contained in:
Skyber_2 2026-04-04 16:24:39 +03:00
parent e2a1b93f60
commit 680ba6e38d

View file

@ -2,14 +2,63 @@ import json
import os import os
import asyncio import asyncio
import socket import socket
import logging
from telegram import Bot
from telegram.constants import ParseMode
from browser_use import Agent, Browser, ChatOpenAI from browser_use import Agent, Browser, ChatOpenAI
from tools.registry import registry from tools.registry import registry
async def run_browser_task(task): logger = logging.getLogger("hermes.browser_use_tool")
def get_chat_id(honcho_session_key: str) -> str:
if not honcho_session_key or not isinstance(honcho_session_key, str):
logger.warning("нет honcho_session_key")
return None
if ':' in honcho_session_key:
logger.info("получен honcho_session_key")
return honcho_session_key.split(':')[-1]
logger.warning("нет honcho_session_key")
return None
async def notify_user_vnc(honcho_session_key: str, vnc_url: str):
token = os.getenv("TELEGRAM_BOT_TOKEN")
chat_id = get_chat_id(honcho_session_key)
if not token or not chat_id:
logger.warning("Сообщение не отправлено: отсутствует токен или chat_id")
return
try:
bot = Bot(token=token)
text = (
f"🌐 *Запуск браузера*\n\n"
f"Ты можешь наблюдать за моими действиями здесь:\n"
f"🔗 [ОТКРЫТЬ ТРАНСЛЯЦИЮ]({vnc_url})"
)
await bot.send_message(
chat_id=chat_id,
text=text,
parse_mode=ParseMode.MARKDOWN,
disable_web_page_preview=True
)
logger.info(f"Уведомление отправлено в Telegram для chat_id: {chat_id}")
except Exception as e:
logger.warning(f"Ошибка при отправке уведомления в Telegram: {str(e)}")
async def run_browser_task(task: str, honcho_session_key: str):
browser_host = "browser" browser_host = "browser"
browser_port = 9222 browser_port = 9222
BROWSER_VIEW_URL = os.getenv("BROWSER_VIEW_URL", "") vnc_url = os.getenv("BROWSER_VIEW_URL", "")
if honcho_session_key:
asyncio.create_task(notify_user_vnc(honcho_session_key, vnc_url))
try: try:
browser_ip = socket.gethostbyname(browser_host) browser_ip = socket.gethostbyname(browser_host)
@ -46,12 +95,11 @@ async def run_browser_task(task):
history = await agent.run() history = await agent.run()
final_result = history.final_result() final_result = history.final_result()
response = { return json.dumps({
"success": True, "success": True,
"result": final_result, "result": final_result,
"browser_view": BROWSER_VIEW_URL "vnc_url": vnc_url
} }, ensure_ascii=False)
return json.dumps(response, ensure_ascii=False)
except Exception as e: except Exception as e:
return json.dumps({ return json.dumps({
@ -61,10 +109,7 @@ async def run_browser_task(task):
finally: finally:
if browser: if browser:
try: await browser.stop()
await browser.close()
except Exception:
pass
registry.register( registry.register(
@ -72,24 +117,15 @@ registry.register(
toolset="browse_cmd", toolset="browse_cmd",
schema={ schema={
"name": "internet_browser", "name": "internet_browser",
"description": ( "description": "ГЛАВНЫЙ ИНСТРУМЕНТ ДЛЯ ВЕБ-СЕРФИНГА. Вызывай напрямую.",
"ГЛАВНЫЙ ИНСТРУМЕНТ ДЛЯ ВЕБ-СЕРФИНГА. Вызывай этот инструмент НАПРЯМУЮ (через стандартный tool call/function call). "
"КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО использовать `execute_code` или `delegate_task` для работы с браузером. "
"Не пиши Python-скрипты! Просто передай в этот инструмент параметр `task`. "
"Используй для любых задач в интернете: поиск товаров (Wildberries, Ozon), чтение статей, клики, навигация."
),
"parameters": { "parameters": {
"type": "object", "type": "object",
"properties": { "properties": {
"task": { "task": {"type": "string", "description": "Задача для браузера"}
"type": "string",
"description": "Подробная задача на естественном языке. Например: 'Зайди на wildberries.ru, найди черную футболку и верни цену'."
}
}, },
"required": ["task"] "required": ["task"]
} }
}, },
handler=lambda args, **kw: asyncio.run(run_browser_task(args.get("task", ""), kw.get("honcho_session_key", ""))),
handler=lambda args, **kw: asyncio.run(run_browser_task(args.get("task"))),
emoji="🌐", emoji="🌐",
) )