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; } }
排查与修复方案
修复JSON序列化方式
当前代码用mapper.convertValue(response, Map.class).toString()生成响应字符串,会导致JSON格式异常(比如多余空格、引号转义错误)。Bedrock Agents要求返回标准JSON字符串,替换为:logger.info("Response: " + response); return mapper.writeValueAsString(response);修正messageVersion类型
代码中把messageVersion转成了字符串类型,但Bedrock Agents要求该字段为数值类型1。修改为:ObjectNode response = mapper.createObjectNode(); response.put("messageVersion", 1); // 直接设置数值,无需转字符串 response.set("response", actionResponse);统一错误响应格式
原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
相关产品推荐
相关产品推荐

