From 1558fb86f9d1d355fe7c6535879bfe8ba20a6786 Mon Sep 17 00:00:00 2001 From: Lamont Huffman <61401544+411380764@users.noreply.github.com> Date: Fri, 7 Nov 2025 10:00:43 +0800 Subject: [PATCH] Synchronize Instances from AgentScope (#29) --- browser_use/agent_browser/browser_agent.py | 5 ++- browser_use/agent_browser/main.py | 6 ++-- .../built_in_prompt/promptmodule.py | 12 +++---- .../deep_research_agent.py | 32 ++++++++----------- deep_research/agent_deep_research/main.py | 8 ++--- deep_research/agent_deep_research/utils.py | 24 ++++++-------- games/game_werewolves/game.py | 32 +++++++++++-------- games/game_werewolves/main.py | 17 +++++----- games/game_werewolves/prompt.py | 6 ++-- 9 files changed, 69 insertions(+), 73 deletions(-) diff --git a/browser_use/agent_browser/browser_agent.py b/browser_use/agent_browser/browser_agent.py index d9d5630..ebf4d1c 100644 --- a/browser_use/agent_browser/browser_agent.py +++ b/browser_use/agent_browser/browser_agent.py @@ -21,8 +21,7 @@ from agentscope.token import TokenCounterBase, OpenAITokenCounter _BROWSER_AGENT_DEFAULT_SYS_PROMPT = ( "You are a helpful browser automation assistant. " "You can navigate websites, take screenshots, and interact with web pages." - "Always describe what you see and meta_planner_agent" - " your next steps clearly. " + "Always describe what you see and plan your next steps clearly. " "When taking actions, explain what you're doing and why." ) _BROWSER_AGENT_REASONING_PROMPT = ( @@ -30,7 +29,7 @@ _BROWSER_AGENT_REASONING_PROMPT = ( "The snapshot (and screenshot) of the current webpage is (are) given " "below. Since you can only view the latest webpage, " "you must promptly summarize current status, record required data, " - "and meta_planner_agent your next steps." + "and plan your next steps." ) diff --git a/browser_use/agent_browser/main.py b/browser_use/agent_browser/main.py index e2dcd25..d05d22f 100644 --- a/browser_use/agent_browser/main.py +++ b/browser_use/agent_browser/main.py @@ -3,12 +3,12 @@ import asyncio import os -from agentscope.agent import UserAgent from agentscope.formatter import DashScopeChatFormatter -from agentscope.mcp import StdIOStatefulClient from agentscope.memory import InMemoryMemory from agentscope.model import DashScopeChatModel from agentscope.tool import Toolkit +from agentscope.mcp import StdIOStatefulClient +from agentscope.agent import UserAgent from browser_agent import BrowserAgent # pylint: disable=C0411 @@ -69,7 +69,7 @@ if __name__ == "__main__": print( "The browser agent will use " "playwright-mcp (https://github.com/microsoft/playwright-mcp)." - "Make sure the MCP server can be installed " + "Make sure the MCP server is can be install " "by `npx @playwright/mcp@latest`", ) diff --git a/deep_research/agent_deep_research/built_in_prompt/promptmodule.py b/deep_research/agent_deep_research/built_in_prompt/promptmodule.py index af21193..54794cf 100644 --- a/deep_research/agent_deep_research/built_in_prompt/promptmodule.py +++ b/deep_research/agent_deep_research/built_in_prompt/promptmodule.py @@ -20,7 +20,7 @@ class SubtasksDecomposition(BaseModel): working_plan: str = Field( description=( "A logically ordered step-by-step working " - "meta_planner_agent (3-5 steps), each step starting with " + "plan (3-5 steps), each step starting with " "its number (1., 2., etc), including both " "core and expansion steps. Expanded steps " "should be clearly marked with (EXPANSION) " @@ -85,7 +85,7 @@ class ReflectFailure(BaseModel): "subtask needs to be rephrased due " "to a design flaw or misunderstanding. " "If rephrasing is needed, provide the " - "modified working meta_planner_agent with only the " + "modified working plan with only the " "inappropriate subtask replaced by its " "improved version." ), @@ -95,14 +95,14 @@ class ReflectFailure(BaseModel): "properties": { "need_rephrase": { "type": "boolean", - "description": "Set to 'true' if the failed" - " subtask needs to be rephrased due to a design " + "description": "Set to 'true' if the failed subtask " + "needs to be rephrased due to a design " "flaw or misunderstanding; otherwise, 'false'.", }, "rephrased_plan": { "type": "string", - "description": "The modified working " - "meta_planner_agent with only the inappropriate " + "description": "The modified working plan " + "with only the inappropriate " "subtask replaced by its improved version. If no " "rephrasing is needed, provide an empty string.", }, diff --git a/deep_research/agent_deep_research/deep_research_agent.py b/deep_research/agent_deep_research/deep_research_agent.py index c24c9e8..a3fc880 100644 --- a/deep_research/agent_deep_research/deep_research_agent.py +++ b/deep_research/agent_deep_research/deep_research_agent.py @@ -8,9 +8,7 @@ import asyncio from typing import Type, Optional, Any, Tuple from datetime import datetime from copy import deepcopy - import shortuuid - from pydantic import BaseModel from built_in_prompt.promptmodule import ( @@ -25,6 +23,7 @@ from utils import ( get_dynamic_tool_call_json, get_structure_output, ) + from agentscope import logger, setup_logger from agentscope.mcp import StatefulClientBase from agentscope.agent import ReActAgent @@ -43,6 +42,7 @@ from agentscope.message import ( ToolResultBlock, ) + _DEEP_RESEARCH_AGENT_DEFAULT_SYS_PROMPT = "You're a helpful assistant." _LOG_DIR = os.path.join(os.path.dirname(__file__), "log") @@ -196,7 +196,7 @@ class DeepResearchAgent(ReActAgent): SubTaskItem(objective=self.user_query), ) - # Identify the expected output and generate a meta_planner_agent + # Identify the expected output and generate a plan await self.decompose_and_expand_subtask() msg.content += ( f"\nExpected Output:\n{self.current_subtask[0].knowledge_gaps}" @@ -214,7 +214,7 @@ class DeepResearchAgent(ReActAgent): ) for _ in range(self.max_iters): - # Generate the working meta_planner_agent first + # Generate the working plan first if not self.current_subtask[-1].working_plan: await self.decompose_and_expand_subtask() @@ -497,23 +497,20 @@ class DeepResearchAgent(ReActAgent): async def decompose_and_expand_subtask(self) -> ToolResponse: """Identify the knowledge gaps of the current subtask and generate a - working meta_planner_agent by subtask decomposition. - The working meta_planner_agent includes + working plan by subtask decomposition. The working plan includes necessary steps for task completion and expanded steps. Returns: ToolResponse: - The knowledge gaps and working meta_planner_agent - of the current subtask in JSON format. + The knowledge gaps and working plan of the current subtask + in JSON format. """ if len(self.current_subtask) <= self.max_depth: decompose_sys_prompt = self.prompt_dict["decompose_sys_prompt"] previous_plan = "" for i, subtask in enumerate(self.current_subtask): - previous_plan += ( - f"The {i}-th meta_planner_agent: {subtask.working_plan}\n" - ) + previous_plan += f"The {i}-th plan: {subtask.working_plan}\n" previous_plan_inst = self.prompt_dict[ "previous_plan_inst" ].format_map( @@ -716,7 +713,7 @@ class DeepResearchAgent(ReActAgent): async def summarize_intermediate_results(self) -> ToolResponse: """Summarize the intermediate results into a report when a step - in working meta_planner_agent is completed. + in working plan is completed. Returns: ToolResponse: @@ -740,9 +737,7 @@ class DeepResearchAgent(ReActAgent): "user", self.prompt_dict["summarize_hint"].format_map( { - "meta_planner_agent": self.current_subtask[ - -1 - ].working_plan, + "plan": self.current_subtask[-1].working_plan, }, ), role="user", @@ -953,12 +948,11 @@ class DeepResearchAgent(ReActAgent): async def reflect_failure(self) -> ToolResponse: """Reflect on the failure of the action and determine to rephrase - the meta_planner_agent or deeper decompose the current step. + the plan or deeper decompose the current step. Returns: ToolResponse: - The reflection about meta_planner_agent - rephrasing and subtask decomposition. + The reflection about plan rephrasing and subtask decomposition. """ reflect_sys_prompt = self.prompt_dict["reflect_sys_prompt"] conversation_history = "" @@ -974,7 +968,7 @@ class DeepResearchAgent(ReActAgent): reflect_inst = self.prompt_dict["reflect_instruction"].format_map( { "conversation_history": conversation_history, - "meta_planner_agent": self.current_subtask[-1].working_plan, + "plan": self.current_subtask[-1].working_plan, }, ) try: diff --git a/deep_research/agent_deep_research/main.py b/deep_research/agent_deep_research/main.py index 5db2e10..7dca3b2 100644 --- a/deep_research/agent_deep_research/main.py +++ b/deep_research/agent_deep_research/main.py @@ -3,14 +3,14 @@ import asyncio import os +from deep_research_agent import DeepResearchAgent + from agentscope import logger from agentscope.formatter import DashScopeChatFormatter -from agentscope.mcp import StdIOStatefulClient from agentscope.memory import InMemoryMemory -from agentscope.message import Msg from agentscope.model import DashScopeChatModel - -from deep_research_agent import DeepResearchAgent +from agentscope.message import Msg +from agentscope.mcp import StdIOStatefulClient async def main(user_query: str) -> None: diff --git a/deep_research/agent_deep_research/utils.py b/deep_research/agent_deep_research/utils.py index 921829f..75395dd 100644 --- a/deep_research/agent_deep_research/utils.py +++ b/deep_research/agent_deep_research/utils.py @@ -8,6 +8,7 @@ from pydantic import BaseModel from agentscope.tool import Toolkit, ToolResponse + TOOL_RESULTS_MAX_WORDS = 5000 @@ -219,7 +220,7 @@ def load_prompt_dict() -> dict: prompt_dict["reasoning_prompt"] = ( "## Current Subtask:\n{objective}\n" - "## Working Plan:\n{meta_planner_agent}\n" + "## Working Plan:\n{plan}\n" "{knowledge_gap}\n" "## Research Depth:\n{depth}" ) @@ -281,17 +282,14 @@ def load_prompt_dict() -> dict: prompt_dict["summarize_hint"] = ( "Based on your work history above, examine which step in the " - "following working meta_planner_agent has been " - "completed. Mark the completed " + "following working plan has been completed. Mark the completed " "step with [DONE] at the end of its line (e.g., k. step k [DONE]) " "and leave the uncompleted steps unchanged. You MUST return only " - "the updated meta_planner_agent, preserving exactly " - "the same format as the " - "original meta_planner_agent. Do not include any " - "explanations, reasoning, " + "the updated plan, preserving exactly the same format as the " + "original plan. Do not include any explanations, reasoning, " "or section headers such as '## Working Plan:', just output the" - "updated meta_planner_agent itself." - "\n\n## Working Plan:\n{meta_planner_agent}" + "updated plan itself." + "\n\n## Working Plan:\n{plan}" ) prompt_dict["summarize_inst"] = ( @@ -307,19 +305,17 @@ def load_prompt_dict() -> dict: "following report that consolidates and summarizes the essential " "findings:\n {intermediate_report}\n\n" "Such report has been saved to the {report_path}. " - "I will now **proceed to the next item** " - "in the working meta_planner_agent." + "I will now **proceed to the next item** in the working plan." ) prompt_dict["save_report_hint"] = ( - "The milestone results of the current " - "item in working meta_planner_agent " + "The milestone results of the current item in working plan " "are summarized into the following report:\n{intermediate_report}" ) prompt_dict["reflect_instruction"] = ( "## Work History:\n{conversation_history}\n" - "## Working Plan:\n{meta_planner_agent}\n" + "## Working Plan:\n{plan}\n" ) prompt_dict["subtask_complete_hint"] = ( diff --git a/games/game_werewolves/game.py b/games/game_werewolves/game.py index 4a80f6e..e7e08e6 100644 --- a/games/game_werewolves/game.py +++ b/games/game_werewolves/game.py @@ -2,31 +2,37 @@ # pylint: disable=too-many-branches, too-many-statements, no-name-in-module """A werewolf game implemented by agentscope.""" import numpy as np -from agentscope.agent import ReActAgent -from agentscope.pipeline import MsgHub, fanout_pipeline, sequential_pipeline -from prompt import EnglishPrompts as Prompts + from utils import ( - MAX_DISCUSSION_ROUND, - MAX_GAME_ROUND, - EchoAgent, - Players, majority_vote, names_to_str, + EchoAgent, + MAX_GAME_ROUND, + MAX_DISCUSSION_ROUND, + Players, ) - from structured_model import ( DiscussionModel, - WitchResurrectModel, - get_hunter_model, - get_poison_model, - get_seer_model, get_vote_model, + get_poison_model, + WitchResurrectModel, + get_seer_model, + get_hunter_model, ) +from prompt import EnglishPrompts as Prompts # Uncomment the following line to use Chinese prompts # from prompt import ChinesePrompts as Prompts +from agentscope.agent import ReActAgent +from agentscope.pipeline import ( + MsgHub, + sequential_pipeline, + fanout_pipeline, +) + + moderator = EchoAgent() @@ -113,7 +119,7 @@ async def werewolves_game(agents: list[ReActAgent]) -> None: names_to_str(players.current_alive), ), ), - name="game_werewolves", + name="werewolves", ) as werewolves_hub: # Discussion n_werewolves = len(players.werewolves) diff --git a/games/game_werewolves/main.py b/games/game_werewolves/main.py index 4b62323..26345ca 100644 --- a/games/game_werewolves/main.py +++ b/games/game_werewolves/main.py @@ -4,15 +4,16 @@ import asyncio import os +from game import werewolves_game + from agentscope.agent import ReActAgent from agentscope.formatter import DashScopeMultiAgentFormatter from agentscope.model import DashScopeChatModel from agentscope.session import JSONSession -from game import werewolves_game def get_official_agents(name: str) -> ReActAgent: - """Get the official game_werewolves game agents.""" + """Get the official werewolves game agents.""" agent = ReActAgent( name=name, sys_prompt=f"""You're a werewolf game player named {name}. @@ -21,9 +22,9 @@ def get_official_agents(name: str) -> ReActAgent: Your target is to win the game with your teammates as much as possible. # GAME RULES -- In werewolf game, players are divided into three game_werewolves, three villagers, one seer, one hunter and one witch. +- In werewolf game, players are divided into three werewolves, three villagers, one seer, one hunter and one witch. - Werewolves: kill one player each night, and must hide identity during the day. - - Villagers: ordinary players without special abilities, try to identify and eliminate game_werewolves. + - Villagers: ordinary players without special abilities, try to identify and eliminate werewolves. - Seer: A special villager who can check one player's identity each night. - Witch: A special villager with two one-time-use potions: a healing potion to save a player from being killed at night, and a poison to eliminate one player at night. - Hunter: A special villager who can take one player down with them when they are eliminated. @@ -39,18 +40,18 @@ Your target is to win the game with your teammates as much as possible. # GAME GUIDANCE - Try your best to win the game with your teammates, tricks, lies, and deception are all allowed, e.g. pretending to be a different role. - During discussion, don't be political, be direct and to the point. -- The day phase voting provides important clues. For example, the game_werewolves may vote together, attack the seer, etc. +- The day phase voting provides important clues. For example, the werewolves may vote together, attack the seer, etc. ## GAME GUIDANCE FOR WEREWOLF - Seer is your greatest threat, who can check one player's identity each night. Analyze players' speeches, find out the seer and eliminate him/her will greatly increase your chances of winning. -- In the first night, making random choices is common for game_werewolves since no information is available. +- In the first night, making random choices is common for werewolves since no information is available. - Pretending to be other roles (seer, witch or villager) is a common strategy to hide your identity and mislead other villagers in the day phase. - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. ## GAME GUIDANCE FOR SEER -- Seer is very important to villagers, exposing yourself too early may lead to being targeted by game_werewolves. +- Seer is very important to villagers, exposing yourself too early may lead to being targeted by werewolves. - Your ability to check one player's identity is crucial. - The outcome of the night phase provides important clues. For example, if witch uses the healing or poison potion, if the dead player is hunter, etc. Use this information to adjust your strategy. ## GAME GUIDANCE FOR WITCH -- Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected game_werewolves. +- Witch has two powerful potions, use them wisely to protect key villagers or eliminate suspected werewolves. - The outcome of the night phase provides important clues. For example, if the dead player is hunter, etc. Use this information to adjust your strategy. ## GAME GUIDANCE FOR HUNTER - Using your ability in day phase will expose your role (since only hunter can take one player down) diff --git a/games/game_werewolves/prompt.py b/games/game_werewolves/prompt.py index c49e5f7..38427fd 100644 --- a/games/game_werewolves/prompt.py +++ b/games/game_werewolves/prompt.py @@ -108,13 +108,13 @@ class EnglishPrompts: to_all_wolf_win = ( "There are {n_alive} players alive, and {n_werewolves} of them are " - "game_werewolves. " - "The game is over and game_werewolves win๐Ÿบ๐ŸŽ‰!" + "werewolves. " + "The game is over and werewolves win๐Ÿบ๐ŸŽ‰!" "In this game, the true roles of all players are: {true_roles}" ) to_all_village_win = ( - "All the game_werewolves have been eliminated." + "All the werewolves have been eliminated." "The game is over and villagers win๐Ÿ˜๏ธ๐ŸŽ‰!" "In this game, the true roles of all players are: {true_roles}" )