Skip to content

Commit bfe3369

Browse files
committed
fix: prevent splitting Bedrock Agent parameters with commas
This fixes issue aws-powertools#6520 where Bedrock Agent parameters containing commas (like SQL queries) were being truncated because the resolved_query_string_parameters method was splitting them by commas. The fix overrides the resolved_query_string_parameters method in the BedrockAgentEvent class to preserve parameter values without splitting them by commas.
1 parent 14054ab commit bfe3369

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,19 @@ def query_string_parameters(self) -> dict[str, str]:
112112
parameters = self.get("parameters") or []
113113
return {x["name"]: x["value"] for x in parameters}
114114

115+
@cached_property
116+
def resolved_query_string_parameters(self) -> dict[str, list[str]]:
117+
"""
118+
Override the base implementation to prevent splitting parameter values by commas.
119+
120+
For Bedrock Agent events, parameters are already properly structured and should not
121+
be split by commas as they might contain commas as part of their actual values
122+
(e.g., SQL queries).
123+
"""
124+
# Return each parameter value as a single-item list without splitting by commas
125+
parameters = self.get("parameters") or []
126+
return {x["name"]: [x["value"]] for x in parameters}
127+
115128
@property
116129
def resolved_headers_field(self) -> dict[str, Any]:
117130
return {}

tests/functional/event_handler/_pydantic/test_bedrock_agent.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing_extensions import Annotated
66

77
from aws_lambda_powertools.event_handler import BedrockAgentResolver, BedrockResponse, Response, content_types
8-
from aws_lambda_powertools.event_handler.openapi.params import Body
8+
from aws_lambda_powertools.event_handler.openapi.params import Body, Query
99
from aws_lambda_powertools.utilities.data_classes import BedrockAgentEvent
1010
from tests.functional.utils import load_event
1111

@@ -343,3 +343,46 @@ def handler() -> Optional[Dict]:
343343

344344
# THEN the OpenAPI schema must contain the "x-requireConfirmation" extension at the operation level
345345
assert schema["paths"]["/"]["get"]["x-requireConfirmation"] == "ENABLED"
346+
def test_bedrock_agent_with_comma_parameters():
347+
# GIVEN a Bedrock Agent resolver
348+
app = BedrockAgentResolver()
349+
received_query = None
350+
351+
@app.post("/sql-query", description="Run a SQL query")
352+
def run_sql_query(query: Annotated[str, Query()]):
353+
nonlocal received_query
354+
received_query = query
355+
return {"result": "Query executed"}
356+
357+
# WHEN calling the event handler with a parameter containing commas
358+
event = {
359+
"actionGroup": "TestActionGroup",
360+
"messageVersion": "1.0",
361+
"sessionId": "12345678912345",
362+
"sessionAttributes": {},
363+
"promptSessionAttributes": {},
364+
"inputText": "Run a SQL query",
365+
"agent": {
366+
"alias": "TEST",
367+
"name": "test",
368+
"version": "1",
369+
"id": "test123",
370+
},
371+
"httpMethod": "POST",
372+
"apiPath": "/sql-query",
373+
"parameters": [
374+
{
375+
"name": "query",
376+
"type": "string",
377+
"value": "SELECT a.source_name, b.thing FROM table",
378+
},
379+
],
380+
}
381+
382+
result = app(event, {})
383+
384+
# THEN the parameter with commas should be correctly passed to the handler
385+
assert received_query == "SELECT a.source_name, b.thing FROM table"
386+
assert result["response"]["httpStatusCode"] == 200
387+
body = json.loads(result["response"]["responseBody"]["application/json"]["body"])
388+
assert body["result"] == "Query executed"

tests/unit/data_classes/required_dependencies/test_bedrock_agent_event.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,34 @@ def test_bedrock_agent_event_with_post():
6262
assert properties[1].name == raw_properties[1]["name"]
6363
assert properties[1].type == raw_properties[1]["type"]
6464
assert properties[1].value == raw_properties[1]["value"]
65+
66+
def test_bedrock_agent_event_with_comma_parameters():
67+
event = {
68+
"actionGroup": "TestActionGroup",
69+
"messageVersion": "1.0",
70+
"sessionId": "12345678912345",
71+
"sessionAttributes": {},
72+
"promptSessionAttributes": {},
73+
"inputText": "Run a SQL query",
74+
"agent": {
75+
"alias": "TEST",
76+
"name": "test",
77+
"version": "1",
78+
"id": "test123",
79+
},
80+
"httpMethod": "POST",
81+
"apiPath": "/sql-query",
82+
"parameters": [
83+
{
84+
"name": "query",
85+
"type": "string",
86+
"value": "SELECT a.source_name, b.thing FROM table",
87+
},
88+
],
89+
}
90+
91+
parsed_event = BedrockAgentEvent(event)
92+
93+
assert parsed_event.query_string_parameters["query"] == "SELECT a.source_name, b.thing FROM table"
94+
assert parsed_event.resolved_query_string_parameters["query"] == ["SELECT a.source_name, b.thing FROM table"]
95+
assert len(parsed_event.resolved_query_string_parameters["query"]) == 1

0 commit comments

Comments
 (0)