You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bedrock Agent调用Lambda时响应处理出错求助

Bedrock Agents调用Lambda响应解析失败排查

执行Lambda与Bedrock Agents集成操作时,Agent调用Lambda触发以下错误:

"The server encountered an error processing the Lambda response. Check the Lambda response and retry the request"

已知信息:

  • Agent可正确触发对应动作组和函数
  • Lambda代码逻辑简单,返回结构按AWS官方文档定义编写
  • 响应始终无法被Agent正确解析,Lambda返回的具体响应可查看日志(附图)

问题代码

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.*;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

public class BedrockLambdaHandler implements RequestHandler<Map<String, Object>, String> {

    private static final Logger logger = Logger.getLogger(BedrockLambdaHandler.class.getName());
    private static final ObjectMapper mapper = new ObjectMapper();

    @Override
    public String handleRequest(Map<String, Object> event, Context context) {
        try {
            // Extract fields from the event
            logger.info("Event: " + mapper.convertValue(event, Map.class));
            String actionGroup = event.getOrDefault("actionGroup", "").toString();
            String function = event.getOrDefault("function", "").toString();

            // Construct the response body
            ObjectNode textNode = mapper.createObjectNode();

            if (function.equalsIgnoreCase("add_two_numbers")) {

                Map<String, Object> parameters = extractParametersToMap(event);
                logger.info("add_two_numbers: parameters " + parameters);
                Integer number1 = Integer.parseInt(parameters.get("number1").toString());

                Integer number2 = Integer.parseInt(parameters.get("number2").toString());

                logger.info("add_two_numbers: " + number2 + ", " + number1);
                final int number3 = number1 + number2;

                textNode.put("content", Integer.toString(number3));

            } else if (function.equalsIgnoreCase("get_time")) {

                textNode.put("content", "The time is " + LocalDateTime.now().toString());
            } else {
                textNode.put("content", "Could not perform request");
            }

            JsonNode messageVersion = new IntNode(1);

            ObjectNode responseBody = mapper.createObjectNode();

            ObjectNode functionResponse = mapper.createObjectNode();
            functionResponse.set("responseBody", textNode);

            ObjectNode actionResponse = mapper.createObjectNode();
            actionResponse.put("actionGroup", actionGroup);
            actionResponse.put("function", function);
            actionResponse.set("functionResponse", functionResponse);

            ObjectNode response = mapper.createObjectNode();
            response.put("messageVersion", messageVersion.asText());
            response.set("response", actionResponse);

            logger.info("Response: " + response);
            return mapper.convertValue(response, Map.class).toString();

        } catch (NullPointerException | IllegalArgumentException e) {
            logger.severe("Missing required field: " + e.getMessage());
            return buildErrorResponse(400, "Error: " + e.getMessage());
        } catch (Exception e) {
            logger.severe("Unexpected error: " + e.getMessage());
            return buildErrorResponse(500, "Internal server error");
        }
    }

    private String buildErrorResponse(int statusCode, String body) {
        ObjectNode response = mapper.createObjectNode();
        response.put("statusCode", statusCode);
        response.put("body", body);
        return mapper.convertValue(response, Map.class).toString();
    }

    public static Map<String, Object> extractParametersToMap(Map<String, Object> event) {
        Map<String, Object> paramMap = new HashMap<>();

        JsonNode jsonNode = mapper.valueToTree(event);

        JsonNode paramsNode = jsonNode.get("parameters");

        if (paramsNode != null && paramsNode.isArray()) {
            for (JsonNode param : paramsNode) {
                JsonNode nameNode = param.get("name");
                JsonNode valueNode = param.get("value");

                if (nameNode != null && valueNode != null) {
                    paramMap.put(nameNode.asText(),
                            valueNode.isNumber() ? valueNode.numberValue() : valueNode.asText());
                }
            }
        }

        return paramMap;
    }
}

排查与修复方案

  1. 修复JSON序列化方式
    当前代码用mapper.convertValue(response, Map.class).toString()生成响应字符串,会导致JSON格式异常(比如多余空格、引号转义错误)。Bedrock Agents要求返回标准JSON字符串,替换为:

    logger.info("Response: " + response);
    return mapper.writeValueAsString(response);
    
  2. 修正messageVersion类型
    代码中把messageVersion转成了字符串类型,但Bedrock Agents要求该字段为数值类型1。修改为:

    ObjectNode response = mapper.createObjectNode();
    response.put("messageVersion", 1); // 直接设置数值,无需转字符串
    response.set("response", actionResponse);
    
  3. 统一错误响应格式
    原buildErrorResponse返回的结构不符合Bedrock Agents要求,错误响应也需要遵循成功响应的结构。修改该方法:

    private String buildErrorResponse(String actionGroup, String function, String errorMsg) {
        ObjectNode textNode = mapper.createObjectNode();
        textNode.put("content", errorMsg);
    
        ObjectNode functionResponse = mapper.createObjectNode();
        functionResponse.set("responseBody", textNode);
    
        ObjectNode actionResponse = mapper.createObjectNode();
        actionResponse.put("actionGroup", actionGroup);
        actionResponse.put("function", function);
        actionResponse.set("functionResponse", functionResponse);
    
        ObjectNode response = mapper.createObjectNode();
        response.put("messageVersion", 1);
        response.set("response", actionResponse);
    
        return mapper.writeValueAsString(response);
    }
    

    同时在catch块中调用修改后的方法:

    catch (NullPointerException | IllegalArgumentException e) {
        logger.severe("Missing required field: " + e.getMessage());
        return buildErrorResponse(actionGroup, function, "Error: " + e.getMessage());
    } catch (Exception e) {
        logger.severe("Unexpected error: " + e.getMessage());
        return buildErrorResponse(actionGroup, function, "Internal server error");
    }
    

内容的提问来源于stack exchange,提问作者IsaacK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:22:37