Skip to content

Commit 24978cb

Browse files
committed
add parser
1 parent 34948d7 commit 24978cb

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

aws_lambda_powertools/utilities/parser/envelopes/bedrock_agent.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import TYPE_CHECKING, Any
55

66
from aws_lambda_powertools.utilities.parser.envelopes.base import BaseEnvelope
7-
from aws_lambda_powertools.utilities.parser.models import BedrockAgentEventModel
7+
from aws_lambda_powertools.utilities.parser.models import BedrockAgentEventModel, BedrockAgentFunctionEventModel
88

99
if TYPE_CHECKING:
1010
from aws_lambda_powertools.utilities.parser.types import Model
@@ -34,3 +34,27 @@ def parse(self, data: dict[str, Any] | Any | None, model: type[Model]) -> Model
3434
parsed_envelope: BedrockAgentEventModel = BedrockAgentEventModel.model_validate(data)
3535
logger.debug(f"Parsing event payload in `input_text` with {model}")
3636
return self._parse(data=parsed_envelope.input_text, model=model)
37+
38+
39+
class BedrockAgentFunctionEnvelope(BaseEnvelope):
40+
"""Bedrock Agent Function envelope to extract data within input_text key"""
41+
42+
def parse(self, data: dict[str, Any] | Any | None, model: type[Model]) -> Model | None:
43+
"""Parses data found with model provided
44+
45+
Parameters
46+
----------
47+
data : dict
48+
Lambda event to be parsed
49+
model : type[Model]
50+
Data model provided to parse after extracting data using envelope
51+
52+
Returns
53+
-------
54+
Model | None
55+
Parsed detail payload with model provided
56+
"""
57+
logger.debug(f"Parsing incoming data with Bedrock Agent Function model {BedrockAgentFunctionEventModel}")
58+
parsed_envelope: BedrockAgentFunctionEventModel = BedrockAgentFunctionEventModel.model_validate(data)
59+
logger.debug(f"Parsing event payload in `input_text` with {model}")
60+
return self._parse(data=parsed_envelope.input_text, model=model)

aws_lambda_powertools/utilities/parser/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
)
3333
from .bedrock_agent import (
3434
BedrockAgentEventModel,
35+
BedrockAgentFunctionEventModel,
3536
BedrockAgentModel,
3637
BedrockAgentPropertyModel,
3738
BedrockAgentRequestBodyModel,
@@ -208,6 +209,7 @@
208209
"BedrockAgentEventModel",
209210
"BedrockAgentRequestBodyModel",
210211
"BedrockAgentRequestMediaModel",
212+
"BedrockAgentFunctionEventModel",
211213
"S3BatchOperationJobModel",
212214
"S3BatchOperationModel",
213215
"S3BatchOperationTaskModel",

aws_lambda_powertools/utilities/parser/models/bedrock_agent.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,21 @@ class BedrockAgentEventModel(BaseModel):
3636
agent: BedrockAgentModel
3737
parameters: Optional[List[BedrockAgentPropertyModel]] = None
3838
request_body: Optional[BedrockAgentRequestBodyModel] = Field(None, alias="requestBody")
39+
40+
41+
class BedrockAgentFunctionEventModel(BaseModel):
42+
"""Bedrock Agent Function event model
43+
44+
Documentation:
45+
https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html
46+
"""
47+
48+
message_version: str = Field(..., alias="messageVersion")
49+
agent: BedrockAgentModel
50+
input_text: str = Field(..., alias="inputText")
51+
session_id: str = Field(..., alias="sessionId")
52+
action_group: str = Field(..., alias="actionGroup")
53+
function: str
54+
parameters: Optional[List[BedrockAgentPropertyModel]] = None
55+
session_attributes: Dict[str, str] = Field({}, alias="sessionAttributes")
56+
prompt_session_attributes: Dict[str, str] = Field({}, alias="promptSessionAttributes")

tests/unit/parser/_pydantic/test_bedrock_agent.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from aws_lambda_powertools.utilities.parser import envelopes, parse
2-
from aws_lambda_powertools.utilities.parser.models import BedrockAgentEventModel
2+
from aws_lambda_powertools.utilities.parser.models import BedrockAgentEventModel, BedrockAgentFunctionEventModel
33
from tests.functional.utils import load_event
44
from tests.unit.parser._pydantic.schemas import MyBedrockAgentBusiness
55

@@ -76,3 +76,35 @@ def test_bedrock_agent_event_with_post():
7676
assert properties[1].name == raw_properties[1]["name"]
7777
assert properties[1].type_ == raw_properties[1]["type"]
7878
assert properties[1].value == raw_properties[1]["value"]
79+
80+
81+
def test_bedrock_agent_function_event():
82+
raw_event = load_event("bedrockAgentFunctionEvent.json")
83+
model = BedrockAgentFunctionEventModel(**raw_event)
84+
85+
assert model.message_version == raw_event["messageVersion"]
86+
assert model.session_id == raw_event["sessionId"]
87+
assert model.input_text == raw_event["inputText"]
88+
assert model.action_group == raw_event["actionGroup"]
89+
assert model.function == raw_event["function"]
90+
assert model.session_attributes == {"employeeId": "EMP123"}
91+
assert model.prompt_session_attributes == {"lastInteraction": "2024-02-01T15:30:00Z", "requestType": "vacation"}
92+
93+
agent = model.agent
94+
raw_agent = raw_event["agent"]
95+
assert agent.alias == raw_agent["alias"]
96+
assert agent.name == raw_agent["name"]
97+
assert agent.version == raw_agent["version"]
98+
assert agent.id_ == raw_agent["id"]
99+
100+
parameters = model.parameters
101+
assert parameters is not None
102+
assert len(parameters) == 2
103+
104+
assert parameters[0].name == "startDate"
105+
assert parameters[0].type_ == "string"
106+
assert parameters[0].value == "2024-03-15"
107+
108+
assert parameters[1].name == "endDate"
109+
assert parameters[1].type_ == "string"
110+
assert parameters[1].value == "2024-03-20"

0 commit comments

Comments
 (0)