From f65b02da0577759456710a9f5182b5526dcc0265 Mon Sep 17 00:00:00 2001 From: KUrushi Date: Sat, 2 Dec 2023 20:27:56 +0900 Subject: [PATCH 1/7] add lambda event agent for amazon bedrock --- lambda-events/Cargo.toml | 2 + .../src/event/bedrock_agent_runtime/mod.rs | 83 +++++++++++++++++++ lambda-events/src/event/mod.rs | 5 ++ .../example-bedrock-agent-runtime-event.json | 40 +++++++++ 4 files changed, 130 insertions(+) create mode 100644 lambda-events/src/event/bedrock_agent_runtime/mod.rs create mode 100644 lambda-events/src/fixtures/example-bedrock-agent-runtime-event.json diff --git a/lambda-events/Cargo.toml b/lambda-events/Cargo.toml index ca5fa1a8..a3678478 100644 --- a/lambda-events/Cargo.toml +++ b/lambda-events/Cargo.toml @@ -43,6 +43,7 @@ default = [ "apigw", "appsync", "autoscaling", + "bedrock_runtime_agent", "chime_bot", "clientvpn", "cloudformation", @@ -85,6 +86,7 @@ alb = ["bytes", "http", "http-body", "http-serde", "query_map"] apigw = ["bytes", "http", "http-body", "http-serde", "query_map"] appsync = [] autoscaling = ["chrono"] +bedrock_runtime_agent = [] chime_bot = ["chrono"] clientvpn = [] cloudformation = [] diff --git a/lambda-events/src/event/bedrock_agent_runtime/mod.rs b/lambda-events/src/event/bedrock_agent_runtime/mod.rs new file mode 100644 index 00000000..1c937842 --- /dev/null +++ b/lambda-events/src/event/bedrock_agent_runtime/mod.rs @@ -0,0 +1,83 @@ +use std::collections::HashMap; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AgentEvent { + ///The version of the message that identifies the format of the event data going into the Lambda function and the expected format of the response from a Lambda function. Amazon Bedrock only supports version 1.0. + pub message_version: String, + ///Contains information about the name, ID, alias, and version of the agent that the action group belongs to. + pub agent: Agent, + ///The user input for the conversation turn. + pub input_text: String, + /// The unique identifier of the agent session. + pub session_id: String, + /// The name of the action group. + pub action_group: String, + /// The path to the API operation, as defined in the OpenAPI schema. + pub api_path: String, + /// The method of the API operation, as defined in the OpenAPI schema. + pub http_method: String, + /// Contains a list of objects. Each object contains the name, type, and value of a parameter in the API operation, as defined in the OpenAPI schema. + pub parameters: Vec, + /// Contains the request body and its properties, as defined in the OpenAPI schema. + pub request_body: RequestBody, + /// Contains session attributes and their values. + pub session_attributes: HashMap, + /// Contains prompt attributes and their values. + pub prompt_session_attributes: HashMap, +} + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct RequestBody { + pub content: HashMap, +} + + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Content { + pub properties: Vec, +} + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Property { + pub name: String, + pub r#type: String, + pub value: String, +} + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Parameter { + pub name: String, + pub r#type: String, + pub value: String, +} + + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Agent { + pub name: String, + pub id: String, + pub alias: String, + pub version: String, +} + +#[cfg(test)] +mod tests { + use serde_json; + + #[test] + #[cfg(feature = "bedrock-agent-runtime")] + fn example_bedrock_agent__runtime_event() { + let data = include!("../../fixtures/example-bedrock-agent-runtime-event.json"); + let parsed: AgentEvent = serde_json::from_str(&data).unwrap(); + let output: String = serde_json::to_string(&parsed).unwrap(); + let reparsed: AgentEvent = serde_json::from_slice(&output.as_bytes()).unwrap(); + assert_eq!(parsed, reparsed); + } +} \ No newline at end of file diff --git a/lambda-events/src/event/mod.rs b/lambda-events/src/event/mod.rs index 5ee57911..83ed48e2 100644 --- a/lambda-events/src/event/mod.rs +++ b/lambda-events/src/event/mod.rs @@ -17,6 +17,10 @@ pub mod appsync; #[cfg(feature = "autoscaling")] pub mod autoscaling; +/// AWS Lambda event definitions for agent for amazon bedrock +#[cfg(feature = "bedrock_agent_runtime")] +pub mod bedrock_agent_runtime; + /// AWS Lambda event definitions for chime_bot. #[cfg(feature = "chime_bot")] pub mod chime_bot; @@ -148,3 +152,4 @@ pub mod documentdb; /// AWS Lambda event definitions for EventBridge. #[cfg(feature = "eventbridge")] pub mod eventbridge; +mod bedrock_agent_runtime; diff --git a/lambda-events/src/fixtures/example-bedrock-agent-runtime-event.json b/lambda-events/src/fixtures/example-bedrock-agent-runtime-event.json new file mode 100644 index 00000000..b5244515 --- /dev/null +++ b/lambda-events/src/fixtures/example-bedrock-agent-runtime-event.json @@ -0,0 +1,40 @@ +{ + "messageVersion": "1.0", + "agent": { + "name": "AgentName", + "id": "AgentID", + "alias": "AgentAlias", + "version": "AgentVersion" + }, + "inputText": "InputText", + "sessionId": "SessionID", + "actionGroup": "ActionGroup", + "apiPath": "/api/path", + "httpMethod": "POST", + "parameters": [ + { + "name": "param1", + "type": "string", + "value": "value1" + } + ], + "requestBody": { + "content": { + "application/json": { + "properties": [ + { + "name": "prop1", + "type": "string", + "value": "value1" + } + ] + } + } + }, + "sessionAttributes": { + "attr1": "value1" + }, + "promptSessionAttributes": { + "promptAttr1": "value1" + } +} \ No newline at end of file From 92b934a63b0181be6328d7ee16257a78c2e32654 Mon Sep 17 00:00:00 2001 From: KUrushi Date: Mon, 4 Dec 2023 10:35:03 +0900 Subject: [PATCH 2/7] add comment for properties --- lambda-events/src/event/bedrock_agent_runtime/mod.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lambda-events/src/event/bedrock_agent_runtime/mod.rs b/lambda-events/src/event/bedrock_agent_runtime/mod.rs index 1c937842..c49a96ec 100644 --- a/lambda-events/src/event/bedrock_agent_runtime/mod.rs +++ b/lambda-events/src/event/bedrock_agent_runtime/mod.rs @@ -31,6 +31,7 @@ pub struct AgentEvent { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct RequestBody { + /// Contains the request body and its properties pub content: HashMap, } @@ -38,22 +39,29 @@ pub struct RequestBody { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Content { + /// The content of the request body pub properties: Vec, } #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Property { + /// The name of the parameter pub name: String, + /// The type of the parameter pub r#type: String, + /// The value of the parameter pub value: String, } #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Parameter { + /// The name of the parameter pub name: String, + /// The type of the parameter pub r#type: String, + /// The value of the parameter pub value: String, } @@ -61,9 +69,13 @@ pub struct Parameter { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Agent { + /// The name of the agent. pub name: String, + /// The unique identifier of the agent. pub id: String, + /// The alias of the agent. pub alias: String, + /// The version of the agent. pub version: String, } From dc0ee80403589976a5f89e6d5095b1fbff3b2082 Mon Sep 17 00:00:00 2001 From: KUrushi Date: Mon, 4 Dec 2023 10:36:20 +0900 Subject: [PATCH 3/7] add comment for AgentEvent --- lambda-events/src/event/bedrock_agent_runtime/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/lambda-events/src/event/bedrock_agent_runtime/mod.rs b/lambda-events/src/event/bedrock_agent_runtime/mod.rs index c49a96ec..ef9daa0c 100644 --- a/lambda-events/src/event/bedrock_agent_runtime/mod.rs +++ b/lambda-events/src/event/bedrock_agent_runtime/mod.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; +/// The Event sent to Lambda from Agents for Amazon Bedrock. #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct AgentEvent { From 6ba86b8c72ca299de1b4e9b919d34afcd7856ff0 Mon Sep 17 00:00:00 2001 From: KUrushi Date: Mon, 4 Dec 2023 13:56:36 +0900 Subject: [PATCH 4/7] add check-event-features for bedrock --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 76e57e94..049be8f8 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,7 @@ check-event-features: cargo test --package aws_lambda_events --no-default-features --features apigw cargo test --package aws_lambda_events --no-default-features --features appsync cargo test --package aws_lambda_events --no-default-features --features autoscaling + cargo test --package aws_lambda_events --no-default-features --features bedrock_agent_runtime cargo test --package aws_lambda_events --no-default-features --features chime_bot cargo test --package aws_lambda_events --no-default-features --features clientvpn cargo test --package aws_lambda_events --no-default-features --features cloudwatch_events From 3b76ac19b50430d65ac2578416f2d7ab4b98fd3e Mon Sep 17 00:00:00 2001 From: KUrushi Date: Mon, 4 Dec 2023 14:19:11 +0900 Subject: [PATCH 5/7] remove duplicated module --- lambda-events/src/event/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/lambda-events/src/event/mod.rs b/lambda-events/src/event/mod.rs index 83ed48e2..28a0c82b 100644 --- a/lambda-events/src/event/mod.rs +++ b/lambda-events/src/event/mod.rs @@ -152,4 +152,3 @@ pub mod documentdb; /// AWS Lambda event definitions for EventBridge. #[cfg(feature = "eventbridge")] pub mod eventbridge; -mod bedrock_agent_runtime; From c2dd8aa902522470bb86b1cba445027611bad6c6 Mon Sep 17 00:00:00 2001 From: KUrushi Date: Mon, 4 Dec 2023 14:19:23 +0900 Subject: [PATCH 6/7] fix invalid naming --- lambda-events/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lambda-events/Cargo.toml b/lambda-events/Cargo.toml index a3678478..b35809a2 100644 --- a/lambda-events/Cargo.toml +++ b/lambda-events/Cargo.toml @@ -43,7 +43,7 @@ default = [ "apigw", "appsync", "autoscaling", - "bedrock_runtime_agent", + "bedrock_agent_runtime", "chime_bot", "clientvpn", "cloudformation", @@ -86,7 +86,7 @@ alb = ["bytes", "http", "http-body", "http-serde", "query_map"] apigw = ["bytes", "http", "http-body", "http-serde", "query_map"] appsync = [] autoscaling = ["chrono"] -bedrock_runtime_agent = [] +bedrock_agent_runtime = [] chime_bot = ["chrono"] clientvpn = [] cloudformation = [] From dcab54cd5826836fab83c0da7fae6d66702c91a1 Mon Sep 17 00:00:00 2001 From: KUrushi Date: Mon, 4 Dec 2023 14:54:30 +0900 Subject: [PATCH 7/7] apply formatting --- lambda-events/src/event/bedrock_agent_runtime/mod.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lambda-events/src/event/bedrock_agent_runtime/mod.rs b/lambda-events/src/event/bedrock_agent_runtime/mod.rs index ef9daa0c..65ab4a9d 100644 --- a/lambda-events/src/event/bedrock_agent_runtime/mod.rs +++ b/lambda-events/src/event/bedrock_agent_runtime/mod.rs @@ -1,5 +1,5 @@ -use std::collections::HashMap; use serde::{Deserialize, Serialize}; +use std::collections::HashMap; /// The Event sent to Lambda from Agents for Amazon Bedrock. #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] @@ -36,7 +36,6 @@ pub struct RequestBody { pub content: HashMap, } - #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Content { @@ -66,7 +65,6 @@ pub struct Parameter { pub value: String, } - #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Agent { @@ -93,4 +91,4 @@ mod tests { let reparsed: AgentEvent = serde_json::from_slice(&output.as_bytes()).unwrap(); assert_eq!(parsed, reparsed); } -} \ No newline at end of file +}