-
Notifications
You must be signed in to change notification settings - Fork 421
/
Copy pathbedrock_agent_event.py
130 lines (95 loc) · 3.51 KB
/
bedrock_agent_event.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from __future__ import annotations
from functools import cached_property
from typing import Any
from aws_lambda_powertools.utilities.data_classes.common import BaseProxyEvent, DictWrapper
class BedrockAgentInfo(DictWrapper):
@property
def name(self) -> str:
return self["name"]
@property
def id(self) -> str: # noqa: A003
return self["id"]
@property
def alias(self) -> str:
return self["alias"]
@property
def version(self) -> str:
return self["version"]
class BedrockAgentProperty(DictWrapper):
@property
def name(self) -> str:
return self["name"]
@property
def type(self) -> str: # noqa: A003
return self["type"]
@property
def value(self) -> str:
return self["value"]
class BedrockAgentRequestMedia(DictWrapper):
@property
def properties(self) -> list[BedrockAgentProperty]:
return [BedrockAgentProperty(x) for x in self["properties"]]
class BedrockAgentRequestBody(DictWrapper):
@property
def content(self) -> dict[str, BedrockAgentRequestMedia]:
return {k: BedrockAgentRequestMedia(v) for k, v in self["content"].items()}
class BedrockAgentEvent(BaseProxyEvent):
"""
Bedrock Agent input event
See https://docs.aws.amazon.com/bedrock/latest/userguide/agents-create.html
"""
# httpMethod is inherited from BaseProxyEvent class.
@property
def message_version(self) -> str:
return self["messageVersion"]
@property
def input_text(self) -> str:
return self["inputText"]
@property
def session_id(self) -> str:
return self["sessionId"]
@property
def action_group(self) -> str:
return self["actionGroup"]
@property
def api_path(self) -> str:
return self["apiPath"]
@property
def parameters(self) -> list[BedrockAgentProperty]:
parameters = self.get("parameters") or []
return [BedrockAgentProperty(x) for x in parameters]
@property
def request_body(self) -> BedrockAgentRequestBody | None:
return BedrockAgentRequestBody(self["requestBody"]) if self.get("requestBody") else None
@property
def agent(self) -> BedrockAgentInfo:
return BedrockAgentInfo(self["agent"])
@property
def session_attributes(self) -> dict[str, str]:
return self["sessionAttributes"]
@property
def prompt_session_attributes(self) -> dict[str, str]:
return self["promptSessionAttributes"]
# The following methods add compatibility with BaseProxyEvent
@property
def path(self) -> str:
return self["apiPath"]
@cached_property
def query_string_parameters(self) -> dict[str, str]:
# In Bedrock Agent events, query string parameters are passed as undifferentiated parameters,
# together with the other parameters. So we just return all parameters here.
parameters = self.get("parameters") or []
return {x["name"]: x["value"] for x in parameters}
@property
def resolved_headers_field(self) -> dict[str, Any]:
return {}
@cached_property
def json_body(self) -> Any:
# In Bedrock Agent events, body parameters are encoded differently
# @see https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html#agents-lambda-input
if not self.request_body:
return None
json_body = self.request_body.content.get("application/json")
if not json_body:
return None
return {x.name: x.value for x in json_body.properties}