AWS Bedrock - Examples
Producer Examples
-
invokeTextModel: this operation will invoke a model from Bedrock. This is an example for both Titan Express and Titan Lite.
-
Java
-
XML
-
YAML
from("direct:invoke")
.to("aws-bedrock://test?bedrockRuntimeClient=#amazonBedrockRuntimeClient&operation=invokeTextModel&modelId=amazon.titan-text-express-v1"); <route>
<from uri="direct:invoke"/>
<to uri="aws-bedrock://test?bedrockRuntimeClient=#amazonBedrockRuntimeClient&operation=invokeTextModel&modelId=amazon.titan-text-express-v1"/>
</route> - route:
from:
uri: direct:invoke
steps:
- to:
uri: aws-bedrock://test
parameters:
bedrockRuntimeClient: "#amazonBedrockRuntimeClient"
operation: invokeTextModel
modelId: amazon.titan-text-express-v1 and you can then send to the direct endpoint something like
ProducerTemplate test API with complex JSON construction final Exchange result = template.send("direct:invoke", exchange -> {
ObjectMapper mapper = new ObjectMapper();
ObjectNode rootNode = mapper.createObjectNode();
rootNode.put("inputText",
"User: Generate synthetic data for daily product sales in various categories - include row number, product name, category, date of sale and price. Produce output in JSON format. Count records and ensure there are no more than 5.");
ArrayNode stopSequences = mapper.createArrayNode();
stopSequences.add("User:");
ObjectNode childNode = mapper.createObjectNode();
childNode.put("maxTokenCount", 1024);
childNode.put("stopSequences", stopSequences);
childNode.put("temperature", 0).put("topP", 1);
rootNode.put("textGenerationConfig", childNode);
exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
}); where template is a ProducerTemplate.
-
invokeImageModel: this operation will invoke a model from Bedrock. This is an example for Titan Image Generator.
unmarshal().base64() method chain and simple() expression builderfrom("direct:invoke")
.to("aws-bedrock://test?bedrockRuntimeClient=#amazonBedrockRuntimeClient&operation=invokeImageModel&modelId=amazon.titan-image-generator-v1")
.split(body())
.unmarshal().base64()
.setHeader("CamelFileName", simple("image-${random(128)}.png"))
.to("file:target/generated_images"); and you can then send to the direct endpoint something like
ProducerTemplate test API with complex JSON construction final Exchange result = template.send("direct:send_titan_image", exchange -> {
ObjectMapper mapper = new ObjectMapper();
ObjectNode rootNode = mapper.createObjectNode();
ObjectNode textParameter = mapper.createObjectNode();
textParameter.putIfAbsent("text",
new TextNode("A Sci-fi camel running in the desert"));
rootNode.putIfAbsent("textToImageParams", textParameter);
rootNode.putIfAbsent("taskType", new TextNode("TEXT_IMAGE"));
ObjectNode childNode = mapper.createObjectNode();
childNode.putIfAbsent("numberOfImages", new IntNode(3));
childNode.putIfAbsent("quality", new TextNode("standard"));
childNode.putIfAbsent("cfgScale", new IntNode(8));
childNode.putIfAbsent("height", new IntNode(512));
childNode.putIfAbsent("width", new IntNode(512));
childNode.putIfAbsent("seed", new IntNode(0));
rootNode.putIfAbsent("imageGenerationConfig", childNode);
exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
}); where template is a ProducerTemplate.
-
invokeEmbeddingsModel: this operation will invoke an Embeddings model from Bedrock. This is an example for Titan Embeddings G1.
-
Java
-
XML
-
YAML
from("direct:send_titan_embeddings")
.to("aws-bedrock:label?useDefaultCredentialsProvider=true®ion=us-east-1&operation=invokeEmbeddingsModel&modelId=amazon.titan-embed-text-v1")
.to("mock:result"); <route>
<from uri="direct:send_titan_embeddings"/>
<to uri="aws-bedrock:label?useDefaultCredentialsProvider=true&region=us-east-1&operation=invokeEmbeddingsModel&modelId=amazon.titan-embed-text-v1"/>
<to uri="mock:result"/>
</route> - route:
from:
uri: direct:send_titan_embeddings
steps:
- to:
uri: aws-bedrock:label
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: invokeEmbeddingsModel
modelId: amazon.titan-embed-text-v1
- to:
uri: mock:result and you can then send to the direct endpoint something like
ProducerTemplate test API with complex JSON construction final Exchange result = template.send("direct:send_titan_embeddings", exchange -> {
ObjectMapper mapper = new ObjectMapper();
ObjectNode rootNode = mapper.createObjectNode();
rootNode.putIfAbsent("inputText",
new TextNode("A Sci-fi camel running in the desert"));
exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "*/*");
}); where template is a ProducerTemplate.
-
invokeTextModelStreaming (Complete Mode): this operation will invoke a model from Bedrock with streaming, accumulating the complete response.
-
Java
-
XML
-
YAML
from("direct:stream_complete")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=invokeTextModelStreaming&modelId=amazon.titan-text-express-v1&streamOutputMode=complete")
.to("log:response"); <route>
<from uri="direct:stream_complete"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=invokeTextModelStreaming&modelId=amazon.titan-text-express-v1&streamOutputMode=complete"/>
<to uri="log:response"/>
</route> - route:
from:
uri: direct:stream_complete
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: invokeTextModelStreaming
modelId: amazon.titan-text-express-v1
streamOutputMode: complete
- to:
uri: log:response and you can then send to the direct endpoint something like
ProducerTemplate test API with complex JSON construction final Exchange result = template.send("direct:stream_complete", exchange -> {
ObjectMapper mapper = new ObjectMapper();
ObjectNode rootNode = mapper.createObjectNode();
rootNode.put("inputText", "Write a short poem about Apache Camel.");
ArrayNode stopSequences = mapper.createArrayNode();
stopSequences.add("User:");
ObjectNode childNode = mapper.createObjectNode();
childNode.put("maxTokenCount", 512);
childNode.put("stopSequences", stopSequences);
childNode.put("temperature", 0).put("topP", 1);
rootNode.put("textGenerationConfig", childNode);
exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
});
// Get the complete response
String response = result.getMessage().getBody(String.class);
// Get streaming metadata
Integer tokenCount = result.getMessage().getHeader("CamelAwsBedrockTokenCount", Integer.class);
String completionReason = result.getMessage().getHeader("CamelAwsBedrockCompletionReason", String.class);
Integer chunkCount = result.getMessage().getHeader("CamelAwsBedrockChunkCount", Integer.class); -
invokeTextModelStreaming (Chunks Mode): this operation will invoke a model from Bedrock with streaming, emitting individual chunks.
-
Java
-
XML
-
YAML
from("direct:stream_chunks")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=invokeTextModelStreaming&modelId=anthropic.claude-3-5-sonnet-20241022-v2:0&streamOutputMode=chunks")
.split(body())
.to("websocket:chat-output"); <route>
<from uri="direct:stream_chunks"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=invokeTextModelStreaming&modelId=anthropic.claude-3-5-sonnet-20241022-v2:0&streamOutputMode=chunks"/>
<split>
<simple>${body}</simple>
<to uri="websocket:chat-output"/>
</split>
</route> - route:
from:
uri: direct:stream_chunks
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: invokeTextModelStreaming
modelId: "anthropic.claude-3-5-sonnet-20241022-v2:0"
streamOutputMode: chunks
- split:
expression:
simple: "${body}"
steps:
- to:
uri: websocket:chat-output and you can then send to the direct endpoint something like
ProducerTemplate test API with complex JSON construction final Exchange result = template.send("direct:stream_chunks", exchange -> {
ObjectMapper mapper = new ObjectMapper();
ObjectNode rootNode = mapper.createObjectNode();
ArrayNode messages = mapper.createArrayNode();
ObjectNode message = mapper.createObjectNode();
message.put("role", "user");
ArrayNode content = mapper.createArrayNode();
ObjectNode contentBlock = mapper.createObjectNode();
contentBlock.put("type", "text");
contentBlock.put("text", "Explain Apache Camel in one sentence.");
content.add(contentBlock);
message.put("content", content);
messages.add(message);
rootNode.put("messages", messages);
rootNode.put("max_tokens", 200);
rootNode.put("anthropic_version", "bedrock-2023-05-31");
exchange.getMessage().setBody(mapper.writer().writeValueAsString(rootNode));
exchange.getMessage().setHeader("CamelAwsBedrockContentType", "application/json");
exchange.getMessage().setHeader("CamelAwsBedrockAcceptContentType", "application/json");
});
// Get the list of chunks
List<String> chunks = result.getMessage().getBody(List.class);
// Process each chunk
for (String chunk : chunks) {
System.out.println("Chunk: " + chunk);
} -
converse: this operation uses the unified Converse API for model-agnostic conversations.
-
Java
-
XML
-
YAML
from("direct:converse")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
.to("log:response"); <route>
<from uri="direct:converse"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
<to uri="log:response"/>
</route> - route:
from:
uri: direct:converse
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converse
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
- to:
uri: log:response and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK objects final Exchange result = template.send("direct:converse", exchange -> {
// Create a conversation message
List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("What is Apache Camel and what are its main features?"))
.build());
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
// Optional: Add inference configuration
software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration inferenceConfig
= software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration.builder()
.maxTokens(500)
.temperature(0.7f)
.build();
exchange.getMessage().setHeader("CamelAwsBedrockConverseInferenceConfig", inferenceConfig);
// Optional: Add system prompt
List<software.amazon.awssdk.services.bedrockruntime.model.SystemContentBlock> systemPrompt = new ArrayList<>();
systemPrompt.add(software.amazon.awssdk.services.bedrockruntime.model.SystemContentBlock
.fromText("You are a helpful assistant that explains software concepts clearly and concisely."));
exchange.getMessage().setHeader("CamelAwsBedrockConverseSystem", systemPrompt);
});
// Get the response text
String response = result.getMessage().getBody(String.class);
// Get metadata from headers
String stopReason = result.getMessage().getHeader("CamelAwsBedrockConverseStopReason", String.class);
software.amazon.awssdk.services.bedrockruntime.model.TokenUsage usage
= result.getMessage().getHeader("CamelAwsBedrockConverseUsage",
software.amazon.awssdk.services.bedrockruntime.model.TokenUsage.class);
System.out.println("Response: " + response);
System.out.println("Stop reason: " + stopReason);
System.out.println("Input tokens: " + usage.inputTokens());
System.out.println("Output tokens: " + usage.outputTokens()); -
converseStream (Complete Mode): this operation uses the Converse API with streaming, accumulating the complete response.
-
Java
-
XML
-
YAML
from("direct:converse_stream")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
.to("log:response"); <route>
<from uri="direct:converse_stream"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
<to uri="log:response"/>
</route> - route:
from:
uri: direct:converse_stream
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converseStream
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
- to:
uri: log:response and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK objects final Exchange result = template.send("direct:converse_stream", exchange -> {
// Create a conversation message
List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("Explain the Enterprise Integration Patterns in three sentences."))
.build());
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
exchange.getMessage().setHeader("CamelAwsBedrockStreamOutputMode", "complete");
// Optional: Add inference configuration
software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration inferenceConfig
= software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration.builder()
.maxTokens(300)
.temperature(0.5f)
.build();
exchange.getMessage().setHeader("CamelAwsBedrockConverseInferenceConfig", inferenceConfig);
});
// Get the complete streamed response
String response = result.getMessage().getBody(String.class);
Integer chunkCount = result.getMessage().getHeader("CamelAwsBedrockChunkCount", Integer.class);
System.out.println("Response: " + response);
System.out.println("Received " + chunkCount + " chunks"); -
converseStream (Chunks Mode): this operation uses the Converse API with streaming, emitting individual chunks.
-
Java
-
XML
-
YAML
from("direct:converse_stream_chunks")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
.split(body())
.to("websocket:chat-output"); <route>
<from uri="direct:converse_stream_chunks"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
<split>
<simple>${body}</simple>
<to uri="websocket:chat-output"/>
</split>
</route> - route:
from:
uri: direct:converse_stream_chunks
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converseStream
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
- split:
expression:
simple: "${body}"
steps:
- to:
uri: websocket:chat-output and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK objects final Exchange result = template.send("direct:converse_stream_chunks", exchange -> {
// Create a conversation message
List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("Write a haiku about software integration."))
.build());
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
exchange.getMessage().setHeader("CamelAwsBedrockStreamOutputMode", "chunks");
});
// Get the list of chunks
List<String> chunks = result.getMessage().getBody(List.class);
// Process each chunk as it was received
for (String chunk : chunks) {
System.out.println("Chunk: " + chunk);
} -
Multi-turn Conversation with Converse API: demonstrates maintaining conversation history.
-
Java
-
XML
-
YAML
from("direct:conversation")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
.to("log:response"); <route>
<from uri="direct:conversation"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
<to uri="log:response"/>
</route> - route:
from:
uri: direct:conversation
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converse
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
- to:
uri: log:response and you can then send to the direct endpoint something like
ProducerTemplate test API with multi-turn conversation history // Maintain conversation history
List<software.amazon.awssdk.services.bedrockruntime.model.Message> conversationHistory = new ArrayList<>();
// First turn
conversationHistory.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("What is Apache Camel?"))
.build());
Exchange result1 = template.send("direct:conversation", exchange -> {
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages",
new ArrayList<>(conversationHistory));
});
// Add assistant's response to history
software.amazon.awssdk.services.bedrockruntime.model.Message assistantMessage
= result1.getMessage().getHeader("CamelAwsBedrockConverseOutputMessage",
software.amazon.awssdk.services.bedrockruntime.model.Message.class);
conversationHistory.add(assistantMessage);
// Second turn - follow-up question
conversationHistory.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("Can you give me a simple example?"))
.build());
Exchange result2 = template.send("direct:conversation", exchange -> {
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages",
new ArrayList<>(conversationHistory));
});
String followUpResponse = result2.getMessage().getBody(String.class);
System.out.println("Follow-up response: " + followUpResponse); Guardrails Examples
-
Converse with Guardrails (Endpoint Configuration): Apply guardrails configured at the endpoint level.
-
Java
-
XML
-
YAML
from("direct:converse_with_guardrails")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT&guardrailTrace=true")
.to("log:response"); <route>
<from uri="direct:converse_with_guardrails"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT&guardrailTrace=true"/>
<to uri="log:response"/>
</route> - route:
from:
uri: direct:converse_with_guardrails
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converse
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
guardrailIdentifier: abc123xyz
guardrailVersion: DRAFT
guardrailTrace: true
- to:
uri: log:response and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK objects final Exchange result = template.send("direct:converse_with_guardrails", exchange -> {
// Create a conversation message
List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("Tell me about Paris"))
.build());
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
// Optional: Add inference configuration
software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration inferenceConfig
= software.amazon.awssdk.services.bedrockruntime.model.InferenceConfiguration.builder()
.maxTokens(200)
.temperature(0.7f)
.build();
exchange.getMessage().setHeader("CamelAwsBedrockConverseInferenceConfig", inferenceConfig);
});
// Get the response
String response = result.getMessage().getBody(String.class);
// Check if guardrail trace is available
software.amazon.awssdk.services.bedrockruntime.model.GuardrailTrace trace
= result.getMessage().getHeader("CamelAwsBedrockGuardrailTrace",
software.amazon.awssdk.services.bedrockruntime.model.GuardrailTrace.class);
if (trace != null) {
System.out.println("Guardrail evaluation: " + trace);
} -
Converse with Guardrails (Header Configuration): Apply guardrails configured per-message via headers.
-
Java
-
XML
-
YAML
from("direct:converse_dynamic_guardrails")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0")
.to("log:response"); <route>
<from uri="direct:converse_dynamic_guardrails"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0"/>
<to uri="log:response"/>
</route> - route:
from:
uri: direct:converse_dynamic_guardrails
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converse
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
- to:
uri: log:response and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK GuardrailConfiguration objects final Exchange result = template.send("direct:converse_dynamic_guardrails", exchange -> {
// Create a conversation message
List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("What is the capital of France?"))
.build());
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
// Configure guardrail via header (can be dynamic per message)
software.amazon.awssdk.services.bedrockruntime.model.GuardrailConfiguration guardrailConfig
= software.amazon.awssdk.services.bedrockruntime.model.GuardrailConfiguration.builder()
.guardrailIdentifier("abc123xyz") // Can be determined at runtime
.guardrailVersion("DRAFT")
.trace(software.amazon.awssdk.services.bedrockruntime.model.GuardrailTrace.ENABLED)
.build();
exchange.getMessage().setHeader("CamelAwsBedrockGuardrailConfig", guardrailConfig);
});
String response = result.getMessage().getBody(String.class);
System.out.println("Protected response: " + response); -
Converse Stream with Guardrails: Apply guardrails to streaming conversations.
-
Java
-
XML
-
YAML
from("direct:stream_with_guardrails")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT")
.to("log:response"); <route>
<from uri="direct:stream_with_guardrails"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=converseStream&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT"/>
<to uri="log:response"/>
</route> - route:
from:
uri: direct:stream_with_guardrails
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converseStream
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
guardrailIdentifier: abc123xyz
guardrailVersion: DRAFT
- to:
uri: log:response and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK objects final Exchange result = template.send("direct:stream_with_guardrails", exchange -> {
List<software.amazon.awssdk.services.bedrockruntime.model.Message> messages = new ArrayList<>();
messages.add(software.amazon.awssdk.services.bedrockruntime.model.Message.builder()
.role(software.amazon.awssdk.services.bedrockruntime.model.ConversationRole.USER)
.content(software.amazon.awssdk.services.bedrockruntime.model.ContentBlock
.fromText("Tell me a story about space exploration"))
.build());
exchange.getMessage().setHeader("CamelAwsBedrockConverseMessages", messages);
exchange.getMessage().setHeader("CamelAwsBedrockStreamOutputMode", "complete");
});
String streamedResponse = result.getMessage().getBody(String.class);
System.out.println("Guardrail-protected stream response: " + streamedResponse); -
Apply Guardrail: Validate content against a guardrail without invoking a model.
-
Java
-
XML
-
YAML
from("direct:validate_content")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=applyGuardrail&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT")
.to("log:validation_result"); <route>
<from uri="direct:validate_content"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=applyGuardrail&guardrailIdentifier=abc123xyz&guardrailVersion=DRAFT"/>
<to uri="log:validation_result"/>
</route> - route:
from:
uri: direct:validate_content
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: applyGuardrail
guardrailIdentifier: abc123xyz
guardrailVersion: DRAFT
- to:
uri: log:validation_result and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK GuardrailContentBlock objects final Exchange result = template.send("direct:validate_content", exchange -> {
// Create content blocks to check
List<software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock> content
= new ArrayList<>();
content.add(software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock.builder()
.text(software.amazon.awssdk.services.bedrockruntime.model.GuardrailTextBlock.builder()
.text("This is the content I want to validate before sending to the model.")
.build())
.build());
exchange.getMessage().setHeader("CamelAwsBedrockGuardrailContent", content);
exchange.getMessage().setHeader("CamelAwsBedrockGuardrailSource", "INPUT");
});
// Get the action result (GUARDRAIL_INTERVENED or NONE)
String action = result.getMessage().getBody(String.class);
if ("GUARDRAIL_INTERVENED".equals(action)) {
System.out.println("Content was blocked by guardrail!");
// Get the assessments to see why it was blocked
List<?> assessments = result.getMessage().getHeader("CamelAwsBedrockGuardrailAssessments", List.class);
System.out.println("Reasons: " + assessments);
// Get the filtered output
List<?> outputs = result.getMessage().getHeader("CamelAwsBedrockGuardrailOutput", List.class);
System.out.println("Filtered content: " + outputs);
} else {
System.out.println("Content passed guardrail validation");
} -
Apply Guardrail with POJO Request: Use the SDK request object directly for maximum control.
-
Java
-
XML
-
YAML
from("direct:validate_pojo")
.to("aws-bedrock://test?useDefaultCredentialsProvider=true®ion=us-east-1&operation=applyGuardrail&pojoRequest=true")
.to("log:validation_result"); <route>
<from uri="direct:validate_pojo"/>
<to uri="aws-bedrock://test?useDefaultCredentialsProvider=true&region=us-east-1&operation=applyGuardrail&pojoRequest=true"/>
<to uri="log:validation_result"/>
</route> - route:
from:
uri: direct:validate_pojo
steps:
- to:
uri: aws-bedrock://test
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: applyGuardrail
pojoRequest: true
- to:
uri: log:validation_result and you can then send to the direct endpoint something like
ProducerTemplate test API with AWS SDK ApplyGuardrailRequest POJO final Exchange result = template.send("direct:validate_pojo", exchange -> {
// Create content blocks
List<software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock> content
= new ArrayList<>();
content.add(software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentBlock.builder()
.text(software.amazon.awssdk.services.bedrockruntime.model.GuardrailTextBlock.builder()
.text("User-generated content to validate")
.build())
.build());
// Build the complete request object
software.amazon.awssdk.services.bedrockruntime.model.ApplyGuardrailRequest request
= software.amazon.awssdk.services.bedrockruntime.model.ApplyGuardrailRequest.builder()
.guardrailIdentifier("abc123xyz")
.guardrailVersion("DRAFT")
.source(software.amazon.awssdk.services.bedrockruntime.model.GuardrailContentSource.INPUT)
.content(content)
.build();
exchange.getMessage().setBody(request);
});
String action = result.getMessage().getBody(String.class);
System.out.println("Validation result: " + action); -
Content Moderation Pipeline: Combine guardrails with model invocation in a pipeline.
-
Java
-
XML
-
YAML
from("direct:moderated_conversation")
.to("aws-bedrock://validate?useDefaultCredentialsProvider=true®ion=us-east-1&operation=applyGuardrail&guardrailIdentifier=abc123xyz")
.choice()
.when(simple("${body} == 'GUARDRAIL_INTERVENED'"))
.log("Input blocked by guardrail")
.setBody(constant("Sorry, I cannot process this request."))
.otherwise()
.to("aws-bedrock://converse?useDefaultCredentialsProvider=true®ion=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz")
.log("Model response: ${body}")
.end()
.to("mock:result"); <route>
<from uri="direct:moderated_conversation"/>
<to uri="aws-bedrock://validate?useDefaultCredentialsProvider=true&region=us-east-1&operation=applyGuardrail&guardrailIdentifier=abc123xyz"/>
<choice>
<when>
<simple>${body} == 'GUARDRAIL_INTERVENED'</simple>
<log message="Input blocked by guardrail"/>
<setBody><constant>Sorry, I cannot process this request.</constant></setBody>
</when>
<otherwise>
<to uri="aws-bedrock://converse?useDefaultCredentialsProvider=true&region=us-east-1&operation=converse&modelId=anthropic.claude-3-sonnet-20240229-v1:0&guardrailIdentifier=abc123xyz"/>
<log message="Model response: ${body}"/>
</otherwise>
</choice>
<to uri="mock:result"/>
</route> - route:
from:
uri: direct:moderated_conversation
steps:
- to:
uri: aws-bedrock://validate
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: applyGuardrail
guardrailIdentifier: abc123xyz
- choice:
when:
- simple: "${body} == 'GUARDRAIL_INTERVENED'"
steps:
- log: "Input blocked by guardrail"
- setBody:
constant: "Sorry, I cannot process this request."
otherwise:
steps:
- to:
uri: aws-bedrock://converse
parameters:
useDefaultCredentialsProvider: true
region: us-east-1
operation: converse
modelId: "anthropic.claude-3-sonnet-20240229-v1:0"
guardrailIdentifier: abc123xyz
- log: "Model response: ${body}"
- to:
uri: mock:result