FoundationAgents/MetaGPT · error · ValueError

Cannot find the answer phrase

Error message

Cannot find the answer phrase "{response}"

What it means

extract_step in metagpt/utils/a11y_tree.py pulls the action out of an LLM response by searching for the first pair of action_splitter fences (default '```'). If the response contains no fenced block, the regex finds nothing and this ValueError fires with the full response embedded in the message.

Solutions

  1. Ensure the LLM response contains the action between triple-backtick fences, e.g. '```click [12]```'.
  2. If the response was truncated, increase max_tokens or reduce prompt size so the fenced block completes.
  3. Make the prompt explicitly require the fence delimiters around the action.
  4. If you already have a bare action string, skip extract_step and pass it straight to execute_action.

Example fix

# before
step = extract_step('click [12]')  # raises: no ``` block

# after
step = extract_step('```click [12]```')  # -> 'click [12]'
Defensive patterns

Strategy: validation

Validate before calling

def has_action_block(response: str, splitter: str = "```") -> bool:
    return splitter in response

Try / catch

try:
    step = extract_step(response)
except ValueError:
    # response malformed/truncated: re-ask the model, possibly with raised max_tokens

Prevention

When it happens

Trigger: extract_step('click [12]') — action sent without ``` fences; response truncated by token limits before the closing fence; model wrapping the action in single backticks or quotes; custom action_splitter that never appears in the response.

Common situations: LLM omits the markdown fence, answers in prose ('I would click...'), or gets cut off mid-action by max_tokens. Also occurs when the caller passes a raw action string directly instead of a full model response.

Related errors


AI-assisted analysis of FoundationAgents/MetaGPT@11cdf466d0 (2026-08-14). Data as JSON: /api/errors/29f152730751bc9f. Report an issue: GitHub.

Appendix: source

Thrown at metagpt/utils/a11y_tree.py:174

    except Exception as e:
        raise ValueError("Element not found") from e


async def get_element_center(node_info):
    x, y, width, height = node_info["x"], node_info["y"], node_info["width"], node_info["height"]
    center_x = x + width / 2
    center_y = y + height / 2
    return center_x, center_y


def extract_step(response: str, action_splitter: str = "```") -> str:
    # find the first occurence of action
    pattern = rf"{action_splitter}((.|\n)*?){action_splitter}"
    match = re.search(pattern, response)
    if match:
        return match.group(1).strip()
    else:
        raise ValueError(f'Cannot find the answer phrase "{response}"')


async def get_bounding_rect(cdp_session, backend_node_id: str):
    try:
        remote_object = await cdp_session.send("DOM.resolveNode", {"backendNodeId": int(backend_node_id)})
        remote_object_id = remote_object["object"]["objectId"]
        response = await cdp_session.send(
            "Runtime.callFunctionOn",
            {
                "objectId": remote_object_id,
                "functionDeclaration": """
                    function() {
                        if (this.nodeType == 3) {
                            var range = document.createRange();
                            range.selectNode(this);
                            var rect = range.getBoundingClientRect().toJSON();
                            range.detach();
                            return rect;

View on GitHub (pinned to 11cdf466d0)