Skip to content

Commit fdde207

Browse files
committed
doc event handler, parser and data class
1 parent 54a7edf commit fdde207

16 files changed

+344
-102
lines changed

docs/core/event_handler/bedrock_agents.md

Lines changed: 167 additions & 90 deletions
Large diffs are not rendered by default.

docs/core/event_handler/bedrock_agents.mermaid

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ flowchart LR
22
Bedrock[LLM] <-- uses --> Agent
33
You[User input] --> Agent
44
Agent -- consults --> OpenAPI
5-
Agent[Agents for Amazon Bedrock] -- invokes --> Lambda
5+
Agent -- consults --> Functions
6+
Agent[Amazon Bedrock Agents] -- invokes --> Lambda
67

78
subgraph OpenAPI
89
Schema
910
end
1011

12+
subgraph Functions
13+
ToolDescriptions[Tool Descriptions]
14+
end
15+
1116
subgraph Lambda[Lambda Function]
1217
direction TB
1318
Parsing[Parameter Parsing] --> Validation
@@ -19,10 +24,8 @@ flowchart LR
1924

2025
subgraph ActionGroup[Action Group]
2126
OpenAPI -. generated from .-> Lambda
27+
Functions -. defined in .-> Lambda
2228
end
2329

2430
style Code fill:#ffa500,color:black,font-weight:bold,stroke-width:3px
25-
style You stroke:#0F0,stroke-width:2px
26-
27-
28-
31+
style You stroke:#0F0,stroke-width:2px

docs/core/event_handler/bedrock_agents_getting_started.mermaid

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ sequenceDiagram
1414
participant Your Code
1515
end
1616

17-
Agent->>Lambda: GET /current_time
17+
alt Function-based
18+
Agent->>Lambda: {function: "current_time", parameters: [], ...}
19+
end
20+
1821
activate Lambda
1922
Lambda->>Parsing: parses parameters
2023
Parsing->>Validation: validates input
@@ -26,8 +29,11 @@ sequenceDiagram
2629
Routing->>Validation: returns output
2730
Validation->>Parsing: validates output
2831
Parsing->>Lambda: formats response
29-
Lambda->>Agent: 1709215709
32+
33+
alt Function-based
34+
Lambda->>Agent: {response: {functionResponse: {responseBody: {...}}}}
35+
end
3036
deactivate Lambda
3137

3238
Agent-->>Agent: LLM interaction
33-
Agent->>User: "The current time is 14:08:29 GMT"
39+
Agent->>User: "The current time is 14:08:29 GMT"

