resource event report

This commit is contained in:
shenchucheng 2024-04-25 20:14:18 +08:00
parent 63eb85ad61
commit 021060d526
12 changed files with 169 additions and 158 deletions

View file

@ -1,7 +1,7 @@
from playwright.async_api import async_playwright
from metagpt.const import DEFAULT_WORKSPACE_ROOT
from metagpt.logs import ToolLogItem, log_tool_output_async
from metagpt.report import BrowserReporter
from metagpt.tools.tool_registry import register_tool
@ -20,6 +20,7 @@ class Browser:
self.pages = {}
self.current_page_url = None
self.current_page = None
self.reporter = BrowserReporter()
async def start(self):
"""Starts Playwright and launches a browser"""
@ -34,21 +35,19 @@ class Browser:
async def open_new_page(self, url: str):
"""open a new page in the browser and view the page"""
page = await self.browser.new_page()
await page.goto(url)
self.pages[url] = page
await self._set_current_page(page, url)
await log_tool_output_async(
ToolLogItem(type="object", name="open_new_page", value=self.current_page), tool_name="Browser"
)
async with self.reporter as reporter:
page = await self.browser.new_page()
await reporter.async_report(url, "url")
await page.goto(url)
self.pages[url] = page
await self._set_current_page(page, url)
await reporter.async_report(page, "page")
async def switch_page(self, url: str):
"""switch to an opened page in the browser and view the page"""
if url in self.pages:
await self._set_current_page(self.pages[url], url)
await log_tool_output_async(
ToolLogItem(type="object", name="switch_page", value=self.current_page), tool_name="Browser"
)
await self.reporter.async_report(self.current_page, "page")
else:
print(f"Page not found: {url}")
@ -110,9 +109,8 @@ class Browser:
index = len(search_results) - 1
element = search_results[index]["element_obj"]
await element.scroll_into_view_if_needed()
await log_tool_output_async(
ToolLogItem(type="object", name="scroll_page", value=self.current_page), tool_name="Browser"
)
await self.reporter.async_report(self.current_page, "page")
print(f"Successfully scrolled to the {index}-th search result")
print(await self._view())
@ -152,9 +150,8 @@ class Browser:
async def scroll_current_page(self, offset: int = 500):
"""scroll the current page by offset pixels, negative value means scrolling up, will print out observed content after scrolling"""
await self.current_page.evaluate(f"window.scrollBy(0, {offset})")
await log_tool_output_async(
ToolLogItem(type="object", name="scroll_page", value=self.current_page), tool_name="Browser"
)
await self.reporter.async_report(self.current_page, "page")
print(f"Scrolled current page by {offset} pixels.")
print(await self._view())

View file

@ -1,4 +1,4 @@
from metagpt.logs import ToolLogItem, log_tool_output
from metagpt.report import ServerReporter
from metagpt.tools.tool_registry import register_tool
@ -8,4 +8,4 @@ class Deployer:
"""Deploy a local service to public. Used only for final deployment, you should NOT use it for development and testing."""
def deploy_to_public(self, local_url: str):
log_tool_output(ToolLogItem(name="local_url", value=local_url), tool_name="Deployer")
ServerReporter().report(local_url, "local_url")

View file

@ -4,7 +4,7 @@ import subprocess
from pydantic import BaseModel, Field
from metagpt.logs import ToolLogItem, log_tool_output
from metagpt.report import EditorReporter
from metagpt.tools.tool_registry import register_tool
@ -23,17 +23,20 @@ class FileBlock(BaseModel):
class FileManager:
"""A tool for reading, understanding, writing, and editing files"""
def __init__(self) -> None:
self.resource = EditorReporter()
def write(self, path: str, content: str):
"""Write the whole content to a file."""
with open(path, "w") as f:
f.write(content)
log_tool_output(ToolLogItem(name="write_file_path", value=path), tool_name="FileManager")
self.resource.report(path, "path")
def read(self, path: str) -> str:
"""Read the whole content of a file."""
with open(path, "r") as f:
self.resource.report(path, "path")
return f.read()
log_tool_output(ToolLogItem(name="read_file_path", value=path), tool_name="FileManager")
def search_content(self, symbol: str, root_path: str = "", window: int = 20) -> FileBlock:
"""
@ -78,10 +81,7 @@ class FileManager:
symbol=symbol,
symbol_line=i + 1,
)
log_tool_output(
ToolLogItem(type="object", name="file_block_searched", value=result),
tool_name="FileManager",
)
self.resource.report(result.file_path, "path")
return result
return None
@ -124,9 +124,7 @@ class FileManager:
block_start_line=start_line,
block_end_line=-1 if end_line < start_line else start_line + new_block_content.count("\n"),
)
log_tool_output(
ToolLogItem(type="object", name="file_block_written", value=new_file_block), tool_name="FileManager"
)
self.resource.report(new_file_block.file_path, "path")
return f"Content written successfully to {file_path}"

View file

@ -2,7 +2,7 @@ import subprocess
import threading
from queue import Queue
from metagpt.logs import TOOL_LOG_END_MARKER, ToolLogItem, log_tool_output
from metagpt.report import END_MARKER_VALUE, TerminalReporter
from metagpt.tools.tool_registry import register_tool
@ -28,9 +28,10 @@ class Terminal:
stderr=subprocess.STDOUT,
text=True,
bufsize=1, # Line buffered
executable="/bin/bash"
executable="/bin/bash",
)
self.stdout_queue = Queue()
self.observer = TerminalReporter()
def run_command(self, cmd: str, daemon=False) -> str:
"""
@ -59,7 +60,7 @@ class Terminal:
# Send the command
self.process.stdin.write(cmd + self.command_terminator)
self.process.stdin.write(
f'echo "{TOOL_LOG_END_MARKER.value}"' + self.command_terminator # write EOF
f'echo "{END_MARKER_VALUE}"' + self.command_terminator # write EOF
) # Unique marker to signal command end
self.process.stdin.flush()
if daemon:
@ -93,28 +94,26 @@ class Terminal:
return self.run_command(cmd, daemon=daemon)
def _read_and_process_output(self, cmd):
cmd_output = []
log_tool_output(
output=ToolLogItem(name="cmd", value=cmd + self.command_terminator), tool_name="Terminal"
) # log the command
with self.observer as observer:
cmd_output = []
observer.report(cmd + self.command_terminator, "cmd")
# report the command
# Read the output until the unique marker is found
while True:
line = self.process.stdout.readline()
ix = line.rfind(TOOL_LOG_END_MARKER.value)
if ix >= 0:
line = line[0:ix]
if line:
log_tool_output(
output=ToolLogItem(name="output", value=line), tool_name="Terminal"
) # log stdout in real-time
cmd_output.append(line)
log_tool_output(TOOL_LOG_END_MARKER)
break
# log stdout in real-time
log_tool_output(output=ToolLogItem(name="output", value=line), tool_name="Terminal")
cmd_output.append(line)
self.stdout_queue.put(line)
# Read the output until the unique marker is found
while True:
line = self.process.stdout.readline()
ix = line.rfind(END_MARKER_VALUE)
if ix >= 0:
line = line[0:ix]
if line:
observer.report(line, "output")
# report stdout in real-time
cmd_output.append(line)
break
# log stdout in real-time
observer.report(line, "output")
cmd_output.append(line)
self.stdout_queue.put(line)
return "".join(cmd_output)