fix cua bug (#3459)
This commit is contained in:
@@ -393,6 +393,7 @@ class ActionHandler:
|
|||||||
) -> list[ActionResult]:
|
) -> list[ActionResult]:
|
||||||
LOG.info("Handling action", action=action)
|
LOG.info("Handling action", action=action)
|
||||||
actions_result: list[ActionResult] = []
|
actions_result: list[ActionResult] = []
|
||||||
|
llm_caller = LLMCallerManager.get_llm_caller(task.task_id)
|
||||||
try:
|
try:
|
||||||
if action.action_type in ActionHandler._handled_action_types:
|
if action.action_type in ActionHandler._handled_action_types:
|
||||||
invalid_web_action_check = check_for_invalid_web_action(action, page, scraped_page, task, step)
|
invalid_web_action_check = check_for_invalid_web_action(action, page, scraped_page, task, step)
|
||||||
@@ -411,28 +412,6 @@ class ActionHandler:
|
|||||||
handler = ActionHandler._handled_action_types[action.action_type]
|
handler = ActionHandler._handled_action_types[action.action_type]
|
||||||
results = await handler(action, page, scraped_page, task, step)
|
results = await handler(action, page, scraped_page, task, step)
|
||||||
actions_result.extend(results)
|
actions_result.extend(results)
|
||||||
llm_caller = LLMCallerManager.get_llm_caller(task.task_id)
|
|
||||||
if not results or not isinstance(actions_result[-1], ActionSuccess):
|
|
||||||
if llm_caller and action.tool_call_id:
|
|
||||||
# add failure message to the llm caller
|
|
||||||
tool_call_result = {
|
|
||||||
"type": "tool_result",
|
|
||||||
"tool_use_id": action.tool_call_id,
|
|
||||||
"content": "Tool execution failed",
|
|
||||||
}
|
|
||||||
llm_caller.add_tool_result(tool_call_result)
|
|
||||||
LOG.info("Tool call result", tool_call_result=tool_call_result, action=action)
|
|
||||||
return actions_result
|
|
||||||
|
|
||||||
if llm_caller and action.tool_call_id:
|
|
||||||
tool_call_result = {
|
|
||||||
"type": "tool_result",
|
|
||||||
"tool_use_id": action.tool_call_id,
|
|
||||||
"content": "Tool executed successfully",
|
|
||||||
}
|
|
||||||
LOG.info("Tool call result", tool_call_result=tool_call_result, action=action)
|
|
||||||
llm_caller.add_tool_result(tool_call_result)
|
|
||||||
|
|
||||||
# do the teardown
|
# do the teardown
|
||||||
teardown = ActionHandler._teardown_action_types.get(action.action_type)
|
teardown = ActionHandler._teardown_action_types.get(action.action_type)
|
||||||
if teardown:
|
if teardown:
|
||||||
@@ -470,17 +449,31 @@ class ActionHandler:
|
|||||||
LOG.exception("Unhandled exception in action handler", action=action)
|
LOG.exception("Unhandled exception in action handler", action=action)
|
||||||
actions_result.append(ActionFailure(e))
|
actions_result.append(ActionFailure(e))
|
||||||
finally:
|
finally:
|
||||||
|
tool_result_content = ""
|
||||||
|
|
||||||
if actions_result and isinstance(actions_result[-1], ActionSuccess):
|
if actions_result and isinstance(actions_result[-1], ActionSuccess):
|
||||||
action.status = ActionStatus.completed
|
action.status = ActionStatus.completed
|
||||||
|
tool_result_content = "Tool executed successfully"
|
||||||
elif actions_result and isinstance(actions_result[-1], ActionAbort):
|
elif actions_result and isinstance(actions_result[-1], ActionAbort):
|
||||||
action.status = ActionStatus.skipped
|
action.status = ActionStatus.skipped
|
||||||
|
tool_result_content = "Tool executed successfully"
|
||||||
else:
|
else:
|
||||||
|
tool_result_content = "Tool execution failed"
|
||||||
# either actions_result is empty or the last action is a failure
|
# either actions_result is empty or the last action is a failure
|
||||||
if not actions_result:
|
if not actions_result:
|
||||||
LOG.warning("Action failed to execute, setting status to failed", action=action)
|
LOG.warning("Action failed to execute, setting status to failed", action=action)
|
||||||
action.status = ActionStatus.failed
|
action.status = ActionStatus.failed
|
||||||
|
|
||||||
await app.DATABASE.create_action(action=action)
|
await app.DATABASE.create_action(action=action)
|
||||||
|
|
||||||
|
if llm_caller and action.tool_call_id:
|
||||||
|
tool_call_result = {
|
||||||
|
"type": "tool_result",
|
||||||
|
"tool_use_id": action.tool_call_id,
|
||||||
|
"content": tool_result_content,
|
||||||
|
}
|
||||||
|
llm_caller.add_tool_result(tool_call_result)
|
||||||
|
|
||||||
return actions_result
|
return actions_result
|
||||||
|
|
||||||
|
|
||||||
@@ -556,8 +549,8 @@ async def handle_click_action(
|
|||||||
)
|
)
|
||||||
LOG.info("Clicked element at location", x=action.x, y=action.y, element_id=element_id, button=action.button)
|
LOG.info("Clicked element at location", x=action.x, y=action.y, element_id=element_id, button=action.button)
|
||||||
if element_id:
|
if element_id:
|
||||||
skyvern_element = await dom.get_skyvern_element_by_id(element_id)
|
if skyvern_element := await dom.safe_get_skyvern_element_by_id(element_id):
|
||||||
if await skyvern_element.navigate_to_a_href(page=page):
|
await skyvern_element.navigate_to_a_href(page=page)
|
||||||
return [ActionSuccess()]
|
return [ActionSuccess()]
|
||||||
|
|
||||||
if action.repeat == 1:
|
if action.repeat == 1:
|
||||||
|
|||||||
@@ -906,3 +906,10 @@ class DomUtil:
|
|||||||
hash_value = self.scraped_page.id_to_element_hash.get(element_id, "")
|
hash_value = self.scraped_page.id_to_element_hash.get(element_id, "")
|
||||||
|
|
||||||
return SkyvernElement(locator, frame_content, element, hash_value)
|
return SkyvernElement(locator, frame_content, element, hash_value)
|
||||||
|
|
||||||
|
async def safe_get_skyvern_element_by_id(self, element_id: str) -> SkyvernElement | None:
|
||||||
|
try:
|
||||||
|
return await self.get_skyvern_element_by_id(element_id)
|
||||||
|
except Exception:
|
||||||
|
LOG.warning("Failed to get skyvern element by id", element_id=element_id, exc_info=True)
|
||||||
|
return None
|
||||||
|
|||||||
Reference in New Issue
Block a user