docs/utilities/data_classes.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ Each event source is linked to its corresponding GitHub file with the full set o
7575
| [AppSync Authorizer](#appsync-authorizer) | `AppSyncAuthorizerEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py) |
7676
| [AppSync Resolver](#appsync-resolver) | `AppSyncResolverEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py) |
7777
| [AWS Config Rule](#aws-config-rule) | `AWSConfigRuleEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/aws_config_rule_event.py) |
78-
| [Bedrock Agent](#bedrock-agent) | `BedrockAgent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py) |
78+
| [Bedrock Agent - OpenAPI](#bedrock-agent) | `BedrockAgentEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py) |
79+
| [Bedrock Agent - Function](#bedrock-agent) | `BedrockAgentFunctionEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/bedrock_agent_function_event.py) |
7980
| [CloudFormation Custom Resource](#cloudformation-custom-resource) | `CloudFormationCustomResourceEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloudformation_custom_resource_event.py) |
8081
| [CloudWatch Alarm State Change Action](#cloudwatch-alarm-state-change-action) | `CloudWatchAlarmEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_alarm_event.py) |
8182
| [CloudWatch Dashboard Custom Widget](#cloudwatch-dashboard-custom-widget) | `CloudWatchDashboardCustomWidgetEvent` | [Github](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/data_classes/cloud_watch_custom_widget_event.py) |

docs/utilities/parser.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ The example above uses `SqsModel`. Other built-in models can be found below.
112112
| **APIGatewayWebSocketConnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $connect message |
113113
| **APIGatewayWebSocketDisconnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $disconnect message |
114114
| **AppSyncResolverEventModel** | Lambda Event Source payload for AWS AppSync Resolver |
115-
| **BedrockAgentEventModel** | Lambda Event Source payload for Bedrock Agents |
115+
| **BedrockAgentEventModel** | Lambda Event Source payload for Bedrock Agents - OpenAPI-based |
116+
| **BedrockAgentFunctionEventModel** | Lambda Event Source payload for Bedrock Agents - Function-based |
116117
| **CloudFormationCustomResourceCreateModel** | Lambda Event Source payload for AWS CloudFormation `CREATE` operation |
117118
| **CloudFormationCustomResourceUpdateModel** | Lambda Event Source payload for AWS CloudFormation `UPDATE` operation |
118119
| **CloudFormationCustomResourceDeleteModel** | Lambda Event Source payload for AWS CloudFormation `DELETE` operation |

examples/event_handler_bedrock_agents/src/accessing_request_fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
app = BedrockAgentResolver()
99

1010

11-
@app.get("/current_time", description="Gets the current time in seconds") # (1)!
11+
@app.get("/current_time", description="Gets the current time in seconds")
1212
def current_time() -> int:
1313
logger.append_keys(
1414
session_id=app.current_event.session_id,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from time import time
2+
3+
from aws_lambda_powertools import Logger, Tracer
4+
from aws_lambda_powertools.event_handler import BedrockAgentFunctionResolver
5+
from aws_lambda_powertools.utilities.typing import LambdaContext
6+
7+
tracer = Tracer()
8+
logger = Logger()
9+
app = BedrockAgentFunctionResolver()
10+
11+
12+
@app.tool(name="currentTime", description="Gets the current time in seconds") # (1)!
13+
@tracer.capture_method
14+
def current_time() -> int:
15+
return int(time())
16+
17+
18+
@logger.inject_lambda_context
19+
@tracer.capture_lambda_handler
20+
def lambda_handler(event: dict, context: LambdaContext):
21+
return app.resolve(event, context) # (2)!
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"messageVersion": "1.0",
3+
"response": {
4+
"actionGroup": "CurrentTime",
5+
"function": "CurrentTime",
6+
"functionResponse": {
7+
"responseBody": {
8+
"application/json": {
9+
"body": "1704708165"
10+
}
11+
}
12+
}
13+
}
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"messageVersion": "1.0",
3+
"agent": {
4+
"name": "TimeAgent",
5+
"id": "XLHH72XNF2",
6+
"alias": "TSTALIASID",
7+
"version": "DRAFT"
8+
},
9+
"inputText": "What is the current time?",
10+
"sessionId": "123456789012345",
11+
"actionGroup": "CurrentTime",
12+
"function": "CurrentTime",
13+
"parameters": [],
14+
"sessionAttributes": {},
15+
"promptSessionAttributes": {}
16+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"messageVersion": "1.0",
3+
"agent": {
4+
"name": "TestAgent",
5+
"id": "XXXXX",
6+
"alias": "LATEST",
7+
"version": "DRAFT"
8+
},
9+
"inputText": "Schedule a meeting with [email protected]",
10+
"sessionId": "session-id",
11+
"actionGroup": "TestActionGroup",
12+
"function": "schedule_meeting",
13+
"parameters": [
14+
{
15+
"name": "email",
16+
"value": "[email protected]"
17+
}
18+
]
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"messageVersion": "1.0",
3+
"response": {
4+
"actionGroup": "TestActionGroup",
5+
"function": "schedule_meeting",
6+
"functionResponse": {
7+
"responseBody": {
8+
"TEXT": {
9+
"body": "true"
10+
}
11+
}
12+
}
13+
},
14+
"sessionAttributes": {
15+
"last_email": "[email protected]"
16+
}
17+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"messageVersion": "1.0",
3+
"agent": {
4+
"name": "TestAgent",
5+
"id": "XXXXX",
6+
"alias": "LATEST",
7+
"version": "DRAFT"
8+
},
9+
"parameters": [
10+
{
11+
"name": "email",
12+
"value": "not-an-email"
13+
}
14+
],
15+
"function": "schedule_meeting"
16+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"messageVersion": "1.0",
3+
"response": {
4+
"actionGroup": "TestActionGroup",
5+
"function": "schedule_meeting",
6+
"functionResponse": {
7+
"responseBody": {
8+
"TEXT": {
9+
"body": "Error: Invalid value for parameter 'email': value is not a valid email address"
10+
}
11+
}
12+
}
13+
}
14+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from pydantic import EmailStr
2+
3+
from aws_lambda_powertools import Logger, Tracer
4+
from aws_lambda_powertools.event_handler import BedrockAgentFunctionResolver
5+
from aws_lambda_powertools.event_handler.bedrock_agent_function import BedrockFunctionResponse
6+
7+
tracer = Tracer()
8+
logger = Logger()
9+
app = BedrockAgentFunctionResolver()
10+
11+
12+
@app.tool(description="Schedules a meeting with the team")
13+
@tracer.capture_method
14+
def schedule_meeting(email: EmailStr) -> BedrockFunctionResponse:
15+
logger.info("Scheduling a meeting", email=email)
16+
return BedrockFunctionResponse(body=True, session_attributes={"last_email": str(email)})
17+
18+
19+
@logger.inject_lambda_context
20+
@tracer.capture_lambda_handler
21+
def lambda_handler(event: dict, context):
22+
return app.resolve(event, context)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from aws_lambda_powertools.event_handler import BedrockFunctionAgentResolver
2+
from aws_lambda_powertools.event_handler.api_gateway import BedrockFunctionResponse
3+
4+
app = BedrockFunctionAgentResolver()
5+
6+
7+
@app.tool(description="Function that demonstrates response customization")
8+
def custom_response():
9+
return BedrockFunctionResponse(
10+
body="Hello World",
11+
session_attributes={"user_id": "123"},
12+
prompt_session_attributes={"last_action": "greeting"},
13+
response_state="REPROMPT",
14+
knowledge_bases=[{"name": "kb1", "enabled": True}],
15+
)

tests/functional/event_handler/required_dependencies/test_bedrock_agent_functions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def test_bedrock_agent_function_with_string_response():
1212
# GIVEN a Bedrock Agent Function resolver
1313
app = BedrockAgentFunctionResolver()
1414

15-
@app.tool(description="Returns a string")
15+
@app.tool()
1616
def test_function():
1717
assert isinstance(app.current_event, BedrockAgentFunctionEvent)
1818
return "Hello from string"

0 commit comments

Comments
 (0)