Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions aws_lambda_powertools/event_handler/bedrock_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,17 @@ def lambda_handler(event, context):

current_event: BedrockAgentEvent

def __init__(self, debug: bool = False, enable_validation: bool = True):
def __init__(
self,
debug: bool = False,
enable_validation: bool = True,
serializer: Callable[[dict], str] | None = None,
):
super().__init__(
proxy_type=ProxyEventType.BedrockAgentEvent,
cors=None,
debug=debug,
serializer=None,
serializer=serializer,
strip_prefixes=None,
enable_validation=enable_validation,
json_body_deserializer=None,
Expand Down
35 changes: 35 additions & 0 deletions tests/functional/event_handler/_pydantic/test_bedrock_agent.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
from functools import partial
from typing import Any, Dict, Optional

import pytest
Expand Down Expand Up @@ -383,3 +384,37 @@ def run_sql_query(query: Annotated[str, Query()]):
# THEN the parameter with commas should be correctly passed to the handler
body = json.loads(result["response"]["responseBody"]["application/json"]["body"])
assert body["result"] == "SELECT a.source_name, b.thing FROM table"


def test_bedrock_agent_with_default_serializer_escapes_non_ascii():
# GIVEN a Bedrock Agent resolver using the default serializer
app = BedrockAgentResolver()

@app.get("/claims", description="Gets claims")
def claims() -> Dict[str, Any]:
return {"output": "잔액은 1,000원입니다 💰"}

# WHEN calling the event handler
result = app(load_event("bedrockAgentEvent.json"), {})

# THEN the body is valid JSON and non-ASCII characters are escaped (default json.dumps behavior)
body = result["response"]["responseBody"]["application/json"]["body"]
assert "\\uc794" in body # "잔" escaped
assert json.loads(body) == {"output": "잔액은 1,000원입니다 💰"}


def test_bedrock_agent_with_custom_serializer_preserves_non_ascii():
# GIVEN a Bedrock Agent resolver initialized with a custom serializer that keeps non-ASCII characters
app = BedrockAgentResolver(serializer=partial(json.dumps, ensure_ascii=False))

@app.get("/claims", description="Gets claims")
def claims() -> Dict[str, Any]:
return {"output": "잔액은 1,000원입니다 💰"}

# WHEN calling the event handler
result = app(load_event("bedrockAgentEvent.json"), {})

# THEN the non-ASCII characters are preserved verbatim in the response body
body = result["response"]["responseBody"]["application/json"]["body"]
assert "잔액은 1,000원입니다 💰" in body
assert json.loads(body) == {"output": "잔액은 1,000원입니다 💰"}