replace config2 other with extra

This commit is contained in:
better629 2024-04-02 16:13:08 +08:00
parent 5300bca6ca
commit 4f550a7469
8 changed files with 35 additions and 30 deletions

View file

@ -40,19 +40,17 @@ def startup(
),
device_id: str = typer.Option(default="emulator-5554", help="The Android device_id"),
):
config.set_other(
{
"stage": stage,
"mode": mode,
"app_name": app_name,
"task_desc": task_desc,
"refine_doc": refine_doc,
"min_dist": min_dist,
"android_screenshot_dir": android_screenshot_dir,
"android_xml_dir": android_xml_dir,
"device_id": device_id,
}
)
config.extra = {
"stage": stage,
"mode": mode,
"app_name": app_name,
"task_desc": task_desc,
"refine_doc": refine_doc,
"min_dist": min_dist,
"android_screenshot_dir": android_screenshot_dir,
"android_xml_dir": android_xml_dir,
"device_id": device_id,
}
team = Team(
env=AndroidEnv(

View file

@ -75,7 +75,7 @@ class Config(CLIParams, YamlModel):
iflytek_api_key: str = ""
azure_tts_subscription_key: str = ""
azure_tts_region: str = ""
other: dict = dict() # other dict
_extra: dict = dict() # extra config dict
@classmethod
def from_home(cls, path):
@ -128,11 +128,13 @@ class Config(CLIParams, YamlModel):
self.reqa_file = reqa_file
self.max_auto_summarize_code = max_auto_summarize_code
def set_other(self, other: dict):
self.other = other
@property
def extra(self):
return self._extra
def get_other(self, key: str, default_value: str = None):
return self.other.get(key, default_value)
@extra.setter
def extra(self, value: dict):
self._extra = value
def get_openai_llm(self) -> Optional[LLMConfig]:
"""Get OpenAI LLMConfig by name. If no OpenAI, raise Exception"""

View file

@ -55,6 +55,7 @@ class ManualRecord(Action):
self.task_desc_path.write_text(task_desc)
step = 0
extra_config = config.extra
while True:
step += 1
screenshot_path: Path = env.observe(
@ -68,12 +69,12 @@ class ManualRecord(Action):
if not screenshot_path.exists() or not xml_path.exists():
return AndroidActionOutput(action_state=RunState.FAIL)
elem_list = elem_list_from_xml_tree(xml_path, self.useless_list, config.get_other("min_dist"))
elem_list = elem_list_from_xml_tree(xml_path, self.useless_list, extra_config.get("min_dist", 30))
screenshot_labeled_path = Path(self.screenshot_after_path).joinpath(f"{step}_labeled.png")
labeled_img = draw_bbox_multi(screenshot_path, screenshot_labeled_path, elem_list)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.namedWindow("image", cv2.WINDOW_NORMAL)
cv2.imshow("image", labeled_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

View file

@ -45,6 +45,7 @@ class ParseRecord(Action):
path.mkdir(parents=True, exist_ok=True)
task_desc = self.task_desc_path.read_text()
extra_config = config.extra
with open(self.record_path, "r") as record_file:
record_step_count = len(record_file.readlines()) - 1
@ -90,7 +91,7 @@ class ParseRecord(Action):
continue
if doc_content[action_type]:
if config.get_other("doc_refine"):
if extra_config.get("doc_refine", False):
refine_context = refine_doc_suffix.format(old_doc=doc_content[action_type])
context += refine_context
logger.info(

View file

@ -101,6 +101,7 @@ next action. You should always prioritize these documented elements for interact
grid_on: bool,
env: AndroidEnv,
):
extra_config = config.extra
for path in [task_dir, docs_dir]:
path.mkdir(parents=True, exist_ok=True)
screenshot_path: Path = env.observe(
@ -125,7 +126,7 @@ next action. You should always prioritize these documented elements for interact
bbox = e.bbox
center_ = (bbox[0][0] + bbox[1][0]) // 2, (bbox[0][1] + bbox[1][1]) // 2
dist = (abs(center[0] - center_[0]) ** 2 + abs(center[1] - center_[1]) ** 2) ** 0.5
if dist <= config.get_other("min_dist"):
if dist <= extra_config.get("min_dist", 30):
close = True
break
if not close:

View file

@ -80,6 +80,7 @@ class SelfLearnAndReflect(Action):
async def run_self_learn(
self, round_count: int, task_desc: str, last_act: str, task_dir: Path, env: AndroidEnv
) -> AndroidActionOutput:
extra_config = config.extra
screenshot_path: Path = env.observe(
EnvObsParams(obs_type=EnvObsType.GET_SCREENSHOT, ss_name=f"{round_count}_before", local_save_dir=task_dir)
)
@ -89,7 +90,7 @@ class SelfLearnAndReflect(Action):
if not screenshot_path.exists() or not xml_path.exists():
return AndroidActionOutput(action_state=RunState.FAIL)
elem_list = elem_list_from_xml_tree(xml_path, self.useless_list, config.get_other("min_dist"))
elem_list = elem_list_from_xml_tree(xml_path, self.useless_list, extra_config.get("min_dist", 30))
screenshot_before_labeled_path = task_dir.joinpath(f"{round_count}_before_labeled.png")
draw_bbox_multi(screenshot_path, screenshot_before_labeled_path, elem_list)

View file

@ -40,8 +40,9 @@ class AndroidAssistant(Role):
super().__init__(**data)
self._watch([UserRequirement, AndroidActionOutput])
self.task_desc = config.get_other("task_desc", "Just explore any app in this phone!")
app_name = config.get_other("app_name", "demo")
extra_config = config.extra
self.task_desc = extra_config.get("task_desc", "Just explore any app in this phone!")
app_name = extra_config.get("app_name", "demo")
data_dir = self.output_root_dir.absolute().joinpath("output") or EXAMPLE_PATH.joinpath(
"android_assistant/output"
)
@ -50,8 +51,8 @@ class AndroidAssistant(Role):
"""Firstly, we decide the state with user config, further, we can do it automatically, like if it's new app,
run the learn first and then do the act stage or learn it during the action.
"""
stage = config.get_other("stage")
mode = config.get_other("mode")
stage = extra_config.get("stage")
mode = extra_config.get("mode")
if stage == "learn" and mode == "manual":
# choose ManualRecord and then run ParseRecord
# Remember, only run each action only one time, no need to run n_round.

View file

@ -10,6 +10,7 @@ from xml.etree.ElementTree import Element, iterparse
import cv2
import pyshine as ps
from metagpt.config2 import config
from metagpt.ext.android_assistant.utils.schema import (
ActionOp,
AndroidElement,
@ -47,6 +48,7 @@ def get_id_from_element(elem: Element) -> str:
def traverse_xml_tree(xml_path: Path, elem_list: list[AndroidElement], attrib: str, add_index=False):
path = []
extra_config = config.extra
for event, elem in iterparse(str(xml_path), ["start", "end"]):
if event == "start":
path.append(elem)
@ -68,9 +70,7 @@ def traverse_xml_tree(xml_path: Path, elem_list: list[AndroidElement], attrib: s
bbox = e.bbox
center_ = (bbox[0][0] + bbox[1][0]) // 2, (bbox[0][1] + bbox[1][1]) // 2
dist = (abs(center[0] - center_[0]) ** 2 + abs(center[1] - center_[1]) ** 2) ** 0.5
# TODO Modify config to default 30. It should be modified back config after single action test
# if dist <= config.get_other("min_dist"):
if dist <= 30:
if dist <= extra_config.get("min_dist", 30):
close = True
break
if not close: