diff --git a/agenthub/monologue_agent/agent.py b/agenthub/monologue_agent/agent.py index b987248622..8db6ce7a54 100644 --- a/agenthub/monologue_agent/agent.py +++ b/agenthub/monologue_agent/agent.py @@ -85,6 +85,8 @@ class MonologueAgent(Agent): self.memory = LongTermMemory() def _add_event(self, event: dict): + if "extras" in event and "screenshot" in event["extras"]: + del event["extras"]["screenshot"] if 'args' in event and 'output' in event['args'] and len(event['args']['output']) > MAX_OUTPUT_LENGTH: event['args']['output'] = event['args']['output'][:MAX_OUTPUT_LENGTH] + "..." @@ -114,7 +116,7 @@ class MonologueAgent(Agent): elif output_type == "recall": observation = AgentRecallObservation(content=thought, memories=[]) elif output_type == "browse": - observation = BrowserOutputObservation(content=thought, url="") + observation = BrowserOutputObservation(content=thought, url="", screenshot="") self._add_event(observation.to_dict()) output_type = "" else: diff --git a/agenthub/planner_agent/prompt.py b/agenthub/planner_agent/prompt.py index 5b56fc3ffe..e34d8752fb 100644 --- a/agenthub/planner_agent/prompt.py +++ b/agenthub/planner_agent/prompt.py @@ -139,7 +139,10 @@ def get_prompt(plan: Plan, history: List[Tuple[Action, Observation]]): history_dicts.append(action.to_dict()) latest_action = action if not isinstance(observation, NullObservation): - history_dicts.append(observation.to_dict()) + observation_dict = observation.to_dict() + if "extras" in observation_dict and "screenshot" in observation_dict["extras"]: + del observation_dict["extras"]["screenshot"] + history_dicts.append(observation_dict) history_str = json.dumps(history_dicts, indent=2) hint = "" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d0523e4d6e..5c5cefb268 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -3099,7 +3099,6 @@ "version": "0.11.0", "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" @@ -10209,6 +10208,12 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/monaco-editor": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.47.0.tgz", + "integrity": "sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==", + "peer": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", @@ -12961,6 +12966,12 @@ "node": ">=0.4" } }, + "node_modules/xterm": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "peer": true + }, "node_modules/xterm-addon-fit": { "version": "0.8.0", "resolved": "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz", @@ -15190,7 +15201,6 @@ "version": "0.11.0", "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true }, "@pkgr/core": { @@ -20319,6 +20329,12 @@ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz", "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" }, + "monaco-editor": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.47.0.tgz", + "integrity": "sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==", + "peer": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", @@ -22149,6 +22165,12 @@ "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "xterm": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "peer": true + }, "xterm-addon-fit": { "version": "0.8.0", "resolved": "https://registry.npmmirror.com/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz", diff --git a/frontend/src/components/Browser.tsx b/frontend/src/components/Browser.tsx index 261fe14264..7fa5fac242 100644 --- a/frontend/src/components/Browser.tsx +++ b/frontend/src/components/Browser.tsx @@ -3,12 +3,29 @@ import { useSelector } from "react-redux"; import { RootState } from "../store"; function Browser(): JSX.Element { - const url = useSelector((state: RootState) => state.browser.url); + const { url, screenshotSrc } = useSelector( + (state: RootState) => state.browser, + ); + + const imgSrc = + screenshotSrc && screenshotSrc.startsWith("data:image/png;base64,") + ? screenshotSrc + : `data:image/png;base64,${screenshotSrc || ""}`; + return (