Minecraft game add skill_manager & ignore bug fix

This commit is contained in:
yuymf 2023-10-02 09:41:19 +08:00
parent dfc59422d9
commit d41cf7cad6
25 changed files with 941 additions and 81 deletions

View file

@ -182,10 +182,15 @@ class ActionDeveloper(Base):
return len(self._rc.news)
async def generate_action_code(self, human_msg, system_msg, *args, **kwargs):
code = await GenerateActionCode().run(human_msg, system_msg, *args, **kwargs)
code, program_name = await GenerateActionCode().run(
human_msg, system_msg, *args, **kwargs
)
# logger.warning(type(code))
# logger.info(f"Code is Here:{code}")
self.perform_game_info_callback(code, self.game_memory.update_code)
self.perform_game_info_callback(
program_name, self.game_memory.update_program_name
)
msg = Message(
content=f"{code}",
instruct_content="generate_action_code",

View file

@ -50,8 +50,9 @@ class CriticReviewer(Base):
for i, (event_type, event) in enumerate(events):
if event_type == "onError":
print(f"\033[31mCritic Agent: Error occurs {event['onError']}\033[0m")
return None
logger.info(f"\033[31mCritic Agent: Error occurs {event['onError']}\033[0m")
# return None
return HumanMessage(content="")
observation = ""
@ -119,6 +120,7 @@ class CriticReviewer(Base):
self.maintain_actions(todo)
# 获取最新的游戏周边信息
events = await self._obtain_events()
self.perform_game_info_callback(events, self.game_memory.update_event) # update chest_memory / chest observation
context = self.game_memory.context
task = self.game_memory.current_task
chest_observation = self.game_memory.chest_observation

View file

@ -346,7 +346,7 @@ class CurriculumDesigner(Base):
updated_failed_tasks.remove(task)
self.game_memory.completed_tasks = updated_completed_tasks
self.failed_tasks = updated_failed_tasks
self.game_memory.failed_tasks = updated_failed_tasks
# dump to json
with open(f"{CKPT_DIR}/curriculum/completed_tasks.json", "w") as f:

View file

@ -6,55 +6,107 @@ from metagpt.logs import logger
from metagpt.roles.minecraft.minecraft_base import Minecraft as Base
from metagpt.roles.minecraft.minecraft_base import agent_registry
from metagpt.schema import Message, HumanMessage, SystemMessage
from metagpt.actions.minecraft.manage_skills import GenerateSkillDescription, RetrieveSkills, AddNewSkills
from metagpt.actions.minecraft.manage_skills import (
GenerateSkillDescription,
RetrieveSkills,
AddNewSkills,
)
from metagpt.actions.minecraft.review_task import VerifyTask
from metagpt.actions.minecraft.design_curriculumn import DesignCurriculum
from metagpt.utils.minecraft import load_prompt
@agent_registry.register("skill_manager")
class SkillManager(Base):
def __init__(
self,
name: str = "John",
profile: str = "Skills Management Specialist",
goal: str = "To oversee and optimize the acquisition, development, and utilization of skills within the organization, ensuring workforce competence and efficiency.",
constraints: str = "Resource allocation, training budgets, and alignment with organizational goals.",
self,
name: str = "John",
profile: str = "Skills Management Specialist",
goal: str = "To oversee and optimize the acquisition, development, and utilization of skills within the organization, ensuring workforce competence and efficiency.",
constraints: str = "Resource allocation, training budgets, and alignment with organizational goals.",
) -> None:
super().__init__(name, profile, goal, constraints)
# Initialize actions specific to the SkillManager role
self._init_actions([RetrieveSkills, GenerateSkillDescription]) #AddNewSkills])#先去掉add
# Set events or actions the SkillManager should watch or be aware of
self._watch([DesignCurriculum, VerifyTask, RetrieveSkills, GenerateSkillDescription])
async def retrieve_skills(self, human_msg, system_msg, *args, **kwargs):
skills = await RetrieveSkills().run(human_msg)
logger.info(
f"\033[33mRender Action Agent system message with {len(skills)} skills\033[0m"
self._watch(
[DesignCurriculum, VerifyTask, RetrieveSkills, GenerateSkillDescription]
)
return Message(content=f"{skills}", instruct_content="retrieve_skills", role=self.profile,
send_to=agent_registry.entries["action_developer"]()._setting.name)
def encapsule_message(self, program_code, program_name, *args, **kwargs):
human_msg = self.render_system_message(load_prompt("skill"))
system_msg = self.render_human_message(
program_code + "\n\n" + f"The main function is `{program_name}`."
)
return {"system_msg": [system_msg.content], "human_msg": human_msg.content}
async def retrieve_skills(self, query, *args, **kwargs):
skills = await RetrieveSkills().run(query)
logger.info(f"Render Action Agent system message with {len(skills)} skills")
return Message(content=f"{skills}", instruct_content="retrieve_skills",
role=self.profile, send_to=agent_registry.entries["action_developer"]()._setting.name)
# return Message(
# content=f"{skills}", instruct_content="retrieve_skills", role=self.profile
# ) # Unit test only
async def generate_skill_descp(self, human_msg, system_msg, *args, **kwargs):
desp = await GenerateSkillDescription().run(human_msg)
return Message(content=f"{desp}", instruct_content="generate_skill_descp", role=self.profile)
async def handle_add_new_skills(self, human_msg, system_msg, *args, **kwargs):
new_skills = await AddNewSkills().run(human_msg)
return Message(content=f"", instruct_content="generate_skill_descp", role=self.profile)
program_name = self.game_memory.program_name
desp = await GenerateSkillDescription().run(program_name, human_msg, system_msg)
self.perform_game_info_callback(desp, self.game_memory.update_skill_desp)
return Message(
content=f"{desp}",
instruct_content="generate_skill_descp",
role=self.profile,
)
async def handle_add_new_skills(
self, task, program_name, program_code, skills, *args, **kwargs
):
skill_desp = self.game_memory.skill_desp
new_skills_info = await AddNewSkills().run(
task, program_name, program_code, skills, skill_desp
)
self.perform_game_info_callback(new_skills_info, self.game_memory.append_skill)
return Message(
content=f"{new_skills_info}",
instruct_content="handle_add_new_skills",
role=self.profile,
)
async def _act(self) -> Message:
todo = self._rc.todo
logger.debug(f"Todo is {todo}")
self.maintain_actions(todo)
# 获取最新的游戏周边信息
context = self.game_memory.context
msg = self._rc.memory.get(k=1)[0]
message = self.encapsule_message(context)
task = self.game_memory.current_task
event_summary = self.game_memory.event_summary
code = self.game_memory.code
program_code = code["program_code"]
program_name = self.game_memory.program_name
skills = self.game_memory.skills
# TODO: mv to PlayerAction
RetrieveSkills.set_skills(skills)
AddNewSkills.set_skills(skills)
# msg = self._rc.memory.get(k=1)[0]
retrieve_skills_message_step1 = {"query": context}
retrieve_skills_message_step2 = {"query": context + "\n\n" + event_summary}
generate_skill_message = self.encapsule_message(program_code, program_name)
add_new_skills_message = {
"task": task,
"program_name": program_name,
"program_code": program_code,
"skills": skills,
}
handler_map = {
DesignCurriculum: self.retrieve_skills,
RetrieveSkills: self.retrieve_skills,
@ -63,10 +115,18 @@ class SkillManager(Base):
}
handler = handler_map.get(type(todo))
if handler:
msg = await handler(**message)
if type(todo) == "DesignCurriculum":
msg = await handler(**retrieve_skills_message_step1)
elif type(todo) == "RetrieveSkills":
msg = await handler(**retrieve_skills_message_step2)
elif type(todo) == "GenerateSkillDescription":
msg = await handler(**generate_skill_message)
else:
msg = await handler(**add_new_skills_message)
msg.cause_by = type(todo)
msg.round_id = self.round_id
self._publish_message(msg)
return msg
raise ValueError(f"Unknown todo type: {type(todo)}")