Spaces:
Sleeping
Sleeping
File size: 3,677 Bytes
6a59cd0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# coding: utf-8
# Copyright (c) 2025 inclusionAI.
from typing import Any, Dict, Tuple
from aworld.config import ToolConfig
from aworld.core.common import Observation, ActionModel, ActionResult
from aworld.core.context.base import Context
from aworld.core.event import eventbus
from aworld.core.event.base import Message, Constants, TopicType
from aworld.core.tool.base import ToolFactory, AsyncTool
from aworld.logs.util import logger
from aworld.tools.utils import build_observation
from aworld.tools.human.actions import HumanExecuteAction
@ToolFactory.register(name="human_confirm",
desc="human confirm",
supported_action=HumanExecuteAction)
class HumanTool(AsyncTool):
def __init__(self, conf: ToolConfig, **kwargs) -> None:
"""Init document tool."""
super(HumanTool, self).__init__(conf, **kwargs)
self.cur_observation = None
self.content = None
self.keyframes = []
self.init()
self.step_finished = True
async def reset(self, *, seed: int | None = None, options: Dict[str, str] | None = None) -> Tuple[
Observation, dict[str, Any]]:
await super().reset(seed=seed, options=options)
await self.close()
self.step_finished = True
return build_observation(observer=self.name(),
ability=HumanExecuteAction.HUMAN_CONFIRM.value.name), {}
def init(self) -> None:
self.initialized = True
async def close(self) -> None:
pass
async def finished(self) -> bool:
return self.step_finished
async def do_step(self, actions: list[ActionModel], **kwargs) -> Tuple[
Observation, float, bool, bool, Dict[str, Any]]:
self.step_finished = False
reward = 0.
fail_error = ""
observation = build_observation(observer=self.name(),
ability=HumanExecuteAction.HUMAN_CONFIRM.value.name)
info = {}
try:
if not actions:
raise ValueError("actions is empty")
action = actions[0]
confirm_content = action.params.get("confirm_content", "")
if not confirm_content:
raise ValueError("content invalid")
output, error = await self.human_confirm(confirm_content)
observation.content = output
observation.action_result.append(
ActionResult(is_done=True,
success=False if error else True,
content=f"{output}",
error=f"{error}",
keep=False))
reward = 1.
except Exception as e:
fail_error = str(e)
finally:
self.step_finished = True
info["exception"] = fail_error
info.update(kwargs)
return (observation, reward, kwargs.get("terminated", False),
kwargs.get("truncated", False), info)
async def human_confirm(self, confirm_content):
error = None
self.content = None
try:
self.content = confirm_content
await eventbus.publish(Message(
category=Constants.TASK,
payload=confirm_content,
sender=self.name(),
session_id=Context.instance().session_id,
topic=TopicType.HUMAN_CONFIRM
))
return self.content, error
except Exception as e:
error = str(e)
logger.warning(f"human_confirm error: {str(e)}")
finally:
pass
return self.content, error
|